00001 #ifndef SimTK_MOLMODEL_PROTEIN_H_
00002 #define SimTK_MOLMODEL_PROTEIN_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
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
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
00086 setDefaultInboardBondLength(0.1335);
00087
00088
00089 addCompoundSynonym("N-MeAmide");
00090
00091
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;
00155
00156
00157
00158
00159
00160 TrivalentAtom nAtom("N", Element::Nitrogen());
00161
00162
00163
00164 setBaseAtom(nAtom);
00165
00166
00167 bondAtom(QuadrivalentAtom("CA", Element::Carbon()), "N/bond2", N_CAdistance, DefaultAntiparallelBetaPhiAngle + 180*Deg2Rad);
00168 bondAtom(UnivalentAtom("HA", Element::Hydrogen()), "CA/bond3", CA_Hdistance);
00169 nameBondCenter("bondCA", "CA/bond4");
00170
00171
00172 bondAtom(TrivalentAtom("C", Element::Carbon()), "CA/bond2", CA_Cdistance, DefaultAntiparallelBetaPsiAngle + 180*Deg2Rad);
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
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");
00244
00245
00246 }
00247 };
00248
00249
00250
00251
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);
00265 }
00266 };
00267
00268
00269
00270
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
00279
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);
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
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
00331
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
00350
00351 setDefaultDihedralAngle("chi2", -15*Deg2Rad);
00352
00353
00354
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
00379
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;
00392 static const mdunits::Length C_Cdistance = 0.1400;
00393
00394
00395
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
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);
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");
00437 }
00438 };
00439
00440
00441 class AminoAcidResidue::Histidine : public BetaUnbranchedAminoAcidResidue {
00442 public:
00443 Histidine()
00444 : BetaUnbranchedAminoAcidResidue("histidine", "His", 'H')
00445 {
00446
00447 static const mdunits::Length CB_CGdistance = 0.15040;
00448 static const mdunits::Length CG_NDdistance = 0.13895;
00449 static const mdunits::Length N_CEdistance = 0.13390;
00450 static const mdunits::Length NE_CDdistance = 0.13875;
00451 static const mdunits::Length CD_CGdistance = 0.1373;
00452 static const mdunits::Length H_Cdistance = 0.1080;
00453 static const mdunits::Length H_Ndistance = 0.1010;
00454
00455
00456
00457
00458 static const Angle ringAngle = 108.000 * Deg2Rad;
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
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
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);
00482
00483
00484
00485
00486
00487
00488
00489 addCompoundSynonym("histidine (+)");
00490
00491
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
00502
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
00573
00574
00575
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
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
00634
00635 setDefaultDihedralAngle("chi2", -20*Deg2Rad);
00636
00637
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
00649
00650
00651 bondAtom(AliphaticCarbon("CB"), "bondCA");
00652 bondAtom(AliphaticHydrogen("1HB"), "CB/bond3");
00653 bondAtom(AliphaticHydrogen("2HB"), "CB/bond4");
00654
00655
00656 bondAtom(AliphaticCarbon("CG"), "CB/bond2");
00657 bondAtom(AliphaticHydrogen("1HG"), "CG/bond3");
00658 bondAtom(AliphaticHydrogen("2HG"), "CG/bond4");
00659
00660
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
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");
00673
00674
00675
00676
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
00686 setBondMobility(BondMobility::Rigid, "N", "CA");
00687 }
00688
00689
00690
00691
00692
00693
00694
00695
00696 Proline& setDefaultUpPucker() {
00697
00698
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() {
00708
00709
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
00716
00717
00718
00719
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
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
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
00790
00791
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
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
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
00822
00823
00824 class AminoAcidResidue::Threonine : public BetaBranchedAminoAcidResidue {
00825 public:
00826 Threonine()
00827 : BetaBranchedAminoAcidResidue("threonine", "Thr", 'T')
00828 {
00829
00830
00831 bondCompound("gamma hydroxyl", AlcoholOHGroup(), "bondCB1");
00832 nameAtom("OG1", "gamma hydroxyl/O");
00833 nameAtom("HG1", "gamma hydroxyl/H");
00834
00835
00836
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
00848
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
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
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
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
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;
00937 static const mdunits::Length C_Cdistance = 0.1400;
00938 static const mdunits::Length CZ_Odistance = 0.1364;
00939
00940
00941
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
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);
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
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
01031
01032 String residueName(resi);
01033 appendResidue( residueName, residue );
01034
01035
01036 if (getNResidues() > 1)
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
01047 String cAtomName = previousResidueName + "/" + "C";
01048 String nAtomName = residueName + "/" + "N";
01049 setBondMobility(mobility, cAtomName, nAtomName);
01050 }
01051
01052 previousResidueName = residueName;
01053 }
01054
01055
01056 String cCapName = String("nme") + String((int)seq.size());
01057 appendResidue(cCapName, NMethylAmideResidue());
01058
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
01067 String cAtomName = previousResidueName + "/" + "C";
01068 String nAtomName = cCapName + "/" + "N";
01069 setBondMobility(BondMobility::Rigid, cAtomName, nAtomName);
01070 }
01071 };
01072
01073
01074 }
01075
01076 #endif // SimTK_MOLMODEL_PROTEIN_H_