From bdefb88ea51401305da1ebcd284dbdb3155678ed Mon Sep 17 00:00:00 2001 From: Jacklaw441 Date: Thu, 20 Mar 2025 09:07:08 -0400 Subject: [PATCH 1/2] Pushing changes the usual way --- doc/applied_efp.rst | 228 ++++++++++++--------- examples/flex-EFP/Scripts/cut_qm.py | 2 +- examples/flex-EFP/Scripts/fragment_RMSD.py | 2 +- examples/flex-EFP/Scripts/make_AAs.py | 2 +- examples/flex-EFP/Scripts/make_bcls.py | 2 +- images/flowchart.pdf | Bin 0 -> 40796 bytes 6 files changed, 132 insertions(+), 104 deletions(-) create mode 100644 images/flowchart.pdf diff --git a/doc/applied_efp.rst b/doc/applied_efp.rst index 8eb8417..c53f400 100644 --- a/doc/applied_efp.rst +++ b/doc/applied_efp.rst @@ -5,50 +5,54 @@ FMO: Applied flexible EFP ************************* Overview --------- +======== Computational methods struggle to reproduce experimental spectra in photoactive proteins. One such protein is the the Fenna-Matthews-Olson complex (FMO). Work by `Kim et al `_ shows that flexible QM/EFP can be applied to FMO to correctly generate computational results in quantitative agreement to experimental spectra. In short, the solvatochromic environments -surrounding each bacteriochloropyll a (BChl a) pigment are heavily polarizable; EFP captures -this polarizability explicitly where a standard QM/MM calculation will onyl approximate it, -thus the polarizable environment is crucial to accurately model photosynthesis. +surrounding each bacteriochloropyll a (BChl) pigment are heavily polarizable; EFP captures +this polarizability explicitly where a standard QM/MM calculation only approximates it; +thus, that the polarizable environment is crucial in modelling photosynthesis. This page +detials how to perform flex-EFP calculations on the FMO system. -The key to applying EFP to your system is to carefully define the active site and EFP region. FMO is a trimeric protein with eight bacteriochloropyll a (BChl) pigments in each monomer. -FMO completes energy transfer via excitonic couplings across these eight BChls. A summary -of the complete workflow that was performed is the following: 1) molecular dynamics (MD) -simiulations of the FMO protein in water and counter ions, 2) QM/MM (not EFP) geometry -optimization of *each* active site (active sites consist of one BChl pigment and -typically 3 H-bonding amino acids), and 3) flex-EFP excited state energy calculations of -each pigment. - -In the case of FMO, these steps must be repeated on several snapshots from MD to account -for variation in the resting state of the structure, and the QM region must be defined -carefully in both the QM/MM and flex-EFP stages. It might not be universally true that one -must perform QM/MM geometry optimization. This page is a walkthrough for the flex-EFP procedure -only. Molecular dynamics and QM/MM optimizations are assumed to be complete for your -system prior to these steps. +FMO completes energy transfer via excitonic couplings across these eight BChls. In this +example, molecular dynamics and QM geometry optimizations were performed prior to the EFP +calculation like the one this walthrough will details. .. image:: ../images/FMO_trimer_BCLs.bmp :width: 350 + :align: center .. image:: ../images/FMO_mon.bmp :width: 400 + :align: center -You will need a structure file (.g96) and topology information (.top, for atom charges). A structure file can be extracted -from a GROMACS molecular dynamics trajectory and all water molecules more than 15 angstroms from the protein's surface have +The general procedure is to define the QM and EFP regions, fragment the residues in the +EFP region, generate the starting fragment parameters, trim overlapping virtual/real atoms, +then create the final calculation input. + +.. image:: ../images/flowchart-1.png + :width: 500 + :align: center + +You will need a structure file (.g96), a topology file (.top), and a binary input from molecular dynamics (.tpr). A structure file can be extracted +from a GROMACS molecular dynamics trajectory. In this example, water molecules more than 15 angstroms from the protein's surface have been removed. For a chlorophyll-containing protein, you will likely want to optimize the geometry of each active chlorophyl molecule (with very close amino acids/water molecules) separately with more standard QM/MM approaches before proceeding -with EFP calculations on the optimized geometry. For this example, the third BChl, residue number 361, has been optimized +with EFP calculations on the optimized geometry. For this example, the third BChl (residue number 361) has been optimized and will be the QM region for the EFP calcuation. .. image:: ../images/fmo_waters15a.bmp :width: 400 + :align: center + +Structure Preparation +===================== -First, an EFP region must be defined. Every amino acid, (non QM) BChl, and water molecule containing an +First, an EFP region must be defined. Every amino acid, (non-QM) BChl, and water molecule containing an atom within 15 angstroms of the QM BChl headring. The headring is defined by the atomnames: ``MG CHA CHB HB CHC HC CHD HD NA C1A C2A H2A C3A H3A C4A CMA HMA1 HMA2 HMA3 NB C1B C2B C3B C4B CMB HMB1 HMB2 HMB3 CAB OBB CBB HBB1 HBB2 HBB3 NC C1C C2C H2C C3C H3C C4C CMC HMC1 HMC2 HMC3 CAC HAC1 HAC2 CBC HBC1 HBC2 HBC3 ND C1D C2D C3D C4D CMD HMD1 HMD2 HMD3 CAD OBD CBD HBD CGD O1D O2D CED HED1 HED2 HED3`` @@ -57,21 +61,19 @@ The headring surrounded by the EFP region looks like this: .. image:: ../images/tester.bmp :width: 400 + :align: center -As you can see, the solvatochromic environment of each BChl is overwhelming as an ensemble. The mission of EFP is to break this -complex environment into each contributing "fragment." Then, the most important (highest contributing) fragments can be isolated. -The final calculations allow us to look at a focused version of the environment like the image below: +As you can see, the solvatochromic environment of each BChl is an overwhelming ensemble. The mission of EFP is to break this +complex environment into each contributing "fragment." Then, those fragments can be analyzed by individual contribution. +The final calculation allows us to look at a focused version of the environment like the image below: .. image:: ../images/surf_efp2.bmp :width: 400 + :align: center Each fragment induces a shift to the BChl excited state energy. Pairwise excitation energy decomposition reveals the magnitude and -direction (ie, blue or red shift) that each fragment induces to a given BChl molecule. Thus, EFP can offer insight of the inner-workings -of solvatochromic control over the protein's optical spectra. - - -Structure Preparation ---------------------- +direction (ie, blue or red shift) that each fragment induces to a given BChl molecule. Thus, EFP can offer deeper insight into the +solvatochromic control over the protein's optical spectra. Extract a single snapshot of MD extracted from GROMACS ie: ``gmx traj -f md_50.trr -s md_50.tpr -o bchl361-79002.g96``\(.g6 format). Please note that extracting larger systems can occasionally cause columns to be misaligned due to the residue ID number passing from 9999 to 10000. @@ -91,6 +93,7 @@ Here is a visualization of atoms contained in the newly created index group: .. image:: ../images/361_headring.bmp :width: 400 + :align: center Note: the QM region will include the entire BChl, but the EFP region will be defined by distance to this ring group only. @@ -113,6 +116,7 @@ BCL magnesium atom shown below. .. image:: ../images/qm_region.bmp :width: 400 + :align: center This shows the entire residue 361 (BCL) and 290 (HIS), however, we only want to include the side chain of this histidine. In other words, atoms that extend down the side chain after the alpha-carbon should be included in the QM region, and the @@ -120,6 +124,7 @@ backbone atoms should remain in the EFP region. That division looks like this: .. image:: ../images/qm_w_cut.bmp :width: 400 + :align: center This is a tricky problem. To generate the fragment parameters, we will need an input file with every atom in the amino acid. After we have obtained an efp file with the full fragment's parameters, the QM atoms will be stripped out. @@ -127,43 +132,46 @@ Now, this creates a second issue. The QM region must be capped with a virtual hy .. image:: ../images/qm_capped.bmp :width: 400 + :align: center -There is now a virtual hydrogen resting in roughly the same position as the the alpha-carbon (that is in the EFP region). -When the efp parameter file for residue 290 is created, the QM atoms and the alpha-carbon will be stripped, and the -EFP atoms bound to the alpha-carbon will have their multipoles and polarization points removed. The following scripts need -some information from the user to correctly handle these fragments. A text file listing every atom to be included in the -QM region, and every pair of atoms that form a covalent bond in which one atom is in the QM region and the other is in the -EFP(MM) region. The format should be the same as the g96 file; ie, copy and paste the lines of your atoms from the structure -file directly. The result should look like `this example. <../examples/flex-EFP/Scripts/user_defined.txt>`_ +There will be a virtual hydrogen resting in roughly the same position as the the alpha-carbon (that is in the EFP region, NOT +the QM region). When the efp parameter file for residue 290 is created later, the QM atoms and the alpha-carbon will be stripped, +and the EFP atoms bound to the alpha-carbon will have their multipoles and polarization points removed. The following scripts need +some information from the user to correctly handle deleting these overlapping atoms. Specifically, the user should create a text +file listing every atom to be included in the QM region, and a list of every pair of atoms that form a covalent bond in which one +atom is in the QM region and the other is in the EFP(MM) region. The format should be the same as the g96 file; ie, copy and paste +the lines of your atoms from the structure file directly. The result should look like `this example. <../examples/flex-EFP/Scripts/user_defined.txt>`_ Please note that the boundaries must have the QM atom listed first. This example contains only one QM-MM boundary, but a -second could be included in the following way: +second could be included like this: .. literalinclude:: ../examples/flex-EFP/Scripts/new_sample.txt :linenos: Fragmentation -------------- +============= -The protein residues within the 15 angstrom cutoff must be expressed individually. Because amino acids are a continuous chain, -covalent bonds between neighboring amino acids have to be broken. Chemically, we would like to break the C-C backbone bond, -however, standard PDB convention divides residues by the C-N bond. To change this, 'C' and 'O' atom names are included in -the following aminoc acid. This way the 'C' and 'CA' (carbonyl carbon and alpha carbon respectively) bond is the division -between bonded fragments. See the examples below. +The protein residues within the 15 angstrom cutoff will be expressed individually. Because amino acids are a continuous chain, +covalent bonds between neighboring amino acids have to be broken. Chemically, we would like to break the C-C backbone bond +(between alpha carbon and carbonyl carbon), however, standard PDB convention divides residues by the C-N bond (alpha carbon-nitrogen). +To change this, 'C' and 'O' atom names are included in the following amino acid. This way the 'C' and 'CA' (carbonyl carbon and alpha +carbon respectively) bond is the division between bonded fragments. See the visualizations below. PDB residues are divided like this: .. image:: ../images/pdb_67_col.bmp :width: 400 + :align: center For EFP, we would rather these two fragments look like this: .. image:: ../images/efp_67_col.bmp :width: 400 + :align: center The atom coordinates are contained in the structure file, but they do not completely 'agree' with the amino -acid numbering. Below is a snippet from the structure file with the EFP fragment 8 highlighted. Note that atom -names 'C' and 'O' are included in the following fragment. +acid numbering. Below is a snippet from the structure file (.g96) with the EFP fragment 8 highlighted. Note that atom +names 'C' and 'O' are included in the following fragment (fragment 9). .. literalinclude:: ../examples/flex-EFP/1.Prepare_Structure/bchl361-79002.g96 :linenos: @@ -177,87 +185,92 @@ The script ``make_AAs.py`` accomplishes this. A sample execution is: This script creates an input file for each fragment in the EFP region. The names take information from the fragment; For example, v_22_301.inp is a valine residue (v), residue number 22, and the first atom of this fragment has an atom ID of 301. Histidine residues are denoted hd_, he, or hp_ depending on protonation states, and non-standard amino acids -are listed as the same residue name given in the g96 structure file (ie, bcl_360_5667.inp for the BCL res number 360). -Virtual hydrogens are added automatically to amino acid fragments with an atom name H000. Non amino acids fragments are -not capped by default. If a fragment cnotains QM atoms, the atom names will be added to the comment at the end of the file. -See below the input file for HIS 290 (hd_290_4417.inp): +are listed as the same residue name given in the g96 structure file (ie, bcl_360_5667.inp for the BCL with residue number 360). +Virtual hydrogens are added automatically to amino acid fragments with an atom name H000. Non amino acids fragments are created +with no capping hydrogen by default. If a fragment contains QM atoms, those QM atom names will be added to the comment at the end +of the input file. See below the input file for histidine residue number 290 (hd_290_4417.inp): .. literalinclude:: ../examples/flex-EFP/1.Prepare_Structure/hd_290_4417.inp :linenos: :emphasize-lines: 31,32 Note that CA is the alpha-carbon, and is not a QM atom. However, CA is bound to a QM atom, and will be removed from the -paramter file in a later step. If a residue contains only QM atoms, no input file will be created (no bcl_360_.inp file -in this case). - -Database Comparison -------------------- - -EFP input files are now generated and the paramters can be calculated. To avoid computing every fragment's gasphase -parameters directly, each fragment is compared to a database of pre-computed parameters of the same amino acid. If -the RMSD between the two structures is sufficiently small, then the parameters are good enough for the initial -representation of the fragment wavefunction. - -``fragment_RMSD.py a_4_45.inp`` - -This execution will read the given file, a_4_45.inp and compute the RMSD with each .efp file it can find in a given -directory. For example, the path to the .efp database in this tutorial is given as -``/depot/lslipche/data/yb_boss/flexible_efp/efpdb/ala/``. The final folder, ala/, does not need to be specified, but -will be automatically filled as a desination given the input file starts with "a." In other words, if you use this -script, you should replace the directory variable with your folder names, then have the final folder(s) be named -by the amino acid name (ie, ala/, cys/, thr/, etc). The desired RMSD cutoff (minimum to be considered a good match) -is listed at the start of the file, and can be adjusted easily. - -If no suitable match is found in the database, a text file will be created named ``no_matches.txt``, and an .efp file -will not be created. If you need to repeat this step, delete this text file to avoid confusion. The simplest way to -use this script for you entire EFP region is to make a bash script to iterate through every *.inp file and execute -fragment_RMSD.py *.inp. Note that if no database folder is found, or if the input is not a standard, non-terminal -amino acid, then the python script will return an error. These special cases will need to be computed individually. +parameter file in a later step. If a residue contains only QM atoms, no input file will be created (no bcl_361_.inp file +in this case). These commented lines will be used later to finalize the fragment parameter files. Non-Amino Acids and Cofactors ----------------------------- -The previous script is good for a fragmentation scheme that includes amino acids and full molecules. Sometimes it is -desirable to fragment large molecules further. In FMO, the full bacteriochloropylls can have trouble converging -as whole molecules, so they will be split into two fragments. Note that make_AAs.py creates fragments for the Bchls, -but it creates one fragment for the entire residue, and these will not be used in the final calculation of this example. -Below is the division of the head and tail groups: +The previous script is good for a fragmentation scheme that includes amino acids and full molecules. The BChl fragments +struggle to converge as whole fragments, so we will split them into two sub-fragments, called the head and tail fragments. +Note that make_AAs.py creates fragments for the Bchls, but it creates one fragment for the entire residue, and these will +not be used in the final calculation of this example (If you plan to create sub-fragments, you should delete the full +molecule input files made from make_AA.py). Below is the division of the head and tail groups: .. image:: ../images/efp_headtail.bmp :width: 400 + :align: center -The script ``make_bchls.py`` creates two fragment input files for each Bchl molecule according to that division, -and it can be executed by: +The script ``make_bchls.py`` creates two fragment input files for each Bchl molecule according to that division. Virtual +hydrogens are added where the two are normally covalently bound, much like the case for the amino acid backbone bonds. The +script can be executed by: ``python make_bchls.py shell_bchl361-79002.g96 361`` -This script is hard-coded for the FMO system. Generally, cofactors should not need to be split into multiple fragments, -but chlorophyll molecules can be troublesome. If you need to split a group like this for you system, you can edit the -"Headrings" list to include every atom name that one file should include, then the omitted names will be used to make -the other file. +This script is somewhat "hard-coded" for the FMO BChls. Generally, cofactors should not need to be split into multiple fragments, +but chlorophyll molecules can be troublesome. If you need to split a group like this, you can edit the make_bchls.py script. Variable +"RESNAME" is the name of the residue to be fragmented. The list "Headrings" includes the atom names for every atom to be added to the +head fragment. Atoms that are not in this list will be added to the tail fragment. Variables "headside" and "tailside" are the names +of the two atoms that are normally covalently bound, but will be capped for the fragmentation. Variable "site" is optional, it lists the +residue ID of a QM residue that doesn't need to be fragmented because it is in the QM region. + +Parameter Generation +==================== + +EFP input files are now generated and the parameters can be calculated. To avoid computing every fragment +file directly, each fragment is compared to a database of pre-computed parameters of the same amino acid. If +the RMSD between the two structures is sufficiently small, then the parameters are good enough for the initial +representation of the fragment (and you don't have to calculate them!). The script `fragment_RMSD.py` can be run +by the following example: + +``fragment_RMSD.py a_4_45.inp`` + +This reads the given file (a_4_45.inp) and computes the RMSD with each .efp file it can find in the +given directory. For example, the path to the .efp database in this tutorial is given as variable "base_directory", +``/depot/lslipche/data/yb_boss/flexible_efp/efpdb/``. The script searches that directory for folders of amino acid +fragments based on the first letter of the input file. In this case, the script looks for a folder named ``ala/`` +because the fragment input is a_4_45.inp. In other words, if you use this script, you should replace the "base_directory" +variable with your path, then name the final folder(s) by amino acid (ie, ala/, cys/, thr/, etc). +The desired RMSD cutoff (minimum to be considered a good match) is listed at the start of the file and can be adjusted. + +If no suitable match is found in the database, it will print a message of "No match, run GAMESS for: ", +and an .efp file will not be created. If you need to repeat this step, delete this text file to avoid confusion. +The simplest way to use this script for you entire EFP region is to make a bash script to iterate through every *.inp +file and execute fragment_RMSD.py *.inp. Note that if no database folder is found, or if the input is not a standard, +non-terminal amino acid, then the python script will return an error. These special cases will need to be computed. The Classical Region Fragment ----------------------------- The EFP parameter files are finished. Now, a new fragment will be created with the remaining classical atoms. That -is, every atom that is not in the QM or EFP regions. ``make_mm.py`` reads the structure of the EFP region only, the full -structure, and the topology to create an efp parameter file. This classical region "fragment" is like a normal parameter -file, but it only contains coordinates, monopoles, and screen sections; it does not the contain dipole, quadrupole, -octupole, and polarization point sections. Sample execution: +is, every atom that is not in the QM or EFP regions. ``make_mm.py`` reads the EFP region structure, the full +structure, and the topology to create an efp parameter file. This classical region "super" fragment is like a normal parameter +file, but it only contains coordinates, monopoles, and screen sections; it has zeroes filled for dipole, quadrupole, octupole, +and polarizable point sections. ``python make_MM.py shell_bchl361-79002.g96 bchl361-79002.g96 topol.top`` The topology file is necessary for atomic charges, and both structure files are read so that only MM atoms will be included (both QM and EFP atoms are omitted). -Stripping QM atoms from EFP files ---------------------------------- +QM Preparation +============== Some of the fragment parameter files contain atoms that are also in the QM region. Additionally, when a QM virtual hydrogen is added to replace the bond of an EFP atom, that EFP atom is overlapped with the virtual hydrogen. The -overlapping EFP atom should be removed to avoid sporatic effects to the QM region. EFP atoms that are bound to -the removed atom will also have their multipoles and polarization points removed. The coordinates, monopoles, -and dampening (screen) terms are retained. +overlapping EFP atom should be removed to avoid sporatic effects. EFP atoms that are bound to the removed atom will +also have their multipoles and polarization points removed. The coordinates, monopoles, and dampening (screen) +terms are retained. A sample execution is: @@ -265,9 +278,24 @@ A sample execution is: ala_33_473.inp is an alanine fragment with QM atoms commented to be deleted and EFP atoms to have polarization points removed. a0001.efp is a parameter file that is either the output of the input file, or translated -information from a database parameter file to align with the input's coordinates. +information from a database parameter file to align with the input's coordinates. cu_qm.py must be executed on every +fragment. Note, virutal hydrogens named H000 will always be removed even though they do not appear in the comments. Final Input Generation ----------------------- +====================== + +Now that all fragment .efp files are made and finallized, the final Qchem input file can be created. ``make_final.py` is +the appropriately named file for this, sample execution looks like: + +``make_final.py shell_bchl361-79002.g96 bchl361-79002.g96 user_defined.txt`` + +Function "make_header" contains the keywords for the Qchem calculation; these can be adjusted as needed. When you submit +the calculation, .efp parameter files will need to be in the same folder as the input file. + +Time-Saving Tips +================ - \ No newline at end of file +In the case of FMO, the normal procedure is to repeat the EFP calculation for eight different BChl pigments. Fragments +can be reused between calculations if they come from the same snapshot. ie, bchl360-79002.g96 will need a handful of new +fragments than those created already for bchl361-79002, but the majority of EFP fragments are already made. This can save +a lot of time in repeated calculations. \ No newline at end of file diff --git a/examples/flex-EFP/Scripts/cut_qm.py b/examples/flex-EFP/Scripts/cut_qm.py index 427390f..cb2180f 100644 --- a/examples/flex-EFP/Scripts/cut_qm.py +++ b/examples/flex-EFP/Scripts/cut_qm.py @@ -31,7 +31,7 @@ def get_specials(lines): and the atom indexes for which only the polarizable points should be removed. The function looks for keywords 'erased:' and 'remove:' in the lines. - -make_AAs_V2.py added these comments. + -make_AAs.py added these comments. Reads: lines: input file (.inp) lines. diff --git a/examples/flex-EFP/Scripts/fragment_RMSD.py b/examples/flex-EFP/Scripts/fragment_RMSD.py index 9e58ac4..9f70c09 100644 --- a/examples/flex-EFP/Scripts/fragment_RMSD.py +++ b/examples/flex-EFP/Scripts/fragment_RMSD.py @@ -18,7 +18,7 @@ ang_cutoff = 0.20 # Minimum RMSD allowed for a "good" match (in Angstroms) bohr_cutoff = ang_cutoff * 1.8897259886 # Convert Angstrom cutoff to Bohr -#Add to these if there are more +#Add to these if there are more residue names than are listed amino_acid_dict = { 'a': 'ala', 'r': 'arg', 'n': 'asn', 'd': 'asp', 'c': 'cys', 'q': 'gln', 'e': 'glu', 'g': 'gly', 'h': 'hip', 'i': 'ile', diff --git a/examples/flex-EFP/Scripts/make_AAs.py b/examples/flex-EFP/Scripts/make_AAs.py index 254f515..af981cf 100644 --- a/examples/flex-EFP/Scripts/make_AAs.py +++ b/examples/flex-EFP/Scripts/make_AAs.py @@ -26,7 +26,7 @@ # Input Files and Command Line Arguments # --------------------------- # Get input filenames from command line -# Sample execution: python make_AAs_V2.py efp_pair53004.g96 confout_pair53004.g96 user_defined.txt topol.top +# Sample execution: python make_AAs.py efp_pair53004.g96 confout_pair53004.g96 user_defined.txt topol.top efp_g96 = sys.argv[1] # EFP file ("efp_pair53004.g96") full_g96 = sys.argv[2] # Full configuration file ("confout_pair53004.g96") diff --git a/examples/flex-EFP/Scripts/make_bcls.py b/examples/flex-EFP/Scripts/make_bcls.py index 95d960c..8c08986 100644 --- a/examples/flex-EFP/Scripts/make_bcls.py +++ b/examples/flex-EFP/Scripts/make_bcls.py @@ -21,7 +21,7 @@ # Input files and cutting definitions # --------------------------- # Command-line arguments: -# Sample execution: python make_bcls_V2.py efp_opt_83855.g96 optimized_83855.g96 +# Sample execution: python make_bcls.py efp_opt_83855.g96 optimized_83855.g96 g96_file = sys.argv[1] # EFP region file (e.g., "efp_opt_83855.g96") full_g96_file = sys.argv[2] # Full configuration file (e.g., "optimized_83855.g96") diff --git a/images/flowchart.pdf b/images/flowchart.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8b4846df3f4be0c6e8da4fb352e13658cea669d5 GIT binary patch literal 40796 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 GLH~c?l|7{Z literal 0 HcmV?d00001 From a4a7a6ccd84366ec6dc6d826911f824422fcaddb Mon Sep 17 00:00:00 2001 From: Jacklaw441 Date: Thu, 20 Mar 2025 09:10:34 -0400 Subject: [PATCH 2/2] changes the normal way.... again. --- doc/applied_efp.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/applied_efp.rst b/doc/applied_efp.rst index c53f400..a121c72 100644 --- a/doc/applied_efp.rst +++ b/doc/applied_efp.rst @@ -34,7 +34,7 @@ The general procedure is to define the QM and EFP regions, fragment the residues EFP region, generate the starting fragment parameters, trim overlapping virtual/real atoms, then create the final calculation input. -.. image:: ../images/flowchart-1.png +.. image:: ../images/flowchart.png :width: 500 :align: center