LCOV - code coverage report
Current view: top level - secondarystructure - AlphaRMSD.cpp (source / functions) Hit Total Coverage
Test: plumed test coverage Lines: 50 50 100.0 %
Date: 2024-10-11 08:09:47 Functions: 5 6 83.3 %

          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/ActionRegister.h"
      24             : #include "core/PlumedMain.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 SecondaryStructureRMSD {
      89             : public:
      90             :   static void registerKeywords( Keywords& keys );
      91             :   explicit AlphaRMSD(const ActionOptions&);
      92             : };
      93             : 
      94       10425 : PLUMED_REGISTER_ACTION(AlphaRMSD,"ALPHARMSD")
      95             : 
      96           4 : void AlphaRMSD::registerKeywords( Keywords& keys ) {
      97           4 :   SecondaryStructureRMSD::registerKeywords( keys );
      98           4 : }
      99             : 
     100           3 : AlphaRMSD::AlphaRMSD(const ActionOptions&ao):
     101             :   Action(ao),
     102           3 :   SecondaryStructureRMSD(ao)
     103             : {
     104             :   // read in the backbone atoms
     105           3 :   std::vector<unsigned> chains; readBackboneAtoms( "protein", chains);
     106             : 
     107             :   // This constructs all conceivable sections of alpha helix in the backbone of the chains
     108           3 :   unsigned nprevious=0; std::vector<unsigned> nlist(30);
     109           6 :   for(unsigned i=0; i<chains.size(); ++i) {
     110           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");
     111           3 :     unsigned nres=chains[i]/5;
     112           3 :     if( chains[i]%5!=0 ) error("backbone segment received does not contain a multiple of five residues");
     113          12 :     for(unsigned ires=0; ires<nres-5; ires++) {
     114           9 :       unsigned accum=nprevious + 5*ires;
     115         279 :       for(unsigned k=0; k<30; ++k) nlist[k] = accum+k;
     116           9 :       addColvar( nlist );
     117             :     }
     118           3 :     nprevious+=chains[i];
     119             :   }
     120             : 
     121             :   // Build the reference structure ( in angstroms )
     122           3 :   std::vector<Vector> reference(30);
     123           3 :   reference[0] = Vector( 0.733,  0.519,  5.298 ); // N    i
     124           3 :   reference[1] = Vector( 1.763,  0.810,  4.301 ); // CA
     125           3 :   reference[2] = Vector( 3.166,  0.543,  4.881 ); // CB
     126           3 :   reference[3] = Vector( 1.527, -0.045,  3.053 ); // C
     127           3 :   reference[4] = Vector( 1.646,  0.436,  1.928 ); // O
     128           3 :   reference[5] = Vector( 1.180, -1.312,  3.254 ); // N    i+1
     129           3 :   reference[6] = Vector( 0.924, -2.203,  2.126 ); // CA
     130           3 :   reference[7] = Vector( 0.650, -3.626,  2.626 ); // CB
     131           3 :   reference[8] = Vector(-0.239, -1.711,  1.261 ); // C
     132           3 :   reference[9] = Vector(-0.190, -1.815,  0.032 ); // O
     133           3 :   reference[10] = Vector(-1.280, -1.172,  1.891 ); // N    i+2
     134           3 :   reference[11] = Vector(-2.416, -0.661,  1.127 ); // CA
     135           3 :   reference[12] = Vector(-3.548, -0.217,  2.056 ); // CB
     136           3 :   reference[13] = Vector(-1.964,  0.529,  0.276 ); // C
     137           3 :   reference[14] = Vector(-2.364,  0.659, -0.880 ); // O
     138           3 :   reference[15] = Vector(-1.130,  1.391,  0.856 ); // N    i+3
     139           3 :   reference[16] = Vector(-0.620,  2.565,  0.148 ); // CA
     140           3 :   reference[17] = Vector( 0.228,  3.439,  1.077 ); // CB
     141           3 :   reference[18] = Vector( 0.231,  2.129, -1.032 ); // C
     142           3 :   reference[19] = Vector( 0.179,  2.733, -2.099 ); // O
     143           3 :   reference[20] = Vector( 1.028,  1.084, -0.833 ); // N    i+4
     144           3 :   reference[21] = Vector( 1.872,  0.593, -1.919 ); // CA
     145           3 :   reference[22] = Vector( 2.850, -0.462, -1.397 ); // CB
     146           3 :   reference[23] = Vector( 1.020,  0.020, -3.049 ); // C
     147           3 :   reference[24] = Vector( 1.317,  0.227, -4.224 ); // O
     148           3 :   reference[25] = Vector(-0.051, -0.684, -2.696 ); // N    i+5
     149           3 :   reference[26] = Vector(-0.927, -1.261, -3.713 ); // CA
     150           3 :   reference[27] = Vector(-1.933, -2.219, -3.074 ); // CB
     151           3 :   reference[28] = Vector(-1.663, -0.171, -4.475 ); // C
     152           3 :   reference[29] = Vector(-1.916, -0.296, -5.673 ); // O
     153             :   // Store the secondary structure ( last number makes sure we convert to internal units nm )
     154           3 :   setSecondaryStructure( reference, 0.17/atoms.getUnits().getLength(), 0.1/atoms.getUnits().getLength() );
     155           3 : }
     156             : 
     157             : }
     158             : }

Generated by: LCOV version 1.15