public static new Monomer validateAndAllocate(Chain chain, string group3, int seqcode, int firstAtomIndex, int lastAtomIndex, int[] specialAtomIndexes, Atom[] atoms) { sbyte[] offsets = scanForOffsets(firstAtomIndex, specialAtomIndexes, interestingAminoAtomIDs); if (offsets == null) { return(null); } if (specialAtomIndexes[JmolConstants.ATOMID_CARBONYL_OXYGEN] < 0) { int carbonylOxygenIndex = specialAtomIndexes[JmolConstants.ATOMID_O1]; System.Console.Out.WriteLine("I see someone who does not have a carbonyl oxygen"); if (carbonylOxygenIndex < 0) { return(null); } offsets[1] = (sbyte)(carbonylOxygenIndex - firstAtomIndex); } if (!isBondedCorrectly(firstAtomIndex, offsets, atoms)) { return(null); } AminoMonomer aminoMonomer = new AminoMonomer(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, offsets); return(aminoMonomer); }
public static Monomer[] getAminoMonomers(Group[] groups, int firstGroupIndex) { AminoMonomer previous = null; int count = 0; for (int i = firstGroupIndex; i < groups.Length; ++i, ++count) { Group group = groups[i]; if (!(group is AminoMonomer)) { break; } AminoMonomer current = (AminoMonomer)group; if (current.polymer != null) { break; } if (!current.isConnectedAfter(previous)) { break; } previous = current; } if (count == 0) { return(null); } Monomer[] monomers = new Monomer[count]; for (int j = 0; j < count; ++j) { monomers[j] = (AminoMonomer)groups[firstGroupIndex + j]; } return(monomers); }
public virtual void calcProteinMainchainHydrogenBonds(BitArray bsA, BitArray bsB) { Point3f carbonPoint; Point3f oxygenPoint; for (int i = 0; i < monomerCount; ++i) { AminoMonomer residue = (AminoMonomer)monomers[i]; mainchainHbondOffsets[i] = 0; /**************************************************************** * This does not acount for the first nitrogen in the chain * is there some way to predict where it's hydrogen is? * mth 20031219 ****************************************************************/ if (i > 0 && residue.GroupID != JmolConstants.GROUPID_PROLINE) { Point3f nitrogenPoint = residue.NitrogenAtomPoint; aminoHydrogenPoint.add(nitrogenPoint, vectorPreviousOC); bondAminoHydrogen(i, aminoHydrogenPoint, bsA, bsB); } carbonPoint = residue.CarbonylCarbonAtomPoint; oxygenPoint = residue.CarbonylOxygenAtomPoint; vectorPreviousOC.sub(carbonPoint, oxygenPoint); vectorPreviousOC.scale(1 / vectorPreviousOC.length()); } }
public virtual void calcSheetUnitVectors() { if (widthUnitVector == null) { Vector3f vectorCO = new Vector3f(); Vector3f vectorCOSum = new Vector3f(); AminoMonomer amino = (AminoMonomer)aminoPolymer.monomers[monomerIndex]; vectorCOSum.sub(amino.CarbonylOxygenAtomPoint, amino.CarbonylCarbonAtomPoint); for (int i = monomerCount; --i > 0;) { amino = (AminoMonomer)aminoPolymer.monomers[i]; vectorCO.sub(amino.CarbonylOxygenAtomPoint, amino.CarbonylCarbonAtomPoint); //UPGRADE_WARNING: Data types in Visual C# might be different. Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'" if (vectorCOSum.angle(vectorCO) < (float)System.Math.PI / 2) { vectorCOSum.add(vectorCO); } else { vectorCOSum.sub(vectorCO); } } heightUnitVector = vectorCO; // just reuse the same temp vector; heightUnitVector.cross(axisUnitVector, vectorCOSum); heightUnitVector.normalize(); widthUnitVector = vectorCOSum; widthUnitVector.cross(axisUnitVector, heightUnitVector); } }
public virtual void bondAminoHydrogen(int indexDonor, Point3f hydrogenPoint, BitArray bsA, BitArray bsB) { AminoMonomer source = (AminoMonomer)monomers[indexDonor]; Point3f sourceAlphaPoint = source.LeadAtomPoint; Point3f sourceNitrogenPoint = source.NitrogenAtomPoint; int energyMin1 = 0; int energyMin2 = 0; int indexMin1 = -1; int indexMin2 = -1; for (int i = monomerCount; --i >= 0;) { if ((i == indexDonor || (i + 1) == indexDonor) || (i - 1) == indexDonor) { continue; } AminoMonomer target = (AminoMonomer)monomers[i]; Point3f targetAlphaPoint = target.LeadAtomPoint; float dist2 = sourceAlphaPoint.distanceSquared(targetAlphaPoint); if (dist2 > maxHbondAlphaDistance2) { continue; } int energy = calcHbondEnergy(sourceNitrogenPoint, hydrogenPoint, target); if (debugHbonds) { System.Console.Out.WriteLine("HbondEnergy=" + energy + " dist2=" + dist2 + " max^2=" + maxHbondAlphaDistance2); } if (energy < energyMin1) { energyMin2 = energyMin1; indexMin2 = indexMin1; energyMin1 = energy; indexMin1 = i; } else if (energy < energyMin2) { energyMin2 = energy; indexMin2 = i; } } if (indexMin1 >= 0) { mainchainHbondOffsets[indexDonor] = (short)(indexDonor - indexMin1); min1Indexes[indexDonor] = (short)indexMin1; min1Energies[indexDonor] = (short)energyMin1; createResidueHydrogenBond(indexDonor, indexMin1, bsA, bsB); if (indexMin2 >= 0) { createResidueHydrogenBond(indexDonor, indexMin2, bsA, bsB); min2Indexes[indexDonor] = (short)indexMin2; min2Energies[indexDonor] = (short)energyMin2; } } }
public virtual void calcPhiPsiAngles(AminoMonomer leadingResidue, AminoMonomer trailingResidue, float[] phi_psi) { Point3f nitrogen1 = leadingResidue.NitrogenAtomPoint; Point3f alphacarbon1 = leadingResidue.LeadAtomPoint; Point3f carbon1 = leadingResidue.CarbonylCarbonAtomPoint; Point3f nitrogen2 = trailingResidue.NitrogenAtomPoint; Point3f alphacarbon2 = trailingResidue.LeadAtomPoint; Point3f carbon2 = trailingResidue.CarbonylCarbonAtomPoint; phi_psi[0] = Measurement.computeTorsion(carbon1, nitrogen2, alphacarbon2, carbon2); phi_psi[1] = Measurement.computeTorsion(nitrogen1, alphacarbon1, carbon1, nitrogen2); }
//////////////////////////////////////////////////////////////// public override bool isConnectedAfter(Monomer possiblyPreviousMonomer) { if (possiblyPreviousMonomer == null) { return(true); } if (!(possiblyPreviousMonomer is AminoMonomer)) { return(false); } AminoMonomer other = (AminoMonomer)possiblyPreviousMonomer; return(other.CarbonylCarbonAtom.isBonded(NitrogenAtom)); }
public virtual void createResidueHydrogenBond(int indexAminoGroup, int indexCarbonylGroup, BitArray bsA, BitArray bsB) { short order; int aminoBackboneHbondOffset = indexAminoGroup - indexCarbonylGroup; if (debugHbonds) { System.Console.Out.WriteLine("aminoBackboneHbondOffset=" + aminoBackboneHbondOffset + " amino:" + monomers[indexAminoGroup].SeqcodeString + " carbonyl:" + monomers[indexCarbonylGroup].SeqcodeString); } switch (aminoBackboneHbondOffset) { case 2: order = JmolConstants.BOND_H_PLUS_2; break; case 3: order = JmolConstants.BOND_H_PLUS_3; break; case 4: order = JmolConstants.BOND_H_PLUS_4; break; case 5: order = JmolConstants.BOND_H_PLUS_5; break; case -3: order = JmolConstants.BOND_H_MINUS_3; break; case -4: order = JmolConstants.BOND_H_MINUS_4; break; default: order = JmolConstants.BOND_H_REGULAR; break; } if (debugHbonds) { Console.Out.WriteLine("createResidueHydrogenBond(" + indexAminoGroup + "," + indexCarbonylGroup); } AminoMonomer donor = (AminoMonomer)monomers[indexAminoGroup]; Atom nitrogen = donor.NitrogenAtom; AminoMonomer recipient = (AminoMonomer)monomers[indexCarbonylGroup]; Atom oxygen = recipient.CarbonylOxygenAtom; model.mmset.frame.bondAtoms(nitrogen, oxygen, order, bsA, bsB); }
private void distinguishAndPropogateGroup(int groupIndex, Chain chain, string group3, int seqcode, int firstAtomIndex, int maxAtomIndex) { // System.out.println("distinguish & propogate group:" + // " group3:" + group3 + // " seqcode:" + Group.getSeqcodeString(seqcode) + // " firstAtomIndex:" + firstAtomIndex + // " maxAtomIndex:" + maxAtomIndex); int distinguishingBits = 0; // clear previous specialAtomIndexes for (int i = JmolConstants.ATOMID_MAX; --i >= 0;) { specialAtomIndexes[i] = Int32.MinValue; } if (specialAtomIDs != null) { for (int i = maxAtomIndex; --i >= firstAtomIndex;) { int specialAtomID = specialAtomIDs[i]; if (specialAtomID > 0) { if (specialAtomID < JmolConstants.ATOMID_DISTINGUISHING_ATOM_MAX) { distinguishingBits |= 1 << specialAtomID; } specialAtomIndexes[specialAtomID] = i; } } } int lastAtomIndex = maxAtomIndex - 1; if (lastAtomIndex < firstAtomIndex) { throw new System.NullReferenceException(); } Group group = null; // System.out.println("distinguishingBits=" + distinguishingBits); if ((distinguishingBits & JmolConstants.ATOMID_PROTEIN_MASK) == JmolConstants.ATOMID_PROTEIN_MASK) { // System.out.println("may be an AminoMonomer"); group = AminoMonomer.validateAndAllocate(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, specialAtomIndexes, atoms); } else if (distinguishingBits == JmolConstants.ATOMID_ALPHA_ONLY_MASK) { // System.out.println("AlphaMonomer.validateAndAllocate"); group = AlphaMonomer.validateAndAllocate(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, specialAtomIndexes, atoms); } else if (((distinguishingBits & JmolConstants.ATOMID_NUCLEIC_MASK) == JmolConstants.ATOMID_NUCLEIC_MASK)) { group = NucleicMonomer.validateAndAllocate(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, specialAtomIndexes, atoms); } else if (distinguishingBits == JmolConstants.ATOMID_PHOSPHORUS_ONLY_MASK) { // System.out.println("PhosphorusMonomer.validateAndAllocate"); group = PhosphorusMonomer.validateAndAllocate(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, specialAtomIndexes, atoms); } if (group == null) { group = new Group(chain, group3, seqcode, firstAtomIndex, lastAtomIndex); } chain.addGroup(group); groups[groupIndex] = group; //////////////////////////////////////////////////////////////// for (int i = maxAtomIndex; --i >= firstAtomIndex;) { atoms[i].Group = group; } }
public virtual int calcHbondEnergy(Point3f nitrogenPoint, Point3f hydrogenPoint, AminoMonomer target) { Point3f targetOxygenPoint = target.CarbonylOxygenAtomPoint; float distON2 = targetOxygenPoint.distanceSquared(nitrogenPoint); if (distON2 < minimumHbondDistance2) return - 9900; //why would this not have been in here? RMH 03/8/06 // if (distON2 > hbondMax2) // return 0; //nevermind! :) if (debugHbonds) System.Console.Out.WriteLine("calchbondenergy: " + hydrogenPoint.x + "," + hydrogenPoint.y + "," + hydrogenPoint.z); float distOH2 = targetOxygenPoint.distanceSquared(hydrogenPoint); if (distOH2 < minimumHbondDistance2) return - 9900; Point3f targetCarbonPoint = target.CarbonylCarbonAtomPoint; float distCH2 = targetCarbonPoint.distanceSquared(hydrogenPoint); if (distCH2 < minimumHbondDistance2) return - 9900; float distCN2 = targetCarbonPoint.distanceSquared(nitrogenPoint); if (distCN2 < minimumHbondDistance2) return - 9900; double distOH = System.Math.Sqrt(distOH2); double distCH = System.Math.Sqrt(distCH2); double distCN = System.Math.Sqrt(distCN2); double distON = System.Math.Sqrt(distON2); //UPGRADE_WARNING: Data types in Visual C# might be different. Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'" int energy = (int) ((QConst / distOH - QConst / distCH + QConst / distCN - QConst / distON)); if (debugHbonds) System.Console.Out.WriteLine(" distOH=" + distOH + " distCH=" + distCH + " distCN=" + distCN + " distON=" + distON + " energy=" + energy); if (energy < - 9900) return - 9900; if (energy > - 500) return 0; return energy; }
public static new Monomer validateAndAllocate(Chain chain, string group3, int seqcode, int firstAtomIndex, int lastAtomIndex, int[] specialAtomIndexes, Atom[] atoms) { sbyte[] offsets = scanForOffsets(firstAtomIndex, specialAtomIndexes, interestingAminoAtomIDs); if (offsets == null) return null; if (specialAtomIndexes[JmolConstants.ATOMID_CARBONYL_OXYGEN] < 0) { int carbonylOxygenIndex = specialAtomIndexes[JmolConstants.ATOMID_O1]; System.Console.Out.WriteLine("I see someone who does not have a carbonyl oxygen"); if (carbonylOxygenIndex < 0) return null; offsets[1] = (sbyte) (carbonylOxygenIndex - firstAtomIndex); } if (!isBondedCorrectly(firstAtomIndex, offsets, atoms)) return null; AminoMonomer aminoMonomer = new AminoMonomer(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, offsets); return aminoMonomer; }
/* * If someone wants to work on this code for secondary structure * recognition that would be great * * miguel 2004 06 16 */ /* * New code for assigning secondary structure based on * phi-psi angles instead of hydrogen bond patterns. * * old code is commented below the new. * * molvisions 2005 10 12 * */ public override void calculateStructures() { char[] structureTags = new char[monomerCount]; float[] phi_psi = new float[2]; for (int i = 0; i < monomerCount - 1; ++i) { AminoMonomer leadingResidue = (AminoMonomer)monomers[i]; AminoMonomer trailingResidue = (AminoMonomer)monomers[i + 1]; calcPhiPsiAngles(leadingResidue, trailingResidue, phi_psi); if (isHelix(phi_psi)) { structureTags[i] = '4'; //structureTags[i+1] = '4'; } else if (isSheet(phi_psi)) { structureTags[i] = 's'; //structureTags[i+1] = 's'; } else if (isTurn(phi_psi)) { structureTags[i] = 't'; //structureTags[i+1] = 't'; } else { structureTags[i] = '\x0000'; //structureTags[i+1] = '\0'; } } // build alpha helix stretches for (int start = 0; start < monomerCount; ++start) { if (structureTags[start] == '4') { int end; for (end = start + 1; end < monomerCount && structureTags[end] == '4'; ++end) { } end--; if (end >= start + 3) { addSecondaryStructure(JmolConstants.PROTEIN_STRUCTURE_HELIX, start, end); } start = end; } } // build beta sheet stretches for (int start = 0; start < monomerCount; ++start) { if (structureTags[start] == 's') { int end; for (end = start + 1; end < monomerCount && structureTags[end] == 's'; ++end) { } end--; if (end >= start + 2) { addSecondaryStructure(JmolConstants.PROTEIN_STRUCTURE_SHEET, start, end); } start = end; } } // build turns for (int start = 0; start < monomerCount; ++start) { if (structureTags[start] == 't') { int end; for (end = start + 1; end < monomerCount && structureTags[end] == 't'; ++end) { } end--; if (end >= start + 2) { addSecondaryStructure(JmolConstants.PROTEIN_STRUCTURE_TURN, start, end); } start = end; } } }
public virtual int calcHbondEnergy(Point3f nitrogenPoint, Point3f hydrogenPoint, AminoMonomer target) { Point3f targetOxygenPoint = target.CarbonylOxygenAtomPoint; float distON2 = targetOxygenPoint.distanceSquared(nitrogenPoint); if (distON2 < minimumHbondDistance2) { return(-9900); } //why would this not have been in here? RMH 03/8/06 // if (distON2 > hbondMax2) // return 0; //nevermind! :) if (debugHbonds) { System.Console.Out.WriteLine("calchbondenergy: " + hydrogenPoint.x + "," + hydrogenPoint.y + "," + hydrogenPoint.z); } float distOH2 = targetOxygenPoint.distanceSquared(hydrogenPoint); if (distOH2 < minimumHbondDistance2) { return(-9900); } Point3f targetCarbonPoint = target.CarbonylCarbonAtomPoint; float distCH2 = targetCarbonPoint.distanceSquared(hydrogenPoint); if (distCH2 < minimumHbondDistance2) { return(-9900); } float distCN2 = targetCarbonPoint.distanceSquared(nitrogenPoint); if (distCN2 < minimumHbondDistance2) { return(-9900); } double distOH = System.Math.Sqrt(distOH2); double distCH = System.Math.Sqrt(distCH2); double distCN = System.Math.Sqrt(distCN2); double distON = System.Math.Sqrt(distON2); //UPGRADE_WARNING: Data types in Visual C# might be different. Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'" int energy = (int)((QConst / distOH - QConst / distCH + QConst / distCN - QConst / distON)); if (debugHbonds) { System.Console.Out.WriteLine(" distOH=" + distOH + " distCH=" + distCH + " distCN=" + distCN + " distON=" + distON + " energy=" + energy); } if (energy < -9900) { return(-9900); } if (energy > -500) { return(0); } return(energy); }