├── .gitattributes ├── CITATION.cff ├── LICENSE ├── README.md ├── pymm ├── __init__.py ├── conversions.py ├── eigvecs.py ├── free_en.py ├── inputs.py ├── pmm.py ├── pymm.py └── spectra.py ├── setup.py └── tests ├── doxo ├── README.md └── data │ ├── dipmat.dat │ ├── energies.dat │ ├── ref_geom.dat │ ├── topol.dat │ ├── topol.tpr │ └── traj.xtc ├── guanosine ├── README.md ├── ensemble_n │ ├── topol_n.dat │ └── traj_n.xtc ├── ensemble_rc │ ├── topol_rc.dat │ └── traj_rc.xtc ├── gua_n │ ├── dipmat_gua_n.dat │ ├── energies_gua_n.dat │ ├── geom_gua_n.dat │ └── guanine_n_charges.dat └── gua_rc │ ├── dipmat_gua_rc.dat │ ├── energies_gua_rc.dat │ ├── geom_gua_rc.dat │ └── guanine_rc_charges.dat └── water ├── README.md └── data ├── charges.dat ├── dipmat.dat ├── energies.dat ├── ref_geom_ang.dat ├── topol.dat ├── topol.tpr └── traj.xtc /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | *.{cmd,[cC][mM][dD]} text eol=crlf 3 | *.{bat,[bB][aA][tT]} text eol=crlf 4 | -------------------------------------------------------------------------------- /CITATION.cff: -------------------------------------------------------------------------------- 1 | cff-version: 1.2.0 2 | message: "If you use PyMM, please cite it as below!" 3 | preferred-citation: 4 | type: article 5 | authors: 6 | - family-names: "Chen" 7 | given-names: "Cheng Giuseppe" 8 | orcid: "https://orcid.org/0000-0003-3553-4718" 9 | - family-names: "Nardi" 10 | given-names: "Alessandro Nicola" 11 | orcid: "https://orcid.org/0000-0002-0959-1690" 12 | - family-names: "Amadei" 13 | given-names: "Andrea" 14 | orcid: "https://orcid.org/0000-0001-9488-0536" 15 | - family-names: "D'Abramo" 16 | given-names: "Marco" 17 | orcid: "https://orcid.org/0000-0001-6020-8581" 18 | doi: "https://doi.org/10.1021/acs.jctc.2c00767" 19 | journal: "Journal of Chemical Theory and Computation" 20 | #month: 9 21 | #start: 1 # First page number 22 | #end: 10 # Last page number 23 | title: "PyMM: An Open-Source Python Program for QM/MM Simulations Based on the Perturbed Matrix Method" 24 | #issue: 1 25 | #volume: 1 26 | #year: 2022 27 | url: "https://doi.org/10.1021/acs.jctc.2c00767" 28 | eprint: "https://doi.org/10.1021/acs.jctc.2c00767" 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PyMM 2 | 3 | PyMM is a program that allows you to easily apply the Perturbed Matrix Method [[1]](#pmm) to MD simulations (PMM-MD). In addition to the application of the method, it includes a suite of tools for: 4 | - the analysis of the dynamical behaviour of the electronic states 5 | - the evaluation of the electronic properties during the MD trajctory 6 | - the prediction of experimental properties such as the absorption spectrum and the free energy differences between two electronic states. 7 | 8 | For more information please read the article about PyMM [[2]](#pymm-article). 9 | 10 | ## Installation 11 | 12 | We recommend the installation of the required libraries via [Miniconda](https://docs.conda.io/en/latest/miniconda.html). 13 | Choose the suitable installer file for your system under the section _Latest Miniconda Installer Links_. 14 | Once the installer is downloaded you can proceed with the installation by following [these instructions](https://conda.io/projects/conda/en/latest/user-guide/install/index.html). 15 | 16 | If you are using Linux just run the following command: 17 | 18 | ``` 19 | bash Miniconda3-latest-Linux-x86_64.sh 20 | ``` 21 | 22 | Now create a new environment (e.g. "pmm"): 23 | ``` 24 | conda create --name pmm 25 | ``` 26 | 27 | Activate the new environment: 28 | ``` 29 | conda activate pmm 30 | ``` 31 | 32 | Now we are ready to install all the packages required to run PyMM: 33 | ``` 34 | conda install numpy matplotlib scipy numba pandas seaborn 35 | ``` 36 | ``` 37 | conda config --add channels conda-forge 38 | ``` 39 | ``` 40 | conda install mdanalysis 41 | ``` 42 | 43 | Move to the folder that contains setup.py and use the command: 44 | ``` 45 | cd pymm-path/pymm/ 46 | ``` 47 | 48 | ``` 49 | pip install . 50 | ``` 51 |

52 | ## Usage 53 | 54 | Before trying to launch the program, be sure that you have activated the correct environment (the one where the required libraries are installed). Then, you may proceed using the PyMM program. 55 | 56 | If you need help use: 57 | 58 | ``` 59 | pymm -h 60 | ``` 61 | 62 | It will list the modules currently implemented in PyMM. To launch these programs type: 63 | 64 | ``` 65 | pymm 66 | ``` 67 | 68 | or: 69 | 70 | ``` 71 | pymm -h 72 | ``` 73 | 74 | to obtain info on how to use them. 75 | 76 | ### run_pmm 77 | 78 | The main feature of PyMM is to perform MD-PMM calculations. This is done using the **run_pmm** program (arguments in "[ ]" are optional): 79 | 80 | ``` 81 | PyMM run_pmm -g geometry -gu [units] -dm dipole_matrix -e energies -ch [QC_atomic_charges] -traj traj.xtc -top traj.tpr -q [QC_charge] -nm 1:3 -o [eigvals.txt] -oc [eigvecs] 82 | ``` 83 | 84 | #### INPUTS 85 | 86 | * **-g** : QC reference geometry input file. Each line should be formatted as: 87 | 88 | ``` 89 | 90 | ``` 91 | 92 | > **NOTE**: The program also accepts other types of file formats. It will check and try to correct some common errors. This is mainly done to assure the compatibility with commonly used software. 93 | 94 | * -gu : units used in the QC geometry input file (default: Angstrom). 95 | 96 | * **-dm** : electric dipole matrix file (in a.u.). Each line should be formatted as: 97 | 98 | ``` 99 | 100 | ``` 101 | where and are the indices of the n-th and m-th electronic state 102 | 103 | * **-e** : electronic energies file (in a.u.). Each line should be formatted as: 104 | 105 | ``` 106 | 107 | ``` 108 | 109 | * -ch : file containing QC atomic charges for each electronic state. It should be formatted as follows: 110 | 111 | ``` 112 | ... 113 | ... 114 | ``` 115 | >**NOTE**: -ch is optional. When it is provided, the MD-PMM calculation will be performed by expanding the perturbation operator on each atom of the QC [[3]](#atom-pmm). If the QC atomic charges are not provided, by default **run_pmm** will run the calculation using the dipole approximation [[1]](#pmm). 116 | 117 | * **-traj** : XTC file of the MD trajectory. 118 | > **NOTE**: The quantum center needs to be centered in the simulation box before using the MD trajectory for the MD-PMM calculation. 119 | 120 | * **-top** : TPR file corresponding to the XTC file. It is necessary to obtain the topology and the MM charges. 121 | > **NOTE**: As an alternative, a text file listing the indexes and the charge of the atoms in the MD simulation can be used as the topology file. The file needs to be saved with the *.dat* extension in order to be recognized by PyMM. 122 | 123 | * -q : QC total charge. By default is 0. 124 | 125 | * **-nm** : select the atoms of the QC in the MD simulation according to the atom indexes (atom indexes should correspond to the MD simulation). Indexes start from 1. 126 | 127 | >**Selection Algebra**: 128 | >1. Use "**:**" to indicate a range. 129 | \ 130 | Example 1: select atoms from 1 to 5: 131 | \ 132 | -nm 1:5 133 | >2. Use "**,**" as the logical *and* operator. 134 | \ 135 | > Example 2: select atoms 1 and 5: 136 | \ 137 | -nm 1,5 138 | >3. Example 3: select atoms from 1 to 5 and 7: 139 | \ 140 | -nm 1:5,7 141 | 142 | > **NOTE**: Don't leave any whitespaces between the indexes. 143 | 144 | > **NOTE**: the selection system follows the bysum index-range selection mode of [MDAnalysis](https://docs.mdanalysis.org/stable/documentation_pages/selections.html), a library that PyMM relies on. 145 | 146 | * --match: reorder the QC reference geometry to match the atoms order in the MD simulation. It is useful when the geometry used for the quantum mechanical calculation does not match the order of the MD simulation. 147 | > **NOTE**: a wrong match of the QC atoms with respect to the MD simulation is a very common source of error. 148 | 149 | #### OUTPUT 150 | * -o: job name that will be used as a prefix to all the output files. (Default: pymm). The programs will output: QC geometry as an xyz file, eigenvalues and eigenvectors. 151 | 152 |

153 | 154 | ### eig 155 | **eig** is a tool to analyse the perturbed electronic states corresponding eigenvectors after the MD-PMM calculation. Given the dynamic nature of these states during the simulation, a straightforward description can be difficult. Therefore we provide three graphical representations which can be combined to present a clear picture of their behavior. 156 | 157 | #### **PROJECTIONS ANALYSIS** 158 | The contributions arising from two unperturbed states (i.e. the projection of the perturbed wavefunction on these two states) to a selected perturbed state are plotted against each other. 159 | 160 | Inputs 161 | 162 | * -i: eigenvectors trajectory (eigenvecs.npy). 163 | * -first: select the index of an unperturbed state. 164 | * -last: select the index of another unperturbed state. 165 | * -state: select the perturbed state to be considered. 166 | * -oc: select to plot the essential analysis. 167 | 168 | 169 | #### **COMPLETE PROJECTIONS ANALYSIS** 170 | The contributions to a selected perturbed state, arising from all the unperturbed states, are plotted against each other. 171 | 172 | Inputs 173 | 174 | * -i: eigenvectors trajectory (eigenvecs.npy). 175 | * -state: perturbed state to be considered. 176 | * -ot: select to plot the complete essential analysis. 177 | 178 | #### **CUMULATIVE HISTOGRAMS** 179 | The cumulative histograms of the average contribution of each unperturbed state to each perturbed state are plotted (i.e. calculate the squared mean coefficients with each unperturbed state contributing to each perturbed state). 180 | 181 | Inputs 182 | 183 | * -i: eigenvectors trajectory (eigenvecs.npy). 184 | * -state: select the number of states to consider 185 | * -oh: select to calculate the cumulative histograms 186 | 187 |

188 | > **NOTE**: Despite its simplicity in depicting the overall trends during the simulation, considering the average contribution can be misleading. This representation is preferably paired with an essential analysis. 189 | 190 | ### calc_abs 191 | 192 | **calc_abs** is a program used to calculate the absorption spectrum of the perturbed QC [[4]](#formald-uv). After running the MD-PMM calculation you can obtain the absorption spectrum from the output files using: 193 | 194 | ``` 195 | pymm calc_abs -dm dipmat -el eigvals.dat -ev eigvecs.npy -sigma [0.0003] -ot [abs_spectrum] 196 | ``` 197 | 198 | #### INPUTS 199 | * **-dm**: electric dipole matrix file (in a.u.) used in the MD-PMM calculation. 200 | * -el: trajectory of the perturbed eigenvalues. 201 | * -ev: trajectory of the perturbed eigenvectors. 202 | * -sigma: square root of the variance of the gaussian broadening applied to the signal (expressed in eV). Default: 0.05 eV. 203 | 204 | #### OUTPUTS 205 | * -ot: calculated absorption spectra names prefix (default: abs_spectrum). Both the total spectrum and each individual transition will be printed. 206 |

207 | ### free_en 208 | 209 | Calculate the free energy difference between two states (initial and final) each considered in the two ensembles (of the initial and final state) using the Zwanzig formula. 210 | 211 | ``` 212 | pymm free_en -T 298 -eii file1 -efi file2 -eif file3 -eff file4 213 | ``` 214 | 215 | #### INPUTS 216 | * -T: temperature (in Kelvin) at which the simulation is carried. Default: 298 K. 217 | * **-eii**: eigenvalues obtained from the MD-PMM calculation performed in the initial state ensemble and considering the QC in its initial state. 218 | * **-efi**: eigenvalues obtained from the MD-PMM calculation performed in the initial state ensemble and considering the QC in its final state. 219 | * **-eif**: eigenvalues obtained from the MD-PMM calculation performed in the final state ensemble and considering the QC in its initial state. 220 | * **-eff**: eigenvalues obtained from the MD-PMM calculation performed in the final state ensemble and considering the QC in its final state. 221 | 222 | | ensemble\state | initial | final | 223 | |----------------|---------|---------| 224 | | initial | eii | efi | 225 | | final | eif | eff | 226 | 227 | 228 | Three different approaches can be adopted for the calculation of free energy in the MD-PMM framework. 229 | 230 | 1. Considering only the initial ensemble: -eii and -efi need to be provided. 231 | 2. Considering only the final ensemble: -eif and -eff need to be provided. 232 | 3. Considering the average between the two ensembles: -eii, -efi, -eif and -eff are all necessary for the calculation. 233 | 234 | According to the inputs provided, the corresponding model will be selected. For a better comprehension of the implemented approaches, please refer to previously published literature [[5]](#free-en-1) [[6]](#free-en-rev). 235 | 236 | 237 |

238 | 239 | ## Tests 240 | 241 | All the input files needed to run PyMM on three different systems (water, doxorubicin and guanosine in solution) can be found in the "tests" subdirectory. 242 | 243 | ## Glossary 244 | 245 | * **Quantum center** (QC): portion of the system described at quantum-mechanical level. 246 |

247 | 248 | ## References 249 | [1] 250 | Aschi, M., Spezia, R., Di Nola, A., and Amadei, A. (2001). A first-principles method to model perturbed electronic wavefunctions: the effect of an external homogeneous electric field. _Chemical physics letters_, 344(3-4), 374-380, https://doi.org/10.1016/S0009-2614(01)00638-8. 251 | 252 | [2] 253 | Chen, C. G., Nardi, A. N., Amadei, A., and D’Abramo M. _Journal of Chemical Theory and Computation_, __Article ASAP__, https://doi.org/10.1021/acs.jctc.2c00767. 254 | 255 | [3] 256 | Zanetti-Polzi, L., Del Galdo, S., Daidone, I., D'Abramo, M., Barone, V., Aschi, M., and Amadei, A. (2018). Extending the perturbed matrix method beyond the dipolar approximation: comparison of different levels of theory. _Physical Chemistry Chemical Physics_, 20(37), 24369-24378, https://doi.org/10.1039/C8CP04190C. 257 | 258 | [4] 259 | A. Amadei, M. D’Abramo, C. Zazza, and M. Aschi (2003), Electronic properties of formaldehyde in water: a theoretical study, _Chemical Physics Letters_, 381(1–2), 187-193, https://doi.org/10.1016/j.cplett.2003.09.126. 260 | 261 | [5] 262 | Amadei, A., Daidone, I., and Bortolotti, C. A. (2013). A general statistical mechanical approach for modeling redox thermodynamics: the reaction and reorganization free energies. _RSC Advances_, 3, 19657–19665, https://doi.org/10.1039/C3RA42842G 263 | 264 | [6] 265 | Chen, C. G., Nardi, A. N., Amadei, A., and D’Abramo, M. (2022) Theoretical Modeling of Redox Potentials of Biomolecules. _Molecules_, 27, https://doi.org/10.3390/molecules27031077 266 | -------------------------------------------------------------------------------- /pymm/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChenGiuseppe/PyMM/0e764d8b9d2f429b1c2d5139889eec3b6387139a/pymm/__init__.py -------------------------------------------------------------------------------- /pymm/conversions.py: -------------------------------------------------------------------------------- 1 | ''' Module that collects some often occurring units convertions (in particular 2 | to and from a.u.)''' 3 | 4 | # Dictionaries to help converting between different formats 5 | Z2mass = {'1': 1.00784, 6 | '6': 12.0107, 7 | '7': 14.0067, 8 | '8': 15.999, 9 | '16': 32.065} 10 | 11 | mass2symbol = {1: 'H', 12 | 12: 'C', 13 | 14: 'N', 14 | 16: 'O', 15 | 32: 'S'} 16 | 17 | symbol2mass = {v: k for k, v in mass2symbol.items()} 18 | 19 | # Units convertion 20 | au2eV = 27.2113961 21 | Debye2au = 0.393456 22 | Bohr2Ang = 0.529177249 23 | 24 | # 25 | k_B = 8.617333*10**(-5) # eV/K 26 | R = 8.314 # J/(K*mol) 27 | 28 | if __name__ == '__main__': 29 | pass 30 | -------------------------------------------------------------------------------- /pymm/eigvecs.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import re 3 | import numpy as np 4 | import matplotlib as mpl 5 | import matplotlib.pyplot as plt 6 | import pandas as pd 7 | import seaborn as sns 8 | 9 | 10 | def get_ext(filename): 11 | ''' 12 | Obtain the extention of the input file. 13 | 14 | Parameters: 15 | filename (str): name of the file. 16 | Returns: 17 | ext (str): file extention. 18 | ''' 19 | 20 | p = re.compile('\.([a-zA-Z]{3})') 21 | 22 | match = p.search(filename) 23 | 24 | try: 25 | ext = match.group()[1:] 26 | except: 27 | logging.info('File extention was not recognized. Falling back to png.') 28 | ext = 'png' 29 | 30 | return ext 31 | 32 | def eig_corr(eig, l, m, state, save_fn, dpi, bins): 33 | ''' 34 | Plot the projections of the selected perturbed electronic state 35 | on the two selected unperturbed electronic states against each other. 36 | 37 | Parameters: 38 | eig (np.ndarray): eigenvectors (perturbed electronic states) trajectory. 39 | l (int): first unperturbed state. 40 | m (int): second unperturbed state. 41 | state (int): perturbed state to be considered. 42 | save_fn (str): filename of the obtained figure. 43 | dpi (int): dpi of the output figure. 44 | bins (int): number of bins for the 2D histogram. 45 | Returns: 46 | None 47 | ''' 48 | 49 | fig, ax = plt.subplots(1, 1) 50 | 51 | df = pd.DataFrame(eig[:,:,state], columns = ['Unperturbed state {}'.format(i) for i in range(eig.shape[1])]) 52 | 53 | sns.histplot(df, x='Unperturbed state {}'.format(l), 54 | y='Unperturbed state {}'.format(m), bins=bins, 55 | binrange=(-1,1), cmap='flare', 56 | ax=ax, cbar=True, cbar_kws={'label': 'Number of frames'}) 57 | 58 | # cb = fig.colorbar(cset, ax=axs.ravel().tolist(), fraction=0.05) 59 | 60 | ax.set_title('Perturbed state {}'.format(state)) 61 | 62 | ax.set_xlabel = r'$c_{{}}^{{}}$'.format(l, state) 63 | ax.set_ylabel = r'$c_{{}}^{{}}$'.format(m, state) 64 | 65 | ax.set_xlim(-1, 1) 66 | ax.set_ylim(-1, 1) 67 | 68 | plt.tight_layout() 69 | 70 | ext = get_ext(save_fn) 71 | plt.savefig(save_fn[:-4] + '.' + ext, dpi=dpi, format=ext) 72 | logging.info('\n * Correlation plot saved as {}.\n'.format(save_fn[:-4] + '.' + ext)) 73 | 74 | plt.show() 75 | 76 | def eig_corr_tot(eig, state, save_fn, dpi, bins): 77 | ''' 78 | Plot the projections of a selected perturbed state on all the unperturbed states against 79 | each other. 80 | 81 | Parameters: 82 | eig (np.ndarray): eigenvectors (perturbed electronic states) trajectory. 83 | state (int): selected perturbed state. 84 | save_fn (str): filename of the obtained figure. 85 | dpi (int): dpi of the output figure. 86 | bins (int): number of bins for the 2D histograms. 87 | Returns: 88 | None 89 | ''' 90 | 91 | plt.rcParams['font.size'] = 22 92 | plt.rcParams['legend.fontsize'] = 20 93 | plt.rcParams['axes.linewidth'] = 1.5 94 | 95 | 96 | df = pd.DataFrame(eig[:,:,state], columns = ['state {}'.format(i) for i in range(eig.shape[1])]) 97 | g = sns.PairGrid(df, despine=False) 98 | g.map_diag(sns.kdeplot, 99 | color='k' 100 | ) 101 | g.map_offdiag(sns.histplot, 102 | bins=bins, 103 | binrange=(-1,1), 104 | #sns.kdeplot, 105 | #fill=True, 106 | cmap='flare' 107 | ) 108 | 109 | g.set(xlim=[-1,1], ylim=[-1,1]) 110 | g.fig.subplots_adjust(top=0.95) 111 | g.fig.suptitle('Perturbed state {}'.format(state)) 112 | 113 | ext = get_ext(save_fn) 114 | 115 | 116 | plt.savefig(save_fn[:-4] + '.' + ext, dpi=dpi, format=ext) 117 | logging.info('\n * Correlation plot between all states' 118 | ' saved as {}.\n'.format(save_fn[:-4] + '.' + ext)) 119 | 120 | plt.show() 121 | 122 | def eig_hist(eig, n_states, save_fn, dpi): 123 | ''' 124 | Cumulative histograms representing the squared projections from each 125 | unperturbed state to each perturbed state averaged over the whole 126 | trajectory. 127 | 128 | Parameters: 129 | eig (np.ndarray): eigenvectors (perturbed electronic states) trajectory. 130 | state (int): highest perturbed and unperturbed state to be considered 131 | explicitly in the figure. 132 | save_fn (str): filename of the obtained figure. 133 | dpi (int): dpi of the output figure. 134 | Returns: 135 | None. 136 | ''' 137 | 138 | plt.rcParams['font.size'] = 22 139 | plt.rcParams['legend.fontsize'] = 20 140 | plt.rcParams['axes.linewidth'] = 1.5 141 | 142 | plt.style.use('seaborn-colorblind') 143 | 144 | xsize = 6 + n_states*0.7 145 | fig, ax = plt.subplots(1, 1, figsize=(xsize, 7)) 146 | 147 | tot_states = eig.shape[1] 148 | if not n_states: 149 | n_states = tot_states 150 | 151 | ys = [[] for i in range(n_states)] 152 | # x = [i+1 for i in range(n_states)] 153 | 154 | for i in range(n_states): 155 | for j in range(n_states): 156 | ys[i].append((eig[:,j,i]**2).mean()) 157 | 158 | other_sum = 0 159 | for j in range(n_states, tot_states): 160 | other_sum += (eig[:,j,i]**2).mean() 161 | ys[i].append(other_sum) 162 | ys = np.array(ys) 163 | df = pd.DataFrame(ys, columns=['ground state'] + [str(i) for i in range(1,n_states)] + ['>{}'.format(n_states - 1)]) 164 | df.plot(ax=ax, kind='bar', stacked=True, legend=False) 165 | 166 | ax.set_ylabel('${(c_l^i)}^2$') 167 | 168 | ax.legend(title="$l$-th Unperturbed state", frameon=False, bbox_to_anchor=(1.05, 1), loc='upper left') 169 | ax.set_xlabel("$i$-th Perturbed state") 170 | ax.set_ylim(0., 1.) 171 | 172 | plt.tight_layout() 173 | 174 | ext = get_ext(save_fn) 175 | plt.savefig(save_fn[:-4] + '.' + ext, dpi=dpi, format=ext) 176 | logging.info('\n * Cumulative histogram' 177 | ' saved as {}.\n'.format(save_fn[:-4] + '.' + ext)) 178 | 179 | plt.show() 180 | 181 | if __name__ == '__main__': 182 | pass 183 | -------------------------------------------------------------------------------- /pymm/free_en.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pymm.conversions as conv 3 | 4 | def calc_dA(T, en_ini, en_fin, state): 5 | ''' 6 | Calculate the reaction free energy change considering a single 7 | ensemble. 8 | 9 | Parameters: 10 | T (float): temperature of the system. 11 | en_ini (np.ndarray): perturbed energies trajectory of 12 | the initial state (expressed in atomic units). 13 | en_fin (np.ndarray): perturbed energies trajectory of 14 | the final state (expressed in atomic units). 15 | Returns: 16 | dA (float): reaction free energy change (expressed in J/mol). 17 | ''' 18 | 19 | # en_ini = np.loadtxt(file_en_ini)[:,] 20 | # en_fin = np.loadtxt(file_en_fin)[:,] 21 | 22 | delta = en_fin - en_ini 23 | 24 | if state == 'ini': 25 | sgn = -1 26 | if state == 'fin': 27 | sgn = 1 28 | 29 | q = np.exp((sgn*delta*conv.au2eV/(conv.k_B*T))).mean() 30 | 31 | dA = sgn*conv.R*T*np.log(q) 32 | 33 | return dA 34 | 35 | 36 | def calc_dA_mean(T, en_ini_ens_ini, en_fin_ens_ini, en_ini_ens_fin, en_fin_ens_fin): 37 | ''' 38 | Calculate the reaction free energy change considered as the mean calculated over 39 | two ensembles (initial state and final state). 40 | ''' 41 | 42 | dA_ini = calc_dA(T, en_ini_ens_ini, en_fin_ens_ini, state = 'ini') 43 | dA_fin = calc_dA(T, en_ini_ens_fin, en_fin_ens_fin, state = 'fin') 44 | 45 | dA_mean = 0.5*(dA_ini + dA_fin) 46 | 47 | return dA_mean 48 | 49 | if __name__ == '__main__': 50 | pass -------------------------------------------------------------------------------- /pymm/inputs.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import MDAnalysis as mda 3 | import numpy as np 4 | import pymm.conversions as conv 5 | 6 | 7 | class Qc: 8 | def __init__(self, geom, dip_matrix, energies, charges=None): 9 | self.geom = geom 10 | self.dip_matrix = dip_matrix 11 | self.energies = energies 12 | self.charges = charges 13 | 14 | def read_raw_geom(geom_fn: str) -> np.ndarray: 15 | '''Read the geometry directly from a text file 16 | (for each X atom: "X x y z\n" where X can be the element symbol 17 | or the atomic mass). 18 | 19 | Parameters: 20 | geom_fn (str): geometry filename. 21 | 22 | Returns: 23 | geom_tmp (np.ndarray): geometry as (n_atoms, 4) numpy array. 24 | ''' 25 | with open(geom_fn, 'r') as geom_file: 26 | geom = [] 27 | for i, line in enumerate(geom_file): 28 | content = line.split() 29 | # Check if the first line is used for specifying the number of 30 | # atoms or something else. 31 | if i == 0 and not len(content) == 4: 32 | continue 33 | # NOTE: skip empty line. It was added having in mind the 34 | # possibility that the last line could be empty, as it is now it 35 | # accounts for all empty lines. 36 | elif content == []: 37 | continue 38 | elif not len(content) == 4: 39 | raise ValueError("There's an error in the geometry file " + 40 | f'at line {i}: there are ' + 41 | f'{len(content)} elements.\n' + 42 | f'{line}') 43 | try: 44 | geom.append([float(j) for j in content]) 45 | continue 46 | except ValueError: 47 | pass 48 | try: 49 | # Try to convert the first element of the list (identifying 50 | # the element) to its corresponding atomic mass (float). 51 | # It takes only the first character, expecting something like: 52 | # Examples: 'H', 'H1', 'HA', etc. and not '1H', 'XH', etc.. 53 | geom.append([conv.symbol2mass[content[0][0]]] + 54 | [float(j) for j in content[1:]]) 55 | except ValueError: 56 | logging.critical('Expects the fist element of each line ' 57 | 'to begin with the atomic mass (float) ' 58 | 'or a string that begins with the letter ' 59 | 'corresponding to its symbol.') 60 | geom_tmp = np.zeros_like(geom) 61 | geom_tmp[:] = geom 62 | 63 | return geom_tmp 64 | 65 | def write_geom(filename, geom: np.ndarray): 66 | '''Write a .xyz geometry file readable by Avogadro (and maybe other 67 | programs too''' 68 | 69 | n_atoms = geom.shape[0] 70 | with open(filename, 'w') as geom_out: 71 | geom_out.write(f'{n_atoms}\n\n') 72 | for i in range(n_atoms): 73 | geom_out.write('{} {} {} {}\n'.format( 74 | conv.mass2symbol[round(geom[i,0])], *geom[i,1:])) 75 | 76 | def read_raw_matrix(matrix_fn: str) -> np.ndarray: 77 | '''Read a (N, N, 3) matrix directly from a text file 78 | (for each matrix element i j: "i j x y z\n"). 79 | 80 | Parameters: 81 | matrix_fn (str): matrix filename. 82 | 83 | Returns: 84 | matrix (np.ndarray): matrix as a numpy array. 85 | ''' 86 | 87 | with open(matrix_fn, 'r') as matrix_file: 88 | matrix_x = [] 89 | matrix_y = [] 90 | matrix_z = [] 91 | for i, line in enumerate(matrix_file): 92 | content = line.split() 93 | # print(i, content) 94 | # Check if the first line is to be read. 95 | if i == 0 and not (len(content) == 3 or len(content) == 5): 96 | continue 97 | # NOTE: skip empty line. It was added having in mind the 98 | # possibility that the last line could be empty, as it is now it 99 | # accounts for all empty lines. 100 | elif content == []: 101 | continue 102 | elif not (len(content) == 3 or len(content) == 5): 103 | raise ValueError("There's an error in the matrix file " + 104 | f'at line {i}: there are ' + 105 | f'{len(content)} elements.\n' + 106 | f'{line}') 107 | if len(content) == 3: 108 | matrix_x.append(float(content[0])) 109 | matrix_y.append(float(content[1])) 110 | matrix_z.append(float(content[2])) 111 | elif len(content) == 5: 112 | matrix_x.append(float(content[2])) 113 | matrix_y.append(float(content[3])) 114 | matrix_z.append(float(content[4])) 115 | n_rows = round(np.sqrt(len(matrix_x))) 116 | # Workaround to the maximum dimension of npdarray (32). 117 | matrix_tmp = np.zeros_like(matrix_x) 118 | # print(len(matrix_x), np.sqrt(len(matrix_x)), n_rows) 119 | matrix_tmp[:] = matrix_x 120 | matrix_x = np.copy(matrix_tmp.reshape((n_rows, n_rows))) 121 | matrix_tmp[:] = matrix_y 122 | matrix_y = np.copy(matrix_tmp.reshape((n_rows, n_rows))) 123 | matrix_tmp[:] = matrix_z 124 | matrix_z = np.copy(matrix_tmp.reshape((n_rows, n_rows))) 125 | # print(matrix_x, matrix_y, matrix_z) 126 | matrix = np.stack((matrix_x, matrix_y, matrix_z), axis=2) 127 | 128 | return matrix 129 | 130 | 131 | def read_raw_energies(energies_fn: str) -> np.ndarray: 132 | '''Read the electronic state energies from a text file 133 | (for each ith electronic state: "Ei\n"). 134 | 135 | Parameters: 136 | energies_fn (str): energies filename. 137 | 138 | Returns: 139 | energies_tmp (np.ndarray): energies as a numpy array. 140 | ''' 141 | 142 | with open(energies_fn, 'r') as energies_file: 143 | energies = [] 144 | for line in energies_file: 145 | if line.split() == []: 146 | continue 147 | try: 148 | energies.append(float(line.strip())) 149 | except ValueError: 150 | logging.critical('There are values that are not ' 151 | 'in the energies file.') 152 | energies_tmp = np.zeros_like(energies) 153 | energies_tmp[:] = energies 154 | 155 | return energies_tmp 156 | 157 | 158 | def read_raw_charges(charges_fn: str) -> np.ndarray: 159 | '''Read the RESP charges from a text file 160 | (a line for each electronic state, containing the charges for each atom). 161 | 162 | Parameters: 163 | charges_fn (str): charges filename. 164 | 165 | Returns: 166 | charges_tmp (np.ndarray): charges as a numpy matrix file 167 | (n_el_states, n_atoms). 168 | ''' 169 | 170 | charges = [] 171 | 172 | with open(charges_fn, 'r') as charges_file: 173 | for line in charges_file: 174 | content = line.split() 175 | if content == []: 176 | continue 177 | try: 178 | charges.append([float(i) for i in content]) 179 | except ValueError: 180 | logging.critical('There are values that are not in the ' 181 | 'charges file.') 182 | 183 | charges_tmp = np.zeros_like(charges) 184 | charges_tmp[:, :] = charges 185 | 186 | return charges_tmp 187 | 188 | 189 | def read_raw_inputs(geom_fn: str, dip_mat_fn: str, 190 | energies_fn: str, charges_fn=False) -> None: 191 | 192 | if charges_fn: 193 | qm_charges = read_raw_charges(charges_fn) 194 | else: 195 | qm_charges = None 196 | qc = Qc(read_raw_geom(geom_fn), 197 | read_raw_matrix(dip_mat_fn), 198 | read_raw_energies(energies_fn), 199 | qm_charges) 200 | 201 | return qc 202 | 203 | def read_pmm_inputs(cmdline): 204 | '''Obtain the pmm inputs according to the different sources. 205 | 206 | Parameters: 207 | cmdline (argparse.Namespace): input given through the command line. 208 | If the legacy format is used it consists of the input filename, 209 | otherwise the direct parsing of the output files from other 210 | software packages is requested using the arguments given in the 211 | command line. 212 | 213 | Returns: 214 | qm_inputs (dict): "geometry": geometry in Angstrom (numpy.darray, 215 | shape=(n_atoms, 4)). 216 | "energies": electronic states energies in a.u. (numpy.darray, 217 | shape=n_el_states). 218 | "dip_matrix": electric dipole moment matrix in a.u. (numpy.darray, 219 | shape=(n_el_states, n_el_states, 3)). 220 | "charges": RESP charges for the el_state electronic state 221 | (numpy.darray, shape=(n_el_states, n_atoms)). 222 | mm_traj (mda.Universe): MM simulation trajectory. 223 | ''' 224 | 225 | qc = read_raw_inputs(cmdline.ref_geom, cmdline.dip_matrix, 226 | cmdline.energies, cmdline.charges) 227 | if '.dat' in cmdline.topology_path: 228 | logging.info(' * A formatted text file with ' 229 | 'the MD simulation system charges was provided instead' 230 | 'of a proprietary topology file.') 231 | logging.warning('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n' 232 | '! The atoms order in the reference geometry must match the order !\n' 233 | '! in the MD simulation. !\n' 234 | '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') 235 | traj_charges = np.loadtxt(cmdline.topology_path) 236 | mm_traj = mda.Universe(cmdline.trajectory_path) 237 | try: 238 | traj_charges = traj_charges[:,1] 239 | except: 240 | pass 241 | mm_traj.add_TopologyAttr('charges', traj_charges) 242 | masses = np.zeros_like(traj_charges) 243 | #masses[:qc.geom.shape[0]] = qc.geom[:,0] 244 | mm_traj.add_TopologyAttr('masses', masses) 245 | new_qc_indexes = ' or bynum '.join(cmdline.mm_indexes.split(',')) 246 | #qc_traj = mm_traj.select_atoms(f'bynum {cmdline.mm_indexes}') 247 | qc_traj = mm_traj.select_atoms(f'bynum {new_qc_indexes}') 248 | qc_traj.atoms.masses = qc.geom[:,0] 249 | #except IOError: 250 | # logging.error('Topology file format not recognized/supported.' + 251 | # 'See the documentation.') 252 | else: 253 | mm_traj = mda.Universe(cmdline.topology_path, 254 | cmdline.trajectory_path) 255 | #print(mm_traj.atoms.masses) 256 | #print(mm_traj.atoms.charges) 257 | 258 | return qc, mm_traj 259 | 260 | if __name__ == '__main__': 261 | pass -------------------------------------------------------------------------------- /pymm/pmm.py: -------------------------------------------------------------------------------- 1 | '''Functions needed for MD-PMM calculations''' 2 | 3 | from pymm.inputs import read_pmm_inputs, write_geom 4 | import itertools 5 | import logging 6 | import sys 7 | from timeit import default_timer as timer 8 | from argparse import ArgumentParser, FileType 9 | import MDAnalysis as mda 10 | from MDAnalysis.analysis import align 11 | from MDAnalysis.analysis.rms import rmsd 12 | import numpy as np 13 | from numba import njit, prange 14 | from scipy import linalg 15 | import pymm.conversions as conv 16 | from pymm.conversions import Bohr2Ang 17 | 18 | 19 | def convert2Universe(geometry: np.ndarray) -> mda.Universe: 20 | '''Converts a geometry expressed as a numpy.ndarry to a mda.Universe 21 | object. 22 | 23 | Parameters: 24 | geometry (np.ndarray): (n_atoms, 4) matrix, containing atomic masses 25 | and xyz coordinates. Units assumed to be in Angstrom. 26 | Returns: 27 | univ_geom (mda.Universe): xyz coordinates of the systems and atom 28 | types. Units in Angstrom. 29 | ''' 30 | 31 | univ_geom = mda.Universe.empty(geometry.shape[0], trajectory=True) 32 | # print(univ_geom) 33 | # take the first element of each row (corresponding to the atomic masses) 34 | masses = [atom[0] for atom in geometry] 35 | univ_geom.add_TopologyAttr('mass', masses) 36 | # convert masses to atom type 37 | # print([atom[0] for atom in geometry]) 38 | atom_types = [conv.mass2symbol[round(atom[0])] for atom in geometry] 39 | univ_geom.add_TopologyAttr('type', atom_types) 40 | # add xyz coordinates 41 | univ_geom.atoms.positions = geometry[:, 1:] 42 | # print(univ_geom.atoms.positions, univ_geom.atoms.masses) 43 | return univ_geom 44 | 45 | def bynum2indexes(qc_indexes: str) -> list: 46 | '''Convert the formatted indeces provided by the command line 47 | into an list of int to perform a selection in np.ndarray. 48 | 49 | Parameters: 50 | qc_indexes (str): formatted indeces to be translated into 51 | a form readable by bynum. 52 | 53 | Returns: 54 | new_indexes (list): converted indeces for np.ndarray. 55 | ''' 56 | 57 | indexes = qc_indexes.split(',') 58 | new_indexes = [] 59 | for i in indexes: 60 | try: 61 | new_indexes.append(int(i) - 1) 62 | except: 63 | indexes_tmp = i.split(':') 64 | new_indexes = new_indexes + [j for j in range(int(indexes_tmp[0]) 65 | - 1, int(indexes_tmp[1]))] 66 | 67 | return new_indexes 68 | 69 | 70 | def split_qc_solv(traj: mda.Universe, 71 | qc_indexes: str) -> mda.core.groups.AtomGroup: 72 | '''Select AtomGroups for the QC (quantum center) and the "solvent" 73 | (i.e. the perturbing field). 74 | 75 | Parameters: 76 | traj (mda.Universe): trajectory sampled by the MD simulation. 77 | qc_indexes (str): string expressing the selection of the QC atoms in 78 | the formalism used in MDAnalysis (bynum, so starting from 1). 79 | 80 | Returns: 81 | qc (mda.core.groups.AtomGroup): AtomGroup containing the QC. 82 | solv (mda.core.groups.AtomGroup): AtomGroup containing the solvent 83 | (complementary to the QC). 84 | 85 | Example: 86 | split_qc_solv(traj, 1:10,12) # NOTE: it includes the extremes. 87 | ''' 88 | 89 | new_qc_indexes = ' or bynum '.join(qc_indexes.split(',')) 90 | #print(new_qc_indexes) 91 | qc = traj.select_atoms(f'bynum {new_qc_indexes}') 92 | #print(qc) 93 | 94 | new2_qc_indexes = ' and not bynum '.join(qc_indexes.split(',')) 95 | solv = traj.select_atoms(f'not bynum {new2_qc_indexes}') 96 | """ print(qc, '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') 97 | print(solv, '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') """ 98 | return qc, solv 99 | 100 | 101 | def cut_qc(qc: mda.Universe, qc_indexes: str) -> mda.core.groups.AtomGroup: 102 | '''Select only a portion of the system used for the QM calculation. 103 | 104 | Parameters: 105 | qc (mda.Universe): QC as it was considered for the QM calculation. 106 | qc_indexes (str): string expressing the selection of the portion of 107 | the system used in the QM calculation to be used in the MD-PMM 108 | calculation, in the formalism used in MDAnalysis (bynum, so 109 | starting from 1). 110 | 111 | Returns: 112 | qc_pmm (mda.core.groups.AtomGroup): AtomGroup of the portion of the 113 | system used in the QM calculation to be used in the MD-PMM 114 | calculation. 115 | ''' 116 | 117 | qc_pmm = qc.select_atoms(f'bynum {qc_indexes}') 118 | return qc_pmm 119 | 120 | 121 | def order_mass(traj_geom: mda.core.groups.AtomGroup, 122 | ref_geom: mda.Universe) -> list: 123 | '''Order atoms according to their mass. 124 | Parameters: 125 | traj_geom (mda.core.groups.AtomGroup): geometry of the QC in the 126 | considered frame of the trajectory. 127 | ref_geom (mda.Universe): geometry of the QC as used in the QM 128 | calculation. In a.u.. 129 | 130 | Returns: 131 | new_indices (list): ordered indices. 132 | ''' 133 | 134 | ordered = False 135 | indices = [i for i in range(ref_geom.atoms.n_atoms)] 136 | # print(ref_geom.atoms.masses) 137 | # print(traj_geom.atoms.masses) 138 | while not ordered: 139 | for i, j in enumerate(indices): 140 | # print(j, i, ref_geom.atoms.masses[j], traj_geom.atoms.masses[i]) 141 | if round(ref_geom.atoms.masses[j]) == round(traj_geom.atoms.masses[i]): 142 | if i == ref_geom.atoms.n_atoms - 1: 143 | ordered = True 144 | continue 145 | else: 146 | indices[i:] = indices[i+1:] + [indices[i]] 147 | break 148 | # print(ordered) 149 | return indices 150 | 151 | 152 | def match_qc(indices: list, traj_geom: mda.core.groups.AtomGroup, 153 | ref_geom: mda.Universe) -> list: 154 | '''Find the correct order of the QC atoms to match the MD simulation. 155 | A brute force approach was employed (obtain all the permutations and 156 | select the one with the smallest value of RMSD). 157 | 158 | Parameters: 159 | indices (list): list of indices ordered in order to already match 160 | the masses of the QC in the MD simulation. 161 | traj_geom (mda.core.groups.AtomGroup): geometry of the QC in the 162 | considered frame of the trajectory. 163 | ref_geom (mda.Universe): geometry of the QC as used in the QM 164 | calculation. In a.u.. 165 | 166 | Returns: 167 | new_indices: list of indices that match the QC atoms order in the 168 | MD simulation. 169 | ''' 170 | 171 | cdm = traj_geom.atoms.center_of_mass() 172 | coor = traj_geom.atoms.positions.copy() 173 | coor -= cdm 174 | # cdm2 = np.zeros(3) 175 | # for i in range(coor.shape[0]): 176 | # cdm2 += traj_geom.atoms.masses[i]*(coor[i,:]) 177 | # print('cdm', cdm2) 178 | 179 | elements = set([round(i) for i in ref_geom.atoms.masses]) 180 | 181 | # Not ordered masses 182 | masses = ref_geom.atoms.masses.copy() 183 | # print('indices', indices) 184 | tot_ndx = [] 185 | for element in elements: 186 | element_ndx = [] 187 | for i, j in enumerate(indices): 188 | if round(masses[j]) == element: 189 | element_ndx.append([i,j]) 190 | # print(element, element_ndx) 191 | perms = list(itertools.permutations([i[1] for i in element_ndx])) 192 | rmsd_min = 100000. 193 | new_element_ndx = [] 194 | # print(element, [i[0] for i in element_ndx]) 195 | 196 | if not len([i[0] for i in element_ndx]) == 1: 197 | for perm in perms: 198 | #print('perm', list(perm)) 199 | perm = list(perm) 200 | geom_tmp = ref_geom.atoms.positions[perm,:] 201 | masses_tmp = ref_geom.atoms.masses[perm] 202 | #print(masses_tmp) 203 | #print([i[0] for i in perm]) 204 | matrix, rmsd_tmp = align.rotation_matrix(coor[[i[0] for i in element_ndx],:], 205 | geom_tmp, weights=masses_tmp) 206 | if rmsd_tmp < rmsd_min: 207 | rmsd_min = rmsd_tmp 208 | new_element_ndx = perm 209 | else: 210 | new_element_ndx = [i[1] for i in element_ndx] 211 | #print(new_element_ndx) 212 | tot_ndx += [[element_ndx[i][0], new_element_ndx[i]] for i in range(len(element_ndx))] 213 | 214 | new_indices = indices[:] 215 | for i in tot_ndx: 216 | #print(i) 217 | new_indices[i[0]] = i[1] 218 | 219 | logging.info(' ** Old indices:\n' +' '.join([str(i) for i in indices]) + '\n' + 220 | ' ** Ordered indices:\n' + ' '.join([str(i) for i in new_indices]) + 221 | '\n') 222 | 223 | return new_indices 224 | 225 | 226 | 227 | def rotate_dip_matrix(dip_matrix: np.ndarray, 228 | traj_geom: mda.core.groups.AtomGroup, 229 | ref_geom: mda.Universe) -> np.ndarray: 230 | '''Rotate the electric dipole moment matrix in order to align the 231 | geometry in the simulation trajectory frame to the reference geometry 232 | (that is the one used in the QM calculation). 233 | 234 | Parameters: 235 | dip_matrix (np.ndarray): matrix of the electric dipole moments. 236 | In a.u.. 237 | traj_geom (mda.core.groups.AtomGroup): geometry of the QC in the 238 | considered frame of the trajectory. 239 | ref_geom (mda.Universe): geometry of the QC as used in the QM 240 | calculation. In a.u.. 241 | 242 | Returns: 243 | rot_dip_matrix (np.ndarray): rotated electric dipole moment matrix. 244 | Expressed in a.u.. 245 | ''' 246 | 247 | # shift origin to the centers of mass of frame_geom to (0, 0, 0). 248 | cdm = traj_geom.atoms.center_of_mass() 249 | # NOTE: it changes the positions in traj_geom permanently. 250 | traj_geom.atoms.positions = traj_geom.atoms.positions - cdm 251 | 252 | rot_matrix, rmsd = align.rotation_matrix(traj_geom.atoms.positions, 253 | ref_geom.atoms.positions, 254 | weights=ref_geom.atoms.masses) 255 | 256 | # rot_matrix is transposed to obtain the inverse. This way dip_matrix is 257 | # rotated into the Gromacs reference system. 258 | rot_dip_matrix = np.einsum('ij,klj->kli', rot_matrix.T, dip_matrix) 259 | return rot_dip_matrix, rot_matrix 260 | 261 | 262 | @njit 263 | def calc_el_field_pot_qc(solv_coor: np.ndarray, solv_charges: np.ndarray, 264 | qc_coor: np.ndarray, cdm: np.ndarray, 265 | q_tot: int): 266 | '''Calculate the electric field on the center of mass and the energy 267 | contribution given by the interaction between the QC charge and the 268 | electric potential produced by the solvent in the framework of the QC-based 269 | expansion (the perturbing field). 270 | 271 | Parameters: 272 | solv_coor (np.ndarray): (n_solv_atoms, 3) array containing the xyz 273 | coordinates of the solvent. Units Angstrom that the function 274 | converts in Bohr. 275 | solv_charges (np.ndarray): (n_solv_atoms) array containing the force 276 | field charges of the solvent. 277 | qc_coor (np.ndarray): (n_qc_atoms, 3) array containing the xyz 278 | coordinates of the QC in the MD trajectory frame. 279 | cdm (np.ndarray): QC center of mass in the MD trajectory frame. 280 | q_tot (int): QC total charge. 281 | 282 | Returns: 283 | el_field (np.ndarray): electric field expressed in its xyz components. 284 | In a.u.. 285 | potential (float or np.ndarray): energy contributions to the matrix 286 | elements of the perturbed Hamiltonian given by the interactions 287 | between the charge/s of the QC and the electric potential 288 | produced by the solvent (perturbing field). It is obtained by 289 | considering the QC a point-charge in its center of mass. Expressed 290 | in a.u.. 291 | ''' 292 | 293 | # converts the coordinates from the trajectory in a.u. 294 | xyz_distances = (cdm - solv_coor) / Bohr2Ang 295 | # distances = np.sqrt(np.einsum('ij,ij->i', xyz_distances, xyz_distances)) 296 | distances = np.sqrt((xyz_distances**2).sum(axis=1)) 297 | el_field = (((solv_charges * xyz_distances.T) / 298 | (distances ** 3)).T).sum(axis=0) 299 | potential = q_tot * (solv_charges / distances).sum() 300 | # potential = np.full(qc_charges.shape[0], 301 | # q_tot * (solv_charges / distances).sum()) 302 | return el_field, potential 303 | 304 | 305 | #@njit(parallel=True) 306 | def calc_el_field_pot_atom(solv_coor: np.ndarray, solv_charges: np.ndarray, 307 | qc_coor: np.ndarray, cdm: np.ndarray, 308 | qc_charges: np.ndarray): 309 | '''Calculate the electric field on the center of mass and the energy 310 | contribution given by the interaction between the QC charge and the 311 | electric potential produced by the solvent (the perturbing field) in the 312 | framework of the atom-based expansion. 313 | 314 | Parameters: 315 | solv_coor (np.ndarray): (n_solv_atoms, 3) array containing the xyz 316 | coordinates of the solvent. Units Angstrom that the function 317 | converts in Bohr. 318 | solv_charges (np.ndarray): (n_solv_atoms) array containing the force 319 | field charges of the solvent. 320 | qc_coor (np.ndarray): (n_qc_atoms, 3) array containing the xyz 321 | coordinates of the QC in the MD trajectory frame. 322 | cdm (np.ndarray): QC center of mass in the MD trajectory frame. 323 | qc_charges (np.ndarray): arrays providing the atomic charge 324 | distributions of the QC. 325 | 326 | Returns: 327 | el_field (np.ndarray): electric field expressed in its xyz components. 328 | In a.u.. 329 | potential (float or np.ndarray): energy contributions to the matrix 330 | elements of the perturbed Hamiltonian given by the interactions 331 | between the charge/s of the QC and the electric potential 332 | produced by the solvent (perturbing field). It is obtained by 333 | considering the charges on each atom of the QC. Expressed in a.u.. 334 | ''' 335 | 336 | # converts the coordinates from the trajectory in a.u. 337 | xyz_distances = (cdm - solv_coor) / Bohr2Ang 338 | # distances = np.sqrt(np.einsum('ij,ij->i', xyz_distances, xyz_distances)) 339 | distances = np.sqrt((xyz_distances**2).sum(axis=1)) 340 | el_field = (((solv_charges * xyz_distances.T) / 341 | (distances ** 3)).T).sum(axis=0) 342 | 343 | potential = np.zeros(qc_charges.shape[0]) 344 | qc_distances = np.zeros((qc_coor.shape[0], solv_coor.shape[0])) 345 | 346 | """ for i in prange(qc_coor.shape[0]): 347 | qc_xyz_distances = (qc_coor[i] - solv_coor) / Bohr2Ang 348 | ##with open('distances.txt', 'a') as f: 349 | ## f.write('\n') 350 | ## np.savetxt(f, qc_xyz_distances[:10,:]) 351 | 352 | # qc_distances[i, :] = np.sqrt(np.einsum('ij,ij->i', qc_xyz_distances, 353 | # qc_xyz_distances)) 354 | qc_distances[i, :] = np.sqrt((qc_xyz_distances**2).sum(axis=1)) 355 | for j in range(qc_charges.shape[0]): 356 | potential[j] += qc_charges[j, i] *\ 357 | (solv_charges / qc_distances[i, :]).sum() """ 358 | # print(np.expand_dims(qc_coor, axis=1).shape, np.expand_dims(solv_coor, axis=0).shape) 359 | #qc_xyz_distances = (np.repeat(qc_coor[:,np.newaxis,:], solv_coor.shape[1], axis=1) - np.repeat(solv_coor[np.newaxis,:,:], qc_coor.shape[0], axis=0)) / Bohr2Ang 360 | qc_xyz_distances = (np.expand_dims(qc_coor, axis=1) - np.expand_dims(solv_coor, axis=0)) / Bohr2Ang 361 | qc_distances = np.sqrt((qc_xyz_distances**2).sum(axis=2)) 362 | potential = (qc_charges * np.expand_dims((np.expand_dims(solv_charges, axis=0) / qc_distances).sum(axis=1), axis=0)).sum(axis=1) 363 | """ print('!potential!!!!!!!\n', i, '\n', potential) 364 | print('!distances!!!!!!!!!!\n',qc_distances) """ 365 | # print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n', potential) 366 | return el_field, potential 367 | 368 | 369 | def calc_pmm_matrix(energies: np.ndarray, rot_dip_matrix: np.ndarray, 370 | el_field: np.ndarray, 371 | potential: float, qc_ch_swith: bool) -> np.ndarray: 372 | '''Construct PMM matrix. 373 | 374 | Parameters: 375 | energies (np.ndarray): energies of the electronic states (eigenvalues 376 | of the unperturbed Hamiltonian) expressed in Hartree (a.u.). 377 | rot_dip_matrix (np.ndarray): electric dipole matrix rotated in order 378 | to align the reference geometry to the geometry in the simulation 379 | trajectory frame. Values expressed in a.u.. 380 | el_field (np.ndarray): electric field generated by the solvent 381 | considered as a distribution of point charges sampled by the 382 | simulation. Expressed in a.u.. 383 | potential (float or np.ndarray): energy contributions to the matrix 384 | elements of the perturbed Hamiltonian given by the interactions 385 | between the charge/s of the QC and the electric potential 386 | produced by the solvent (perturbing field). If can be obtained by 387 | considering the QC a point-charge in its center of mass or by 388 | considering the charges on each atom of the QC. Expressed in a.u.. 389 | qc_ch_switch (bool): choose whether to use the QC-based expansion or 390 | the atom-based expansion. 391 | 392 | Returns: 393 | pmm_matrix (np.ndarray): Hamiltonian matrix of the perturbed system 394 | as calculated (... cite article). 395 | ''' 396 | 397 | # TODO #1 Add reference to PMM article. 398 | # print('E0 + mu', np.diag(energies) - 1 * np.einsum('i,jki->jk', 399 | # el_field, rot_dip_matrix)) 400 | if qc_ch_swith: 401 | pmm_matrix = - 1 * np.einsum('i,jki->jk', el_field, rot_dip_matrix) 402 | """ print('Dipoles') 403 | for i in range(pmm_matrix.shape[0]): 404 | for j in range(pmm_matrix.shape[1]): 405 | print(i, j, pmm_matrix[i,j]) """ 406 | np.fill_diagonal(pmm_matrix, energies + potential) 407 | """ print('Fill Diagonal') 408 | for i in range(pmm_matrix.shape[0]): 409 | for j in range(pmm_matrix.shape[1]): 410 | print(i, j, pmm_matrix[i,j]) """ 411 | else: 412 | pmm_matrix = np.diag(energies + potential) \ 413 | - 1 * np.einsum('i,jki->jk', el_field, rot_dip_matrix) 414 | 415 | return pmm_matrix 416 | 417 | 418 | def pmm(cmdline): 419 | '''Program to perform MD-PMM calculations. 420 | TODO: #3 add documentation. 421 | ''' 422 | 423 | # determine if the QC total charge is to be used or if the charge 424 | # distributions are provided. 425 | qc_ch_switch = isinstance(cmdline.charges, str) 426 | if qc_ch_switch: 427 | logging.info(' * PMM-MD calculation using the charges approximation ' + 428 | 'has been selected.\n') 429 | else: 430 | logging.info(' * PMM-MD calculation using the dipole approximation ' + 431 | 'has been selected.\n') 432 | # print(qc_ch_switch) 433 | # gather the electronic properties of the QC and load the MM trajectory 434 | qc, mm_traj = read_pmm_inputs(cmdline) 435 | # print(qm_inputs['energies']) 436 | # geometry units: converts to MDAnalysis defaults (Angstrom). 437 | if cmdline.geom_units.lower() == 'bohr': 438 | qc.geom[:, 1:] *= Bohr2Ang 439 | elif cmdline.geom_units.lower() == 'nm': 440 | qc.geom[:, 1:] *= 10 441 | 442 | # print(qm_inputs['geometry']) 443 | # print(qm_inputs) 444 | ## qc_ref = convert2Universe(qc.geom) 445 | 446 | # cut only the portion of interest of the QC. 447 | if cmdline.qm_indexes: 448 | #qc_ref = cut_qc(qc_ref, cmdline.qm_indexes) 449 | 450 | new_indexes = bynum2indexes(cmdline.qm_indexes) 451 | logging.info(' * Slice the reference QC in the following way:\n' + 452 | ' '.join([str(i) for i in new_indexes]) + '\n') 453 | # complementary indexes 454 | tot_indexes = [i for i in range(qc.charges.shape[1])] 455 | comp_indexes = [] 456 | for i in tot_indexes: 457 | if i not in new_indexes: 458 | comp_indexes.append(i) 459 | qc.geom = qc.geom[new_indexes, :] 460 | 461 | exc_charge = qc.charges[:,comp_indexes].sum(axis=1) 462 | logging.info(f' * The excess charge after the slicing of the QC is:\n' + 463 | ' a.u..\n'.join([str(i) for i in exc_charge]) + ' a.u.\n') 464 | 465 | print(qc.geom.shape[0], qc.charges.shape[1]) 466 | qc.charges = qc.charges[:, new_indexes] 467 | qc.charges = qc.charges + (exc_charge/qc.geom.shape[0])[:,None] 468 | 469 | qc_ref = convert2Universe(qc.geom) 470 | 471 | # shift the origin to the center of mass. 472 | qc_ref.atoms.positions -= qc_ref.atoms.center_of_mass() 473 | 474 | # Divide the coordinates in the frame between QC and solvent. 475 | # NOTE: the indexes are inclusive of the extremes. 476 | qc_traj, solv_traj = split_qc_solv(mm_traj, cmdline.mm_indexes) 477 | 478 | print(qc_ref.atoms, qc_traj) 479 | 480 | n_qc_atoms = qc.geom.shape[0] 481 | logging.info('\n\n' 482 | '==========================================================================\n' 483 | '| |\n' 484 | '| Properties of the unperturbed QC: |\n' 485 | '| |\n' 486 | '==========================================================================\n' 487 | '\n') 488 | logging.info(' * Initial QC geometry (a.u.):\nNumber of atoms: {}'.format(n_qc_atoms)) 489 | for i in range(n_qc_atoms): 490 | logging.info('{:7.4} {:12.7f} {:12.7f} {:12.7f}'.format(qc.geom[i, 0], 491 | *qc.geom[i, 1:] / Bohr2Ang)) 492 | logging.info('\n--------------------------------------------------------------------------\n') 493 | 494 | if cmdline.match: 495 | logging.info(' * The reference QC geometry will be reordered to match ' 496 | 'the atoms order in\n the MD simulation.\n') 497 | # match QC atoms order of the reference geometry with the MD simulation. 498 | new_indices = match_qc(order_mass(qc_traj, qc_ref), qc_traj, qc_ref) 499 | qc_ref.atoms.masses = qc_ref.atoms.masses[new_indices] 500 | qc_ref.atoms.positions = qc_ref.atoms.positions[new_indices,:] 501 | qc.geom = qc.geom[new_indices,:] 502 | if qc_ch_switch: 503 | qc.charges = qc.charges[:,new_indices] 504 | 505 | logging.info('--------------------------------------------------------------------------\n') 506 | logging.info(' * Final QC geometry (a.u.):\nNumber of atoms: {}'.format(n_qc_atoms)) 507 | for i in range(n_qc_atoms): 508 | logging.info('{:7.4} {:12.7f} {:12.7f} {:12.7f}'.format(qc.geom[i, 0], 509 | *qc.geom[i, 1:] / Bohr2Ang)) 510 | logging.info('\n--------------------------------------------------------------------------\n') 511 | 512 | n_qc_states = qc.energies.shape[0] 513 | logging.info(' * QC electronic states energies (a.u.):\n' + 514 | 'Number of electronic states: {}'.format(n_qc_states)) 515 | for i in range(n_qc_states): 516 | logging.info('{:5d} {:12.7f}'.format(i, qc.energies[i])) 517 | logging.info('\n--------------------------------------------------------------------------\n') 518 | 519 | logging.info(' * Electric dipole matrix (a.u.):') 520 | for i in range(n_qc_states): 521 | for j in range(n_qc_states): 522 | logging.info('{:5d} {:5d} {:12.7f} {:12.7f} {:12.7f}'.format(i, j, *qc.dip_matrix[i,j,:])) 523 | logging.info('\n--------------------------------------------------------------------------\n') 524 | 525 | if qc_ch_switch: 526 | logging.info(' * QC atomic charges:\n\n') 527 | for i in range(n_qc_states): 528 | logging.info(' ** Electronic state {}:'.format(i)) 529 | for j in range(n_qc_atoms): 530 | logging.info('{:7.4f} {:12.7f}'.format(qc_ref.atoms.masses[j], qc.charges[i,j])) 531 | logging.info('\n') 532 | logging.info('\n--------------------------------------------------------------------------\n') 533 | 534 | logging.info('\n\n' 535 | '==========================================================================\n' 536 | '| |\n' 537 | '| MD simulation details |\n' 538 | '| |\n' 539 | '==========================================================================\n') 540 | logging.info(' * Total number of atoms: {}\n'.format(mm_traj.atoms.n_atoms) + 541 | ' * Number of frames in the trajectory: {}\n'.format(mm_traj.trajectory.n_frames) + 542 | ' * QC atoms indeces in the total system (starting from 1):\n' + 543 | ' '.join([str(i + 1) for i in qc_traj.atoms.indices]) + 544 | '\n\n--------------------------------------------------------------------------\n') 545 | 546 | # MD-PMM calculation. 547 | eigvals = np.zeros((mm_traj.trajectory.n_frames, 548 | qc.energies.shape[0])) 549 | eigvecs = np.zeros((mm_traj.trajectory.n_frames, 550 | qc.energies.shape[0], 551 | qc.energies.shape[0])) 552 | 553 | if cmdline.pre_diag: 554 | logging.info('==========================================================================\n' 555 | '| |\n' 556 | '| You requested the diagonal elements of the pre-diagonalized |\n' 557 | '| perturbed Hamiltonian matrix to be written |\n' 558 | '| |\n' 559 | '==========================================================================\n') 560 | pre_diags = np.zeros_like(eigvals) 561 | # print(mm_traj.atoms.charges) 562 | # print(qc_traj.atoms.center_of_mass().dtype, 563 | # solv_traj.atoms.positions.dtype) 564 | for i, frame in enumerate(mm_traj.trajectory): 565 | # print(qc_traj.atoms.positions) 566 | # print(i) 567 | # print(solv_traj.atoms.positions) 568 | # cdm_qc_traj = qc_traj.atoms.center_of_mass().astype('float32') 569 | # print(cdm_qc_traj.dtype, solv_traj.atoms.positions.dtype) 570 | if qc_ch_switch: 571 | el_field, potential = calc_el_field_pot_atom(solv_traj.atoms.positions, 572 | solv_traj.atoms.charges, 573 | qc_traj.atoms.positions, 574 | qc_traj.atoms.center_of_mass(), 575 | qc.charges) 576 | else: 577 | el_field, potential = calc_el_field_pot_qc(solv_traj.atoms.positions, 578 | solv_traj.atoms.charges, 579 | qc_traj.atoms.positions, 580 | qc_traj.atoms.center_of_mass(), 581 | q_tot=cmdline.qc_charge) 582 | rot_dip_matrix, rot_matrix = rotate_dip_matrix(qc.dip_matrix, 583 | qc_traj, qc_ref) 584 | #print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!', rot_matrix) 585 | pmm_matrix = calc_pmm_matrix(qc.energies, rot_dip_matrix, 586 | el_field, potential, qc_ch_switch) 587 | # print('potential', potential, '\nel field', el_field) 588 | # print('H tot', pmm_matrix.diagonal()) 589 | eigval, eigvec = linalg.eigh(pmm_matrix) 590 | # eigvals.append(eigval) 591 | # eigvecs.append(eigvec) 592 | eigvals[i, :] = eigval 593 | eigvecs[i, :, :] = eigvec 594 | if cmdline.pre_diag: 595 | pre_diags[i, :] = pmm_matrix.diagonal() 596 | # print('eigenvec', eigvec) 597 | 598 | np.savetxt('{}_eigvals.dat'.format(cmdline.output), eigvals, 599 | header='Perturbed QC energies:') 600 | np.save('{}_eigvecs'.format(cmdline.output), eigvecs) 601 | 602 | if cmdline.pre_diag: 603 | np.savetxt('{}_pre_diags.dat'.format(cmdline.output), pre_diags, 604 | header='Perturbed Hamiltonian matrix diagonal elements:') 605 | 606 | xyz_fn = '{}_qc_geom.xyz'.format(cmdline.output) 607 | write_geom(xyz_fn, qc.geom) 608 | 609 | logging.info('==========================================================================\n' 610 | '| |\n' 611 | '| OUTPUT |\n' 612 | '| |\n' 613 | '==========================================================================\n' 614 | '\n' 615 | ' * Results have been saved in:\n' + 616 | ' ** Perturbed energies: {}_eigvals.dat\n'.format(cmdline.output) + 617 | ' ** Eigenvectors: {}_eigvecs.npy\n'.format(cmdline.output) + 618 | ' ** QC reference geometry in .xyz format: {}'.format(xyz_fn)) 619 | # print(eigvecs) 620 | # print(solv_traj.atoms.positions.shape) 621 | 622 | return 0 623 | 624 | 625 | if __name__ == '__main__': 626 | bynum2indexes('1 2:3') 627 | -------------------------------------------------------------------------------- /pymm/pymm.py: -------------------------------------------------------------------------------- 1 | from pymm.conversions import au2eV 2 | from pymm.eigvecs import get_ext, eig_corr, eig_corr_tot, eig_hist 3 | from pymm.inputs import read_raw_matrix 4 | from pymm.pmm import pmm 5 | from pymm.spectra import calc_pert_matrix, calc_abs 6 | from pymm.free_en import calc_dA, calc_dA_mean 7 | from datetime import datetime 8 | import getpass 9 | import logging 10 | import sys 11 | from timeit import default_timer as timer 12 | from argparse import ArgumentParser, FileType 13 | import numpy as np 14 | import matplotlib as mpl 15 | import matplotlib.pyplot as plt 16 | 17 | 18 | def main(): 19 | '''Program with CLI to perform MD-PMM calculations. 20 | TODO: #3 add documentation. 21 | ''' 22 | parser = ArgumentParser(prog='PyMM', 23 | description='Perform MD-PMM calculation.') 24 | subparsers = parser.add_subparsers(dest='command') 25 | 26 | # Perform MD-PMM calculation. 27 | parser_pmm = subparsers.add_parser('run_pmm', 28 | help='Perform MD-PMM calculation.') 29 | parser_pmm.add_argument('-g', '--ref-geom', action='store', type=str, 30 | help='QC reference (QM) geometry filename') 31 | parser_pmm.add_argument('-gu', '--geom-units', choices=['angstrom', 'bohr', 32 | 'nm'], help='specify units used in the reference (default: angstrom)' 33 | 'geometry', default='angstrom') 34 | parser_pmm.add_argument('-dm', '--dip-matrix', action='store', type=str, 35 | help='QC unperturbed electric dipole moment matrix ' 36 | 'filename') 37 | parser_pmm.add_argument('-e', '--energies', action='store', type=str, 38 | help='QC unperturbed electronic states energies ' 39 | 'filename') 40 | parser_pmm.add_argument('-ch', '--charges', action='store', type=str, 41 | default=False, help='file with the QC atomic ' 42 | 'charges for each unperturbed electronic state ' 43 | '(default=False)') 44 | parser_pmm.add_argument('-traj', '--trajectory-path', action='store', 45 | type=str, help='XTC file of the MD simulation ' 46 | 'trajectory') 47 | parser_pmm.add_argument('-top', '--topology-path', action='store', type=str, 48 | help='TPR file of the MD simulation') 49 | parser_pmm.add_argument('-q', '--qc-charge', action='store', default=0, 50 | type=int, help='total QC charge (default=0)') 51 | parser_pmm.add_argument('-nm', '--mm-indexes', action='store', type=str, 52 | help='indexes of the QC in the MM trajectory') 53 | parser_pmm.add_argument('-nq', '--qm-indexes', action='store', type=str, 54 | default=False, help='indexes of the portion of the ' 55 | 'reference (QM) geometry to be considered in the ' 56 | 'MD-PMM calculation') 57 | parser_pmm.add_argument('--match', action='store_true', 58 | help='Reorder the QC reference geometry ' 59 | 'to match the atoms order in the MD simulation') 60 | parser_pmm.add_argument('-o', '--output', action='store', type=str, 61 | default='pymm', help='job name used to name the ' 62 | 'output files (default: pymm)') 63 | parser_pmm.add_argument('--pre-diag', action='store_true', 64 | help='Request the perturbed Hamiltonian matrix ' 65 | 'diagonal elements') 66 | 67 | # Calculate absorption spectra. 68 | parser_abs = subparsers.add_parser('calc_abs', 69 | help='Calculate absorption spectra') 70 | parser_abs.add_argument('-dm', '--dip-matrix', action='store', type=str, 71 | help='QC unperturbed electric dipole moment matrix ' 72 | 'filename') 73 | parser_abs.add_argument('-el', '--eigvals', action='store', type=str, 74 | default='pymm_eigvals.dat', help='Perturbed ' 75 | 'eigenvalues trajectory (default: pymm_eigvals.dat)') 76 | parser_abs.add_argument('-ev', '--eigvecs', action='store', type=str, 77 | default='pymm_eigvecs.npy', help='Perturbed ' 78 | 'eigenvectors trajectory (default: pymm_eigvecs.npy)') 79 | parser_abs.add_argument('-sigma', action='store', type=float, 80 | default=0.034, help='Square root of the variance of the gaussian ' 81 | 'broadening applied to the signal (expressed in eV). Default: 0.034 eV.') 82 | parser_abs.add_argument('-xtr', '--extra-range', action='store', type=float, 83 | default=0.005, help='Additional value to add to the' 84 | 'frequency range considered for the spectrum ' 85 | 'calculation') 86 | parser_abs.add_argument('-ot', '--output', action='store', type=str, 87 | default='abs_spectrum', 88 | help='Calculated absorption spectra names ' 89 | '(default: abs_spectrum)') 90 | 91 | # Calculate free energy 92 | parser_dA = subparsers.add_parser('free_en', 93 | help='Calculate free energy') 94 | parser_dA.add_argument('-T', '--temperature', action='store', type=float, 95 | default=298., help='Temperature of the system ' 96 | 'during the simulation') 97 | parser_dA.add_argument('-eii', '--en_in_in', action='store', type=str, 98 | help='Filename of the MD-PMM energies trajectory ' 99 | 'for the initial state in the initial ensemble') 100 | parser_dA.add_argument('-efi', '--en_fin_in', action='store', type=str, 101 | help='Filename of the MD-PMM energies trajectory ' 102 | 'for the final state in the initial ensemble') 103 | parser_dA.add_argument('-eif', '--en_in_fin', action='store', type=str, 104 | help='Filename of the MD-PMM energies trajectory ' 105 | 'for the initial state in the final ensemble') 106 | parser_dA.add_argument('-eff', '--en_fin_fin', action='store', type=str, 107 | help='Filename of the MD-PMM energies trajectory ' 108 | 'for the final state in the final ensemble') 109 | parser_dA.add_argument('-col', action='store', type=int, default=0, 110 | help='Column (or electronic state) to consider ' 111 | 'from the energies trajectory file') 112 | parser_dA.add_argument('-o', '--output', action='store', type=str, 113 | default='dA_mean.dat', 114 | help='Calculated free energy differences' 115 | '(default: dA_mean.dat)') 116 | 117 | # Eigenvectors analysis 118 | parser_eig = subparsers.add_parser('eig', help='Analyse the perturbed ' 119 | 'eigenvectors') 120 | parser_eig.add_argument('-i', '--input', action='store', type=str, 121 | default='pymm_eigvecs.npy', 122 | help='Perturbed eigenvectors trajectory provided ' 123 | 'as an npy file (n_frames, n_unp_states, n_per_states;' 124 | 'default=pymm_eigvecs.npy).') 125 | parser_eig.add_argument('-first', action='store', type=int, default=0, 126 | help='First unperturbed state to consider (ignored' 127 | ' when calculating the cumulative histograms; ' 128 | 'default=0, i.e. the electronic ground state).') 129 | parser_eig.add_argument('-last', action='store', type=int, 130 | help='Last unperturbed state to consider.') 131 | parser_eig.add_argument('-state', action='store', type=int, 132 | help='Perturbed state to consider.') 133 | parser_eig.add_argument('-dpi', action='store', type=int, default=300, 134 | help='Dpi of the saved image (default=300).') 135 | parser_eig.add_argument('-bins', action='store', type=int, default=20, 136 | help='Number of bins used to calculate ' 137 | 'the histograms (default=20).') 138 | parser_eig.add_argument('-oc', '--output_corr', action='store', type=str, 139 | const='eig_corr.png', nargs='?', 140 | help='Calculate the correlation between a pair of' 141 | ' coefficients of the l-th and m-th unperturbed ' 142 | 'states (provided by -first and -last) of the i-th ' 143 | 'perturbed state (-state). Choose the preferred file ' 144 | 'extention (default=eig_corr.png).') 145 | parser_eig.add_argument('-ot', '--output_tot', action='store', type=str, 146 | const='eig_corr_tot.png', nargs='?', 147 | help='Calculate the correlation between all ' 148 | 'the pairs of coefficients of the l-th and m-th ' 149 | 'unperturbed states of the i-th perturbed state ' 150 | '(provided by -state). Choose the preferred file ' 151 | 'extention (default=eig_corr_tot.png).') 152 | parser_eig.add_argument('-oh', '--output_hist', action='store', type=str, 153 | const='eig_hist.png', nargs='?', 154 | help='Calculate the mean squared coefficients with which each ' 155 | 'unperturbed state contributes to each perturbed ' 156 | 'state. Choose the preferred file extention ' 157 | '(default=eig_hist.png).') 158 | 159 | cmdline = parser.parse_args() 160 | 161 | logging.basicConfig(format='%(message)s', 162 | level=logging.INFO) 163 | logging.info('==========================================================================\n' 164 | '| PyMM: A computational package for PMM-MD simulations in Python. |\n' 165 | '==========================================================================\n\n' 166 | 'User: {}\n'.format(getpass.getuser()) + 167 | 'Date: {}'.format(datetime.today().strftime('%Y-%m-%d-%H:%M:%S'))) 168 | logging.info('\nJob launched:') 169 | logging.info('{}\n\n\n'.format(' '.join(sys.argv))) 170 | 171 | if cmdline.command == 'run_pmm': 172 | start = timer() 173 | 174 | logging.info('==========================================================================\n' 175 | '| |\n' 176 | '| Launching PMM-MD calculation: |\n' 177 | '| |\n' 178 | '==========================================================================\n') 179 | 180 | pmm(cmdline) 181 | 182 | end = timer() 183 | 184 | logging.info('\n' 185 | '==========================================================================\n' 186 | '| |\n' 187 | '| FINISHED |\n' 188 | '| |\n' 189 | '==========================================================================\n' 190 | '\n' 191 | 'Date: {}.'.format(datetime.today().strftime('%Y-%m-%d-%H:%M:%S')) + 192 | '\n' 193 | 'The calculation took: {}'.format(end - start) + 194 | '\n\n' 195 | '--------------------------------------------------------------------------\n') 196 | 197 | elif cmdline.command == 'calc_abs': 198 | 199 | logging.info('==========================================================================\n' 200 | '| |\n' 201 | '| Calculate UV-Vis spectrum: |\n' 202 | '| |\n' 203 | '==========================================================================\n') 204 | 205 | # Change matplotlib settings: 206 | plt.rcParams['axes.linewidth'] = 1.3 207 | plt.rcParams['font.size'] = 18 208 | plt.rcParams['legend.fontsize'] = 15 209 | 210 | dip_matrix = read_raw_matrix(cmdline.dip_matrix) 211 | eigvals = np.loadtxt(cmdline.eigvals) 212 | eigvecs = np.load(cmdline.eigvecs) 213 | pert_matrix = calc_pert_matrix(dip_matrix, eigvecs) 214 | 215 | logging.info(' * Number of frames = {}'.format(eigvals.shape[0])) 216 | logging.info(' * Number of transitions = {}'.format(eigvals.shape[1] - 1)) 217 | logging.info(f' * sigma = {cmdline.sigma} eV.') 218 | 219 | calc_abs(eigvals, pert_matrix, cmdline.output, cmdline.sigma / (2*np.pi*au2eV), 220 | cmdline.extra_range) 221 | 222 | logging.info('\n' 223 | '==========================================================================\n' 224 | '| |\n' 225 | '| FINISHED |\n' 226 | '| |\n' 227 | '==========================================================================\n' 228 | '\n' 229 | 'Date: {}.'.format(datetime.today().strftime('%Y-%m-%d-%H:%M:%S')) + 230 | '\n\n' 231 | '--------------------------------------------------------------------------\n') 232 | 233 | elif cmdline.command == 'free_en': 234 | 235 | logging.info('==========================================================================\n' 236 | '| |\n' 237 | '| Calculate Free Energy Change: |\n' 238 | '| |\n' 239 | '==========================================================================\n') 240 | 241 | col = 0 242 | 243 | if cmdline.en_in_in and cmdline.en_fin_in and cmdline.en_in_fin and cmdline.en_fin_fin: 244 | 245 | logging.info(' * Free energy will be calculated considering two ' 246 | 'ensembles.') 247 | en_in_in = np.loadtxt(cmdline.en_in_in)[:,col] 248 | en_fin_in = np.loadtxt(cmdline.en_fin_in)[:,col] 249 | en_in_fin = np.loadtxt(cmdline.en_in_fin)[:,col] 250 | en_fin_fin = np.loadtxt(cmdline.en_fin_fin)[:,col] 251 | 252 | if en_in_in.shape[0] == en_in_fin.shape[0] == en_fin_in.shape[0] == en_fin_fin.shape[0]: 253 | 254 | logging.info(' * Number of frames = {}\n'.format(en_in_in.shape[0])) 255 | dA = calc_dA_mean(cmdline.temperature, en_in_in, en_fin_in, 256 | en_in_fin, en_fin_fin) 257 | 258 | else: 259 | logging.error(' ! The trajectories are not of the same length\n' 260 | f' * eii: {en_in_in.shape[0]} \n' 261 | f' * efi: {en_fin_in.shape[0]} \n' 262 | f' * eif: {en_in_fin.shape[0]} \n' 263 | f' * eff: {en_fin_fin.shape[0]} \n\n') 264 | raise IOError 265 | 266 | elif (cmdline.en_in_in and cmdline.en_fin_in) and not cmdline.en_in_fin and not cmdline.en_fin_fin: 267 | 268 | logging.info(' * Free energy will be calculated considering only the ' 269 | 'ensemble in the initial state.') 270 | logging.warning(' ! For a more rigorous estimation of the free energy ' 271 | 'consider using both the initial and final ensembles ' 272 | '(see the documentation).') 273 | en_in_in = np.loadtxt(cmdline.en_in_in)[:,col] 274 | en_fin_in = np.loadtxt(cmdline.en_fin_in)[:,col] 275 | 276 | if en_in_in.shape[0] == en_fin_in.shape[0]: 277 | 278 | logging.info(' * Number of frames = {}\n'.format(en_in_in.shape[0])) 279 | dA = calc_dA(cmdline.temperature, en_in_in, en_fin_in, state='ini') 280 | 281 | else: 282 | logging.error(' ! The trajectories are not of the same length\n' 283 | f' * eii: {en_in_in.shape[0]} \n' 284 | f' * efi: {en_fin_in.shape[0]} \n\n') 285 | raise IOError 286 | 287 | elif not cmdline.en_in_in and not cmdline.en_fin_in and (cmdline.en_in_fin and cmdline.en_fin_fin): 288 | 289 | logging.info(' * Free energy will be calculated considering only the ' 290 | 'ensemble in the final state.') 291 | logging.warning(' ! For a more rigorous estimation of the free energy ' 292 | 'consider using both the initial and final ensembles ' 293 | '(see the documentation).') 294 | 295 | en_in_fin = np.loadtxt(cmdline.en_in_fin)[:,col] 296 | en_fin_fin = np.loadtxt(cmdline.en_fin_fin)[:,col] 297 | 298 | if en_in_fin.shape[0] == en_fin_fin.shape[0]: 299 | 300 | logging.info(' * Number of frames = {}\n'.format(en_in_fin.shape[0])) 301 | dA = calc_dA(cmdline.temperature, en_in_fin, en_fin_fin, state='ini') 302 | 303 | else: 304 | logging.error(' ! The trajectories are not of the same length\n' 305 | f' * eii: {en_in_fin.shape[0]} \n' 306 | f' * efi: {en_fin_fin.shape[0]} \n\n') 307 | raise IOError 308 | 309 | else: 310 | raise IOError('Input files provided incorrectly. See documentation.') 311 | 312 | logging.info('================================= RESULTS ================================\n' 313 | ' * Calculated Free Energy Change:\n' 314 | ' {} J/mol\n'.format(dA) + 315 | '==========================================================================\n') 316 | 317 | logging.info('\n' 318 | '==========================================================================\n' 319 | '| |\n' 320 | '| FINISHED |\n' 321 | '| |\n' 322 | '==========================================================================\n' 323 | '\n' 324 | 'Date: {}.'.format(datetime.today().strftime('%Y-%m-%d-%H:%M:%S')) + 325 | '\n\n' 326 | '--------------------------------------------------------------------------\n') 327 | 328 | elif cmdline.command == 'eig': 329 | 330 | logging.info('==========================================================================\n' 331 | '| |\n' 332 | '| Eigenvectors Analysis: |\n' 333 | '| |\n' 334 | '==========================================================================\n') 335 | 336 | eigvecs = np.load(cmdline.input) 337 | 338 | logging.info(' * Number of frames = {}'.format(eigvecs.shape[0])) 339 | logging.info(' * Number of electronic states = {}\n\n'.format(eigvecs.shape[1])) 340 | 341 | # Change matplotlib settings: 342 | plt.rcParams['axes.linewidth'] = 1.3 343 | plt.rcParams['font.size'] = 18 344 | plt.rcParams['legend.fontsize'] = 15 345 | 346 | if cmdline.output_corr is not None: 347 | 348 | logging.info(' * Correlation plot between the contributions arising from the unperturbed\n' 349 | f' states {cmdline.first} and {cmdline.last} to the perturbed state {cmdline.state}.\n' 350 | ) 351 | 352 | eig_corr(eigvecs, cmdline.first, cmdline.last, cmdline.state, 353 | cmdline.output_corr, cmdline.dpi, cmdline.bins) 354 | if cmdline.output_tot is not None: 355 | 356 | logging.info(' * Correlation plot between all the pairs obtained between the contributions\n' 357 | f' arising from the unperturbed states to the perturbed state {cmdline.state}.\n' 358 | ) 359 | 360 | eig_corr_tot(eigvecs, cmdline.state, cmdline.output_tot, 361 | cmdline.dpi, cmdline.bins) 362 | if cmdline.output_hist is not None: 363 | 364 | logging.info(' * Cumulative histogram of the mean contribution arising from each \n' 365 | f' unperturbed state to each the perturbed state.\n' 366 | ) 367 | 368 | logging.info(f' * Only the first {cmdline.state} states (including the ground state) have\n' 369 | ' been explicitly considered.\n') 370 | 371 | eig_hist(eigvecs, cmdline.state, cmdline.output_hist, 372 | cmdline.dpi) 373 | 374 | logging.info('\n' 375 | '==========================================================================\n' 376 | '| |\n' 377 | '| FINISHED |\n' 378 | '| |\n' 379 | '==========================================================================\n' 380 | '\n' 381 | 'Date: {}.'.format(datetime.today().strftime('%Y-%m-%d-%H:%M:%S')) + 382 | '\n\n' 383 | '--------------------------------------------------------------------------\n') 384 | 385 | return 0 -------------------------------------------------------------------------------- /pymm/spectra.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import numpy as np 3 | import matplotlib as mpl 4 | import matplotlib.pyplot as plt 5 | 6 | 7 | def calc_pert_matrix(unpert_matrixs: np.ndarray, 8 | eigvecs: np.ndarray) -> np.ndarray: 9 | '''Calculate trajectory of the perturbed matrix of a generic property. 10 | 11 | Parameters: 12 | unpert_matrixs (np.ndarray): (n_states, n_states, 3) matrix of the 13 | unperturbed matrix. 14 | eigvecs (np.ndarray): (n_frames, n_states, n_states) matrix 15 | of the perturbed eigenvectors along the MD trajectory. 16 | 17 | Returns: 18 | pert_matrixs (np.ndarray): (n_frames, n_states_n_states, 3) perturbed 19 | matrix trajectory. 20 | ''' 21 | 22 | pert_matrixs = np.einsum('ijk,mjn->mink', unpert_matrixs, eigvecs) 23 | pert_matrixs = np.einsum('ijk,ijmn->ikmn', eigvecs, pert_matrixs) 24 | return pert_matrixs 25 | 26 | def calc_abs(energies: np.ndarray, pert_matrix: np.ndarray, 27 | output_fn: str, sigma: float, extra_range) -> np.ndarray: 28 | '''Calculate UV spectrum from the PMM trajectory. 29 | 30 | Parameters: 31 | energies (np.ndarray): (n_frames, n_states) array of the perturbed 32 | energies trajectory. 33 | pert_matrixs (np.ndarray): (n_frames, n_states_n_states, 3) perturbed 34 | matrix trajectory. 35 | sigma (float): square root of the variance of the gaussian broadening 36 | expressed in a.u.. 37 | Returns: 38 | 0 39 | ''' 40 | 41 | plt.style.use('seaborn-colorblind') 42 | 43 | fig, ax = plt.subplots(1, 1, figsize=(8,5)) 44 | 45 | exc_ens = (energies[:, 1:] - np.expand_dims(energies[:, 0], axis=1)) / (2 46 | * np.pi) 47 | mu_squareds = (pert_matrix[:, 0, 1:, :]**2).sum(axis=2) 48 | 49 | n_frames = energies.shape[0] 50 | n_states = energies.shape[1] 51 | # histos = [] 52 | 53 | vmin = exc_ens.min() - extra_range 54 | if vmin < 0.: 55 | vmin = 0. 56 | vmax = exc_ens.max() + extra_range 57 | n_bins = int(round((vmax - vmin) / (0.0016 / (2 * np.pi * 10)))) 58 | bin_edges = np.histogram_bin_edges(exc_ens, range=(vmin, 59 | vmax), 60 | bins=n_bins) 61 | bin_step = bin_edges[1] - bin_edges[0] 62 | bin_centers = bin_edges[:-1] + bin_step / 2 63 | spectra = [] 64 | for i in range(exc_ens.shape[1]): 65 | histo, bin_edges_tmp = np.histogram(exc_ens[:, i], bins=bin_edges, 66 | weights=mu_squareds[:, i]) 67 | # histos.append(histo) 68 | histo = histo * 4 * np.pi / (6 * n_frames) 69 | spectrum_tmp = np.zeros_like(bin_centers) 70 | for j, intensity in enumerate(histo): 71 | if intensity: 72 | spectrum_tmp += bin_centers * intensity *\ 73 | np.exp(-(bin_centers - bin_centers[j]) ** 2 74 | / (2 * sigma ** 2)) 75 | spectra.append(spectrum_tmp * np.sqrt(2*np.pi) / (137 * sigma) 76 | * 16863 / 2.3) 77 | 78 | spectra = np.array(spectra) 79 | tot_spectrum = np.sum(spectra, axis=0) 80 | lambdas = 137 * 0.0529 / bin_centers 81 | tot_spectrum = np.vstack((lambdas, tot_spectrum)).transpose((1,0)) 82 | spectra = np.vstack((lambdas, spectra)).transpose((1,0)) 83 | np.savetxt(f'{output_fn}_tot.dat', tot_spectrum, header=f'sigma = {sigma} a.u.\n' 84 | 'wavelength (nm); eps (M^-1 cm^-1)') 85 | np.savetxt(f'{output_fn}_transitions.dat', spectra, header=f'sigma = {sigma} a.u.\n' 86 | 'wavelength (nm); eps' + '; eps'.join([str(i) for i in range(1, n_states)]) + 87 | ' (M^-1 cm^-1)') 88 | 89 | logging.info(' * The total UV-Vis spectrum has been saved as {}'.format(f'{output_fn}_tot.dat')) 90 | logging.info(' * All the transitions considered on their own have been saved' 91 | ' as {}'.format(f'{output_fn}_transitions.dat')) 92 | 93 | for i in range(1, spectra.shape[1]): 94 | ax.plot(lambdas, spectra[:, i], label=r'0 $\longrightarrow$ {}'.format(i)) 95 | ax.plot(lambdas, tot_spectrum[:, 1], color='k', 96 | linestyle='--', label='Total spectrum') 97 | 98 | ax.set_xlabel('wavelength (nm)') 99 | ax.set_ylabel('$\epsilon$ (M$^{-1}$cm$^{-1}$)') 100 | 101 | ax.legend(frameon=False) 102 | 103 | plt.tight_layout() 104 | 105 | plt.show() 106 | 107 | return 0 108 | 109 | if __name__ == '__main__': 110 | pass -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from os import name 2 | from setuptools import setup, find_packages 3 | 4 | with open('README.md') as f: 5 | readme = f.read() 6 | 7 | with open('LICENSE') as f: 8 | license = f.read() 9 | 10 | setup( 11 | name = 'PyMM', 12 | version = '1.0', 13 | long_description=readme, 14 | license=license, 15 | url='https://github.com/ChenGiuseppe/PyMM', 16 | packages = find_packages(), 17 | entry_points= { 18 | 'console_scripts': ['pymm=pymm.pymm:main'] 19 | } 20 | ) 21 | -------------------------------------------------------------------------------- /tests/doxo/README.md: -------------------------------------------------------------------------------- 1 | # Test: Doxorubicin 2 | Input files to calculate the absorption spectrum of __Doxorubicin__ in water. __1,4-dihydroxy-5-methoxy-9,10-anthraquinone__ has been used as QC. 3 | 4 | | WARNING: The length of the MD simulation has been reduced for practical reasons. | 5 | | --- | 6 | 7 | 1. Run the MD-PMM simulation for the Doxorubicin in water: 8 | 9 | > pymm run_pmm -g data/ref_geom.dat -gu bohr -dm data/dipmat.dat -e data/energies.dat -traj data/traj.xtc -top data/topol.tpr -nm 17:44 -o TEST_DX 10 | 11 | 2. Calculate the absorption spectrum of Doxorubicin: 12 | 13 | > pymm calc_abs -dm data/dipmat.dat -el TEST_DX_eigvals.dat -ev TEST_DX_eigvecs.npy -sigma 0.14 -ot TEST_DX 14 | 15 | 3. Analyse the perturbed wavefunction: 16 | 17 | * Total projection analysis of the first perturbed electronic excited state: 18 | 19 | > pymm eig -i TEST_DX_eigvecs.npy -state 1 -ot 20 | 21 | * Projection analysis of the first perturbed electronic excited state on the first and second unperturbed states: 22 | 23 | > pymm eig -i TEST_DX_eigvecs.npy -state 1 -first 1 -last 2 -oc 24 | 25 | * Cumulative histogram (considering only the first 5 states): 26 | 27 | > pymm eig -i TEST_DX_eigvecs.npy -state 5 -oh 28 | -------------------------------------------------------------------------------- /tests/doxo/data/dipmat.dat: -------------------------------------------------------------------------------- 1 | 0 0 -1.639534 0.1455994 0.000178 2 | 0 1 1.6682732 -0.529784 -1.46e-05 3 | 0 2 0.000216 -5.62e-05 -0.0157529 4 | 0 3 0.694355 -0.1865617 1.14e-05 5 | 0 4 -0.0001223 4.02e-05 0.01062 6 | 0 5 0.2398552 -0.086039 1.15e-05 7 | 0 6 -0.126433 0.1964839 -3.18e-05 8 | 0 7 0.2725871 -0.0049183 1.14e-05 9 | 0 8 -0.331416 -1.0347458 1e-07 10 | 0 9 0.0018982 0.0007472 -0.0101919 11 | 0 10 -0.716487 -0.2303458 -5.67e-05 12 | 1 0 1.6682732 -0.529784 -1.46e-05 13 | 1 1 -0.6672602 -0.3542888 0.0001868 14 | 1 2 0.000834 -2.6e-06 0.0164729 15 | 1 3 0.9534342 -0.1045488 -1.63e-05 16 | 1 4 -0.000161 0.0005491 -0.0017689 17 | 1 5 0.1774215 -0.1012511 -2.08e-05 18 | 1 6 0.3766577 0.778677 -2.88e-05 19 | 1 7 -0.722673 0.333298 3.44e-05 20 | 1 8 0.1201649 0.0200122 -6.11e-05 21 | 1 9 -0.0001273 -0.0004413 -0.0014797 22 | 1 10 0.0448442 0.1105133 -1.7e-05 23 | 2 0 0.000216 -5.62e-05 -0.0157529 24 | 2 1 0.000834 -2.6e-06 0.0164729 25 | 2 2 -1.9016572 -0.5825985 0.0003512 26 | 2 3 -0.0013815 0.0002667 -0.0052784 27 | 2 4 -0.4144902 -0.8834899 0.0001042 28 | 2 5 -0.0003011 0.0001451 0.0019199 29 | 2 6 0.0001086 0.0001901 0.0007736 30 | 2 7 -0.0003192 0.0001501 -0.0015876 31 | 2 8 -6.93e-05 0.000755 -0.0039178 32 | 2 9 0.4538655 0.7311646 -3.44e-05 33 | 2 10 0.0006034 0.000953 0.0024542 34 | 3 0 0.694355 -0.1865617 1.14e-05 35 | 3 1 0.9534342 -0.1045488 -1.63e-05 36 | 3 2 -0.0013815 0.0002667 -0.0052784 37 | 3 3 -3.9670862 0.1879023 0.0002687 38 | 3 4 0.000704 0.0010458 -0.0106325 39 | 3 5 -0.5201717 0.1121739 3.06e-05 40 | 3 6 0.1504247 0.1146749 -1.99e-05 41 | 3 7 -0.3109677 0.1021934 3.4e-06 42 | 3 8 -0.3201881 -0.0390159 1.82e-05 43 | 3 9 0.0007225 0.0008413 0.003054 44 | 3 10 -0.4594191 -0.6653713 4.06e-05 45 | 4 0 -0.0001223 4.02e-05 0.01062 46 | 4 1 -0.000161 0.0005491 -0.0017689 47 | 4 2 -0.4144902 -0.8834899 0.0001042 48 | 4 3 0.000704 0.0010458 -0.0106325 49 | 4 4 -1.3503833 0.690028 0.0002474 50 | 4 5 0.0001069 4.94e-05 0.0089886 51 | 4 6 -5.07e-05 -3.84e-05 0.0016067 52 | 4 7 6.49e-05 -1.57e-05 -0.0010312 53 | 4 8 0.0001969 -0.0005363 -0.0094009 54 | 4 9 0.0663612 -0.0646005 9.8e-06 55 | 4 10 0.0002606 3.72e-05 -0.0015985 56 | 5 0 0.2398552 -0.086039 1.15e-05 57 | 5 1 0.1774215 -0.1012511 -2.08e-05 58 | 5 2 -0.0003011 0.0001451 0.0019199 59 | 5 3 -0.5201717 0.1121739 3.06e-05 60 | 5 4 0.0001069 4.94e-05 0.0089886 61 | 5 5 -1.7958803 0.1608242 0.000135 62 | 5 6 0.5596123 -0.1629411 2.29e-05 63 | 5 7 0.0834207 -0.0593429 5e-07 64 | 5 8 1.8980183 -0.6198479 -4.9e-05 65 | 5 9 0.0006587 0.000201 0.0031955 66 | 5 10 -0.33757 -0.0835248 2.42e-05 67 | 6 0 -0.126433 0.1964839 -3.18e-05 68 | 6 1 0.3766577 0.778677 -2.88e-05 69 | 6 2 0.0001086 0.0001901 0.0007736 70 | 6 3 0.1504247 0.1146749 -1.99e-05 71 | 6 4 -5.07e-05 -3.84e-05 0.0016067 72 | 6 5 0.5596123 -0.1629411 2.29e-05 73 | 6 6 0.6643624 -0.5614346 0.0001712 74 | 6 7 -0.1734912 0.100857 3.8e-06 75 | 6 8 -0.6012088 0.2068817 1.78e-05 76 | 6 9 0.0014529 -0.0002424 0.0161343 77 | 6 10 -0.6662407 0.1326019 4.3e-05 78 | 7 0 0.2725871 -0.0049183 1.14e-05 79 | 7 1 -0.722673 0.333298 3.44e-05 80 | 7 2 -0.0003192 0.0001501 -0.0015876 81 | 7 3 -0.3109677 0.1021934 3.4e-06 82 | 7 4 6.49e-05 -1.57e-05 -0.0010312 83 | 7 5 0.0834207 -0.0593429 5e-07 84 | 7 6 -0.1734912 0.100857 3.8e-06 85 | 7 7 -0.150862 -0.3945003 0.0002372 86 | 7 8 -0.205626 -0.024283 -5.9e-06 87 | 7 9 3.82e-05 0.0001122 0.0009188 88 | 7 10 0.0207751 -0.0349567 7e-06 89 | 8 0 -0.331416 -1.0347458 1e-07 90 | 8 1 0.1201649 0.0200122 -6.11e-05 91 | 8 2 -6.93e-05 0.000755 -0.0039178 92 | 8 3 -0.3201881 -0.0390159 1.82e-05 93 | 8 4 0.0001969 -0.0005363 -0.0094009 94 | 8 5 1.8980183 -0.6198479 -4.9e-05 95 | 8 6 -0.6012088 0.2068817 1.78e-05 96 | 8 7 -0.205626 -0.024283 -5.9e-06 97 | 8 8 -1.7159699 0.0718071 0.0001719 98 | 8 9 0.0008501 -0.0002465 0.0065868 99 | 8 10 -0.3823524 0.1693159 2.18e-05 100 | 9 0 0.0018982 0.0007472 -0.0101919 101 | 9 1 -0.0001273 -0.0004413 -0.0014797 102 | 9 2 0.4538655 0.7311646 -3.44e-05 103 | 9 3 0.0007225 0.0008413 0.003054 104 | 9 4 0.0663612 -0.0646005 9.8e-06 105 | 9 5 0.0006587 0.000201 0.0031955 106 | 9 6 0.0014529 -0.0002424 0.0161343 107 | 9 7 3.82e-05 0.0001122 0.0009188 108 | 9 8 0.0008501 -0.0002465 0.0065868 109 | 9 9 -1.3951802 -0.9813009 0.0003346 110 | 9 10 0.0051629 -0.0024888 0.0094175 111 | 10 0 -0.716487 -0.2303458 -5.67e-05 112 | 10 1 0.0448442 0.1105133 -1.7e-05 113 | 10 2 0.0006034 0.000953 0.0024542 114 | 10 3 -0.4594191 -0.6653713 4.06e-05 115 | 10 4 0.0002606 3.72e-05 -0.0015985 116 | 10 5 -0.33757 -0.0835248 2.42e-05 117 | 10 6 -0.6662407 0.1326019 4.3e-05 118 | 10 7 0.0207751 -0.0349567 7e-06 119 | 10 8 -0.3823524 0.1693159 2.18e-05 120 | 10 9 0.0051629 -0.0024888 0.0094175 121 | 10 10 -3.9585628 0.3262162 0.0003053 122 | -------------------------------------------------------------------------------- /tests/doxo/data/energies.dat: -------------------------------------------------------------------------------- 1 | -954.051553546 2 | -953.956241497 3 | -953.942180020 4 | -953.934330296 5 | -953.925554861 6 | -953.916990828 7 | -953.909186646 8 | -953.889713047 9 | -953.888571826 10 | -953.882230929 11 | -953.880038161 12 | -------------------------------------------------------------------------------- /tests/doxo/data/ref_geom.dat: -------------------------------------------------------------------------------- 1 | 28 2 | 12.0 7.410036 -0.594837 0.000017 3 | 12.0 6.517427 -3.025189 0.000123 4 | 12.0 5.723667 1.465539 -0.000129 5 | 16.0 6.702961 3.796163 -0.000265 6 | 1.0 5.251906 4.978391 -0.000183 7 | 12.0 3.109824 1.006839 -0.000060 8 | 12.0 2.178546 -1.513707 0.000038 9 | 12.0 3.898694 -3.532229 0.000127 10 | 16.0 3.182310 -5.956241 0.000140 11 | 1.0 1.305117 -5.932922 -0.000026 12 | 12.0 -0.544020 -2.049548 -0.000023 13 | 16.0 -1.287223 -4.273221 0.000149 14 | 12.0 -2.335367 0.104375 -0.000117 15 | 12.0 -4.999214 -0.242818 -0.000221 16 | 12.0 -6.591119 1.869058 -0.000009 17 | 1.0 -8.612336 1.618624 -0.000049 18 | 12.0 -5.601143 4.296927 0.000229 19 | 1.0 -6.872872 5.896475 0.000342 20 | 12.0 -3.013074 4.676413 0.000225 21 | 1.0 -2.204664 6.547553 0.000355 22 | 12.0 -1.396277 2.600702 0.000059 23 | 12.0 1.364433 3.122854 0.000064 24 | 16.0 2.131639 5.342301 0.000043 25 | 16.0 -5.901140 -2.619708 -0.000739 26 | 12.0 -8.560013 -3.028265 0.000223 27 | 1.0 -8.792869 -5.065932 0.000465 28 | 1.0 -9.442893 -2.236185 1.687960 29 | 1.0 -9.444146 -2.236519 -1.687023 30 | -------------------------------------------------------------------------------- /tests/doxo/data/topol.tpr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChenGiuseppe/PyMM/0e764d8b9d2f429b1c2d5139889eec3b6387139a/tests/doxo/data/topol.tpr -------------------------------------------------------------------------------- /tests/doxo/data/traj.xtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChenGiuseppe/PyMM/0e764d8b9d2f429b1c2d5139889eec3b6387139a/tests/doxo/data/traj.xtc -------------------------------------------------------------------------------- /tests/guanosine/README.md: -------------------------------------------------------------------------------- 1 | # Test: Guanosine 2 | Input files to calculate __guanosine__ (radical cation/neutral) redox potential in aqueous solution using MD-PMM with PyMM. The QC used is __guanine__ in the radical cationic and neutral form. The atom-based expansion approximation has been used. 3 | 4 | | WARNING: The length of the MD simulation has been reduced for practical reasons. The electric dipole matrix lacks the elements associated with the i --> j transitions (where i, j are the electronic states and i, j =/= 0) due to the limitations of the software used to calculate the unperturbed properties. Since for the modelling of the redox process only the ground state is needed and since no relevant mixing is observed between the unperturbed ground state and the excited states, such approximation doesn't significantly influence the results of the calculation. | 5 | | --- | 6 | 7 | 1. Run the MD-PMM simulations for guanosine in both oxidized and reduced form in both ensembles. 8 | 9 | * Neutral ensemble, neutral guanine QC: 10 | 11 | > pymm run_pmm -g gua_n/geom_gua_n.dat -gu bohr -dm gua_n/dipmat_gua_n.dat -e gua_n/energies_gua_n.dat -traj ensemble_n/traj_n.xtc -top ensemble_n/topol_n.dat -ch gua_n/guanine_n_charges.dat -nm 9,11:25 -o TEST_N_GUA_N 12 | 13 | * Neutral ensemble, radical cation guanine QC: 14 | 15 | > pymm run_pmm -g gua_rc/geom_gua_rc.dat -gu bohr -dm gua_rc/dipmat_gua_rc.dat -e gua_rc/energies_gua_rc.dat -traj ensemble_n/traj_n.xtc -top ensemble_n/topol_n.dat -ch gua_rc/guanine_rc_charges.dat -nm 9,11:25 -o TEST_N_GUA_RC 16 | 17 | * Radical cation ensemble, neutral guanine QC: 18 | 19 | > pymm run_pmm -g gua_n/geom_gua_n.dat -gu bohr -dm gua_n/dipmat_gua_n.dat -e gua_n/energies_gua_n.dat -traj ensemble_rc/traj_rc.xtc -top ensemble_rc/topol_rc.dat -ch gua_n/guanine_n_charges.dat -nm 9,11:25 -o TEST_RC_GUA_N 20 | 21 | * Radical cation ensemble, radical cation guanine QC: 22 | 23 | > pymm run_pmm -g gua_rc/geom_gua_rc.dat -gu bohr -dm gua_rc/dipmat_gua_rc.dat -e gua_rc/energies_gua_rc.dat -traj ensemble_rc/traj_rc.xtc -top ensemble_rc/topol_rc.dat -ch gua_rc/guanine_rc_charges.dat -nm 9,11:25 -o TEST_RC_GUA_RC 24 | 25 | 2. Calculate the reaction free energy change: 26 | 27 | > pymm free_en -T 300 -eii TEST_N_GUA_N_eigvals.dat -efi TEST_N_GUA_RC_eigvals.dat -eif TEST_RC_GUA_N_eigvals.dat -eff TEST_RC_GUA_RC_eigvals.dat -------------------------------------------------------------------------------- /tests/guanosine/ensemble_n/topol_n.dat: -------------------------------------------------------------------------------- 1 | 1 0.4422 2 | 2 -0.6318 3 | 3 -0.0069 4 | 4 0.0754 5 | 5 0.0754 6 | 6 0.1629 7 | 7 0.1176 8 | 8 -0.3691 9 | 9 0.0358 10 | 10 0 11 | 11 0.0577 12 | 12 0.0736 13 | 13 0.1997 14 | 14 -0.5725 15 | 15 0.1991 16 | 16 0.4918 17 | 17 -0.5699 18 | 18 -0.5053 19 | 19 0.352 20 | 20 0.7432 21 | 21 -0.923 22 | 22 0.4235 23 | 23 0.4235 24 | 24 -0.6636 25 | 25 0.1814 26 | 26 0.0713 27 | 27 0.0985 28 | 28 -0.0854 29 | 29 0.0718 30 | 30 0.0718 31 | 31 -0.6549 32 | 32 0.4396 33 | 33 -0.82 34 | 34 0.41 35 | 35 0.41 36 | 36 -0.82 37 | 37 0.41 38 | 38 0.41 39 | 39 -0.82 40 | 40 0.41 41 | 41 0.41 42 | 42 -0.82 43 | 43 0.41 44 | 44 0.41 45 | 45 -0.82 46 | 46 0.41 47 | 47 0.41 48 | 48 -0.82 49 | 49 0.41 50 | 50 0.41 51 | 51 -0.82 52 | 52 0.41 53 | 53 0.41 54 | 54 -0.82 55 | 55 0.41 56 | 56 0.41 57 | 57 -0.82 58 | 58 0.41 59 | 59 0.41 60 | 60 -0.82 61 | 61 0.41 62 | 62 0.41 63 | 63 -0.82 64 | 64 0.41 65 | 65 0.41 66 | 66 -0.82 67 | 67 0.41 68 | 68 0.41 69 | 69 -0.82 70 | 70 0.41 71 | 71 0.41 72 | 72 -0.82 73 | 73 0.41 74 | 74 0.41 75 | 75 -0.82 76 | 76 0.41 77 | 77 0.41 78 | 78 -0.82 79 | 79 0.41 80 | 80 0.41 81 | 81 -0.82 82 | 82 0.41 83 | 83 0.41 84 | 84 -0.82 85 | 85 0.41 86 | 86 0.41 87 | 87 -0.82 88 | 88 0.41 89 | 89 0.41 90 | 90 -0.82 91 | 91 0.41 92 | 92 0.41 93 | 93 -0.82 94 | 94 0.41 95 | 95 0.41 96 | 96 -0.82 97 | 97 0.41 98 | 98 0.41 99 | 99 -0.82 100 | 100 0.41 101 | 101 0.41 102 | 102 -0.82 103 | 103 0.41 104 | 104 0.41 105 | 105 -0.82 106 | 106 0.41 107 | 107 0.41 108 | 108 -0.82 109 | 109 0.41 110 | 110 0.41 111 | 111 -0.82 112 | 112 0.41 113 | 113 0.41 114 | 114 -0.82 115 | 115 0.41 116 | 116 0.41 117 | 117 -0.82 118 | 118 0.41 119 | 119 0.41 120 | 120 -0.82 121 | 121 0.41 122 | 122 0.41 123 | 123 -0.82 124 | 124 0.41 125 | 125 0.41 126 | 126 -0.82 127 | 127 0.41 128 | 128 0.41 129 | 129 -0.82 130 | 130 0.41 131 | 131 0.41 132 | 132 -0.82 133 | 133 0.41 134 | 134 0.41 135 | 135 -0.82 136 | 136 0.41 137 | 137 0.41 138 | 138 -0.82 139 | 139 0.41 140 | 140 0.41 141 | 141 -0.82 142 | 142 0.41 143 | 143 0.41 144 | 144 -0.82 145 | 145 0.41 146 | 146 0.41 147 | 147 -0.82 148 | 148 0.41 149 | 149 0.41 150 | 150 -0.82 151 | 151 0.41 152 | 152 0.41 153 | 153 -0.82 154 | 154 0.41 155 | 155 0.41 156 | 156 -0.82 157 | 157 0.41 158 | 158 0.41 159 | 159 -0.82 160 | 160 0.41 161 | 161 0.41 162 | 162 -0.82 163 | 163 0.41 164 | 164 0.41 165 | 165 -0.82 166 | 166 0.41 167 | 167 0.41 168 | 168 -0.82 169 | 169 0.41 170 | 170 0.41 171 | 171 -0.82 172 | 172 0.41 173 | 173 0.41 174 | 174 -0.82 175 | 175 0.41 176 | 176 0.41 177 | 177 -0.82 178 | 178 0.41 179 | 179 0.41 180 | 180 -0.82 181 | 181 0.41 182 | 182 0.41 183 | 183 -0.82 184 | 184 0.41 185 | 185 0.41 186 | 186 -0.82 187 | 187 0.41 188 | 188 0.41 189 | 189 -0.82 190 | 190 0.41 191 | 191 0.41 192 | 192 -0.82 193 | 193 0.41 194 | 194 0.41 195 | 195 -0.82 196 | 196 0.41 197 | 197 0.41 198 | 198 -0.82 199 | 199 0.41 200 | 200 0.41 201 | 201 -0.82 202 | 202 0.41 203 | 203 0.41 204 | 204 -0.82 205 | 205 0.41 206 | 206 0.41 207 | 207 -0.82 208 | 208 0.41 209 | 209 0.41 210 | 210 -0.82 211 | 211 0.41 212 | 212 0.41 213 | 213 -0.82 214 | 214 0.41 215 | 215 0.41 216 | 216 -0.82 217 | 217 0.41 218 | 218 0.41 219 | 219 -0.82 220 | 220 0.41 221 | 221 0.41 222 | 222 -0.82 223 | 223 0.41 224 | 224 0.41 225 | 225 -0.82 226 | 226 0.41 227 | 227 0.41 228 | 228 -0.82 229 | 229 0.41 230 | 230 0.41 231 | 231 -0.82 232 | 232 0.41 233 | 233 0.41 234 | 234 -0.82 235 | 235 0.41 236 | 236 0.41 237 | 237 -0.82 238 | 238 0.41 239 | 239 0.41 240 | 240 -0.82 241 | 241 0.41 242 | 242 0.41 243 | 243 -0.82 244 | 244 0.41 245 | 245 0.41 246 | 246 -0.82 247 | 247 0.41 248 | 248 0.41 249 | 249 -0.82 250 | 250 0.41 251 | 251 0.41 252 | 252 -0.82 253 | 253 0.41 254 | 254 0.41 255 | 255 -0.82 256 | 256 0.41 257 | 257 0.41 258 | 258 -0.82 259 | 259 0.41 260 | 260 0.41 261 | 261 -0.82 262 | 262 0.41 263 | 263 0.41 264 | 264 -0.82 265 | 265 0.41 266 | 266 0.41 267 | 267 -0.82 268 | 268 0.41 269 | 269 0.41 270 | 270 -0.82 271 | 271 0.41 272 | 272 0.41 273 | 273 -0.82 274 | 274 0.41 275 | 275 0.41 276 | 276 -0.82 277 | 277 0.41 278 | 278 0.41 279 | 279 -0.82 280 | 280 0.41 281 | 281 0.41 282 | 282 -0.82 283 | 283 0.41 284 | 284 0.41 285 | 285 -0.82 286 | 286 0.41 287 | 287 0.41 288 | 288 -0.82 289 | 289 0.41 290 | 290 0.41 291 | 291 -0.82 292 | 292 0.41 293 | 293 0.41 294 | 294 -0.82 295 | 295 0.41 296 | 296 0.41 297 | 297 -0.82 298 | 298 0.41 299 | 299 0.41 300 | 300 -0.82 301 | 301 0.41 302 | 302 0.41 303 | 303 -0.82 304 | 304 0.41 305 | 305 0.41 306 | 306 -0.82 307 | 307 0.41 308 | 308 0.41 309 | 309 -0.82 310 | 310 0.41 311 | 311 0.41 312 | 312 -0.82 313 | 313 0.41 314 | 314 0.41 315 | 315 -0.82 316 | 316 0.41 317 | 317 0.41 318 | 318 -0.82 319 | 319 0.41 320 | 320 0.41 321 | 321 -0.82 322 | 322 0.41 323 | 323 0.41 324 | 324 -0.82 325 | 325 0.41 326 | 326 0.41 327 | 327 -0.82 328 | 328 0.41 329 | 329 0.41 330 | 330 -0.82 331 | 331 0.41 332 | 332 0.41 333 | 333 -0.82 334 | 334 0.41 335 | 335 0.41 336 | 336 -0.82 337 | 337 0.41 338 | 338 0.41 339 | 339 -0.82 340 | 340 0.41 341 | 341 0.41 342 | 342 -0.82 343 | 343 0.41 344 | 344 0.41 345 | 345 -0.82 346 | 346 0.41 347 | 347 0.41 348 | 348 -0.82 349 | 349 0.41 350 | 350 0.41 351 | 351 -0.82 352 | 352 0.41 353 | 353 0.41 354 | 354 -0.82 355 | 355 0.41 356 | 356 0.41 357 | 357 -0.82 358 | 358 0.41 359 | 359 0.41 360 | 360 -0.82 361 | 361 0.41 362 | 362 0.41 363 | 363 -0.82 364 | 364 0.41 365 | 365 0.41 366 | 366 -0.82 367 | 367 0.41 368 | 368 0.41 369 | 369 -0.82 370 | 370 0.41 371 | 371 0.41 372 | 372 -0.82 373 | 373 0.41 374 | 374 0.41 375 | 375 -0.82 376 | 376 0.41 377 | 377 0.41 378 | 378 -0.82 379 | 379 0.41 380 | 380 0.41 381 | 381 -0.82 382 | 382 0.41 383 | 383 0.41 384 | 384 -0.82 385 | 385 0.41 386 | 386 0.41 387 | 387 -0.82 388 | 388 0.41 389 | 389 0.41 390 | 390 -0.82 391 | 391 0.41 392 | 392 0.41 393 | 393 -0.82 394 | 394 0.41 395 | 395 0.41 396 | 396 -0.82 397 | 397 0.41 398 | 398 0.41 399 | 399 -0.82 400 | 400 0.41 401 | 401 0.41 402 | 402 -0.82 403 | 403 0.41 404 | 404 0.41 405 | 405 -0.82 406 | 406 0.41 407 | 407 0.41 408 | 408 -0.82 409 | 409 0.41 410 | 410 0.41 411 | 411 -0.82 412 | 412 0.41 413 | 413 0.41 414 | 414 -0.82 415 | 415 0.41 416 | 416 0.41 417 | 417 -0.82 418 | 418 0.41 419 | 419 0.41 420 | 420 -0.82 421 | 421 0.41 422 | 422 0.41 423 | 423 -0.82 424 | 424 0.41 425 | 425 0.41 426 | 426 -0.82 427 | 427 0.41 428 | 428 0.41 429 | 429 -0.82 430 | 430 0.41 431 | 431 0.41 432 | 432 -0.82 433 | 433 0.41 434 | 434 0.41 435 | 435 -0.82 436 | 436 0.41 437 | 437 0.41 438 | 438 -0.82 439 | 439 0.41 440 | 440 0.41 441 | 441 -0.82 442 | 442 0.41 443 | 443 0.41 444 | 444 -0.82 445 | 445 0.41 446 | 446 0.41 447 | 447 -0.82 448 | 448 0.41 449 | 449 0.41 450 | 450 -0.82 451 | 451 0.41 452 | 452 0.41 453 | 453 -0.82 454 | 454 0.41 455 | 455 0.41 456 | 456 -0.82 457 | 457 0.41 458 | 458 0.41 459 | 459 -0.82 460 | 460 0.41 461 | 461 0.41 462 | 462 -0.82 463 | 463 0.41 464 | 464 0.41 465 | 465 -0.82 466 | 466 0.41 467 | 467 0.41 468 | 468 -0.82 469 | 469 0.41 470 | 470 0.41 471 | 471 -0.82 472 | 472 0.41 473 | 473 0.41 474 | 474 -0.82 475 | 475 0.41 476 | 476 0.41 477 | 477 -0.82 478 | 478 0.41 479 | 479 0.41 480 | 480 -0.82 481 | 481 0.41 482 | 482 0.41 483 | 483 -0.82 484 | 484 0.41 485 | 485 0.41 486 | 486 -0.82 487 | 487 0.41 488 | 488 0.41 489 | 489 -0.82 490 | 490 0.41 491 | 491 0.41 492 | 492 -0.82 493 | 493 0.41 494 | 494 0.41 495 | 495 -0.82 496 | 496 0.41 497 | 497 0.41 498 | 498 -0.82 499 | 499 0.41 500 | 500 0.41 501 | 501 -0.82 502 | 502 0.41 503 | 503 0.41 504 | 504 -0.82 505 | 505 0.41 506 | 506 0.41 507 | 507 -0.82 508 | 508 0.41 509 | 509 0.41 510 | 510 -0.82 511 | 511 0.41 512 | 512 0.41 513 | 513 -0.82 514 | 514 0.41 515 | 515 0.41 516 | 516 -0.82 517 | 517 0.41 518 | 518 0.41 519 | 519 -0.82 520 | 520 0.41 521 | 521 0.41 522 | 522 -0.82 523 | 523 0.41 524 | 524 0.41 525 | 525 -0.82 526 | 526 0.41 527 | 527 0.41 528 | 528 -0.82 529 | 529 0.41 530 | 530 0.41 531 | 531 -0.82 532 | 532 0.41 533 | 533 0.41 534 | 534 -0.82 535 | 535 0.41 536 | 536 0.41 537 | 537 -0.82 538 | 538 0.41 539 | 539 0.41 540 | 540 -0.82 541 | 541 0.41 542 | 542 0.41 543 | 543 -0.82 544 | 544 0.41 545 | 545 0.41 546 | 546 -0.82 547 | 547 0.41 548 | 548 0.41 549 | 549 -0.82 550 | 550 0.41 551 | 551 0.41 552 | 552 -0.82 553 | 553 0.41 554 | 554 0.41 555 | 555 -0.82 556 | 556 0.41 557 | 557 0.41 558 | 558 -0.82 559 | 559 0.41 560 | 560 0.41 561 | 561 -0.82 562 | 562 0.41 563 | 563 0.41 564 | 564 -0.82 565 | 565 0.41 566 | 566 0.41 567 | 567 -0.82 568 | 568 0.41 569 | 569 0.41 570 | 570 -0.82 571 | 571 0.41 572 | 572 0.41 573 | 573 -0.82 574 | 574 0.41 575 | 575 0.41 576 | 576 -0.82 577 | 577 0.41 578 | 578 0.41 579 | 579 -0.82 580 | 580 0.41 581 | 581 0.41 582 | 582 -0.82 583 | 583 0.41 584 | 584 0.41 585 | 585 -0.82 586 | 586 0.41 587 | 587 0.41 588 | 588 -0.82 589 | 589 0.41 590 | 590 0.41 591 | 591 -0.82 592 | 592 0.41 593 | 593 0.41 594 | 594 -0.82 595 | 595 0.41 596 | 596 0.41 597 | 597 -0.82 598 | 598 0.41 599 | 599 0.41 600 | 600 -0.82 601 | 601 0.41 602 | 602 0.41 603 | 603 -0.82 604 | 604 0.41 605 | 605 0.41 606 | 606 -0.82 607 | 607 0.41 608 | 608 0.41 609 | 609 -0.82 610 | 610 0.41 611 | 611 0.41 612 | 612 -0.82 613 | 613 0.41 614 | 614 0.41 615 | 615 -0.82 616 | 616 0.41 617 | 617 0.41 618 | 618 -0.82 619 | 619 0.41 620 | 620 0.41 621 | 621 -0.82 622 | 622 0.41 623 | 623 0.41 624 | 624 -0.82 625 | 625 0.41 626 | 626 0.41 627 | 627 -0.82 628 | 628 0.41 629 | 629 0.41 630 | 630 -0.82 631 | 631 0.41 632 | 632 0.41 633 | 633 -0.82 634 | 634 0.41 635 | 635 0.41 636 | 636 -0.82 637 | 637 0.41 638 | 638 0.41 639 | 639 -0.82 640 | 640 0.41 641 | 641 0.41 642 | 642 -0.82 643 | 643 0.41 644 | 644 0.41 645 | 645 -0.82 646 | 646 0.41 647 | 647 0.41 648 | 648 -0.82 649 | 649 0.41 650 | 650 0.41 651 | 651 -0.82 652 | 652 0.41 653 | 653 0.41 654 | 654 -0.82 655 | 655 0.41 656 | 656 0.41 657 | 657 -0.82 658 | 658 0.41 659 | 659 0.41 660 | 660 -0.82 661 | 661 0.41 662 | 662 0.41 663 | 663 -0.82 664 | 664 0.41 665 | 665 0.41 666 | 666 -0.82 667 | 667 0.41 668 | 668 0.41 669 | 669 -0.82 670 | 670 0.41 671 | 671 0.41 672 | 672 -0.82 673 | 673 0.41 674 | 674 0.41 675 | 675 -0.82 676 | 676 0.41 677 | 677 0.41 678 | 678 -0.82 679 | 679 0.41 680 | 680 0.41 681 | 681 -0.82 682 | 682 0.41 683 | 683 0.41 684 | 684 -0.82 685 | 685 0.41 686 | 686 0.41 687 | 687 -0.82 688 | 688 0.41 689 | 689 0.41 690 | 690 -0.82 691 | 691 0.41 692 | 692 0.41 693 | 693 -0.82 694 | 694 0.41 695 | 695 0.41 696 | 696 -0.82 697 | 697 0.41 698 | 698 0.41 699 | 699 -0.82 700 | 700 0.41 701 | 701 0.41 702 | 702 -0.82 703 | 703 0.41 704 | 704 0.41 705 | 705 -0.82 706 | 706 0.41 707 | 707 0.41 708 | 708 -0.82 709 | 709 0.41 710 | 710 0.41 711 | 711 -0.82 712 | 712 0.41 713 | 713 0.41 714 | 714 -0.82 715 | 715 0.41 716 | 716 0.41 717 | 717 -0.82 718 | 718 0.41 719 | 719 0.41 720 | 720 -0.82 721 | 721 0.41 722 | 722 0.41 723 | 723 -0.82 724 | 724 0.41 725 | 725 0.41 726 | 726 -0.82 727 | 727 0.41 728 | 728 0.41 729 | 729 -0.82 730 | 730 0.41 731 | 731 0.41 732 | 732 -0.82 733 | 733 0.41 734 | 734 0.41 735 | 735 -0.82 736 | 736 0.41 737 | 737 0.41 738 | 738 -0.82 739 | 739 0.41 740 | 740 0.41 741 | 741 -0.82 742 | 742 0.41 743 | 743 0.41 744 | 744 -0.82 745 | 745 0.41 746 | 746 0.41 747 | 747 -0.82 748 | 748 0.41 749 | 749 0.41 750 | 750 -0.82 751 | 751 0.41 752 | 752 0.41 753 | 753 -0.82 754 | 754 0.41 755 | 755 0.41 756 | 756 -0.82 757 | 757 0.41 758 | 758 0.41 759 | 759 -0.82 760 | 760 0.41 761 | 761 0.41 762 | 762 -0.82 763 | 763 0.41 764 | 764 0.41 765 | 765 -0.82 766 | 766 0.41 767 | 767 0.41 768 | 768 -0.82 769 | 769 0.41 770 | 770 0.41 771 | 771 -0.82 772 | 772 0.41 773 | 773 0.41 774 | 774 -0.82 775 | 775 0.41 776 | 776 0.41 777 | 777 -0.82 778 | 778 0.41 779 | 779 0.41 780 | 780 -0.82 781 | 781 0.41 782 | 782 0.41 783 | 783 -0.82 784 | 784 0.41 785 | 785 0.41 786 | 786 -0.82 787 | 787 0.41 788 | 788 0.41 789 | 789 -0.82 790 | 790 0.41 791 | 791 0.41 792 | 792 -0.82 793 | 793 0.41 794 | 794 0.41 795 | 795 -0.82 796 | 796 0.41 797 | 797 0.41 798 | 798 -0.82 799 | 799 0.41 800 | 800 0.41 801 | 801 -0.82 802 | 802 0.41 803 | 803 0.41 804 | 804 -0.82 805 | 805 0.41 806 | 806 0.41 807 | 807 -0.82 808 | 808 0.41 809 | 809 0.41 810 | 810 -0.82 811 | 811 0.41 812 | 812 0.41 813 | 813 -0.82 814 | 814 0.41 815 | 815 0.41 816 | 816 -0.82 817 | 817 0.41 818 | 818 0.41 819 | 819 -0.82 820 | 820 0.41 821 | 821 0.41 822 | 822 -0.82 823 | 823 0.41 824 | 824 0.41 825 | 825 -0.82 826 | 826 0.41 827 | 827 0.41 828 | 828 -0.82 829 | 829 0.41 830 | 830 0.41 831 | 831 -0.82 832 | 832 0.41 833 | 833 0.41 834 | 834 -0.82 835 | 835 0.41 836 | 836 0.41 837 | 837 -0.82 838 | 838 0.41 839 | 839 0.41 840 | 840 -0.82 841 | 841 0.41 842 | 842 0.41 843 | 843 -0.82 844 | 844 0.41 845 | 845 0.41 846 | 846 -0.82 847 | 847 0.41 848 | 848 0.41 849 | 849 -0.82 850 | 850 0.41 851 | 851 0.41 852 | 852 -0.82 853 | 853 0.41 854 | 854 0.41 855 | 855 -0.82 856 | 856 0.41 857 | 857 0.41 858 | 858 -0.82 859 | 859 0.41 860 | 860 0.41 861 | 861 -0.82 862 | 862 0.41 863 | 863 0.41 864 | 864 -0.82 865 | 865 0.41 866 | 866 0.41 867 | 867 -0.82 868 | 868 0.41 869 | 869 0.41 870 | 870 -0.82 871 | 871 0.41 872 | 872 0.41 873 | 873 -0.82 874 | 874 0.41 875 | 875 0.41 876 | 876 -0.82 877 | 877 0.41 878 | 878 0.41 879 | 879 -0.82 880 | 880 0.41 881 | 881 0.41 882 | 882 -0.82 883 | 883 0.41 884 | 884 0.41 885 | 885 -0.82 886 | 886 0.41 887 | 887 0.41 888 | 888 -0.82 889 | 889 0.41 890 | 890 0.41 891 | 891 -0.82 892 | 892 0.41 893 | 893 0.41 894 | 894 -0.82 895 | 895 0.41 896 | 896 0.41 897 | 897 -0.82 898 | 898 0.41 899 | 899 0.41 900 | 900 -0.82 901 | 901 0.41 902 | 902 0.41 903 | 903 -0.82 904 | 904 0.41 905 | 905 0.41 906 | 906 -0.82 907 | 907 0.41 908 | 908 0.41 909 | 909 -0.82 910 | 910 0.41 911 | 911 0.41 912 | 912 -0.82 913 | 913 0.41 914 | 914 0.41 915 | 915 -0.82 916 | 916 0.41 917 | 917 0.41 918 | 918 -0.82 919 | 919 0.41 920 | 920 0.41 921 | 921 -0.82 922 | 922 0.41 923 | 923 0.41 924 | 924 -0.82 925 | 925 0.41 926 | 926 0.41 927 | 927 -0.82 928 | 928 0.41 929 | 929 0.41 930 | 930 -0.82 931 | 931 0.41 932 | 932 0.41 933 | 933 -0.82 934 | 934 0.41 935 | 935 0.41 936 | 936 -0.82 937 | 937 0.41 938 | 938 0.41 939 | 939 -0.82 940 | 940 0.41 941 | 941 0.41 942 | 942 -0.82 943 | 943 0.41 944 | 944 0.41 945 | 945 -0.82 946 | 946 0.41 947 | 947 0.41 948 | 948 -0.82 949 | 949 0.41 950 | 950 0.41 951 | 951 -0.82 952 | 952 0.41 953 | 953 0.41 954 | 954 -0.82 955 | 955 0.41 956 | 956 0.41 957 | 957 -0.82 958 | 958 0.41 959 | 959 0.41 960 | 960 -0.82 961 | 961 0.41 962 | 962 0.41 963 | 963 -0.82 964 | 964 0.41 965 | 965 0.41 966 | 966 -0.82 967 | 967 0.41 968 | 968 0.41 969 | 969 -0.82 970 | 970 0.41 971 | 971 0.41 972 | 972 -0.82 973 | 973 0.41 974 | 974 0.41 975 | 975 -0.82 976 | 976 0.41 977 | 977 0.41 978 | 978 -0.82 979 | 979 0.41 980 | 980 0.41 981 | 981 -0.82 982 | 982 0.41 983 | 983 0.41 984 | 984 -0.82 985 | 985 0.41 986 | 986 0.41 987 | 987 -0.82 988 | 988 0.41 989 | 989 0.41 990 | 990 -0.82 991 | 991 0.41 992 | 992 0.41 993 | 993 -0.82 994 | 994 0.41 995 | 995 0.41 996 | 996 -0.82 997 | 997 0.41 998 | 998 0.41 999 | 999 -0.82 1000 | 1000 0.41 1001 | 1001 0.41 1002 | 1002 -0.82 1003 | 1003 0.41 1004 | 1004 0.41 1005 | 1005 -0.82 1006 | 1006 0.41 1007 | 1007 0.41 1008 | 1008 -0.82 1009 | 1009 0.41 1010 | 1010 0.41 1011 | 1011 -0.82 1012 | 1012 0.41 1013 | 1013 0.41 1014 | 1014 -0.82 1015 | 1015 0.41 1016 | 1016 0.41 1017 | 1017 -0.82 1018 | 1018 0.41 1019 | 1019 0.41 1020 | 1020 -0.82 1021 | 1021 0.41 1022 | 1022 0.41 1023 | 1023 -0.82 1024 | 1024 0.41 1025 | 1025 0.41 1026 | 1026 -0.82 1027 | 1027 0.41 1028 | 1028 0.41 1029 | 1029 -0.82 1030 | 1030 0.41 1031 | 1031 0.41 1032 | 1032 -0.82 1033 | 1033 0.41 1034 | 1034 0.41 1035 | 1035 -0.82 1036 | 1036 0.41 1037 | 1037 0.41 1038 | 1038 -0.82 1039 | 1039 0.41 1040 | 1040 0.41 1041 | 1041 -0.82 1042 | 1042 0.41 1043 | 1043 0.41 1044 | 1044 -0.82 1045 | 1045 0.41 1046 | 1046 0.41 1047 | 1047 -0.82 1048 | 1048 0.41 1049 | 1049 0.41 1050 | 1050 -0.82 1051 | 1051 0.41 1052 | 1052 0.41 1053 | 1053 -0.82 1054 | 1054 0.41 1055 | 1055 0.41 1056 | 1056 -0.82 1057 | 1057 0.41 1058 | 1058 0.41 1059 | 1059 -0.82 1060 | 1060 0.41 1061 | 1061 0.41 1062 | 1062 -0.82 1063 | 1063 0.41 1064 | 1064 0.41 1065 | 1065 -0.82 1066 | 1066 0.41 1067 | 1067 0.41 1068 | 1068 -0.82 1069 | 1069 0.41 1070 | 1070 0.41 1071 | 1071 -0.82 1072 | 1072 0.41 1073 | 1073 0.41 1074 | 1074 -0.82 1075 | 1075 0.41 1076 | 1076 0.41 1077 | 1077 -0.82 1078 | 1078 0.41 1079 | 1079 0.41 1080 | 1080 -0.82 1081 | 1081 0.41 1082 | 1082 0.41 1083 | 1083 -0.82 1084 | 1084 0.41 1085 | 1085 0.41 1086 | 1086 -0.82 1087 | 1087 0.41 1088 | 1088 0.41 1089 | 1089 -0.82 1090 | 1090 0.41 1091 | 1091 0.41 1092 | 1092 -0.82 1093 | 1093 0.41 1094 | 1094 0.41 1095 | 1095 -0.82 1096 | 1096 0.41 1097 | 1097 0.41 1098 | 1098 -0.82 1099 | 1099 0.41 1100 | 1100 0.41 1101 | 1101 -0.82 1102 | 1102 0.41 1103 | 1103 0.41 1104 | 1104 -0.82 1105 | 1105 0.41 1106 | 1106 0.41 1107 | 1107 -0.82 1108 | 1108 0.41 1109 | 1109 0.41 1110 | 1110 -0.82 1111 | 1111 0.41 1112 | 1112 0.41 1113 | 1113 -0.82 1114 | 1114 0.41 1115 | 1115 0.41 1116 | 1116 -0.82 1117 | 1117 0.41 1118 | 1118 0.41 1119 | 1119 -0.82 1120 | 1120 0.41 1121 | 1121 0.41 1122 | 1122 -0.82 1123 | 1123 0.41 1124 | 1124 0.41 1125 | 1125 -0.82 1126 | 1126 0.41 1127 | 1127 0.41 1128 | 1128 -0.82 1129 | 1129 0.41 1130 | 1130 0.41 1131 | 1131 -0.82 1132 | 1132 0.41 1133 | 1133 0.41 1134 | 1134 -0.82 1135 | 1135 0.41 1136 | 1136 0.41 1137 | 1137 -0.82 1138 | 1138 0.41 1139 | 1139 0.41 1140 | 1140 -0.82 1141 | 1141 0.41 1142 | 1142 0.41 1143 | 1143 -0.82 1144 | 1144 0.41 1145 | 1145 0.41 1146 | 1146 -0.82 1147 | 1147 0.41 1148 | 1148 0.41 1149 | 1149 -0.82 1150 | 1150 0.41 1151 | 1151 0.41 1152 | 1152 -0.82 1153 | 1153 0.41 1154 | 1154 0.41 1155 | 1155 -0.82 1156 | 1156 0.41 1157 | 1157 0.41 1158 | 1158 -0.82 1159 | 1159 0.41 1160 | 1160 0.41 1161 | 1161 -0.82 1162 | 1162 0.41 1163 | 1163 0.41 1164 | 1164 -0.82 1165 | 1165 0.41 1166 | 1166 0.41 1167 | 1167 -0.82 1168 | 1168 0.41 1169 | 1169 0.41 1170 | 1170 -0.82 1171 | 1171 0.41 1172 | 1172 0.41 1173 | 1173 -0.82 1174 | 1174 0.41 1175 | 1175 0.41 1176 | 1176 -0.82 1177 | 1177 0.41 1178 | 1178 0.41 1179 | 1179 -0.82 1180 | 1180 0.41 1181 | 1181 0.41 1182 | 1182 -0.82 1183 | 1183 0.41 1184 | 1184 0.41 1185 | 1185 -0.82 1186 | 1186 0.41 1187 | 1187 0.41 1188 | 1188 -0.82 1189 | 1189 0.41 1190 | 1190 0.41 1191 | 1191 -0.82 1192 | 1192 0.41 1193 | 1193 0.41 1194 | 1194 -0.82 1195 | 1195 0.41 1196 | 1196 0.41 1197 | 1197 -0.82 1198 | 1198 0.41 1199 | 1199 0.41 1200 | 1200 -0.82 1201 | 1201 0.41 1202 | 1202 0.41 1203 | 1203 -0.82 1204 | 1204 0.41 1205 | 1205 0.41 1206 | 1206 -0.82 1207 | 1207 0.41 1208 | 1208 0.41 1209 | 1209 -0.82 1210 | 1210 0.41 1211 | 1211 0.41 1212 | 1212 -0.82 1213 | 1213 0.41 1214 | 1214 0.41 1215 | 1215 -0.82 1216 | 1216 0.41 1217 | 1217 0.41 1218 | 1218 -0.82 1219 | 1219 0.41 1220 | 1220 0.41 1221 | 1221 -0.82 1222 | 1222 0.41 1223 | 1223 0.41 1224 | 1224 -0.82 1225 | 1225 0.41 1226 | 1226 0.41 1227 | 1227 -0.82 1228 | 1228 0.41 1229 | 1229 0.41 1230 | 1230 -0.82 1231 | 1231 0.41 1232 | 1232 0.41 1233 | 1233 -0.82 1234 | 1234 0.41 1235 | 1235 0.41 1236 | 1236 -0.82 1237 | 1237 0.41 1238 | 1238 0.41 1239 | 1239 -0.82 1240 | 1240 0.41 1241 | 1241 0.41 1242 | 1242 -0.82 1243 | 1243 0.41 1244 | 1244 0.41 1245 | 1245 -0.82 1246 | 1246 0.41 1247 | 1247 0.41 1248 | 1248 -0.82 1249 | 1249 0.41 1250 | 1250 0.41 1251 | 1251 -0.82 1252 | 1252 0.41 1253 | 1253 0.41 1254 | 1254 -0.82 1255 | 1255 0.41 1256 | 1256 0.41 1257 | 1257 -0.82 1258 | 1258 0.41 1259 | 1259 0.41 1260 | 1260 -0.82 1261 | 1261 0.41 1262 | 1262 0.41 1263 | 1263 -0.82 1264 | 1264 0.41 1265 | 1265 0.41 1266 | 1266 -0.82 1267 | 1267 0.41 1268 | 1268 0.41 1269 | 1269 -0.82 1270 | 1270 0.41 1271 | 1271 0.41 1272 | 1272 -0.82 1273 | 1273 0.41 1274 | 1274 0.41 1275 | 1275 -0.82 1276 | 1276 0.41 1277 | 1277 0.41 1278 | 1278 -0.82 1279 | 1279 0.41 1280 | 1280 0.41 1281 | 1281 -0.82 1282 | 1282 0.41 1283 | 1283 0.41 1284 | 1284 -0.82 1285 | 1285 0.41 1286 | 1286 0.41 1287 | 1287 -0.82 1288 | 1288 0.41 1289 | 1289 0.41 1290 | 1290 -0.82 1291 | 1291 0.41 1292 | 1292 0.41 1293 | 1293 -0.82 1294 | 1294 0.41 1295 | 1295 0.41 1296 | 1296 -0.82 1297 | 1297 0.41 1298 | 1298 0.41 1299 | 1299 -0.82 1300 | 1300 0.41 1301 | 1301 0.41 1302 | 1302 -0.82 1303 | 1303 0.41 1304 | 1304 0.41 1305 | 1305 -0.82 1306 | 1306 0.41 1307 | 1307 0.41 1308 | 1308 -0.82 1309 | 1309 0.41 1310 | 1310 0.41 1311 | 1311 -0.82 1312 | 1312 0.41 1313 | 1313 0.41 1314 | 1314 -0.82 1315 | 1315 0.41 1316 | 1316 0.41 1317 | 1317 -0.82 1318 | 1318 0.41 1319 | 1319 0.41 1320 | 1320 -0.82 1321 | 1321 0.41 1322 | 1322 0.41 1323 | 1323 -0.82 1324 | 1324 0.41 1325 | 1325 0.41 1326 | 1326 -0.82 1327 | 1327 0.41 1328 | 1328 0.41 1329 | 1329 -0.82 1330 | 1330 0.41 1331 | 1331 0.41 1332 | 1332 -0.82 1333 | 1333 0.41 1334 | 1334 0.41 1335 | 1335 -0.82 1336 | 1336 0.41 1337 | 1337 0.41 1338 | 1338 -0.82 1339 | 1339 0.41 1340 | 1340 0.41 1341 | 1341 -0.82 1342 | 1342 0.41 1343 | 1343 0.41 1344 | 1344 -0.82 1345 | 1345 0.41 1346 | 1346 0.41 1347 | 1347 -0.82 1348 | 1348 0.41 1349 | 1349 0.41 1350 | 1350 -0.82 1351 | 1351 0.41 1352 | 1352 0.41 1353 | 1353 -0.82 1354 | 1354 0.41 1355 | 1355 0.41 1356 | 1356 -0.82 1357 | 1357 0.41 1358 | 1358 0.41 1359 | 1359 -0.82 1360 | 1360 0.41 1361 | 1361 0.41 1362 | 1362 -0.82 1363 | 1363 0.41 1364 | 1364 0.41 1365 | 1365 -0.82 1366 | 1366 0.41 1367 | 1367 0.41 1368 | 1368 -0.82 1369 | 1369 0.41 1370 | 1370 0.41 1371 | 1371 -0.82 1372 | 1372 0.41 1373 | 1373 0.41 1374 | 1374 -0.82 1375 | 1375 0.41 1376 | 1376 0.41 1377 | 1377 -0.82 1378 | 1378 0.41 1379 | 1379 0.41 1380 | 1380 -0.82 1381 | 1381 0.41 1382 | 1382 0.41 1383 | 1383 -0.82 1384 | 1384 0.41 1385 | 1385 0.41 1386 | 1386 -0.82 1387 | 1387 0.41 1388 | 1388 0.41 1389 | 1389 -0.82 1390 | 1390 0.41 1391 | 1391 0.41 1392 | 1392 -0.82 1393 | 1393 0.41 1394 | 1394 0.41 1395 | 1395 -0.82 1396 | 1396 0.41 1397 | 1397 0.41 1398 | 1398 -0.82 1399 | 1399 0.41 1400 | 1400 0.41 1401 | 1401 -0.82 1402 | 1402 0.41 1403 | 1403 0.41 1404 | 1404 -0.82 1405 | 1405 0.41 1406 | 1406 0.41 1407 | 1407 -0.82 1408 | 1408 0.41 1409 | 1409 0.41 1410 | 1410 -0.82 1411 | 1411 0.41 1412 | 1412 0.41 1413 | 1413 -0.82 1414 | 1414 0.41 1415 | 1415 0.41 1416 | 1416 -0.82 1417 | 1417 0.41 1418 | 1418 0.41 1419 | 1419 -0.82 1420 | 1420 0.41 1421 | 1421 0.41 1422 | 1422 -0.82 1423 | 1423 0.41 1424 | 1424 0.41 1425 | 1425 -0.82 1426 | 1426 0.41 1427 | 1427 0.41 1428 | 1428 -0.82 1429 | 1429 0.41 1430 | 1430 0.41 1431 | 1431 -0.82 1432 | 1432 0.41 1433 | 1433 0.41 1434 | 1434 -0.82 1435 | 1435 0.41 1436 | 1436 0.41 1437 | 1437 -0.82 1438 | 1438 0.41 1439 | 1439 0.41 1440 | 1440 -0.82 1441 | 1441 0.41 1442 | 1442 0.41 1443 | 1443 -0.82 1444 | 1444 0.41 1445 | 1445 0.41 1446 | 1446 -0.82 1447 | 1447 0.41 1448 | 1448 0.41 1449 | 1449 -0.82 1450 | 1450 0.41 1451 | 1451 0.41 1452 | 1452 -0.82 1453 | 1453 0.41 1454 | 1454 0.41 1455 | 1455 -0.82 1456 | 1456 0.41 1457 | 1457 0.41 1458 | 1458 -0.82 1459 | 1459 0.41 1460 | 1460 0.41 1461 | 1461 -0.82 1462 | 1462 0.41 1463 | 1463 0.41 1464 | 1464 -0.82 1465 | 1465 0.41 1466 | 1466 0.41 1467 | 1467 -0.82 1468 | 1468 0.41 1469 | 1469 0.41 1470 | 1470 -0.82 1471 | 1471 0.41 1472 | 1472 0.41 1473 | 1473 -0.82 1474 | 1474 0.41 1475 | 1475 0.41 1476 | 1476 -0.82 1477 | 1477 0.41 1478 | 1478 0.41 1479 | 1479 -0.82 1480 | 1480 0.41 1481 | 1481 0.41 1482 | 1482 -0.82 1483 | 1483 0.41 1484 | 1484 0.41 1485 | 1485 -0.82 1486 | 1486 0.41 1487 | 1487 0.41 1488 | 1488 -0.82 1489 | 1489 0.41 1490 | 1490 0.41 1491 | 1491 -0.82 1492 | 1492 0.41 1493 | 1493 0.41 1494 | 1494 -0.82 1495 | 1495 0.41 1496 | 1496 0.41 1497 | 1497 -0.82 1498 | 1498 0.41 1499 | 1499 0.41 1500 | 1500 -0.82 1501 | 1501 0.41 1502 | 1502 0.41 1503 | 1503 -0.82 1504 | 1504 0.41 1505 | 1505 0.41 1506 | 1506 -0.82 1507 | 1507 0.41 1508 | 1508 0.41 1509 | 1509 -0.82 1510 | 1510 0.41 1511 | 1511 0.41 1512 | 1512 -0.82 1513 | 1513 0.41 1514 | 1514 0.41 1515 | 1515 -0.82 1516 | 1516 0.41 1517 | 1517 0.41 1518 | 1518 -0.82 1519 | 1519 0.41 1520 | 1520 0.41 1521 | 1521 -0.82 1522 | 1522 0.41 1523 | 1523 0.41 1524 | 1524 -0.82 1525 | 1525 0.41 1526 | 1526 0.41 1527 | 1527 -0.82 1528 | 1528 0.41 1529 | 1529 0.41 1530 | 1530 -0.82 1531 | 1531 0.41 1532 | 1532 0.41 1533 | 1533 -0.82 1534 | 1534 0.41 1535 | 1535 0.41 1536 | 1536 -0.82 1537 | 1537 0.41 1538 | 1538 0.41 1539 | 1539 -0.82 1540 | 1540 0.41 1541 | 1541 0.41 1542 | 1542 -0.82 1543 | 1543 0.41 1544 | 1544 0.41 1545 | 1545 -0.82 1546 | 1546 0.41 1547 | 1547 0.41 1548 | 1548 -0.82 1549 | 1549 0.41 1550 | 1550 0.41 1551 | 1551 -0.82 1552 | 1552 0.41 1553 | 1553 0.41 1554 | 1554 -0.82 1555 | 1555 0.41 1556 | 1556 0.41 1557 | 1557 -0.82 1558 | 1558 0.41 1559 | 1559 0.41 1560 | 1560 -0.82 1561 | 1561 0.41 1562 | 1562 0.41 1563 | 1563 -0.82 1564 | 1564 0.41 1565 | 1565 0.41 1566 | 1566 -0.82 1567 | 1567 0.41 1568 | 1568 0.41 1569 | 1569 -0.82 1570 | 1570 0.41 1571 | 1571 0.41 1572 | 1572 -0.82 1573 | 1573 0.41 1574 | 1574 0.41 1575 | 1575 -0.82 1576 | 1576 0.41 1577 | 1577 0.41 1578 | 1578 -0.82 1579 | 1579 0.41 1580 | 1580 0.41 1581 | 1581 -0.82 1582 | 1582 0.41 1583 | 1583 0.41 1584 | 1584 -0.82 1585 | 1585 0.41 1586 | 1586 0.41 1587 | 1587 -0.82 1588 | 1588 0.41 1589 | 1589 0.41 1590 | 1590 -0.82 1591 | 1591 0.41 1592 | 1592 0.41 1593 | 1593 -0.82 1594 | 1594 0.41 1595 | 1595 0.41 1596 | 1596 -0.82 1597 | 1597 0.41 1598 | 1598 0.41 1599 | 1599 -0.82 1600 | 1600 0.41 1601 | 1601 0.41 1602 | 1602 -0.82 1603 | 1603 0.41 1604 | 1604 0.41 1605 | 1605 -0.82 1606 | 1606 0.41 1607 | 1607 0.41 1608 | 1608 -0.82 1609 | 1609 0.41 1610 | 1610 0.41 1611 | 1611 -0.82 1612 | 1612 0.41 1613 | 1613 0.41 1614 | 1614 -0.82 1615 | 1615 0.41 1616 | 1616 0.41 1617 | 1617 -0.82 1618 | 1618 0.41 1619 | 1619 0.41 1620 | 1620 -0.82 1621 | 1621 0.41 1622 | 1622 0.41 1623 | 1623 -0.82 1624 | 1624 0.41 1625 | 1625 0.41 1626 | 1626 -0.82 1627 | 1627 0.41 1628 | 1628 0.41 1629 | 1629 -0.82 1630 | 1630 0.41 1631 | 1631 0.41 1632 | 1632 -0.82 1633 | 1633 0.41 1634 | 1634 0.41 1635 | 1635 -0.82 1636 | 1636 0.41 1637 | 1637 0.41 1638 | 1638 -0.82 1639 | 1639 0.41 1640 | 1640 0.41 1641 | 1641 -0.82 1642 | 1642 0.41 1643 | 1643 0.41 1644 | 1644 -0.82 1645 | 1645 0.41 1646 | 1646 0.41 1647 | 1647 -0.82 1648 | 1648 0.41 1649 | 1649 0.41 1650 | 1650 -0.82 1651 | 1651 0.41 1652 | 1652 0.41 1653 | 1653 -0.82 1654 | 1654 0.41 1655 | 1655 0.41 1656 | 1656 -0.82 1657 | 1657 0.41 1658 | 1658 0.41 1659 | 1659 -0.82 1660 | 1660 0.41 1661 | 1661 0.41 1662 | 1662 -0.82 1663 | 1663 0.41 1664 | 1664 0.41 1665 | 1665 -0.82 1666 | 1666 0.41 1667 | 1667 0.41 1668 | 1668 -0.82 1669 | 1669 0.41 1670 | 1670 0.41 1671 | 1671 -0.82 1672 | 1672 0.41 1673 | 1673 0.41 1674 | 1674 -0.82 1675 | 1675 0.41 1676 | 1676 0.41 1677 | 1677 -0.82 1678 | 1678 0.41 1679 | 1679 0.41 1680 | 1680 -0.82 1681 | 1681 0.41 1682 | 1682 0.41 1683 | 1683 -0.82 1684 | 1684 0.41 1685 | 1685 0.41 1686 | 1686 -0.82 1687 | 1687 0.41 1688 | 1688 0.41 1689 | 1689 -0.82 1690 | 1690 0.41 1691 | 1691 0.41 1692 | 1692 -0.82 1693 | 1693 0.41 1694 | 1694 0.41 1695 | 1695 -0.82 1696 | 1696 0.41 1697 | 1697 0.41 1698 | 1698 -0.82 1699 | 1699 0.41 1700 | 1700 0.41 1701 | 1701 -0.82 1702 | 1702 0.41 1703 | 1703 0.41 1704 | 1704 -0.82 1705 | 1705 0.41 1706 | 1706 0.41 1707 | 1707 -0.82 1708 | 1708 0.41 1709 | 1709 0.41 1710 | 1710 -0.82 1711 | 1711 0.41 1712 | 1712 0.41 1713 | 1713 -0.82 1714 | 1714 0.41 1715 | 1715 0.41 1716 | 1716 -0.82 1717 | 1717 0.41 1718 | 1718 0.41 1719 | 1719 -0.82 1720 | 1720 0.41 1721 | 1721 0.41 1722 | 1722 -0.82 1723 | 1723 0.41 1724 | 1724 0.41 1725 | 1725 -0.82 1726 | 1726 0.41 1727 | 1727 0.41 1728 | 1728 -0.82 1729 | 1729 0.41 1730 | 1730 0.41 1731 | 1731 -0.82 1732 | 1732 0.41 1733 | 1733 0.41 1734 | 1734 -0.82 1735 | 1735 0.41 1736 | 1736 0.41 1737 | 1737 -0.82 1738 | 1738 0.41 1739 | 1739 0.41 1740 | 1740 -0.82 1741 | 1741 0.41 1742 | 1742 0.41 1743 | 1743 -0.82 1744 | 1744 0.41 1745 | 1745 0.41 1746 | 1746 -0.82 1747 | 1747 0.41 1748 | 1748 0.41 1749 | 1749 -0.82 1750 | 1750 0.41 1751 | 1751 0.41 1752 | 1752 -0.82 1753 | 1753 0.41 1754 | 1754 0.41 1755 | 1755 -0.82 1756 | 1756 0.41 1757 | 1757 0.41 1758 | 1758 -0.82 1759 | 1759 0.41 1760 | 1760 0.41 1761 | 1761 -0.82 1762 | 1762 0.41 1763 | 1763 0.41 1764 | 1764 -0.82 1765 | 1765 0.41 1766 | 1766 0.41 1767 | 1767 -0.82 1768 | 1768 0.41 1769 | 1769 0.41 1770 | 1770 -0.82 1771 | 1771 0.41 1772 | 1772 0.41 1773 | 1773 -0.82 1774 | 1774 0.41 1775 | 1775 0.41 1776 | 1776 -0.82 1777 | 1777 0.41 1778 | 1778 0.41 1779 | 1779 -0.82 1780 | 1780 0.41 1781 | 1781 0.41 1782 | 1782 -0.82 1783 | 1783 0.41 1784 | 1784 0.41 1785 | 1785 -0.82 1786 | 1786 0.41 1787 | 1787 0.41 1788 | 1788 -0.82 1789 | 1789 0.41 1790 | 1790 0.41 1791 | 1791 -0.82 1792 | 1792 0.41 1793 | 1793 0.41 1794 | 1794 -0.82 1795 | 1795 0.41 1796 | 1796 0.41 1797 | 1797 -0.82 1798 | 1798 0.41 1799 | 1799 0.41 1800 | 1800 -0.82 1801 | 1801 0.41 1802 | 1802 0.41 1803 | 1803 -0.82 1804 | 1804 0.41 1805 | 1805 0.41 1806 | 1806 -0.82 1807 | 1807 0.41 1808 | 1808 0.41 1809 | 1809 -0.82 1810 | 1810 0.41 1811 | 1811 0.41 1812 | 1812 -0.82 1813 | 1813 0.41 1814 | 1814 0.41 1815 | 1815 -0.82 1816 | 1816 0.41 1817 | 1817 0.41 1818 | 1818 -0.82 1819 | 1819 0.41 1820 | 1820 0.41 1821 | 1821 -0.82 1822 | 1822 0.41 1823 | 1823 0.41 1824 | 1824 -0.82 1825 | 1825 0.41 1826 | 1826 0.41 1827 | 1827 -0.82 1828 | 1828 0.41 1829 | 1829 0.41 1830 | 1830 -0.82 1831 | 1831 0.41 1832 | 1832 0.41 1833 | 1833 -0.82 1834 | 1834 0.41 1835 | 1835 0.41 1836 | 1836 -0.82 1837 | 1837 0.41 1838 | 1838 0.41 1839 | 1839 -0.82 1840 | 1840 0.41 1841 | 1841 0.41 1842 | 1842 -0.82 1843 | 1843 0.41 1844 | 1844 0.41 1845 | 1845 -0.82 1846 | 1846 0.41 1847 | 1847 0.41 1848 | 1848 -0.82 1849 | 1849 0.41 1850 | 1850 0.41 1851 | 1851 -0.82 1852 | 1852 0.41 1853 | 1853 0.41 1854 | 1854 -0.82 1855 | 1855 0.41 1856 | 1856 0.41 1857 | 1857 -0.82 1858 | 1858 0.41 1859 | 1859 0.41 1860 | 1860 -0.82 1861 | 1861 0.41 1862 | 1862 0.41 1863 | 1863 -0.82 1864 | 1864 0.41 1865 | 1865 0.41 1866 | 1866 -0.82 1867 | 1867 0.41 1868 | 1868 0.41 1869 | 1869 -0.82 1870 | 1870 0.41 1871 | 1871 0.41 1872 | 1872 -0.82 1873 | 1873 0.41 1874 | 1874 0.41 1875 | 1875 -0.82 1876 | 1876 0.41 1877 | 1877 0.41 1878 | 1878 -0.82 1879 | 1879 0.41 1880 | 1880 0.41 1881 | 1881 -0.82 1882 | 1882 0.41 1883 | 1883 0.41 1884 | 1884 -0.82 1885 | 1885 0.41 1886 | 1886 0.41 1887 | 1887 -0.82 1888 | 1888 0.41 1889 | 1889 0.41 1890 | 1890 -0.82 1891 | 1891 0.41 1892 | 1892 0.41 1893 | 1893 -0.82 1894 | 1894 0.41 1895 | 1895 0.41 1896 | 1896 -0.82 1897 | 1897 0.41 1898 | 1898 0.41 1899 | 1899 -0.82 1900 | 1900 0.41 1901 | 1901 0.41 1902 | 1902 -0.82 1903 | 1903 0.41 1904 | 1904 0.41 1905 | 1905 -0.82 1906 | 1906 0.41 1907 | 1907 0.41 1908 | 1908 -0.82 1909 | 1909 0.41 1910 | 1910 0.41 1911 | 1911 -0.82 1912 | 1912 0.41 1913 | 1913 0.41 1914 | 1914 -0.82 1915 | 1915 0.41 1916 | 1916 0.41 1917 | 1917 -0.82 1918 | 1918 0.41 1919 | 1919 0.41 1920 | 1920 -0.82 1921 | 1921 0.41 1922 | 1922 0.41 1923 | 1923 -0.82 1924 | 1924 0.41 1925 | 1925 0.41 1926 | 1926 -0.82 1927 | 1927 0.41 1928 | 1928 0.41 1929 | 1929 -0.82 1930 | 1930 0.41 1931 | 1931 0.41 1932 | 1932 -0.82 1933 | 1933 0.41 1934 | 1934 0.41 1935 | 1935 -0.82 1936 | 1936 0.41 1937 | 1937 0.41 1938 | 1938 -0.82 1939 | 1939 0.41 1940 | 1940 0.41 1941 | 1941 -0.82 1942 | 1942 0.41 1943 | 1943 0.41 1944 | 1944 -0.82 1945 | 1945 0.41 1946 | 1946 0.41 1947 | 1947 -0.82 1948 | 1948 0.41 1949 | 1949 0.41 1950 | 1950 -0.82 1951 | 1951 0.41 1952 | 1952 0.41 1953 | 1953 -0.82 1954 | 1954 0.41 1955 | 1955 0.41 1956 | 1956 -0.82 1957 | 1957 0.41 1958 | 1958 0.41 1959 | 1959 -0.82 1960 | 1960 0.41 1961 | 1961 0.41 1962 | 1962 -0.82 1963 | 1963 0.41 1964 | 1964 0.41 1965 | 1965 -0.82 1966 | 1966 0.41 1967 | 1967 0.41 1968 | 1968 -0.82 1969 | 1969 0.41 1970 | 1970 0.41 1971 | 1971 -0.82 1972 | 1972 0.41 1973 | 1973 0.41 1974 | 1974 -0.82 1975 | 1975 0.41 1976 | 1976 0.41 1977 | 1977 -0.82 1978 | 1978 0.41 1979 | 1979 0.41 1980 | 1980 -0.82 1981 | 1981 0.41 1982 | 1982 0.41 1983 | 1983 -0.82 1984 | 1984 0.41 1985 | 1985 0.41 1986 | 1986 -0.82 1987 | 1987 0.41 1988 | 1988 0.41 1989 | 1989 -0.82 1990 | 1990 0.41 1991 | 1991 0.41 1992 | 1992 -0.82 1993 | 1993 0.41 1994 | 1994 0.41 1995 | 1995 -0.82 1996 | 1996 0.41 1997 | 1997 0.41 1998 | 1998 -0.82 1999 | 1999 0.41 2000 | 2000 0.41 2001 | 2001 -0.82 2002 | 2002 0.41 2003 | 2003 0.41 2004 | 2004 -0.82 2005 | 2005 0.41 2006 | 2006 0.41 2007 | 2007 -0.82 2008 | 2008 0.41 2009 | 2009 0.41 2010 | 2010 -0.82 2011 | 2011 0.41 2012 | 2012 0.41 2013 | 2013 -0.82 2014 | 2014 0.41 2015 | 2015 0.41 2016 | 2016 -0.82 2017 | 2017 0.41 2018 | 2018 0.41 2019 | 2019 -0.82 2020 | 2020 0.41 2021 | 2021 0.41 2022 | 2022 -0.82 2023 | 2023 0.41 2024 | 2024 0.41 2025 | 2025 -0.82 2026 | 2026 0.41 2027 | 2027 0.41 2028 | 2028 -0.82 2029 | 2029 0.41 2030 | 2030 0.41 2031 | 2031 -0.82 2032 | 2032 0.41 2033 | 2033 0.41 2034 | 2034 -0.82 2035 | 2035 0.41 2036 | 2036 0.41 2037 | 2037 -0.82 2038 | 2038 0.41 2039 | 2039 0.41 2040 | 2040 -0.82 2041 | 2041 0.41 2042 | 2042 0.41 2043 | 2043 -0.82 2044 | 2044 0.41 2045 | 2045 0.41 2046 | 2046 -0.82 2047 | 2047 0.41 2048 | 2048 0.41 2049 | 2049 -0.82 2050 | 2050 0.41 2051 | 2051 0.41 2052 | 2052 -0.82 2053 | 2053 0.41 2054 | 2054 0.41 2055 | 2055 -0.82 2056 | 2056 0.41 2057 | 2057 0.41 2058 | 2058 -0.82 2059 | 2059 0.41 2060 | 2060 0.41 2061 | 2061 -0.82 2062 | 2062 0.41 2063 | 2063 0.41 2064 | 2064 -0.82 2065 | 2065 0.41 2066 | 2066 0.41 2067 | 2067 -0.82 2068 | 2068 0.41 2069 | 2069 0.41 2070 | 2070 -0.82 2071 | 2071 0.41 2072 | 2072 0.41 2073 | 2073 -0.82 2074 | 2074 0.41 2075 | 2075 0.41 2076 | 2076 -0.82 2077 | 2077 0.41 2078 | 2078 0.41 2079 | 2079 -0.82 2080 | 2080 0.41 2081 | 2081 0.41 2082 | 2082 -0.82 2083 | 2083 0.41 2084 | 2084 0.41 2085 | 2085 -0.82 2086 | 2086 0.41 2087 | 2087 0.41 2088 | 2088 -0.82 2089 | 2089 0.41 2090 | 2090 0.41 2091 | 2091 -0.82 2092 | 2092 0.41 2093 | 2093 0.41 2094 | 2094 -0.82 2095 | 2095 0.41 2096 | 2096 0.41 2097 | 2097 -0.82 2098 | 2098 0.41 2099 | 2099 0.41 2100 | 2100 -0.82 2101 | 2101 0.41 2102 | 2102 0.41 2103 | 2103 -0.82 2104 | 2104 0.41 2105 | 2105 0.41 2106 | 2106 -0.82 2107 | 2107 0.41 2108 | 2108 0.41 2109 | 2109 -0.82 2110 | 2110 0.41 2111 | 2111 0.41 2112 | 2112 -0.82 2113 | 2113 0.41 2114 | 2114 0.41 2115 | 2115 -0.82 2116 | 2116 0.41 2117 | 2117 0.41 2118 | 2118 -0.82 2119 | 2119 0.41 2120 | 2120 0.41 2121 | 2121 -0.82 2122 | 2122 0.41 2123 | 2123 0.41 2124 | 2124 -0.82 2125 | 2125 0.41 2126 | 2126 0.41 2127 | 2127 -0.82 2128 | 2128 0.41 2129 | 2129 0.41 2130 | 2130 -0.82 2131 | 2131 0.41 2132 | 2132 0.41 2133 | 2133 -0.82 2134 | 2134 0.41 2135 | 2135 0.41 2136 | 2136 -0.82 2137 | 2137 0.41 2138 | 2138 0.41 2139 | 2139 -0.82 2140 | 2140 0.41 2141 | 2141 0.41 2142 | 2142 -0.82 2143 | 2143 0.41 2144 | 2144 0.41 2145 | 2145 -0.82 2146 | 2146 0.41 2147 | 2147 0.41 2148 | 2148 -0.82 2149 | 2149 0.41 2150 | 2150 0.41 2151 | 2151 -0.82 2152 | 2152 0.41 2153 | 2153 0.41 2154 | 2154 -0.82 2155 | 2155 0.41 2156 | 2156 0.41 2157 | 2157 -0.82 2158 | 2158 0.41 2159 | 2159 0.41 2160 | 2160 -0.82 2161 | 2161 0.41 2162 | 2162 0.41 2163 | 2163 -0.82 2164 | 2164 0.41 2165 | 2165 0.41 2166 | 2166 -0.82 2167 | 2167 0.41 2168 | 2168 0.41 2169 | 2169 -0.82 2170 | 2170 0.41 2171 | 2171 0.41 2172 | 2172 -0.82 2173 | 2173 0.41 2174 | 2174 0.41 2175 | 2175 -0.82 2176 | 2176 0.41 2177 | 2177 0.41 2178 | 2178 -0.82 2179 | 2179 0.41 2180 | 2180 0.41 2181 | 2181 -0.82 2182 | 2182 0.41 2183 | 2183 0.41 2184 | 2184 -0.82 2185 | 2185 0.41 2186 | 2186 0.41 2187 | 2187 -0.82 2188 | 2188 0.41 2189 | 2189 0.41 2190 | 2190 -0.82 2191 | 2191 0.41 2192 | 2192 0.41 2193 | 2193 -0.82 2194 | 2194 0.41 2195 | 2195 0.41 2196 | 2196 -0.82 2197 | 2197 0.41 2198 | 2198 0.41 2199 | 2199 -0.82 2200 | 2200 0.41 2201 | 2201 0.41 2202 | 2202 -0.82 2203 | 2203 0.41 2204 | 2204 0.41 2205 | 2205 -0.82 2206 | 2206 0.41 2207 | 2207 0.41 2208 | 2208 -0.82 2209 | 2209 0.41 2210 | 2210 0.41 2211 | 2211 -0.82 2212 | 2212 0.41 2213 | 2213 0.41 2214 | 2214 -0.82 2215 | 2215 0.41 2216 | 2216 0.41 2217 | 2217 -0.82 2218 | 2218 0.41 2219 | 2219 0.41 2220 | 2220 -0.82 2221 | 2221 0.41 2222 | 2222 0.41 2223 | 2223 -0.82 2224 | 2224 0.41 2225 | 2225 0.41 2226 | 2226 -0.82 2227 | 2227 0.41 2228 | 2228 0.41 2229 | 2229 -0.82 2230 | 2230 0.41 2231 | 2231 0.41 2232 | 2232 -0.82 2233 | 2233 0.41 2234 | 2234 0.41 2235 | 2235 -0.82 2236 | 2236 0.41 2237 | 2237 0.41 2238 | 2238 -0.82 2239 | 2239 0.41 2240 | 2240 0.41 2241 | 2241 -0.82 2242 | 2242 0.41 2243 | 2243 0.41 2244 | 2244 -0.82 2245 | 2245 0.41 2246 | 2246 0.41 2247 | 2247 -0.82 2248 | 2248 0.41 2249 | 2249 0.41 2250 | 2250 -0.82 2251 | 2251 0.41 2252 | 2252 0.41 2253 | 2253 -0.82 2254 | 2254 0.41 2255 | 2255 0.41 2256 | 2256 -0.82 2257 | 2257 0.41 2258 | 2258 0.41 2259 | 2259 -0.82 2260 | 2260 0.41 2261 | 2261 0.41 2262 | 2262 -0.82 2263 | 2263 0.41 2264 | 2264 0.41 2265 | 2265 -0.82 2266 | 2266 0.41 2267 | 2267 0.41 2268 | 2268 -0.82 2269 | 2269 0.41 2270 | 2270 0.41 2271 | 2271 -0.82 2272 | 2272 0.41 2273 | 2273 0.41 2274 | 2274 -0.82 2275 | 2275 0.41 2276 | 2276 0.41 2277 | 2277 -0.82 2278 | 2278 0.41 2279 | 2279 0.41 2280 | 2280 -0.82 2281 | 2281 0.41 2282 | 2282 0.41 2283 | 2283 -0.82 2284 | 2284 0.41 2285 | 2285 0.41 2286 | 2286 -0.82 2287 | 2287 0.41 2288 | 2288 0.41 2289 | 2289 -0.82 2290 | 2290 0.41 2291 | 2291 0.41 2292 | 2292 -0.82 2293 | 2293 0.41 2294 | 2294 0.41 2295 | 2295 -0.82 2296 | 2296 0.41 2297 | 2297 0.41 2298 | 2298 -0.82 2299 | 2299 0.41 2300 | 2300 0.41 2301 | 2301 -0.82 2302 | 2302 0.41 2303 | 2303 0.41 2304 | 2304 -0.82 2305 | 2305 0.41 2306 | 2306 0.41 2307 | 2307 -0.82 2308 | 2308 0.41 2309 | 2309 0.41 2310 | 2310 -0.82 2311 | 2311 0.41 2312 | 2312 0.41 2313 | 2313 -0.82 2314 | 2314 0.41 2315 | 2315 0.41 2316 | 2316 -0.82 2317 | 2317 0.41 2318 | 2318 0.41 2319 | 2319 -0.82 2320 | 2320 0.41 2321 | 2321 0.41 2322 | 2322 -0.82 2323 | 2323 0.41 2324 | 2324 0.41 2325 | 2325 -0.82 2326 | 2326 0.41 2327 | 2327 0.41 2328 | 2328 -0.82 2329 | 2329 0.41 2330 | 2330 0.41 2331 | 2331 -0.82 2332 | 2332 0.41 2333 | 2333 0.41 2334 | 2334 -0.82 2335 | 2335 0.41 2336 | 2336 0.41 2337 | 2337 -0.82 2338 | 2338 0.41 2339 | 2339 0.41 2340 | 2340 -0.82 2341 | 2341 0.41 2342 | 2342 0.41 2343 | 2343 -0.82 2344 | 2344 0.41 2345 | 2345 0.41 2346 | 2346 -0.82 2347 | 2347 0.41 2348 | 2348 0.41 2349 | 2349 -0.82 2350 | 2350 0.41 2351 | 2351 0.41 2352 | 2352 -0.82 2353 | 2353 0.41 2354 | 2354 0.41 2355 | 2355 -0.82 2356 | 2356 0.41 2357 | 2357 0.41 2358 | 2358 -0.82 2359 | 2359 0.41 2360 | 2360 0.41 2361 | 2361 -0.82 2362 | 2362 0.41 2363 | 2363 0.41 2364 | 2364 -0.82 2365 | 2365 0.41 2366 | 2366 0.41 2367 | 2367 -0.82 2368 | 2368 0.41 2369 | 2369 0.41 2370 | 2370 -0.82 2371 | 2371 0.41 2372 | 2372 0.41 2373 | 2373 -0.82 2374 | 2374 0.41 2375 | 2375 0.41 2376 | 2376 -0.82 2377 | 2377 0.41 2378 | 2378 0.41 2379 | 2379 -0.82 2380 | 2380 0.41 2381 | 2381 0.41 2382 | 2382 -0.82 2383 | 2383 0.41 2384 | 2384 0.41 2385 | 2385 -0.82 2386 | 2386 0.41 2387 | 2387 0.41 2388 | 2388 -0.82 2389 | 2389 0.41 2390 | 2390 0.41 2391 | 2391 -0.82 2392 | 2392 0.41 2393 | 2393 0.41 2394 | 2394 -0.82 2395 | 2395 0.41 2396 | 2396 0.41 2397 | 2397 -0.82 2398 | 2398 0.41 2399 | 2399 0.41 2400 | 2400 -0.82 2401 | 2401 0.41 2402 | 2402 0.41 2403 | 2403 -0.82 2404 | 2404 0.41 2405 | 2405 0.41 2406 | 2406 -0.82 2407 | 2407 0.41 2408 | 2408 0.41 2409 | 2409 -0.82 2410 | 2410 0.41 2411 | 2411 0.41 2412 | 2412 -0.82 2413 | 2413 0.41 2414 | 2414 0.41 2415 | 2415 -0.82 2416 | 2416 0.41 2417 | 2417 0.41 2418 | 2418 -0.82 2419 | 2419 0.41 2420 | 2420 0.41 2421 | 2421 -0.82 2422 | 2422 0.41 2423 | 2423 0.41 2424 | 2424 -0.82 2425 | 2425 0.41 2426 | 2426 0.41 2427 | 2427 -0.82 2428 | 2428 0.41 2429 | 2429 0.41 2430 | 2430 -0.82 2431 | 2431 0.41 2432 | 2432 0.41 2433 | 2433 -0.82 2434 | 2434 0.41 2435 | 2435 0.41 2436 | 2436 -0.82 2437 | 2437 0.41 2438 | 2438 0.41 2439 | 2439 -0.82 2440 | 2440 0.41 2441 | 2441 0.41 2442 | 2442 -0.82 2443 | 2443 0.41 2444 | 2444 0.41 2445 | 2445 -0.82 2446 | 2446 0.41 2447 | 2447 0.41 2448 | 2448 -0.82 2449 | 2449 0.41 2450 | 2450 0.41 2451 | 2451 -0.82 2452 | 2452 0.41 2453 | 2453 0.41 2454 | 2454 -0.82 2455 | 2455 0.41 2456 | 2456 0.41 2457 | 2457 -0.82 2458 | 2458 0.41 2459 | 2459 0.41 2460 | 2460 -0.82 2461 | 2461 0.41 2462 | 2462 0.41 2463 | 2463 -0.82 2464 | 2464 0.41 2465 | 2465 0.41 2466 | 2466 -0.82 2467 | 2467 0.41 2468 | 2468 0.41 2469 | 2469 -0.82 2470 | 2470 0.41 2471 | 2471 0.41 2472 | 2472 -0.82 2473 | 2473 0.41 2474 | 2474 0.41 2475 | 2475 -0.82 2476 | 2476 0.41 2477 | 2477 0.41 2478 | 2478 -0.82 2479 | 2479 0.41 2480 | 2480 0.41 2481 | 2481 -0.82 2482 | 2482 0.41 2483 | 2483 0.41 2484 | 2484 -0.82 2485 | 2485 0.41 2486 | 2486 0.41 2487 | 2487 -0.82 2488 | 2488 0.41 2489 | 2489 0.41 2490 | 2490 -0.82 2491 | 2491 0.41 2492 | 2492 0.41 2493 | 2493 -0.82 2494 | 2494 0.41 2495 | 2495 0.41 2496 | 2496 -0.82 2497 | 2497 0.41 2498 | 2498 0.41 2499 | 2499 -0.82 2500 | 2500 0.41 2501 | 2501 0.41 2502 | 2502 -0.82 2503 | 2503 0.41 2504 | 2504 0.41 2505 | 2505 -0.82 2506 | 2506 0.41 2507 | 2507 0.41 2508 | 2508 -0.82 2509 | 2509 0.41 2510 | 2510 0.41 2511 | 2511 -0.82 2512 | 2512 0.41 2513 | 2513 0.41 2514 | 2514 -0.82 2515 | 2515 0.41 2516 | 2516 0.41 2517 | 2517 -0.82 2518 | 2518 0.41 2519 | 2519 0.41 2520 | 2520 -0.82 2521 | 2521 0.41 2522 | 2522 0.41 2523 | 2523 -0.82 2524 | 2524 0.41 2525 | 2525 0.41 2526 | 2526 -0.82 2527 | 2527 0.41 2528 | 2528 0.41 2529 | 2529 -0.82 2530 | 2530 0.41 2531 | 2531 0.41 2532 | 2532 -0.82 2533 | 2533 0.41 2534 | 2534 0.41 2535 | 2535 -0.82 2536 | 2536 0.41 2537 | 2537 0.41 2538 | 2538 -0.82 2539 | 2539 0.41 2540 | 2540 0.41 2541 | 2541 -0.82 2542 | 2542 0.41 2543 | 2543 0.41 2544 | 2544 -0.82 2545 | 2545 0.41 2546 | 2546 0.41 2547 | 2547 -0.82 2548 | 2548 0.41 2549 | 2549 0.41 2550 | 2550 -0.82 2551 | 2551 0.41 2552 | 2552 0.41 2553 | 2553 -0.82 2554 | 2554 0.41 2555 | 2555 0.41 2556 | 2556 -0.82 2557 | 2557 0.41 2558 | 2558 0.41 2559 | 2559 -0.82 2560 | 2560 0.41 2561 | 2561 0.41 2562 | 2562 -0.82 2563 | 2563 0.41 2564 | 2564 0.41 2565 | 2565 -0.82 2566 | 2566 0.41 2567 | 2567 0.41 2568 | 2568 -0.82 2569 | 2569 0.41 2570 | 2570 0.41 2571 | 2571 -0.82 2572 | 2572 0.41 2573 | 2573 0.41 2574 | 2574 -0.82 2575 | 2575 0.41 2576 | 2576 0.41 2577 | 2577 -0.82 2578 | 2578 0.41 2579 | 2579 0.41 2580 | 2580 -0.82 2581 | 2581 0.41 2582 | 2582 0.41 2583 | 2583 -0.82 2584 | 2584 0.41 2585 | 2585 0.41 2586 | 2586 -0.82 2587 | 2587 0.41 2588 | 2588 0.41 2589 | 2589 -0.82 2590 | 2590 0.41 2591 | 2591 0.41 2592 | 2592 -0.82 2593 | 2593 0.41 2594 | 2594 0.41 2595 | 2595 -0.82 2596 | 2596 0.41 2597 | 2597 0.41 2598 | 2598 -0.82 2599 | 2599 0.41 2600 | 2600 0.41 2601 | 2601 -0.82 2602 | 2602 0.41 2603 | 2603 0.41 2604 | 2604 -0.82 2605 | 2605 0.41 2606 | 2606 0.41 2607 | 2607 -0.82 2608 | 2608 0.41 2609 | 2609 0.41 2610 | 2610 -0.82 2611 | 2611 0.41 2612 | 2612 0.41 2613 | 2613 -0.82 2614 | 2614 0.41 2615 | 2615 0.41 2616 | 2616 -0.82 2617 | 2617 0.41 2618 | 2618 0.41 2619 | 2619 -0.82 2620 | 2620 0.41 2621 | 2621 0.41 2622 | 2622 -0.82 2623 | 2623 0.41 2624 | 2624 0.41 2625 | 2625 -0.82 2626 | 2626 0.41 2627 | 2627 0.41 2628 | 2628 -0.82 2629 | 2629 0.41 2630 | 2630 0.41 2631 | 2631 -0.82 2632 | 2632 0.41 2633 | 2633 0.41 2634 | 2634 -0.82 2635 | 2635 0.41 2636 | 2636 0.41 2637 | 2637 -0.82 2638 | 2638 0.41 2639 | 2639 0.41 2640 | 2640 -0.82 2641 | 2641 0.41 2642 | 2642 0.41 2643 | 2643 -0.82 2644 | 2644 0.41 2645 | 2645 0.41 2646 | 2646 -0.82 2647 | 2647 0.41 2648 | 2648 0.41 2649 | 2649 -0.82 2650 | 2650 0.41 2651 | 2651 0.41 2652 | 2652 -0.82 2653 | 2653 0.41 2654 | 2654 0.41 2655 | 2655 -0.82 2656 | 2656 0.41 2657 | 2657 0.41 2658 | 2658 -0.82 2659 | 2659 0.41 2660 | 2660 0.41 2661 | 2661 -0.82 2662 | 2662 0.41 2663 | 2663 0.41 2664 | 2664 -0.82 2665 | 2665 0.41 2666 | 2666 0.41 2667 | 2667 -0.82 2668 | 2668 0.41 2669 | 2669 0.41 2670 | 2670 -0.82 2671 | 2671 0.41 2672 | 2672 0.41 2673 | 2673 -0.82 2674 | 2674 0.41 2675 | 2675 0.41 2676 | 2676 -0.82 2677 | 2677 0.41 2678 | 2678 0.41 2679 | 2679 -0.82 2680 | 2680 0.41 2681 | 2681 0.41 2682 | 2682 -0.82 2683 | 2683 0.41 2684 | 2684 0.41 2685 | 2685 -0.82 2686 | 2686 0.41 2687 | 2687 0.41 2688 | 2688 -0.82 2689 | 2689 0.41 2690 | 2690 0.41 2691 | 2691 -0.82 2692 | 2692 0.41 2693 | 2693 0.41 2694 | 2694 -0.82 2695 | 2695 0.41 2696 | 2696 0.41 2697 | 2697 -0.82 2698 | 2698 0.41 2699 | 2699 0.41 2700 | 2700 -0.82 2701 | 2701 0.41 2702 | 2702 0.41 2703 | 2703 -0.82 2704 | 2704 0.41 2705 | 2705 0.41 2706 | 2706 -0.82 2707 | 2707 0.41 2708 | 2708 0.41 2709 | 2709 -0.82 2710 | 2710 0.41 2711 | 2711 0.41 2712 | 2712 -0.82 2713 | 2713 0.41 2714 | 2714 0.41 2715 | 2715 -0.82 2716 | 2716 0.41 2717 | 2717 0.41 2718 | 2718 -0.82 2719 | 2719 0.41 2720 | 2720 0.41 2721 | 2721 -0.82 2722 | 2722 0.41 2723 | 2723 0.41 2724 | 2724 -0.82 2725 | 2725 0.41 2726 | 2726 0.41 2727 | 2727 -0.82 2728 | 2728 0.41 2729 | 2729 0.41 2730 | 2730 -0.82 2731 | 2731 0.41 2732 | 2732 0.41 2733 | 2733 -0.82 2734 | 2734 0.41 2735 | 2735 0.41 2736 | 2736 -0.82 2737 | 2737 0.41 2738 | 2738 0.41 2739 | 2739 -0.82 2740 | 2740 0.41 2741 | 2741 0.41 2742 | 2742 -0.82 2743 | 2743 0.41 2744 | 2744 0.41 2745 | 2745 -0.82 2746 | 2746 0.41 2747 | 2747 0.41 2748 | 2748 -0.82 2749 | 2749 0.41 2750 | 2750 0.41 2751 | 2751 -0.82 2752 | 2752 0.41 2753 | 2753 0.41 2754 | 2754 -0.82 2755 | 2755 0.41 2756 | 2756 0.41 2757 | 2757 -0.82 2758 | 2758 0.41 2759 | 2759 0.41 2760 | 2760 -0.82 2761 | 2761 0.41 2762 | 2762 0.41 2763 | 2763 -0.82 2764 | 2764 0.41 2765 | 2765 0.41 2766 | 2766 -0.82 2767 | 2767 0.41 2768 | 2768 0.41 2769 | 2769 -0.82 2770 | 2770 0.41 2771 | 2771 0.41 2772 | 2772 -0.82 2773 | 2773 0.41 2774 | 2774 0.41 2775 | 2775 -0.82 2776 | 2776 0.41 2777 | 2777 0.41 2778 | 2778 -0.82 2779 | 2779 0.41 2780 | 2780 0.41 2781 | 2781 -0.82 2782 | 2782 0.41 2783 | 2783 0.41 2784 | 2784 -0.82 2785 | 2785 0.41 2786 | 2786 0.41 2787 | 2787 -0.82 2788 | 2788 0.41 2789 | 2789 0.41 2790 | 2790 -0.82 2791 | 2791 0.41 2792 | 2792 0.41 2793 | 2793 -0.82 2794 | 2794 0.41 2795 | 2795 0.41 2796 | 2796 -0.82 2797 | 2797 0.41 2798 | 2798 0.41 2799 | 2799 -0.82 2800 | 2800 0.41 2801 | 2801 0.41 2802 | 2802 -0.82 2803 | 2803 0.41 2804 | 2804 0.41 2805 | 2805 -0.82 2806 | 2806 0.41 2807 | 2807 0.41 2808 | 2808 -0.82 2809 | 2809 0.41 2810 | 2810 0.41 2811 | 2811 -0.82 2812 | 2812 0.41 2813 | 2813 0.41 2814 | 2814 -0.82 2815 | 2815 0.41 2816 | 2816 0.41 2817 | 2817 -0.82 2818 | 2818 0.41 2819 | 2819 0.41 2820 | 2820 -0.82 2821 | 2821 0.41 2822 | 2822 0.41 2823 | 2823 -0.82 2824 | 2824 0.41 2825 | 2825 0.41 2826 | 2826 -0.82 2827 | 2827 0.41 2828 | 2828 0.41 2829 | 2829 -0.82 2830 | 2830 0.41 2831 | 2831 0.41 2832 | 2832 -0.82 2833 | 2833 0.41 2834 | 2834 0.41 2835 | 2835 -0.82 2836 | 2836 0.41 2837 | 2837 0.41 2838 | 2838 -0.82 2839 | 2839 0.41 2840 | 2840 0.41 2841 | 2841 -0.82 2842 | 2842 0.41 2843 | 2843 0.41 2844 | 2844 -0.82 2845 | 2845 0.41 2846 | 2846 0.41 2847 | 2847 -0.82 2848 | 2848 0.41 2849 | 2849 0.41 2850 | 2850 -0.82 2851 | 2851 0.41 2852 | 2852 0.41 2853 | 2853 -0.82 2854 | 2854 0.41 2855 | 2855 0.41 2856 | 2856 -0.82 2857 | 2857 0.41 2858 | 2858 0.41 2859 | 2859 -0.82 2860 | 2860 0.41 2861 | 2861 0.41 2862 | 2862 -0.82 2863 | 2863 0.41 2864 | 2864 0.41 2865 | 2865 -0.82 2866 | 2866 0.41 2867 | 2867 0.41 2868 | 2868 -0.82 2869 | 2869 0.41 2870 | 2870 0.41 2871 | 2871 -0.82 2872 | 2872 0.41 2873 | 2873 0.41 2874 | 2874 -0.82 2875 | 2875 0.41 2876 | 2876 0.41 2877 | 2877 -0.82 2878 | 2878 0.41 2879 | 2879 0.41 2880 | 2880 -0.82 2881 | 2881 0.41 2882 | 2882 0.41 2883 | 2883 -0.82 2884 | 2884 0.41 2885 | 2885 0.41 2886 | 2886 -0.82 2887 | 2887 0.41 2888 | 2888 0.41 2889 | 2889 -0.82 2890 | 2890 0.41 2891 | 2891 0.41 2892 | 2892 -0.82 2893 | 2893 0.41 2894 | 2894 0.41 2895 | 2895 -0.82 2896 | 2896 0.41 2897 | 2897 0.41 2898 | 2898 -0.82 2899 | 2899 0.41 2900 | 2900 0.41 2901 | 2901 -0.82 2902 | 2902 0.41 2903 | 2903 0.41 2904 | 2904 -0.82 2905 | 2905 0.41 2906 | 2906 0.41 2907 | 2907 -0.82 2908 | 2908 0.41 2909 | 2909 0.41 2910 | 2910 -0.82 2911 | 2911 0.41 2912 | 2912 0.41 2913 | 2913 -0.82 2914 | 2914 0.41 2915 | 2915 0.41 2916 | 2916 -0.82 2917 | 2917 0.41 2918 | 2918 0.41 2919 | 2919 -0.82 2920 | 2920 0.41 2921 | 2921 0.41 2922 | 2922 -0.82 2923 | 2923 0.41 2924 | 2924 0.41 2925 | 2925 -0.82 2926 | 2926 0.41 2927 | 2927 0.41 2928 | 2928 -0.82 2929 | 2929 0.41 2930 | 2930 0.41 2931 | 2931 -0.82 2932 | 2932 0.41 2933 | 2933 0.41 2934 | 2934 -0.82 2935 | 2935 0.41 2936 | 2936 0.41 2937 | 2937 -0.82 2938 | 2938 0.41 2939 | 2939 0.41 2940 | 2940 -0.82 2941 | 2941 0.41 2942 | 2942 0.41 2943 | 2943 -0.82 2944 | 2944 0.41 2945 | 2945 0.41 2946 | 2946 -0.82 2947 | 2947 0.41 2948 | 2948 0.41 2949 | 2949 -0.82 2950 | 2950 0.41 2951 | 2951 0.41 2952 | 2952 -0.82 2953 | 2953 0.41 2954 | 2954 0.41 2955 | 2955 -0.82 2956 | 2956 0.41 2957 | 2957 0.41 2958 | 2958 -0.82 2959 | 2959 0.41 2960 | 2960 0.41 2961 | 2961 -0.82 2962 | 2962 0.41 2963 | 2963 0.41 2964 | 2964 -0.82 2965 | 2965 0.41 2966 | 2966 0.41 2967 | 2967 -0.82 2968 | 2968 0.41 2969 | 2969 0.41 2970 | 2970 -0.82 2971 | 2971 0.41 2972 | 2972 0.41 2973 | 2973 -0.82 2974 | 2974 0.41 2975 | 2975 0.41 2976 | 2976 -0.82 2977 | 2977 0.41 2978 | 2978 0.41 2979 | 2979 -0.82 2980 | 2980 0.41 2981 | 2981 0.41 2982 | 2982 -0.82 2983 | 2983 0.41 2984 | 2984 0.41 2985 | 2985 -0.82 2986 | 2986 0.41 2987 | 2987 0.41 2988 | 2988 -0.82 2989 | 2989 0.41 2990 | 2990 0.41 2991 | 2991 -0.82 2992 | 2992 0.41 2993 | 2993 0.41 2994 | 2994 -0.82 2995 | 2995 0.41 2996 | 2996 0.41 2997 | 2997 -0.82 2998 | 2998 0.41 2999 | 2999 0.41 3000 | 3000 -0.82 3001 | 3001 0.41 3002 | 3002 0.41 3003 | 3003 -0.82 3004 | 3004 0.41 3005 | 3005 0.41 3006 | 3006 -0.82 3007 | 3007 0.41 3008 | 3008 0.41 3009 | 3009 -0.82 3010 | 3010 0.41 3011 | 3011 0.41 3012 | 3012 -0.82 3013 | 3013 0.41 3014 | 3014 0.41 3015 | 3015 -0.82 3016 | 3016 0.41 3017 | 3017 0.41 3018 | 3018 -0.82 3019 | 3019 0.41 3020 | 3020 0.41 3021 | 3021 -0.82 3022 | 3022 0.41 3023 | 3023 0.41 3024 | 3024 -0.82 3025 | 3025 0.41 3026 | 3026 0.41 3027 | 3027 -0.82 3028 | 3028 0.41 3029 | 3029 0.41 3030 | 3030 -0.82 3031 | 3031 0.41 3032 | 3032 0.41 3033 | 3033 -0.82 3034 | 3034 0.41 3035 | 3035 0.41 3036 | 3036 -0.82 3037 | 3037 0.41 3038 | 3038 0.41 3039 | 3039 -0.82 3040 | 3040 0.41 3041 | 3041 0.41 3042 | 3042 -0.82 3043 | 3043 0.41 3044 | 3044 0.41 3045 | 3045 -0.82 3046 | 3046 0.41 3047 | 3047 0.41 3048 | 3048 -0.82 3049 | 3049 0.41 3050 | 3050 0.41 3051 | 3051 -0.82 3052 | 3052 0.41 3053 | 3053 0.41 3054 | 3054 -0.82 3055 | 3055 0.41 3056 | 3056 0.41 3057 | 3057 -0.82 3058 | 3058 0.41 3059 | 3059 0.41 3060 | 3060 -0.82 3061 | 3061 0.41 3062 | 3062 0.41 3063 | 3063 -0.82 3064 | 3064 0.41 3065 | 3065 0.41 3066 | 3066 -0.82 3067 | 3067 0.41 3068 | 3068 0.41 3069 | 3069 -0.82 3070 | 3070 0.41 3071 | 3071 0.41 3072 | 3072 -0.82 3073 | 3073 0.41 3074 | 3074 0.41 3075 | 3075 -0.82 3076 | 3076 0.41 3077 | 3077 0.41 3078 | 3078 -0.82 3079 | 3079 0.41 3080 | 3080 0.41 3081 | 3081 -0.82 3082 | 3082 0.41 3083 | 3083 0.41 3084 | 3084 -0.82 3085 | 3085 0.41 3086 | 3086 0.41 3087 | 3087 -0.82 3088 | 3088 0.41 3089 | 3089 0.41 3090 | 3090 -0.82 3091 | 3091 0.41 3092 | 3092 0.41 3093 | 3093 -0.82 3094 | 3094 0.41 3095 | 3095 0.41 3096 | 3096 -0.82 3097 | 3097 0.41 3098 | 3098 0.41 3099 | 3099 -0.82 3100 | 3100 0.41 3101 | 3101 0.41 3102 | 3102 -0.82 3103 | 3103 0.41 3104 | 3104 0.41 3105 | 3105 -0.82 3106 | 3106 0.41 3107 | 3107 0.41 3108 | 3108 -0.82 3109 | 3109 0.41 3110 | 3110 0.41 3111 | 3111 -0.82 3112 | 3112 0.41 3113 | 3113 0.41 3114 | 3114 -0.82 3115 | 3115 0.41 3116 | 3116 0.41 3117 | 3117 -0.82 3118 | 3118 0.41 3119 | 3119 0.41 3120 | 3120 -0.82 3121 | 3121 0.41 3122 | 3122 0.41 3123 | 3123 -0.82 3124 | 3124 0.41 3125 | 3125 0.41 3126 | 3126 -0.82 3127 | 3127 0.41 3128 | 3128 0.41 3129 | 3129 -0.82 3130 | 3130 0.41 3131 | 3131 0.41 3132 | 3132 -0.82 3133 | 3133 0.41 3134 | 3134 0.41 3135 | 3135 -0.82 3136 | 3136 0.41 3137 | 3137 0.41 3138 | 3138 -0.82 3139 | 3139 0.41 3140 | 3140 0.41 3141 | 3141 -0.82 3142 | 3142 0.41 3143 | 3143 0.41 3144 | 3144 -0.82 3145 | 3145 0.41 3146 | 3146 0.41 3147 | 3147 -0.82 3148 | 3148 0.41 3149 | 3149 0.41 3150 | 3150 -0.82 3151 | 3151 0.41 3152 | 3152 0.41 3153 | 3153 -0.82 3154 | 3154 0.41 3155 | 3155 0.41 3156 | 3156 -0.82 3157 | 3157 0.41 3158 | 3158 0.41 3159 | 3159 -0.82 3160 | 3160 0.41 3161 | 3161 0.41 3162 | 3162 -0.82 3163 | 3163 0.41 3164 | 3164 0.41 3165 | 3165 -0.82 3166 | 3166 0.41 3167 | 3167 0.41 3168 | 3168 -0.82 3169 | 3169 0.41 3170 | 3170 0.41 3171 | 3171 -0.82 3172 | 3172 0.41 3173 | 3173 0.41 3174 | 3174 -0.82 3175 | 3175 0.41 3176 | 3176 0.41 3177 | 3177 -0.82 3178 | 3178 0.41 3179 | 3179 0.41 3180 | 3180 -0.82 3181 | 3181 0.41 3182 | 3182 0.41 3183 | 3183 -0.82 3184 | 3184 0.41 3185 | 3185 0.41 3186 | 3186 -0.82 3187 | 3187 0.41 3188 | 3188 0.41 3189 | 3189 -0.82 3190 | 3190 0.41 3191 | 3191 0.41 3192 | 3192 -0.82 3193 | 3193 0.41 3194 | 3194 0.41 3195 | 3195 -0.82 3196 | 3196 0.41 3197 | 3197 0.41 3198 | 3198 -0.82 3199 | 3199 0.41 3200 | 3200 0.41 3201 | 3201 -0.82 3202 | 3202 0.41 3203 | 3203 0.41 3204 | 3204 -0.82 3205 | 3205 0.41 3206 | 3206 0.41 3207 | 3207 -0.82 3208 | 3208 0.41 3209 | 3209 0.41 3210 | 3210 -0.82 3211 | 3211 0.41 3212 | 3212 0.41 3213 | 3213 -0.82 3214 | 3214 0.41 3215 | 3215 0.41 3216 | 3216 -0.82 3217 | 3217 0.41 3218 | 3218 0.41 3219 | 3219 -0.82 3220 | 3220 0.41 3221 | 3221 0.41 3222 | 3222 -0.82 3223 | 3223 0.41 3224 | 3224 0.41 3225 | 3225 -0.82 3226 | 3226 0.41 3227 | 3227 0.41 3228 | 3228 -0.82 3229 | 3229 0.41 3230 | 3230 0.41 3231 | 3231 -0.82 3232 | 3232 0.41 3233 | 3233 0.41 3234 | 3234 -0.82 3235 | 3235 0.41 3236 | 3236 0.41 3237 | 3237 -0.82 3238 | 3238 0.41 3239 | 3239 0.41 3240 | 3240 -0.82 3241 | 3241 0.41 3242 | 3242 0.41 3243 | 3243 -0.82 3244 | 3244 0.41 3245 | 3245 0.41 3246 | 3246 -0.82 3247 | 3247 0.41 3248 | 3248 0.41 3249 | 3249 -0.82 3250 | 3250 0.41 3251 | 3251 0.41 3252 | 3252 -0.82 3253 | 3253 0.41 3254 | 3254 0.41 3255 | -------------------------------------------------------------------------------- /tests/guanosine/ensemble_n/traj_n.xtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChenGiuseppe/PyMM/0e764d8b9d2f429b1c2d5139889eec3b6387139a/tests/guanosine/ensemble_n/traj_n.xtc -------------------------------------------------------------------------------- /tests/guanosine/ensemble_rc/traj_rc.xtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChenGiuseppe/PyMM/0e764d8b9d2f429b1c2d5139889eec3b6387139a/tests/guanosine/ensemble_rc/traj_rc.xtc -------------------------------------------------------------------------------- /tests/guanosine/gua_n/dipmat_gua_n.dat: -------------------------------------------------------------------------------- 1 | 0 0 -1.2470981375999999 -2.2750806288 0.3014266416 2 | 0 1 -0.3932 -0.1366 0.1152 3 | 0 2 -0.8075 -0.585 -0.0231 4 | 0 3 -0.0645 -0.1681 -0.1603 5 | 0 4 -1.1614 0.71 -0.0366 6 | 0 5 -0.0377 0.0449 -0.013 7 | 0 6 -0.1224 0.0209 -0.0566 8 | 0 7 -0.0377 0.0221 -0.0154 9 | 1 0 -0.3932 -0.1366 0.1152 10 | 1 1 3.9032802479999997 -1.6855655039999997 -0.6646258751999999 11 | 1 2 0.0 0.0 0.0 12 | 1 3 0.0 0.0 0.0 13 | 1 4 0.0 0.0 0.0 14 | 1 5 0.0 0.0 0.0 15 | 1 6 0.0 0.0 0.0 16 | 1 7 0.0 0.0 0.0 17 | 2 0 -0.8075 -0.585 -0.0231 18 | 2 1 0.0 0.0 0.0 19 | 2 2 -0.5627601167999999 -2.0457351264 0.42292585439999997 20 | 2 3 0.0 0.0 0.0 21 | 2 4 0.0 0.0 0.0 22 | 2 5 0.0 0.0 0.0 23 | 2 6 0.0 0.0 0.0 24 | 2 7 0.0 0.0 0.0 25 | 3 0 -0.0645 -0.1681 -0.1603 26 | 3 1 0.0 0.0 0.0 27 | 3 2 0.0 0.0 0.0 28 | 3 3 -4.053934550399999 1.593693528 0.34498222079999996 29 | 3 4 0.0 0.0 0.0 30 | 3 5 0.0 0.0 0.0 31 | 3 6 0.0 0.0 0.0 32 | 3 7 0.0 0.0 0.0 33 | 4 0 -1.1614 0.71 -0.0366 34 | 4 1 0.0 0.0 0.0 35 | 4 2 0.0 0.0 0.0 36 | 4 3 0.0 0.0 0.0 37 | 4 4 -1.7360852543999998 -2.3444862671999998 0.27478967039999996 38 | 4 5 0.0 0.0 0.0 39 | 4 6 0.0 0.0 0.0 40 | 4 7 0.0 0.0 0.0 41 | 5 0 -0.0377 0.0449 -0.013 42 | 5 1 0.0 0.0 0.0 43 | 5 2 0.0 0.0 0.0 44 | 5 3 0.0 0.0 0.0 45 | 5 4 0.0 0.0 0.0 46 | 5 5 -1.5889720559999998 -1.1490095568 0.2798652528 47 | 5 6 0.0 0.0 0.0 48 | 5 7 0.0 0.0 0.0 49 | 6 0 -0.1224 0.0209 -0.0566 50 | 6 1 0.0 0.0 0.0 51 | 6 2 0.0 0.0 0.0 52 | 6 3 0.0 0.0 0.0 53 | 6 4 0.0 0.0 0.0 54 | 6 5 0.0 0.0 0.0 55 | 6 6 3.6568194095999997 -0.7986369887999999 0.02262372 56 | 6 7 0.0 0.0 0.0 57 | 7 0 -0.0377 0.0221 -0.0154 58 | 7 1 0.0 0.0 0.0 59 | 7 2 0.0 0.0 0.0 60 | 7 3 0.0 0.0 0.0 61 | 7 4 0.0 0.0 0.0 62 | 7 5 0.0 0.0 0.0 63 | 7 6 0.0 0.0 0.0 64 | 7 7 0.51837828 -1.25709192 0.036591408 65 | -------------------------------------------------------------------------------- /tests/guanosine/gua_n/energies_gua_n.dat: -------------------------------------------------------------------------------- 1 | -542.728986491 2 | -542.560085684 3 | -542.550266258 4 | -542.543815094 5 | -542.538409973 6 | -542.534253592 7 | -542.523423843 8 | -542.516890027 9 | -------------------------------------------------------------------------------- /tests/guanosine/gua_n/geom_gua_n.dat: -------------------------------------------------------------------------------- 1 | 16 2 | 1.0 3.501248658930108 -4.725103327385182 -0.01822073929374497 3 | 14.0 3.2670019879724186 -2.839443893368916 -0.005763664680141274 4 | 12.0 5.124415685603743 -1.0021595584172198 0.001674297346427924 5 | 1.0 7.102490286019231 -1.4815377228105042 -0.0011130486874108886 6 | 14.0 4.200033475024311 1.2797584364001946 0.013301782191316206 7 | 12.0 1.6126450316116587 0.9514752140283447 0.012785886959290445 8 | 12.0 -0.39859237256507485 2.774104722883485 0.0049964358735388615 9 | 16.0 -0.361017058302803 5.066151649728951 -0.005151393415759054 10 | 14.0 -2.788831358572777 1.4907236815023623 -0.00528745369673288 11 | 1.0 -4.284623285541414 2.667134885872312 -0.1339570157971064 12 | 12.0 -3.158149983741108 -1.0656486870266317 -0.005756105775642728 13 | 14.0 -5.617687116465355 -1.9001517436661026 -0.13035897725579854 14 | 1.0 -6.948791301398047 -0.8342007004595291 0.7138912867345475 15 | 1.0 -5.7924943418987285 -3.76599550953943 0.20508252767617433 16 | 14.0 -1.312734157275101 -2.705260110436853 0.013570123301014585 17 | 12.0 0.9989848185278305 -1.602589798902468 -0.0008144719597183243 18 | -------------------------------------------------------------------------------- /tests/guanosine/gua_n/guanine_n_charges.dat: -------------------------------------------------------------------------------- 1 | 0.388486 -0.544532 0.249112 0.118035 -0.575275 0.176435 0.571022 -0.542632 -0.672142 0.409529 0.602525 -0.652497 0.302218 0.332182 -0.659379 0.496913 2 | 0.327909 -0.405303 0.247567 0.217719 -0.450378 0.215098 0.716986 -0.503342 -0.582808 0.261502 0.182104 0.711463 -0.680726 -0.225914 -0.420841 0.388965 3 | 0.312376 -0.506826 0.367218 0.094995 -0.562577 0.192234 0.533565 -0.485451 -0.692009 0.33694 0.726842 -0.90694 0.395359 0.384455 -0.610664 0.420483 4 | -0.879017 0.697613 0.419818 -0.270438 -0.329232 -0.197137 0.627753 -0.350837 -0.462614 0.368401 0.349976 -0.559701 0.377375 0.210407 -0.186621 0.184252 5 | 0.400824 -0.58948 0.135637 0.109619 -0.554378 0.258034 0.510589 -0.541197 -0.67722 0.414539 0.543086 -0.564285 0.284923 0.31634 -0.659773 0.612742 6 | 0.369706 -0.462558 0.075476 0.14007 -0.509633 0.18445 0.345458 -0.242643 -0.737563 0.475367 0.616874 -0.661358 0.28214 0.343078 -0.656895 0.438031 7 | 0.149182 0.078431 0.126316 0.186281 -0.316007 0.15969 0.649032 -0.438495 -0.465613 -0.175582 1.171375 -0.185515 0.136432 -0.549777 -0.420825 -0.104927 8 | 0.351289 -0.357523 -0.015944 0.18063 -0.235348 0.057846 0.581157 -0.411585 -0.692223 0.44843 0.313589 -0.303565 0.03166 0.199316 -0.446186 0.298458 9 | 10 | -------------------------------------------------------------------------------- /tests/guanosine/gua_rc/dipmat_gua_rc.dat: -------------------------------------------------------------------------------- 1 | 0 0 1.3529378016 -2.4402141119999996 0.0003147648 2 | 0 1 0.0001 0.0 0.0426 3 | 0 2 -0.0001 0.0 -0.0324 4 | 0 3 -0.1885 0.4348 0.0 5 | 0 4 0.08 -0.3139 0.0 6 | 0 5 -0.001 0.0002 0.031 7 | 0 6 -0.9593 0.1911 0.0 8 | 0 7 -0.7783 -0.5461 0.0 9 | 1 0 0.0001 0.0 0.0426 10 | 1 1 1.2233727408 -1.4319437663999999 0.00035411039999999996 11 | 1 2 0.0 0.0 0.0 12 | 1 3 0.0 0.0 0.0 13 | 1 4 0.0 0.0 0.0 14 | 1 5 0.0 0.0 0.0 15 | 1 6 0.0 0.0 0.0 16 | 1 7 0.0 0.0 0.0 17 | 2 0 -0.0001 0.0 -0.0324 18 | 2 1 0.0 0.0 0.0 19 | 2 2 1.0937289888 -1.6850933568 0.0003147648 20 | 2 3 0.0 0.0 0.0 21 | 2 4 0.0 0.0 0.0 22 | 2 5 0.0 0.0 0.0 23 | 2 6 0.0 0.0 0.0 24 | 2 7 0.0 0.0 0.0 25 | 3 0 -0.1885 0.4348 0.0 26 | 3 1 0.0 0.0 0.0 27 | 3 2 0.0 0.0 0.0 28 | 3 3 0.9818694479999999 -2.5603362288 0.00035411039999999996 29 | 3 4 0.0 0.0 0.0 30 | 3 5 0.0 0.0 0.0 31 | 3 6 0.0 0.0 0.0 32 | 3 7 0.0 0.0 0.0 33 | 4 0 0.08 -0.3139 0.0 34 | 4 1 0.0 0.0 0.0 35 | 4 2 0.0 0.0 0.0 36 | 4 3 0.0 0.0 0.0 37 | 4 4 2.5799696832 -2.0520304223999997 0.0003147648 38 | 4 5 0.0 0.0 0.0 39 | 4 6 0.0 0.0 0.0 40 | 4 7 0.0 0.0 0.0 41 | 5 0 -0.001 0.0002 0.031 42 | 5 1 0.0 0.0 0.0 43 | 5 2 0.0 0.0 0.0 44 | 5 3 0.0 0.0 0.0 45 | 5 4 0.0 0.0 0.0 46 | 5 5 1.3666300703999998 -3.0086793407999997 0.000196728 47 | 5 6 0.0 0.0 0.0 48 | 5 7 0.0 0.0 0.0 49 | 6 0 -0.9593 0.1911 0.0 50 | 6 1 0.0 0.0 0.0 51 | 6 2 0.0 0.0 0.0 52 | 6 3 0.0 0.0 0.0 53 | 6 4 0.0 0.0 0.0 54 | 6 5 0.0 0.0 0.0 55 | 6 6 1.6691977344 -2.79452124 0.0004721471999999999 56 | 6 7 0.0 0.0 0.0 57 | 7 0 -0.7783 -0.5461 0.0 58 | 7 1 0.0 0.0 0.0 59 | 7 2 0.0 0.0 0.0 60 | 7 3 0.0 0.0 0.0 61 | 7 4 0.0 0.0 0.0 62 | 7 5 0.0 0.0 0.0 63 | 7 6 0.0 0.0 0.0 64 | 7 7 1.4304486336 -2.8841505168 0.00023607359999999996 65 | -------------------------------------------------------------------------------- /tests/guanosine/gua_rc/energies_gua_rc.dat: -------------------------------------------------------------------------------- 1 | -542.447795843 2 | -542.385531548 3 | -542.370945655 4 | -542.351092304 5 | -542.348152948 6 | -542.322989697 7 | -542.321739388 8 | -542.284529125 9 | -------------------------------------------------------------------------------- /tests/guanosine/gua_rc/geom_gua_rc.dat: -------------------------------------------------------------------------------- 1 | 16 2 | 1.0 -3.6164482532140725 -4.722763846442881 0.0002645616574491076 3 | 14.0 -3.312030382070257 -2.838669105657815 9.448630623182416e-05 4 | 12.0 -5.095570906037292 -0.977116907813537 -0.00028345891869547245 5 | 1.0 -7.093257084174257 -1.3797400662024615 -0.00037794522492729665 6 | 14.0 -4.1083382942785756 1.3446365137112144 -1.8897261246364835e-05 7 | 12.0 -1.6153737961356338 0.984622899980593 9.448630623182416e-05 8 | 12.0 0.45905604964894375 2.7999297201027673 0.00032125344118820215 9 | 16.0 0.3782532502856124 5.061837404986405 -0.00011338356747818899 10 | 14.0 2.845910536167422 1.5038005862848467 1.8897261246364835e-05 11 | 1.0 4.3573531749002985 2.67824458575905 -0.00018897261246364833 12 | 12.0 3.179464204700883 -1.0349519758580366 0.0 13 | 14.0 5.489728091387844 -2.0058573538998936 -0.00032125344118820215 14 | 1.0 7.06734893900549 -0.9413954148795337 0.00037794522492729665 15 | 1.0 5.66668015597268 -3.9036544988146993 5.6691783739094494e-05 16 | 14.0 1.234877440940078 -2.705543569355549 0.0001322808287245538 17 | 12.0 -1.0040322770067345 -1.6581420777884068 0.00011338356747818899 18 | -------------------------------------------------------------------------------- /tests/guanosine/gua_rc/guanine_rc_charges.dat: -------------------------------------------------------------------------------- 1 | 0.47855 -0.720601 0.528212 0.130609 -0.561289 0.363149 0.38305 -0.326923 -0.475151 0.390775 0.517805 -0.549102 0.371082 0.389331 -0.530198 0.610701 2 | 0.433331 -0.443227 0.149545 0.194615 -0.264507 0.195299 0.318123 -0.16384 -0.414346 0.416704 0.459606 -0.595159 0.356969 0.39441 -0.45398 0.416457 3 | 0.444595 -0.481591 0.169901 0.198083 -0.236637 0.221653 0.24363 -0.186286 -0.303312 0.385826 0.325415 -0.500832 0.334512 0.369921 -0.369206 0.384328 4 | 0.44678 -0.37391 0.295915 0.148647 -0.453488 0.374147 0.360508 -0.324702 -0.456899 0.390137 0.493223 -0.524258 0.356955 0.382477 -0.569864 0.45433 5 | 0.441033 -0.505271 0.317005 0.149969 -0.527314 0.30605 0.322337 -0.300033 -0.137013 0.353037 0.434779 -0.501201 0.356036 0.396742 -0.525435 0.419279 6 | 0.468856 -0.508474 0.224996 0.178094 -0.3182 0.521656 0.000178 -0.298194 0.042485 0.328194 -0.220793 -0.227365 0.284815 0.295638 0.167928 0.060187 7 | 0.452624 -0.632978 0.416115 0.133397 -0.408369 0.132694 0.553669 -0.411802 -0.690926 0.424435 0.797114 -0.712508 0.44154 0.442185 -0.605146 0.667957 8 | 0.500139 -0.820726 0.566885 0.111879 -0.556007 0.388013 0.24789 -0.333908 -0.441405 0.400007 0.430868 -0.456736 0.349157 0.368278 -0.490948 0.736614 9 | 10 | -------------------------------------------------------------------------------- /tests/water/README.md: -------------------------------------------------------------------------------- 1 | Example of MD-PMM simulation using PyMM: Molecule of water in water box. 2 | 3 | 1. Run the MD-PMM simulation: 4 | * in the dipole approximation: 5 | ``` 6 | pymm run_pmm -g data/ref_geom_ang.dat -gu angstrom -dm data/dipmat.dat -e data/energies.dat -traj data/traj.xtc -top data/topol.dat -nm 1:3 -o TEST_WATER_DIPOLE 7 | ``` 8 | 9 | * in the QC atomic charges: 10 | ``` 11 | pymm run_pmm -g data/ref_geom_ang.dat -gu angstrom -dm data/dipmat.dat -e data/energies.dat -traj data/traj.xtc -top data/topol.dat -nm 1:3 -ch data/charges.dat -o TEST_WATER_CHARGES 12 | ``` 13 | 14 | 2. Plot absorption spectrum: 15 | ``` 16 | pymm calc_abs -dm data/dipmat.dat -el TEST_WATER_CHARGES_eigvals.dat -ev TEST_WATER_CHARGES_eigvecs.npy 17 | ``` 18 | 3. Perturbed eigenvector projection analysis: 19 | ``` 20 | pymm eig -first 1 -last 2 -state 1 -i TEST_WATER_CHARGES_eigvecs.npy -oc 21 | ``` 22 | 4. Perturbed eigenvectors projection analysis 23 | ``` 24 | pymm eig -state 1 -i TEST_WATER_CHARGES_eigvecs.npy -ot 25 | ``` 26 | 5. Cumulative histogram considering only the first 3 states. 27 | ``` 28 | pymm eig -i TEST_WATER_CHARGES_eigvecs.npy -state 3 -oh 29 | ``` 30 | 31 | -------------------------------------------------------------------------------- /tests/water/data/charges.dat: -------------------------------------------------------------------------------- 1 | -0.728824 0.364412 0.364412 2 | 0.177005 -0.088503 -0.088503 3 | 0.087629 -0.043814 -0.043814 4 | 0.182559 -0.091280 -0.091280 5 | -------------------------------------------------------------------------------- /tests/water/data/dipmat.dat: -------------------------------------------------------------------------------- 1 | 0 0 0.0 0.0 0.8243296655999999 2 | 0 1 0.2645 0.0 0.0 3 | 0 2 0.0 0.0 0.0 4 | 0 3 0.0 0.0 0.6065 5 | 1 0 0.2645 0.0 0.0 6 | 1 1 0.0 0.0 0.2001904128 7 | 1 2 0.0 0.0 0.0 8 | 1 3 0.0 0.0 0.0 9 | 2 0 0.0 0.0 0.0 10 | 2 1 0.0 0.0 0.0 11 | 2 2 0.0 0.0 0.0991115664 12 | 2 3 0.0 0.0 0.0 13 | 3 0 0.0 0.0 0.6065 14 | 3 1 0.0 0.0 0.0 15 | 3 2 0.0 0.0 0.0 16 | 3 3 0.0 0.0 0.2064857088 17 | -------------------------------------------------------------------------------- /tests/water/data/energies.dat: -------------------------------------------------------------------------------- 1 | -76.4089538588 2 | -76.1179497510 3 | -76.0435542529 4 | -76.0230654930 5 | -------------------------------------------------------------------------------- /tests/water/data/ref_geom_ang.dat: -------------------------------------------------------------------------------- 1 | 3 2 | 16.0 0.00000 0.00000 0.11969 3 | 1.0 0.00000 0.76143 -0.47878 4 | 1.0 0.00000 -0.76143 -0.47878 5 | -------------------------------------------------------------------------------- /tests/water/data/topol.dat: -------------------------------------------------------------------------------- 1 | 1 -0.82 2 | 2 0.41 3 | 3 0.41 4 | 4 -0.82 5 | 5 0.41 6 | 6 0.41 7 | 7 -0.82 8 | 8 0.41 9 | 9 0.41 10 | 10 -0.82 11 | 11 0.41 12 | 12 0.41 13 | 13 -0.82 14 | 14 0.41 15 | 15 0.41 16 | 16 -0.82 17 | 17 0.41 18 | 18 0.41 19 | 19 -0.82 20 | 20 0.41 21 | 21 0.41 22 | 22 -0.82 23 | 23 0.41 24 | 24 0.41 25 | 25 -0.82 26 | 26 0.41 27 | 27 0.41 28 | 28 -0.82 29 | 29 0.41 30 | 30 0.41 31 | 31 -0.82 32 | 32 0.41 33 | 33 0.41 34 | 34 -0.82 35 | 35 0.41 36 | 36 0.41 37 | 37 -0.82 38 | 38 0.41 39 | 39 0.41 40 | 40 -0.82 41 | 41 0.41 42 | 42 0.41 43 | 43 -0.82 44 | 44 0.41 45 | 45 0.41 46 | 46 -0.82 47 | 47 0.41 48 | 48 0.41 49 | 49 -0.82 50 | 50 0.41 51 | 51 0.41 52 | 52 -0.82 53 | 53 0.41 54 | 54 0.41 55 | 55 -0.82 56 | 56 0.41 57 | 57 0.41 58 | 58 -0.82 59 | 59 0.41 60 | 60 0.41 61 | 61 -0.82 62 | 62 0.41 63 | 63 0.41 64 | 64 -0.82 65 | 65 0.41 66 | 66 0.41 67 | 67 -0.82 68 | 68 0.41 69 | 69 0.41 70 | 70 -0.82 71 | 71 0.41 72 | 72 0.41 73 | 73 -0.82 74 | 74 0.41 75 | 75 0.41 76 | 76 -0.82 77 | 77 0.41 78 | 78 0.41 79 | 79 -0.82 80 | 80 0.41 81 | 81 0.41 82 | 82 -0.82 83 | 83 0.41 84 | 84 0.41 85 | 85 -0.82 86 | 86 0.41 87 | 87 0.41 88 | 88 -0.82 89 | 89 0.41 90 | 90 0.41 91 | 91 -0.82 92 | 92 0.41 93 | 93 0.41 94 | 94 -0.82 95 | 95 0.41 96 | 96 0.41 97 | 97 -0.82 98 | 98 0.41 99 | 99 0.41 100 | 100 -0.82 101 | 101 0.41 102 | 102 0.41 103 | 103 -0.82 104 | 104 0.41 105 | 105 0.41 106 | 106 -0.82 107 | 107 0.41 108 | 108 0.41 109 | 109 -0.82 110 | 110 0.41 111 | 111 0.41 112 | 112 -0.82 113 | 113 0.41 114 | 114 0.41 115 | 115 -0.82 116 | 116 0.41 117 | 117 0.41 118 | 118 -0.82 119 | 119 0.41 120 | 120 0.41 121 | 121 -0.82 122 | 122 0.41 123 | 123 0.41 124 | 124 -0.82 125 | 125 0.41 126 | 126 0.41 127 | 127 -0.82 128 | 128 0.41 129 | 129 0.41 130 | 130 -0.82 131 | 131 0.41 132 | 132 0.41 133 | 133 -0.82 134 | 134 0.41 135 | 135 0.41 136 | 136 -0.82 137 | 137 0.41 138 | 138 0.41 139 | 139 -0.82 140 | 140 0.41 141 | 141 0.41 142 | 142 -0.82 143 | 143 0.41 144 | 144 0.41 145 | 145 -0.82 146 | 146 0.41 147 | 147 0.41 148 | 148 -0.82 149 | 149 0.41 150 | 150 0.41 151 | 151 -0.82 152 | 152 0.41 153 | 153 0.41 154 | 154 -0.82 155 | 155 0.41 156 | 156 0.41 157 | 157 -0.82 158 | 158 0.41 159 | 159 0.41 160 | 160 -0.82 161 | 161 0.41 162 | 162 0.41 163 | 163 -0.82 164 | 164 0.41 165 | 165 0.41 166 | 166 -0.82 167 | 167 0.41 168 | 168 0.41 169 | 169 -0.82 170 | 170 0.41 171 | 171 0.41 172 | 172 -0.82 173 | 173 0.41 174 | 174 0.41 175 | 175 -0.82 176 | 176 0.41 177 | 177 0.41 178 | 178 -0.82 179 | 179 0.41 180 | 180 0.41 181 | 181 -0.82 182 | 182 0.41 183 | 183 0.41 184 | 184 -0.82 185 | 185 0.41 186 | 186 0.41 187 | 187 -0.82 188 | 188 0.41 189 | 189 0.41 190 | 190 -0.82 191 | 191 0.41 192 | 192 0.41 193 | 193 -0.82 194 | 194 0.41 195 | 195 0.41 196 | 196 -0.82 197 | 197 0.41 198 | 198 0.41 199 | 199 -0.82 200 | 200 0.41 201 | 201 0.41 202 | 202 -0.82 203 | 203 0.41 204 | 204 0.41 205 | 205 -0.82 206 | 206 0.41 207 | 207 0.41 208 | 208 -0.82 209 | 209 0.41 210 | 210 0.41 211 | 211 -0.82 212 | 212 0.41 213 | 213 0.41 214 | 214 -0.82 215 | 215 0.41 216 | 216 0.41 217 | 217 -0.82 218 | 218 0.41 219 | 219 0.41 220 | 220 -0.82 221 | 221 0.41 222 | 222 0.41 223 | 223 -0.82 224 | 224 0.41 225 | 225 0.41 226 | 226 -0.82 227 | 227 0.41 228 | 228 0.41 229 | 229 -0.82 230 | 230 0.41 231 | 231 0.41 232 | 232 -0.82 233 | 233 0.41 234 | 234 0.41 235 | 235 -0.82 236 | 236 0.41 237 | 237 0.41 238 | 238 -0.82 239 | 239 0.41 240 | 240 0.41 241 | 241 -0.82 242 | 242 0.41 243 | 243 0.41 244 | 244 -0.82 245 | 245 0.41 246 | 246 0.41 247 | 247 -0.82 248 | 248 0.41 249 | 249 0.41 250 | 250 -0.82 251 | 251 0.41 252 | 252 0.41 253 | 253 -0.82 254 | 254 0.41 255 | 255 0.41 256 | 256 -0.82 257 | 257 0.41 258 | 258 0.41 259 | 259 -0.82 260 | 260 0.41 261 | 261 0.41 262 | 262 -0.82 263 | 263 0.41 264 | 264 0.41 265 | 265 -0.82 266 | 266 0.41 267 | 267 0.41 268 | 268 -0.82 269 | 269 0.41 270 | 270 0.41 271 | 271 -0.82 272 | 272 0.41 273 | 273 0.41 274 | 274 -0.82 275 | 275 0.41 276 | 276 0.41 277 | 277 -0.82 278 | 278 0.41 279 | 279 0.41 280 | 280 -0.82 281 | 281 0.41 282 | 282 0.41 283 | 283 -0.82 284 | 284 0.41 285 | 285 0.41 286 | 286 -0.82 287 | 287 0.41 288 | 288 0.41 289 | 289 -0.82 290 | 290 0.41 291 | 291 0.41 292 | 292 -0.82 293 | 293 0.41 294 | 294 0.41 295 | 295 -0.82 296 | 296 0.41 297 | 297 0.41 298 | 298 -0.82 299 | 299 0.41 300 | 300 0.41 301 | 301 -0.82 302 | 302 0.41 303 | 303 0.41 304 | 304 -0.82 305 | 305 0.41 306 | 306 0.41 307 | 307 -0.82 308 | 308 0.41 309 | 309 0.41 310 | 310 -0.82 311 | 311 0.41 312 | 312 0.41 313 | 313 -0.82 314 | 314 0.41 315 | 315 0.41 316 | 316 -0.82 317 | 317 0.41 318 | 318 0.41 319 | 319 -0.82 320 | 320 0.41 321 | 321 0.41 322 | 322 -0.82 323 | 323 0.41 324 | 324 0.41 325 | 325 -0.82 326 | 326 0.41 327 | 327 0.41 328 | 328 -0.82 329 | 329 0.41 330 | 330 0.41 331 | 331 -0.82 332 | 332 0.41 333 | 333 0.41 334 | 334 -0.82 335 | 335 0.41 336 | 336 0.41 337 | 337 -0.82 338 | 338 0.41 339 | 339 0.41 340 | 340 -0.82 341 | 341 0.41 342 | 342 0.41 343 | 343 -0.82 344 | 344 0.41 345 | 345 0.41 346 | 346 -0.82 347 | 347 0.41 348 | 348 0.41 349 | 349 -0.82 350 | 350 0.41 351 | 351 0.41 352 | 352 -0.82 353 | 353 0.41 354 | 354 0.41 355 | 355 -0.82 356 | 356 0.41 357 | 357 0.41 358 | 358 -0.82 359 | 359 0.41 360 | 360 0.41 361 | 361 -0.82 362 | 362 0.41 363 | 363 0.41 364 | 364 -0.82 365 | 365 0.41 366 | 366 0.41 367 | 367 -0.82 368 | 368 0.41 369 | 369 0.41 370 | 370 -0.82 371 | 371 0.41 372 | 372 0.41 373 | 373 -0.82 374 | 374 0.41 375 | 375 0.41 376 | 376 -0.82 377 | 377 0.41 378 | 378 0.41 379 | 379 -0.82 380 | 380 0.41 381 | 381 0.41 382 | 382 -0.82 383 | 383 0.41 384 | 384 0.41 385 | 385 -0.82 386 | 386 0.41 387 | 387 0.41 388 | 388 -0.82 389 | 389 0.41 390 | 390 0.41 391 | 391 -0.82 392 | 392 0.41 393 | 393 0.41 394 | 394 -0.82 395 | 395 0.41 396 | 396 0.41 397 | 397 -0.82 398 | 398 0.41 399 | 399 0.41 400 | 400 -0.82 401 | 401 0.41 402 | 402 0.41 403 | 403 -0.82 404 | 404 0.41 405 | 405 0.41 406 | 406 -0.82 407 | 407 0.41 408 | 408 0.41 409 | 409 -0.82 410 | 410 0.41 411 | 411 0.41 412 | 412 -0.82 413 | 413 0.41 414 | 414 0.41 415 | 415 -0.82 416 | 416 0.41 417 | 417 0.41 418 | 418 -0.82 419 | 419 0.41 420 | 420 0.41 421 | 421 -0.82 422 | 422 0.41 423 | 423 0.41 424 | 424 -0.82 425 | 425 0.41 426 | 426 0.41 427 | 427 -0.82 428 | 428 0.41 429 | 429 0.41 430 | 430 -0.82 431 | 431 0.41 432 | 432 0.41 433 | 433 -0.82 434 | 434 0.41 435 | 435 0.41 436 | 436 -0.82 437 | 437 0.41 438 | 438 0.41 439 | 439 -0.82 440 | 440 0.41 441 | 441 0.41 442 | 442 -0.82 443 | 443 0.41 444 | 444 0.41 445 | 445 -0.82 446 | 446 0.41 447 | 447 0.41 448 | 448 -0.82 449 | 449 0.41 450 | 450 0.41 451 | 451 -0.82 452 | 452 0.41 453 | 453 0.41 454 | 454 -0.82 455 | 455 0.41 456 | 456 0.41 457 | 457 -0.82 458 | 458 0.41 459 | 459 0.41 460 | 460 -0.82 461 | 461 0.41 462 | 462 0.41 463 | 463 -0.82 464 | 464 0.41 465 | 465 0.41 466 | 466 -0.82 467 | 467 0.41 468 | 468 0.41 469 | 469 -0.82 470 | 470 0.41 471 | 471 0.41 472 | 472 -0.82 473 | 473 0.41 474 | 474 0.41 475 | 475 -0.82 476 | 476 0.41 477 | 477 0.41 478 | 478 -0.82 479 | 479 0.41 480 | 480 0.41 481 | 481 -0.82 482 | 482 0.41 483 | 483 0.41 484 | 484 -0.82 485 | 485 0.41 486 | 486 0.41 487 | 487 -0.82 488 | 488 0.41 489 | 489 0.41 490 | 490 -0.82 491 | 491 0.41 492 | 492 0.41 493 | 493 -0.82 494 | 494 0.41 495 | 495 0.41 496 | 496 -0.82 497 | 497 0.41 498 | 498 0.41 499 | 499 -0.82 500 | 500 0.41 501 | 501 0.41 502 | 502 -0.82 503 | 503 0.41 504 | 504 0.41 505 | 505 -0.82 506 | 506 0.41 507 | 507 0.41 508 | 508 -0.82 509 | 509 0.41 510 | 510 0.41 511 | 511 -0.82 512 | 512 0.41 513 | 513 0.41 514 | 514 -0.82 515 | 515 0.41 516 | 516 0.41 517 | 517 -0.82 518 | 518 0.41 519 | 519 0.41 520 | 520 -0.82 521 | 521 0.41 522 | 522 0.41 523 | 523 -0.82 524 | 524 0.41 525 | 525 0.41 526 | 526 -0.82 527 | 527 0.41 528 | 528 0.41 529 | 529 -0.82 530 | 530 0.41 531 | 531 0.41 532 | 532 -0.82 533 | 533 0.41 534 | 534 0.41 535 | 535 -0.82 536 | 536 0.41 537 | 537 0.41 538 | 538 -0.82 539 | 539 0.41 540 | 540 0.41 541 | 541 -0.82 542 | 542 0.41 543 | 543 0.41 544 | 544 -0.82 545 | 545 0.41 546 | 546 0.41 547 | 547 -0.82 548 | 548 0.41 549 | 549 0.41 550 | 550 -0.82 551 | 551 0.41 552 | 552 0.41 553 | 553 -0.82 554 | 554 0.41 555 | 555 0.41 556 | 556 -0.82 557 | 557 0.41 558 | 558 0.41 559 | 559 -0.82 560 | 560 0.41 561 | 561 0.41 562 | 562 -0.82 563 | 563 0.41 564 | 564 0.41 565 | 565 -0.82 566 | 566 0.41 567 | 567 0.41 568 | 568 -0.82 569 | 569 0.41 570 | 570 0.41 571 | 571 -0.82 572 | 572 0.41 573 | 573 0.41 574 | 574 -0.82 575 | 575 0.41 576 | 576 0.41 577 | 577 -0.82 578 | 578 0.41 579 | 579 0.41 580 | 580 -0.82 581 | 581 0.41 582 | 582 0.41 583 | 583 -0.82 584 | 584 0.41 585 | 585 0.41 586 | 586 -0.82 587 | 587 0.41 588 | 588 0.41 589 | 589 -0.82 590 | 590 0.41 591 | 591 0.41 592 | 592 -0.82 593 | 593 0.41 594 | 594 0.41 595 | 595 -0.82 596 | 596 0.41 597 | 597 0.41 598 | 598 -0.82 599 | 599 0.41 600 | 600 0.41 601 | 601 -0.82 602 | 602 0.41 603 | 603 0.41 604 | 604 -0.82 605 | 605 0.41 606 | 606 0.41 607 | 607 -0.82 608 | 608 0.41 609 | 609 0.41 610 | 610 -0.82 611 | 611 0.41 612 | 612 0.41 613 | 613 -0.82 614 | 614 0.41 615 | 615 0.41 616 | 616 -0.82 617 | 617 0.41 618 | 618 0.41 619 | 619 -0.82 620 | 620 0.41 621 | 621 0.41 622 | 622 -0.82 623 | 623 0.41 624 | 624 0.41 625 | 625 -0.82 626 | 626 0.41 627 | 627 0.41 628 | 628 -0.82 629 | 629 0.41 630 | 630 0.41 631 | 631 -0.82 632 | 632 0.41 633 | 633 0.41 634 | 634 -0.82 635 | 635 0.41 636 | 636 0.41 637 | 637 -0.82 638 | 638 0.41 639 | 639 0.41 640 | 640 -0.82 641 | 641 0.41 642 | 642 0.41 643 | 643 -0.82 644 | 644 0.41 645 | 645 0.41 646 | 646 -0.82 647 | 647 0.41 648 | 648 0.41 649 | -------------------------------------------------------------------------------- /tests/water/data/topol.tpr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChenGiuseppe/PyMM/0e764d8b9d2f429b1c2d5139889eec3b6387139a/tests/water/data/topol.tpr -------------------------------------------------------------------------------- /tests/water/data/traj.xtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChenGiuseppe/PyMM/0e764d8b9d2f429b1c2d5139889eec3b6387139a/tests/water/data/traj.xtc --------------------------------------------------------------------------------