Line data Source code
1 : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 : Copyright (c) 2013-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 "MolDataClass.h"
23 : #include "Exception.h"
24 : #include "Tools.h"
25 : #include "PDB.h"
26 :
27 : namespace PLMD {
28 :
29 25 : unsigned MolDataClass::numberOfAtomsPerResidueInBackbone( const std::string& type ) {
30 25 : if( type=="protein" ) return 5;
31 0 : else if( type=="dna" ) return 6;
32 0 : else if( type=="rna" ) return 6;
33 0 : else return 0;
34 : }
35 :
36 6005 : bool MolDataClass::allowedResidue( const std::string& type, const std::string& residuename ) {
37 6005 : if( type=="protein" ) {
38 5668 : if(residuename=="ALA") return true;
39 5534 : else if(residuename=="ARG") return true;
40 5534 : else if(residuename=="ASN") return true;
41 5534 : else if(residuename=="ASP") return true;
42 5534 : else if(residuename=="CYS") return true;
43 5534 : else if(residuename=="GLN") return true;
44 5534 : else if(residuename=="GLU") return true;
45 5534 : else if(residuename=="GLY") return true;
46 5530 : else if(residuename=="HIS") return true;
47 5530 : else if(residuename=="ILE") return true;
48 5530 : else if(residuename=="LEU") return true;
49 5530 : else if(residuename=="LYS") return true;
50 5530 : else if(residuename=="MET") return true;
51 5530 : else if(residuename=="PHE") return true;
52 5530 : else if(residuename=="PRO") return true;
53 5529 : else if(residuename=="SER") return true;
54 5525 : else if(residuename=="THR") return true;
55 5525 : else if(residuename=="TRP") return true;
56 5521 : else if(residuename=="TYR") return true;
57 5521 : else if(residuename=="VAL") return true;
58 : // Terminal groups
59 337 : else if(residuename=="ACE") return true;
60 337 : else if(residuename=="NME") return true;
61 : // Alternative residue names in common force fiels
62 337 : else if(residuename=="GLH") return true; // neutral GLU
63 337 : else if(residuename=="ASH") return true; // neutral ASP
64 337 : else if(residuename=="HID") return true; // HIS-D amber
65 337 : else if(residuename=="HSD") return true; // HIS-D charmm
66 337 : else if(residuename=="HIE") return true; // HIS-E amber
67 337 : else if(residuename=="HSE") return true; // HIS-E charmm
68 337 : else if(residuename=="HIP") return true; // HIS-P amber
69 337 : else if(residuename=="HSP") return true; // HIS-P charmm
70 337 : else return false;
71 337 : } else if( type=="dna" ) {
72 0 : if(residuename=="DA") return true;
73 0 : else if(residuename=="DG") return true;
74 0 : else if(residuename=="DT") return true;
75 0 : else if(residuename=="DC") return true;
76 0 : else if(residuename=="DA5") return true;
77 0 : else if(residuename=="DA3") return true;
78 0 : else if(residuename=="DAN") return true;
79 0 : else if(residuename=="DG5") return true;
80 0 : else if(residuename=="DG3") return true;
81 0 : else if(residuename=="DGN") return true;
82 0 : else if(residuename=="DT5") return true;
83 0 : else if(residuename=="DT3") return true;
84 0 : else if(residuename=="DTN") return true;
85 0 : else if(residuename=="DC5") return true;
86 0 : else if(residuename=="DC3") return true;
87 0 : else if(residuename=="DCN") return true;
88 0 : else return false;
89 337 : } else if( type=="rna" ) {
90 337 : if(residuename=="A") return true;
91 332 : else if(residuename=="A5") return true;
92 332 : else if(residuename=="A3") return true;
93 332 : else if(residuename=="AN") return true;
94 332 : else if(residuename=="G") return true;
95 322 : else if(residuename=="G5") return true;
96 318 : else if(residuename=="G3") return true;
97 318 : else if(residuename=="GN") return true;
98 318 : else if(residuename=="U") return true;
99 296 : else if(residuename=="U5") return true;
100 296 : else if(residuename=="U3") return true;
101 296 : else if(residuename=="UN") return true;
102 296 : else if(residuename=="C") return true;
103 288 : else if(residuename=="C5") return true;
104 288 : else if(residuename=="C3") return true;
105 284 : else if(residuename=="CN") return true;
106 284 : else if(residuename=="RA") return true;
107 204 : else if(residuename=="RA5") return true;
108 204 : else if(residuename=="RA3") return true;
109 204 : else if(residuename=="RAN") return true;
110 204 : else if(residuename=="RG") return true;
111 152 : else if(residuename=="RG5") return true;
112 152 : else if(residuename=="RG3") return true;
113 148 : else if(residuename=="RGN") return true;
114 148 : else if(residuename=="RU") return true;
115 48 : else if(residuename=="RU5") return true;
116 48 : else if(residuename=="RU3") return true;
117 48 : else if(residuename=="RUN") return true;
118 48 : else if(residuename=="RC") return true;
119 4 : else if(residuename=="RC5") return true;
120 0 : else if(residuename=="RC3") return true;
121 0 : else if(residuename=="RCN") return true;
122 0 : else return false;
123 : }
124 0 : return false;
125 : }
126 :
127 2652 : void MolDataClass::getBackboneForResidue( const std::string& type, const unsigned& residuenum, const PDB& mypdb, std::vector<AtomNumber>& atoms ) {
128 2652 : std::string residuename=mypdb.getResidueName( residuenum );
129 2652 : plumed_massert( MolDataClass::allowedResidue( type, residuename ), "residue " + residuename + " unrecognized for molecule type " + type );
130 2652 : if( type=="protein" ) {
131 2652 : if( residuename=="GLY") {
132 0 : atoms.resize(5);
133 0 : atoms[0]=mypdb.getNamedAtomFromResidue("N",residuenum);
134 0 : atoms[1]=mypdb.getNamedAtomFromResidue("CA",residuenum);
135 0 : atoms[2]=mypdb.getNamedAtomFromResidue("HA1",residuenum);
136 0 : atoms[3]=mypdb.getNamedAtomFromResidue("C",residuenum);
137 0 : atoms[4]=mypdb.getNamedAtomFromResidue("O",residuenum);
138 2652 : } else if( residuename=="ACE") {
139 0 : atoms.resize(1);
140 0 : atoms[0]=mypdb.getNamedAtomFromResidue("C",residuenum);
141 2652 : } else if( residuename=="NME") {
142 0 : atoms.resize(1);
143 0 : atoms[0]=mypdb.getNamedAtomFromResidue("N",residuenum);
144 : } else {
145 2652 : atoms.resize(5);
146 2652 : atoms[0]=mypdb.getNamedAtomFromResidue("N",residuenum);
147 2652 : atoms[1]=mypdb.getNamedAtomFromResidue("CA",residuenum);
148 2652 : atoms[2]=mypdb.getNamedAtomFromResidue("CB",residuenum);
149 2652 : atoms[3]=mypdb.getNamedAtomFromResidue("C",residuenum);
150 2652 : atoms[4]=mypdb.getNamedAtomFromResidue("O",residuenum);
151 : }
152 0 : } else if( type=="dna" || type=="rna" ) {
153 0 : atoms.resize(6);
154 0 : atoms[0]=mypdb.getNamedAtomFromResidue("P",residuenum);
155 0 : atoms[1]=mypdb.getNamedAtomFromResidue("O5\'",residuenum);
156 0 : atoms[2]=mypdb.getNamedAtomFromResidue("C5\'",residuenum);
157 0 : atoms[3]=mypdb.getNamedAtomFromResidue("C4\'",residuenum);
158 0 : atoms[4]=mypdb.getNamedAtomFromResidue("C3\'",residuenum);
159 0 : atoms[5]=mypdb.getNamedAtomFromResidue("O3\'",residuenum);
160 : }
161 : else {
162 0 : plumed_merror(type + " is not a valid molecule type");
163 2652 : }
164 2652 : }
165 :
166 3333 : bool MolDataClass::isTerminalGroup( const std::string& type, const std::string& residuename ) {
167 3333 : if( type=="protein" ) {
168 3333 : if( residuename=="ACE" ) return true;
169 3006 : else if( residuename=="NME" ) return true;
170 2679 : else return false;
171 : } else {
172 0 : plumed_merror(type + " is not a valid molecule type");
173 : }
174 : return false;
175 : }
176 :
177 364 : void MolDataClass::specialSymbol( const std::string& type, const std::string& symbol, const PDB& mypdb, std::vector<AtomNumber>& numbers ) {
178 364 : if(type=="protein" || type=="rna" || type=="dna") {
179 : // symbol should be something like
180 : // phi-123 i.e. phi torsion of residue 123 of first chain
181 : // psi-A321 i.e. psi torsion of residue 321 of chain A
182 364 : numbers.resize(0);
183 364 : std::size_t dash=symbol.find_first_of('-');
184 364 : std::size_t firstnum=symbol.find_first_of("0123456789",dash+1);
185 364 : std::string name=symbol.substr(0,dash);
186 : unsigned resnum;
187 728 : std::string resname;
188 728 : std::string chainid;
189 364 : if(firstnum==dash+1) {
190 350 : Tools::convert( symbol.substr(dash+1), resnum );
191 350 : resname= mypdb.getResidueName(resnum);
192 350 : chainid="*"; // this is going to match the first chain
193 : } else {
194 : // if chain id is provided:
195 14 : Tools::convert( symbol.substr(firstnum), resnum );
196 14 : chainid=symbol.substr(dash+1,firstnum-(dash+1)); // this is going to match the proper chain
197 : }
198 364 : resname= mypdb.getResidueName(resnum,chainid);
199 364 : Tools::stripLeadingAndTrailingBlanks(resname);
200 364 : if(allowedResidue("protein",resname)) {
201 27 : if( name=="phi" && !isTerminalGroup("protein",resname) ) {
202 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C",resnum-1,chainid));
203 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N",resnum,chainid));
204 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("CA",resnum,chainid));
205 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C",resnum,chainid));
206 25 : } else if( name=="psi" && !isTerminalGroup("protein",resname) ) {
207 25 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N",resnum,chainid));
208 25 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("CA",resnum,chainid));
209 25 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C",resnum,chainid));
210 25 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N",resnum+1,chainid));
211 0 : } else if( name=="omega" && !isTerminalGroup("protein",resname) ) {
212 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("CA",resnum,chainid));
213 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C",resnum,chainid));
214 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N",resnum+1,chainid));
215 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("CA",resnum+1,chainid));
216 0 : } else if( name=="chi1" && !isTerminalGroup("protein",resname) ) {
217 0 : if ( resname=="GLY" || resname=="ALA" ) plumed_merror("chi-1 is not defined for Alanine and Glycine");
218 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N",resnum,chainid));
219 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("CA",resnum,chainid));
220 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("CB",resnum,chainid));
221 0 : if(resname=="ILE"||resname=="VAL")
222 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("CG1",resnum,chainid));
223 0 : else if(resname=="CYS")
224 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("SG",resnum,chainid));
225 0 : else if(resname=="THR")
226 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("OG1",resnum,chainid));
227 0 : else if(resname=="SER")
228 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("OG",resnum,chainid));
229 : else
230 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("CG",resnum,chainid));
231 0 : } else numbers.push_back(mypdb.getNamedAtomFromResidueAndChain(name,resnum,chainid));
232 337 : } else if( allowedResidue("rna",resname) || allowedResidue("dna",resname)) {
233 337 : std::string basetype;
234 337 : if(resname.find_first_of("A")!=std::string::npos) basetype+="A";
235 337 : if(resname.find_first_of("U")!=std::string::npos) basetype+="U";
236 337 : if(resname.find_first_of("T")!=std::string::npos) basetype+="T";
237 337 : if(resname.find_first_of("C")!=std::string::npos) basetype+="C";
238 337 : if(resname.find_first_of("G")!=std::string::npos) basetype+="G";
239 337 : plumed_massert(basetype.length()==1,"cannot find type of rna/dna residue "+resname+" "+basetype);
240 337 : if( name=="chi" ) {
241 5 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O4\'",resnum,chainid));
242 5 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C1\'",resnum,chainid));
243 5 : if(basetype=="T" || basetype=="U" || basetype=="C") {
244 3 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N1",resnum,chainid));
245 3 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C2",resnum,chainid));
246 2 : } else if(basetype=="G" || basetype=="A") {
247 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N9",resnum,chainid));
248 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4",resnum,chainid));
249 0 : } else plumed_error();
250 332 : } else if( name=="alpha" ) {
251 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O3\'",resnum-1,chainid));
252 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("P",resnum,chainid));
253 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O5\'",resnum,chainid));
254 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C5\'",resnum,chainid));
255 330 : } else if( name=="beta" ) {
256 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("P",resnum,chainid));
257 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O5\'",resnum,chainid));
258 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C5\'",resnum,chainid));
259 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4\'",resnum,chainid));
260 328 : } else if( name=="gamma" ) {
261 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O5\'",resnum,chainid));
262 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C5\'",resnum,chainid));
263 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4\'",resnum,chainid));
264 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C3\'",resnum,chainid));
265 326 : } else if( name=="delta" ) {
266 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C5\'",resnum,chainid));
267 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4\'",resnum,chainid));
268 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C3\'",resnum,chainid));
269 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O3\'",resnum,chainid));
270 325 : } else if( name=="epsilon" ) {
271 3 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4\'",resnum,chainid));
272 3 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C3\'",resnum,chainid));
273 3 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O3\'",resnum,chainid));
274 3 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("P",resnum+1,chainid));
275 322 : } else if( name=="zeta" ) {
276 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C3\'",resnum,chainid));
277 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O3\'",resnum,chainid));
278 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("P",resnum+1,chainid));
279 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O5\'",resnum+1,chainid));
280 320 : } else if( name=="v0" ) {
281 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4\'",resnum,chainid));
282 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O4\'",resnum,chainid));
283 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C1\'",resnum,chainid));
284 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C2\'",resnum,chainid));
285 318 : } else if( name=="v1" ) {
286 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O4\'",resnum,chainid));
287 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C1\'",resnum,chainid));
288 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C2\'",resnum,chainid));
289 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C3\'",resnum,chainid));
290 316 : } else if( name=="v2" ) {
291 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C1\'",resnum,chainid));
292 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C2\'",resnum,chainid));
293 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C3\'",resnum,chainid));
294 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4\'",resnum,chainid));
295 314 : } else if( name=="v3" ) {
296 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C2\'",resnum,chainid));
297 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C3\'",resnum,chainid));
298 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4\'",resnum,chainid));
299 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O4\'",resnum,chainid));
300 312 : } else if( name=="v4" ) {
301 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C3\'",resnum,chainid));
302 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4\'",resnum,chainid));
303 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O4\'",resnum,chainid));
304 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C1\'",resnum,chainid));
305 310 : } else if( name=="back" ) {
306 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("P",resnum,chainid));
307 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O5\'",resnum,chainid));
308 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C5\'",resnum,chainid));
309 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4\'",resnum,chainid));
310 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C3\'",resnum,chainid));
311 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O3\'",resnum,chainid));
312 309 : } else if( name=="sugar" ) {
313 14 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4\'",resnum,chainid));
314 14 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O4\'",resnum,chainid));
315 14 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C1\'",resnum,chainid));
316 14 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C2\'",resnum,chainid));
317 14 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C3\'",resnum,chainid));
318 295 : } else if( name=="base" ) {
319 5 : if(basetype=="C") {
320 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N1",resnum,chainid));
321 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C2",resnum,chainid));
322 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O2",resnum,chainid));
323 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N3",resnum,chainid));
324 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4",resnum,chainid));
325 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N4",resnum,chainid));
326 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C5",resnum,chainid));
327 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C6",resnum,chainid));
328 4 : } else if(basetype=="U") {
329 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N1",resnum,chainid));
330 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C2",resnum,chainid));
331 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O2",resnum,chainid));
332 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N3",resnum,chainid));
333 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4",resnum,chainid));
334 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O4",resnum,chainid));
335 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C5",resnum,chainid));
336 2 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C6",resnum,chainid));
337 2 : } else if(basetype=="T") {
338 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N1",resnum,chainid));
339 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C2",resnum,chainid));
340 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O2",resnum,chainid));
341 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N3",resnum,chainid));
342 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4",resnum,chainid));
343 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O4",resnum,chainid));
344 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C5",resnum,chainid));
345 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C7",resnum,chainid));
346 0 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C6",resnum,chainid));
347 2 : } else if(basetype=="G") {
348 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N9",resnum,chainid));
349 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4",resnum,chainid));
350 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N3",resnum,chainid));
351 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C2",resnum,chainid));
352 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N2",resnum,chainid));
353 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N1",resnum,chainid));
354 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C6",resnum,chainid));
355 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("O6",resnum,chainid));
356 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C5",resnum,chainid));
357 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N7",resnum,chainid));
358 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C8",resnum,chainid));
359 1 : } else if(basetype=="A") {
360 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N9",resnum,chainid));
361 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4",resnum,chainid));
362 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N1",resnum,chainid));
363 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C2",resnum,chainid));
364 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N3",resnum,chainid));
365 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C6",resnum,chainid));
366 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N6",resnum,chainid));
367 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C5",resnum,chainid));
368 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("N7",resnum,chainid));
369 1 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C8",resnum,chainid));
370 0 : } else plumed_error();
371 290 : } else if( name=="lcs" ) {
372 284 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C2",resnum,chainid));
373 284 : if(basetype=="T" || basetype=="U" || basetype=="C") {
374 148 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4",resnum,chainid));
375 148 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C6",resnum,chainid));
376 136 : } else if(basetype=="G" || basetype=="A") {
377 136 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C6",resnum,chainid));
378 136 : numbers.push_back(mypdb.getNamedAtomFromResidueAndChain("C4",resnum,chainid));
379 0 : } else plumed_error();
380 6 : } else numbers.push_back(mypdb.getNamedAtomFromResidueAndChain(name,resnum,chainid));
381 364 : }
382 : }
383 : else {
384 0 : plumed_merror(type + " is not a valid molecule type");
385 : }
386 364 : }
387 :
388 2523 : }
|