LCOV - code coverage report
Current view: top level - secondarystructure - AlphaRMSD.cpp (source / functions) Hit Total Coverage
Test: plumed test coverage Lines: 52 52 100.0 %
Date: 2018-12-19 07:49:13 Functions: 9 10 90.0 %

          Line data    Source code
       1             : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       2             :    Copyright (c) 2012-2018 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             : #include "core/Atoms.h"
      26             : 
      27             : namespace PLMD {
      28             : namespace secondarystructure {
      29             : 
      30             : //+PLUMEDOC COLVAR ALPHARMSD
      31             : /*
      32             : Probe the alpha helical content of a protein structure.
      33             : 
      34             : Any chain of six contiguous residues in a protein chain can form an alpha helix. This
      35             : colvar thus generates the set of all possible six residue sections and calculates
      36             : the RMSD distance between the configuration in which the residues find themselves
      37             : and an idealized alpha helical structure. These distances can be calculated by either
      38             : aligning the instantaneous structure with the reference structure and measuring each
      39             : atomic displacement or by calculating differences between the set of interatomic
      40             : distances in the reference and instantaneous structures.
      41             : 
      42             : This colvar is based on the following reference \cite pietrucci09jctc.  The authors of
      43             : this paper use the set of distances from the alpha helix configurations to measure
      44             : the number of segments that have an alpha helical configuration. This is done by calculating
      45             : the following sum of functions of the rmsd distances:
      46             : 
      47             : \f[
      48             : 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 }
      49             : \f]
      50             : 
      51             : where the sum runs over all possible segments of alpha helix.  By default the
      52             : NN, MM and D_0 parameters are set equal to those used in \cite pietrucci09jctc.  The R_0
      53             : parameter must be set by the user - the value used in \cite pietrucci09jctc was 0.08 nm.
      54             : 
      55             : If you change the function in the above sum you can calculate quantities such as the average
      56             : distance from a purely the alpha helical configuration or the distance between the set of
      57             : residues that is closest to an alpha helix and the reference configuration. To do these sorts of
      58             : calculations you can use the AVERAGE and MIN keywords. In addition you can use the LESS_THAN
      59             : keyword if you would like to change the form of the switching function. If you use any of these
      60             : options you no longer need to specify NN, R_0, MM and D_0.
      61             : 
      62             : Please be aware that for codes like gromacs you must ensure that plumed
      63             : reconstructs the chains involved in your CV when you calculate this CV using
      64             : anthing other than TYPE=DRMSD.  For more details as to how to do this see \ref WHOLEMOLECULES.
      65             : 
      66             : \par Examples
      67             : 
      68             : The following input calculates the number of six residue segments of
      69             : protein that are in an alpha helical configuration.
      70             : 
      71             : \verbatim
      72             : MOLINFO STRUCTURE=helix.pdb
      73             : ALPHARMSD RESIDUES=all TYPE=DRMSD LESS_THAN={RATIONAL R_0=0.08 NN=8 MM=12} LABEL=a
      74             : \endverbatim
      75             : (see also \ref MOLINFO)
      76             : 
      77             : */
      78             : //+ENDPLUMEDOC
      79             : 
      80           6 : class AlphaRMSD : public SecondaryStructureRMSD {
      81             : public:
      82             :   static void registerKeywords( Keywords& keys );
      83             :   explicit AlphaRMSD(const ActionOptions&);
      84             : };
      85             : 
      86        2526 : PLUMED_REGISTER_ACTION(AlphaRMSD,"ALPHARMSD")
      87             : 
      88           4 : void AlphaRMSD::registerKeywords( Keywords& keys ) {
      89           4 :   SecondaryStructureRMSD::registerKeywords( keys );
      90           4 : }
      91             : 
      92           3 : AlphaRMSD::AlphaRMSD(const ActionOptions&ao):
      93             :   Action(ao),
      94           3 :   SecondaryStructureRMSD(ao)
      95             : {
      96             :   // read in the backbone atoms
      97           3 :   std::vector<unsigned> chains; readBackboneAtoms( "protein", chains);
      98             : 
      99             :   // This constructs all conceivable sections of alpha helix in the backbone of the chains
     100           6 :   unsigned nres, nprevious=0; std::vector<unsigned> nlist(30);
     101           6 :   for(unsigned i=0; i<chains.size(); ++i) {
     102           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");
     103           3 :     nres=chains[i]/5;
     104           3 :     if( chains[i]%5!=0 ) error("backbone segment received does not contain a multiple of five residues");
     105          12 :     for(unsigned ires=0; ires<nres-5; ires++) {
     106           9 :       unsigned accum=nprevious + 5*ires;
     107           9 :       for(unsigned k=0; k<30; ++k) nlist[k] = accum+k;
     108           9 :       addColvar( nlist );
     109             :     }
     110           3 :     nprevious+=chains[i];
     111             :   }
     112             : 
     113             :   // Build the reference structure ( in angstroms )
     114           6 :   std::vector<Vector> reference(30);
     115           3 :   reference[0] = Vector( 0.733,  0.519,  5.298 ); // N    i
     116           3 :   reference[1] = Vector( 1.763,  0.810,  4.301 ); // CA
     117           3 :   reference[2] = Vector( 3.166,  0.543,  4.881 ); // CB
     118           3 :   reference[3] = Vector( 1.527, -0.045,  3.053 ); // C
     119           3 :   reference[4] = Vector( 1.646,  0.436,  1.928 ); // O
     120           3 :   reference[5] = Vector( 1.180, -1.312,  3.254 ); // N    i+1
     121           3 :   reference[6] = Vector( 0.924, -2.203,  2.126 ); // CA
     122           3 :   reference[7] = Vector( 0.650, -3.626,  2.626 ); // CB
     123           3 :   reference[8] = Vector(-0.239, -1.711,  1.261 ); // C
     124           3 :   reference[9] = Vector(-0.190, -1.815,  0.032 ); // O
     125           3 :   reference[10] = Vector(-1.280, -1.172,  1.891 ); // N    i+2
     126           3 :   reference[11] = Vector(-2.416, -0.661,  1.127 ); // CA
     127           3 :   reference[12] = Vector(-3.548, -0.217,  2.056 ); // CB
     128           3 :   reference[13] = Vector(-1.964,  0.529,  0.276 ); // C
     129           3 :   reference[14] = Vector(-2.364,  0.659, -0.880 ); // O
     130           3 :   reference[15] = Vector(-1.130,  1.391,  0.856 ); // N    i+3
     131           3 :   reference[16] = Vector(-0.620,  2.565,  0.148 ); // CA
     132           3 :   reference[17] = Vector( 0.228,  3.439,  1.077 ); // CB
     133           3 :   reference[18] = Vector( 0.231,  2.129, -1.032 ); // C
     134           3 :   reference[19] = Vector( 0.179,  2.733, -2.099 ); // O
     135           3 :   reference[20] = Vector( 1.028,  1.084, -0.833 ); // N    i+4
     136           3 :   reference[21] = Vector( 1.872,  0.593, -1.919 ); // CA
     137           3 :   reference[22] = Vector( 2.850, -0.462, -1.397 ); // CB
     138           3 :   reference[23] = Vector( 1.020,  0.020, -3.049 ); // C
     139           3 :   reference[24] = Vector( 1.317,  0.227, -4.224 ); // O
     140           3 :   reference[25] = Vector(-0.051, -0.684, -2.696 ); // N    i+5
     141           3 :   reference[26] = Vector(-0.927, -1.261, -3.713 ); // CA
     142           3 :   reference[27] = Vector(-1.933, -2.219, -3.074 ); // CB
     143           3 :   reference[28] = Vector(-1.663, -0.171, -4.475 ); // C
     144           3 :   reference[29] = Vector(-1.916, -0.296, -5.673 ); // O
     145             :   // Store the secondary structure ( last number makes sure we convert to internal units nm )
     146           6 :   setSecondaryStructure( reference, 0.17/atoms.getUnits().getLength(), 0.1/atoms.getUnits().getLength() );
     147           3 : }
     148             : 
     149             : }
     150        2523 : }

Generated by: LCOV version 1.13