LCOV - code coverage report
Current view: top level - tools - MolDataClass.cpp (source / functions) Hit Total Coverage
Test: plumed test coverage Lines: 254 331 76.7 %
Date: 2018-12-19 07:49:13 Functions: 7 7 100.0 %

          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 : }

Generated by: LCOV version 1.13