public static ApproximatePeptide FromPeptide(Peptide peptide) { var dihedralAngles = AminoAcidAngleMeasurer.MeasureAngles(peptide); var approximateAminoAcids = new List <ApproximatedAminoAcid>(); foreach (var aminoAcid in peptide.AminoAcids) { PdbAminoAcidAtomNamer.AssignNames(aminoAcid); var nitrogen = aminoAcid.GetAtomFromName("N"); var carbonAlpha = aminoAcid.GetAtomFromName("CA"); var carbon = aminoAcid.GetAtomFromName("C"); var aminoAcidDihedralAngles = dihedralAngles[aminoAcid]; var approximateAminoAcid = new ApproximatedAminoAcid(aminoAcid.Name, aminoAcid.SequenceNumber) { NitrogenPosition = nitrogen.Position, CarbonAlphaPosition = carbonAlpha.Position, CarbonPosition = carbon.Position, OmegaAngle = aminoAcidDihedralAngles.Omega, PhiAngle = aminoAcidDihedralAngles.Phi, PsiAngle = aminoAcidDihedralAngles.Psi, IsFrozen = true }; approximateAminoAcids.Add(approximateAminoAcid); } return(new ApproximatePeptide(approximateAminoAcids)); }
public void MeasureAminoAcidDistances(string pdbFilePath, int sequenceNumber1, int sequenceNumber2) { var pdb = PdbReader.ReadFile(pdbFilePath); var firstChain = pdb.Models.First().Chains.First(); var aminoAcidAngles = AminoAcidAngleMeasurer.MeasureAngles(firstChain); var aminoAcid1 = firstChain.AminoAcids.Find(x => x.SequenceNumber == sequenceNumber1); var aminoAcid2 = firstChain.AminoAcids.Find(x => x.SequenceNumber == sequenceNumber2); var aminoAcid1Angles = aminoAcidAngles[aminoAcid1]; var aminoAcid2Angles = aminoAcidAngles[aminoAcid2]; var carbonAlphaDistance = aminoAcid1.GetAtomFromName("CA").Position .DistanceTo(aminoAcid2.GetAtomFromName("CA").Position); Console.WriteLine("Carbon alpha distance: " + carbonAlphaDistance); Console.WriteLine($"Amino acid {sequenceNumber1} ({aminoAcid1.Name}) angles: {aminoAcid1Angles}"); Console.WriteLine($"Amino acid {sequenceNumber2} ({aminoAcid2.Name}) angles: {aminoAcid2Angles}"); var carbonAlphaCarbonDistance = aminoAcid1.GetAtomFromName("CA").Position .DistanceTo(aminoAcid1.GetAtomFromName("C").Position); Console.WriteLine($"Carbon alpha-Carbon distance: {carbonAlphaCarbonDistance}"); var carbonNitrogenDistance = aminoAcid1.GetAtomFromName("C").Position .DistanceTo(aminoAcid2.GetAtomFromName("N").Position); Console.WriteLine($"Carbon-Nitrogen distance: {carbonNitrogenDistance}"); }
public void ForceDirectionAsExpected() { var approximatePeptide = new ApproximatePeptide(new [] { new ApproximatedAminoAcid(AminoAcidName.Alanine, 1) { NitrogenPosition = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, -150, -150, 0), CarbonAlphaPosition = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 0, -150, 0), CarbonPosition = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 0, 0, 0) }, new ApproximatedAminoAcid(AminoAcidName.Alanine, 2) { NitrogenPosition = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 150, 0, 0), CarbonAlphaPosition = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 150, 0, 150), CarbonPosition = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 300, 0, 150) } }); var angles = AminoAcidAngleMeasurer.MeasureAngles(approximatePeptide); var ramachandranPlotDistribution = new RamachandranPlotFixedDistribution(AminoAcidName.Alanine, new UnitPoint2D(Unit.Degree, -90, -20)); var distributionSource = new RamachandranPlotDistributionFixedSource(ramachandranPlotDistribution); var sut = new RamachandranForceCalculator(distributionSource); var forces = sut.Calculate(approximatePeptide); var aminoAcid1Forces = forces[approximatePeptide.AminoAcids[0]]; var aminoAcid2Forces = forces[approximatePeptide.AminoAcids[1]]; Assert.That(aminoAcid1Forces.CarbonAlphaForce.In(Unit.Newton).Z, Is.LessThan(0)); Assert.That(aminoAcid1Forces.CarbonForce.Magnitude().In(Unit.Newton), Is.EqualTo(0).Within(1e-6)); Assert.That(aminoAcid2Forces.NitrogenForce.Magnitude().In(Unit.Newton), Is.EqualTo(0).Within(1e-6)); Assert.That(aminoAcid2Forces.CarbonAlphaForce.In(Unit.Newton).Y, Is.GreaterThan(0)); }
/// <summary> /// Use Ramachmadran plot position of an amino acid for pushing it /// to keep it away from prohibited zones. /// </summary> public Dictionary <ApproximatedAminoAcid, ApproximateAminoAcidForces> Calculate(ApproximatePeptide peptide) { var forceDictionary = new Dictionary <ApproximatedAminoAcid, ApproximateAminoAcidForces>(); var aminoAcidAnglesDictionary = AminoAcidAngleMeasurer.MeasureAngles(peptide); for (var aminoAcidIdx = 0; aminoAcidIdx < peptide.AminoAcids.Count; aminoAcidIdx++) { var aminoAcid = peptide.AminoAcids[aminoAcidIdx]; var previousAminoAcid = aminoAcidIdx > 0 ? peptide.AminoAcids[aminoAcidIdx - 1] : null; var nextAminoAcid = aminoAcidIdx + 1 < peptide.AminoAcids.Count ? peptide.AminoAcids[aminoAcidIdx + 1] : null; var plotDistribution = distributionSource.GetDistribution(aminoAcid.Name); var aminoAcidAngles = aminoAcidAnglesDictionary[aminoAcid]; if (aminoAcidAngles.Omega != null && !aminoAcidAngles.Omega.Value.IsNaN()) { ApplyOmegaDeviationForce(previousAminoAcid, aminoAcid, aminoAcidAngles, forceDictionary); } if (aminoAcidAngles.Phi != null && aminoAcidAngles.Psi != null) { var plotGradient = plotDistribution.GetPhiPsiVector(aminoAcidAngles.Phi, aminoAcidAngles.Psi).In(Unit.Degree); var phiDeviation = plotGradient.X; var psiDeviation = plotGradient.Y; ApplyPhiDeviationForce(previousAminoAcid, aminoAcid, forceDictionary, phiDeviation); ApplyPsiDeviationForce(aminoAcid, nextAminoAcid, forceDictionary, psiDeviation); } } return(forceDictionary); }
public void DihedralAnglesConverge() { var targetPhi = 40.To(Unit.Degree); var targetPsi = -10.To(Unit.Degree); var approximatePeptide = ApproximatePeptideBuilder.FromSequence(new [] { AminoAcidName.Alanine, AminoAcidName.Alanine, AminoAcidName.Alanine }, 1); approximatePeptide.UpdatePositions(); var startAngles = AminoAcidAngleMeasurer.MeasureAngles(approximatePeptide); var simulationSettings = new ApproximatePeptideSimulationSettings { SimulationTime = 500.To(SIPrefix.Femto, Unit.Second), TimeStep = 2.To(SIPrefix.Femto, Unit.Second), ResetAtomVelocityAfterEachTimestep = true, UseCompactingForce = false }; var ramachandranPlotDistribution = new RamachandranPlotFixedDistribution(AminoAcidName.Alanine, new UnitPoint2D(targetPhi, targetPsi)); var distributionSource = new RamachandranPlotDistributionFixedSource(ramachandranPlotDistribution); var sut = new RamachandranForceCalculator(distributionSource); var simulator = new ApproximatePeptideFoldingSimulator( approximatePeptide, simulationSettings, new CompactingForceCalculator(), sut, new BondForceCalculator()); var angleHistory = new List <AminoAcidAngles>(); var simulationEndedWaitHandle = new ManualResetEvent(false); simulator.SimulationCompleted += (sender, args) => simulationEndedWaitHandle.Set(); simulator.TimestepCompleted += (sender, args) => { var angles = AminoAcidAngleMeasurer.MeasureAngles(args.PeptideCopy); var midAminoAcid = args.PeptideCopy.AminoAcids[1]; angleHistory.Add(angles[midAminoAcid]); }; simulator.StartSimulation(); simulationEndedWaitHandle.WaitOne(); File.WriteAllLines(@"G:\Projects\HumanGenome\angles.csv", angleHistory.Select(angle => $"{angle.Omega.In(Unit.Degree).ToString(CultureInfo.InvariantCulture)};" + $"{angle.Phi.In(Unit.Degree).ToString(CultureInfo.InvariantCulture)};" + $"{angle.Psi.In(Unit.Degree).ToString(CultureInfo.InvariantCulture)}")); var finalAngles = AminoAcidAngleMeasurer.MeasureAngles(approximatePeptide); var middleAminoAcid = approximatePeptide.AminoAcids[1]; Assert.That((finalAngles[middleAminoAcid].Phi - targetPhi).Abs(), Is.LessThan((startAngles[middleAminoAcid].Phi - targetPhi).Abs())); Assert.That((finalAngles[middleAminoAcid].Psi - targetPsi).Abs(), Is.LessThan((startAngles[middleAminoAcid].Psi - targetPsi).Abs())); }
public void Psi90PlusMeasuredCorrectly() { var peptide = PeptideBuilder.PeptideFromString("GG"); var firstAminoAcid = peptide.AminoAcids.First(); var lastAminoAcid = peptide.AminoAcids.Last(); PdbAminoAcidAtomNamer.AssignNames(firstAminoAcid); PdbAminoAcidAtomNamer.AssignNames(lastAminoAcid); var N1 = firstAminoAcid.GetAtomFromName("N"); var Ca1 = firstAminoAcid.GetAtomFromName("CA"); var C1 = firstAminoAcid.GetAtomFromName("C"); var N2 = lastAminoAcid.GetAtomFromName("N"); var Ca2 = lastAminoAcid.GetAtomFromName("CA"); var C2 = lastAminoAcid.GetAtomFromName("C"); N1.Position = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 0, 0, 0); N1.IsPositionFixed = true; Ca1.Position = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 100, 0, 0); Ca1.IsPositionFixed = true; C1.Position = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 100, 100, 0); C1.IsPositionFixed = true; N2.Position = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 100, 100, 100); N2.IsPositionFixed = true; Ca2.Position = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 200, 100, 100); Ca2.IsPositionFixed = true; C2.Position = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 200, 200, 100); C2.IsPositionFixed = true; var measurements = AminoAcidAngleMeasurer.MeasureAngles(peptide); Assert.That(measurements.ContainsKey(firstAminoAcid)); Assert.That(measurements.ContainsKey(lastAminoAcid)); var firstAngles = measurements[firstAminoAcid]; var lastAngles = measurements[lastAminoAcid]; Assert.That(firstAngles.Omega, Is.Null); Assert.That(firstAngles.Phi, Is.Null); Assert.That(firstAngles.Psi, Is.Not.Null); Assert.That(firstAngles.Psi.In(Unit.Degree), Is.EqualTo(90)); Assert.That(lastAngles.Omega, Is.Not.Null); Assert.That(lastAngles.Omega.In(Unit.Degree), Is.EqualTo(90)); }
private static Dictionary <AminoAcidReference, AminoAcidAngles> MeasureDihedralAngles(string pdbFilename) { var result = PdbReader.ReadFile(pdbFilename); var angleMeasurements = new Dictionary <AminoAcidReference, AminoAcidAngles>(); foreach (var chain in result.Models.First().Chains) { var angleMeasurement = AminoAcidAngleMeasurer.MeasureAngles(chain); foreach (var kvp in angleMeasurement) { angleMeasurements.Add(kvp.Key, kvp.Value); } } return(angleMeasurements); }
public void AminoAcidPositioningTest() { var aminoAcid1 = new ApproximatedAminoAcid(AminoAcidName.Glycine, 1) { OmegaAngle = 0.To(Unit.Degree), PhiAngle = 0.To(Unit.Degree), PsiAngle = -120.To(Unit.Degree) }; var aminoAcid2 = new ApproximatedAminoAcid(AminoAcidName.Glycine, 2) { OmegaAngle = 10.To(Unit.Degree), PhiAngle = -70.To(Unit.Degree), PsiAngle = 0.To(Unit.Degree) }; var peptide = new ApproximatePeptide(new [] { aminoAcid1, aminoAcid2 }); var angles = AminoAcidAngleMeasurer.MeasureAngles(peptide); var aminoAcid1Angles = angles[aminoAcid1]; var aminoAcid2Angles = angles[aminoAcid2]; Assert.That(aminoAcid1Angles.Psi.In(Unit.Radians), Is.EqualTo(aminoAcid1.PsiAngle.In(Unit.Radians)).Within(1e-9)); Assert.That(aminoAcid2Angles.Omega.In(Unit.Radians), Is.EqualTo(aminoAcid2.OmegaAngle.In(Unit.Radians)).Within(1e-9)); Assert.That(aminoAcid2Angles.Phi.In(Unit.Radians), Is.EqualTo(aminoAcid2.PhiAngle.In(Unit.Radians)).Within(1e-9)); }
public void CarbonAlphaDistancesMatchRealMeasurements() { var aminoAcid1 = new ApproximatedAminoAcid(AminoAcidName.Valine, 90) { OmegaAngle = 179.9.To(Unit.Degree), PhiAngle = -35.9.To(Unit.Degree), PsiAngle = -52.0.To(Unit.Degree) }; var aminoAcid2 = new ApproximatedAminoAcid(AminoAcidName.Alanine, 91) { OmegaAngle = 179.9.To(Unit.Degree), PhiAngle = -63.5.To(Unit.Degree), PsiAngle = -59.7.To(Unit.Degree) }; var peptide = new[] { aminoAcid1, aminoAcid2 }; ApproximateAminoAcidPositioner.Position(peptide, new UnitPoint3D(Unit.Meter, 0, 0, 0)); var carbonAlphaCarbonDistance = aminoAcid1.CarbonAlphaPosition .DistanceTo(aminoAcid1.CarbonPosition); Assert.That(carbonAlphaCarbonDistance.In(SIPrefix.Pico, Unit.Meter), Is.EqualTo(154).Within(0.1)); var carbonNitrogenDistance = aminoAcid1.CarbonPosition .DistanceTo(aminoAcid2.NitrogenPosition); Assert.That(carbonNitrogenDistance.In(SIPrefix.Pico, Unit.Meter), Is.EqualTo(152).Within(0.1)); var aminoAcidAngles = AminoAcidAngleMeasurer.MeasureAngles(new ApproximatePeptide(peptide)); Assert.That(aminoAcidAngles[aminoAcid1].Psi.Value - aminoAcid1.PsiAngle.Value, Is.EqualTo(0).Within(0.1)); Assert.That(aminoAcidAngles[aminoAcid2].Phi.Value - aminoAcid2.PhiAngle.Value, Is.EqualTo(0).Within(0.1)); // The bond length vary because we use theoretical bond length, which do not exactly match real bond lengths //Assert.That( // aminoAcid1.CarbonAlphaPosition.DistanceTo(aminoAcid2.CarbonAlphaPosition).In(SIPrefix.Pico, Unit.Meter), // Is.EqualTo(380.3).Within(0.1)); }
public void AtomPositionsAsExpected() { var aminoAcid1 = new ApproximatedAminoAcid(AminoAcidName.Valine, 90) { OmegaAngle = 45.To(Unit.Degree), PhiAngle = -60.To(Unit.Degree), PsiAngle = 90.To(Unit.Degree) }; var aminoAcid2 = new ApproximatedAminoAcid(AminoAcidName.Alanine, 91) { OmegaAngle = 0.To(Unit.Degree), PhiAngle = -90.To(Unit.Degree), PsiAngle = 90.To(Unit.Degree) }; var peptide = new ApproximatePeptide(new[] { aminoAcid1, aminoAcid2 }); ApproximateAminoAcidPositioner.Position(peptide.AminoAcids, new UnitPoint3D(Unit.Meter, 0, 0, 0)); var angles = AminoAcidAngleMeasurer.MeasureAngles(peptide); Assert.That(angles[aminoAcid1].Psi.In(Unit.Degree), Is.EqualTo(aminoAcid1.PsiAngle.In(Unit.Degree)).Within(1)); Assert.That(angles[aminoAcid2].Omega.In(Unit.Degree), Is.EqualTo(aminoAcid2.OmegaAngle.In(Unit.Degree)).Within(1)); Assert.That(angles[aminoAcid2].Phi.In(Unit.Degree), Is.EqualTo(aminoAcid2.PhiAngle.In(Unit.Degree)).Within(1)); //Assert.That( // aminoAcid1.NitrogenPosition.DistanceTo(new UnitPoint3D(Unit.Meter, 0, 0, 0)).In(SIPrefix.Pico, Unit.Meter), // Is.EqualTo(0).Within(1e-3)); //Assert.That( // aminoAcid1.CarbonAlphaPosition.DistanceTo(new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 152, 0, 0)).In(SIPrefix.Pico, Unit.Meter), // Is.EqualTo(0).Within(1e-3)); //Assert.That( // aminoAcid1.CarbonPosition.DistanceTo(new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 152, 154, 0)).In(SIPrefix.Pico, Unit.Meter), // Is.EqualTo(0).Within(1e-3)); //Assert.That( // aminoAcid2.NitrogenPosition.DistanceTo(new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 152, 154, 152)).In(SIPrefix.Pico, Unit.Meter), // Is.EqualTo(0).Within(1e-3)); }