├── .gitignore ├── LICENSE ├── README.md ├── data ├── dft_ts_structures │ ├── 100_ts.xyz │ ├── 101_ts.xyz │ ├── 102_ts.xyz │ ├── 12_ts.xyz │ ├── 13_ts.xyz │ ├── 14_ts.xyz │ ├── 15_ts.xyz │ ├── 16_ts.xyz │ ├── 17_ts.xyz │ ├── 18_ts.xyz │ ├── 19_ts.xyz │ ├── 1_ts.xyz │ ├── 21_ts.xyz │ ├── 22_ts.xyz │ ├── 23_ts.xyz │ ├── 24_ts.xyz │ ├── 25_ts.xyz │ ├── 26_ts.xyz │ ├── 27_ts.xyz │ ├── 28_ts.xyz │ ├── 29_ts.xyz │ ├── 2_ts.xyz │ ├── 30_ts.xyz │ ├── 31_ts.xyz │ ├── 32_ts.xyz │ ├── 33_ts.xyz │ ├── 34_ts.xyz │ ├── 36_ts.xyz │ ├── 37_ts.xyz │ ├── 38_ts.xyz │ ├── 39_ts.xyz │ ├── 3_ts.xyz │ ├── 40_ts.xyz │ ├── 41_ts.xyz │ ├── 42_ts.xyz │ ├── 43_ts.xyz │ ├── 44_ts.xyz │ ├── 45_ts.xyz │ ├── 46_ts.xyz │ ├── 47_ts.xyz │ ├── 48_ts.xyz │ ├── 49_ts.xyz │ ├── 4_ts.xyz │ ├── 50_ts.xyz │ ├── 51_ts.xyz │ ├── 52_ts.xyz │ ├── 53_ts.xyz │ ├── 55_ts.xyz │ ├── 56_ts.xyz │ ├── 57_ts.xyz │ ├── 58_ts.xyz │ ├── 59_ts.xyz │ ├── 5_ts.xyz │ ├── 60_ts.xyz │ ├── 61_ts.xyz │ ├── 62_ts.xyz │ ├── 63_ts.xyz │ ├── 64_ts.xyz │ ├── 65_ts.xyz │ ├── 66_ts.xyz │ ├── 67_ts.xyz │ ├── 69_ts.xyz │ ├── 70_ts.xyz │ ├── 71_ts.xyz │ ├── 72_ts.xyz │ ├── 73_ts.xyz │ ├── 74_ts.xyz │ ├── 75_ts.xyz │ ├── 76_ts.xyz │ ├── 77_ts.xyz │ ├── 78_ts.xyz │ ├── 79_ts.xyz │ ├── 7_ts.xyz │ ├── 80_ts.xyz │ ├── 81_ts.xyz │ ├── 82_ts.xyz │ ├── 83_ts.xyz │ ├── 84_ts.xyz │ ├── 85_ts.xyz │ ├── 86_ts.xyz │ ├── 87_ts.xyz │ ├── 88_ts.xyz │ ├── 89_ts.xyz │ ├── 8_ts.xyz │ ├── 91_ts.xyz │ ├── 92_ts.xyz │ ├── 93_ts.xyz │ ├── 97_ts.xyz │ ├── 98_ts.xyz │ ├── 99_ts.xyz │ └── 9_ts.xyz ├── reactions_am.txt ├── test_aldol.txt ├── test_co.txt ├── test_eas_apolar.txt ├── test_eas_polar.txt ├── test_passerini.txt └── test_pd.txt ├── environment.yml ├── run_scripts ├── run_conformational_search.py ├── run_dft_validation.py ├── run_ts_searcher.py └── run_ts_searcher_dft.py ├── setup.cfg ├── setup.py ├── src ├── tstools.egg-info │ ├── PKG-INFO │ ├── SOURCES.txt │ ├── dependency_links.txt │ └── top_level.txt └── tstools │ ├── __init__.py │ ├── confirm_ts_guess.py │ ├── irc_search.py │ ├── path_generator.py │ ├── ts_optimizer.py │ └── utils.py └── xtb_external_script └── xtb_external.py /.gitignore: -------------------------------------------------------------------------------- 1 | .xtboptok 2 | src/reaction_profile_generator/__pycache__/* 3 | .autode_calculations 4 | __pycache__/ 5 | src/ts_tools/__pycache__/*.pyc 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 chimie-paristech-CTM 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TS-tools 2 | 3 | This is the repository corresponding to the TS-tools project. 4 | 5 | ### Setting up the environment 6 | 7 | To set up the ts-tools conda environment: 8 | 9 | ``` 10 | conda env create -f environment.yml 11 | ``` 12 | 13 | To install the TS-tools package, activate the ts-tools environment and run the following command within the TS-tools directory: 14 | 15 | ``` 16 | conda activate ts-tools 17 | pip install . 18 | ``` 19 | 20 | Additionally, Gaussian16 needs to be available. In HPC environments, this can typically be achieved by loading the corresponding module to the path: 21 | 22 | ``` 23 | module load gaussian/g16_C01 24 | ``` 25 | 26 | The 'xtb_external_script/xtb_external.py' should be set as executable: 27 | ``` 28 | chmod +x xtb_external_script/xtb_external.py 29 | ``` 30 | 31 | Finally, the path to the xTB executable, used in 'xtb_external_script/xtb_external.py', needs to be set through the environment variable `XTB_PATH`, e.g., 32 | ``` 33 | export XTB_PATH=/path/to/xtb 34 | ``` 35 | 36 | ### Generating TS guesses at xTB level-of-theory 37 | 38 | TS guesses at xTB level of theory can be generated by running the following command (individual calculations are run in parallel as a single Python ProcessPool): 39 | 40 | ``` 41 | python run_scripts/run_ts_searcher.py [--input-file data/reactions_am.txt] [--xtb-external-path xtb_external_script/xtb_external.py] 42 | ``` 43 | 44 | where the ’input-file’ command line option corresponds to the location of the .txt-file containing the reaction SMILES (the default value ’reactions_am.txt’ corresponds to the benchmarking reactions), and the ’xtb-external-path’ option corresponds to the location of the script to use xTB as an external method in Gaussian16 (copied from the Jensen group's [xtb_gaussian](https://github.com/jensengroup/xtb_gaussian/blob/main/xtb_external.py) repository). 45 | 46 | Additional options can also be provided: 47 | 48 | 1. '--reactive-complex-factors-intra': Specifies a list of floating-point numbers representing reactive complex factors for intra-molecular interactions. To disable the preorganization of the reactant complex towards the product geometry, set this value to 0. In this case, no distance constraints along the bonds being formed are added, i.e., the molecule is optimized in an unbiased manner. 49 | 2. '--reactive-complex-factors-inter': Specifies a list of floating-point numbers representing reactive complex factors for inter-molecular interactions. 50 | 3. '--solvent': Specifies the name of the solvent (needs to be supported in xTB, e.g., 'water') 51 | 4. '--freq-cut-off': Specifies the imaginary frequency cut-off used during filtering of plausible starting points for transition state guess optimization. 52 | 5. '--target-dir': Specifies the working directory in which all files will be saved; final reactant, product and TS guess geometries (as well as the TS .log file) are saved in another directory with the ’final_’ prefix. 53 | 54 | Upon execution of this script, a work directory is first set up (named 'work_dir' by default), and for every reaction, a separate sub directory is generated. In each of these sub directory, 'path_dir' contains all the files produced during the generation of the reactive complex(es) and path(s). The preliminary guesses derived from the reactive paths are saved in 'preliminary_ts_guesses'. 'rp_geometries' in its turn contains the start- and end-points of the reactive path, 'g16_dir' contains all the files associated with the TS optimizations -- and IRC confirmations -- of the preliminary guesses, and 'final_ts_guess' contains the xyz- and log-file of the final confirmed TS (if found). Upon completion of the workflow for all reactions in the input file, the contents of 'final_ts_guess' and 'rp_geometries' is copied to the specified target_dir. 55 | 56 | ### Validating TS guesses at DFT level of theory 57 | 58 | Validating TS guesses at xTB level-of-theory can be done by running the following command (individual calculations are run in parallel as a single Python ProcessPool): 59 | 60 | ``` 61 | python run_scripts/dft_validation.py [--input-file data/reactions_am.txt] [--input-dir final_work_dir] 62 | ``` 63 | 64 | where the ’input-file’ command line option corresponds to the location of the .txt-file containing the reaction SMILES (the default value ’reactions_am.txt’ corresponds to the benchmarking reactions), 65 | and the ’input-dir’ command line option corresponds to the location of the folder in which the final TS guess geometries have been saved (see previous section). 66 | 67 | Additional options can also be provided: 68 | 69 | 1. '--solvent': Specifies the name of the solvent (needs to be supported both in Gaussian16, e.g., 'water') 70 | 2. '--output-dir': Specifies the working directory in which all files will be saved (default is 'validation_dir'). 71 | 3. '--mem': Specifies the memory requested in the Gaussian16 .com files (default is '16GB') 72 | 4. '--proc': Specifies the number of processors requested in the Gaussian16 .com files (default is 8) 73 | 5. '--functional': Specifies the functional to be used for the DFT calculations (default is 'UB3LYP') 74 | 6. '--basis-set': Specifies the basis set to be used for the DFT calculations (default is '6-31G**') 75 | 76 | Upon execution of this script, the specified output directory is created, as well as sub directories for each reaction SMILES in the input file. In each of these sub directories, 'rp_geometries' contains the xyz-files of reactants and products, and 'g16_dir' contains the files associated with the TS optimization -- and IRC confirmations -- of the xTB level TS determined during the original TS search (see previous section). The final DFT level TS geometry is saved in the latter directory as well, under the same name as the original xyz-file in the input directory. 77 | 78 | ### Generating TS guesses at DFT level of theory 79 | 80 | TS guesses at DFT level-of-theory (from an xTB reactive path) can be generated by running the following command (individual calculations are run in parallel as a single Python ProcessPool): 81 | 82 | ``` 83 | python run_scripts/run_ts_searcher_dft.py [--input-file data/reactions_am.txt] [--xtb-external-path xtb_external_script/xtb_external.py] 84 | ``` 85 | 86 | where the ’input-file’ command line option corresponds to the location of the .txt-file containing the reaction SMILES (the default value ’reactions_am.txt’ corresponds to the benchmarking reactions), 87 | and the ’xtb-external-path’ option corresponds to the location of the script to use xTB as an external method in Gaussian16 (copied from the Jensen group's [xtb_gaussian](https://github.com/jensengroup/xtb_gaussian/blob/main/xtb_external.py) repository). 88 | Note that this script will be a lot slower than xTB optimization of TSs, and should consequently only be used when full xTB level-of-theory TS guess generation fails. 89 | 90 | Additional options can also be provided: 91 | 92 | 1. '--reactive-complex-factors-intra': Specifies a list of floating-point numbers representing reactive complex factors for intra-molecular interactions. To disable the preorganization of the reactant complex towards the product geometry, set this value to 0. In this case, no distance constraints along the bonds being formed are added, i.e., the molecule is optimized in an unbiased manner. 93 | 2. '--reactive-complex-factors-inter': Specifies a list of floating-point numbers representing reactive complex factors for inter-molecular interactions. 94 | 3. '--solvent': Specifies the name of the solvent to be used in both the xTB and DFT calculations 95 | 4. '--xtb_solvent': Specifies the name of the solvent to be used in the xTB calculations (only needed when universal 'solvent' keyword is not specified) 96 | 5. '--dft_solvent': Specifies the name of the solvent to be used in the DFT calculations (only needed when universal 'solvent' keyword is not specified) 97 | 6. '--freq-cut-off': Specifies the imaginary frequency cut-off used during filtering of plausible starting points for transition state guess optimization. 98 | 7. '--target-dir': Specifies the working directory in which all files will be saved; final reactant, product and TS guess geometries (as well as the TS .log file) are saved in another 99 | directory with the ’final_’ prefix. 100 | 8. '--mem': Specifies the memory requested in the Gaussian16 .com files (default is '16GB') 101 | 9. '--proc': Specifies the number of processors requested in the Gaussian16 .com files (default is 8) 102 | 10. '--functional': Specifies the functional to be used for the DFT calculations (default is 'UB3LYP') 103 | 11. '--basis-set': Specifies the basis set to be used for the DFT calculations (default is '6-31G**') 104 | 12. '--max-cycles': Maximal number of cycles in TS geometry search (default is 30) 105 | 106 | Upon execution of this script, work and output directories are set up in the same manner as for the xTB script (respectively named 'work_dir_dft' and 'final_work_dir_dft' by default). 107 | 108 | ### Conformational search with CREST at xTB level-of-theory 109 | 110 | Conformational search of each species can be done by running the following command (individual calculations are run in parallel as a single Python ProcessPool): 111 | 112 | ``` 113 | python run_scripts/run_conformational_search.py [--file data/dft_ts_structures/13_ts.xyz] 114 | ``` 115 | 116 | where the ’file’ command line option corresponds to the location of the .xyz-file containing the geometry of the molecular system. CREST needs to be available. 117 | 118 | Additional options can also be provided: 119 | 120 | 1. '--opt-DFT': Subsequently optimization of the 10 conformers with the lowest energy, obtained from CREST to determine the most stable conformer. 121 | 2. '--atomlist': Pairs of atoms to constraint during the conformational search, E.g. transitions states, metal-organic compounds 122 | 3. '--charge': Specifies the charge (default is '0'). 123 | 4. '--solvent': Specifies the name of the solvent to be used in both CREST and DFT calculations 124 | 5. '--uhf': Specifies the number of unpaired electron (default is '0') 125 | 6. '--mem': Specifies the memory requested in the Gaussian16 .com files (default is '16GB') 126 | 7. '--proc': Specifies the number of processors requested in both CREST and DFT calculations (default is 8) 127 | 8. '--functional': Specifies the functional to be used for the DFT calculations (default is 'UB3LYP') 128 | 9. '--basis-set': Specifies the basis set to be used for the DFT calculations (default is '6-31G') 129 | 130 | Upon execution of this script, a work directory is set up (named '_crest'). For a final optimization, a sub-directory is generated 131 | (named '_opt_DFT'). 132 | 133 | 134 | ### References 135 | 136 | If (parts of) this workflow are used as part of a publication, please cite the associated paper: 137 | 138 | ``` 139 | @article{stuyver2024, 140 | author = {Stuyver, T.}, 141 | title = {{TS-tools: Rapid and Automated Localization of 142 | Transition States based on a Textual Reaction SMILES Input}}, 143 | journal = {ChemRxiv}, 144 | year = {2024}, 145 | doi = {10.26434/chemrxiv-2024-st2tr}, 146 | } 147 | ``` 148 | 149 | Furthermore, since the workflow makes use of autodE at several instances, also consider citing the paper in which this code was originally presented: 150 | 151 | ``` 152 | @article{autodE, 153 | doi = {10.1002/anie.202011941}, 154 | url = {https://doi.org/10.1002/anie.202011941}, 155 | year = {2021}, 156 | publisher = {Wiley}, 157 | volume = {60}, 158 | number = {8}, 159 | pages = {4266--4274}, 160 | author = {Tom A. Young and Joseph J. Silcock and Alistair J. Sterling and Fernanda Duarte}, 161 | title = {{autodE}: Automated Calculation of Reaction Energy Profiles -- Application to Organic and Organometallic Reactions}, 162 | journal = {Angewandte Chemie International Edition} 163 | } 164 | ``` 165 | -------------------------------------------------------------------------------- /data/dft_ts_structures/100_ts.xyz: -------------------------------------------------------------------------------- 1 | 21 2 | 3 | C -0.75794 1.68959 -1.08118 4 | C -0.83516 0.58169 -0.04172 5 | H -1.70032 2.24333 -1.03436 6 | H -0.62669 1.29379 -2.09136 7 | H 0.06194 2.36807 -0.84288 8 | O -1.77405 -0.34206 -0.53805 9 | O -2.17858 -1.19855 0.55136 10 | H -2.10334 -0.52741 1.28132 11 | O -0.99042 0.90323 1.24410 12 | C 0.70222 -0.35078 0.02665 13 | C 1.78293 0.39940 0.38373 14 | C 3.23133 0.09375 0.19906 15 | H 1.56011 1.33438 0.90168 16 | H 3.41079 -0.86631 -0.28681 17 | H 3.75210 0.10930 1.16442 18 | H 3.69493 0.88399 -0.40701 19 | C 0.74697 -1.67683 -0.68469 20 | H 0.03391 -0.10816 1.07719 21 | H 1.68588 -2.21245 -0.51239 22 | H 0.63474 -1.53554 -1.76541 23 | H -0.08177 -2.30494 -0.35467 24 | -------------------------------------------------------------------------------- /data/dft_ts_structures/101_ts.xyz: -------------------------------------------------------------------------------- 1 | 21 2 | 3 | C 2.24020 1.28540 -0.51832 4 | C 1.21920 0.23339 -0.11502 5 | H 2.71095 1.04928 -1.47561 6 | H 2.99703 1.30354 0.27338 7 | H 1.77386 2.27142 -0.56964 8 | O 1.76140 -1.01071 -0.45057 9 | O 1.12159 -2.04268 0.33599 10 | H 0.82968 -1.46379 1.09441 11 | O 0.66653 0.29543 1.10699 12 | C -1.65050 -0.64333 -0.28571 13 | C -0.92884 0.45442 -0.06183 14 | C -1.24287 1.87303 0.24533 15 | H 0.25363 0.40426 -0.89489 16 | H -2.20593 2.12601 -0.21201 17 | H -0.49656 2.55618 -0.16395 18 | H -1.28893 2.02987 1.32469 19 | C -3.16117 -0.64483 -0.27213 20 | H -1.14502 -1.58415 -0.46789 21 | H -3.58391 0.35099 -0.12028 22 | H -3.53831 -1.28819 0.53302 23 | H -3.55879 -1.04032 -1.21444 24 | -------------------------------------------------------------------------------- /data/dft_ts_structures/102_ts.xyz: -------------------------------------------------------------------------------- 1 | 21 2 | 3 | C 3.73807 0.00028 -0.27900 4 | C 2.25425 -0.00030 0.04380 5 | H 3.91680 -0.00524 -1.35439 6 | H 4.19899 -0.87891 0.17964 7 | H 4.19591 0.88633 0.16953 8 | O 1.46921 -0.00042 -0.98684 9 | O -0.20720 -0.00014 -0.24146 10 | H 0.31343 -0.00009 0.62252 11 | O 1.84897 -0.00013 1.22042 12 | C -1.96178 -0.68708 0.63452 13 | C -1.96168 0.68727 0.63450 14 | C -2.54676 1.59072 -0.40310 15 | H -1.58298 1.17962 1.52794 16 | H -2.77607 1.06973 -1.33361 17 | H -1.85018 2.40308 -0.62843 18 | H -3.47188 2.04612 -0.02620 19 | C -2.54703 -1.59047 -0.40304 20 | H -1.58318 -1.17947 1.52798 21 | H -2.77622 -1.06948 -1.33358 22 | H -3.47225 -2.04566 -0.02613 23 | H -1.85062 -2.40298 -0.62832 24 | -------------------------------------------------------------------------------- /data/dft_ts_structures/12_ts.xyz: -------------------------------------------------------------------------------- 1 | 14 2 | 3 | N 1.45105 0.78023 0.25674 4 | B 2.06868 -0.51815 -0.37411 5 | B -2.47468 0.40715 -0.27521 6 | N -1.63044 -0.59608 0.19775 7 | H 0.45655 0.76485 0.44494 8 | H 1.76318 1.66470 -0.11805 9 | H 2.32814 -0.08489 0.91625 10 | H 2.91025 -0.34186 -1.20439 11 | H 2.80518 -0.91469 0.72323 12 | H 1.30457 -1.43459 -0.50756 13 | H -3.33049 0.83137 0.44328 14 | H -2.31264 0.82535 -1.38276 15 | H -0.90627 -1.02840 -0.36049 16 | H -1.73267 -1.01591 1.11073 17 | -------------------------------------------------------------------------------- /data/dft_ts_structures/13_ts.xyz: -------------------------------------------------------------------------------- 1 | 14 2 | 3 | N -1.26775 0.77312 -0.02070 4 | B -1.73492 -0.67845 0.18713 5 | B 2.20653 0.03705 0.42594 6 | N 1.11271 -0.10547 -0.47274 7 | H 0.14153 0.53680 -0.32169 8 | H -1.35976 1.35248 0.80822 9 | H -1.74095 1.24552 -0.78451 10 | H -2.06072 -0.94613 1.31268 11 | H -2.41820 -1.10608 -0.70543 12 | H -0.64441 -1.48492 0.06245 13 | H 3.32936 -0.07839 0.03459 14 | H 1.96588 0.26517 1.57389 15 | H 0.17561 -0.99121 -0.13942 16 | H 1.33891 -0.25975 -1.45204 17 | -------------------------------------------------------------------------------- /data/dft_ts_structures/14_ts.xyz: -------------------------------------------------------------------------------- 1 | 14 2 | 3 | N -1.86966 -0.41233 0.00000 4 | B -0.98134 0.91615 0.00000 5 | B 0.81885 -0.30630 -0.00001 6 | N 2.28608 -0.08541 0.00000 7 | H -1.16753 -1.19321 -0.00001 8 | H -2.45519 -0.49586 -0.82825 9 | H -2.45517 -0.49588 0.82827 10 | H 0.26220 0.15413 -1.00090 11 | H -1.14050 1.54418 -1.00667 12 | H -1.14049 1.54418 1.00667 13 | H 0.26219 0.15411 1.00089 14 | H 0.37866 -1.48489 -0.00002 15 | H 2.67665 0.35405 0.82242 16 | H 2.67665 0.35408 -0.82239 17 | -------------------------------------------------------------------------------- /data/dft_ts_structures/15_ts.xyz: -------------------------------------------------------------------------------- 1 | 14 2 | 3 | N 1.45716 1.16873 -0.16954 4 | B 0.99759 -1.93459 0.01228 5 | B -1.03136 0.45385 0.71480 6 | N -1.80284 0.00773 -0.36122 7 | H 1.30674 1.69699 -1.02493 8 | H 2.31815 0.64227 -0.29018 9 | H 1.61763 1.84362 0.57341 10 | H 1.21405 -1.60104 -1.11143 11 | H 1.83279 -1.79619 0.85167 12 | H 0.00050 -2.53762 0.26730 13 | H -0.46437 -0.35311 1.39467 14 | H -1.07924 1.60627 1.03291 15 | H -2.33653 0.62357 -0.95525 16 | H -1.82111 -0.95622 -0.65827 17 | -------------------------------------------------------------------------------- /data/dft_ts_structures/16_ts.xyz: -------------------------------------------------------------------------------- 1 | 14 2 | 16ts_reopt.out Energy: -103680.6316337 3 | N -2.65461 -0.61622 0.02677 4 | B -0.33968 2.04084 -0.01346 5 | B 1.19876 -0.96825 -0.13261 6 | N 2.38039 -0.27018 0.06690 7 | H -1.98734 -1.37685 -0.07496 8 | H -3.40334 -0.79929 -0.63737 9 | H -3.06320 -0.71598 0.95309 10 | H 0.73437 2.13927 -0.53138 11 | H -1.32008 2.19902 -0.66631 12 | H -0.41256 1.89287 1.16691 13 | H 1.20100 -2.16419 -0.09976 14 | H 0.18678 -0.35631 -0.33430 15 | H 2.42036 0.73904 0.05439 16 | H 3.26818 -0.71573 0.24439 17 | -------------------------------------------------------------------------------- /data/dft_ts_structures/17_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | H 2.73117 -0.01336 -0.41061 4 | C 1.84379 -0.50753 -0.02125 5 | C 0.61239 0.15856 0.15196 6 | H 1.93599 -1.53244 0.32472 7 | H 0.50904 -0.22139 1.23409 8 | O 0.28523 1.36529 -0.09598 9 | H -1.42729 0.88992 -0.04902 10 | O -1.81771 -0.01321 0.12424 11 | C -0.79356 -0.84163 -0.20063 12 | H -0.65826 -1.02122 -1.27353 13 | H -0.80648 -1.77458 0.36773 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/18_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | H -0.94559 -0.87527 -1.48149 4 | C -0.98811 -0.99113 -0.40240 5 | C -0.78883 0.15890 0.43142 6 | H -1.45719 -1.88692 -0.00231 7 | H -1.22047 0.14378 1.43141 8 | O -0.60227 1.39305 -0.12058 9 | H 0.38187 1.39973 -0.31665 10 | O 1.59062 0.16413 -0.24511 11 | C 0.77799 -0.59432 0.34563 12 | H 0.44683 -1.60871 -0.28047 13 | H 0.88153 -1.07071 1.32708 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/19_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | H -0.18946 1.08175 1.36516 4 | C -0.52424 1.18560 0.33949 5 | C -1.23676 0.14260 -0.23741 6 | H -0.71155 2.19757 -0.00573 7 | H -1.89384 0.31940 -1.09673 8 | O -1.02605 -1.09611 0.07551 9 | H 0.06621 -1.16160 0.23766 10 | O 1.33725 -0.75331 0.16836 11 | C 1.29541 0.42821 -0.31068 12 | H 1.18948 0.58536 -1.39644 13 | H 1.84309 1.23436 0.19666 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/1_ts.xyz: -------------------------------------------------------------------------------- 1 | 12 2 | 3 | N 1.11230 -0.71483 -0.17603 4 | B 1.33354 0.71476 -0.14346 5 | N -1.70138 0.03221 -0.24208 6 | B -0.62413 0.11683 0.67650 7 | H -1.85625 0.70039 -0.97962 8 | H 1.08136 1.34518 -1.12651 9 | H 2.06275 1.15417 0.69318 10 | H 1.54747 -1.34117 0.48494 11 | H 0.74912 -1.18217 -0.99334 12 | H -2.36321 -0.72653 -0.23494 13 | H -0.59594 -0.52929 1.67885 14 | H -0.04877 1.19981 0.73902 15 | -------------------------------------------------------------------------------- /data/dft_ts_structures/21_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | H -2.34569 -0.03779 -1.23976 4 | C -2.21851 -0.22869 -0.18115 5 | C -1.01009 -0.26113 0.41557 6 | H -3.09063 -0.50992 0.39847 7 | H -0.86929 -0.38157 1.48637 8 | O 0.07746 1.00127 -0.05525 9 | H 0.43855 1.41934 0.74686 10 | O 2.11500 -0.35042 0.23156 11 | C 1.11790 -0.24882 -0.43562 12 | H 1.02296 -0.29156 -1.53322 13 | H -0.03130 -0.97344 -0.06196 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/22_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | H -0.18874 1.08164 1.36516 4 | C -0.52317 1.18566 0.33938 5 | C -1.23652 0.14317 -0.23743 6 | H -0.70968 2.19776 -0.00590 7 | H -1.89342 0.32030 -1.09682 8 | O -1.02666 -1.09564 0.07565 9 | H 0.06536 -1.16167 0.23830 10 | O 1.33675 -0.75406 0.16782 11 | C 1.29521 0.42786 -0.31033 12 | H 1.18991 0.58576 -1.39606 13 | H 1.84280 1.23360 0.19778 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/23_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | H -1.69108 1.86651 0.17669 4 | C -0.72435 1.37238 0.12051 5 | C -0.56988 0.03905 -0.07696 6 | H 0.17906 1.97022 0.17239 7 | H 0.47260 0.02102 -0.85538 8 | O -1.65113 -0.79445 -0.09764 9 | H -1.35472 -1.67957 -0.34967 10 | O 1.82835 0.08738 -0.43060 11 | C 1.10418 -0.52120 0.48118 12 | H 1.25979 -0.26406 1.54608 13 | H 0.85686 -1.59888 0.38751 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/24_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | H 1.94723 0.03988 1.32488 4 | C 1.92107 -0.06859 0.24801 5 | C 0.78283 -0.06493 -0.43860 6 | H 2.84161 -0.30591 -0.27391 7 | H 0.69501 -0.12838 -1.51505 8 | O -0.36560 1.04132 0.12373 9 | H -0.47327 1.78883 -0.49589 10 | O -0.65971 -1.09505 0.05107 11 | C -1.47986 -0.06984 0.08684 12 | H -2.07782 0.17362 -0.81704 13 | H -2.07451 0.08196 1.00118 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/25_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | H 2.52435 0.94752 -0.67563 4 | C 2.34783 0.15241 0.04049 5 | C 1.14194 -0.39040 0.18135 6 | H 3.18008 -0.19876 0.63965 7 | H 0.93417 -1.19411 0.88866 8 | O 0.05839 0.03429 -0.55795 9 | H -0.92218 -0.68851 -0.57905 10 | O -2.03492 -0.45611 -0.03101 11 | C -1.38160 0.60849 0.32386 12 | H -1.00438 0.71877 1.35431 13 | H -1.54880 1.56669 -0.19042 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/26_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | H -3.01102 -0.06252 0.00001 4 | C -2.10810 0.53852 -0.00000 5 | C -0.92090 -0.06883 -0.00000 6 | H -2.18791 1.61571 -0.00001 7 | H 0.01709 0.80979 -0.00001 8 | O -0.38913 -1.20857 0.00000 9 | H 0.84067 -0.99502 0.00001 10 | O 1.78535 -0.34774 -0.00001 11 | C 1.39402 0.88663 0.00001 12 | H 1.49065 1.47227 -0.92644 13 | H 1.49063 1.47225 0.92647 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/27_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | H -3.11945 0.66529 0.00040 4 | C -2.58223 -0.27657 0.00016 5 | C -1.25563 -0.31438 -0.00015 6 | H -3.15242 -1.19846 0.00019 7 | H -0.67301 -1.23371 -0.00040 8 | O -0.49640 0.85296 -0.00016 9 | H 0.59166 0.72242 -0.54578 10 | O 2.25467 -0.80353 0.00001 11 | C 1.98434 0.38862 0.00013 12 | H 2.81666 1.14057 0.00027 13 | H 0.59153 0.72248 0.54573 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/28_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | H -1.91832 -0.23433 -1.21886 4 | C -1.76580 -0.44909 -0.16578 5 | C -0.56037 0.00077 0.41257 6 | H -2.59544 -0.88236 0.39101 7 | H -0.49396 -0.09755 1.50796 8 | O -0.35993 1.24659 -0.08375 9 | H 1.12065 0.96003 -0.21855 10 | O 1.74203 0.14207 -0.02824 11 | C 0.84884 -0.87191 -0.09313 12 | H 1.04305 -1.68048 0.61635 13 | H 0.65116 -1.25324 -1.10396 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/29_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | H 0.04853 1.41991 -1.15985 4 | C -0.08919 1.17843 -0.11031 5 | C 0.69841 0.16702 0.47511 6 | H -0.70098 1.84554 0.47912 7 | H 0.79406 0.15727 1.56307 8 | O 1.83142 -0.22994 -0.24007 9 | H 1.99717 -1.16383 -0.04960 10 | O -1.80787 -0.04118 -0.05243 11 | C -0.80406 -0.87499 -0.04588 12 | H -0.90112 -1.79836 0.56935 13 | H -0.25704 -1.11431 -0.97561 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/2_ts.xyz: -------------------------------------------------------------------------------- 1 | 12 2 | 3 | N -1.12855 0.76034 0.07034 4 | B -1.55659 -0.64250 -0.15540 5 | N 1.47804 -0.62434 0.08190 6 | B 1.30467 0.70824 -0.15645 7 | H 0.67834 -1.25130 0.18486 8 | H -1.76053 -0.94924 -1.29751 9 | H -1.17822 -1.51592 0.60799 10 | H -0.94700 0.92001 1.06929 11 | H -2.58379 -0.09611 0.38021 12 | H 2.38078 -1.06940 0.16784 13 | H 2.14174 1.54698 -0.25629 14 | H 0.08184 1.13429 -0.36281 15 | -------------------------------------------------------------------------------- /data/dft_ts_structures/30_ts.xyz: -------------------------------------------------------------------------------- 1 | 18 2 | 3 | C 1.81412 0.07164 -0.11476 4 | C 0.39182 -0.42246 0.28032 5 | O 0.28064 -1.26511 1.17214 6 | F 2.77740 -0.52807 0.59819 7 | F 1.91827 1.40688 0.09023 8 | F 2.06125 -0.15737 -1.42237 9 | O -0.53034 0.14469 -0.40245 10 | C -2.57613 -0.58971 0.46429 11 | C -3.03256 -1.04350 -0.86013 12 | N -2.42204 1.82492 0.34546 13 | H -1.74031 -1.08450 0.95464 14 | H -3.30491 -0.11637 1.10471 15 | H -3.69815 -1.90295 -0.65815 16 | H -3.63832 -0.29629 -1.37754 17 | H -2.20909 -1.37220 -1.49061 18 | H -3.01858 2.35759 -0.28125 19 | H -2.33704 2.32688 1.22471 20 | H -1.49745 1.68794 -0.06495 21 | -------------------------------------------------------------------------------- /data/dft_ts_structures/31_ts.xyz: -------------------------------------------------------------------------------- 1 | 18 2 | 3 | C 1.76671 0.19174 -0.05439 4 | C 0.29816 -0.22939 0.19691 5 | O 0.09047 -1.23386 0.90551 6 | F 1.88623 1.52964 -0.11063 7 | F 2.17932 -0.31555 -1.23412 8 | F 2.58880 -0.25789 0.90411 9 | O -0.58821 0.44387 -0.37828 10 | C -2.11275 -0.96125 0.48147 11 | C -2.30560 -1.84908 -0.68437 12 | N -3.04240 2.14301 0.14039 13 | H -1.99744 -1.42847 1.44987 14 | H -2.57426 0.02525 0.47316 15 | H -3.32672 -2.25653 -0.58309 16 | H -2.25119 -1.30853 -1.62919 17 | H -1.61452 -2.69304 -0.68344 18 | H -3.57739 2.54368 -0.62657 19 | H -3.07488 2.82247 0.89692 20 | H -2.07318 2.09610 -0.17036 21 | -------------------------------------------------------------------------------- /data/dft_ts_structures/32_ts.xyz: -------------------------------------------------------------------------------- 1 | 18 2 | 3 | C -1.39151 -0.27232 0.02740 4 | C 0.03435 0.30270 -0.13998 5 | O 0.35606 0.69490 -1.36392 6 | F -1.54590 -1.38188 -0.70234 7 | F -2.30751 0.63987 -0.38355 8 | F -1.67519 -0.56309 1.31464 9 | O 0.89955 -0.53646 0.56911 10 | C 2.10446 -0.93946 -0.11472 11 | C 3.25965 0.01674 0.14684 12 | N 0.06969 1.74491 0.52152 13 | H 2.32292 -1.93402 0.28397 14 | H 1.89947 -1.01551 -1.18441 15 | H 4.18278 -0.37766 -0.29166 16 | H 3.06378 0.99227 -0.30771 17 | H 3.42429 0.14922 1.22131 18 | H -0.84563 2.15150 0.71330 19 | H 0.68514 1.81622 1.33124 20 | H 0.45020 1.83609 -0.63428 21 | -------------------------------------------------------------------------------- /data/dft_ts_structures/33_ts.xyz: -------------------------------------------------------------------------------- 1 | 7 2 | 3 | C -1.10638 -0.17953 -0.04879 4 | C 0.10877 0.53253 0.04826 5 | O 1.10923 -0.27056 -0.02014 6 | H -1.27823 -0.82764 0.81425 7 | H -2.01616 0.28000 -0.42909 8 | H 0.29749 1.60820 0.12192 9 | H 0.10872 -1.01407 -0.34282 10 | -------------------------------------------------------------------------------- /data/dft_ts_structures/34_ts.xyz: -------------------------------------------------------------------------------- 1 | 8 2 | 3 | H 1.20627 -1.04829 -0.40794 4 | C 0.71851 -0.12176 -0.06186 5 | H 1.35724 0.38833 0.64446 6 | C -0.71851 -0.12176 0.06186 7 | H 0.39505 1.39059 -0.29341 8 | H -0.39511 1.39054 0.29342 9 | H -1.35724 0.38828 -0.64449 10 | H -1.20625 -1.04829 0.40795 11 | -------------------------------------------------------------------------------- /data/dft_ts_structures/36_ts.xyz: -------------------------------------------------------------------------------- 1 | 10 2 | 3 | C -1.43254 -0.13193 0.16790 4 | O -2.17989 0.35500 1.00870 5 | C -0.09542 0.53559 0.03404 6 | F -1.67296 0.19092 -1.29998 7 | F -1.21932 -1.49618 0.11959 8 | C 1.29040 -0.13765 0.01372 9 | F -0.04714 1.80785 0.06694 10 | F 1.33836 -1.03077 -0.96662 11 | F 2.25271 0.77106 -0.15909 12 | F 1.44439 -0.73578 1.19877 13 | -------------------------------------------------------------------------------- /data/dft_ts_structures/37_ts.xyz: -------------------------------------------------------------------------------- 1 | 10 2 | 3 | C -1.37025 -0.26998 0.05586 4 | O -0.26033 1.51249 1.02962 5 | C -0.13022 0.64071 0.16546 6 | F -2.52939 0.23852 0.15690 7 | F -1.40974 -1.54932 0.03043 8 | C 1.19640 -0.15187 0.03731 9 | F -0.40729 1.02398 -1.31529 10 | F 2.20216 0.67369 -0.24241 11 | F 1.45251 -0.77677 1.20456 12 | F 1.12588 -1.10044 -0.92183 13 | -------------------------------------------------------------------------------- /data/dft_ts_structures/38_ts.xyz: -------------------------------------------------------------------------------- 1 | 8 2 | 3 | C -0.29835 0.41430 0.00104 4 | O -1.27373 -0.27326 -0.00068 5 | N 1.02931 -0.13336 -0.00036 6 | H 1.84944 0.44955 0.00126 7 | H 1.02281 -0.09237 -1.62949 8 | H -0.27092 1.51243 0.00382 9 | H 1.15066 -1.13484 -0.00294 10 | H 1.02280 -0.10105 1.62906 11 | -------------------------------------------------------------------------------- /data/dft_ts_structures/39_ts.xyz: -------------------------------------------------------------------------------- 1 | 4 2 | 3 | C 0.42493 -0.25002 -0.00000 4 | O -0.69481 0.09111 0.00000 5 | H 1.51701 -0.26492 0.00000 6 | H 1.49188 1.03614 -0.00000 7 | -------------------------------------------------------------------------------- /data/dft_ts_structures/3_ts.xyz: -------------------------------------------------------------------------------- 1 | 12 2 | 3 | N 1.51959 -0.47352 -0.18470 4 | B 0.67229 0.65168 0.52533 5 | N -0.71838 0.28746 -0.39102 6 | B -1.84873 -0.38674 0.16890 7 | H 0.23028 -0.42931 -0.69684 8 | H 1.00737 1.76494 0.22011 9 | H 0.46085 0.44369 1.68683 10 | H 1.79192 -1.26323 0.39037 11 | H 2.31472 -0.16898 -0.73542 12 | H -0.92330 0.98979 -1.09646 13 | H -2.95740 -0.12107 -0.19150 14 | H -1.65075 -1.23815 0.98186 15 | -------------------------------------------------------------------------------- /data/dft_ts_structures/40_ts.xyz: -------------------------------------------------------------------------------- 1 | 8 2 | 3 | C 1.03442 -0.40589 -0.00367 4 | O 0.46250 0.77653 -0.00664 5 | N -1.31824 -0.16568 -0.06640 6 | H -1.35485 -0.11369 0.96056 7 | H 1.48487 -0.74430 0.94380 8 | H 1.58406 -0.69441 -0.91448 9 | H -0.07477 -1.02520 -0.11584 10 | H -2.31816 -0.03955 -0.33412 11 | -------------------------------------------------------------------------------- /data/dft_ts_structures/41_ts.xyz: -------------------------------------------------------------------------------- 1 | 8 2 | 3 | C 0.30030 0.61516 0.00000 4 | O 1.10037 -0.44607 -0.00000 5 | N -1.08600 -0.20241 -0.00000 6 | H -1.66547 -0.12059 0.83654 7 | H 0.26666 1.26430 0.90163 8 | H 0.26665 1.26431 -0.90163 9 | H -0.20518 -0.99299 -0.00000 10 | H -1.66548 -0.12058 -0.83654 11 | -------------------------------------------------------------------------------- /data/dft_ts_structures/42_ts.xyz: -------------------------------------------------------------------------------- 1 | 13 2 | 3 | C 2.01006 0.23549 -0.12657 4 | C 0.77362 -0.58364 0.17482 5 | H 2.89279 -0.41029 -0.16191 6 | H 2.21306 1.01190 0.62704 7 | H 1.94060 0.73384 -1.09968 8 | C -0.55727 -0.09103 0.06224 9 | O -1.36070 -1.08588 -0.14115 10 | C -1.08346 1.30673 0.04708 11 | H -2.13951 1.30274 0.32748 12 | H -1.01815 1.70259 -0.97423 13 | H -0.51141 1.96988 0.70020 14 | H -0.20611 -1.61264 -0.30019 15 | H 0.85661 -1.21634 1.06509 16 | -------------------------------------------------------------------------------- /data/dft_ts_structures/43_ts.xyz: -------------------------------------------------------------------------------- 1 | 13 2 | 3 | C 1.99869 -0.06632 -0.19562 4 | C 0.65905 -0.59136 0.29311 5 | H 2.44228 0.67415 0.48787 6 | H 1.91429 0.39696 -1.18402 7 | H 2.72305 -0.88299 -0.27615 8 | C -0.57103 0.08477 0.05750 9 | O -0.76406 1.42223 -0.02603 10 | C -1.60253 -0.86670 -0.11582 11 | H -1.58189 -1.43322 -1.04547 12 | H -2.62377 -0.65398 0.21798 13 | H -0.36433 -1.64023 0.11710 14 | H -0.01576 1.87682 0.38751 15 | H 0.71351 -1.07769 1.26839 16 | -------------------------------------------------------------------------------- /data/dft_ts_structures/44_ts.xyz: -------------------------------------------------------------------------------- 1 | 13 2 | 3 | C -2.10033 0.05155 -0.25179 4 | C -0.81794 -0.63324 0.13090 5 | H -2.98038 -0.28963 0.28935 6 | H -2.06291 1.12476 -0.42685 7 | H -1.13259 -0.28804 1.16496 8 | C 0.48552 -0.08853 0.05063 9 | O 1.51202 -0.97346 -0.14578 10 | C 0.77189 1.36967 0.04530 11 | H 1.74021 1.59720 0.51531 12 | H -0.01375 1.91334 0.58441 13 | H 0.79940 1.79413 -0.97207 14 | H 2.34923 -0.53521 0.06249 15 | H -0.83016 -1.72553 0.09842 16 | -------------------------------------------------------------------------------- /data/dft_ts_structures/45_ts.xyz: -------------------------------------------------------------------------------- 1 | 13 2 | 3 | C -2.06101 0.00915 -0.11633 4 | C -0.74480 -0.58170 0.24946 5 | H -2.73240 -0.73848 -0.56213 6 | H -1.95119 0.84841 -0.81176 7 | H -2.58916 0.39564 0.76882 8 | C 0.51380 -0.02351 -0.10975 9 | O 1.57404 -0.95073 -0.09624 10 | C 0.85308 1.40228 0.17886 11 | H 0.24651 0.31082 -1.16585 12 | H 1.34327 1.96585 -0.61362 13 | H 0.15847 1.97490 0.78858 14 | H 2.30411 -0.47857 0.33500 15 | H -0.73829 -1.51002 0.81737 16 | -------------------------------------------------------------------------------- /data/dft_ts_structures/46_ts.xyz: -------------------------------------------------------------------------------- 1 | 13 2 | 3 | C 2.21362 0.03818 0.04608 4 | C 0.84758 -0.58799 -0.06232 5 | H 2.78444 -0.40937 0.86865 6 | H 2.14254 1.11444 0.21977 7 | H 2.78968 -0.12538 -0.87266 8 | C -0.25381 0.13774 0.00972 9 | O -1.71529 -0.91947 -0.07676 10 | C -0.96845 1.34541 -0.01671 11 | H -0.75064 2.03108 -0.83388 12 | H -1.16598 1.83028 0.94052 13 | H -1.97380 0.22968 -0.16321 14 | H -1.92670 -1.25470 0.81236 15 | H 0.78912 -1.66024 -0.21815 16 | -------------------------------------------------------------------------------- /data/dft_ts_structures/47_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C 2.17123 0.09130 -0.00829 4 | C 0.84697 -0.28286 0.64357 5 | C -0.37745 0.32940 0.18092 6 | C -0.51590 1.12732 -1.07600 7 | O -1.39653 0.52551 1.01795 8 | H 2.46634 1.13623 0.15734 9 | H 2.15295 -0.07879 -1.09051 10 | H 2.96951 -0.53946 0.39380 11 | H -0.18341 2.15573 -0.88137 12 | H -1.55874 1.15370 -1.39354 13 | H 0.10380 0.71319 -1.86982 14 | H -1.25269 0.00246 1.82160 15 | H 0.89398 -0.34259 1.73548 16 | H -0.83156 -1.84627 -1.45264 17 | O -0.83244 -1.59973 -0.51454 18 | H 0.32239 -1.35142 0.11118 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/48_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C -2.80492 -0.14366 0.13020 4 | C -1.48998 0.59951 0.20416 5 | C -0.22838 0.03257 -0.09928 6 | C 0.23378 -1.38216 -0.16265 7 | O 0.58427 0.99506 -0.45158 8 | H -3.64058 0.56225 0.15495 9 | H -2.95105 -0.84272 0.96651 10 | H -2.89556 -0.71606 -0.79870 11 | H 0.18595 -1.73723 -1.19987 12 | H -0.37328 -2.04291 0.45865 13 | H 1.28703 -1.40791 0.13973 14 | H -0.56457 1.56550 -0.45207 15 | H -1.39996 1.29174 1.04795 16 | H 2.41567 0.58986 0.13324 17 | O 3.16705 0.02785 0.39427 18 | H 3.66280 -0.08333 -0.42649 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/49_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C -1.54195 1.15337 -0.42774 4 | C -0.60921 -0.01177 -0.56503 5 | C 0.68155 -0.08714 0.05550 6 | C 1.36316 1.11696 0.66690 7 | O 1.57886 -1.01366 -0.54554 8 | H -1.21009 1.95631 -1.10044 9 | H -1.54021 1.54746 0.59029 10 | H -2.56539 0.88108 -0.68989 11 | H 1.86822 1.74040 -0.09002 12 | H 2.12734 0.79109 1.37842 13 | H 0.66251 1.76250 1.20394 14 | H 2.08387 -0.54230 -1.22584 15 | H -0.76686 -0.66046 -1.42486 16 | H -1.40698 -2.09102 0.40941 17 | O -1.38412 -1.18287 0.75666 18 | H -0.17161 -0.84129 0.88219 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/4_ts.xyz: -------------------------------------------------------------------------------- 1 | 12 2 | 3 | N 1.56429 0.60798 -0.00002 4 | B 1.79987 -0.76372 0.00007 5 | N -1.85720 -0.54736 -0.00006 6 | B -1.38345 0.74425 0.00007 7 | H -1.22711 -1.34069 -0.00011 8 | H 2.88184 -1.29285 -0.00014 9 | H 0.82952 -1.50415 0.00039 10 | H 0.00249 0.83308 -0.42911 11 | H 2.38589 1.21182 -0.00028 12 | H -2.84110 -0.78287 -0.00009 13 | H -2.06577 1.71533 0.00017 14 | H 0.00251 0.83333 0.42907 15 | -------------------------------------------------------------------------------- /data/dft_ts_structures/50_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C 2.81337 -0.08169 -0.00001 4 | C 1.43909 -0.68545 -0.00001 5 | C 0.26083 -0.04627 -0.00000 6 | C 0.03791 1.44253 0.00000 7 | O -0.89605 -0.80067 0.00002 8 | H 3.38743 -0.40289 0.87917 9 | H 2.80030 1.01113 -0.00012 10 | H 3.38750 -0.40308 -0.87906 11 | H 0.97151 2.00645 -0.00020 12 | H -0.54122 1.74819 0.88082 13 | H -0.54158 1.74813 -0.88059 14 | H -1.96856 -0.35602 -0.60334 15 | H 1.38597 -1.77246 0.00000 16 | H -1.96857 -0.35598 0.60334 17 | O -2.93071 0.01137 -0.00001 18 | H -3.60596 -0.68389 0.00000 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/51_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C 2.39946 -0.19930 0.00000 4 | C 0.97320 -0.69251 0.00000 5 | C -0.09176 0.12025 -0.00000 6 | C -0.18286 1.60682 -0.00001 7 | O -1.45017 -0.37946 1.11760 8 | H 2.45038 0.89311 -0.00004 9 | H 2.95346 -0.54895 -0.88165 10 | H 2.95344 -0.54889 0.88170 11 | H 0.29733 2.02066 -0.89183 12 | H 0.29731 2.02066 0.89182 13 | H -1.22793 1.91600 -0.00002 14 | H -1.06817 -1.13752 1.58322 15 | H 0.81718 -1.77020 0.00001 16 | H -1.79042 -0.64735 0.00000 17 | O -1.45016 -0.37948 -1.11760 18 | H -1.06817 -1.13754 -1.58320 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/52_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C 1.59756 -1.27572 0.33813 4 | C 0.41587 -0.78402 -0.49875 5 | C -0.76756 -0.29623 0.14766 6 | C -0.67814 0.69788 1.16386 7 | O -1.95896 -0.42433 -0.44798 8 | H 1.38038 -2.21043 0.86757 9 | H 1.90174 -0.53205 1.08027 10 | H 2.46059 -1.45342 -0.31000 11 | H 0.01693 0.47585 1.97273 12 | H -1.62628 1.10726 1.50427 13 | H 0.04290 1.48453 0.39334 14 | H -1.86723 -0.97751 -1.23909 15 | H 0.21013 -1.42779 -1.36079 16 | H 0.77018 0.43561 -0.81649 17 | O 0.90075 1.80952 -0.64540 18 | H 1.76997 1.96509 -0.25022 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/53_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C 0.49090 -1.93131 0.25758 4 | C 0.15326 -0.85315 -0.59782 5 | C 0.61694 0.32787 0.05811 6 | C 2.08481 0.74857 -0.02937 7 | O -0.15361 1.45965 0.11868 8 | H -0.02756 -2.05483 1.20796 9 | H 1.01041 -0.75796 1.02398 10 | H 0.83233 -2.90000 -0.13388 11 | H 2.74610 -0.11397 -0.10961 12 | H 2.37079 1.34996 0.83791 13 | H 2.20442 1.37631 -0.92228 14 | H -1.09465 1.18852 0.15795 15 | H -0.33634 -0.89681 -1.57272 16 | H -3.07461 0.31594 -0.73190 17 | O -2.66290 0.21116 0.13627 18 | H -2.17421 -0.62546 0.07194 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/55_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C -1.60511 1.14147 -0.23127 4 | C -0.59556 0.12297 -0.62605 5 | C 0.79158 0.17737 -0.33447 6 | C 1.36895 1.11111 0.69851 7 | O 1.43852 -0.86771 -0.67972 8 | H -2.60366 0.70045 -0.19039 9 | H -1.62263 1.94388 -0.98193 10 | H -1.37737 1.58508 0.73966 11 | H 0.95921 2.12310 0.63187 12 | H 2.45335 1.15907 0.57967 13 | H 1.15844 0.72674 1.70792 14 | H 0.93817 -2.00100 0.21747 15 | H -0.84805 -0.53693 -1.45059 16 | H 0.03800 -1.84639 0.57140 17 | O -1.09170 -1.28928 0.78696 18 | H -1.62914 -1.91565 0.27668 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/56_ts.xyz: -------------------------------------------------------------------------------- 1 | 10 2 | 3 | C 1.04651 0.04346 0.22526 4 | O 0.53285 -1.06813 -0.22793 5 | C -1.45405 -0.24291 0.10745 6 | O 0.01107 1.12299 -0.08045 7 | H 1.97456 0.39575 -0.27022 8 | H 1.14966 0.17126 1.32343 9 | H -1.59681 -0.99350 -0.65508 10 | H -1.36006 -0.61459 1.11820 11 | H -0.00355 1.15400 -1.05286 12 | H -2.06993 0.64487 0.00730 13 | -------------------------------------------------------------------------------- /data/dft_ts_structures/57_ts.xyz: -------------------------------------------------------------------------------- 1 | 10 2 | 3 | C 0.92012 0.61818 0.07149 4 | O 1.50667 -0.54220 0.18059 5 | C -1.65337 -0.05920 0.24942 6 | O -0.48575 -0.05384 -0.58134 7 | H 0.55911 1.14396 0.97616 8 | H 1.22328 1.31882 -0.72416 9 | H -1.39816 -0.28907 1.29158 10 | H -2.13756 0.91881 0.19525 11 | H 0.32608 -0.86050 -0.32464 12 | H -2.34063 -0.81757 -0.13370 13 | -------------------------------------------------------------------------------- /data/dft_ts_structures/58_ts.xyz: -------------------------------------------------------------------------------- 1 | 10 2 | 3 | C 1.26656 0.58066 0.00000 4 | O 1.16339 -0.71077 -0.00001 5 | C -1.26656 0.58066 -0.00000 6 | O -1.16339 -0.71077 -0.00000 7 | H 1.60123 1.08052 0.92350 8 | H 1.60145 1.08050 -0.92343 9 | H 0.00000 1.04150 -0.00015 10 | H -1.60145 1.08049 -0.92344 11 | H -0.00000 -0.95906 0.00010 12 | H -1.60124 1.08053 0.92349 13 | -------------------------------------------------------------------------------- /data/dft_ts_structures/59_ts.xyz: -------------------------------------------------------------------------------- 1 | 10 2 | 3 | C 1.33498 0.48233 -0.00001 4 | O 1.10143 -0.80479 0.00003 5 | C -1.33498 -0.48233 -0.00002 6 | O -1.10143 0.80479 0.00003 7 | H 1.71491 0.92067 -0.93272 8 | H 1.71477 0.92075 0.93271 9 | H -0.07141 -0.98384 -0.00003 10 | H -1.71486 -0.92072 0.93269 11 | H 0.07138 0.98382 -0.00014 12 | H -1.71487 -0.92068 -0.93274 13 | -------------------------------------------------------------------------------- /data/dft_ts_structures/5_ts.xyz: -------------------------------------------------------------------------------- 1 | 12 2 | 3 | N 1.07873 0.51724 -0.00010 4 | B 2.24337 -0.28923 -0.00001 5 | N -1.07867 -0.51716 0.00013 6 | B -2.24344 0.28915 -0.00002 7 | H 0.00005 0.00001 0.57595 8 | H 2.09244 -1.47909 -0.00025 9 | H 3.34224 0.18462 0.00032 10 | H 1.18882 1.52787 0.00004 11 | H -0.00018 0.00009 -0.57586 12 | H -1.18856 -1.52781 -0.00005 13 | H -3.34223 -0.18488 -0.00035 14 | H -2.09269 1.47903 0.00017 15 | -------------------------------------------------------------------------------- /data/dft_ts_structures/60_ts.xyz: -------------------------------------------------------------------------------- 1 | 10 2 | 3 | C -1.29300 -0.02585 -0.10547 4 | O -2.42183 0.23063 0.00684 5 | C 1.98472 0.46204 0.06323 6 | O 1.08602 -0.62526 -0.19037 7 | H -0.60826 -0.65661 1.19205 8 | H 0.04710 -0.21726 -0.56974 9 | H 1.59643 1.13051 0.84106 10 | H 2.94322 0.05137 0.38859 11 | H 0.42787 -0.79839 0.72950 12 | H 2.12982 1.03034 -0.85985 13 | -------------------------------------------------------------------------------- /data/dft_ts_structures/61_ts.xyz: -------------------------------------------------------------------------------- 1 | 10 2 | 3 | C 0.98863 0.40695 -0.40745 4 | O 1.70257 -0.53708 0.21612 5 | C -0.81359 0.46105 0.40363 6 | O -1.69492 -0.37639 -0.27786 7 | H 1.26630 1.46918 -0.26752 8 | H 0.57829 0.21587 -1.41530 9 | H 0.45738 -0.17141 0.57276 10 | H -1.00836 1.49626 0.12513 11 | H -1.53532 -1.29024 -0.00530 12 | H -0.86968 0.38013 1.50709 13 | -------------------------------------------------------------------------------- /data/dft_ts_structures/62_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | C -1.79477 -0.21895 0.04835 4 | C -0.59486 0.55944 -0.02045 5 | N 0.39738 -0.27223 -0.26302 6 | C 1.79068 -0.03237 0.10577 7 | H -0.43386 1.63866 0.06534 8 | H -2.74262 0.19746 -0.29356 9 | H -0.58818 -1.10852 -0.34483 10 | H -1.89417 -0.74819 0.99882 11 | H 2.45349 -0.45161 -0.65637 12 | H 1.99105 1.04104 0.20675 13 | H 2.02633 -0.51197 1.06298 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/63_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | C 1.50965 0.14572 -0.14814 4 | C 0.13426 -0.16891 0.44422 5 | N -0.73960 -1.01563 -0.20477 6 | C -1.05663 0.71357 -0.05728 7 | H 0.15674 -0.18572 1.55072 8 | H 1.94558 1.04932 0.29323 9 | H 2.19155 -0.68649 0.05570 10 | H 1.43902 0.26529 -1.23320 11 | H -1.72531 -0.01082 -0.64230 12 | H -1.64759 1.10013 0.77040 13 | H -0.70643 1.43539 -0.79393 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/64_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | C -1.87864 0.08526 -0.04235 4 | C -0.50310 -0.53181 -0.02391 5 | N 0.45759 0.43776 0.06084 6 | C 1.84465 -0.05259 -0.06921 7 | H 0.16055 -0.25176 1.06014 8 | H -1.91036 1.15945 0.18800 9 | H -2.24707 -0.05354 -1.06889 10 | H -2.56815 -0.47263 0.59874 11 | H 2.17300 0.22753 -1.07469 12 | H 2.49142 0.46409 0.64570 13 | H 1.91999 -1.14262 0.03795 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/65_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | C -1.87126 -0.14344 0.02164 4 | C -0.49763 0.44513 -0.03727 5 | N 0.56341 -0.30384 -0.12941 6 | C 1.91339 0.03481 0.07029 7 | H -0.37367 1.53023 0.02244 8 | H -2.35083 0.01812 0.99825 9 | H -2.53383 0.30765 -0.72864 10 | H -1.83205 -1.22097 -0.16107 11 | H 2.60426 -0.65122 -0.40730 12 | H 2.21027 1.08104 0.17448 13 | H 1.06499 -0.95699 0.67978 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/66_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | P -0.62737 0.09454 -0.46017 4 | H -1.19903 0.30259 -1.73189 5 | C -0.03493 1.60702 0.17805 6 | C -1.96504 -0.69849 0.52593 7 | H 1.28085 1.04156 0.36543 8 | H -0.04828 2.44533 -0.51476 9 | H -0.37146 1.87366 1.17853 10 | H -1.62931 -0.76270 1.56488 11 | H -2.89649 -0.12984 0.49370 12 | H -2.14569 -1.71565 0.16525 13 | H 2.40662 -0.19388 1.40935 14 | C 2.14703 -0.06540 0.35898 15 | C 1.29231 -1.05920 -0.21943 16 | H 2.98100 0.27830 -0.25204 17 | H 1.47177 -1.38739 -1.24124 18 | H 0.92429 -1.87369 0.40414 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/67_ts.xyz: -------------------------------------------------------------------------------- 1 | 9 2 | 3 | C -1.29402 -0.19275 -0.05329 4 | H -1.41266 -1.26946 -0.02430 5 | H -2.16784 0.43270 0.06116 6 | C 0.00001 0.40609 -0.06648 7 | C 1.29402 -0.19275 -0.05328 8 | H 0.00001 1.49705 -0.08807 9 | H 2.16785 0.43267 0.06126 10 | H -0.00007 0.05297 1.05264 11 | H 1.41263 -1.26947 -0.02441 12 | -------------------------------------------------------------------------------- /data/dft_ts_structures/69_ts.xyz: -------------------------------------------------------------------------------- 1 | 5 2 | 3 | Si -0.13457 0.00000 -0.11959 4 | H -0.39044 1.21272 0.70393 5 | H -0.39048 -1.21271 0.70394 6 | H 1.35940 -0.00002 -0.43394 7 | H 1.30552 -0.00001 0.70034 8 | -------------------------------------------------------------------------------- /data/dft_ts_structures/70_ts.xyz: -------------------------------------------------------------------------------- 1 | 8 2 | 3 | H 2.08637 1.67635 -0.10537 4 | O 2.51067 0.80719 -0.02971 5 | O 0.75819 -1.32078 -1.30094 6 | S 0.51461 -0.64091 -0.03435 7 | Cl -2.11848 -0.49825 0.06673 8 | Cl -0.59157 1.79034 -0.04235 9 | O 0.84660 -1.25416 1.25015 10 | H 2.82691 0.75456 0.88451 11 | -------------------------------------------------------------------------------- /data/dft_ts_structures/71_ts.xyz: -------------------------------------------------------------------------------- 1 | 7 2 | 3 | H 1.27808 -0.82778 0.81416 4 | C 1.10637 -0.17951 -0.04878 5 | C -0.10877 0.53254 0.04826 6 | H 2.01620 0.27996 -0.42899 7 | H -0.29747 1.60822 0.12190 8 | O -1.10922 -0.27056 -0.02014 9 | H -0.10867 -1.01404 -0.34286 10 | -------------------------------------------------------------------------------- /data/dft_ts_structures/72_ts.xyz: -------------------------------------------------------------------------------- 1 | 11 2 | 3 | C -2.13676 -0.21266 0.00002 4 | C -0.23490 0.67071 -0.00008 5 | N 0.52540 -0.30255 0.00004 6 | C 1.97442 -0.07172 0.00002 7 | H -1.23259 1.13262 -0.00015 8 | H -2.03701 -0.80227 0.90853 9 | H -3.04090 0.40456 -0.00006 10 | H -2.03701 -0.80249 -0.90835 11 | H 2.39939 -0.56052 -0.88190 12 | H 2.25439 0.98827 -0.00011 13 | H 2.39938 -0.56032 0.88206 14 | -------------------------------------------------------------------------------- /data/dft_ts_structures/73_ts.xyz: -------------------------------------------------------------------------------- 1 | 15 2 | 3 | C 0.52404 -0.13732 1.39196 4 | C -0.26238 0.00265 0.20586 5 | H 0.62331 0.73608 2.03339 6 | H 0.48381 -1.09212 1.91125 7 | C -0.78530 1.35850 -0.18776 8 | H -1.73165 1.52942 0.34288 9 | H -0.98402 1.43094 -1.25973 10 | H -0.09684 2.15348 0.10971 11 | C -0.97777 -1.19148 -0.36296 12 | H -0.39362 -2.10128 -0.21368 13 | H -1.18747 -1.07587 -1.42810 14 | H -1.93240 -1.30910 0.16812 15 | O 1.38622 -0.12920 -0.88414 16 | H 1.67250 0.71289 -1.27535 17 | H 1.46510 -0.14496 0.40199 18 | -------------------------------------------------------------------------------- /data/dft_ts_structures/74_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C 1.01937 -0.14133 0.35518 4 | C 0.68227 1.22209 0.07922 5 | C -0.68228 1.22209 -0.07921 6 | C -1.01937 -0.14133 -0.35519 7 | C 2.27827 -0.82189 -0.12254 8 | C -2.27826 -0.82190 0.12254 9 | H 0.59403 -0.56734 1.25806 10 | H 1.39200 2.03437 -0.07594 11 | H -1.39202 2.03436 0.07595 12 | H -0.59402 -0.56733 -1.25808 13 | H 3.11066 -0.64113 0.57427 14 | H 2.58962 -0.47128 -1.11104 15 | H 2.14518 -1.90785 -0.17361 16 | H -2.14531 -1.90789 0.17327 17 | H -3.11075 -0.64081 -0.57406 18 | H -2.58940 -0.47155 1.11120 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/75_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C -0.44471 1.43601 -0.48930 4 | C -1.32236 0.70314 0.28919 5 | C -1.32243 -0.70303 0.28919 6 | C -0.44486 -1.43599 -0.48930 7 | C 1.57420 0.69305 0.22769 8 | C 1.57414 -0.69317 0.22772 9 | H -1.87245 1.21343 1.07756 10 | H -0.12387 1.06598 -1.45551 11 | H -0.39213 2.51552 -0.37886 12 | H 2.07520 1.23405 -0.56888 13 | H 1.47169 1.23511 1.16010 14 | H 1.47157 -1.23519 1.16013 15 | H 2.07510 -1.23424 -0.56884 16 | H -0.39237 -2.51550 -0.37888 17 | H -0.12398 -1.06597 -1.45551 18 | H -1.87257 -1.21327 1.07755 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/76_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C -0.47569 1.49508 0.30222 4 | C 0.44493 0.98084 -0.57477 5 | C 0.83272 -0.43733 -0.42770 6 | C 1.89650 -0.34731 0.49124 7 | C -1.79044 -0.32138 0.07522 8 | C -0.76545 -1.30610 0.01391 9 | H 0.78370 1.52723 -1.44993 10 | H -0.50387 1.13370 1.32493 11 | H -0.86876 2.50102 0.17228 12 | H -2.32382 -0.12595 0.99846 13 | H -2.31917 -0.02991 -0.82565 14 | H -0.81228 -1.98314 -0.83760 15 | H -0.55577 -1.83802 0.93991 16 | H 2.82892 -0.89377 0.36835 17 | H 1.79711 0.25004 1.38967 18 | H 1.11849 -0.92401 -1.36117 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/77_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C 1.72736 -1.22151 -0.37731 4 | C 1.73641 -0.16018 0.43941 5 | C 1.05880 1.12340 0.18916 6 | C -0.17220 1.28259 -0.32918 7 | C -1.69373 -0.25618 -0.61417 8 | C -2.24401 -0.61030 0.65123 9 | H 2.32557 -0.21621 1.35629 10 | H 1.22737 -1.18830 -1.34066 11 | H 2.24995 -2.13906 -0.12448 12 | H -2.24344 0.40811 -1.27118 13 | H -1.01605 -0.93765 -1.10970 14 | H -1.82871 -1.43649 1.21209 15 | H -3.09031 -0.06790 1.05115 16 | H -0.56157 2.29598 -0.46660 17 | H -1.17999 0.33518 0.43508 18 | H 1.64133 1.99944 0.50315 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/78_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C 1.64186 -1.09966 -0.16154 4 | C 1.63305 0.12653 0.49154 5 | C 0.73301 1.14296 0.17992 6 | C -0.33502 0.89718 -0.75451 7 | C -1.22949 -0.53284 -0.33068 8 | C -2.18008 -0.33673 0.66268 9 | H 2.24804 0.24055 1.38351 10 | H 1.33876 -1.19567 -1.19895 11 | H 2.21657 -1.93156 0.23330 12 | H -1.63336 -0.99139 -1.23936 13 | H -0.26003 -1.10697 -0.04991 14 | H -1.92595 0.17946 1.58461 15 | H -3.20197 -0.68773 0.56274 16 | H -1.04523 1.71645 -0.86266 17 | H -0.01424 0.56424 -1.74605 18 | H 0.69744 2.02800 0.80829 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/79_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C 2.16330 -0.58575 -0.30031 4 | C 1.03455 -0.62610 0.40776 5 | C 0.05765 0.50301 0.57615 6 | C 0.13752 1.64178 -0.33530 7 | C -1.79116 -1.16083 -0.32291 8 | C -1.47449 0.13481 0.14884 9 | H 0.79245 -1.53333 0.95969 10 | H 2.46376 0.30124 -0.85015 11 | H 2.83120 -1.44057 -0.34573 12 | H -2.50966 -1.28311 -1.12724 13 | H -1.13461 -2.00437 -0.14328 14 | H -2.09737 0.63797 0.89229 15 | H -1.56591 0.91891 -0.71623 16 | H -0.13020 2.63980 -0.00954 17 | H 0.53784 1.51896 -1.33470 18 | H 0.04826 0.80299 1.62954 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/7_ts.xyz: -------------------------------------------------------------------------------- 1 | 12 2 | 3 | N -1.94749 -0.17121 0.22776 4 | B -0.63551 0.55841 -0.36577 5 | N 1.96682 0.12616 0.16994 6 | B 0.79505 -0.57370 -0.10589 7 | H 1.96792 1.11206 0.39047 8 | H -0.39464 1.60857 0.16829 9 | H -0.59543 0.52822 -1.57227 10 | H -2.61124 -0.53200 -0.44295 11 | H -2.39290 0.29167 1.00691 12 | H 2.88871 -0.27437 0.07239 13 | H 0.90663 -1.73947 -0.37590 14 | H -0.70203 -0.60292 0.32737 15 | -------------------------------------------------------------------------------- /data/dft_ts_structures/80_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C 0.38615 0.17008 -0.95479 4 | C -0.49936 0.91773 -0.05362 5 | C -1.75628 0.43700 0.39911 6 | C -2.39344 -0.71844 0.05643 7 | C 2.61823 -0.07797 0.44842 8 | C 1.26633 -0.50123 0.11646 9 | H -0.08923 1.80916 0.41144 10 | H -0.13769 -0.56933 -1.56568 11 | H 1.00471 0.78715 -1.61244 12 | H 3.03539 -0.21813 1.43930 13 | H 3.21498 0.43376 -0.29798 14 | H 2.11871 -1.24427 -0.28536 15 | H 0.72058 -1.04065 0.88521 16 | H -3.36510 -0.96253 0.47046 17 | H -1.96777 -1.44081 -0.63370 18 | H -2.26441 1.08271 1.11661 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/81_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C 2.01479 -0.98695 -0.23486 4 | C 1.51635 0.08170 0.38665 5 | C 0.07765 0.52698 0.42085 6 | C -0.20632 1.75147 -0.31184 7 | C -0.92343 -0.40170 -0.33956 8 | C -2.22090 -0.79818 0.17624 9 | H 2.19115 0.75585 0.91302 10 | H 1.38871 -1.67706 -0.79284 11 | H 3.07696 -1.20972 -0.20748 12 | H -0.79611 -0.41603 -1.41904 13 | H -0.92385 -1.53469 0.01426 14 | H -2.36774 -0.85534 1.24884 15 | H -3.07959 -0.95431 -0.46800 16 | H -1.11319 2.30893 -0.10978 17 | H 0.32931 1.96602 -1.22953 18 | H -0.25443 0.57643 1.46567 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/82_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C -2.17788 -0.11704 -0.60164 4 | C -1.47507 0.99321 -0.02627 5 | C -1.00593 -0.29862 0.57872 6 | C 0.16206 -1.01692 0.18824 7 | C 1.56656 0.50884 0.22361 8 | C 2.73058 0.12568 -0.37327 9 | H -2.07407 1.62311 0.63501 10 | H -1.79296 -0.62543 -1.48195 11 | H -3.23594 -0.32762 -0.41385 12 | H 0.76219 1.04791 -0.31885 13 | H 1.58724 0.72186 1.29149 14 | H 3.62816 -0.08930 0.19914 15 | H 2.79381 -0.03151 -1.44697 16 | H 0.53760 -1.79050 0.85399 17 | H 0.31322 -1.23881 -0.86331 18 | H -1.32111 -0.46067 1.60886 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/83_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C 2.43485 -0.50004 -0.14089 4 | C 1.19762 -0.07045 0.09815 5 | C 0.48909 1.11486 0.34351 6 | C -0.70690 1.31572 -0.36300 7 | C -1.87624 -0.20928 0.08984 8 | C -1.17250 -1.43123 0.02090 9 | H 0.29245 -0.93082 0.07409 10 | H 3.25268 0.18830 -0.33796 11 | H 2.66918 -1.56017 -0.17268 12 | H -2.23265 0.10697 1.06685 13 | H -2.57764 0.01401 -0.70974 14 | H -1.17666 -1.99957 -0.90588 15 | H -1.03140 -2.02061 0.92291 16 | H -1.31588 2.18141 -0.11021 17 | H -0.69166 1.09892 -1.42885 18 | H 0.61616 1.60403 1.31045 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/84_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 84ts_reopt.out Energy: -147081.3724076 3 | C 2.41287 -0.20119 -0.48105 4 | C 1.42601 -0.81693 0.14907 5 | C 0.00000 0.35514 0.64028 6 | C 0.00002 1.61029 0.09262 7 | C -2.41287 -0.20118 -0.48107 8 | C -1.42604 -0.81690 0.14912 9 | H 1.46403 -1.82885 0.55482 10 | H 2.27036 0.84029 -0.77716 11 | H 3.37099 -0.67286 -0.68282 12 | H -3.37100 -0.67285 -0.68282 13 | H -2.27033 0.84027 -0.77728 14 | H -0.00002 -0.65507 -0.09390 15 | H -1.46409 -1.82877 0.55495 16 | H 0.00002 2.46138 0.76055 17 | H 0.00001 1.78480 -0.97614 18 | H 0.00001 0.15624 1.70606 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/85_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C -0.37121 -1.74339 0.41803 4 | C -1.28080 -0.91068 -0.25267 5 | C -1.16366 0.45956 -0.15338 6 | C -1.65694 1.64228 0.16230 7 | C 2.48358 0.57752 0.28252 8 | C 1.52650 0.03033 -0.50481 9 | H -1.78242 -1.30460 -1.13885 10 | H -0.08552 -1.49890 1.44075 11 | H -0.34678 -2.80333 0.17947 12 | H 3.46974 0.83608 -0.09381 13 | H 2.30308 0.78226 1.33538 14 | H 0.84832 -0.98736 -0.08137 15 | H 1.76968 -0.13661 -1.55740 16 | H -1.11485 2.56112 -0.04810 17 | H -2.61761 1.74908 0.66495 18 | H 0.33149 0.46852 -0.41298 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/86_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C 1.36631 1.24686 0.27880 4 | C 1.48281 0.41776 -0.87540 5 | C 1.66714 -0.84941 -0.36724 6 | C 1.16645 -0.77231 0.96568 7 | C -2.85986 0.50092 0.20241 8 | C -2.42450 -0.60916 -0.38928 9 | H 1.35472 0.73625 -1.90821 10 | H 2.19852 1.29906 0.96973 11 | H 0.71010 2.12190 0.31734 12 | H -3.79146 0.52701 0.76144 13 | H -2.30184 1.43186 0.15016 14 | H -1.49043 -0.63308 -0.94368 15 | H -2.98294 -1.54020 -0.33790 16 | H 1.61507 -1.32409 1.79785 17 | H 0.12308 -0.52389 1.11584 18 | H 2.17505 -1.70284 -0.81238 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/87_ts.xyz: -------------------------------------------------------------------------------- 1 | 16 2 | 3 | C -2.43488 -0.49993 0.14078 4 | C -1.19758 -0.07044 -0.09811 5 | C -0.48902 1.11489 -0.34336 6 | C 0.70708 1.31557 0.36307 7 | C 1.87614 -0.20928 -0.09014 8 | C 1.17244 -1.43124 -0.02072 9 | H -0.29252 -0.93081 -0.07402 10 | H -3.25267 0.18847 0.33784 11 | H -2.66931 -1.56004 0.17247 12 | H 2.23213 0.10676 -1.06735 13 | H 2.57794 0.01407 0.70908 14 | H 1.17664 -1.99926 0.90625 15 | H 1.03106 -2.02086 -0.92252 16 | H 1.31601 2.18132 0.11036 17 | H 0.69193 1.09865 1.42890 18 | H -0.61620 1.60426 -1.31017 19 | -------------------------------------------------------------------------------- /data/dft_ts_structures/88_ts.xyz: -------------------------------------------------------------------------------- 1 | 20 2 | 3 | C 0.74285 1.71981 -0.24549 4 | P 0.74399 -0.12373 -0.15998 5 | C 2.47430 -0.53375 -0.74377 6 | C 0.84364 -0.51286 1.63811 7 | H 1.59001 2.14234 0.30571 8 | H 0.80389 2.04399 -1.28869 9 | H -0.20369 2.04739 0.18520 10 | H 1.57504 0.12393 2.14630 11 | H -0.15400 -0.34985 2.04777 12 | H 1.13488 -1.55925 1.77181 13 | H 3.23771 -0.00781 -0.15832 14 | H 2.58621 -0.25312 -1.79518 15 | H 2.64883 -1.61029 -0.65861 16 | H -2.81879 0.77021 -1.11805 17 | C -2.60368 0.00822 -0.34253 18 | C -1.58768 -0.96215 -0.76238 19 | H -3.57645 -0.44945 -0.06359 20 | H -1.20776 -1.03049 -1.77418 21 | H -1.48230 -1.85701 -0.16074 22 | O -1.81374 0.44121 0.71209 23 | -------------------------------------------------------------------------------- /data/dft_ts_structures/89_ts.xyz: -------------------------------------------------------------------------------- 1 | 17 2 | 3 | C 2.93355 -2.10018 0.50434 4 | C 2.52998 -0.75412 0.06245 5 | C 3.06268 0.27449 -0.56512 6 | C 2.36478 1.55972 -0.96292 7 | O 1.26332 1.87846 -0.13129 8 | Cl -1.47654 0.75981 1.51291 9 | S -1.13098 -0.25008 -0.28642 10 | O 0.43792 -0.99394 0.18454 11 | Cl -3.34381 -0.49419 -0.89184 12 | H 2.40607 -2.86600 -0.07114 13 | H 2.71062 -2.26480 1.56284 14 | H 4.01487 -2.22594 0.35370 15 | H 1.16828 -0.34845 0.59333 16 | H 4.12726 0.20162 -0.81396 17 | H 3.10141 2.37443 -0.99788 18 | H 1.95817 1.45432 -1.97517 19 | H 1.59892 2.20502 0.71443 20 | -------------------------------------------------------------------------------- /data/dft_ts_structures/8_ts.xyz: -------------------------------------------------------------------------------- 1 | 14 2 | 3 | N -1.68519 -0.88982 -0.02162 4 | B -0.66690 2.05438 0.02574 5 | B 1.11540 -1.15491 0.04293 6 | N 1.70853 0.10966 -0.03537 7 | H -1.62558 -1.86755 0.25094 8 | H -2.13041 -0.86273 -0.93514 9 | H -2.31996 -0.43543 0.62949 10 | H -1.60532 1.85224 -0.68041 11 | H -0.75720 1.90344 1.20476 12 | H 0.31450 2.55004 -0.43669 13 | H 0.91843 -1.63530 1.12009 14 | H 0.93946 -1.77561 -0.96393 15 | H 1.94058 0.56076 -0.90712 16 | H 1.91960 0.67395 0.77361 17 | -------------------------------------------------------------------------------- /data/dft_ts_structures/91_ts.xyz: -------------------------------------------------------------------------------- 1 | 17 2 | 3 | C 3.56771 0.25872 1.15858 4 | C 2.42723 0.07233 0.20338 5 | C 2.26379 -1.00592 -0.57328 6 | C 1.14439 -1.24891 -1.54984 7 | O -0.06315 -0.51603 -1.33194 8 | Cl -0.42973 2.15911 -0.68653 9 | S -0.85422 -0.64234 0.75152 10 | O -0.69619 0.20982 1.92391 11 | Cl -2.82405 -0.56974 0.06564 12 | H 3.19927 0.40720 2.18070 13 | H 4.13726 1.16016 0.90223 14 | H 4.25213 -0.59468 1.15748 15 | H 1.71085 0.89227 0.14797 16 | H 3.00492 -1.80571 -0.54825 17 | H 1.46579 -1.02058 -2.57883 18 | H 0.86034 -2.30815 -1.54784 19 | H 0.00726 0.52008 -1.35151 20 | -------------------------------------------------------------------------------- /data/dft_ts_structures/92_ts.xyz: -------------------------------------------------------------------------------- 1 | 17 2 | 3 | C -3.12239 1.73183 -0.69181 4 | C -2.48392 0.55311 -0.05838 5 | C -1.95709 -0.54920 -0.75487 6 | C -1.66635 -1.86353 -0.06201 7 | O -1.51741 -1.75499 1.33902 8 | Cl 1.15573 1.05746 1.45060 9 | S 1.00687 -0.08610 -0.29629 10 | O -0.55925 0.43998 -0.80969 11 | Cl 3.30838 -0.27947 -0.72925 12 | H -2.60341 2.65191 -0.39887 13 | H -4.15791 1.83388 -0.33566 14 | H -3.13336 1.66233 -1.78145 15 | H -2.34219 0.55558 1.01897 16 | H -2.19869 -0.64689 -1.81195 17 | H -2.45677 -2.57512 -0.34454 18 | H -0.72291 -2.26586 -0.44738 19 | H -2.39286 -1.77721 1.74624 20 | -------------------------------------------------------------------------------- /data/dft_ts_structures/93_ts.xyz: -------------------------------------------------------------------------------- 1 | 17 2 | 3 | C 2.17101 2.29267 0.35365 4 | C 2.41797 0.88058 -0.01005 5 | C 1.87158 -0.23452 0.65907 6 | C 2.46297 -1.61710 0.44631 7 | O 2.82530 -1.83652 -0.89832 8 | Cl -3.18762 -1.20137 0.14879 9 | S -1.04888 -0.20815 0.18585 10 | O 0.55581 -0.22619 -0.39352 11 | Cl -1.62024 1.73818 -0.37241 12 | H 1.56713 2.39876 1.25720 13 | H 1.67298 2.82171 -0.46940 14 | H 3.13032 2.80883 0.50554 15 | H 2.98443 0.66582 -0.91288 16 | H 1.44414 -0.06360 1.64719 17 | H 3.37551 -1.71717 1.04509 18 | H 1.74274 -2.36322 0.81218 19 | H 2.00831 -1.77476 -1.41604 20 | -------------------------------------------------------------------------------- /data/dft_ts_structures/97_ts.xyz: -------------------------------------------------------------------------------- 1 | 20 2 | 3 | C -0.09341 -0.10021 0.19190 4 | C 0.59886 1.14741 0.34265 5 | C 1.97528 1.23835 0.18722 6 | C 2.74599 0.11476 -0.12280 7 | C 2.09629 -1.11813 -0.28621 8 | C 0.72543 -1.23215 -0.15265 9 | O -1.21503 0.06620 -1.12922 10 | C -2.38730 0.70017 -0.58273 11 | C -2.45346 -0.44846 0.32386 12 | C -1.32087 -0.44362 1.24351 13 | H 0.03119 2.03247 0.61734 14 | H 2.45442 2.20549 0.31774 15 | H 3.82240 0.19271 -0.23327 16 | H 2.67547 -2.00709 -0.52336 17 | H 0.23961 -2.19390 -0.29049 18 | H -2.18321 1.67369 -0.12097 19 | H -2.97430 -1.34632 0.00872 20 | H -1.12510 -1.38754 1.75123 21 | H -1.36828 0.36675 1.97515 22 | H -3.17284 0.78540 -1.33676 23 | -------------------------------------------------------------------------------- /data/dft_ts_structures/98_ts.xyz: -------------------------------------------------------------------------------- 1 | 20 2 | 3 | C 0.35192 -0.21647 -0.33068 4 | C 0.79828 1.09594 -0.03327 5 | C 2.13737 1.34317 0.25763 6 | C 3.07090 0.30376 0.26768 7 | C 2.64638 -0.99635 -0.03189 8 | C 1.31463 -1.25713 -0.32920 9 | O -0.91505 -0.49408 -0.60714 10 | C -2.84615 -0.91395 0.88913 11 | C -2.32579 0.26834 0.35313 12 | C -3.24585 0.86142 -0.52127 13 | H 0.08932 1.91748 -0.08082 14 | H 2.45768 2.36003 0.47061 15 | H 4.11363 0.50339 0.49466 16 | H 3.36432 -1.81275 -0.03254 17 | H 0.97402 -2.26226 -0.55817 18 | H -3.47337 -1.55306 0.27825 19 | H -1.73384 0.91017 0.99854 20 | H -3.31796 1.93755 -0.63896 21 | H -3.91187 0.24447 -1.11288 22 | H -2.65180 -1.22463 1.91082 23 | -------------------------------------------------------------------------------- /data/dft_ts_structures/99_ts.xyz: -------------------------------------------------------------------------------- 1 | 21 2 | 3 | C -1.40405 1.84209 0.92949 4 | C -1.72869 0.52299 0.20093 5 | H -1.90208 1.86334 1.89739 6 | H -1.70034 2.68923 0.31371 7 | H -0.32004 1.84818 1.06987 8 | O -1.72653 0.53979 -1.04249 9 | O -2.08983 -1.54600 -0.95543 10 | H -2.22161 -2.05246 -0.13548 11 | O -1.92983 -0.48598 0.91104 12 | C 1.84308 0.35813 -0.69583 13 | C 1.47775 -0.79139 -0.11222 14 | C 2.21523 -1.55863 0.94899 15 | H 0.54130 -1.23953 -0.44154 16 | H 3.13508 -1.06700 1.27471 17 | H 2.48217 -2.56060 0.58905 18 | H 1.58129 -1.70612 1.83252 19 | C 3.08760 1.16498 -0.44822 20 | H 1.17365 0.75899 -1.45654 21 | H 3.71757 0.74685 0.34049 22 | H 2.84168 2.19735 -0.16806 23 | H 3.69541 1.23030 -1.35987 24 | -------------------------------------------------------------------------------- /data/dft_ts_structures/9_ts.xyz: -------------------------------------------------------------------------------- 1 | 14 2 | 3 | N -1.48385 -1.29471 0.00745 4 | B -1.40953 1.82485 0.15226 5 | B 2.23322 -0.11229 0.44967 6 | N 1.26008 -0.02761 -0.53854 7 | H -1.98251 -0.91505 0.80788 8 | H -1.15830 -2.22030 0.27730 9 | H -2.17238 -1.42541 -0.72931 10 | H -0.57406 2.46852 -0.39938 11 | H -2.36292 1.44333 -0.45624 12 | H -1.33516 1.63003 1.32624 13 | H 3.30029 0.40463 0.28142 14 | H 1.98525 -0.71137 1.45755 15 | H 0.33268 -0.44490 -0.45048 16 | H 1.41503 0.46399 -1.40697 17 | -------------------------------------------------------------------------------- /data/reactions_am.txt: -------------------------------------------------------------------------------- 1 | R1 [N+:1](=[B-:2](/[H:6])[H:7])(\[H:8])[H:9].[N+:3](=[B-:4](/[H:11])[H:12])(\[H:5])[H:10]>>[N+:1]([B-:2]([H:6])([H:7])[H:12])([B:4]([N:3]([H:5])[H:10])[H:11])([H:8])[H:9] 2 | R2 [N+:1](=[B-:2](/[H:6])[H:7])(\[H:8])[H:9].[N+:3](=[B-:4](/[H:11])[H:12])(\[H:5])[H:10]>>[N+:1]([B-:2]([H:6])([H:7])[H:9])([B:4]([N:3]([H:5])[H:10])[H:11])([H:8])[H:12] 3 | R3 [N+:1](=[B-:2](/[H:6])[H:7])(\[H:8])[H:9].[N+:3](=[B-:4](/[H:11])[H:12])(\[H:5])[H:10]>>[N+:1]([B-:2]([N:3]([B:4]([H:11])[H:12])[H:10])([H:6])[H:7])([H:5])([H:8])[H:9] 4 | R4 [N+:1](=[B-:2](/[H:6])[H:7])(\[H:8])[H:9].[N+:3](=[B-:4](/[H:11])[H:12])(\[H:5])[H:10]>>[N+:1](=[B-:2](/[H:6])[H:7])(\[H:9])[H:12].[N+:3](=[B-:4](/[H:8])[H:11])(\[H:5])[H:10] 5 | R5 [N+:1](=[B-:2](/[H:6])[H:7])(\[H:8])[H:9].[N+:3](=[B-:4](/[H:11])[H:12])(\[H:5])[H:10]>>[N+:1](=[B-:2](/[H:6])[H:7])(\[H:5])[H:8].[N+:3](=[B-:4](/[H:11])[H:12])(\[H:9])[H:10] 6 | R7 [N+:1](=[B-:2](/[H:6])[H:7])(\[H:8])[H:9].[N+:3](=[B-:4](/[H:11])[H:12])(\[H:5])[H:10]>>[N+:1]([B-:2]([B:4]([N:3]([H:5])[H:10])[H:11])([H:6])[H:7])([H:8])([H:9])[H:12] 7 | R8 [B-:3](=[N+:4](/[H:13])[H:14])(\[H:11])[H:12].[N+:1]([B-:2]([H:8])([H:9])[H:10])([H:5])([H:6])[H:7]>>[N+:1]([B-:3]([N+:4]([B-:2]([H:8])([H:9])[H:10])([H:13])[H:14])([H:11])[H:12])([H:5])([H:6])[H:7] 8 | R12 [N+:1]([B-:2]([H:8])([H:9])[H:10])([H:5])([H:6])[H:7]>>[H:7][H:9].[N+:1](=[B-:2](/[H:8])[H:10])(\[H:5])[H:6] 9 | R13 [B-:3](=[N+:4](/[H:13])[H:14])(\[H:11])[H:12].[N+:1]([B-:2]([H:8])([H:9])[H:10])([H:5])([H:6])[H:7]>>[B-:3](=[N+:4](/[H:5])[H:14])(\[H:11])[H:12].[H:10][H:13].[N+:1](=[B-:2](/[H:8])[H:9])(\[H:6])[H:7] 10 | R17 [H:1]/[C:2](=[C:3](/[H:5])[O:6][H:7])[H:4].[O:8]=[C:9]([H:10])[H:11]>>[H:1][C:2]([C:3](=[O:6])[C:9]([O:8][H:7])([H:10])[H:11])([H:4])[H:5] 11 | R18 [H:1]/[C:2](=[C:3](/[H:5])[O:6][H:7])[H:4].[O:8]=[C:9]([H:10])[H:11]>>[H:1][C:2]([C@:3]([H:5])([O:6][H:7])[C:9](=[O:8])[H:11])([H:4])[H:10] 12 | R19 [H:1]/[C:2](=[C:3](/[H:5])[O:6][H:7])[H:4].[O:8]=[C:9]([H:10])[H:11]>>[H:1][C:2]([C:3]([H:5])=[O:6])([H:4])[C:9]([O:8][H:7])([H:10])[H:11] 13 | R21 [H:1]/[C:2](=[C:3](/[H:5])[O:6][H:7])[H:4].[O:8]=[C:9]([H:10])[H:11]>>[H:1]/[C:2](=[C:3](/[H:5])[H:11])[H:4].[O:6]([H:7])[C:9](=[O:8])[H:10] 14 | R23 [H:1]/[C:2](=[C:3](/[H:5])[O:6][H:7])[H:4].[O:8]=[C:9]([H:10])[H:11]>>[H:1]/[C:2](=[C:3](\[O:6][H:7])[C:9]([O:8][H:5])([H:10])[H:11])[H:4] 15 | R24 [H:1]/[C:2](=[C:3](/[H:5])[O:6][H:7])[H:4].[O:8]=[C:9]([H:10])[H:11]>>[H:1]/[C:2](=[C:3](/[H:5])[O:8][C:9]([O:6][H:7])([H:10])[H:11])[H:4] 16 | R25 [H:1]/[C:2](=[C:3](/[H:5])[O:6][H:7])[H:4].[O:8]=[C:9]([H:10])[H:11]>>[H:1]/[C:2](=[C:3](/[H:5])[O:6][C:9]([O:8][H:7])([H:10])[H:11])[H:4] 17 | R26 [H:1]/[C:2](=[C:3](/[H:5])[O:6][H:7])[H:4].[O:8]=[C:9]([H:10])[H:11]>>[H:1][C:2](=[C:3]=[O:6])[H:4].[H:5][C:9]([O:8][H:7])([H:10])[H:11] 18 | R27 [H:1]/[C:2](=[C:3](/[H:5])[O:6][H:7])[H:4].[O:8]=[C:9]([H:10])[H:11]>>[H:1]/[C:2](=[C:3](/[H:5])[O:6][H:11])[H:4].[H:7][C:9](=[O:8])[H:10] 19 | R28 [H:1]/[C:2](=[C:3](/[H:5])[O:6][H:7])[H:4].[O:8]=[C:9]([H:10])[H:11]>>[H:1][C:2]1([H:4])[C@@:3]([H:5])([C:9]([O:8][H:7])([H:10])[H:11])[O:6]1 20 | R29 [H:1]/[C:2](=[C:3](/[H:5])[O:6][H:7])[H:4].[O:8]=[C:9]([H:10])[H:11]>>[H:1][C:2]1([H:4])[C@:3]([H:5])([O:6][H:7])[C:9]([H:10])([H:11])[O:8]1 21 | R30 [C@:1]([C:2](=[O:3])[O:7][C:8]([C:9]([H:13])([H:14])[H:15])([H:11])[H:12])([F:4])([F:5])[F:6].[N:10]([H:16])([H:17])[H:18]>>[C:8]([C:9]([H:13])([H:14])[H:15])([N:10]([H:16])[H:17])([H:11])[H:12].[C@:1]([C:2](=[O:3])[O:7][H:18])([F:4])([F:5])[F:6] 22 | R31 [C@:1]([C:2](=[O:3])[O:7][C:8]([C:9]([H:13])([H:14])[H:15])([H:11])[H:12])([F:4])([F:5])[F:6]>>[C@:1]([C:2]([O:3][C:8]([C:9]([H:13])([H:14])[H:15])([H:11])[H:12])=[O:7])([F:4])([F:5])[F:6] 23 | R32 [C@:1]([C:2](=[O:3])[O:7][C:8]([C:9]([H:13])([H:14])[H:15])([H:11])[H:12])([F:4])([F:5])[F:6].[N:10]([H:16])([H:17])[H:18]>>[C@:1]([C@:2]([O:3][H:18])([O:7][C:8]([C:9]([H:13])([H:14])[H:15])([H:11])[H:12])[N:10]([H:16])[H:17])([F:4])([F:5])[F:6] 24 | R33 [C:1]([C:2](=[O:3])[H:6])([H:4])([H:5])[H:7]>>[C:1](=[C:2](\[O:3][H:7])[H:6])(\[H:4])[H:5] 25 | R34 [H:1][C:2]([H:3])([C:4]([H:6])([H:7])[H:8])[H:5]>>[H:1]/[C:2]([H:3])=[C:4](/[H:7])[H:8].[H:5][H:6] 26 | R36 [C@@:1]1([F:4])([F:5])[O:2][C@:3]1([C@@:6]([F:8])([F:9])[F:10])[F:7]>>[C:1](=[O:2])([C@:3]([F:4])([C@@:6]([F:8])([F:9])[F:10])[F:7])[F:5] 27 | R37 [C@@:1]1([F:4])([F:5])[O:2][C@:3]1([C@@:6]([F:8])([F:9])[F:10])[F:7]>>[C@:1]([C:3](=[O:2])[C@@:6]([F:8])([F:9])[F:10])([F:4])([F:5])[F:7] 28 | R38 [C:1](=[O:2])([H:5])[H:6].[N:3]([H:4])([H:7])[H:8]>>[C:1](=[O:2])([H:6])[H:8].[N:3]([H:4])([H:5])[H:7] 29 | R39 [C:1](=[O:2])([H:3])[H:4]>>[C-:1]#[O+:2].[H:3][H:4] 30 | R40 [C:1](=[O:2])([H:5])[H:6].[N:3]([H:4])([H:7])[H:8]>>[C:1]([O:2][N:3]([H:4])[H:8])([H:5])([H:6])[H:7] 31 | R41 [C:1](=[O:2])([H:5])[H:6].[N:3]([H:4])([H:7])[H:8]>>[C:1]([O:2][H:7])([N:3]([H:4])[H:8])([H:5])[H:6] 32 | R42 [C:1](/[C:2](=[C:6](/[O:7][H:12])[C:8]([H:9])([H:10])[H:11])[H:13])([H:3])([H:4])[H:5]>>[C:1]([C:2]([C:6](=[O:7])[C:8]([H:9])([H:10])[H:11])([H:12])[H:13])([H:3])([H:4])[H:5] 33 | R43 [C:1](/[C:2](=[C:6](/[O:7][H:12])[C:8]([H:9])([H:10])[H:11])[H:13])([H:3])([H:4])[H:5]>>[C:1]([C:2](/[C:6]([O:7][H:12])=[C:8](\[H:9])[H:10])([H:11])[H:13])([H:3])([H:4])[H:5] 34 | R44 [C:1](/[C:2](=[C:6](/[O:7][H:12])[C:8]([H:9])([H:10])[H:11])[H:13])([H:3])([H:4])[H:5]>>[C:1](=[C:2](/[C@@:6]([H:5])([O:7][H:12])[C:8]([H:9])([H:10])[H:11])[H:13])(\[H:3])[H:4] 35 | R45 [C:1](/[C:2](=[C:6](/[O:7][H:12])[C:8]([H:9])([H:10])[H:11])[H:13])([H:3])([H:4])[H:5]>>[C:1]([C@@:2]1([H:13])[C@@:6]([O:7][H:12])([H:9])[C:8]1([H:10])[H:11])([H:3])([H:4])[H:5] 36 | R46 [C:1](/[C:2](=[C:6](/[O:7][H:12])[C:8]([H:9])([H:10])[H:11])[H:13])([H:3])([H:4])[H:5]>>[C:1]([C:2](=[C:6]=[C:8]([H:9])[H:10])[H:13])([H:3])([H:4])[H:5].[O:7]([H:11])[H:12] 37 | R47 [C:1](/[C:2](=[C:3](\[C:4]([H:9])([H:10])[H:11])[O:5][H:12])[H:13])([H:6])([H:7])[H:8].[H:14][O:15][H:16]>>[C:1]([C:2]([C@:3]([C:4]([H:9])([H:10])[H:11])([O:5][H:12])[O:15][H:14])([H:13])[H:16])([H:6])([H:7])[H:8] 38 | R48 [C:1](/[C:2](=[C:3](\[C:4]([H:9])([H:10])[H:11])[O:5][H:12])[H:13])([H:6])([H:7])[H:8]>>[C:1]([C:2]([C:3]([C:4]([H:9])([H:10])[H:11])=[O:5])([H:12])[H:13])([H:6])([H:7])[H:8] 39 | R49 [C:1](/[C:2](=[C:3](\[C:4]([H:9])([H:10])[H:11])[O:5][H:12])[H:13])([H:6])([H:7])[H:8].[H:14][O:15][H:16]>>[C:1]([C@:2]([C@:3]([C:4]([H:9])([H:10])[H:11])([O:5][H:12])[H:16])([H:13])[O:15][H:14])([H:6])([H:7])[H:8] 40 | R50 [C:1](/[C:2](=[C:3](\[C:4]([H:9])([H:10])[H:11])[O:5][H:12])[H:13])([H:6])([H:7])[H:8].[H:14][O:15][H:16]>>[C:1](/[C:2](=[C:3](\[C:4]([H:9])([H:10])[H:11])[O:5][H:14])[H:13])([H:6])([H:7])[H:8].[H:12][O:15][H:16] 41 | R51 [C:1](/[C:2](=[C:3](\[C:4]([H:9])([H:10])[H:11])[O:5][H:12])[H:13])([H:6])([H:7])[H:8].[H:14][O:15][H:16]>>[C:1](/[C:2](=[C:3](\[C:4]([H:9])([H:10])[H:11])[O:15][H:16])[H:13])([H:6])([H:7])[H:8].[O:5]([H:12])[H:14] 42 | R52 [C:1](/[C:2](=[C:3](\[C:4]([H:9])([H:10])[H:11])[O:5][H:12])[H:13])([H:6])([H:7])[H:8].[H:14][O:15][H:16]>>[C:1]([C:2](/[C:3](=[C:4](\[H:9])[H:10])[O:5][H:12])([H:13])[H:14])([H:6])([H:7])[H:8].[H:11][O:15][H:16] 43 | R53 [C:1](/[C:2](=[C:3](\[C:4]([H:9])([H:10])[H:11])[O:5][H:12])[H:13])([H:6])([H:7])[H:8]>>[C:1](=[C:2](\[C@@:3]([C:4]([H:9])([H:10])[H:11])([O:5][H:12])[H:7])[H:13])(\[H:6])[H:8] 44 | R55 [C:1](/[C:2](=[C:3](\[C:4]([H:9])([H:10])[H:11])[O:5][H:12])[H:13])([H:6])([H:7])[H:8].[H:14][O:15][H:16]>>[C:1]([C@:2]([C:3]([C:4]([H:9])([H:10])[H:11])=[O:5])([H:13])[O:15][H:16])([H:6])([H:7])[H:8].[H:12][H:14] 45 | R56 [C:1](=[O:2])([H:5])[H:6].[C:3]([O:4][H:9])([H:7])([H:8])[H:10]>>[C:1]([O:2][C:3]([H:7])([H:8])[H:10])([O:4][H:9])([H:5])[H:6] 46 | R57 [C:1](=[O:2])([H:5])[H:6].[C:3]([O:4][H:9])([H:7])([H:8])[H:10]>>[C:1]([O:2][H:9])([O:4][C:3]([H:7])([H:8])[H:10])([H:5])[H:6] 47 | R58 [C:1](=[O:2])([H:5])[H:6].[C:3]([O:4][H:9])([H:7])([H:8])[H:10]>>[C:1]([O:2][H:9])([H:5])([H:6])[H:7].[C:3](=[O:4])([H:8])[H:10] 48 | R59 [C:1](=[O:2])([H:5])[H:6].[C:3]([O:4][H:9])([H:7])([H:8])[H:10]>>[C:1]([O:2][H:7])([H:5])([H:6])[H:9].[C:3](=[O:4])([H:8])[H:10] 49 | R60 [C:1](=[O:2])([H:5])[H:6].[C:3]([O:4][H:9])([H:7])([H:8])[H:10]>>[C-:1]#[O+:2].[C:3]([O:4][H:6])([H:7])([H:8])[H:10].[H:5][H:9] 50 | R61 [C:1](=[O:2])([H:5])[H:6].[C:3]([O:4][H:9])([H:7])([H:8])[H:10]>>[C:1]([O:2][H:7])([C:3]([O:4][H:9])([H:8])[H:10])([H:5])[H:6] 51 | R62 [C:1](/[C:2](=[N:3]/[C:4]([H:9])([H:10])[H:11])[H:5])([H:6])([H:7])[H:8]>>[C:1](=[C:2](/[N:3]([C:4]([H:9])([H:10])[H:11])[H:7])[H:5])(\[H:6])[H:8] 52 | R63 [C:1](/[C:2](=[N:3]/[C:4]([H:9])([H:10])[H:11])[H:5])([H:6])([H:7])[H:8]>>[C:1]([C@:2]1([H:5])[N:3]([H:9])[C:4]1([H:10])[H:11])([H:6])([H:7])[H:8] 53 | R64 [C:1](/[C:2](=[N:3]/[C:4]([H:9])([H:10])[H:11])[H:5])([H:6])([H:7])[H:8]>>[C:1](/[C-:2]=[N+:3](/[C:4]([H:9])([H:10])[H:11])[H:5])([H:6])([H:7])[H:8] 54 | R65 [C:1](/[C:2](=[N:3]/[C:4]([H:9])([H:10])[H:11])[H:5])([H:6])([H:7])[H:8]>>[C:1](/[C:2](=[N+:3](/[C-:4]([H:9])[H:10])[H:11])[H:5])([H:6])([H:7])[H:8] 55 | R66 [H:11]/[C:12](=[C:13](/[H:15])[H:16])[H:14].[P:1]([H:2])([C:3]([H:5])([H:6])[H:7])[C:4]([H:8])([H:9])[H:10]>>[P@@:1]([H:2])(=[C:3]([H:6])[H:7])([C:4]([H:8])([H:9])[H:10])[C:13]([C:12]([H:5])([H:11])[H:14])([H:15])[H:16] 56 | R67 [C:1](\[H:2])([H:3])=[C:4](\[C:5]([H:7])([H:8])[H:9])[H:6]>>[C:1]([H:2])([H:3])(/[C:4](=[C:5](/[H:7])[H:9])[H:6])[H:8] 57 | R69 [Si:1]([H:2])[H:3].[H:4][H:5]>>[Si:1]([H:2])([H:3])([H:4])[H:5] 58 | R70 [O:3]=[S@:4]([Cl:5])([Cl:6])=[O:7]>>[Cl:5][Cl:6].[O:3]=[S:4]=[O:7] 59 | R71 [H:1]/[C:2](=[C:3](/[H:5])[O:6][H:7])[H:4]>>[H:1][C:2]([C:3]([H:5])=[O:6])([H:4])[H:7] 60 | R72 [C:1](/[C:2](=[N:3]/[C:4]([H:9])([H:10])[H:11])[H:5])([H:6])([H:7])[H:8]>>[C-:2]#[N+:3][C:4]([H:9])([H:10])[H:11].[C:1]([H:5])([H:6])([H:7])[H:8] 61 | R73 [C:1](=[C:2](\[C:5]([H:6])([H:7])[H:8])[C:9]([H:10])([H:11])[H:12])(\[H:3])[H:4].[O:13]([H:14])[H:15]>>[C:1]([C@:2]([C:5]([H:6])([H:7])[H:8])([C:9]([H:10])([H:11])[H:12])[O:13][H:14])([H:3])([H:4])[H:15] 62 | R74 [C@:1]1([C:5]([H:11])([H:12])[H:13])([H:7])[C:2]([H:8])=[C:3]([H:9])[C@@:4]1([C:6]([H:14])([H:15])[H:16])[H:10]>>[C:1](=[C:2]([C:3](=[C:4](/[C:6]([H:14])([H:15])[H:16])[H:10])/[H:9])\[H:8])(\[C:5]([H:11])([H:12])[H:13])[H:7] 63 | R75 [C:1](=[C:2]([C:3](=[C:4](\[H:14])[H:15])\[H:16])/[H:7])(\[H:8])[H:9].[C:5](=[C:6](/[H:12])[H:13])(\[H:10])[H:11]>>[C:1]1([H:8])([H:9])[C:2]([H:7])=[C:3]([H:16])[C:4]([H:14])([H:15])[C:6]([H:12])([H:13])[C:5]1([H:10])[H:11] 64 | R76 [C:1](=[C:2]([C:3](=[C:4](\[H:14])[H:15])\[H:16])/[H:7])(\[H:8])[H:9].[C:5](=[C:6](/[H:12])[H:13])(\[H:10])[H:11]>>[C:1]1([H:8])([H:9])[C@:2]2([H:7])[C@@:3]([H:16])([C:4]2([H:14])[H:15])[C:6]([H:12])([H:13])[C:5]1([H:10])[H:11] 65 | R77 [C:1](=[C:2]([C:3](=[C:4](\[H:14])[H:15])\[H:16])/[H:7])(\[H:8])[H:9].[C:5](=[C:6](/[H:12])[H:13])(\[H:10])[H:11]>>[C:1](=[C:2]([C:3](=[C:4](/[C:5]([C:6]([H:12])([H:13])[H:15])([H:10])[H:11])[H:14])\[H:16])/[H:7])(\[H:8])[H:9] 66 | R78 [C:1](=[C:2]([C:3](=[C:4](\[H:14])[H:15])\[H:16])/[H:7])(\[H:8])[H:9].[C:5](=[C:6](/[H:12])[H:13])(\[H:10])[H:11]>>[C:1](/[C:2](=[C:3](\[C:4](/[C:5](=[C:6](\[H:12])[H:13])[H:10])([H:14])[H:15])[H:16])[H:7])([H:8])([H:9])[H:11] 67 | R79 [C:1](=[C:2]([C:3](=[C:4](\[H:14])[H:15])\[H:16])/[H:7])(\[H:8])[H:9].[C:5](=[C:6](/[H:12])[H:13])(\[H:10])[H:11]>>[C:1](=[C:2](\[C@@:3]([C:4]([H:13])([H:14])[H:15])(/[C:6](=[C:5](/[H:10])[H:11])[H:12])[H:16])[H:7])(\[H:8])[H:9] 68 | R80 [C:1](=[C:2]([C:3](=[C:4](\[H:14])[H:15])\[H:16])/[H:7])(\[H:8])[H:9].[C:5](=[C:6](/[H:12])[H:13])(\[H:10])[H:11]>>[C:1]1([H:8])([H:9])[C@:2](/[C:3](=[C:4](/[H:14])[H:15])[H:16])([H:7])[C@@:6]1([C:5]([H:10])([H:11])[H:12])[H:13] 69 | R81 [C:1](=[C:2]([C:3](=[C:4](\[H:14])[H:15])\[H:16])/[H:7])(\[H:8])[H:9].[C:5](=[C:6](/[H:12])[H:13])(\[H:10])[H:11]>>[C:1](=[C:2](\[C@@:3]1([H:16])[C:4]([H:14])([H:15])[C@@:5]1([C:6]([H:11])([H:12])[H:13])[H:10])[H:7])(\[H:8])[H:9] 70 | R82 [C:1](=[C:2]([C:3](=[C:4](\[H:14])[H:15])\[H:16])/[H:7])(\[H:8])[H:9].[C:5](=[C:6](/[H:12])[H:13])(\[H:10])[H:11]>>[C:1]1([H:8])([H:9])[C:2]([H:7])([H:10])[C@@:3]1([C:4](/[C:5](=[C:6](/[H:12])[H:13])[H:11])([H:14])[H:15])[H:16] 71 | R83 [C:1](=[C:2]([C:3](=[C:4](\[H:14])[H:15])\[H:16])/[H:7])(\[H:8])[H:9].[C:5](=[C:6](/[H:12])[H:13])(\[H:10])[H:11]>>[C:1](=[C:2]=[C:3]([C:4]([C:5]([C:6]([H:7])([H:12])[H:13])([H:10])[H:11])([H:14])[H:15])[H:16])([H:8])[H:9] 72 | R84 [C:1](=[C:2]([C:3](=[C:4](\[H:14])[H:15])\[H:16])/[H:7])(\[H:8])[H:9].[C:5](=[C:6](/[H:12])[H:13])(\[H:10])[H:11]>>[C:1](=[C:2](/[H:7])[H:12])(\[H:8])[H:9].[C:3](=[C:4](/[H:14])[H:15])(\[C:6](=[C:5](\[H:10])[H:11])[H:13])[H:16] 73 | R85 [C:1](=[C:2]([C:3](=[C:4](\[H:14])[H:15])\[H:16])/[H:7])(\[H:8])[H:9].[C:5](=[C:6](/[H:12])[H:13])(\[H:10])[H:11]>>[C:1]([C:2](=[C:3]=[C:4]([H:14])[H:15])[H:7])([H:8])([H:9])[H:12].[C:5](=[C:6](\[H:13])[H:16])(\[H:10])[H:11] 74 | R86 [C:1](=[C:2]([C:3](=[C:4](\[H:14])[H:15])\[H:16])/[H:7])(\[H:8])[H:9]>>[C:1]1([H:8])([H:9])[C:2]([H:7])=[C:3]([H:16])[C:4]1([H:14])[H:15] 75 | R87 [C:1](=[C:2]([C:3](=[C:4](\[H:14])[H:15])\[H:16])/[H:7])(\[H:8])[H:9].[C:5](=[C:6](/[H:12])[H:13])(\[H:10])[H:11]>>[C:1](=[C:2]=[C:3]([C:4]([C:5]([C:6]([H:7])([H:12])[H:13])([H:10])[H:11])([H:14])[H:15])[H:16])([H:8])[H:9] 76 | R88 [C:1]([P:2]([C:3]([H:11])([H:12])[H:13])[C:4]([H:8])([H:9])[H:10])([H:5])([H:6])[H:7].[H:14][C:15]1([H:17])[C:16]([H:18])([H:19])[O:20]1>>[C:1]([P:2]1([C:3]([H:11])([H:12])[H:13])([C:4]([H:8])([H:9])[H:10])[C:16]([H:18])([H:19])[C:15]([H:14])([H:17])[O:20]1)([H:5])([H:6])[H:7] 77 | R89 [C:1](/[C:2](=[C:3](/[C:4]([O:5][H:17])([H:15])[H:16])[H:14])[H:13])([H:10])([H:11])[H:12].[Cl:6][S:7](=[O:8])[Cl:9]>>[C:1](/[C:2](=[C:3](/[C:4]([O:5][H:17])([H:15])[H:16])[H:14])[O:8][H:13])([H:10])([H:11])[H:12].[Cl:6][S:7][Cl:9] 78 | R91 [C:1](/[C:2](=[C:3](/[C:4]([O:5][H:17])([H:15])[H:16])[H:14])[H:13])([H:10])([H:11])[H:12].[Cl:6][S:7](=[O:8])[Cl:9]>>[C:1](/[C:2](=[C:3](/[C:4]([O:5][S:7](=[O:8])[Cl:9])([H:15])[H:16])[H:14])[H:13])([H:10])([H:11])[H:12].[Cl:6][H:17] 79 | R92 [C:1](/[C:2](=[C:3](/[C:4]([O:5][H:17])([H:15])[H:16])[H:14])[H:13])([H:10])([H:11])[H:12].[Cl:6][S:7](=[O:8])[Cl:9]>>[C:1]([C@@:2]1([H:13])[C@@:3]([C:4]([O:5][H:17])([H:15])[H:16])([H:14])[O:8]1)([H:10])([H:11])[H:12].[Cl:6][S:7][Cl:9] 80 | R93 [C:1](/[C:2](=[C:3](/[C:4]([O:5][H:17])([H:15])[H:16])[H:14])[H:13])([H:10])([H:11])[H:12].[Cl:6][S:7](=[O:8])[Cl:9]>>[C:1]([C@@:2]1([H:13])[C@@:3]([C:4]([O:5][H:17])([H:15])[H:16])([H:14])[O:8]1)([H:10])([H:11])[H:12].[Cl:6][S:7][Cl:9] 81 | R97 [c:1]1([O:7][C:8](/[C:9](=[C:10](/[H:18])[H:19])[H:17])([H:16])[H:20])[c:2]([H:11])[c:3]([H:12])[c:4]([H:13])[c:5]([H:14])[c:6]1[H:15]>>[c:1]1([C:10]([C@:9]2([H:17])[O:7][C:8]2([H:16])[H:20])([H:18])[H:19])[c:2]([H:11])[c:3]([H:12])[c:4]([H:13])[c:5]([H:14])[c:6]1[H:15] 82 | R98 [c:1]1([O:7][C:8](/[C:9](=[C:10](/[H:18])[H:19])[H:17])([H:16])[H:20])[c:2]([H:11])[c:3]([H:12])[c:4]([H:13])[c:5]([H:14])[c:6]1[H:15]>>[c:1]1([O:7][C@:9]2([H:17])[C:8]([H:16])([H:20])[C:10]2([H:18])[H:19])[c:2]([H:11])[c:3]([H:12])[c:4]([H:13])[c:5]([H:14])[c:6]1[H:15] 83 | R99 [C:1]([C:2]([O:6][O:7][H:8])=[O:9])([H:3])([H:4])[H:5]>>[C:1]([C:2](=[O:6])[O:9][O:7][H:8])([H:3])([H:4])[H:5] 84 | R100 [C:10](=[C:11](\[C:12]([H:14])([H:15])[H:16])[H:13])(\[C:17]([H:19])([H:20])[H:21])[H:18].[C:1]([C:2]([O:6][O:7][H:8])=[O:9])([H:3])([H:4])[H:5]>>[C:1]([C@:2]([O:6][O:7][H:8])([O:9][H:18])/[C:10](=[C:11](/[C:12]([H:14])([H:15])[H:16])[H:13])[C:17]([H:19])([H:20])[H:21])([H:3])([H:4])[H:5] 85 | R101 [C:10](=[C:11](\[C:12]([H:14])([H:15])[H:16])[H:13])(\[C:17]([H:19])([H:20])[H:21])[H:18].[C:1]([C:2]([O:6][O:7][H:8])=[O:9])([H:3])([H:4])[H:5]>>[C:1]([C@@:2]([O:6][O:7][H:8])([O:9]/[C:11](=[C:10](/[C:17]([H:19])([H:20])[H:21])[H:18])[C:12]([H:14])([H:15])[H:16])[H:13])([H:3])([H:4])[H:5] 86 | R102 [C:10](=[C:11](\[C:12]([H:14])([H:15])[H:16])[H:13])(\[C:17]([H:19])([H:20])[H:21])[H:18].[C:1]([C:2]([O:6][O:7][H:8])=[O:9])([H:3])([H:4])[H:5]>>[C:1]([C:2](=[O:6])[O:9][H:8])([H:3])([H:4])[H:5].[O:7]1[C@@:10]([C:17]([H:19])([H:20])[H:21])([H:18])[C@@:11]1([C:12]([H:14])([H:15])[H:16])[H:13] 87 | -------------------------------------------------------------------------------- /data/test_aldol.txt: -------------------------------------------------------------------------------- 1 | R1 [H:1][C:2]([H:3])=[O:4].[H:5][O:6][H:7].[H:8][C:9]([H:10])=[C:11]([H:12])[O:13][H:14]>>[H:1][C:2]([H:3])([O:4][H:5])[C:9]([H:8])([H:10])[C:11]([H:12])=[O:13].[O:6]([H:7])[H:14] 2 | R2 [H:1][C:2]([H:3])=[O:4].[H:5][O:6][H:7].[H:8][C:9]([H:10])=[C:11]([H:12])[O:13][H:14]>>[H:1][C:2]([H:3])([O:4][H:14])[O:6][H:7].[H:5][O:13][C:11](=[C:9]([H:8])[H:10])[H:12] 3 | R3 [H:1][C:2]([H:3])=[O:4].[H:5][O:6][H:7].[H:8][C:9]([H:10])=[C:11]([H:12])[O:13][H:14]>>[H:1][C:2]([H:3])([O:4][H:5])[O:13][C:11](=[C:9]([H:8])[H:10])[H:12].[O:6]([H:7])[H:14] 4 | R4 [H:1][C:2]([H:3])=[O:4].[H:5][O:6][H:7].[H:8][C:9]([H:10])=[C:11]([H:12])[O:13][H:14]>>[H:1][C:2]([H:3])([O:4][H:14])[O:6][H:7].[H:5][C:9]([H:8])([H:10])[C:11]([H:12])=[O:13] -------------------------------------------------------------------------------- /data/test_co.txt: -------------------------------------------------------------------------------- 1 | R1 [H:1][C:2]1([H:3])[C:4]([H:5])([H:6])[Co:7]1([H:8])([C:9]=[O:10])([C:11]=[O:12])[C:13]=[O:14]>>[H:1][C:2]([H:3])([C:4]([H:5])([H:6])[Co:7]([C:9]=[O:10])([C:11]=[O:12])[C:13]=[O:14])[H:8] 2 | R2 [H:1][C:2]([H:3])([C:4]([H:5])([H:6])[Co:7]([C:15]=[O:16])([C:9]=[O:10])([C:11]=[O:12])[C:13]=[O:14])[H:8]>>[H:1][C:2]([H:3])([C:4]([H:5])([H:6])[C:15]([Co:7]([C:9]=[O:10])([C:11]=[O:12])[C:13]=[O:14])=[O:16])[H:8] 3 | R3 [H:1][C:2]([H:3])([C:4]([H:5])([H:6])[C:15]([Co:7]([C:9]=[O:10])([C:11]=[O:12])[C:13]=[O:14])=[O:16])[H:8].[H:17][H:18]>>[H:1][C:2]([H:3])([C:4]([H:5])([H:6])[C:15]([Co:7]([H:17])([H:18])([C:9]=[O:10])([C:11]=[O:12])[C:13]=[O:14])=[O:16])[H:8] 4 | R4 [H:1][C:2]([H:3])([C:4]([H:5])([H:6])[C:15]([Co:7]([H:17])([H:18])([C:9]=[O:10])([C:11]=[O:12])[C:13]=[O:14])=[O:16])[H:8]>>[Co:7]([C:9]=[O:10])([C:11]=[O:12])([C:13]=[O:14])[H:18].[H:1][C:2]([H:3])([C:4]([H:5])([H:6])[C:15](=[O:16])[H:17])[H:8] 5 | -------------------------------------------------------------------------------- /data/test_eas_apolar.txt: -------------------------------------------------------------------------------- 1 | R1 [Cl:1][C@:6]1([H:5])[C@:7]([Cl:4])([H:8])[C:9]([H:10])=[C:11]([C:12]([H:13])([H:14])[H:15])[C:16]([H:17])=[C:18]1[H:19].[Cl:2][H:3]>>[Cl:1][Cl:2].[H:3][Cl:4].[H:5][c:6]1[c:7]([H:8])[c:9]([H:10])[c:11]([C:12]([H:13])([H:14])[H:15])[c:16]([H:17])[c:18]1[H:19] 2 | R2 [Cl:1][C@@:6]1([H:5])[C@:7]([Cl:4])([H:8])[C:9]([H:10])=[C:11]([C:12]([H:13])([H:14])[H:15])[C:16]([H:17])=[C:18]1[H:19].[Cl:2][H:3]>>[Cl:1][Cl:2].[H:3][Cl:4].[H:5][c:6]1[c:7]([H:8])[c:9]([H:10])[c:11]([C:12]([H:13])([H:14])[H:15])[c:16]([H:17])[c:18]1[H:19] 3 | R3 [Cl:1][Cl:2].[H:3][Cl:4].[H:5][c:6]1[c:7]([H:8])[c:9]([H:10])[c:11]([C:12]([H:13])([H:14])[H:15])[c:16]([H:17])[c:18]1[H:19]>>[Cl:1][c:6]1[c:7]([H:8])[c:9]([H:10])[c:11]([C:12]([H:13])([H:14])[H:15])[c:16]([H:17])[c:18]1[H:19].[Cl:2][H:3].[Cl:4][H:5] 4 | R4 [Cl:1][Cl:2].[H:3][Cl:4].[H:5][c:6]1[c:7]([H:8])[c:9]([H:10])[c:11]([C:12]([H:13])([H:14])[H:15])[c:16]([H:17])[c:18]1[H:19]>>[Cl:1][c:7]1[c:6]([H:5])[c:18]([H:19])[c:16]([H:17])[c:11]([C:12]([H:13])([H:14])[H:15])[c:9]1[H:10].[Cl:2][H:3].[Cl:4][H:8] 5 | R5 [Cl:1][Cl:2].[H:3][Cl:4].[H:5][c:6]1[c:7]([H:8])[c:9]([H:10])[c:11]([C:12]([H:13])([H:14])[H:15])[c:16]([H:17])[c:18]1[H:19]>>[Cl:1][c:9]1[c:7]([H:8])[c:6]([H:5])[c:18]([H:19])[c:16]([H:17])[c:11]1[C:12]([H:13])([H:14])[H:15].[Cl:2][H:3].[Cl:4][H:10] 6 | R6 [Cl:1][C@:6]1([H:5])[C@:7]([Cl:4])([H:8])[C:9]([H:10])=[C:11]([C:12]([H:13])([H:14])[H:15])[C:16]([H:17])=[C:18]1[H:19].[Cl:2][H:3]>>[Cl:4][H:3].[Cl:2][H:5].[H:8][C:7]1=[C:6]([Cl:1])[C:18]([H:19])=[C:16]([H:17])[C:11]([C:12]([H:13])([H:14])[H:15])=[C:9]1[H:10] 7 | R7 [Cl:1][C@:6]1([H:5])[C@@:7]([Cl:4])([H:8])[C:9]([H:10])=[C:11]([C:12]([H:13])([H:14])[H:15])[C:16]([H:17])=[C:18]1[H:19].[Cl:2][H:3]>>[Cl:4][H:3].[Cl:2][H:5].[H:8][C:7]1=[C:6]([Cl:1])[C:18]([H:19])=[C:16]([H:17])[C:11]([C:12]([H:13])([H:14])[H:15])=[C:9]1[H:10] -------------------------------------------------------------------------------- /data/test_eas_polar.txt: -------------------------------------------------------------------------------- 1 | R1 [Cl:1][Cl:2].[H:3][c:4]1[c:5]([H:6])[c:7]([H:8])[c:9]([C:10]([H:11])([H:12])[H:13])[c:14]([H:15])[c:16]1[H:17]>>[Cl:1][C:4]1([H:3])[C:5]([H:6])=[C:7]([H:8])[C:9]([C:10]([H:11])([H:12])[H:13])=[C:14]([H:15])[C+:16]1[H:17].[Cl-:2] 2 | R2 [Cl:1][Cl:2].[H:3][c:4]1[c:5]([H:6])[c:7]([H:8])[c:9]([H:10])[c:14]([H:15])[c:16]1[H:17]>>[Cl:1][C:4]1([H:3])[C:5]([H:6])=[C:7]([H:8])[C:9]([H:10])=[C:14]([H:15])[C+:16]1[H:17].[Cl-:2] -------------------------------------------------------------------------------- /data/test_passerini.txt: -------------------------------------------------------------------------------- 1 | R1 [H:11][C:12]([H:13])([H:14])[N+:15]#[C-:16].[H:17][O:18][C:19]([H:20])=[O:21].[H:1][C:2]([H:3])([H:4])[C:5](=[O:6])[C:7]([H:8])([H:9])[H:10]>>[H:1][C:2]([H:3])([H:4])[C:5]([O:6][H:17])([C:7]([H:8])([H:9])[H:10])[C:16](=[N:15][C:12]([H:11])([H:13])[H:14])[O:21][C:19](=[O:18])[H:20] 2 | R2 [H:1][C:2]([H:3])([H:4])[C:5]([O:6][H:7])([C:8]([H:9])([H:10])[H:11])[C:12](=[N:13][C:14]([H:15])([H:16])[H:17])[O:18][C:19](=[O:20])[H:21].[H:22][O:23][C:24]([H:25])=[O:26]>>[H:1][C:2]([H:3])([H:4])[C:5]1([C:8]([H:9])([H:10])[H:11])[O:6][C:19]([O:20][H:22])([H:21])[O:18][C:12]1=[N:13][C:14]([H:15])([H:16])[H:17].[H:7][O:26][C:24](=[O:23])[H:25] 3 | R3 [H:1][C:2]([H:3])([H:4])[C:5]1([C:8]([H:9])([H:10])[H:11])[O:6][C:19]([O:20][H:22])([H:21])[O:18][C:12]1=[N:13][C:14]([H:15])([H:16])[H:17].[H:7][O:26][C:24](=[O:23])[H:25]>>[H:1][C:2]([H:3])([H:4])[C:5]([O:6][C:19](=[O:20])[H:21])([C:8]([H:9])([H:10])[H:11])[C:12]([N:13]([H:7])[C:14]([H:15])([H:16])[H:17])=[O:18].[H:22][O:23][C:24]([H:25])=[O:26] -------------------------------------------------------------------------------- /data/test_pd.txt: -------------------------------------------------------------------------------- 1 | R1 [H:1][P:2]([H:3])([H:4])[Pd:5][P:6]([H:7])([H:8])[H:9].[H:10][C:11]([H:12])([H:13])[Cl:14]>>[H:1][P:2]([H:3])([H:4])[Pd:5]([P:6]([H:7])([H:8])[H:9])([C:11]([H:12])([H:13])[H:10])[Cl:14] 2 | R2 [H:1][P:2]([H:3])([H:4])[Pd:5]([P:6]([H:7])([H:8])[H:9])([C:11]([H:12])([H:13])[H:10])[Cl:14].[H:15][C:16]([H:17])([H:18])[Zn:19][Cl:20]>>[H:1][P:2]([H:3])([H:4])[Pd:5]([P:6]([H:7])([H:8])[H:9])([C:11]([H:12])([H:13])[H:10])[C:16]([H:15])([H:17])[H:18].[Cl:14][Zn:19][Cl:20] 3 | R3 [H:1][P:2]([H:3])([H:4])[Pd:5]([P:6]([H:7])([H:8])[H:9])([C:11]([H:12])([H:13])[H:10])[C:16]([H:15])([H:17])[H:18]>>[H:1][P:2]([H:3])([H:4])[Pd:5]([P:6]([H:7])([H:8])[H:9]).[H:10][C:11]([H:12])([H:13])[C:16]([H:15])([H:17])[H:18] -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | name: ts-tools 2 | channels: 3 | - conda-forge 4 | dependencies: 5 | - python=3.10 6 | - ipykernel=6.9 7 | - pandas=1.4 8 | - pebble=4.6 9 | - xtb=6.3.2 10 | - tqdm=4.64 11 | - pip=22.1 12 | - rdkit=2022.03 13 | - xyz2mol=0.1 14 | - autode=1.4 15 | - pip: 16 | - fortranformat 17 | -------------------------------------------------------------------------------- /run_scripts/run_conformational_search.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | import argparse 4 | import subprocess 5 | import numpy as np 6 | from tstools.utils import write_final_geometry_to_xyz, extract_geom_from_xyz, extract_geom_from_crest_ensemble, create_input_file_opt_g16, extract_g16_energy 7 | 8 | 9 | def get_args(): 10 | """ 11 | Parse command line arguments. 12 | 13 | Returns: 14 | -argparse.Namespace: Parsed command line arguments. 15 | 16 | """ 17 | parser = argparse.ArgumentParser() 18 | parser.add_argument('--file', type=str, help='File to extract geometry') 19 | parser.add_argument('--opt-DFT', default=False, action="store_true", help='Subsequently optimization of the 10 conformers with the lowest energy, obtained from CREST to determine the most stable conformer') 20 | parser.add_argument('--atomlist', default=None, nargs="+", help='Constrained atoms') 21 | parser.add_argument('--charge', default=0, type=int, help='Charge of the molecular system') 22 | parser.add_argument('--uhf', default=0, type=int, help='Number of unpaired electrons of the molecular system') 23 | parser.add_argument('--mem', action='store', type=str, default='16GB', help='Specifies the memory requested in the Gaussian16 .com files') 24 | parser.add_argument('--proc', action='store', type=int, default=8, help='Number of CPU that will be used') 25 | parser.add_argument('--functional', action='store', type=str, default='UB3LYP', help='Functional') 26 | parser.add_argument('--basis-set', action='store', type=str, default='6-31G', help='Basis set') 27 | parser.add_argument('--solvent', action='store', type=str, default=None, help='Solvent') 28 | 29 | return parser.parse_args() 30 | 31 | 32 | def run_crest(directory, name, geom, charge, uhf, atomlist, proc, solvent): 33 | """ 34 | Run a conformational search using CREST. 35 | 36 | Parameters: 37 | -directory (str): Path to the directory for the calculation. 38 | -name (str): Name of the output file. 39 | -geom (list): List with the coordinates of the system. 40 | -charge (int): Charge of the molecular system. 41 | -uhf (int): Number of unpaired electrons of the molecular system. 42 | -atomlist (list): Constrained atoms 43 | -proc (int): Number of CPU that will be used 44 | -solvent (str): Solvent 45 | 46 | Returns: 47 | None 48 | """ 49 | 50 | pwd = os.getcwd() 51 | os.chdir(directory) 52 | 53 | if solvent: 54 | kwd_solvent = f"--alpb {solvent}" 55 | else: 56 | kwd_solvent = " " 57 | 58 | if atomlist: 59 | print_constraints_inp(geom, atomlist) 60 | command_line = f"crest {name}.xyz --gfn2 -T {proc} --noreftopo --cinp constraints.inp {kwd_solvent} --chrg {charge} --uhf {uhf} > {name}.out" 61 | else: 62 | command_line = f"crest {name}.xyz --gfn2 -T {proc} --noreftopo {kwd_solvent} --chrg {charge} --uhf {uhf} > {name}.out" 63 | 64 | with open('crest.out', 'w') as out: 65 | subprocess.run(command_line, shell=True, stdout=out, stderr=subprocess.DEVNULL,) 66 | os.chdir(pwd) 67 | 68 | 69 | def print_constraints_inp(geom, atomlist): 70 | """ 71 | Print the constraint file for CREST calculation. 72 | 73 | Parameters: 74 | -geom (list): List with the coordinates of the system. 75 | -atomlist (list): Constrained atoms 76 | 77 | Returns: 78 | None 79 | """ 80 | constraints = [] 81 | 82 | for i in range(0, len(atomlist), 2): 83 | idx_atm_1 = int(atomlist[i]) 84 | idx_atm_2 = int(atomlist[i + 1]) 85 | _, x1, y1, z1 = geom[idx_atm_1 - 1].split() 86 | _, x2, y2, z2 = geom[idx_atm_2 - 1].split() 87 | coord_atm_1 = np.array([x1, y1, z1], dtype=float) 88 | coord_atm_2 = np.array([x2, y2, z2], dtype=float) 89 | distance = np.linalg.norm(coord_atm_1 - coord_atm_2).round(3) 90 | constraints.append((idx_atm_1, idx_atm_2, distance)) 91 | 92 | with open('constraints.inp', 'w') as file: 93 | file.write("$constrain\n") 94 | file.write(" force constant=0.5\n") 95 | for constraint in constraints: 96 | file.write(f" distance: {constraint[0]}, {constraint[1]}, {constraint[2]}\n") 97 | file.write("$end") 98 | 99 | 100 | def run_g16_opt(directory, name, charge, uhf, atomlist, mem, proc, functional, basis_set, solvent): 101 | """ 102 | Run a conformational search using CREST. 103 | 104 | Parameters: 105 | -directory (str): Path to the directory for the calculation. 106 | -name (str): Name of the output file. 107 | -charge (int): Charge of the molecular system. 108 | -uhf (int): Number of unpaired electrons of the molecular system. 109 | -atomlist (list): Constrained atoms 110 | -mem (str): Specifies the memory requested in the Gaussian16 .com files 111 | -proc (int): Number of CPU that will be used 112 | -functional (str): functional 113 | -basis_set (str): basis_set 114 | -solvent (str): solvent 115 | 116 | Returns: 117 | None 118 | """ 119 | 120 | os.chdir(new_dir) 121 | if atomlist: 122 | modredundant = formatting_constraints(atomlist) 123 | else: 124 | modredundant = None 125 | geoms = extract_geom_from_crest_ensemble('crest_conformers.xyz', 20) 126 | os.mkdir(f'{name}_opt_DFT') 127 | os.chdir(f'{name}_opt_DFT') 128 | multiplicity = int(2 * (uhf * 1/2) + 1) 129 | energies = [] 130 | 131 | for idx, geom in enumerate(geoms): 132 | 133 | if not geom: 134 | break 135 | tmp_name = f"{name}_conf_{idx}" 136 | command_line = f"g16 < {tmp_name}.com", 137 | create_input_file_opt_g16(name=tmp_name, geom=geom, charge=charge, multiplicity=multiplicity, mem=mem, proc=proc, modredundant=modredundant, functional=functional, basis_set=basis_set, solvent=solvent) 138 | with open(f'{tmp_name}.out' , 'w') as out: 139 | subprocess.run(command_line, shell=True, stdout=out, stderr=subprocess.DEVNULL,) 140 | 141 | energy = extract_g16_energy(f'{tmp_name}.out') 142 | 143 | if energy: 144 | energies.append((idx, energy)) 145 | 146 | if energies: 147 | sorted_energies = sorted(energies, key=lambda x: x[1]) 148 | os.mkdir('lowest') 149 | shutil.copy(f'{name}_conf_{sorted_energies[0][0]}.out', 'lowest') 150 | 151 | 152 | def formatting_constraints(atomlist): 153 | 154 | constraints = [] 155 | for i in range(0, len(atomlist), 2): 156 | idx_atm_1 = int(atomlist[i]) 157 | idx_atm_2 = int(atomlist[i + 1]) 158 | constraints.append(f"B {idx_atm_1} {idx_atm_2} F") 159 | 160 | return constraints 161 | 162 | 163 | if __name__ == '__main__': 164 | args = get_args() 165 | filename = args.file 166 | geom = extract_geom_from_xyz(filename) 167 | directory, name = os.path.split(filename) 168 | name = name.split('.')[0] 169 | new_dir = os.path.join(directory, f'{name}_crest') 170 | os.mkdir(new_dir) 171 | shutil.copy(filename, new_dir) 172 | run_crest(new_dir, name, geom, args.charge, args.uhf, args.atomlist, args.proc, args.solvent) 173 | 174 | if args.opt_DFT: 175 | run_g16_opt(new_dir, name, args.charge, args.uhf,args.atomlist, args.mem, args.proc, args.functional, args.basis_set, args.solvent) 176 | 177 | 178 | 179 | -------------------------------------------------------------------------------- /run_scripts/run_dft_validation.py: -------------------------------------------------------------------------------- 1 | import time 2 | import os 3 | import multiprocessing 4 | import concurrent.futures 5 | import argparse 6 | import shutil 7 | 8 | from tstools.ts_optimizer import TSOptimizer 9 | from tstools.utils import setup_dir, get_reaction_list, print_statistics 10 | 11 | 12 | def get_args(): 13 | """ 14 | Parse command line arguments. 15 | 16 | Returns: 17 | - argparse.Namespace: Parsed command line arguments. 18 | """ 19 | parser = argparse.ArgumentParser() 20 | parser.add_argument('--solvent', action='store', type=str, default=None) 21 | parser.add_argument('--input-file', action='store', type=str, default='data/reactions_am.txt') 22 | parser.add_argument('--input-dir', action='store', type=str, default='final_work_dir') 23 | parser.add_argument('--output-dir', action='store', type=str, default='validation_dir') 24 | parser.add_argument('--mem', action='store', type=str, default='16GB') 25 | parser.add_argument('--proc', action='store', type=int, default=8) 26 | parser.add_argument('--functional', action='store', type=str, default='UB3LYP') 27 | parser.add_argument('--basis-set', action='store', type=str, default='6-31G**') 28 | 29 | return parser.parse_args() 30 | 31 | 32 | def validate_individual_ts(validation_args): 33 | """ 34 | Validate a transition state using the given validation arguments. 35 | 36 | Parameters: 37 | - validation_args (tuple): A tuple containing the transition state optimizer 38 | and the input directory path. 39 | 40 | Returns: 41 | - str: The reaction ID if the transition state is validated, False otherwise. 42 | """ 43 | ts_validated = False 44 | ts_guess_file = None 45 | ts_optimizer, input_dir_path = validation_args 46 | guess_dir_path = os.path.join(input_dir_path, f'final_outputs_reaction_{ts_optimizer.rxn_id}') 47 | ts_optimizer.path_dir = guess_dir_path 48 | ts_optimizer.final_guess_dir = ts_optimizer.reaction_dir 49 | 50 | try: 51 | for file in os.listdir(guess_dir_path): 52 | if 'ts_guess' in file and file.endswith('.xyz'): 53 | ts_guess_file = os.path.join(guess_dir_path, file) 54 | elif file == 'reactants_geometry.xyz': 55 | shutil.copy(os.path.join(guess_dir_path, file), ts_optimizer.rp_geometries_dir) 56 | elif file == 'products_geometry.xyz': 57 | shutil.copy(os.path.join(guess_dir_path, file), ts_optimizer.rp_geometries_dir) 58 | except Exception as e: 59 | print(e) 60 | 61 | if ts_guess_file is not None: 62 | ts_optimizer.modify_ts_guess_list([ts_guess_file]) 63 | try: 64 | ts_validated = ts_optimizer.determine_ts(xtb=False, method=args.functional, basis_set=args.basis_set) 65 | except Exception as e: 66 | print(e) 67 | pass 68 | 69 | if ts_validated: 70 | return ts_optimizer.rxn_id 71 | 72 | return None 73 | 74 | 75 | def validate_ts_guesses(input_dir, output_dir, reaction_list, solvent, mem='16GB', proc=8): 76 | """ 77 | Validate transition state guesses for a list of reactions. 78 | 79 | Parameters: 80 | - input_dir (str): Input directory. 81 | - output_dir (str): Output directory. 82 | - reaction_list (list): List of tuples containing reaction indices and SMILES strings. 83 | - solvent (str): Solvent information. 84 | - mem (str, optional): Amount of memory to allocate for the calculations (default is '16GB'). 85 | - proc (int, optional): Number of processor cores to use for the calculations (default is 8). 86 | 87 | Returns: 88 | - list: List of validated reaction IDs. 89 | """ 90 | home_dir = os.getcwd() 91 | input_dir_path = os.path.join(os.getcwd(), input_dir) 92 | ts_optimizer_list = [] 93 | os.chdir(output_dir) 94 | 95 | for rxn_idx, rxn_smiles in reaction_list: 96 | ts_optimizer_list.append([ 97 | TSOptimizer(rxn_idx, rxn_smiles, None, xtb_solvent=None, dft_solvent=solvent, guess_found=True, mem=mem, proc=proc), 98 | input_dir_path 99 | ]) 100 | 101 | os.chdir(home_dir) 102 | 103 | print(f'{len(ts_optimizer_list)} reactions to process...') 104 | 105 | num_processes = multiprocessing.cpu_count() 106 | 107 | with concurrent.futures.ProcessPoolExecutor(max_workers=int(num_processes/proc)) as executor: 108 | # Map the function to each object in parallel 109 | results = list(executor.map(validate_individual_ts, ts_optimizer_list)) 110 | 111 | validated_reactions = [r for r in results if r is not None] 112 | 113 | os.chdir(home_dir) 114 | 115 | return validated_reactions 116 | 117 | 118 | if __name__ == "__main__": 119 | # preliminaries 120 | args = get_args() 121 | reaction_list = get_reaction_list(args.input_file) 122 | setup_dir(args.output_dir) 123 | start_time = time.time() 124 | 125 | validated_reactions = validate_ts_guesses(args.input_dir, args.output_dir, reaction_list, 126 | args.solvent, args.mem, args.proc) 127 | 128 | print_statistics(validated_reactions, start_time) 129 | -------------------------------------------------------------------------------- /run_scripts/run_ts_searcher.py: -------------------------------------------------------------------------------- 1 | import time 2 | import os 3 | import multiprocessing 4 | import concurrent.futures 5 | import argparse 6 | 7 | from tstools.ts_optimizer import TSOptimizer 8 | from tstools.utils import remove_files_in_directory, copy_final_outputs, \ 9 | setup_dir, get_reaction_list, print_statistics 10 | 11 | 12 | def get_args(): 13 | """ 14 | Parse command-line arguments. 15 | 16 | Returns: 17 | - argparse.Namespace: Parsed command-line arguments. 18 | """ 19 | parser = argparse.ArgumentParser() 20 | parser.add_argument('--reactive-complex-factors-intra', nargs='+', type=float, 21 | default=[0, 1.2, 1.3, 1.8]) 22 | parser.add_argument('--reactive-complex-factors-inter', nargs='+', type=float, 23 | default=[2.5, 1.8, 2.8, 1.3]) 24 | parser.add_argument('--freq-cut-off', action='store', type=int, default=150) 25 | parser.add_argument('--solvent', action='store', type=str, default=None) 26 | parser.add_argument('--xtb-external-path', action='store', type=str, 27 | default="xtb_external_script/xtb_external.py") 28 | parser.add_argument('--input-file', action='store', type=str, default='data/reactions_am.txt') 29 | parser.add_argument('--target-dir', action='store', type=str, default='work_dir') 30 | 31 | return parser.parse_args() 32 | 33 | 34 | def optimize_individual_ts(ts_optimizer): 35 | """ 36 | Optimize an individual transition state. 37 | 38 | Parameters: 39 | - ts_optimizer: Instance of TSOptimizer. 40 | 41 | Returns: 42 | - int or None: Reaction ID if a transition state is found, None otherwise. 43 | """ 44 | # First select the set of reactive_complex factor values to try 45 | start_time_process = time.time() 46 | 47 | try: 48 | if ts_optimizer.reaction_is_intramolecular(): 49 | reactive_complex_factor_values = ts_optimizer.reactive_complex_factor_values_intra 50 | else: 51 | reactive_complex_factor_values = ts_optimizer.reactive_complex_factor_values_inter 52 | except Exception as e: 53 | print(e) 54 | return None 55 | 56 | # Then search for TS by iterating through reactive complex factor values 57 | for reactive_complex_factor in reactive_complex_factor_values: 58 | for _ in range(3): 59 | try: 60 | ts_optimizer.set_ts_guess_list(reactive_complex_factor) 61 | ts_found = ts_optimizer.determine_ts() 62 | remove_files_in_directory(os.getcwd()) 63 | if ts_found: 64 | end_time_process = time.time() 65 | print(f'Final TS guess found for {ts_optimizer.rxn_id} for reactive complex factor {reactive_complex_factor} in {end_time_process - start_time_process} sec...') 66 | return ts_optimizer.rxn_id 67 | except Exception as e: 68 | print(e) 69 | continue 70 | 71 | end_time_process = time.time() 72 | print(f'No TS guess found for {ts_optimizer.rxn_id}; process lasted for {end_time_process - start_time_process} sec...') 73 | 74 | return None 75 | 76 | 77 | def obtain_transition_states(target_dir, reaction_list, xtb_external_path, solvent, 78 | reactive_complex_factor_list_intermolecular, 79 | reactive_complex_factor_list_intramolecular, freq_cut_off): 80 | """ 81 | Obtain transition states for a list of reactions. 82 | 83 | Parameters: 84 | - target_dir (str): Target directory. 85 | - reaction_list (list): List of reactions. 86 | - xtb_external_path (str): Path to the XTB external script. 87 | - solvent (str): Solvent information. 88 | - reactive_complex_factor_list_intermolecular (list): List of reactive complex factors for intermolecular reactions. 89 | - reactive_complex_factor_list_intramolecular (list): List of reactive complex factors for intramolecular reactions. 90 | - freq_cut_off (int): Frequency cutoff. 91 | 92 | Returns: 93 | - list: List of successful reactions. 94 | """ 95 | home_dir = os.getcwd() 96 | os.chdir(target_dir) 97 | ts_optimizer_list = [] 98 | 99 | for rxn_idx, rxn_smiles in reaction_list: 100 | ts_optimizer_list.append(TSOptimizer(rxn_idx, rxn_smiles, xtb_external_path, 101 | solvent, None, reactive_complex_factor_list_intermolecular, 102 | reactive_complex_factor_list_intramolecular, freq_cut_off)) 103 | 104 | print(f'{len(ts_optimizer_list)} reactions to process...') 105 | 106 | num_processes = multiprocessing.cpu_count() 107 | 108 | with concurrent.futures.ProcessPoolExecutor(max_workers=int(num_processes/2)) as executor: 109 | # Map the function to each object in parallel 110 | results = list(executor.map(optimize_individual_ts, ts_optimizer_list)) 111 | 112 | successful_reactions = [r for r in results if r is not None] 113 | 114 | os.chdir(home_dir) 115 | copy_final_outputs(target_dir, f'final_{target_dir}') 116 | 117 | return successful_reactions 118 | 119 | 120 | if __name__ == "__main__": 121 | # preliminaries 122 | args = get_args() 123 | setup_dir(args.target_dir) 124 | reaction_list = get_reaction_list(args.input_file) 125 | start_time = time.time() 126 | xtb_external_path = f'{os.path.join(os.getcwd(), args.xtb_external_path)}' 127 | 128 | # run all reactions in parallel 129 | successful_reactions = obtain_transition_states(args.target_dir, reaction_list, 130 | xtb_external_path, solvent=args.solvent, 131 | reactive_complex_factor_list_intramolecular=args.reactive_complex_factors_intra, 132 | reactive_complex_factor_list_intermolecular=args.reactive_complex_factors_inter, 133 | freq_cut_off=args.freq_cut_off) 134 | 135 | # print final statistics about the run 136 | print_statistics(successful_reactions, start_time) 137 | -------------------------------------------------------------------------------- /run_scripts/run_ts_searcher_dft.py: -------------------------------------------------------------------------------- 1 | import time 2 | import os 3 | import multiprocessing 4 | import concurrent.futures 5 | import argparse 6 | 7 | from tstools.ts_optimizer import TSOptimizer 8 | from tstools.utils import remove_files_in_directory, copy_final_outputs, \ 9 | setup_dir, get_reaction_list, print_statistics 10 | 11 | 12 | def get_args(): 13 | """ 14 | Parse command-line arguments. 15 | 16 | Returns: 17 | - argparse.Namespace: Parsed command-line arguments. 18 | """ 19 | parser = argparse.ArgumentParser() 20 | parser.add_argument('--reactive-complex_factors-intra', nargs='+', type=float, 21 | default=[0, 1.2, 1.3, 1.8]) 22 | parser.add_argument('--reactive-complex-factors-inter', nargs='+', type=float, 23 | default=[2.5, 1.8, 2.8, 1.3]) 24 | parser.add_argument('--freq-cut-off', action='store', type=int, default=150) 25 | parser.add_argument('--solvent', action='store', type=str, default=None) 26 | parser.add_argument('--xtb-solvent', action='store', type=str, default=None) 27 | parser.add_argument('--dft-solvent', action='store', type=str, default=None) 28 | parser.add_argument('--xtb-external-path', action='store', type=str, 29 | default="xtb_external_script/xtb_external.py") 30 | parser.add_argument('--input-file', action='store', type=str, default='reactions_am.txt') 31 | parser.add_argument('--target-dir', action='store', type=str, default='work_dir_dft') 32 | parser.add_argument('--mem', action='store', type=str, default='16GB') 33 | parser.add_argument('--proc', action='store', type=int, default=8) 34 | parser.add_argument('--functional', action='store', type=str, default='UB3LYP') 35 | parser.add_argument('--basis-set', action='store', type=str, default='6-31G**') 36 | parser.add_argument('--max-cycles', action='store', type=int, default=30) 37 | 38 | args = parser.parse_args() 39 | 40 | # If general solvent specified, and not separately for the xTB and DFT calculations, set the latter 41 | if args.solvent is not None and (args.xtb_solvent is None and args.dft_solvent is None): 42 | args.xtb_solvent = args.solvent 43 | args.dft_solvent = args.solvent 44 | 45 | return args 46 | 47 | 48 | def optimize_individual_ts(ts_optimizer): 49 | """ 50 | Optimize an individual transition state. 51 | 52 | Parameters: 53 | - ts_optimizer: Instance of TSOptimizer. 54 | 55 | Returns: 56 | - int or None: Reaction ID if a transition state is found, None otherwise. 57 | """ 58 | # First select the set of reactive_complex factor values to try 59 | start_time_process = time.time() 60 | 61 | try: 62 | if ts_optimizer.reaction_is_intramolecular(): 63 | reactive_complex_factor_values = ts_optimizer.reactive_complex_factor_values_intra 64 | else: 65 | reactive_complex_factor_values = ts_optimizer.reactive_complex_factor_values_inter 66 | except Exception as e: 67 | print(e) 68 | return None 69 | 70 | # Then search for TS by iterating through reactive complex factor values 71 | for reactive_complex_factor in reactive_complex_factor_values: 72 | for _ in range(3): 73 | try: 74 | ts_optimizer.set_ts_guess_list(reactive_complex_factor) 75 | ts_found = ts_optimizer.determine_ts(xtb=False, method=args.functional, basis_set=args.basis_set) 76 | remove_files_in_directory(os.getcwd()) 77 | if ts_found: 78 | end_time_process = time.time() 79 | print(f'Final TS guess found for {ts_optimizer.rxn_id} for reactive complex factor {reactive_complex_factor} in {end_time_process - start_time_process} sec...') 80 | return ts_optimizer.rxn_id 81 | except Exception as e: 82 | print(e) 83 | continue 84 | 85 | end_time_process = time.time() 86 | print(f'No TS guess found for {ts_optimizer.rxn_id}; process lasted for {end_time_process - start_time_process} sec...') 87 | 88 | return None 89 | 90 | def obtain_transition_states(target_dir, reaction_list, xtb_external_path, xtb_solvent, dft_solvent, 91 | reactive_complex_factor_list_intermolecular, 92 | reactive_complex_factor_list_intramolecular, freq_cut_off, 93 | mem='16GB', proc=8, max_cycles=30): 94 | """ 95 | Obtain transition states for a list of reactions. 96 | 97 | Parameters: 98 | - target_dir (str): Target directory. 99 | - reaction_list (list): List of reactions. 100 | - xtb_external_path (str): Path to the XTB external script. 101 | - xtb_solvent (str): Solvent information for xTB calculations. 102 | - dft_solvent (str): Solvent information for DFT calculations. 103 | - reactive_complex_factor_list_intermolecular (list): List of reactive complex factors for intermolecular reactions. 104 | - reactive_complex_factor_list_intramolecular (list): List of reactive complex factors for intramolecular reactions. 105 | - freq_cut_off (int): Frequency cutoff. 106 | - mem (str, optional): Amount of memory to allocate for the calculations (default is '16GB'). 107 | - proc (int, optional): Number of processor cores to use for the calculations (default is 8). 108 | - max_cycles (int, optional): Maximal number of cycles in TS geometry search (default is 30). 109 | 110 | Returns: 111 | - list: List of successful reactions. 112 | """ 113 | home_dir = os.getcwd() 114 | os.chdir(target_dir) 115 | ts_optimizer_list = [] 116 | 117 | for rxn_idx, rxn_smiles in reaction_list: 118 | ts_optimizer_list.append(TSOptimizer(rxn_idx, rxn_smiles, xtb_external_path, 119 | xtb_solvent, dft_solvent, reactive_complex_factor_list_intermolecular, 120 | reactive_complex_factor_list_intramolecular, freq_cut_off, 121 | mem=mem, proc=proc, max_cycles=max_cycles)) 122 | 123 | print(f'{len(ts_optimizer_list)} reactions to process...') 124 | 125 | num_processes = multiprocessing.cpu_count() 126 | 127 | with concurrent.futures.ProcessPoolExecutor(max_workers=num_processes) as executor: 128 | # Map the function to each object in parallel 129 | results = list(executor.map(optimize_individual_ts, ts_optimizer_list)) 130 | 131 | successful_reactions = [r for r in results if r is not None] 132 | 133 | os.chdir(home_dir) 134 | copy_final_outputs(target_dir, f'final_{target_dir}') 135 | 136 | return successful_reactions 137 | 138 | 139 | if __name__ == "__main__": 140 | # preliminaries 141 | args = get_args() 142 | setup_dir(args.target_dir) 143 | reaction_list = get_reaction_list(args.input_file) 144 | start_time = time.time() 145 | xtb_external_path = f'{os.path.join(os.getcwd(), args.xtb_external_path)}' 146 | 147 | # run all reactions in parallel 148 | successful_reactions = obtain_transition_states(args.target_dir, reaction_list, 149 | xtb_external_path, xtb_solvent=args.xtb_solvent, dft_solvent=args.dft_solvent, 150 | reactive_complex_factor_list_intramolecular=args.reactive_complex_factors_intra, 151 | reactive_complex_factor_list_intermolecular=args.reactive_complex_factors_inter, 152 | freq_cut_off=args.freq_cut_off, mem=args.mem, proc=args.proc, max_cycles=args.max_cycles) 153 | 154 | # print final statistics about the run 155 | print_statistics(successful_reactions, start_time) 156 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | 2 | [metadata] 3 | name = tstools 4 | version = 0.4.2 5 | license = MIT 6 | description = Tools to locate transition state geometries based on a reaction SMILES input 7 | long_description = file: README.md 8 | author = Thijs Stuyver 9 | classifiers= 10 | 11 | [options] 12 | packages = find: 13 | package_dir = 14 | =src 15 | include_package_data = True 16 | 17 | [options.packages.find] 18 | where=src -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | from distutils.core import setup 4 | 5 | setup() 6 | -------------------------------------------------------------------------------- /src/tstools.egg-info/PKG-INFO: -------------------------------------------------------------------------------- 1 | Metadata-Version: 2.1 2 | Name: tstools 3 | Version: 0.4.2 4 | Summary: Tools to locate transition state geometries based on a reaction SMILES input 5 | Author: Thijs Stuyver 6 | License: MIT 7 | License-File: LICENSE 8 | 9 | # TS-tools 10 | 11 | This is the repository corresponding to the TS-tools project. 12 | 13 | ### Setting up the environment 14 | 15 | To set up the ts-tools conda environment: 16 | 17 | ``` 18 | conda env create -f environment.yml 19 | ``` 20 | 21 | To install the TS-tools package, activate the ts-tools environment and run the following command within the TS-tools directory: 22 | 23 | ``` 24 | conda activate ts-tools 25 | pip install . 26 | ``` 27 | 28 | Additionally, Gaussian16 needs to be available. In HPC environments, this can typically be achieved by loading the corresponding module to the path: 29 | 30 | ``` 31 | module load gaussian/g16_C01 32 | ``` 33 | 34 | Finally, the path to the xTB executable, used in 'xtb/external_script/xtb_external.py', needs to be set through the environment variable `XTB_PATH`, e.g., 35 | ``` 36 | export XTB_PATH=/path/to/xtb 37 | ``` 38 | 39 | ### Generating TS guesses at xTB level-of-theory 40 | 41 | TS guesses at xTB level of theory can be generated by running the following command (individual calculations are run in parallel as a single Python ProcessPool): 42 | 43 | ``` 44 | python run_scripts/run_ts_searcher.py [--input-file data/reactions_am.txt] [--xtb-external-path xtb_external_script/xtb_external.py] 45 | ``` 46 | 47 | where the ’input-file’ command line option corresponds to the location of the .txt-file containing the reaction SMILES (the default value ’reactions_am.txt’ corresponds to the benchmarking reactions), and the ’xtb-external-path’ option corresponds to the location of the script to use xTB as an external method in Gaussian16 (copied from the Jensen group's [xtb_gaussian](https://github.com/jensengroup/xtb_gaussian/blob/main/xtb_external.py) repository). 48 | 49 | Additional options can also be provided: 50 | 51 | 1. '--reactive-complex-factors-intra': Specifies a list of floating-point numbers representing reactive complex factors for intra-molecular interactions. To disable the preorganization of the reactant complex towards the product geometry, set this value to 0. In this case, no distance constraints along the bonds being formed are added, i.e., the molecule is optimized in an unbiased manner. 52 | 2. '--reactive-complex-factors-inter': Specifies a list of floating-point numbers representing reactive complex factors for inter-molecular interactions. 53 | 3. '--solvent': Specifies the name of the solvent (needs to be supported in xTB, e.g., 'water') 54 | 4. '--freq-cut-off': Specifies the imaginary frequency cut-off used during filtering of plausible starting points for transition state guess optimization. 55 | 5. '--target-dir': Specifies the working directory in which all files will be saved; final reactant, product and TS guess geometries (as well as the TS .log file) are saved in another directory with the ’final_’ prefix. 56 | 57 | Upon execution of this script, a work directory is first set up (named 'work_dir' by default), and for every reaction, a separate sub directory is generated. In each of these sub directory, 'path_dir' contains all the files produced during the generation of the reactive complex(es) and path(s). The preliminary guesses derived from the reactive paths are saved in 'preliminary_ts_guesses'. 'rp_geometries' in its turn contains the start- and end-points of the reactive path, 'g16_dir' contains all the files associated with the TS optimizations -- and IRC confirmations -- of the preliminary guesses, and 'final_ts_guess' contains the xyz- and log-file of the final confirmed TS (if found). Upon completion of the workflow for all reactions in the input file, the contents of 'final_ts_guess' and 'rp_geometries' is copied to the specified target_dir. 58 | 59 | ### Validating TS guesses at DFT level of theory 60 | 61 | Validating TS guesses at xTB level-of-theory can be done by running the following command (individual calculations are run in parallel as a single Python ProcessPool): 62 | 63 | ``` 64 | python run_scripts/dft_validation.py [--input-file data/reactions_am.txt] [--input-dir final_work_dir] 65 | ``` 66 | 67 | where the ’input-file’ command line option corresponds to the location of the .txt-file containing the reaction SMILES (the default value ’reactions_am.txt’ corresponds to the benchmarking reactions), 68 | and the ’input-dir’ command line option corresponds to the location of the folder in which the final TS guess geometries have been saved (see previous section). 69 | 70 | Additional options can also be provided: 71 | 72 | 1. '--solvent': Specifies the name of the solvent (needs to be supported both in Gaussian16, e.g., 'water') 73 | 2. '--output-dir': Specifies the working directory in which all files will be saved (default is 'validation_dir'). 74 | 3. '--mem': Specifies the memory requested in the Gaussian16 .com files (default is '16GB') 75 | 4. '--proc': Specifies the number of processors requested in the Gaussian16 .com files (default is 8) 76 | 5. '--functional': Specifies the functional to be used for the DFT calculations (default is 'UB3LYP') 77 | 6. '--basis-set': Specifies the basis set to be used for the DFT calculations (default is '6-31G**') 78 | 79 | Upon execution of this script, the specified output directory is created, as well as sub directories for each reaction SMILES in the input file. In each of these sub directories, 'rp_geometries' contains the xyz-files of reactants and products, and 'g16_dir' contains the files associated with the TS optimization -- and IRC confirmations -- of the xTB level TS determined during the original TS search (see previous section). The final DFT level TS geometry is saved in the latter directory as well, under the same name as the original xyz-file in the input directory. 80 | 81 | ### Generating TS guesses at DFT level of theory 82 | 83 | TS guesses at DFT level-of-theory (from an xTB reactive path) can be generated by running the following command (individual calculations are run in parallel as a single Python ProcessPool): 84 | 85 | ``` 86 | python run_scripts/run_ts_searcher_dft.py [--input-file data/reactions_am.txt] [--xtb-external-path xtb_external_script/xtb_external.py] 87 | ``` 88 | 89 | where the ’input-file’ command line option corresponds to the location of the .txt-file containing the reaction SMILES (the default value ’reactions_am.txt’ corresponds to the benchmarking reactions), 90 | and the ’xtb-external-path’ option corresponds to the location of the script to use xTB as an external method in Gaussian16 (copied from the Jensen group's [xtb_gaussian](https://github.com/jensengroup/xtb_gaussian/blob/main/xtb_external.py) repository). 91 | Note that this script will be a lot slower than xTB optimization of TSs, and should consequently only be used when full xTB level-of-theory TS guess generation fails. 92 | 93 | Additional options can also be provided: 94 | 95 | 1. '--reactive-complex-factors-intra': Specifies a list of floating-point numbers representing reactive complex factors for intra-molecular interactions. To disable the preorganization of the reactant complex towards the product geometry, set this value to 0. In this case, no distance constraints along the bonds being formed are added, i.e., the molecule is optimized in an unbiased manner. 96 | 2. '--reactive-complex-factors-inter': Specifies a list of floating-point numbers representing reactive complex factors for inter-molecular interactions. 97 | 3. '--solvent': Specifies the name of the solvent to be used in both the xTB and DFT calculations 98 | 4. '--xtb_solvent': Specifies the name of the solvent to be used in the xTB calculations (only needed when universal 'solvent' keyword is not specified) 99 | 5. '--dft_solvent': Specifies the name of the solvent to be used in the DFT calculations (only needed when universal 'solvent' keyword is not specified) 100 | 6. '--freq-cut-off': Specifies the imaginary frequency cut-off used during filtering of plausible starting points for transition state guess optimization. 101 | 7. '--target-dir': Specifies the working directory in which all files will be saved; final reactant, product and TS guess geometries (as well as the TS .log file) are saved in another 102 | directory with the ’final_’ prefix. 103 | 8. '--mem': Specifies the memory requested in the Gaussian16 .com files (default is '16GB') 104 | 9. '--proc': Specifies the number of processors requested in the Gaussian16 .com files (default is 8) 105 | 10. '--functional': Specifies the functional to be used for the DFT calculations (default is 'UB3LYP') 106 | 11. '--basis-set': Specifies the basis set to be used for the DFT calculations (default is '6-31G**') 107 | 12. '--max-cycles': Maximal number of cycles in TS geometry search (default is 30) 108 | 109 | Upon execution of this script, work and output directories are set up in the same manner as for the xTB script (respectively named 'work_dir_dft' and 'final_work_dir_dft' by default). 110 | 111 | ### References 112 | 113 | If (parts of) this workflow are used as part of a publication, please cite the associated paper: 114 | 115 | ``` 116 | @article{stuyver2024, 117 | author = {Stuyver, T.}, 118 | title = {{TS-tools: Rapid and Automated Localization of 119 | Transition States based on a Textual Reaction SMILES Input}}, 120 | journal = {ChemRxiv}, 121 | year = {2024}, 122 | doi = {10.26434/chemrxiv-2024-st2tr}, 123 | } 124 | ``` 125 | 126 | Furthermore, since the workflow makes use of autodE at several instances, also consider citing the paper in which this code was originally presented: 127 | 128 | ``` 129 | @article{autodE, 130 | doi = {10.1002/anie.202011941}, 131 | url = {https://doi.org/10.1002/anie.202011941}, 132 | year = {2021}, 133 | publisher = {Wiley}, 134 | volume = {60}, 135 | number = {8}, 136 | pages = {4266--4274}, 137 | author = {Tom A. Young and Joseph J. Silcock and Alistair J. Sterling and Fernanda Duarte}, 138 | title = {{autodE}: Automated Calculation of Reaction Energy Profiles -- Application to Organic and Organometallic Reactions}, 139 | journal = {Angewandte Chemie International Edition} 140 | } 141 | ``` 142 | -------------------------------------------------------------------------------- /src/tstools.egg-info/SOURCES.txt: -------------------------------------------------------------------------------- 1 | LICENSE 2 | README.md 3 | setup.cfg 4 | setup.py 5 | src/tstools/__init__.py 6 | src/tstools/confirm_ts_guess.py 7 | src/tstools/irc_search.py 8 | src/tstools/path_generator.py 9 | src/tstools/ts_optimizer.py 10 | src/tstools/utils.py 11 | src/tstools.egg-info/PKG-INFO 12 | src/tstools.egg-info/SOURCES.txt 13 | src/tstools.egg-info/dependency_links.txt 14 | src/tstools.egg-info/top_level.txt -------------------------------------------------------------------------------- /src/tstools.egg-info/dependency_links.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/tstools.egg-info/top_level.txt: -------------------------------------------------------------------------------- 1 | tstools 2 | -------------------------------------------------------------------------------- /src/tstools/__init__.py: -------------------------------------------------------------------------------- 1 | from .ts_optimizer import TSOptimizer 2 | from .utils import remove_files_in_directory, copy_final_outputs, \ 3 | setup_dir, get_reaction_list, print_statistics 4 | from .path_generator import PathGenerator 5 | from .confirm_ts_guess import validate_ts_guess 6 | from .utils import xyz_to_gaussian_input, run_g16_ts_optimization, run_irc, remove_files_in_directory, NotConverged 7 | from .irc_search import generate_gaussian_irc_input, extract_transition_state_geometry, \ 8 | extract_irc_geometries, compare_molecules_irc -------------------------------------------------------------------------------- /src/tstools/confirm_ts_guess.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import autode as ade 3 | import os 4 | from scipy.spatial import distance_matrix 5 | import re 6 | from autode.species.species import Species 7 | from typing import Optional 8 | import subprocess 9 | 10 | xtb = ade.methods.XTB() 11 | 12 | 13 | def validate_ts_guess(ts_guess_file, path, freq_cut_off=150, charge=0, multiplicity=1, solvent=None): 14 | """ 15 | Validate the transition state (TS) guess file based on frequency and displacement information. 16 | 17 | Parameters: 18 | - ts_guess_file (str): Path to the TS guess file. 19 | - path (str): Path to the relevant data. 20 | - freq_cut_off (int, optional): Frequency cutoff for validation. Defaults to 150. 21 | - charge (int, optional): Charge of the system. Defaults to 0. 22 | - multiplicity (int, optional): Multiplicity of the system. Defaults to 1. 23 | - solvent (str, optional): Solvent information. Defaults to None. 24 | 25 | Returns: 26 | - Tuple[str, int] or Tuple[None, None]: If the TS guess is valid, returns the TS guess file 27 | and its frequency; otherwise, returns None for both. 28 | """ 29 | # get all information about main imaginary mode 30 | freq, main_displacement_is_active = extract_info_ts_file(ts_guess_file, path, charge, multiplicity, solvent) 31 | 32 | if freq < -freq_cut_off and main_displacement_is_active: 33 | return ts_guess_file, freq 34 | else: 35 | return None, None 36 | 37 | 38 | def extract_info_ts_file(ts_file, path, charge, multiplicity, solvent): 39 | """ 40 | Extract information related to a transition state (TS) from a directory. 41 | 42 | Args: 43 | ts_file (str): The directory containing TS files. 44 | path (str): The path containing the reactant and product xyz-files. 45 | charge (int): The charge of the system. 46 | multiplicity (int): The multiplicity of the system. 47 | solvent (str): The name of the solvent. 48 | 49 | Returns: 50 | tuple: A tuple containing the following information: 51 | - float: Frequency of the TS. 52 | - dict: Active bonds involved in the imaginary mode, with bond indices as keys and displacement values as values. 53 | - dict: Extra bonds involved in the imaginary mode, with bond indices as keys and displacement values as values. 54 | - set: Active bonds forming during the TS. 55 | - set: Active bonds breaking during the TS. 56 | - numpy.ndarray: Distance matrix for reactant molecules. 57 | - numpy.ndarray: Distance matrix for product molecules. 58 | - numpy.ndarray: Distance matrix for the TS geometry. 59 | 60 | This function analyzes the provided TS directory to determine if it represents an imaginary mode and extracts various relevant information, 61 | including bond displacements, active bonds forming and breaking, and distance matrices for the reactants, products, and TS geometry. 62 | 63 | Note: 64 | - The bond displacement cutoff (cut_off) is used to filter small bond displacements. 65 | Bonds with displacements below this threshold are ignored. 66 | """ 67 | # Obtain reactant, product, and transition state molecules 68 | reactant_file, product_file = get_xyzs(path) 69 | reactant, product, ts_mol = get_ade_molecules(reactant_file, product_file, ts_file, charge, multiplicity) 70 | 71 | # Compute the displacement along the imaginary mode 72 | _ = get_negative_frequencies(ts_file, charge, solvent) 73 | normal_mode, freq = read_first_normal_mode('g98.out') 74 | f_displaced_species = displaced_species_along_mode(ts_mol, normal_mode, disp_factor=1) 75 | b_displaced_species = displaced_species_along_mode(reactant, normal_mode, disp_factor=-1) 76 | 77 | # Compute distance matrices -- TS geometry obtained through displacement along imaginary mode 78 | f_distances = distance_matrix(f_displaced_species.coordinates, f_displaced_species.coordinates) 79 | b_distances = distance_matrix(b_displaced_species.coordinates, b_displaced_species.coordinates) 80 | 81 | # Compute delta_mode 82 | delta_mode = f_distances - b_distances 83 | 84 | # Get all the bonds in both reactants and products 85 | all_bonds = set(product.graph.edges).union(set(reactant.graph.edges)) 86 | 87 | # Identify active forming and breaking bonds 88 | active_bonds_forming = set(product.graph.edges).difference(set(reactant.graph.edges)) 89 | active_bonds_breaking = set(reactant.graph.edges).difference(set(product.graph.edges)) 90 | active_bonds = active_bonds_forming.union(active_bonds_breaking) 91 | 92 | # Check if main bond displacement in mode corresponds to active bond 93 | displacement_dict = {} 94 | for bond in all_bonds: 95 | displacement_dict[bond] = abs(delta_mode[bond[0],bond[1]]) 96 | 97 | max_displacement_bond = max(displacement_dict, key=displacement_dict.get) 98 | 99 | if max_displacement_bond in active_bonds: 100 | main_displacement_is_active = True 101 | else: 102 | main_displacement_is_active = False 103 | 104 | return freq, main_displacement_is_active 105 | 106 | 107 | def read_first_normal_mode(filename): 108 | """ 109 | Read the first normal mode from the specified file. 110 | 111 | Args: 112 | filename (str): The name of the file to read. 113 | 114 | Returns: 115 | numpy.ndarray: Array representing the normal mode. 116 | float: Frequency value. 117 | """ 118 | normal_mode = [] 119 | pattern = r'\s+(\d+)\s+\d+\s+([-+]?\d+\.\d+)\s+([-+]?\d+\.\d+)\s+([-+]?\d+\.\d+)' 120 | 121 | # Open the file and read its contents 122 | with open(filename, 'r') as file: 123 | lines = file.readlines() 124 | # Iterate over the lines and find the matching pattern 125 | for line in lines: 126 | # Check if the line contains a frequency 127 | if 'Frequencies' in line: 128 | # Extract the frequency value from the line 129 | frequency = float(line.split('--')[1].split()[0]) 130 | 131 | # Iterate over the lines below the frequency line 132 | for sub_line in lines[lines.index(line) + 7:]: 133 | # Check if the line matches the pattern 134 | match = re.search(pattern, sub_line) 135 | if match: 136 | x = float(match.group(2)) 137 | y = float(match.group(3)) 138 | z = float(match.group(4)) 139 | normal_mode.append([x, y, z]) 140 | else: 141 | break 142 | break 143 | 144 | return np.array(normal_mode), frequency 145 | 146 | 147 | def displaced_species_along_mode( 148 | species: Species, 149 | normal_mode = np.array, 150 | disp_factor: float = 1.0, 151 | max_atom_disp: float = 99.9, 152 | ) -> Optional[Species]: 153 | """ 154 | Displace the geometry along a normal mode with mode number indexed from 0, 155 | where 0-2 are translational normal modes, 3-5 are rotational modes and 6 156 | is the largest magnitude imaginary mode (if present). To displace along 157 | the second imaginary mode we have mode_number=7 158 | 159 | --------------------------------------------------------------------------- 160 | Arguments: 161 | species (autode.species.Species): 162 | mode_number (int): Mode number to displace along 163 | 164 | Keyword Arguments: 165 | disp_factor (float): Distance to displace (default: {1.0}) 166 | 167 | max_atom_disp (float): Maximum displacement of any atom (Å) 168 | 169 | Returns: 170 | (autode.species.Species): 171 | 172 | Raises: 173 | (autode.exceptions.CouldNotGetProperty): 174 | """ 175 | coords = species.coordinates 176 | disp_coords = coords.copy() + disp_factor * normal_mode 177 | 178 | # Ensure the maximum displacement distance any single atom is below the 179 | # threshold (max_atom_disp), by incrementing backwards in steps of 0.05 Å, 180 | # for disp_factor = 1.0 Å 181 | for _ in range(20): 182 | 183 | if ( 184 | np.max(np.linalg.norm(coords - disp_coords, axis=1)) 185 | < max_atom_disp 186 | ): 187 | break 188 | 189 | disp_coords -= (disp_factor / 20) * normal_mode 190 | 191 | # Create a new species from the initial 192 | disp_species = Species( 193 | name=f"{species.name}_disp", 194 | atoms=species.atoms.copy(), 195 | charge=species.charge, 196 | mult=species.mult, 197 | ) 198 | disp_species.coordinates = disp_coords 199 | 200 | return disp_species 201 | 202 | 203 | def get_ade_molecules(reactant_file, product_file, ts_guess_file, charge, multiplicity): 204 | """ 205 | Load the reactant, product, and transition state molecules. 206 | 207 | Args: 208 | reactant_file (str): The name of the reactant file. 209 | product_file (str): The name of the product file. 210 | ts_guess_file (str): The name of the transition state guess file. 211 | 212 | Returns: 213 | ade.Molecule: Reactant molecule. 214 | ade.Molecule: Product molecule. 215 | ade.Molecule: Transition state molecule. 216 | """ 217 | reactant = ade.Molecule(reactant_file, charge=charge, mult=multiplicity) 218 | product = ade.Molecule(product_file, charge=charge, mult=multiplicity) 219 | ts = ade.Molecule(ts_guess_file, charge=charge, mult=multiplicity) 220 | 221 | return reactant, product, ts 222 | 223 | 224 | def get_xyzs(path): 225 | """ 226 | Get the names of the reactant and product files. 227 | 228 | Args: 229 | path (str): The path to workdir with the xyz-files. 230 | 231 | Returns: 232 | str: The name of the reactant file. 233 | str: The name of the product file. 234 | """ 235 | rp_path = os.path.join(path, 'rp_geometries') 236 | 237 | reactant_file = os.path.join(rp_path, 'reactants_geometry.xyz') 238 | product_file = os.path.join(rp_path, 'products_geometry.xyz') 239 | 240 | return reactant_file, product_file 241 | 242 | 243 | def get_negative_frequencies(filename, charge, solvent): 244 | """ 245 | Executes an external program to calculate the negative frequencies for a given file. 246 | 247 | Args: 248 | filename (str): The name of the file to be processed. 249 | charge (int): The charge value for the calculation. 250 | 251 | Returns: 252 | list: A list of negative frequencies. 253 | """ 254 | with open('hess.out', 'w') as out: 255 | if solvent is not None: 256 | process = subprocess.Popen(f'xtb {filename} --charge {charge} --hess --alpb {solvent}'.split(), 257 | stderr=subprocess.DEVNULL, stdout=out) 258 | else: 259 | process = subprocess.Popen(f'xtb {filename} --charge {charge} --hess'.split(), 260 | stderr=subprocess.DEVNULL, stdout=out) 261 | process.wait() 262 | 263 | neg_freq = read_negative_frequencies('g98.out') 264 | return neg_freq 265 | 266 | 267 | def read_negative_frequencies(filename): 268 | """ 269 | Read the negative frequencies from a file. 270 | 271 | Args: 272 | filename: The name of the file. 273 | 274 | Returns: 275 | list: The list of negative frequencies. 276 | """ 277 | with open(filename, 'r') as file: 278 | for line in file: 279 | if line.strip().startswith('Frequencies --'): 280 | frequencies = line.strip().split()[2:] 281 | negative_frequencies = [freq for freq in frequencies if float(freq) < 0] 282 | return negative_frequencies 283 | 284 | 285 | -------------------------------------------------------------------------------- /src/tstools/irc_search.py: -------------------------------------------------------------------------------- 1 | import re 2 | import autode as ade 3 | import os 4 | from autode.mol_graphs import make_graph 5 | import subprocess 6 | 7 | atomic_number_to_symbol = { 8 | 1: 'H', 2: 'He', 3: 'Li', 4: 'Be', 5: 'B', 9 | 6: 'C', 7: 'N', 8: 'O', 9: 'F', 10: 'Ne', 10 | 11: 'Na', 12: 'Mg', 13: 'Al', 14: 'Si', 15: 'P', 11 | 16: 'S', 17: 'Cl', 18: 'Ar', 19: 'K', 20: 'Ca', 12 | 21: 'Sc', 22: 'Ti', 23: 'V', 24: 'Cr', 25: 'Mn', 13 | 26: 'Fe', 27: 'Co', 28: 'Ni', 29: 'Cu', 30: 'Zn', 14 | 31: 'Ga', 32: 'Ge', 33: 'As', 34: 'Se', 35: 'Br', 15 | 36: 'Kr', 37: 'Rb', 38: 'Sr', 39: 'Y', 40: 'Zr', 16 | 41: 'Nb', 42: 'Mo', 43: 'Tc', 44: 'Ru', 45: 'Rh', 17 | 46: 'Pd', 47: 'Ag', 48: 'Cd', 49: 'In', 50: 'Sn', 18 | 51: 'Sb', 52: 'Te', 53: 'I', 54: 'Xe', 55: 'Cs', 19 | 56: 'Ba', 57: 'La', 58: 'Ce', 59: 'Pr', 60: 'Nd', 20 | 61: 'Pm', 62: 'Sm', 63: 'Eu', 64: 'Gd', 65: 'Tb', 21 | 66: 'Dy', 67: 'Ho', 68: 'Er', 69: 'Tm', 70: 'Yb', 22 | 71: 'Lu', 72: 'Hf', 73: 'Ta', 74: 'W', 75: 'Re', 23 | 76: 'Os', 77: 'Ir', 78: 'Pt', 79: 'Au', 80: 'Hg', 24 | 81: 'Tl', 82: 'Pb', 83: 'Bi', 84: 'Po', 85: 'At', 25 | 86: 'Rn' 26 | } 27 | 28 | 29 | def extract_irc_geometries(log_path_forward, log_path_reverse): 30 | """ 31 | Extract IRC (Intrinsic Reaction Coordinate) geometries from forward and reverse log files, 32 | and write them to XYZ files. 33 | 34 | Parameters: 35 | - log_path_forward (str): Path to the forward IRC log file. 36 | - log_path_reverse (str): Path to the reverse IRC log file. 37 | """ 38 | geometry_block_forward = extract_geometry_block_from_irc(log_path_forward) 39 | geometry_block_reverse = extract_geometry_block_from_irc(log_path_reverse) 40 | 41 | write_geometry_block_to_xyz(geometry_block_forward, f'{log_path_forward[:-4]}.xyz', True) 42 | write_geometry_block_to_xyz(geometry_block_reverse, f'{log_path_reverse[:-4]}.xyz', True) 43 | 44 | 45 | def extract_geometry_block_from_irc(log_path): 46 | """ 47 | Extract the geometry block from an IRC (Intrinsic Reaction Coordinate) log file. 48 | 49 | Parameters: 50 | - log_path (str): Path to the IRC log file. 51 | 52 | Returns: 53 | List[str]: List of lines containing the geometry block. 54 | """ 55 | geometry_start_pattern = re.compile(r'^\s*Cartesian Coordinates \(Ang\):\s*$') 56 | geometry_end_pattern = re.compile(r'^\s*CHANGE IN THE REACTION COORDINATE =\s*([+-]?\d*\.\d+)\s*$') 57 | with open(log_path, 'r') as log_file: 58 | lines = log_file.readlines() 59 | 60 | for i, line in enumerate(lines): 61 | if geometry_start_pattern.match(line.strip()): 62 | geometry_block_start_line = i + 5 63 | if geometry_end_pattern.search(line): 64 | geometry_block_end_line = i - 1 65 | 66 | return lines[geometry_block_start_line:geometry_block_end_line] 67 | 68 | 69 | def write_geometry_block_to_xyz(geometry_block, output_xyz_path, irc=False): 70 | """ 71 | Write a geometry block to an XYZ file. 72 | 73 | Parameters: 74 | - geometry_block (List[str]): List of lines containing the geometry block. 75 | - output_xyz_path (str): Path to the output XYZ file. 76 | - irc (bool): Indicates whether the geometry block is from an IRC log. Defaults to False. 77 | """ 78 | with open(output_xyz_path, 'w') as xyz_file: 79 | # Write the number of atoms 80 | xyz_file.write(str(len(geometry_block)) + '\n\n') 81 | # Write the atomic coordinates 82 | for line in geometry_block: 83 | split_line = line.split() 84 | if irc: 85 | xyz_file.write(f'{atomic_number_to_symbol[int(split_line[1])]} {float(split_line[2]):.6f} {float(split_line[3]):.6f} {float(split_line[4]):.6f}\n') 86 | else: 87 | xyz_file.write(f'{atomic_number_to_symbol[int(split_line[1])]} {float(split_line[3]):.6f} {float(split_line[4]):.6f} {float(split_line[5]):.6f}\n') 88 | 89 | 90 | def extract_transition_state_geometry(log_path, output_xyz_path): 91 | """ 92 | Extract the geometry of a transition state from a Gaussian16 log file and save it to an XYZ file. 93 | 94 | Parameters: 95 | - log_path (str): Path to the Gaussian16 log file. 96 | - output_xyz_path (str): Path to the output XYZ file. 97 | """ 98 | # Define regular expressions to identify relevant lines 99 | geometry_start_pattern = re.compile(r'^\s*Standard orientation:.*') 100 | geometry_end_pattern = re.compile(r'^\s*-+\s*$') 101 | transition_state_pattern = re.compile(r'^\s*-- Stationary point found\.$') 102 | 103 | # Set boolean flag 104 | ts_found = False 105 | geometry_block_start_line = 0 106 | geometry_block_end_line = 0 107 | 108 | # Read the Gaussian16 log file 109 | with open(log_path, 'r') as log_file: 110 | lines = log_file.readlines() 111 | 112 | # Iterate through the lines in the log file 113 | for i, line in enumerate(lines): 114 | # Break if transition state is found 115 | if transition_state_pattern.match(line): 116 | ts_found = True 117 | 118 | if ts_found and geometry_start_pattern.match(line): 119 | geometry_block_start_line = i + 5 120 | 121 | if ts_found and geometry_block_start_line != 0 and i > geometry_block_start_line and geometry_end_pattern.match(line): 122 | geometry_block_end_line = i 123 | break 124 | 125 | geometry_block = lines[geometry_block_start_line: geometry_block_end_line] 126 | 127 | # Write the final geometry to an XYZ file 128 | write_geometry_block_to_xyz(geometry_block, f'{log_path[:-4]}.xyz') 129 | 130 | print(f'Transition state geometry extracted and saved to {output_xyz_path}.') 131 | 132 | 133 | def write_coordinates_to_xyz(coordinates, file_path): 134 | """ 135 | Write atomic coordinates to an XYZ file. 136 | 137 | Parameters: 138 | - coordinates (list): A list of tuples representing atomic coordinates. 139 | Each tuple should have the format (atom_symbol, x, y, z). 140 | - file_path (str): The path to the output XYZ file. 141 | 142 | Returns: 143 | None 144 | """ 145 | with open(file_path, 'w') as xyz_file: 146 | # Write the number of atoms 147 | xyz_file.write(str(len(coordinates)) + '\n\n') 148 | for coordinate in coordinates: 149 | xyz_file.write(f'{coordinate[0]} {float(coordinate[1]):.6f} {float(coordinate[2]):.6f} {float(coordinate[3]):.6f}\n') 150 | 151 | 152 | def extract_coordinates(file_path): 153 | """ 154 | Extract atomic coordinates from a file and write them to a new XYZ file. 155 | 156 | Parameters: 157 | - file_path (str): Path to the input file. 158 | 159 | Returns: 160 | None 161 | """ 162 | coordinates = [] 163 | 164 | with open(file_path, 'r') as file: 165 | found_coordinates = False 166 | 167 | for line in file: 168 | if 'final structure' in line.lower(): 169 | found_coordinates = True 170 | continue 171 | 172 | if found_coordinates and line.strip() == '': 173 | break 174 | 175 | if found_coordinates: 176 | atom_info = line.split() 177 | if len(atom_info) == 4: 178 | element, x, y, z = atom_info 179 | coordinates.append((element, float(x), float(y), float(z))) 180 | 181 | write_coordinates_to_xyz(coordinates, f'{file_path[:-4]}_opt.xyz') 182 | 183 | 184 | def write_xtb_input_file(xyz_path): 185 | """ 186 | Write an XTB input file based on an XYZ file. 187 | 188 | Parameters: 189 | - xyz_path (str): Path to the XYZ file. 190 | 191 | Returns: 192 | str: Path to the created XTB input file. 193 | """ 194 | file_path = os.path.join(os.path.dirname(xyz_path), 'xtb.inp') 195 | input_block = """ 196 | $wall 197 | potential=logfermi 198 | sphere: auto, all 199 | $end 200 | """ 201 | 202 | with open(file_path, 'w') as file: 203 | file.write(input_block) 204 | 205 | return file_path 206 | 207 | 208 | def optimize_final_point_irc(xyz_file, charge, multiplicity, solvent=None): 209 | """ 210 | Optimize the final point of an Intrinsic Reaction Coordinate (IRC) using XTB. 211 | 212 | Parameters: 213 | - xyz_file (str): Path to the XYZ file containing the molecular coordinates. 214 | - charge (int): Charge of the system. 215 | - multiplicity (int): Spin multiplicity of the system (1 for singlet, 2 for doublet, etc.). 216 | - solvent (str, optional): Solvent information. Defaults to None. 217 | 218 | Returns: 219 | None: The function writes the optimized coordinates to an output file. 220 | """ 221 | inp_path = write_xtb_input_file(xyz_file) 222 | with open(f'{xyz_file[:-4]}.out', 'w') as out: 223 | cmd = f'xtb --input {inp_path} {xyz_file} --opt --cma --charge {charge} ' 224 | 225 | if multiplicity == 1: 226 | pass 227 | elif multiplicity == 2: 228 | cmd += '--uhf 1 ' 229 | 230 | if solvent is not None: 231 | cmd += f'--alpb {solvent} ' 232 | 233 | process = subprocess.Popen(cmd.split(), stderr=subprocess.DEVNULL, stdout=out) 234 | process.wait() 235 | 236 | extract_coordinates(f'{xyz_file[:-4]}.out') 237 | 238 | 239 | def update_molecular_graphs(rel_tolerance, forward_mol, reverse_mol, reactant_mol, product_mol): 240 | """ 241 | Update molecular graphs for a set of molecules using a relative tolerance. 242 | 243 | Parameters: 244 | - rel_tolerance (float): Relative tolerance for updating molecular graphs. 245 | - forward_mol (ade.Molecule): Forward molecule. 246 | - reverse_mol (ade.Molecule): Reverse molecule. 247 | - reactant_mol (ade.Molecule): Reactant molecule. 248 | - product_mol (ade.Molecule): Product molecule. 249 | 250 | Returns: 251 | Tuple[ade.Molecule, ade.Molecule, ade.Molecule, ade.Molecule]: Updated forward, reverse, reactant, and product molecules. 252 | """ 253 | for mol in [forward_mol, reverse_mol, reactant_mol, product_mol]: 254 | make_graph(mol, rel_tolerance=rel_tolerance) 255 | 256 | return forward_mol, reverse_mol, reactant_mol, product_mol 257 | 258 | 259 | #TODO: optimize in case of DFT??? 260 | def compare_molecules_irc(forward_xyz, reverse_xyz, reactant_xyz, product_xyz, charge=0, multiplicity=1, solvent=None): 261 | """ 262 | Compare molecular graphs of IRC (Intrinsic Reaction Coordinate) molecules after optimization. 263 | 264 | Parameters: 265 | - forward_xyz (str): Path to the XYZ file for the forward IRC molecule. 266 | - reverse_xyz (str): Path to the XYZ file for the reverse IRC molecule. 267 | - reactant_xyz (str): Path to the XYZ file for the reactant molecule. 268 | - product_xyz (str): Path to the XYZ file for the product molecule. 269 | - charge (int, optional): Charge of the system. Defaults to 0. 270 | - multiplicity (int, optional): Spin multiplicity of the system (1 for singlet, 2 for doublet, etc.). Defaults to 1. 271 | - solvent (str, optional): Solvent information. Defaults to None. 272 | 273 | Returns: 274 | bool: True if the molecular graphs match for any relative tolerance, False otherwise. 275 | """ 276 | # first reoptimize the final points 277 | optimize_final_point_irc(forward_xyz, charge, multiplicity, solvent) 278 | optimize_final_point_irc(reverse_xyz, charge, multiplicity, solvent) 279 | # then take final geometry and do actual comparison 280 | forward_mol = ade.Molecule(f'{forward_xyz[:-4]}_opt.xyz', name='forward', charge=charge, mult=multiplicity) 281 | reverse_mol = ade.Molecule(f'{reverse_xyz[:-4]}_opt.xyz', name='reverse', charge=charge, mult=multiplicity) 282 | reactant_mol = ade.Molecule(reactant_xyz, name='reactant', charge=charge, mult=multiplicity) 283 | product_mol = ade.Molecule(product_xyz, name='product', charge=charge, mult=multiplicity) 284 | 285 | # if no bond change between reactant and product, abort 286 | if set(reactant_mol.graph.edges) == set(product_mol.graph.edges): 287 | return False 288 | 289 | for rel_tolerance in [0.3, 0.25, 0.20, 0.15, 0.10, 0.05, 0.01]: 290 | forward_mol, reverse_mol, reactant_mol, product_mol = update_molecular_graphs(rel_tolerance, forward_mol, reverse_mol, reactant_mol, product_mol) 291 | if set(forward_mol.graph.edges) == set(reactant_mol.graph.edges) and set(reverse_mol.graph.edges) == set(product_mol.graph.edges) \ 292 | and set(forward_mol.graph.edges) != set(reverse_mol.graph.edges): 293 | return True 294 | elif set(forward_mol.graph.edges) == set(product_mol.graph.edges) and set(reverse_mol.graph.edges) == set(reactant_mol.graph.edges) \ 295 | and set(forward_mol.graph.edges) != set(reverse_mol.graph.edges): 296 | return True 297 | else: 298 | continue 299 | 300 | return False 301 | 302 | 303 | def generate_gaussian_irc_input(xyz_file, output_prefix='irc_calc', method='B3LYP/6-31G**', 304 | mem='2GB', proc=2, solvent=None, charge=0, multiplicity=1): 305 | """ 306 | Generate Gaussian input files for IRC (Intrinsic Reaction Coordinate) calculations. 307 | 308 | Parameters: 309 | - xyz_file (str): Path to the XYZ file containing atomic coordinates. 310 | - output_prefix (str, optional): Prefix for output files. Defaults to 'irc_calc'. 311 | - method (str, optional): Gaussian method and basis set. Defaults to 'B3LYP/6-31G**'. 312 | - mem (str, optional): Gaussian memory specification. Defaults to '2GB'. 313 | - proc (int, optional): Number of processors. Defaults to 2. 314 | - solvent (str, optional): Solvent information. Defaults to None. 315 | - charge (int, optional): Charge of the system. Defaults to 0. 316 | - multiplicity (int, optional): Spin multiplicity of the system. Defaults to 1. 317 | 318 | Returns: 319 | Tuple[str, str]: Paths to the forward and reverse Gaussian input files. 320 | """ 321 | # Read the XYZ file 322 | with open(xyz_file, 'r') as xyz: 323 | lines = xyz.readlines() 324 | 325 | # Extract the atomic coordinates 326 | atom_coords = lines[2:] 327 | 328 | # Define the Gaussian input file content 329 | if 'external' not in method: 330 | if solvent is not None: 331 | input_content_f = f'%Chk={xyz_file.split("/")[-1][:-4]}.chk\n%NProc={proc}\n%Mem={mem}\n#p IRC(calcfc, maxpoint=50, stepsize=15, Forward) {method} SCRF=(Solvent={solvent}, smd)' \ 332 | f'\n\nIRC Calculation\n\n{charge} {multiplicity}\n{"".join(atom_coords)}\n\n' 333 | input_content_r = f'%Chk={xyz_file.split("/")[-1][:-4]}.chk\n%NProc={proc}\n%Mem={mem}\n#p IRC(calcfc, maxpoint=50, stepsize=15, Reverse) {method} SCRF=(Solvent={solvent}, smd)' \ 334 | f'\n\nIRC Calculation\n\n{charge} {multiplicity}\n{"".join(atom_coords)}\n\n' 335 | else: 336 | input_content_f = f'%Chk={xyz_file.split("/")[-1][:-4]}.chk\n%NProc={proc}\n%Mem={mem}\n#p IRC(calcfc, maxpoint=50, stepsize=15, Forward) {method}' \ 337 | f'\n\nIRC Calculation\n\n{charge} {multiplicity}\n{"".join(atom_coords)}\n\n' 338 | input_content_r = f'%Chk={xyz_file.split("/")[-1][:-4]}.chk\n%NProc={proc}\n%Mem={mem}\n#p IRC(calcfc, maxpoint=50, stepsize=15, Reverse) {method}' \ 339 | f'\n\nIRC Calculation\n\n{charge} {multiplicity}\n{"".join(atom_coords)}\n\n' 340 | else: 341 | if solvent is not None: 342 | external_method = f'external="{method} alpb={solvent}"' 343 | else: 344 | external_method = f'external="{method}"' 345 | input_content_f = f'%Chk={xyz_file.split("/")[-1][:-4]}.chk\n#p IRC(calcfc, maxpoint=50, stepsize=15, Forward) {external_method}\n\n' \ 346 | f'IRC Calculation\n\n{charge} {multiplicity}\n{"".join(atom_coords)}\n\n' 347 | input_content_r = f'%Chk={xyz_file.split("/")[-1][:-4]}.chk\n#p IRC(calcfc, maxpoint=50, stepsize=15, Reverse) {external_method}\n\n' \ 348 | f'IRC Calculation\n\n{charge} {multiplicity}\n{"".join(atom_coords)}\n\n' 349 | 350 | # Write the input content to a Gaussian input file -- forward 351 | input_filename_f = os.path.join(os.path.dirname(xyz_file), f'{output_prefix}_forward.com') 352 | with open(input_filename_f, 'w') as input_file: 353 | input_file.write(input_content_f) 354 | 355 | # Write the input content to a Gaussian input file -- reverse 356 | input_filename_r = os.path.join(os.path.dirname(xyz_file), f'{output_prefix}_reverse.com') 357 | with open(input_filename_r, 'w') as input_file: 358 | input_file.write(input_content_r) 359 | 360 | return input_filename_f, input_filename_r 361 | 362 | if __name__ == '__main__': 363 | #path = '/Users/thijsstuyver/Desktop/reaction_profile_generator/benchmarking_2.0_200/final_ts_guesses/reaction_R100_final_ts_guess_0.xyz' 364 | #path = '/Users/thijsstuyver/Desktop/reaction_profile_generator/lol.log' 365 | #extract_transition_state_geometry(path, f'{path[:-4]}.xyz') 366 | #generate_gaussian_irc_input(f'{path[:-4]}.xyz', method='external="/home/thijs/Jensen_xtb_gaussian/profiles_test/extra/xtb_external.py"') 367 | #extract_irc_geometries('/Users/thijsstuyver/Desktop/reaction_profile_generator/lol/test_irc_forward.log', 368 | # '/Users/thijsstuyver/Desktop/reaction_profile_generator/lol/test_irc_forward.log') 369 | # optimize_final_point_irc('lol/ts_guess_4_irc_forward.xyz', 0) 370 | reaction_correct = compare_molecules_irc( 371 | '/Users/thijsstuyver/Desktop/reaction_R8/g16_dir/ts_guess_2_irc_forward.xyz', 372 | '/Users/thijsstuyver/Desktop/reaction_R8/g16_dir/ts_guess_2_irc_reverse.xyz', 373 | '/Users/thijsstuyver/Desktop/reaction_R8/rp_geometries/reactants_geometry.xyz', 374 | '/Users/thijsstuyver/Desktop/reaction_R8/rp_geometries/products_geometry.xyz') 375 | print(reaction_correct) 376 | #print(reaction_correct) 377 | #extract_transition_state_geometry('logs/ts_guess_0.log', 'logs/test.xyz') 378 | -------------------------------------------------------------------------------- /src/tstools/ts_optimizer.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import os 3 | import shutil 4 | from rdkit import Chem 5 | 6 | from tstools.path_generator import PathGenerator 7 | from tstools.confirm_ts_guess import validate_ts_guess 8 | from tstools.utils import xyz_to_gaussian_input, run_g16_ts_optimization, run_irc, remove_files_in_directory 9 | from tstools.irc_search import generate_gaussian_irc_input, extract_transition_state_geometry, extract_irc_geometries, compare_molecules_irc 10 | 11 | ps = Chem.SmilesParserParams() 12 | ps.removeHs = False 13 | 14 | class TSOptimizer: 15 | def __init__(self, rxn_id, reaction_smiles, xtb_external_path, xtb_solvent=None, dft_solvent=None, 16 | reactive_complex_factor_values_inter=[2.5], reactive_complex_factor_values_intra=[1.1], 17 | freq_cut_off=150, guess_found=False, mem='2GB', proc=2, max_cycles=30): 18 | """ 19 | Initialize a TSOptimizer instance. 20 | 21 | Parameters: 22 | - rxn_id (int): Reaction ID. 23 | - reaction_smiles (str): SMILES representation of the reaction. 24 | - xtb_external_path (str): Path to external xtb executable. 25 | - xtb_solvent (str, optional): Solvent information for xTB calculations. 26 | - dft_solvent (str, optional): Solvent information for DFT calculations 27 | - reactive_complex_factor_values_inter (list, optional): Reactive complex 28 | factor values for intermolecular interactions. 29 | - reactive_complex_factor_values_intra (list, optional): Reactive complex 30 | factor values for intramolecular interactions. 31 | - freq_cut_off (int, optional): Frequency cutoff value. 32 | - guess_found (bool, optional): Indicates if a guess is found. 33 | - mem (str, optional): Gaussian memory specification. Defaults to '2GB'. 34 | - proc (int, optional): Number of processors. Defaults to 2. 35 | - max_cycles (int, optional): Maximal number of cycles in TS geometry search. Defaults to 30. 36 | """ 37 | self.rxn_id = rxn_id 38 | self.reactant_smiles = reaction_smiles.split('>>')[0] 39 | self.product_smiles = reaction_smiles.split('>>')[-1] 40 | self.xtb_solvent = xtb_solvent 41 | self.dft_solvent = dft_solvent 42 | self.reactive_complex_factor_values_inter = reactive_complex_factor_values_inter 43 | self.reactive_complex_factor_values_intra = reactive_complex_factor_values_intra 44 | self.freq_cut_off = freq_cut_off 45 | self.xtb_external_path = xtb_external_path 46 | self.mem = mem 47 | self.proc = proc 48 | self.max_cycles = max_cycles 49 | 50 | self.charge, self.multiplicity = self.get_charge_and_multiplicity() 51 | 52 | self.reaction_dir = self.make_work_dir() 53 | 54 | self.g16_dir = self.make_sub_dir(sub_dir_name='g16_dir') 55 | self.rp_geometries_dir = self.make_sub_dir(sub_dir_name='rp_geometries') 56 | if not guess_found: 57 | self.path_dir = self.make_sub_dir(sub_dir_name='path_dir') 58 | self.ts_guesses_dir = self.make_sub_dir(sub_dir_name='preliminary_ts_guesses') 59 | self.final_guess_dir = self.make_sub_dir(sub_dir_name='final_ts_guess') 60 | else: 61 | self.path_dir = None 62 | self.final_guess_dir = None 63 | 64 | self.ts_guess_list = None 65 | 66 | def determine_ts(self, xtb=True, method='UB3LYP', basis_set='6-31G**'): 67 | """ 68 | Determine the transition state for the given optimization parameters. 69 | 70 | Parameters: 71 | - xtb (bool, optional): Use external XTB for optimization. 72 | - method (str, optional): Level of theory for DFT optimization. 73 | - basis_set (str, optional): Basis set for DFT optimization. 74 | 75 | Returns: 76 | - bool: True if transition state is found, False otherwise. 77 | """ 78 | if self.ts_guess_list is None: 79 | return False 80 | 81 | if xtb: 82 | if self.xtb_solvent is not None: 83 | method = f'external="{self.xtb_external_path} alpb={self.xtb_solvent}"' 84 | else: 85 | method = f'external="{self.xtb_external_path}"' 86 | basis_set = '' 87 | 88 | if self.dft_solvent is not None and not xtb: 89 | extra_commands = f'opt=(ts, calcall, noeigen, nomicro, MaxCycles={self.max_cycles}) SCRF=(Solvent={self.dft_solvent}, smd)' 90 | else: 91 | extra_commands = f'opt=(ts, calcall, noeigen, nomicro, MaxCycles={self.max_cycles})' 92 | 93 | remove_files_in_directory(self.g16_dir) 94 | 95 | for i, guess_file in enumerate(self.ts_guess_list): 96 | ts_search_inp_file = self.generate_g16_input_ts_opt( 97 | i, guess_file, method=method, basis_set=basis_set, extra_commands=extra_commands) 98 | os.chdir(self.reaction_dir) 99 | log_file = run_g16_ts_optimization(ts_search_inp_file) 100 | success = self.confirm_opt_transition_state(log_file, xtb, method, basis_set) 101 | 102 | if success: 103 | xyz_file = f'{os.path.splitext(log_file)[0]}.xyz' 104 | self.save_final_ts_guess_files(xyz_file, log_file) 105 | return True 106 | 107 | return False 108 | 109 | def set_ts_guess_list(self, reactive_complex_factor): 110 | """ 111 | Set the list of transition state guesses based on the given reactive complex factor. 112 | 113 | Parameters: 114 | - reactive_complex_factor: Reactive complex factor value. 115 | """ 116 | path = self.set_up_path_generator(reactive_complex_factor) 117 | ts_guess_list = self.obtain_ts_guesses_for_given_reactive_complex_factor(path)[:5] 118 | 119 | if ts_guess_list is not None: 120 | self.save_ts_guesses(ts_guess_list) 121 | 122 | self.ts_guess_list = ts_guess_list 123 | 124 | def modify_ts_guess_list(self, xyz_file_list): 125 | """ 126 | Modify the list of transition state guess list if you already have a good guess. 127 | 128 | Parameters: 129 | - xyz_file_list (list): List of XYZ file paths for transition state guesses. 130 | """ 131 | self.ts_guess_list = xyz_file_list 132 | 133 | 134 | def set_up_path_generator(self, reactive_complex_factor, n_conf=100): 135 | """ 136 | Set up a path generator for the given reactive complex factor. 137 | 138 | Parameters: 139 | - reactive_complex_factor: Reactive complex factor value. 140 | - n_conf (int, optional): Number of conformations. 141 | 142 | Returns: 143 | - PathGenerator: Instance of the path generator. 144 | """ 145 | # if intermolecular, immediately set up the PathGenerator object 146 | if '.' in self.reactant_smiles: 147 | path = PathGenerator( 148 | self.reactant_smiles, self.product_smiles, self.rxn_id, self.path_dir, self.rp_geometries_dir, 149 | self.xtb_solvent, reactive_complex_factor, self.freq_cut_off, self.charge, self.multiplicity, n_conf=n_conf 150 | ) 151 | else: 152 | # Quick run to see if inversion is needed 153 | path = PathGenerator( 154 | self.reactant_smiles, self.product_smiles, self.rxn_id, self.path_dir, self.rp_geometries_dir, 155 | self.xtb_solvent, reactive_complex_factor, self.freq_cut_off, self.charge, self.multiplicity, n_conf=1 156 | ) 157 | if len(path.formed_bonds) < len(path.broken_bonds) and '.' not in self.reactant_smiles: 158 | path = PathGenerator( 159 | self.product_smiles, self.reactant_smiles, self.rxn_id, self.path_dir, self.rp_geometries_dir, 160 | self.xtb_solvent, reactive_complex_factor, self.freq_cut_off, self.charge, self.multiplicity, n_conf=n_conf 161 | ) 162 | else: 163 | path = PathGenerator( 164 | self.reactant_smiles, self.product_smiles, self.rxn_id, self.path_dir, self.rp_geometries_dir, 165 | self.xtb_solvent, reactive_complex_factor, self.freq_cut_off, self.charge, self.multiplicity, n_conf=n_conf 166 | ) 167 | 168 | return path 169 | 170 | def obtain_ts_guesses_for_given_reactive_complex_factor(self, path): 171 | """ 172 | Obtain transition state guesses for the given reactive complex factor. 173 | 174 | Parameters: 175 | - path: Path generator instance. 176 | 177 | Returns: 178 | - list or None: List of transition state guess files if found, None otherwise. 179 | """ 180 | for _ in range(5): 181 | energies, potentials, path_xyz_files = path.get_path() 182 | if energies is not None: 183 | true_energies = list(np.array(energies) - np.array(potentials)) 184 | guesses_list = self.determine_and_filter_local_maxima(true_energies, path_xyz_files, path.charge, path.multiplicity, path.solvent) 185 | if len(guesses_list) > 0: 186 | return guesses_list 187 | 188 | return None 189 | 190 | def determine_and_filter_local_maxima(self, true_energies, path_xyz_files, charge, multiplicity, solvent): 191 | """ 192 | Determine and filter local maxima in the path. 193 | 194 | Parameters: 195 | - true_energies (list): List of true energy values. 196 | - path_xyz_files (list): List of path XYZ files. 197 | - charge (int): Charge information. 198 | - multiplicity (int): Multiplicity information. 199 | 200 | Returns: 201 | - list: List of ranked transition state guess files based on energy. 202 | """ 203 | # Find local maxima in path 204 | indices_local_maxima = find_local_max_indices(true_energies) 205 | 206 | # Validate the local maxima and store their energy values 207 | ts_guess_dict = {} 208 | idx_local_maxima_correct_mode = [] 209 | for index in indices_local_maxima: 210 | ts_guess_file, _ = validate_ts_guess(path_xyz_files[index], self.reaction_dir, self.freq_cut_off, charge, multiplicity, solvent) 211 | if ts_guess_file is not None: 212 | idx_local_maxima_correct_mode.append(index) 213 | ts_guess_dict[ts_guess_file] = true_energies[index] 214 | 215 | # Sort guesses based on energy 216 | sorted_guess_dict = sorted(ts_guess_dict.items(), key=lambda x: x[1], reverse=True) 217 | ranked_guess_files = [item[0] for item in sorted_guess_dict] 218 | 219 | return ranked_guess_files 220 | 221 | def make_work_dir(self): 222 | """ 223 | Create and return the main working directory. 224 | 225 | Returns: 226 | - str: Path to the main working directory. 227 | """ 228 | dir_name = f'reaction_{self.rxn_id}' 229 | if dir_name in os.listdir(os.getcwd()): 230 | shutil.rmtree(os.path.join(os.getcwd(), dir_name)) 231 | os.makedirs(os.path.join(os.getcwd(), dir_name)) 232 | 233 | return os.path.join(os.getcwd(), dir_name) 234 | 235 | def make_sub_dir(self, sub_dir_name): 236 | """ 237 | Create and return a subdirectory within the reaction directory. 238 | 239 | Parameters: 240 | - sub_dir_name (str): Name of the subdirectory. 241 | 242 | Returns: 243 | - str: Path to the created subdirectory. 244 | """ 245 | if sub_dir_name in os.listdir(self.reaction_dir): 246 | shutil.rmtree(os.path.join(self.reaction_dir, sub_dir_name)) 247 | os.makedirs(os.path.join(self.reaction_dir, sub_dir_name)) 248 | 249 | return os.path.join(self.reaction_dir, sub_dir_name) 250 | 251 | def save_ts_guesses(self, ts_guesses_list): 252 | """ 253 | Save transition state guess files to the ts_guesses_dir. 254 | 255 | Parameters: 256 | - ts_guesses_list (list): List of transition state guess files. 257 | """ 258 | for i, ts_guess_file in enumerate(ts_guesses_list): 259 | shutil.copy(ts_guess_file, self.ts_guesses_dir) 260 | os.rename( 261 | os.path.join(self.ts_guesses_dir, os.path.basename(ts_guess_file)), 262 | os.path.join(self.ts_guesses_dir, f'ts_guess_{i}.xyz') 263 | ) 264 | 265 | def generate_g16_input_ts_opt(self, idx, file_name, method, basis_set='', 266 | extra_commands='opt=(ts, calcall, noeigen, nomicro, MaxCycles=30)'): 267 | """ 268 | Generate Gaussian 16 input file for transition state optimization. 269 | 270 | Parameters: 271 | - idx (int): Index of the transition state guess. 272 | - file_name (str): Name of the transition state guess file. 273 | - method (str): Level of theory for optimization. 274 | - basis_set (str, optional): Basis set for optimization. 275 | - extra_commands (str, optional): Additional Gaussian commands. 276 | 277 | Returns: 278 | - str: Path to the generated Gaussian input file. 279 | """ 280 | ts_search_inp_file = os.path.join(self.g16_dir, f'ts_guess_{idx}.com') 281 | xyz_to_gaussian_input( 282 | os.path.join(self.path_dir, file_name), ts_search_inp_file, 283 | method=method, basis_set=basis_set, extra_commands=extra_commands, 284 | charge=self.charge, multiplicity=self.multiplicity, mem=self.mem, 285 | proc=self.proc 286 | ) 287 | 288 | return ts_search_inp_file 289 | 290 | def confirm_opt_transition_state(self, log_file, xtb=True, method='UB3LYP', basis_set='6-31G**'): 291 | """ 292 | Confirm the optimized transition state by performing IRC calculations. 293 | 294 | Parameters: 295 | - log_file (str): Path to the Gaussian log file. 296 | - xtb (bool, optional): Use external XTB for IRC calculations. 297 | - method (str, optional): Level of theory for IRC calculations. 298 | - basis_set (str, optional): Basis set for IRC calculations. 299 | 300 | Returns: 301 | - bool: True if the optimized transition state is confirmed, False otherwise. 302 | """ 303 | try: 304 | extract_transition_state_geometry(log_file, f'{os.path.splitext(log_file)[0]}.xyz') 305 | if xtb: 306 | irc_input_file_f, irc_input_file_r = generate_gaussian_irc_input( 307 | f'{os.path.splitext(log_file)[0]}.xyz', 308 | output_prefix=f'{os.path.splitext(log_file)[0]}_irc', 309 | method=self.xtb_external_path, 310 | mem=self.mem, proc=self.proc, 311 | solvent=self.xtb_solvent, charge=self.charge, multiplicity=self.multiplicity 312 | ) 313 | else: 314 | irc_input_file_f, irc_input_file_r = generate_gaussian_irc_input( 315 | f'{os.path.splitext(log_file)[0]}.xyz', 316 | output_prefix=f'{os.path.splitext(log_file)[0]}_irc', 317 | method=f'{method}/{basis_set} ', 318 | mem=self.mem, proc=self.proc, 319 | solvent=self.dft_solvent, charge=self.charge, multiplicity=self.multiplicity 320 | ) 321 | 322 | run_irc(irc_input_file_f) 323 | run_irc(irc_input_file_r) 324 | extract_irc_geometries(f'{os.path.splitext(irc_input_file_f)[0]}.log', 325 | f'{os.path.splitext(irc_input_file_r)[0]}.log') 326 | 327 | reaction_correct = compare_molecules_irc( 328 | f'{os.path.splitext(irc_input_file_f)[0]}.xyz', 329 | f'{os.path.splitext(irc_input_file_r)[0]}.xyz', 330 | os.path.join(self.rp_geometries_dir, 'reactants_geometry.xyz'), 331 | os.path.join(self.rp_geometries_dir, 'products_geometry.xyz'), 332 | self.charge, self.multiplicity, self.xtb_solvent 333 | ) 334 | 335 | return reaction_correct 336 | 337 | except Exception: 338 | return False 339 | 340 | def reaction_is_intramolecular(self): 341 | """ 342 | Check if the reaction is intramolecular based on the number of reactant components. 343 | 344 | Returns: 345 | - bool: True if the reaction is intramolecular, False otherwise. 346 | """ 347 | path = self.set_up_path_generator(reactive_complex_factor=1.2, n_conf=1) 348 | if len(path.reactant_smiles.split('.')) == 1: 349 | return True 350 | else: 351 | return False 352 | 353 | # TODO: What about triplet states? 354 | def get_charge_and_multiplicity(self): 355 | """ 356 | Get the charge and multiplicity of the reactant molecule. 357 | 358 | Returns: 359 | - tuple: (charge, multiplicity) 360 | """ 361 | mol = Chem.MolFromSmiles(self.reactant_smiles, ps) 362 | charge = Chem.GetFormalCharge(mol) 363 | total_electrons = 0 364 | 365 | for atom in mol.GetAtoms(): 366 | # Add the atomic number 367 | total_electrons += atom.GetAtomicNum() 368 | 369 | # subtract the net charge 370 | total_electrons -= charge 371 | multiplicity = total_electrons % 2 + 1 372 | 373 | return charge, multiplicity 374 | 375 | def save_final_ts_guess_files(self, xyz_file, log_file): 376 | """ 377 | Save the final transition state guess files to the final_guess_dir. 378 | 379 | Parameters: 380 | - xyz_file (str): Path to the XYZ file. 381 | - log_file (str): Path to the log file. 382 | 383 | Returns: 384 | - None 385 | """ 386 | shutil.copy(xyz_file, self.final_guess_dir) 387 | shutil.copy(log_file, self.final_guess_dir) 388 | 389 | 390 | def find_local_max_indices(numbers): 391 | """ 392 | Find indices of local maxima in a list of numbers. 393 | 394 | Parameters: 395 | - numbers (list): List of numbers. 396 | 397 | Returns: 398 | - list: List of indices corresponding to local maxima. 399 | """ 400 | local_max_indices = [] 401 | for i in range(len(numbers) - 2, 0, -1): 402 | if numbers[i] > numbers[i - 1] and numbers[i] > numbers[i + 1]: 403 | local_max_indices.append(i) 404 | return local_max_indices 405 | -------------------------------------------------------------------------------- /src/tstools/utils.py: -------------------------------------------------------------------------------- 1 | import os 2 | from rdkit import Chem 3 | import subprocess 4 | import shutil 5 | import time 6 | 7 | ps = Chem.SmilesParserParams() 8 | ps.removeHs = False 9 | 10 | 11 | def xyz_to_gaussian_input(xyz_file, output_file, method='UB3LYP', basis_set='6-31G(d,p)', 12 | extra_commands='opt=(calcfc,ts, noeigen) freq=noraman', charge=0, 13 | multiplicity=1, mem='2GB', proc=2): 14 | """ 15 | Convert an XYZ file to Gaussian 16 input file format. 16 | 17 | Args: 18 | xyz_file (str): Path to the XYZ file. 19 | output_file (str): Path to the output Gaussian input file to be created. 20 | method (str, optional): The method to be used in the Gaussian calculation. Default is 'B3LYP'. 21 | basis_set (str, optional): The basis set to be used in the Gaussian calculation. Default is '6-31G(d)'. 22 | mem (str, optional): Amount of memory to allocate for the calculations (default is '2GB'). 23 | proc (int, optional): Number of processor cores to use for the calculations (default is 2). 24 | """ 25 | filename = xyz_file.split('/')[-1].split('.xyz')[0] 26 | 27 | with open(xyz_file, 'r') as xyz: 28 | atom_lines = xyz.readlines()[2:] # Skip the first two lines (number of atoms and comment) 29 | 30 | with open(output_file, 'w') as gaussian_input: 31 | # Write the route section 32 | if 'external' in method: 33 | gaussian_input.write(f'%Chk={filename}.chk\n# {method} {extra_commands}') 34 | else: 35 | gaussian_input.write(f'%Chk={filename}.chk\n%nproc={proc}\n%Mem={mem}\n# {method}/{basis_set} {extra_commands}') 36 | 37 | # Write the title section 38 | gaussian_input.write('\n\nTitle\n\n') 39 | 40 | # Write the charge and multiplicity section 41 | gaussian_input.write(f'{charge} {multiplicity}\n') 42 | 43 | # Write the Cartesian coordinates section 44 | for line in atom_lines: 45 | atom_info = line.split() 46 | element = atom_info[0] 47 | x, y, z = atom_info[1:4] 48 | gaussian_input.write(f'{element} {x} {y} {z}\n') 49 | 50 | # Write the blank line and the end of the input file 51 | gaussian_input.write('\n') 52 | 53 | print(f'Gaussian input file "{output_file}" has been created.') 54 | 55 | 56 | def write_xyz_file_from_ade_atoms(atoms, filename): 57 | """ 58 | Write an XYZ file from the ADE atoms object. 59 | 60 | Args: 61 | atoms: The ADE atoms object. 62 | filename: The name of the XYZ file to write. 63 | """ 64 | with open(filename, 'w') as f: 65 | f.write(str(len(atoms)) + '\n') 66 | f.write('Generated by write_xyz_file()\n') 67 | for atom in atoms: 68 | f.write(f'{atom.atomic_symbol} {atom.coord[0]:.6f} {atom.coord[1]:.6f} {atom.coord[2]:.6f}\n') 69 | 70 | 71 | def write_final_geometry_to_xyz(log_file_path): 72 | """ 73 | Extract and write the final geometry from a Gaussian log file to an XYZ file. 74 | 75 | Parameters: 76 | - log_file_path (str): Path to the Gaussian log file. 77 | 78 | Returns: 79 | str: Path to the generated XYZ file. 80 | """ 81 | final_geometry = [] 82 | reading_geometry = False 83 | after_transition_state_opt = False 84 | 85 | xyz_file_path = os.path.splitext(log_file_path)[0] + ".xyz" 86 | 87 | try: 88 | with open(log_file_path, 'r') as log_file: 89 | for line in log_file: 90 | if 'Stationary point found' in line: 91 | after_transition_state_opt = True 92 | if after_transition_state_opt: 93 | if 'Standard orientation' in line: 94 | reading_geometry = True 95 | final_geometry = [] 96 | elif reading_geometry: 97 | # Lines with atomic coordinates are indented 98 | columns = line.split() 99 | if len(columns) == 6: 100 | try: 101 | atom_info = { 102 | 'atom': int(columns[0]), 103 | 'symbol': int(columns[1]), 104 | 'x': float(columns[3]), 105 | 'y': float(columns[4]), 106 | 'z': float(columns[5]) 107 | } 108 | final_geometry.append(atom_info) 109 | except: 110 | continue 111 | else: 112 | if len(final_geometry) != 0 and '-----------------------------' in line: 113 | break 114 | 115 | if len(final_geometry) != 0: 116 | with open(xyz_file_path, 'w') as xyz_file: 117 | num_atoms = len(final_geometry) 118 | xyz_file.write(f"{num_atoms}\n") 119 | xyz_file.write("Final geometry extracted from Gaussian log file\n") 120 | for atom_info in final_geometry: 121 | xyz_file.write(f"{atom_info['symbol']} {atom_info['x']:.6f} {atom_info['y']:.6f} {atom_info['z']:.6f}\n") 122 | 123 | except FileNotFoundError: 124 | print(f"File not found: {log_file_path}") 125 | 126 | return xyz_file_path 127 | 128 | 129 | def run_g16_ts_optimization(file_path): 130 | """ 131 | Run Gaussian 16 for transition state optimization. 132 | 133 | Parameters: 134 | - file_path (str): Path to the Gaussian input file. 135 | 136 | Returns: 137 | str: Path to the Gaussian log file. 138 | """ 139 | # Run Gaussian 16 using nohup and redirect stderr to /dev/null 140 | log_file = os.path.splitext(file_path)[0] + ".log" 141 | out_file = os.path.splitext(file_path)[0] + ".out" 142 | 143 | with open(out_file, 'w') as out: 144 | subprocess.run( 145 | f"g16 < {file_path} > {log_file}", 146 | shell=True, 147 | stdout=out, 148 | stderr=subprocess.DEVNULL, 149 | ) 150 | 151 | return log_file 152 | 153 | 154 | def run_irc(input_file): 155 | """ 156 | Run IRC (Intrinsic Reaction Coordinate) calculation using Gaussian 16. 157 | 158 | Parameters: 159 | - input_file (str): Path to the Gaussian input file. 160 | 161 | Returns: 162 | None 163 | """ 164 | out_file = f'{input_file[:-4]}.out' 165 | log_file = f'{input_file[:-4]}.log' 166 | 167 | with open(out_file, 'w') as out: 168 | subprocess.run( 169 | f"g16 < {input_file} >> {log_file}", 170 | shell=True, 171 | stdout=out, 172 | stderr=subprocess.DEVNULL, 173 | ) 174 | 175 | 176 | def copy_final_outputs(work_dir, output_dir): 177 | """ 178 | Copy final outputs from a working directory to an output directory. 179 | 180 | Parameters: 181 | - work_dir (str): Path to the working directory. 182 | - output_dir (str): Path to the output directory. 183 | 184 | Returns: 185 | None 186 | """ 187 | os.makedirs(output_dir, exist_ok=True) 188 | for reaction_dir in os.listdir(work_dir): 189 | try: 190 | final_ts_guess_dir = os.path.join(os.path.join(work_dir, reaction_dir), 'final_ts_guess') 191 | if len(os.listdir(final_ts_guess_dir)) != 0: 192 | shutil.copytree(final_ts_guess_dir, os.path.join(output_dir, f'final_outputs_{reaction_dir}')) 193 | shutil.copy(os.path.join(os.path.join(work_dir, reaction_dir), 'rp_geometries/reactants_geometry.xyz'), 194 | os.path.join(output_dir, f'final_outputs_{reaction_dir}/')) 195 | shutil.copy(os.path.join(os.path.join(work_dir, reaction_dir), 'rp_geometries/products_geometry.xyz'), 196 | os.path.join(output_dir, f'final_outputs_{reaction_dir}/')) 197 | except: 198 | continue 199 | 200 | 201 | def remove_files_in_directory(directory): 202 | """ 203 | Remove all files in a directory, keeping the directory structure intact. 204 | 205 | Parameters: 206 | - directory (str): Path to the directory. 207 | 208 | Returns: 209 | None 210 | """ 211 | try: 212 | # List all items in the directory 213 | items = os.listdir(directory) 214 | 215 | # Iterate over each item and remove only files 216 | for item_name in items: 217 | item_path = os.path.join(directory, item_name) 218 | 219 | if os.path.isfile(item_path): 220 | os.remove(item_path) 221 | elif os.path.isdir(item_path): 222 | continue 223 | 224 | except Exception as e: 225 | print(f"Error during file removal: {e}") 226 | 227 | 228 | def get_reaction_list(filename): 229 | ''' a function that opens a file, reads in every line as a reaction smiles and returns them as a list. ''' 230 | with open(filename, 'r') as f: 231 | lines = f.readlines() 232 | reaction_list = [line.rstrip().split() for line in lines] 233 | return reaction_list 234 | 235 | 236 | def setup_dir(target_dir): 237 | """ 238 | Read reaction SMILES from a file and return them as a list. 239 | 240 | Parameters: 241 | - filename (str): Path to the file containing reaction SMILES. 242 | 243 | Returns: 244 | list: List of reaction SMILES. 245 | """ 246 | if target_dir in os.listdir(): 247 | shutil.rmtree(target_dir) 248 | os.mkdir(target_dir) 249 | 250 | 251 | def print_statistics(successful_reactions, start_time): 252 | """ 253 | Print statistics including the number of successful reactions and the time taken. 254 | 255 | Parameters: 256 | - successful_reactions (list): List of successful reactions. 257 | - start_time (float): Start time of the process. 258 | 259 | Returns: 260 | None 261 | """ 262 | end_time = time.time() 263 | print(f'Successful reactions: {successful_reactions}') 264 | print(f'Number of successful reactions: {len(successful_reactions)}') 265 | print(f'Time taken: {end_time - start_time}') 266 | 267 | 268 | class NotConverged(Exception): 269 | def __init__(self, rxn_id): 270 | message = f'xTB calculation not converged for {rxn_id}...' 271 | super().__init__(message) 272 | 273 | 274 | def extract_geom_from_xyz(filename): 275 | """ 276 | Extract geometry from a XYZ file 277 | 278 | Parameters: 279 | - filename (str): Path to a XYZ file 280 | 281 | Returns: 282 | geom (list): Geometry 283 | """ 284 | 285 | with open(filename, 'r') as file: 286 | lines = file.readlines() 287 | 288 | geom = [] 289 | for line in lines[2:]: 290 | if line.isspace(): 291 | break 292 | geom.append(line) 293 | 294 | return geom 295 | 296 | 297 | def extract_geom_from_crest_ensemble(filename, number): 298 | """ 299 | Extract geometries from a XYZ file with an ensemble of conformers (CREST) 300 | 301 | Parameters: 302 | - lines (list): Lines of XYZ file 303 | - number (int): How many conformers 304 | 305 | Return: 306 | geoms (list): Geometries 307 | """ 308 | 309 | with open(filename, 'r') as file: 310 | lines = file.readlines() 311 | 312 | geoms = [] 313 | 314 | num_atoms = int(lines[0]) 315 | lines_ind_xyz = num_atoms + 2 316 | 317 | for i in range(number): 318 | geom = lines[i*lines_ind_xyz + 2:(i+1)*lines_ind_xyz] 319 | geoms.append(geom) 320 | 321 | return geoms 322 | 323 | 324 | def create_input_file_opt_g16(name, geom, charge, multiplicity, mem, proc, extra_commands=None, 325 | modredundant=None, splitter=None, functional='UB3LYP', basis_set='6-31G', solvent=None): 326 | """ 327 | Function to generate input of Gaussian 328 | Args: 329 | name (str): final name of the input 330 | geom (list): list with the coordinates 331 | charge (int): charge 332 | multiplicity (int): multiplicity 333 | mem (str): Specifies the memory requested in the Gaussian16 .com files 334 | proc (int): number of CPUs 335 | extra_commands (str): add other commands, example: field=M+N 336 | modredundant (list): constraints 337 | splitter (str): separator for the string 338 | functional (str): functional 339 | basis_set (str): basis_set 340 | solvent (str): solvent 341 | 342 | Return: 343 | Create input file for loose opt 344 | """ 345 | 346 | if not extra_commands: 347 | extra_commands = "" 348 | 349 | if modredundant: 350 | modredundant_keyword = ', modredundant)' 351 | else: 352 | modredundant_keyword = ")" 353 | 354 | if solvent: 355 | solvent_keyword = f"scrf=(SMD, solvent={solvent})" 356 | else: 357 | solvent_keyword = " " 358 | 359 | route_link_opt = f"# {functional} {basis_set} Nosymm {solvent_keyword} {extra_commands} " 360 | route_link_opt += f"opt=(tight {modredundant_keyword}\n\n" 361 | 362 | coordinates = [] 363 | 364 | for atom in geom: 365 | elements = len(atom.split(splitter)) 366 | if elements == 5: 367 | label, _, x, y, z = atom.split(splitter) 368 | else: 369 | label, x, y, z = atom.split(splitter) 370 | coordinates.append(f"{label} {x} {y} {z}") 371 | 372 | with open(f"{name}.com", 'w') as file: 373 | 374 | file.write(f"%nprocshared={proc}\n") 375 | file.write(f"%mem={mem}\n") 376 | file.write(f"{route_link_opt}") 377 | file.write("opt \n\n") 378 | file.write(f"{charge} {multiplicity}\n") 379 | for coordinate in coordinates: 380 | file.write(f"{coordinate}\n") 381 | if modredundant: 382 | file.write('\n') 383 | for constraint in modredundant: 384 | file.write(f"{constraint}\n") 385 | file.write("\n\n") 386 | 387 | 388 | def extract_g16_energy(filename): 389 | """ 390 | Extract energy from a Gaussian16 output 391 | 392 | Parameters: 393 | - filename (str): Path to the Gaussian output 394 | 395 | Returns: 396 | - energy (float): Energy 397 | """ 398 | 399 | with open(filename, 'r') as file: 400 | lines = file.readlines()[::-1] 401 | 402 | for line in lines: 403 | 404 | if 'Error termination' in line: 405 | return None 406 | 407 | if line.startswith(' SCF Done'): 408 | energy = float(line.split()[4]) 409 | break 410 | 411 | return energy 412 | 413 | 414 | 415 | 416 | 417 | if __name__ == '__main__': 418 | write_final_geometry_to_xyz('logs/ts_guess_2.log') 419 | -------------------------------------------------------------------------------- /xtb_external_script/xtb_external.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # n.b. chmod 755 3 | 4 | # TODO: Give ekstra kwd through gaussian - use to define solvent. 5 | 6 | import sys 7 | import os 8 | import fortranformat as ff 9 | import numpy as np 10 | 11 | from rdkit import Chem 12 | 13 | __XTB_PATH__ = os.environ.get("XTB_PATH", None) 14 | if __XTB_PATH__ is None: 15 | raise RuntimeError("Path to xtb executable not set via environment variable 'XTB_PATH'.") 16 | 17 | 18 | def parse_ifile(ifile): 19 | """ parse the ifile from xTB""" 20 | 21 | pt = Chem.GetPeriodicTable() 22 | 23 | with open(ifile, "r") as ifile: 24 | gau_input = ifile.readlines() 25 | 26 | tokens = gau_input[0].split() 27 | 28 | natoms = int(tokens[0]) 29 | nderiv = int(tokens[1]) 30 | chrg = int(tokens[2]) 31 | spin = int(tokens[3]) 32 | 33 | coords = np.empty((natoms, 3)) 34 | atomtypes = [] 35 | for i, line in enumerate(gau_input[1 : 1 + natoms]): 36 | line = line.split() 37 | atomtypes.append(pt.GetElementSymbol(int(line[0]))) 38 | coords[i] = np.array(list(map(float, line[1 : 1 + 3]))) * 0.529177249 39 | return natoms, nderiv, chrg, spin, atomtypes, coords 40 | 41 | 42 | def parse_ofile(ofile, energy, natoms, dipole, gradient=None, hessian=None): 43 | """ 44 | parse that outfule for Gaussian to read. 45 | """ 46 | headformat = ff.FortranRecordWriter("4D20.12") 47 | bodyformat = ff.FortranRecordWriter("3D20.12") 48 | 49 | f = open(ofile, "w") 50 | head = [energy, dipole[0], dipole[1], dipole[2]] 51 | headstring = headformat.write(head) 52 | f.write(headstring + "\n") 53 | 54 | if gradient is None: 55 | gradient = np.zeros((natoms, 3)) 56 | 57 | for i in range(natoms): 58 | output = bodyformat.write(gradient[i]) 59 | f.write(output + "\n") 60 | 61 | # polarizability and dipole derivatives are set to zero 62 | polarizability = np.zeros((2, 3)) 63 | dipole_derivative = np.zeros((3 * natoms, 3)) 64 | 65 | for i in range(2): 66 | output = bodyformat.write(polarizability[i]) 67 | f.write(output + "\n") 68 | 69 | for i in range(3 * natoms): 70 | output = bodyformat.write(dipole_derivative[i]) 71 | f.write(output + "\n") 72 | 73 | if hessian is not None: # Only needed if ndreiv = 1 74 | #print(hessian.shape) 75 | tril = np.tril_indices(hessian.shape[0]) 76 | tril_hessian = hessian[tril] 77 | for window in tril_hessian.reshape(int(tril_hessian.shape[0] / 3), 3): 78 | output = bodyformat.write(window) 79 | f.write(output + "\n") 80 | 81 | f.close() 82 | 83 | 84 | def write_xyz(natoms, atomtypes, coords): 85 | """ Write .xyz file """ 86 | xyz = f"{natoms} \n \n" 87 | for atomtype, coord in zip(atomtypes, coords): 88 | xyz += f"{atomtype} {' '.join(list(map(str, coord)))} \n" 89 | 90 | with open("mol.xyz", "w") as inp: 91 | inp.write(xyz) 92 | 93 | 94 | def get_energy(output): 95 | """ """ 96 | for line in output.split("\n"): 97 | if "TOTAL ENERGY" in line: 98 | return float(line.split()[3]) 99 | 100 | 101 | def get_dipole(output): 102 | """ """ 103 | tmp_output = output.split("molecular dipole:") 104 | del tmp_output[0] 105 | 106 | dipole_data = tmp_output[0].split("\n") 107 | dipole_line = dipole_data[3].split() 108 | 109 | dipole = np.array([dipole_line[1], dipole_line[2], dipole_line[3]], dtype=float) 110 | return dipole 111 | 112 | 113 | def get_gradient(natoms): 114 | """ """ 115 | with open("gradient") as grad_file: 116 | gradient_file = grad_file.read() 117 | 118 | gradient_data = gradient_file.split("\n") 119 | del gradient_data[: 2 + natoms] 120 | 121 | gradient = np.empty((natoms, 3)) 122 | for i, line in enumerate(gradient_data[:natoms]): 123 | line = line.split() 124 | gradient[i, :] = line 125 | return gradient 126 | 127 | 128 | def get_hessian(natoms): 129 | """ """ 130 | hess_file = open("hessian", "r") 131 | 132 | i = 0 133 | hessian = np.empty(3 * natoms * 3 * natoms) 134 | for line in hess_file: 135 | if "$hessian" in line: 136 | continue 137 | 138 | for elm in line.strip().split(): 139 | hessian[i] = float(elm) 140 | i += 1 141 | 142 | hess_file.close() 143 | 144 | hessian = hessian.reshape((3 * natoms, 3 * natoms)) 145 | return hessian 146 | 147 | 148 | def run_xtb(natoms, nderiv, chrg, spin, atomtypes, coords, solvent=None): 149 | """ """ 150 | 151 | write_xyz(natoms, atomtypes, coords) 152 | 153 | os.environ["OMP_NUM_THREADS"] = str(2) 154 | os.environ["MKL_NUM_THREADS"] = str(2) 155 | cmd = f"xtb mol.xyz --chrg {chrg} --uhf {spin - 1} --gfn 2 " 156 | if nderiv == 1: 157 | cmd += "--grad " 158 | elif nderiv == 2: 159 | cmd += "--hess --grad " 160 | 161 | if solvent is not None: 162 | method, solvent = solvent.split('=') 163 | cmd += f"--{method} {solvent} " 164 | 165 | print(cmd) 166 | with os.popen(cmd) as xtb: 167 | output = xtb.read() 168 | 169 | energy = get_energy(output) 170 | dipole = get_dipole(output) 171 | 172 | return energy, dipole 173 | 174 | 175 | def clean_dir(): 176 | """ delete all files """ 177 | files = [ 178 | "energy", 179 | "charges", 180 | "mol.xyz", 181 | "xtbrestart", 182 | "gradient", 183 | "hessian", 184 | "vibspectrum", 185 | "wbo", 186 | "mol.engrad", 187 | "xtbtopo.mol", 188 | "g98.out", 189 | "xtbhess.xyz", 190 | ] 191 | for _file in files: 192 | if os.path.exists(_file): 193 | os.remove(_file) 194 | 195 | 196 | if __name__ == "__main__": 197 | 198 | solvent = None 199 | 200 | if len(sys.argv[1]) > 7: # given ekstra kwd 201 | for i, kwd in enumerate(sys.argv): 202 | if kwd == "R": 203 | break 204 | 205 | if "gbsa" or "alpb" in kwd: 206 | solvent = kwd 207 | 208 | ifile=sys.argv[i+1] 209 | ofile=sys.argv[i+2] 210 | 211 | else: 212 | ifile = sys.argv[2] 213 | ofile = sys.argv[3] 214 | 215 | (natoms, nderiv, chrg, spin, atomtypes, coords) = parse_ifile(ifile) 216 | energy, dipole = run_xtb(natoms, nderiv, chrg, spin, atomtypes, coords, solvent=solvent) 217 | 218 | if nderiv == 0: 219 | parse_ofile(ofile, energy, natoms, dipole) 220 | elif nderiv == 1: 221 | gradient = get_gradient(natoms) 222 | parse_ofile(ofile, energy, natoms, dipole, gradient=gradient) 223 | elif nderiv == 2: 224 | gradient = get_gradient(natoms) 225 | hessian = get_hessian(natoms) 226 | parse_ofile(ofile, energy, natoms, dipole, gradient=gradient, hessian=hessian) 227 | 228 | clean_dir() 229 | --------------------------------------------------------------------------------