Protein.h

Go to the documentation of this file.
00001 #ifndef SimTK_MOLMODEL_PROTEIN_H_
00002 #define SimTK_MOLMODEL_PROTEIN_H_
00003 
00004 /* -------------------------------------------------------------------------- *
00005  *                      SimTK Core: SimTK Molmodel                            *
00006  * -------------------------------------------------------------------------- *
00007  * This is part of the SimTK Core biosimulation toolkit originating from      *
00008  * Simbios, the NIH National Center for Physics-Based Simulation of           *
00009  * Biological Structures at Stanford, funded under the NIH Roadmap for        *
00010  * Medical Research, grant U54 GM072970. See https://simtk.org.               *
00011  *                                                                            *
00012  * Portions copyright (c) 2007 Stanford University and the Authors.           *
00013  * Authors: Michael Sherman, Christopher Bruns                                *
00014  * Contributors:                                                              *
00015  *                                                                            *
00016  * Permission is hereby granted, free of charge, to any person obtaining a    *
00017  * copy of this software and associated documentation files (the "Software"), *
00018  * to deal in the Software without restriction, including without limitation  *
00019  * the rights to use, copy, modify, merge, publish, distribute, sublicense,   *
00020  * and/or sell copies of the Software, and to permit persons to whom the      *
00021  * Software is furnished to do so, subject to the following conditions:       *
00022  *                                                                            *
00023  * The above copyright notice and this permission notice shall be included in *
00024  * all copies or substantial portions of the Software.                        *
00025  *                                                                            *
00026  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
00027  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   *
00028  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL    *
00029  * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,    *
00030  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR      *
00031  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE  *
00032  * USE OR OTHER DEALINGS IN THE SOFTWARE.                                     *
00033  * -------------------------------------------------------------------------- */
00034 
00035 
00036 #include "molmodel/internal/common.h"
00037 #include "molmodel/internal/Compound.h"
00038 #include "molmodel/internal/CompoundSystem.h"
00039 
00040 namespace SimTK {
00041 
00043 class AcetylResidue : public BiopolymerResidue {
00044 public:
00045     AcetylResidue() : BiopolymerResidue("acetyl", "ACE", 'X')
00046     {
00047         setBaseCompound("methyl", MethylGroup());
00048         nameAtom("CH3", "methyl/C");
00049         nameAtom("1H", "methyl/H1");
00050         nameAtom("2H", "methyl/H2");
00051         nameAtom("3H", "methyl/H3");
00052 
00053         convertInboardBondCenterToOutboard();
00054         bondAtom(TrivalentAtom("C", Element::Carbon()), "methyl/bond", 0.15520);
00055         bondAtom(UnivalentAtom("O", Element::Oxygen()), "C/bond2", 0.12290);
00056         nameBondCenter("bondC", "C/bond3");
00057         nameBondCenter("bondNext", "bondC");
00058         
00059         setAtomBiotype("CH3", "Acetyl", "CH3", SimTK::Ordinality::Initial);
00060         setAtomBiotype("1H",  "Acetyl", "H", SimTK::Ordinality::Initial);
00061         setAtomBiotype("2H",  "Acetyl", "H", SimTK::Ordinality::Initial);
00062         setAtomBiotype("3H",  "Acetyl", "H", SimTK::Ordinality::Initial);
00063         setAtomBiotype("C",   "Acetyl", "C", SimTK::Ordinality::Initial);
00064         setAtomBiotype("O",   "Acetyl", "O", SimTK::Ordinality::Initial);    
00065     }
00066 };
00067 
00068 
00070 class NMethylAmideResidue : public BiopolymerResidue {
00071 public:
00072     NMethylAmideResidue() : BiopolymerResidue("N-methyl amide", "NAC", 'X')
00073     {
00074         // TODO - set nitrogen bond angles
00075         setBaseAtom(TrivalentAtom("N", Element::Nitrogen()));
00076         bondAtom(UnivalentAtom("HN", Element::Hydrogen()), "N/bond3", 0.1010);
00077         bondAtom(AliphaticCarbon("CH3"), "N/bond2", 0.1449);
00078         bondAtom(AliphaticHydrogen("1H"), "CH3/bond2");
00079         bondAtom(AliphaticHydrogen("2H"), "CH3/bond3");
00080         bondAtom(AliphaticHydrogen("3H"), "CH3/bond4");
00081 
00082         nameBondCenter("bondN", "N/bond1");
00083         nameBondCenter("bondPrevious", "bondN");
00084 
00085         // Define default bonding geometry to previous residue
00086         setDefaultInboardBondLength(0.1335);
00087 
00088         // Help with automated biotype resolution
00089         addCompoundSynonym("N-MeAmide");
00090 
00091         // zero and 180 degrees are poor choices for phi angle because each eclipses either N-H or N-C
00092         defineDihedralAngle("phi", "bondPrevious", "CH3/bond2", 30*Deg2Rad);
00093         
00094         setAtomBiotype("N",   "N-MeAmide", "N",   SimTK::Ordinality::Final);
00095         setAtomBiotype("HN",  "N-MeAmide", "HN",  SimTK::Ordinality::Final);
00096         setAtomBiotype("CH3", "N-MeAmide", "CH3", SimTK::Ordinality::Final);
00097         setAtomBiotype("1H",  "N-MeAmide", "H",   SimTK::Ordinality::Final);
00098         setAtomBiotype("2H",  "N-MeAmide", "H",   SimTK::Ordinality::Final);
00099         setAtomBiotype("3H",  "N-MeAmide", "H",   SimTK::Ordinality::Final);    
00100     }
00101 };
00102 
00103 static const Angle DefaultAlphaPhiAngle = -57 * Deg2Rad;
00104 static const Angle DefaultAlphaPsiAngle = -47 * Deg2Rad;
00105 static const Angle DefaultParallelBetaPhiAngle = -119 * Deg2Rad;
00106 static const Angle DefaultParallelBetaPsiAngle =  113 * Deg2Rad;
00107 static const Angle DefaultAntiparallelBetaPhiAngle = -139 * Deg2Rad;
00108 static const Angle DefaultAntiparallelBetaPsiAngle =  135 * Deg2Rad;
00109 
00129 class SimTK_MOLMODEL_EXPORT AminoAcidResidue : public BiopolymerResidue {
00130 public:
00131 
00133     static AminoAcidResidue create(
00134         char oneLetterCode 
00135         );
00136 
00137 
00139     static AminoAcidResidue create(
00140         const PdbResidue& 
00141         );
00142         
00143     AminoAcidResidue(
00144         String name, 
00145         String threeLetterCode = "Unk", 
00146         char oneLetterCode = '?' 
00147         )
00148         : BiopolymerResidue(name, threeLetterCode, oneLetterCode)
00149     {
00150         static const mdunits::Length CA_Hdistance = 0.1090;
00151         static const mdunits::Length N_CAdistance = 0.1449;
00152         static const mdunits::Length CA_Cdistance = 0.1522;
00153         static const mdunits::Length  C_Odistance = 0.1229;
00154         static const mdunits::Length  C_Ndistance = 0.1335; // peptide bond
00155 
00156         // Amino nitrogen
00157         // We want the inboard bond center to be on the main chain nitrogen peptide bond
00158         // But we also want the CA and main chain H to be the reference for dihedrals.
00159         // To reconcile these two requirements, a bit of extra work is required.
00160         TrivalentAtom nAtom("N", Element::Nitrogen());
00161         // nAtom.convertInboardBondCenterToOutboard(); // free bond1 for use with HN
00162         // nAtom.setInboardBondCenter("bond3");  // lowest priority bond becomes inboard
00163 
00164         setBaseAtom(nAtom);
00165 
00166         // Alpha carbon
00167         bondAtom(QuadrivalentAtom("CA", Element::Carbon()), "N/bond2", N_CAdistance, DefaultAntiparallelBetaPhiAngle + 180*Deg2Rad); // phi
00168         bondAtom(UnivalentAtom("HA", Element::Hydrogen()), "CA/bond3", CA_Hdistance);
00169         nameBondCenter("bondCA", "CA/bond4");
00170 
00171         // Carbonyl
00172         bondAtom(TrivalentAtom("C", Element::Carbon()), "CA/bond2", CA_Cdistance, DefaultAntiparallelBetaPsiAngle + 180*Deg2Rad); // psi
00173         bondAtom(UnivalentAtom("O", Element::Oxygen()), "C/bond2", C_Odistance);
00174         nameBondCenter("bondC", "C/bond3");
00175         nameBondCenter("bondNext", "bondC");
00176 
00177         nameBondCenter("bondN", "N/bond1");
00178         nameBondCenter("bondPrevious", "bondN");
00179 
00180         // Define default bonding geometry to previous residue
00181         setDefaultInboardBondLength(C_Ndistance);
00182 
00183         defineDihedralAngle("psi", "N", "CA", "C", "O", 180*Deg2Rad);
00184         setDefaultPsiAngle(DefaultAntiparallelBetaPsiAngle);
00185 
00186         defineDihedralAngle("phi", "N/bond3", "CA/bond2", 180*Deg2Rad);
00187         setDefaultPhiAngle(DefaultAntiparallelBetaPhiAngle);
00188     }
00189 
00190 
00196     AminoAcidResidue& setDefaultPhiAngle(Angle phi) {
00197         setDefaultDihedralAngle("phi", phi);
00198 
00199         return *this;
00200     }
00201 
00202     AminoAcidResidue& setDefaultPsiAngle(Angle psi) {
00203         setDefaultDihedralAngle("psi", psi);
00204 
00205         return *this;
00206     }
00207 
00208     class Alanine;
00209     class Cysteine;
00210     class Aspartate;
00211     class Glutamate;
00212     class Phenylalanine;
00213     class Glycine;
00214     class Histidine;
00215     class Isoleucine;
00216     class Lysine;
00217     class Leucine;
00218     class Methionine;
00219     class Asparagine;
00220     class Proline;
00221     class Glutamine;
00222     class Arginine;
00223     class Serine;
00224     class Threonine;
00225     class Valine;
00226     class Tryptophan;
00227     class Tyrosine;
00228 };
00229 
00230 
00235 class  HNAminoAcidResidue : public AminoAcidResidue {
00236 public:
00237     HNAminoAcidResidue(String name, String threeLetterCode = "Unk", char oneLetterCode = '?')
00238         : AminoAcidResidue(name, threeLetterCode, oneLetterCode)
00239     {
00240         static const mdunits::Length  H_Ndistance = 0.1010;
00241 
00242         bondAtom(UnivalentAtom("H", Element::Hydrogen()), "N/bond3", H_Ndistance);
00243         nameAtom("HN", "H"); // synonym
00244 
00245         // defineDihedralAngle("phi", "H", "N", "CA", "C", 180*Deg2Rad); // already defined
00246     }
00247 };
00248 
00249 
00250 // BetaunbranchedAminoAcidResidue is base class for AminoAcidResidues
00251 // posessing side chains that do not branch at the beta carbon
00252 class  BetaUnbranchedAminoAcidResidue : public HNAminoAcidResidue {
00253 public:
00254     BetaUnbranchedAminoAcidResidue(String name, String tlc, char olc)
00255         : HNAminoAcidResidue(name, tlc, olc) 
00256     {
00257         bondCompound("beta methylene", MethyleneGroup(), "bondCA");
00258         nameAtom("CB", "beta methylene/C");
00259         nameAtom("1HB", "beta methylene/H1");
00260         nameAtom("2HB", "beta methylene/H2");
00261         nameBondCenter("bondCB", "beta methylene/bond2");
00262 
00263         defineDihedralAngle("chi1", "CA/bond1", "beta methylene/bond2");
00264         setDefaultDihedralAngle("chi1", -60*Deg2Rad); // best for most amino acids
00265     }
00266 };
00267 
00268 
00269 // BetaunbranchedAminoAcidResidue is base class for AminoAcidResidues
00270 // posessing side chains that do not branch at the beta carbon
00271 class  BetaBranchedAminoAcidResidue : public HNAminoAcidResidue {
00272 public:
00273     BetaBranchedAminoAcidResidue(String name, String tlc, char olc)
00274         : HNAminoAcidResidue(name, tlc, olc) 
00275     {
00276         bondAtom(AliphaticCarbon("CB"), "bondCA");
00277 
00278         // To get correct chirality *and* priority in isoleucine and threonine,
00279         // place hydrogen on bond3
00280 
00281         bondAtom(AliphaticHydrogen("HB"), "CB/bond3");
00282         nameBondCenter("bondCB1", "CB/bond2");
00283         nameBondCenter("bondCB2", "CB/bond4");
00284 
00285         defineDihedralAngle("chi1", "CA/bond1", "CB/bond2");
00286         setDefaultDihedralAngle("chi1", -60*Deg2Rad); // best for most amino acids
00287     }
00288 };
00289 
00290 
00291 class  AminoAcidResidue::Alanine : public BetaUnbranchedAminoAcidResidue {
00292 public:
00293     Alanine() 
00294         : BetaUnbranchedAminoAcidResidue("alanine", "Ala", 'A')
00295     {
00296         bondAtom(AliphaticHydrogen("3HB"), "bondCB");
00297         
00298         setAtomBiotype("N",   "Alanine", "N");
00299         setAtomBiotype("H",   "Alanine", "HN");
00300         setAtomBiotype("CA",  "Alanine", "CA");
00301         setAtomBiotype("C",   "Alanine", "C");
00302         setAtomBiotype("O",   "Alanine", "O");
00303         setAtomBiotype("HA",  "Alanine", "HA");
00304         setAtomBiotype("CB",  "Alanine", "CB");
00305         setAtomBiotype("1HB", "Alanine", "HB");    
00306         setAtomBiotype("2HB", "Alanine", "HB");    
00307         setAtomBiotype("3HB", "Alanine", "HB");    
00308     }
00309 };
00310 
00311 
00312 class  AminoAcidResidue::Cysteine : public BetaUnbranchedAminoAcidResidue {
00313 public:
00314     Cysteine() 
00315         : BetaUnbranchedAminoAcidResidue("cysteine", "Cys", 'C')
00316     {
00317         // From amber99 parameters in Tinker param file amber99.dat
00318         static const mdunits::Length H_Sdistance = 0.1336;
00319         static const mdunits::Length S_Cdistance = 0.1810;
00320         static const Angle H_S_Cangle = 96.0*Deg2Rad;
00321         static const Angle S_C_Cangle = 108.6*Deg2Rad;
00322 
00323         bondAtom(BivalentAtom("SG", Element::Sulfur(), H_S_Cangle), "bondCB", S_Cdistance, 180*Deg2Rad);
00324         bondAtom(UnivalentAtom("HG", Element::Hydrogen()), "SG/bond2", H_Sdistance, 180*Deg2Rad);
00325 
00326         defineDihedralAngle("chi2", "HG", "SG", "CB", "CA");
00327 
00328         setDefaultBondAngle(108.60*Deg2Rad, "SG", "CB", "CA");
00329 
00330         // Synonym hints to help resolve biotypes from tinker files
00331         // eventually, these biotypes will be pre-defined and hard coded
00332         addCompoundSynonym("CYS (-SH)");
00333         addCompoundSynonym("cysteine (-SH)");
00334     }
00335 };
00336 
00337 class  AminoAcidResidue::Aspartate : public BetaUnbranchedAminoAcidResidue {
00338 public:
00339     Aspartate() 
00340         : BetaUnbranchedAminoAcidResidue("aspartate", "Asp", 'D')
00341     {
00342         bondCompound("sidechain carboxylate", CarboxylateGroup(), "bondCB");
00343         nameAtom("CG", "sidechain carboxylate/C");
00344         nameAtom("OD1", "sidechain carboxylate/O1");
00345         nameAtom("OD2", "sidechain carboxylate/O2");
00346 
00347         defineDihedralAngle("chi2", "OD1", "CG", "CB", "CA");
00348 
00349         // From Roland Dunbrack's side chain rotamer statistics
00350         // http://dunbrack.fccc.edu/bbdep/confanalysis.php
00351         setDefaultDihedralAngle("chi2", -15*Deg2Rad);
00352 
00353         // Synonym hints to help resolve biotypes from tinker files
00354         // eventually, these biotypes will be pre-defined and hard coded
00355         addCompoundSynonym("aspartic acid");
00356     }
00357 };
00358 
00359 class  AminoAcidResidue::Glutamate : public BetaUnbranchedAminoAcidResidue {
00360 public:
00361     Glutamate() 
00362         : BetaUnbranchedAminoAcidResidue("glutamate", "Glu", 'E')
00363     {
00364         bondAtom(AliphaticCarbon("CG"), "bondCB");
00365         bondAtom(AliphaticHydrogen("1HG"), "CG/bond3");
00366         bondAtom(AliphaticHydrogen("2HG"), "CG/bond4");
00367 
00368         bondCompound("sidechain carboxylate", CarboxylateGroup(), "CG/bond2");
00369         nameAtom("CD", "sidechain carboxylate/C");
00370         nameAtom("OE1", "sidechain carboxylate/O1");
00371         nameAtom("OE2", "sidechain carboxylate/O2");
00372 
00373         defineDihedralAngle("chi2", "CD", "CG", "CB", "CA");
00374         defineDihedralAngle("chi3", "OE1", "CD", "CG", "CB");
00375 
00376         setDefaultDihedralAngle("chi3", -15*Deg2Rad);
00377 
00378         // Synonym hints to help resolve biotypes from tinker files
00379         // eventually, these biotypes will be pre-defined and hard coded
00380         addCompoundSynonym("glutamic acid");
00381     }
00382 };
00383 
00384 
00385 class  AminoAcidResidue::Phenylalanine : public BetaUnbranchedAminoAcidResidue {
00386 public:
00387     Phenylalanine()
00388         : BetaUnbranchedAminoAcidResidue("phenylalanine", "Phe", 'F')
00389     {
00390         static const mdunits::Length CB_CGdistance = 0.1510;
00391         static const mdunits::Length C_Hdistance = 0.1080; // from tinker amber99.dat
00392         static const mdunits::Length C_Cdistance = 0.1400; // from tinker amber99.dat
00393 
00394         // default angle for TrivalentAtom is 120 degrees, which is what we want
00395         // for a six-membered ring
00396         bondAtom( TrivalentAtom("CG", Element::Carbon()), "bondCB", CB_CGdistance, 180*Deg2Rad);
00397 
00398         bondAtom( TrivalentAtom("CD1", Element::Carbon()), "CG/bond2", C_Cdistance, 180*Deg2Rad );
00399         bondAtom( UnivalentAtom("HD1", Element::Hydrogen()), "CD1/bond3", C_Hdistance );
00400 
00401         // Start using hidedral of zero, to loop ring back to beginning
00402         bondAtom( TrivalentAtom("CE1", Element::Carbon()), "CD1/bond2", C_Cdistance, 0*Deg2Rad );
00403         bondAtom( UnivalentAtom("HE1", Element::Hydrogen()), "CE1/bond3", C_Hdistance );
00404 
00405         bondAtom( TrivalentAtom("CZ", Element::Carbon()), "CE1/bond2", C_Cdistance, 0*Deg2Rad );
00406         bondAtom( UnivalentAtom("HZ", Element::Hydrogen()), "CZ/bond3", C_Hdistance );
00407 
00408         bondAtom( TrivalentAtom("CE2", Element::Carbon()), "CZ/bond2", C_Cdistance, 0*Deg2Rad );
00409         bondAtom( UnivalentAtom("HE2", Element::Hydrogen()), "CE2/bond3", C_Hdistance );
00410 
00411         bondAtom( TrivalentAtom("CD2", Element::Carbon()), "CE2/bond2", C_Cdistance, 0*Deg2Rad );
00412         bondAtom( UnivalentAtom("HD2", Element::Hydrogen()), "CD2/bond3", C_Hdistance );
00413 
00414         addRingClosingBond("CD2/bond2", "CG/bond3", C_Cdistance, 0*Deg2Rad);
00415 
00416         defineDihedralAngle("chi2", "CD1", "CG", "CB", "CA");
00417 
00418         setDefaultDihedralAngle("chi2", 90*Deg2Rad); // from Dunbrack site
00419 
00420         setBondMobility(BondMobility::Rigid, "CG", "CD1");
00421         setBondMobility(BondMobility::Rigid, "CD1", "CE1");
00422         setBondMobility(BondMobility::Rigid, "CE1", "CZ");
00423         setBondMobility(BondMobility::Rigid, "CZ", "CE2");
00424         setBondMobility(BondMobility::Rigid, "CE2", "CD2");
00425         setBondMobility(BondMobility::Rigid, "CD2", "CG");
00426     }
00427 };
00428 
00429 
00430 class  AminoAcidResidue::Glycine : public HNAminoAcidResidue {
00431 public:
00432     Glycine() 
00433         : HNAminoAcidResidue("glycine", "Gly", 'G')
00434     {
00435         bondAtom(AliphaticHydrogen("2HA"), "bondCA");
00436         nameAtom("1HA", "HA");  // glycine names alpha hydrogen differently than others
00437     }
00438 };
00439 
00440 
00441 class  AminoAcidResidue::Histidine : public BetaUnbranchedAminoAcidResidue {
00442 public:
00443     Histidine()
00444         : BetaUnbranchedAminoAcidResidue("histidine", "His", 'H')
00445     {
00446         // use average values for different protonation states
00447         static const mdunits::Length CB_CGdistance = 0.15040; // from tinker amber99.dat
00448         static const mdunits::Length CG_NDdistance = 0.13895; // average of protonation states 1385/1394
00449         static const mdunits::Length N_CEdistance = 0.13390; // average of protonation states 1343/1335
00450         static const mdunits::Length NE_CDdistance = 0.13875; // avg 1394/1381
00451         static const mdunits::Length CD_CGdistance = 0.1373; // avg 1371/1375
00452         static const mdunits::Length H_Cdistance = 0.1080;
00453         static const mdunits::Length H_Ndistance = 0.1010;
00454 
00455         // set angle to pentagonal angle 108, as amber parameters set 120 degrees as
00456         // "optimal" and let the forces fight it out.  Such a strategy will not
00457         // do for simple coordinate generation and for rigid body models.
00458         static const Angle ringAngle = 108.000 * Deg2Rad; // 108 degrees is exact
00459         static const Angle outerRingAngle = 180*Deg2Rad - 0.5*ringAngle;
00460 
00461         bondAtom( TrivalentAtom("CG", Element::Carbon(), outerRingAngle, outerRingAngle), "bondCB", CB_CGdistance);
00462 
00463         bondAtom( TrivalentAtom("ND1", Element::Nitrogen(), ringAngle, outerRingAngle), "CG/bond2", CG_NDdistance, 180*Deg2Rad);
00464         // optional proton depends upon protonation state
00465         bondAtom( UnivalentAtom("HD1", Element::Hydrogen()), "ND1/bond3", H_Ndistance);
00466 
00467         bondAtom( TrivalentAtom("CE1", Element::Carbon(), ringAngle, outerRingAngle), "ND1/bond2", N_CEdistance, 0*Deg2Rad);
00468         bondAtom( UnivalentAtom("HE1", Element::Hydrogen()), "CE1/bond3", H_Cdistance);
00469 
00470         bondAtom( TrivalentAtom("NE2", Element::Nitrogen(), ringAngle, outerRingAngle), "CE1/bond2", CG_NDdistance, 0*Deg2Rad);
00471         // optional proton depends upon protonation state
00472         bondAtom( UnivalentAtom("HE2", Element::Hydrogen()), "NE2/bond3", H_Ndistance);
00473 
00474         bondAtom( TrivalentAtom("CD2", Element::Carbon(), ringAngle, outerRingAngle), "NE2/bond2", N_CEdistance, 0*Deg2Rad);
00475         bondAtom( UnivalentAtom("HD2", Element::Hydrogen()), "CD2/bond3", H_Cdistance);
00476 
00477         addRingClosingBond("CD2/bond2", "CG/bond3", CD_CGdistance, 0*Deg2Rad);
00478 
00479         defineDihedralAngle("chi2", "ND1", "CG", "CB", "CA");
00480 
00481         setDefaultDihedralAngle("chi2", 90*Deg2Rad); // from Dunbrack site
00482 
00483         // Biotypes for histidine are tricky
00484         // Since both acidic protons are added above, this residue defaults to positive charge
00485         // There is more work to do to handle HIS protonation properly TODO
00486 
00487         // Synonym hints to help resolve biotypes from tinker files
00488         // eventually, these biotypes will be pre-defined and hard coded
00489         addCompoundSynonym("histidine (+)");
00490 
00491         // Make ring rigid for internal coordinate simulation
00492         setBondMobility(BondMobility::Rigid, "CG", "ND1");
00493         setBondMobility(BondMobility::Rigid, "ND1", "CE1");
00494         setBondMobility(BondMobility::Rigid, "CE1", "NE2");
00495         setBondMobility(BondMobility::Rigid, "NE2", "CD2");
00496         setBondMobility(BondMobility::Rigid, "CD2", "CG");
00497     }
00498 };
00499 
00500 
00501 // Unlike the case with Threonine, the chirality of Isoleucine comes out
00502 // correctly when built up from BetaBranchedAminoAcidResidue
00503 class  AminoAcidResidue::Isoleucine : public BetaBranchedAminoAcidResidue {
00504 public:
00505     Isoleucine()
00506         : BetaBranchedAminoAcidResidue("isoleucine", "Ile", 'I')
00507     {
00508         bondCompound("gamma methylene", MethyleneGroup(), "bondCB1");
00509         nameAtom("CG1", "gamma methylene/C");
00510         nameAtom("1HG1", "gamma methylene/H1");
00511         nameAtom("2HG1", "gamma methylene/H2");
00512 
00513         bondCompound("delta methyl", MethylGroup(), "gamma methylene/bond2");
00514         nameAtom("CD", "delta methyl/C");
00515         nameAtom("1HD", "delta methyl/H1");
00516         nameAtom("2HD", "delta methyl/H2");
00517         nameAtom("3HD", "delta methyl/H3");
00518 
00519         bondCompound("gamma methyl", MethylGroup(), "bondCB2");
00520         nameAtom("CG2", "gamma methyl/C");
00521         nameAtom("1HG2", "gamma methyl/H1");
00522         nameAtom("2HG2", "gamma methyl/H2");
00523         nameAtom("3HG2", "gamma methyl/H3");
00524 
00525         defineDihedralAngle("chi2", "CD", "CG1", "CB", "CA");
00526 
00527         setDefaultDihedralAngle("chi1", -70*Deg2Rad);
00528         setDefaultDihedralAngle("chi2", 170*Deg2Rad);
00529     }
00530 };
00531 
00532 
00533 class  AminoAcidResidue::Lysine : public BetaUnbranchedAminoAcidResidue {
00534 public:
00535     Lysine()
00536         : BetaUnbranchedAminoAcidResidue("lysine", "Lys", 'K') 
00537     {
00538         bondAtom(AliphaticCarbon("CG"), "bondCB");
00539         bondAtom(AliphaticHydrogen("1HG"), "CG/bond3");
00540         bondAtom(AliphaticHydrogen("2HG"), "CG/bond4");
00541 
00542         bondAtom(AliphaticCarbon("CD"), "CG/bond2");
00543         bondAtom(AliphaticHydrogen("1HD"), "CD/bond3");
00544         bondAtom(AliphaticHydrogen("2HD"), "CD/bond4");
00545 
00546         bondAtom(AliphaticCarbon("CE"), "CD/bond2");
00547         bondAtom(AliphaticHydrogen("1HE"), "CE/bond3");
00548         bondAtom(AliphaticHydrogen("2HE"), "CE/bond4");
00549 
00550         bondCompound("zeta amine", PrimaryAmineGroup(), "CE/bond2");
00551         nameAtom("NZ", "zeta amine/N");
00552         nameAtom("1HZ", "zeta amine/H1");
00553         nameAtom("2HZ", "zeta amine/H2");
00554         nameAtom("3HZ", "zeta amine/H3");
00555 
00556         defineDihedralAngle("chi2", "CD", "CG", "CB", "CA");
00557         defineDihedralAngle("chi3", "CE", "CD", "CG", "CB");
00558         defineDihedralAngle("chi4", "NZ", "CE", "CD", "CG");
00559         defineDihedralAngle("chi5", "1HZ", "NZ", "CE", "CD");
00560     }
00561 };
00562 
00563     
00564 class  AminoAcidResidue::Leucine : public BetaUnbranchedAminoAcidResidue {
00565 public:
00566     Leucine()
00567         : BetaUnbranchedAminoAcidResidue("leucine", "Leu", 'L')
00568     {
00569         bondAtom(AliphaticCarbon("CG"), "bondCB");
00570         bondAtom(AliphaticHydrogen("HG"), "CG/bond4");
00571 
00572         // It actually takes more lines of code to add a MethylGroup and rename the 
00573         // atoms, than it does to add the atoms individually
00574 
00575         // First delta methyl group
00576         bondAtom(AliphaticCarbon("CD1"), "CG/bond2");
00577         bondAtom(AliphaticHydrogen("1HD1"), "CD1/bond2");
00578         bondAtom(AliphaticHydrogen("2HD1"), "CD1/bond3");
00579         bondAtom(AliphaticHydrogen("3HD1"), "CD1/bond4");
00580 
00581         // Second delta methyl group
00582         bondAtom(AliphaticCarbon("CD2"), "CG/bond3");
00583         bondAtom(AliphaticHydrogen("1HD2"), "CD2/bond2");
00584         bondAtom(AliphaticHydrogen("2HD2"), "CD2/bond3");
00585         bondAtom(AliphaticHydrogen("3HD2"), "CD2/bond4");
00586 
00587         defineDihedralAngle("chi2", "CD1", "CG", "CB", "CA");
00588 
00589         setDefaultDihedralAngle("chi1", -70*Deg2Rad);
00590         setDefaultDihedralAngle("chi2", 170*Deg2Rad);
00591     }
00592 };
00593 
00594 
00595 class  AminoAcidResidue::Methionine : public BetaUnbranchedAminoAcidResidue {
00596 public:
00597     Methionine()
00598         : BetaUnbranchedAminoAcidResidue("methionine", "Met", 'M') 
00599     {
00600         bondAtom(AliphaticCarbon("CG"), "bondCB");
00601         bondAtom(AliphaticHydrogen("1HG"), "CG/bond3");
00602         bondAtom(AliphaticHydrogen("2HG"), "CG/bond4");
00603 
00604         bondAtom( BivalentAtom("SD", Element::Sulfur(), 98.90*Deg2Rad), "CG/bond2", 0.1810, 180*Deg2Rad);
00605 
00606         bondAtom(AliphaticCarbon("CE"), "SD/bond2", 0.1810, 180*Deg2Rad);
00607         bondAtom(AliphaticHydrogen("1HE"), "CE/bond2");
00608         bondAtom(AliphaticHydrogen("2HE"), "CE/bond3");
00609         bondAtom(AliphaticHydrogen("3HE"), "CE/bond4");
00610 
00611         defineDihedralAngle("chi2", "SD", "CG", "CB", "CA");
00612         defineDihedralAngle("chi3", "CE", "SD", "CG", "CB");
00613         defineDihedralAngle("chi4", "1HE", "CE", "SD", "CG");
00614     }
00615 };
00616 
00617     
00618 class  AminoAcidResidue::Asparagine : public BetaUnbranchedAminoAcidResidue {
00619 public:
00620     Asparagine() 
00621         : BetaUnbranchedAminoAcidResidue("asparagine", "Asn", 'N')
00622     {
00623         bondAtom(TrivalentAtom("CG", Element::Carbon(), 120.4*Deg2Rad, 116.6*Deg2Rad), "bondCB", 0.15220);
00624 
00625         bondAtom(UnivalentAtom("OD1", Element::Oxygen()), "CG/bond2", 0.12290);
00626 
00627         bondAtom(TrivalentAtom("ND2", Element::Nitrogen()), "CG/bond3", 0.13350);
00628         bondAtom(UnivalentAtom("1HD2", Element::Hydrogen()), "ND2/bond2", 0.1010);
00629         bondAtom(UnivalentAtom("2HD2", Element::Hydrogen()), "ND2/bond3", 0.1010);
00630 
00631         defineDihedralAngle("chi2", "OD1", "CG", "CB", "CA");
00632 
00633         // From Roland Dunbrack's side chain rotamer statistics
00634         // http://dunbrack.fccc.edu/bbdep/confanalysis.php
00635         setDefaultDihedralAngle("chi2", -20*Deg2Rad);
00636 
00637         // For internal coordinate simulation, make amide group rigid
00638         setBondMobility(BondMobility::Rigid, "CG", "ND2");
00639     }
00640 };
00641 
00642 
00643 class  AminoAcidResidue::Proline : public AminoAcidResidue {
00644 public:
00645     Proline() 
00646         : AminoAcidResidue("proline", "Pro", 'P')
00647     {
00648         // TODO check chirality of all these hydrogen names (in all residues)
00649 
00650         // beta methylene
00651         bondAtom(AliphaticCarbon("CB"), "bondCA");
00652         bondAtom(AliphaticHydrogen("1HB"), "CB/bond3");
00653         bondAtom(AliphaticHydrogen("2HB"), "CB/bond4");
00654 
00655         // gamma methylene
00656         bondAtom(AliphaticCarbon("CG"), "CB/bond2");
00657         bondAtom(AliphaticHydrogen("1HG"), "CG/bond3");
00658         bondAtom(AliphaticHydrogen("2HG"), "CG/bond4");
00659 
00660         // delta methylene
00661         bondAtom(AliphaticCarbon("CD"), "CG/bond2");
00662         bondAtom(AliphaticHydrogen("1HD"), "CD/bond3");
00663         bondAtom(AliphaticHydrogen("2HD"), "CD/bond4");
00664 
00665         addRingClosingBond("CD/bond2", "N/bond3", 0.14490);
00666 
00667         // defineDihedralAngle("phi", "CD", "N", "CA", "C", 180*Deg2Rad);
00668 
00669         defineDihedralAngle("chi1", "CG", "CB", "CA", "N");
00670         defineDihedralAngle("chi2", "CD", "CG", "CB", "CA");
00671         defineDihedralAngle("chi3", "N", "CD", "CG", "CB");
00672         defineDihedralAngle("chi4", "CA", "N", "CD", "CG"); // ring closing bond...
00673 
00674         // Ring strain decreases bond angles in the side chain
00675         // 102.9 chosen to match bond distance N-CD in beta down configuration
00676         // cmbruns
00677         setDefaultBondAngle(102.9*Deg2Rad, "N", "CA", "CB");
00678         setDefaultBondAngle(102.9*Deg2Rad, "CA", "CB", "CG");
00679         setDefaultBondAngle(102.9*Deg2Rad, "CB", "CG", "CD");
00680         setDefaultBondAngle(102.9*Deg2Rad, "CG", "CD", "N");
00681 
00682         setDefaultDownPucker();
00683         setDefaultPhiAngle(-70*Deg2Rad);
00684 
00685         // Fix phi angle for internal coordinate simulation
00686         setBondMobility(BondMobility::Rigid, "N", "CA");
00687     }
00688 
00689     // Up and down configurations are about equally abundant,
00690     // except in cis-proline, where down is preferred.
00691     // 
00692     // Ho, B.K.; Coutsias, E.A.; Seok, C.; & Dill, K.A. (2005) 
00693     // "The flexibility in the proline ring couples to the protein
00694     // backbone"  Protein Science: 14:1011-1018
00695 
00696     Proline& setDefaultUpPucker() { // red
00697         // Angles are estimated from figures in Ho et al
00698         // TODO get more accurate angles
00699         setDefaultDihedralAngle("chi1", -25*Deg2Rad);
00700         setDefaultDihedralAngle("chi2", 42*Deg2Rad);
00701         setDefaultDihedralAngle("chi3", -38*Deg2Rad);
00702         setDefaultDihedralAngle("chi4", 20*Deg2Rad);
00703 
00704         return *this;
00705     }
00706 
00707     Proline& setDefaultDownPucker() { // yellow, CG-endo
00708         // Angles from gaussian03 6-31G** restricted Hartree-Fock
00709         // minimization in beta main chain configuration
00710         setDefaultDihedralAngle("chi1", 32.8*Deg2Rad);
00711         setDefaultDihedralAngle("chi2", -35.9*Deg2Rad);
00712         setDefaultDihedralAngle("chi3", 25.0*Deg2Rad);
00713         setDefaultDihedralAngle("chi4", -16.9*Deg2Rad);
00714 
00715         // Angles are estimated from figures in Ho et al
00716         //setDefaultDihedralAngle("chi1", 30*Deg2Rad);
00717         //setDefaultDihedralAngle("chi2", -42*Deg2Rad);
00718         //setDefaultDihedralAngle("chi3", 38*Deg2Rad);
00719         //setDefaultDihedralAngle("chi4", -20*Deg2Rad);
00720 
00721         return *this;
00722     }
00723 
00724 };
00725 
00726 
00727 class  AminoAcidResidue::Glutamine : public BetaUnbranchedAminoAcidResidue {
00728 public:
00729     Glutamine() 
00730         : BetaUnbranchedAminoAcidResidue("glutamine", "Gln", 'Q')
00731     {
00732         bondAtom( AliphaticCarbon("CG"), "bondCB" );
00733         bondAtom( AliphaticHydrogen("1HG"), "CG/bond3" ); 
00734         bondAtom( AliphaticHydrogen("2HG"), "CG/bond4" ); 
00735 
00736         bondAtom(TrivalentAtom("CD", Element::Carbon(), 120.4*Deg2Rad, 116.6*Deg2Rad), "CG/bond2", 0.15220);
00737 
00738         bondAtom(UnivalentAtom("OE1", Element::Oxygen()), "CD/bond2", 0.12290);
00739 
00740         bondAtom(TrivalentAtom("NE2", Element::Nitrogen()), "CD/bond3", 0.13350);
00741         bondAtom(UnivalentAtom("1HE2", Element::Hydrogen()), "NE2/bond2", 0.1010);
00742         bondAtom(UnivalentAtom("2HE2", Element::Hydrogen()), "NE2/bond3", 0.1010);
00743 
00744         defineDihedralAngle("chi2", "CD", "CG", "CB", "CA");
00745         defineDihedralAngle("chi3", "OE1", "CD", "CG", "CB");
00746 
00747         setDefaultDihedralAngle("chi3", -20*Deg2Rad);
00748 
00749         // For internal coordinate simulation, make amide group rigid
00750         setBondMobility(BondMobility::Rigid, "CD", "NE2");
00751 
00752     }
00753 };
00754 
00755 
00756 class  AminoAcidResidue::Arginine : public BetaUnbranchedAminoAcidResidue {
00757 public:
00758     Arginine()
00759         : BetaUnbranchedAminoAcidResidue("arginine", "Arg", 'R') 
00760     {
00761         bondAtom(AliphaticCarbon("CG"), "bondCB");
00762         bondAtom(AliphaticHydrogen("1HG"), "CG/bond3");
00763         bondAtom(AliphaticHydrogen("2HG"), "CG/bond4");
00764 
00765         bondAtom(AliphaticCarbon("CD"), "CG/bond2");
00766         bondAtom(AliphaticHydrogen("1HD"), "CD/bond3");
00767         bondAtom(AliphaticHydrogen("2HD"), "CD/bond4");
00768 
00769         // TODO - set bond angle CB/CD/NE to 111.2
00770 
00771         bondAtom(TrivalentAtom("NE", Element::Nitrogen(), 123.2*Deg2Rad, 118.4*Deg2Rad), "CD/bond2", 0.1436, 180*Deg2Rad);
00772         bondAtom(UnivalentAtom("HE", Element::Hydrogen()), "NE/bond3", 0.1010);
00773 
00774         bondAtom(TrivalentAtom("CZ", Element::Carbon()), "NE/bond2", 0.1340, 180*Deg2Rad);
00775 
00776         bondAtom(TrivalentAtom("NH1", Element::Nitrogen()), "CZ/bond2", 0.1340, 180*Deg2Rad);
00777         bondAtom(UnivalentAtom("1HH1", Element::Hydrogen()), "NH1/bond2", 0.1010);
00778         bondAtom(UnivalentAtom("2HH1", Element::Hydrogen()), "NH1/bond3", 0.1010);
00779 
00780         bondAtom(TrivalentAtom("NH2", Element::Nitrogen()), "CZ/bond3", 0.1340, 180*Deg2Rad);
00781         bondAtom(UnivalentAtom("1HH2", Element::Hydrogen()), "NH2/bond2", 0.1010);
00782         bondAtom(UnivalentAtom("2HH2", Element::Hydrogen()), "NH2/bond3", 0.1010);
00783 
00784         defineDihedralAngle("chi2", "CD", "CG", "CB", "CA");
00785         defineDihedralAngle("chi3", "NE", "CD", "CG", "CB");
00786         defineDihedralAngle("chi4", "CZ", "NE", "CD", "CG");
00787         defineDihedralAngle("chi5", "NH1", "CZ", "NE", "CD");
00788 
00789         // TODO research default dihedral for chi4
00790 
00791         // Make guanidinium group rigid for internal coordinate simulation (resonance)
00792         setBondMobility(BondMobility::Rigid, "CZ", "NH1");
00793         setBondMobility(BondMobility::Rigid, "CZ", "NH2");
00794         setBondMobility(BondMobility::Rigid, "NE", "CZ");
00795     }
00796 };
00797 
00798     
00799 class  AminoAcidResidue::Serine : public BetaUnbranchedAminoAcidResidue {
00800 public:
00801     Serine() 
00802         : BetaUnbranchedAminoAcidResidue("serine", "Ser", 'S')
00803     {
00804         // side chain hydroxyl group
00805         bondCompound("oh", AlcoholOHGroup(), "bondCB");
00806         nameAtom("OG", "oh/O", Biotype::SerineOG().getIndex() );
00807         nameAtom("HG", "oh/H", Biotype::SerineHG().getIndex() );
00808 
00809         defineDihedralAngle("chi2", "HG", "OG", "CB", "CA");
00810 
00811         // Set atom biotypes
00812         setBiotypeIndex("N", Biotype::SerineN().getIndex() );
00813         setBiotypeIndex("HN", Biotype::SerineHN().getIndex() );
00814         setBiotypeIndex("CA", Biotype::SerineCA().getIndex() );
00815         setBiotypeIndex("HA", Biotype::SerineHA().getIndex() );
00816         setBiotypeIndex("C", Biotype::SerineC().getIndex() );
00817         setBiotypeIndex("O", Biotype::SerineO().getIndex() );
00818     }
00819 };
00820 
00821 // Threonine has a chirality about the beta carbon, so care
00822 // must be observed when placing groups
00823 // Thus derive from AminoAcidResidue instead of from BetaBranchedAminoAcidResidue
00824 class  AminoAcidResidue::Threonine : public BetaBranchedAminoAcidResidue {
00825 public:
00826     Threonine()
00827         : BetaBranchedAminoAcidResidue("threonine", "Thr", 'T')
00828     {
00829         // hydroxyl has precedence over methyl and hydrogen
00830         // w.r.t. dihedral definition
00831         bondCompound("gamma hydroxyl", AlcoholOHGroup(), "bondCB1");
00832         nameAtom("OG1", "gamma hydroxyl/O");
00833         nameAtom("HG1", "gamma hydroxyl/H");
00834 
00835         // place methyl and hydrogen so as to get correct chirality
00836         // i.e. clockwise rotation of OG/H/CG when viewed down CA/CB bond
00837 
00838         bondCompound("gamma methyl", MethylGroup(), "bondCB2");
00839         nameAtom("CG2", "gamma methyl/C");
00840         nameAtom("1HG2", "gamma methyl/H1");
00841         nameAtom("2HG2", "gamma methyl/H2");
00842         nameAtom("3HG2", "gamma methyl/H3");
00843     }
00844 };
00845 
00846 
00847 // To get atom precedence correct, build custom side chain,
00848 // rather than deriving from BetaBranchedAminoAcidResidue
00849 class  AminoAcidResidue::Valine : public HNAminoAcidResidue {
00850 public:
00851     Valine()
00852         : HNAminoAcidResidue("valine", "Val", 'V')
00853     {
00854         bondAtom(AliphaticCarbon("CB"), "bondCA");
00855         bondAtom(AliphaticHydrogen("HB"), "CB/bond4");
00856 
00857         bondCompound("gamma methyl 1", MethylGroup(), "CB/bond2");
00858         nameAtom("CG1", "gamma methyl 1/C");
00859         nameAtom("1HG1", "gamma methyl 1/H1");
00860         nameAtom("2HG1", "gamma methyl 1/H2");
00861         nameAtom("3HG1", "gamma methyl 1/H3");
00862 
00863         bondCompound("gamma methyl 2", MethylGroup(), "CB/bond3");
00864         nameAtom("CG2", "gamma methyl 2/C");
00865         nameAtom("1HG2", "gamma methyl 2/H1");
00866         nameAtom("2HG2", "gamma methyl 2/H2");
00867         nameAtom("3HG2", "gamma methyl 2/H3");
00868 
00869         defineDihedralAngle("chi1", "CG1", "CB", "CA", "N");
00870 
00871         // definition of CG1 vs. CG2 makes preferred chi1 180 instead of -60 for valine
00872         setDefaultDihedralAngle("chi1", 180*Deg2Rad);
00873     }
00874 };
00875 
00876 
00877 class  AminoAcidResidue::Tryptophan : public BetaUnbranchedAminoAcidResidue {
00878 public:
00879     Tryptophan()
00880         : BetaUnbranchedAminoAcidResidue("tryptophan", "Trp", 'W')
00881     {
00882         bondAtom( TrivalentAtom("CG", Element::Carbon(), 125.0*Deg2Rad, 128.6*Deg2Rad), "bondCB", 0.14950);
00883 
00884         // 125.65 angle computed to place hydrogen symmetrically
00885         bondAtom( TrivalentAtom("CD1", Element::Carbon(), 108.7*Deg2Rad, 125.65*Deg2Rad), "CG/bond2", 0.13520, 180*Deg2Rad);
00886         bondAtom( UnivalentAtom("HD1", Element::Hydrogen()), "CD1/bond3", 0.1080);
00887 
00888         // 124.25 computed to center hydrogen
00889         bondAtom( TrivalentAtom("NE1", Element::Nitrogen(), 111.50*Deg2Rad, 124.25*Deg2Rad), "CD1/bond2", 0.13810, 0*Deg2Rad);
00890         bondAtom( UnivalentAtom("HE1", Element::Hydrogen()), "NE1/bond3", 0.1010);
00891 
00892         bondAtom( TrivalentAtom("CE2", Element::Carbon(), 104.4*Deg2Rad, 132.80*Deg2Rad), "NE1/bond2", 0.1380, 0*Deg2Rad);
00893 
00894         // 180 degrees to bulge back out for the six-membered ring
00895         bondAtom( TrivalentAtom("CZ2", Element::Carbon()), "CE2/bond3", 0.1400, 180*Deg2Rad);
00896         bondAtom( UnivalentAtom("HZ2", Element::Hydrogen()), "CZ2/bond3", 0.1080);
00897 
00898         bondAtom( TrivalentAtom("CH2", Element::Carbon()), "CZ2/bond2", 0.1400, 0*Deg2Rad);
00899         bondAtom( UnivalentAtom("HH2", Element::Hydrogen()), "CH2/bond3", 0.1080);
00900 
00901 
00902 
00903         bondAtom( TrivalentAtom("CD2", Element::Carbon(), 108.8*Deg2Rad, 122.7*Deg2Rad), "CE2/bond2", 0.1419, 0*Deg2Rad);
00904         addRingClosingBond("CD2/bond2", "CG/bond3", 0.1459);
00905 
00906         bondAtom( TrivalentAtom("CE3", Element::Carbon()), "CD2/bond3", 0.1404, 0*Deg2Rad);
00907         bondAtom( UnivalentAtom("HE3", Element::Hydrogen()), "CE3/bond3", 0.1080);
00908 
00909         bondAtom( TrivalentAtom("CZ3", Element::Carbon()), "CE3/bond2", 0.1400, 0*Deg2Rad);
00910         bondAtom( UnivalentAtom("HZ3", Element::Hydrogen()), "CZ3/bond3", 0.1080);
00911 
00912         addRingClosingBond("CZ3/bond2", "CH2/bond2", 0.1400);
00913 
00914         defineDihedralAngle("chi2", "CD1", "CG", "CB", "CA");
00915 
00916         setDefaultDihedralAngle("chi2", 90*Deg2Rad);
00917 
00918         setBondMobility(BondMobility::Rigid, "CG", "CD1");
00919         setBondMobility(BondMobility::Rigid, "CD1", "NE1");
00920         setBondMobility(BondMobility::Rigid, "NE1", "CE2");
00921         setBondMobility(BondMobility::Rigid, "CZ2", "CE2");
00922         setBondMobility(BondMobility::Rigid, "CH2", "CZ2");
00923         setBondMobility(BondMobility::Rigid, "CD2", "CE3");
00924         setBondMobility(BondMobility::Rigid, "CZ3", "CE3");
00925         setBondMobility(BondMobility::Rigid, "CZ3", "CH2");
00926     }
00927 };
00928 
00929 
00930 class  AminoAcidResidue::Tyrosine : public BetaUnbranchedAminoAcidResidue {
00931 public:
00932     Tyrosine()
00933         : BetaUnbranchedAminoAcidResidue("tyrosine", "Tyr", 'Y')
00934     {
00935         static const mdunits::Length CB_CGdistance = 0.1510;
00936         static const mdunits::Length C_Hdistance = 0.1080; // from tinker amber99.dat
00937         static const mdunits::Length C_Cdistance = 0.1400; // from tinker amber99.dat
00938         static const mdunits::Length CZ_Odistance = 0.1364; // from tinker amber99.dat
00939 
00940         // default angle for TrivalentAtom is 120 degrees, which is what we want
00941         // for a six-membered ring
00942         bondAtom( TrivalentAtom("CG", Element::Carbon()), "bondCB", CB_CGdistance, 180*Deg2Rad);
00943 
00944         bondAtom( TrivalentAtom("CD1", Element::Carbon()), "CG/bond2", C_Cdistance, 180*Deg2Rad );
00945         bondAtom( UnivalentAtom("HD1", Element::Hydrogen()), "CD1/bond3", C_Hdistance );
00946 
00947         // Start using hidedral of zero, to loop ring back to beginning
00948         bondAtom( TrivalentAtom("CE1", Element::Carbon()), "CD1/bond2", C_Cdistance, 0*Deg2Rad );
00949         bondAtom( UnivalentAtom("HE1", Element::Hydrogen()), "CE1/bond3", C_Hdistance );
00950 
00951         bondAtom( TrivalentAtom("CZ", Element::Carbon()), "CE1/bond2", C_Cdistance, 180*Deg2Rad );
00952         bondCompound( "oh", AlcoholOHGroup(), "CZ/bond2", CZ_Odistance );
00953         nameAtom("OH", "oh/O");
00954         nameAtom("HH", "oh/H");
00955 
00956         bondAtom( TrivalentAtom("CE2", Element::Carbon()), "CZ/bond3", C_Cdistance, 0*Deg2Rad );
00957         bondAtom( UnivalentAtom("HE2", Element::Hydrogen()), "CE2/bond3", C_Hdistance );
00958 
00959         bondAtom( TrivalentAtom("CD2", Element::Carbon()), "CE2/bond2", C_Cdistance, 0*Deg2Rad );
00960         bondAtom( UnivalentAtom("HD2", Element::Hydrogen()), "CD2/bond3", C_Hdistance );
00961 
00962         addRingClosingBond("CD2/bond2", "CG/bond3", 0.1459);
00963 
00964         defineDihedralAngle("chi2", "CD1", "CG", "CB", "CA");
00965 
00966         setDefaultDihedralAngle("chi2", 90*Deg2Rad); // from Dunbrack site
00967 
00968         setBondMobility(BondMobility::Rigid, "CG", "CD1");
00969         setBondMobility(BondMobility::Rigid, "CD1", "CE1");
00970         setBondMobility(BondMobility::Rigid, "CE1", "CZ");
00971         setBondMobility(BondMobility::Rigid, "CZ", "CE2");
00972         setBondMobility(BondMobility::Rigid, "CE2", "CD2");
00973         setBondMobility(BondMobility::Rigid, "CD2", "CG");
00974     }
00975 };
00976 
00977 
00978 class SimTK_MOLMODEL_EXPORT Protein : public Biopolymer {
00979 public:
00980 
00981     void loadFromPdbStructure(const PdbStructure& pdbStructure, SimTK::Real targetRms)
00982     {
00983         const PdbChain& pdbChain = pdbStructure.getModel(Pdb::ModelIndex(0)).getChain(Pdb::ChainIndex(0));
00984         loadFromPdbChain(pdbChain, targetRms);
00985     }
00986     
00987     void loadFromPdbChain(const PdbChain& pdbChain, SimTK::Real targetRms);
00988     
00989     explicit Protein(std::istream& pdbStream, SimTK::Real targetRms = 0.02)
00990     {
00991         PdbStructure pdbStructure(pdbStream);
00992         loadFromPdbStructure(pdbStructure, targetRms);
00993     }
00994     
00995     explicit Protein(const PdbStructure& pdbStructure, SimTK::Real targetRms = 0.02)
00996     {
00997         loadFromPdbStructure(pdbStructure, targetRms);
00998     }
00999     
01000     explicit Protein(const PdbChain& pdbChain, SimTK::Real targetRms)
01001     {
01002         loadFromPdbChain(pdbChain, targetRms);
01003     }
01004     
01005     explicit Protein(const Sequence& seq, const BondMobility::Mobility mobility= BondMobility::Rigid  ) 
01006     {
01007         initialize(seq, mobility);
01008     }
01009     
01010     explicit Protein( const Sequence& seq, CompoundSystem& system, Transform transform = Transform() ) 
01011     {
01012         initialize(seq, BondMobility::Rigid);
01013         system.adoptCompound(*this, transform);
01014     }
01015     
01016 protected:
01017     void initialize( const Sequence& seq, const BondMobility::Mobility mobility ) 
01018     {
01019         Biotype::initializePopularBiotypes();
01020         
01021         // TODO - provide alternatives for end caps
01022         String previousResidueName = "acetyl0";
01023         appendResidue(previousResidueName, AcetylResidue());
01024 
01025         for (int resi = 0; resi < (int)seq.size(); ++resi)
01026         {
01027             AminoAcidResidue residue = AminoAcidResidue::create(seq[resi]);
01028             residue.setPdbResidueNumber(resi + 1);
01029 
01030             // Name residue subcompound after its number in the sequence
01031             // name must be unique within the protein
01032             String residueName(resi);
01033             appendResidue( residueName, residue );
01034 
01035             // Rigidify peptide bond 
01036             if (getNResidues() > 1) // First residue lacks a preceding peptide bond
01037             {
01038                 String omegaAngleName = String("omega") + String(resi);
01039 
01040                 defineDihedralAngle(
01041                     omegaAngleName, 
01042                     previousResidueName+"/C/bond1", 
01043                     residueName+"/N/bond2");
01044                 setDefaultDihedralAngle(omegaAngleName, 180*Deg2Rad);
01045 
01046                 // Make omega torsion rigid
01047                 String cAtomName = previousResidueName + "/" + "C";
01048                 String nAtomName = residueName + "/" + "N";
01049                 setBondMobility(mobility, cAtomName, nAtomName);
01050             }
01051 
01052             previousResidueName = residueName;
01053         }
01054 
01055         // TODO - create C-terminal end cap, if we are producing end caps
01056         String cCapName = String("nme") + String((int)seq.size());
01057         appendResidue(cCapName, NMethylAmideResidue());
01058         // Rigidify final omega angle
01059         String omegaAngleName = String("omega") + String(cCapName);
01060         defineDihedralAngle(
01061             omegaAngleName, 
01062             previousResidueName+"/C/bond1", 
01063             cCapName+"/N/bond2");
01064         setDefaultDihedralAngle(omegaAngleName, 180*Deg2Rad);
01065 
01066         // Make omega torsion rigid
01067         String cAtomName = previousResidueName + "/" + "C";
01068         String nAtomName = cCapName + "/" + "N";
01069         setBondMobility(BondMobility::Rigid, cAtomName, nAtomName);
01070     }
01071 };
01072 
01073 
01074 } // namespace SimTK
01075 
01076 #endif // SimTK_MOLMODEL_PROTEIN_H_

Generated on Fri Sep 26 07:44:15 2008 for SimTKcore by  doxygen 1.5.6