23 #include "core/ActionRegister.h"
24 #include "core/PlumedMain.h"
25 #include "core/Atoms.h"
28 namespace secondarystructure {
92 keys.add(
"compulsory",
"STYLE",
"all",
"Parallel 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");
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";
108 bool intra_chain(
false), inter_chain(
false);
109 std::string style;
parse(
"STYLE",style);
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;
117 error( style +
" is not a valid directive for the STYLE keyword");
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");
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-8;ires++){
132 for(
unsigned jres=ires+6;jres<nres-2;jres++){
133 for(
unsigned k=0;k<15;++k){
134 nlist[k]=nprevious + ires*5+k;
135 nlist[k+15]=nprevious + jres*5+k;
140 nprevious+=chains[i];
145 if( chains.size()==1 && style!=
"all" )
error(
"there is only one chain defined so cannot use inter_chain option");
146 unsigned iprev,jprev,inres,jnres; std::vector<unsigned> nlist(30);
147 for(
unsigned ichain=1;ichain<chains.size();++ichain){
148 iprev=0;
for(
unsigned i=0;i<ichain;++i) iprev+=chains[i];
149 inres=chains[ichain]/5;
150 if( chains[ichain]%5!=0 )
error(
"backbone segment received does not contain a multiple of five residues");
151 for(
unsigned ires=0;ires<inres-2;++ires){
152 for(
unsigned jchain=0;jchain<ichain;++jchain){
153 jprev=0;
for(
unsigned i=0;i<jchain;++i) jprev+=chains[i];
154 jnres=chains[jchain]/5;
155 if( chains[jchain]%5!=0 )
error(
"backbone segment received does not contain a multiple of five residues");
156 for(
unsigned jres=0;jres<jnres-2;++jres){
157 for(
unsigned k=0;k<15;++k){
158 nlist[k]=iprev + ires*5+k;
159 nlist[k+15]=jprev + jres*5+k;
169 std::vector<Vector> reference(30);
170 reference[0]=
Vector( 1.244, -4.620, -2.127);
171 reference[1]=
Vector(-0.016, -4.500, -1.395);
172 reference[2]=
Vector( 0.105, -5.089, 0.024);
173 reference[3]=
Vector(-0.287, -3.000, -1.301);
174 reference[4]=
Vector( 0.550, -2.245, -0.822);
175 reference[5]=
Vector(-1.445, -2.551, -1.779);
176 reference[6]=
Vector(-1.752, -1.130, -1.677);
177 reference[7]=
Vector(-2.113, -0.550, -3.059);
178 reference[8]=
Vector(-2.906, -0.961, -0.689);
179 reference[9]=
Vector(-3.867, -1.738, -0.695);
180 reference[10]=
Vector(-2.774, 0.034, 0.190);
181 reference[11]=
Vector(-3.788, 0.331, 1.201);
182 reference[12]=
Vector(-3.188, 0.300, 2.624);
183 reference[13]=
Vector(-4.294, 1.743, 0.937);
184 reference[14]=
Vector(-3.503, 2.671, 0.821);
185 reference[15]=
Vector( 4.746, -2.363, 0.188);
186 reference[16]=
Vector( 3.427, -1.839, 0.545);
187 reference[17]=
Vector( 3.135, -1.958, 2.074);
188 reference[18]=
Vector( 3.346, -0.365, 0.181);
189 reference[19]=
Vector( 4.237, 0.412, 0.521);
190 reference[20]=
Vector( 2.261, 0.013, -0.487);
191 reference[21]=
Vector( 2.024, 1.401, -0.875);
192 reference[22]=
Vector( 1.489, 1.514, -2.313);
193 reference[23]=
Vector( 0.914, 1.902, 0.044);
194 reference[24]=
Vector(-0.173, 1.330, 0.052);
195 reference[25]=
Vector( 1.202, 2.940, 0.828);
196 reference[26]=
Vector( 0.190, 3.507, 1.718);
197 reference[27]=
Vector( 0.772, 3.801, 3.104);
198 reference[28]=
Vector(-0.229, 4.791, 1.038);
199 reference[29]=
Vector( 0.523, 5.771, 0.996);
203 reference[0]=
Vector(-1.439, -5.122, -1.144);
204 reference[1]=
Vector(-0.816, -3.803, -1.013);
205 reference[2]=
Vector( 0.099, -3.509, -2.206);
206 reference[3]=
Vector(-1.928, -2.770, -0.952);
207 reference[4]=
Vector(-2.991, -2.970, -1.551);
208 reference[5]=
Vector(-1.698, -1.687, -0.215);
209 reference[6]=
Vector(-2.681, -0.613, -0.143);
210 reference[7]=
Vector(-3.323, -0.477, 1.267);
211 reference[8]=
Vector(-1.984, 0.681, -0.574);
212 reference[9]=
Vector(-0.807, 0.921, -0.273);
213 reference[10]=
Vector(-2.716, 1.492, -1.329);
214 reference[11]=
Vector(-2.196, 2.731, -1.883);
215 reference[12]=
Vector(-2.263, 2.692, -3.418);
216 reference[13]=
Vector(-2.989, 3.949, -1.433);
217 reference[14]=
Vector(-4.214, 3.989, -1.583);
218 reference[15]=
Vector( 2.464, -4.352, 2.149);
219 reference[16]=
Vector( 3.078, -3.170, 1.541);
220 reference[17]=
Vector( 3.398, -3.415, 0.060);
221 reference[18]=
Vector( 2.080, -2.021, 1.639);
222 reference[19]=
Vector( 0.938, -2.178, 1.225);
223 reference[20]=
Vector( 2.525, -0.886, 2.183);
224 reference[21]=
Vector( 1.692, 0.303, 2.346);
225 reference[22]=
Vector( 1.541, 0.665, 3.842);
226 reference[23]=
Vector( 2.420, 1.410, 1.608);
227 reference[24]=
Vector( 3.567, 1.733, 1.937);
228 reference[25]=
Vector( 1.758, 1.976, 0.600);
229 reference[26]=
Vector( 2.373, 2.987, -0.238);
230 reference[27]=
Vector( 2.367, 2.527, -1.720);
231 reference[28]=
Vector( 1.684, 4.331, -0.148);
232 reference[29]=
Vector( 0.486, 4.430, -0.415);
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.
static void registerKeywords(Keywords &keys)
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.
This class holds the keywords and their documentation.
Provides the keyword PARABETARMSD
static void registerKeywords(Keywords &keys)
This class is used to bring the relevant information to the Action constructor.
Base class for all the input Actions.
const double & getLength() const
Get length units as double.
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.
ParabetaRMSD(const ActionOptions &)
Base action for calculating things like AlphRMSD, AntibetaRMSD, etc.