Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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());
            }
        }
Exemple #4
0
 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);
     }
 }
Exemple #5
0
        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;
                }
            }
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        ////////////////////////////////////////////////////////////////

        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));
        }
Exemple #8
0
        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);
        }
Exemple #9
0
        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 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 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;
		}
Exemple #13
0
        /*
         * 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;
                }
            }
        }
Exemple #14
0
        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);
        }