LCOV - code coverage report
Current view: top level - secondarystructure - AlphaRMSD.cpp (source / functions) Hit Total Coverage
Test: plumed test coverage Lines: 63 63 100.0 %
Date: 2024-10-18 13:59:31 Functions: 2 3 66.7 %

          Line data    Source code
       1             : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       2             :    Copyright (c) 2012-2023 The plumed team
       3             :    (see the PEOPLE file at the root of the distribution for a list of names)
       4             : 
       5             :    See http://www.plumed.org for more information.
       6             : 
       7             :    This file is part of plumed, version 2.
       8             : 
       9             :    plumed is free software: you can redistribute it and/or modify
      10             :    it under the terms of the GNU Lesser General Public License as published by
      11             :    the Free Software Foundation, either version 3 of the License, or
      12             :    (at your option) any later version.
      13             : 
      14             :    plumed is distributed in the hope that it will be useful,
      15             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      16             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      17             :    GNU Lesser General Public License for more details.
      18             : 
      19             :    You should have received a copy of the GNU Lesser General Public License
      20             :    along with plumed.  If not, see <http://www.gnu.org/licenses/>.
      21             : +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
      22             : #include "SecondaryStructureRMSD.h"
      23             : #include "core/ActionShortcut.h"
      24             : #include "core/ActionRegister.h"
      25             : 
      26             : namespace PLMD {
      27             : namespace secondarystructure {
      28             : 
      29             : //+PLUMEDOC COLVAR ALPHARMSD
      30             : /*
      31             : Probe the alpha helical content of a protein structure.
      32             : 
      33             : Any chain of six contiguous residues in a protein chain can form an alpha helix. This
      34             : colvar thus generates the set of all possible six residue sections and calculates
      35             : the RMSD distance between the configuration in which the residues find themselves
      36             : and an idealized alpha helical structure. These distances can be calculated by either
      37             : aligning the instantaneous structure with the reference structure and measuring each
      38             : atomic displacement or by calculating differences between the set of inter-atomic
      39             : distances in the reference and instantaneous structures.
      40             : 
      41             : This colvar is based on the following reference \cite pietrucci09jctc.  The authors of
      42             : this paper use the set of distances from the alpha helix configurations to measure
      43             : the number of segments that have an alpha helical configuration. This is done by calculating
      44             : the following sum of functions of the rmsd distances:
      45             : 
      46             : \f[
      47             : s = \sum_i \frac{ 1 - \left(\frac{r_i-d_0}{r_0}\right)^n } { 1 - \left(\frac{r_i-d_0}{r_0}\right)^m }
      48             : \f]
      49             : 
      50             : where the sum runs over all possible segments of alpha helix.  By default the
      51             : NN, MM and D_0 parameters are set equal to those used in \cite pietrucci09jctc.  The R_0
      52             : parameter must be set by the user - the value used in \cite pietrucci09jctc was 0.08 nm.
      53             : 
      54             : If you change the function in the above sum you can calculate quantities such as the average
      55             : distance from a purely the alpha helical configuration or the distance between the set of
      56             : residues that is closest to an alpha helix and the reference configuration. To do these sorts of
      57             : calculations you can use the AVERAGE and MIN keywords. In addition you can use the LESS_THAN
      58             : keyword if you would like to change the form of the switching function. If you use any of these
      59             : options you no longer need to specify NN, R_0, MM and D_0.
      60             : 
      61             : Please be aware that for codes like gromacs you must ensure that plumed
      62             : reconstructs the chains involved in your CV when you calculate this CV using
      63             : anything other than TYPE=DRMSD.  For more details as to how to do this see \ref WHOLEMOLECULES.
      64             : 
      65             : \par Examples
      66             : 
      67             : The following input calculates the number of six residue segments of
      68             : protein that are in an alpha helical configuration.
      69             : 
      70             : \plumedfile
      71             : #SETTINGS MOLFILE=regtest/basic/rt32/helix.pdb
      72             : MOLINFO STRUCTURE=helix.pdb
      73             : alpha: ALPHARMSD RESIDUES=all
      74             : \endplumedfile
      75             : 
      76             : Here the same is done use RMSD instead of DRMSD
      77             : 
      78             : \plumedfile
      79             : #SETTINGS MOLFILE=regtest/basic/rt32/helix.pdb
      80             : MOLINFO STRUCTURE=helix.pdb
      81             : WHOLEMOLECULES ENTITY0=1-100
      82             : alpha: ALPHARMSD RESIDUES=all TYPE=OPTIMAL R_0=0.1
      83             : \endplumedfile
      84             : 
      85             : */
      86             : //+ENDPLUMEDOC
      87             : 
      88             : class AlphaRMSD : public ActionShortcut {
      89             : public:
      90             :   static void registerKeywords( Keywords& keys );
      91             :   explicit AlphaRMSD(const ActionOptions&);
      92             : };
      93             : 
      94             : PLUMED_REGISTER_ACTION(AlphaRMSD,"ALPHARMSD")
      95             : 
      96           9 : void AlphaRMSD::registerKeywords( Keywords& keys ) {
      97           9 :   SecondaryStructureRMSD::registerKeywords( keys );
      98          18 :   keys.setValueDescription("scalar/vector","if LESS_THAN is present the RMSD distance between each residue and the ideal alpha helix.  If LESS_THAN is not present the number of residue segments where the structure is similar to an alpha helix");
      99          36 :   keys.remove("ATOMS"); keys.remove("SEGMENT"); keys.remove("BONDLENGTH"); keys.remove("CUTOFF_ATOMS");
     100          27 :   keys.remove("NO_ACTION_LOG"); keys.remove("STRANDS_CUTOFF"); keys.remove("STRUCTURE");
     101           9 : }
     102             : 
     103           3 : AlphaRMSD::AlphaRMSD(const ActionOptions&ao):
     104             :   Action(ao),
     105           3 :   ActionShortcut(ao)
     106             : {
     107             :   // Read in the input and create a string that describes how to compute the less than
     108           3 :   std::string ltmap; bool uselessthan=SecondaryStructureRMSD::readShortcutWords( ltmap, this );
     109             :   // read in the backbone atoms
     110           3 :   std::vector<unsigned> chains; std::string atoms; SecondaryStructureRMSD::readBackboneAtoms( this, plumed, "protein", chains, atoms );
     111             : 
     112             :   // This constructs all conceivable sections of alpha helix in the backbone of the chains
     113           3 :   unsigned nprevious=0, segno=1; std::string seglist;
     114           6 :   for(unsigned i=0; i<chains.size(); ++i) {
     115           3 :     if( chains[i]<30 ) error("segment of backbone defined is not long enough to form an alpha helix. Each backbone fragment must contain a minimum of 6 residues");
     116           3 :     unsigned nres=chains[i]/5;
     117           3 :     if( chains[i]%5!=0 ) error("backbone segment received does not contain a multiple of five residues");
     118          18 :     for(unsigned ires=0; ires<nres-5; ires++) {
     119          15 :       unsigned accum=nprevious + 5*ires; std::string strval, num; Tools::convert( segno, num );
     120          30 :       Tools::convert( accum, strval ); seglist += " SEGMENT" + num + "=" + strval;
     121         450 :       for(unsigned k=1; k<30; ++k) { Tools::convert( accum+k, strval ); seglist += "," + strval; }
     122          15 :       segno++;
     123             :     }
     124           3 :     nprevious+=chains[i];
     125             :   }
     126             : 
     127             :   // Build the reference structure ( in angstroms )
     128           3 :   std::vector<Vector> reference(30);
     129           3 :   reference[0] = Vector( 0.733,  0.519,  5.298 ); // N    i
     130           3 :   reference[1] = Vector( 1.763,  0.810,  4.301 ); // CA
     131           3 :   reference[2] = Vector( 3.166,  0.543,  4.881 ); // CB
     132           3 :   reference[3] = Vector( 1.527, -0.045,  3.053 ); // C
     133           3 :   reference[4] = Vector( 1.646,  0.436,  1.928 ); // O
     134           3 :   reference[5] = Vector( 1.180, -1.312,  3.254 ); // N    i+1
     135           3 :   reference[6] = Vector( 0.924, -2.203,  2.126 ); // CA
     136           3 :   reference[7] = Vector( 0.650, -3.626,  2.626 ); // CB
     137           3 :   reference[8] = Vector(-0.239, -1.711,  1.261 ); // C
     138           3 :   reference[9] = Vector(-0.190, -1.815,  0.032 ); // O
     139           3 :   reference[10] = Vector(-1.280, -1.172,  1.891 ); // N    i+2
     140           3 :   reference[11] = Vector(-2.416, -0.661,  1.127 ); // CA
     141           3 :   reference[12] = Vector(-3.548, -0.217,  2.056 ); // CB
     142           3 :   reference[13] = Vector(-1.964,  0.529,  0.276 ); // C
     143           3 :   reference[14] = Vector(-2.364,  0.659, -0.880 ); // O
     144           3 :   reference[15] = Vector(-1.130,  1.391,  0.856 ); // N    i+3
     145           3 :   reference[16] = Vector(-0.620,  2.565,  0.148 ); // CA
     146           3 :   reference[17] = Vector( 0.228,  3.439,  1.077 ); // CB
     147           3 :   reference[18] = Vector( 0.231,  2.129, -1.032 ); // C
     148           3 :   reference[19] = Vector( 0.179,  2.733, -2.099 ); // O
     149           3 :   reference[20] = Vector( 1.028,  1.084, -0.833 ); // N    i+4
     150           3 :   reference[21] = Vector( 1.872,  0.593, -1.919 ); // CA
     151           3 :   reference[22] = Vector( 2.850, -0.462, -1.397 ); // CB
     152           3 :   reference[23] = Vector( 1.020,  0.020, -3.049 ); // C
     153           3 :   reference[24] = Vector( 1.317,  0.227, -4.224 ); // O
     154           3 :   reference[25] = Vector(-0.051, -0.684, -2.696 ); // N    i+5
     155           3 :   reference[26] = Vector(-0.927, -1.261, -3.713 ); // CA
     156           3 :   reference[27] = Vector(-1.933, -2.219, -3.074 ); // CB
     157           3 :   reference[28] = Vector(-1.663, -0.171, -4.475 ); // C
     158           3 :   reference[29] = Vector(-1.916, -0.296, -5.673 ); // O
     159             :   std::string ref0, ref1, ref2;
     160           3 :   Tools::convert(  reference[0][0], ref0 );
     161           3 :   Tools::convert(  reference[0][1], ref1 );
     162           3 :   Tools::convert(  reference[0][2], ref2 );
     163           6 :   std::string structure=" STRUCTURE1=" + ref0 + "," + ref1 + "," + ref2;
     164          90 :   for(unsigned i=1; i<30; ++i) {
     165         348 :     for(unsigned k=0; k<3; ++k) { Tools::convert( reference[i][k], ref0 ); structure += "," + ref0; }
     166             :   }
     167             : 
     168           6 :   std::string type; parse("TYPE",type); std::string lab = getShortcutLabel() + "_rmsd"; if( uselessthan ) lab = getShortcutLabel();
     169           6 :   std::string nopbcstr=""; bool nopbc; parseFlag("NOPBC",nopbc); if( nopbc ) nopbcstr = " NOPBC";
     170           6 :   readInputLine( lab + ": SECONDARY_STRUCTURE_RMSD BONDLENGTH=0.17" + seglist + structure + " " + atoms + " TYPE=" + type + nopbcstr );
     171             :   // Create the less than object
     172           3 :   if( ltmap.length()>0 ) SecondaryStructureRMSD::expandShortcut( uselessthan, getShortcutLabel(), lab, ltmap, this );
     173           3 : }
     174             : 
     175             : }
     176             : }

Generated by: LCOV version 1.16