LCOV - code coverage report
Current view: top level - secondarystructure - AntibetaRMSD.cpp (source / functions) Hit Total Coverage
Test: plumed test coverage Lines: 78 80 97.5 %
Date: 2020-11-18 11:20:57 Functions: 9 10 90.0 %

          Line data    Source code
       1             : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       2             :    Copyright (c) 2012-2019 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 ANTIBETARMSD
      31             : /*
      32             : Probe the antiparallel beta sheet content of your protein structure.
      33             : 
      34             : Two protein segments containing three continguous residues can form an antiparallel beta sheet.
      35             : Although if the two segments are part of the same protein chain they must be separated by
      36             : a minimum of 2 residues to make room for the turn. This colvar thus generates the set of
      37             : all possible six residue sections that could conceivably form an antiparallel beta sheet
      38             : and calculates the RMSD distance between the configuration in which the residues find themselves
      39             : and an idealized antiparallel beta sheet structure. These distances can be calculated by either
      40             : aligning the instantaneous structure with the reference structure and measuring each
      41             : atomic displacement or by calculating differences between the set of interatomic
      42             : distances in the reference and instantaneous structures.
      43             : 
      44             : This colvar is based on the following reference \cite pietrucci09jctc.  The authors of
      45             : this paper use the set of distances from the anti parallel beta sheet configurations to measure
      46             : the number of segments that have an configuration that resemebles an anti paralel beta sheet. This is done by calculating
      47             : the following sum of functions of the rmsd distances:
      48             : 
      49             : \f[
      50             : 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 }
      51             : \f]
      52             : 
      53             : where the sum runs over all possible segments of antiparallel beta sheet.  By default the
      54             : NN, MM and D_0 parameters are set equal to those used in \cite pietrucci09jctc.  The R_0
      55             : parameter must be set by the user - the value used in \cite pietrucci09jctc was 0.08 nm.
      56             : 
      57             : If you change the function in the above sum you can calculate quantities such as the average
      58             : distance from a purely configuration composed of pure anti-parallel beta sheets or the distance between the set of
      59             : residues that is closest to an anti-parallel beta sheet and the reference configuration. To do these sorts of
      60             : calculations you can use the AVERAGE and MIN keywords. In addition you can use the LESS_THAN
      61             : keyword if you would like to change the form of the switching function. If you use any of these
      62             : options you no longer need to specify NN, R_0, MM and D_0.
      63             : 
      64             : Please be aware that for codes like gromacs you must ensure that plumed
      65             : reconstructs the chains involved in your CV when you calculate this CV using
      66             : anthing other than TYPE=DRMSD.  For more details as to how to do this see \ref WHOLEMOLECULES.
      67             : 
      68             : \par Examples
      69             : 
      70             : The following input calculates the number of six residue segments of
      71             : protein that are in an antiparallel beta sheet configuration.
      72             : 
      73             : \plumedfile
      74             : MOLINFO STRUCTURE=beta.pdb
      75             : ab: ANTIBETARMSD RESIDUES=all STRANDS_CUTOFF=1
      76             : \endplumedfile
      77             : 
      78             : Here the same is done use RMSD instead of DRMSD
      79             : 
      80             : \plumedfile
      81             : MOLINFO STRUCTURE=helix.pdb
      82             : WHOLEMOLECULES ENTITY0=1-100
      83             : hh: ANTIBETARMSD RESIDUES=all TYPE=OPTIMAL R_0=0.1  STRANDS_CUTOFF=1
      84             : \endplumedfile
      85             : */
      86             : //+ENDPLUMEDOC
      87             : 
      88          24 : class AntibetaRMSD : public SecondaryStructureRMSD {
      89             : public:
      90             :   static void registerKeywords( Keywords& keys );
      91             :   explicit AntibetaRMSD(const ActionOptions&);
      92             : };
      93             : 
      94        6464 : PLUMED_REGISTER_ACTION(AntibetaRMSD,"ANTIBETARMSD")
      95             : 
      96          13 : void AntibetaRMSD::registerKeywords( Keywords& keys ) {
      97          13 :   SecondaryStructureRMSD::registerKeywords( keys );
      98          65 :   keys.add("compulsory","STYLE","all","Antiparallel beta sheets can either form in a single chain or from a pair of chains. If STYLE=all all "
      99             :            "chain configuration with the appropriate geometry are counted.  If STYLE=inter "
     100             :            "only sheet-like configurations involving two chains are counted, while if STYLE=intra "
     101             :            "only sheet-like configurations involving a single chain are counted");
     102          26 :   keys.use("STRANDS_CUTOFF");
     103          13 : }
     104             : 
     105          12 : AntibetaRMSD::AntibetaRMSD(const ActionOptions&ao):
     106             :   Action(ao),
     107          12 :   SecondaryStructureRMSD(ao)
     108             : {
     109             :   // read in the backbone atoms
     110          24 :   std::vector<unsigned> chains; readBackboneAtoms( "protein", chains );
     111             : 
     112             :   bool intra_chain(false), inter_chain(false);
     113          24 :   std::string style; parse("STYLE",style);
     114          12 :   if( style=="all" ) {
     115             :     intra_chain=true; inter_chain=true;
     116           2 :   } else if( style=="inter") {
     117             :     intra_chain=false; inter_chain=true;
     118           0 :   } else if( style=="intra") {
     119             :     intra_chain=true; inter_chain=false;
     120             :   } else {
     121           0 :     error( style + " is not a valid directive for the STYLE keyword");
     122             :   }
     123             : 
     124             :   // Align the atoms based on the positions of these two atoms
     125          12 :   setAtomsFromStrands( 6, 21 );
     126             : 
     127             :   // This constructs all conceivable sections of antibeta sheet in the backbone of the chains
     128          12 :   if( intra_chain ) {
     129          10 :     unsigned nprevious=0; std::vector<unsigned> nlist(30);
     130         509 :     for(unsigned i=0; i<chains.size(); ++i) {
     131         163 :       if( chains[i]<40 ) error("segment of backbone is not long enough to form an antiparallel beta hairpin. Each backbone fragment must contain a minimum of 8 residues");
     132             :       // Loop over all possible triples in each 8 residue segment of protein
     133         163 :       unsigned nres=chains[i]/5;
     134         163 :       if( chains[i]%5!=0 ) error("backbone segment received does not contain a multiple of five residues");
     135         497 :       for(unsigned ires=0; ires<nres-7; ires++) {
     136         344 :         for(unsigned jres=ires+7; jres<nres; jres++) {
     137        5487 :           for(unsigned k=0; k<15; ++k) {
     138        5310 :             nlist[k]=nprevious + ires*5+k;
     139        5310 :             nlist[k+15]=nprevious + (jres-2)*5+k;
     140             :           }
     141         177 :           addColvar( nlist );
     142             :         }
     143             :       }
     144         163 :       nprevious+=chains[i];
     145             :     }
     146             :   }
     147          12 :   if( inter_chain ) {
     148          13 :     if( chains.size()==1 && style!="all" ) error("there is only one chain defined so cannot use inter_chain option");
     149          12 :     std::vector<unsigned> nlist(30);
     150         489 :     for(unsigned ichain=1; ichain<chains.size(); ++ichain) {
     151        2913 :       unsigned iprev=0; for(unsigned i=0; i<ichain; ++i) iprev+=chains[i];
     152         155 :       unsigned inres=chains[ichain]/5;
     153         155 :       if( chains[ichain]%5!=0 ) error("backbone segment received does not contain a multiple of five residues");
     154        1995 :       for(unsigned ires=0; ires<inres-2; ++ires) {
     155       17448 :         for(unsigned jchain=0; jchain<ichain; ++jchain) {
     156       96392 :           unsigned jprev=0; for(unsigned i=0; i<jchain; ++i) jprev+=chains[i];
     157       16528 :           unsigned jnres=chains[jchain]/5;
     158        8264 :           if( chains[jchain]%5!=0 ) error("backbone segment received does not contain a multiple of five residues");
     159      107412 :           for(unsigned jres=0; jres<jnres-2; ++jres) {
     160     1536794 :             for(unsigned k=0; k<15; ++k) {
     161     1487220 :               nlist[k]=iprev+ ires*5+k;
     162     1487220 :               nlist[k+15]=jprev+ jres*5+k;
     163             :             }
     164       49574 :             addColvar( nlist );
     165             :           }
     166             :         }
     167             :       }
     168             :     }
     169             :   }
     170             : 
     171             :   // Build the reference structure ( in angstroms )
     172          12 :   std::vector<Vector> reference(30);
     173          12 :   reference[0]=Vector( 2.263, -3.795,  1.722); // N    i
     174          12 :   reference[1]=Vector( 2.493, -2.426,  2.263); // CA
     175          12 :   reference[2]=Vector( 3.847, -1.838,  1.761); // CB
     176          12 :   reference[3]=Vector( 1.301, -1.517,  1.921); // C
     177          12 :   reference[4]=Vector( 0.852, -1.504,  0.739); // O
     178          12 :   reference[5]=Vector( 0.818, -0.738,  2.917); // N    i+1
     179          12 :   reference[6]=Vector(-0.299,  0.243,  2.748); // CA
     180          12 :   reference[7]=Vector(-1.421, -0.076,  3.757); // CB
     181          12 :   reference[8]=Vector( 0.273,  1.680,  2.854); // C
     182          12 :   reference[9]=Vector( 0.902,  1.993,  3.888); // O
     183          12 :   reference[10]=Vector( 0.119,  2.532,  1.813); // N    i+2
     184          12 :   reference[11]=Vector( 0.683,  3.916,  1.680); // CA
     185          12 :   reference[12]=Vector( 1.580,  3.940,  0.395); // CB
     186          12 :   reference[13]=Vector(-0.394,  5.011,  1.630); // C
     187          12 :   reference[14]=Vector(-1.459,  4.814,  0.982); // O
     188          12 :   reference[15]=Vector(-2.962,  3.559, -1.359); // N    j-2
     189          12 :   reference[16]=Vector(-2.439,  2.526, -2.287); // CA
     190          12 :   reference[17]=Vector(-1.189,  3.006, -3.087); // CB
     191          12 :   reference[18]=Vector(-2.081,  1.231, -1.520); // C
     192          12 :   reference[19]=Vector(-1.524,  1.324, -0.409); // O
     193          12 :   reference[20]=Vector(-2.326,  0.037, -2.095); // N    j-1
     194          12 :   reference[21]=Vector(-1.858, -1.269, -1.554); // CA
     195          12 :   reference[22]=Vector(-3.053, -2.199, -1.291); // CB
     196          12 :   reference[23]=Vector(-0.869, -1.949, -2.512); // C
     197          12 :   reference[24]=Vector(-1.255, -2.070, -3.710); // O
     198          12 :   reference[25]=Vector( 0.326, -2.363, -2.072); // N    j
     199          12 :   reference[26]=Vector( 1.405, -2.992, -2.872); // CA
     200          12 :   reference[27]=Vector( 2.699, -2.129, -2.917); // CB
     201          12 :   reference[28]=Vector( 1.745, -4.399, -2.330); // C
     202          12 :   reference[29]=Vector( 1.899, -4.545, -1.102); // O
     203             : 
     204             :   // Store the secondary structure ( last number makes sure we convert to internal units nm )
     205          12 :   setSecondaryStructure( reference, 0.17/atoms.getUnits().getLength(), 0.1/atoms.getUnits().getLength() );
     206          12 : }
     207             : 
     208             : }
     209        4839 : }

Generated by: LCOV version 1.13