All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
AntibetaRMSD.cpp
Go to the documentation of this file.
1 /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2  Copyright (c) 2013 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-code.org for more information.
6 
7  This file is part of plumed, version 2.0.
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 \verbatim
74 MOLINFO STRUCTURE=helix.pdb
75 ANTIBETARMSD RESIDUES=all TYPE=DRMSD LESS_THAN={RATIONAL R_0=0.08 NN=8 MM=12} LABEL=a
76 \endverbatim
77 (see also \ref MOLINFO)
78 
79 */
80 //+ENDPLUMEDOC
81 
83 public:
84  static void registerKeywords( Keywords& keys );
86 };
87 
88 PLUMED_REGISTER_ACTION(AntibetaRMSD,"ANTIBETARMSD")
89 
90 void AntibetaRMSD::registerKeywords( Keywords& keys ){
92  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 "
93  "chain configuration with the appropriate geometry are counted. If STYLE=inter "
94  "only sheet-like configurations involving two chains are counted, while if STYLE=intra "
95  "only sheet-like configurations involving a single chain are counted");
96  keys.use("STRANDS_CUTOFF");
97 }
98 
100 Action(ao),
102 {
103  // read in the backbone atoms
104  std::vector<std::string> backnames(5); std::vector<unsigned> chains;
105  backnames[0]="N"; backnames[1]="CA"; backnames[2]="CB"; backnames[3]="C"; backnames[4]="O";
106  readBackboneAtoms( backnames, chains );
107 
108  bool intra_chain(false), inter_chain(false);
109  std::string style; parse("STYLE",style);
110  if( style=="all" ){
111  intra_chain=true; inter_chain=true;
112  } else if( style=="inter"){
113  intra_chain=false; inter_chain=true;
114  } else if( style=="intra"){
115  intra_chain=true; inter_chain=false;
116  } else {
117  error( style + " is not a valid directive for the STYLE keyword");
118  }
119 
120  // Align the atoms based on the positions of these two atoms
121  setAtomsFromStrands( 6, 21 );
122 
123  // This constructs all conceivable sections of antibeta sheet in the backbone of the chains
124  if( intra_chain ){
125  unsigned nres, nprevious=0; std::vector<unsigned> nlist(30);
126  for(unsigned i=0;i<chains.size();++i){
127  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");
128  // Loop over all possible triples in each 8 residue segment of protein
129  nres=chains[i]/5;
130  if( chains[i]%5!=0 ) error("backbone segment received does not contain a multiple of five residues");
131  for(unsigned ires=0;ires<nres-7;ires++){
132  for(unsigned jres=ires+7;jres<nres;jres++){
133  for(unsigned k=0;k<15;++k){
134  nlist[k]=nprevious + ires*5+k;
135  nlist[k+15]=nprevious + (jres-2)*5+k;
136  }
137  addColvar( nlist );
138  }
139  }
140  nprevious+=chains[i];
141  }
142  }
143  if( inter_chain ){
144  if( chains.size()==1 && style!="all" ) error("there is only one chain defined so cannot use inter_chain option");
145  unsigned iprev,jprev,inres,jnres; std::vector<unsigned> nlist(30);
146  for(unsigned ichain=1;ichain<chains.size();++ichain){
147  iprev=0; for(unsigned i=0;i<ichain;++i) iprev+=chains[i];
148  inres=chains[ichain]/5;
149  if( chains[ichain]%5!=0 ) error("backbone segment received does not contain a multiple of five residues");
150  for(unsigned ires=0;ires<inres-2;++ires){
151  for(unsigned jchain=0;jchain<ichain;++jchain){
152  jprev=0; for(unsigned i=0;i<jchain;++i) jprev+=chains[i];
153  jnres=chains[jchain]/5;
154  if( chains[jchain]%5!=0 ) error("backbone segment received does not contain a multiple of five residues");
155  for(unsigned jres=0;jres<jnres-2;++jres){
156  for(unsigned k=0;k<15;++k){
157  nlist[k]=iprev+ ires*5+k;
158  nlist[k+15]=jprev+ jres*5+k;
159  }
160  addColvar( nlist );
161  }
162  }
163  }
164  }
165  }
166 
167  // Build the reference structure ( in angstroms )
168  std::vector<Vector> reference(30);
169  reference[0]=Vector( 2.263, -3.795, 1.722); // N i
170  reference[1]=Vector( 2.493, -2.426, 2.263); // CA
171  reference[2]=Vector( 3.847, -1.838, 1.761); // CB
172  reference[3]=Vector( 1.301, -1.517, 1.921); // C
173  reference[4]=Vector( 0.852, -1.504, 0.739); // O
174  reference[5]=Vector( 0.818, -0.738, 2.917); // N i+1
175  reference[6]=Vector(-0.299, 0.243, 2.748); // CA
176  reference[7]=Vector(-1.421, -0.076, 3.757); // CB
177  reference[8]=Vector( 0.273, 1.680, 2.854); // C
178  reference[9]=Vector( 0.902, 1.993, 3.888); // O
179  reference[10]=Vector( 0.119, 2.532, 1.813); // N i+2
180  reference[11]=Vector( 0.683, 3.916, 1.680); // CA
181  reference[12]=Vector( 1.580, 3.940, 0.395); // CB
182  reference[13]=Vector(-0.394, 5.011, 1.630); // C
183  reference[14]=Vector(-1.459, 4.814, 0.982); // O
184  reference[15]=Vector(-2.962, 3.559, -1.359); // N j-2
185  reference[16]=Vector(-2.439, 2.526, -2.287); // CA
186  reference[17]=Vector(-1.189, 3.006, -3.087); // CB
187  reference[18]=Vector(-2.081, 1.231, -1.520); // C
188  reference[19]=Vector(-1.524, 1.324, -0.409); // O
189  reference[20]=Vector(-2.326, 0.037, -2.095); // N j-1
190  reference[21]=Vector(-1.858, -1.269, -1.554); // CA
191  reference[22]=Vector(-3.053, -2.199, -1.291); // CB
192  reference[23]=Vector(-0.869, -1.949, -2.512); // C
193  reference[24]=Vector(-1.255, -2.070, -3.710); // O
194  reference[25]=Vector( 0.326, -2.363, -2.072); // N j
195  reference[26]=Vector( 1.405, -2.992, -2.872); // CA
196  reference[27]=Vector( 2.699, -2.129, -2.917); // CB
197  reference[28]=Vector( 1.745, -4.399, -2.330); // C
198  reference[29]=Vector( 1.899, -4.545, -1.102); // O
199 
200  // Store the secondary structure ( last number makes sure we convert to internal units nm )
201  setSecondaryStructure( reference, 0.17/atoms.getUnits().getLength(), 0.1/atoms.getUnits().getLength() );
202 }
203 
204 }
205 }
void setSecondaryStructure(std::vector< Vector > &structure, double bondlength, double units)
Set a reference configuration.
void error(const std::string &msg) const
Crash calculation and print documentation.
Definition: Action.cpp:195
void readBackboneAtoms(const std::vector< std::string > &backnames, std::vector< unsigned > &chain_lengths)
Get the atoms in the backbone.
void addColvar(const std::vector< unsigned > &newatoms)
Add a set of atoms to calculat ethe rmsd from.
void parse(const std::string &key, T &t)
Parse one keyword as generic type.
Definition: Action.h:273
This class holds the keywords and their documentation.
Definition: Keywords.h:36
This class is used to bring the relevant information to the Action constructor.
Definition: Action.h:41
Base class for all the input Actions.
Definition: Action.h:60
static void registerKeywords(Keywords &keys)
Provides the keyword ANTIBETARMSD
const Units & getUnits()
Definition: Atoms.h:181
const double & getLength() const
Get length units as double.
Definition: Units.h:95
void setAtomsFromStrands(const unsigned &atom1, const unsigned &atom2)
Setup a pair of atoms to use for strands cutoff.
Vector3d Vector
Alias for three dimensional vectors.
Definition: Vector.h:351
Base action for calculating things like AlphRMSD, AntibetaRMSD, etc.