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)); }
public void VolumeAsExpected() { var aa1 = new ApproximatedAminoAcid(AminoAcidName.Alanine, 1); var aa2 = new ApproximatedAminoAcid(AminoAcidName.Alanine, 2); var aa3 = new ApproximatedAminoAcid(AminoAcidName.Alanine, 3); var peptide = new ApproximatePeptide(new List <ApproximatedAminoAcid> { aa1, aa2, aa3 }); // Set positions aa1.NitrogenPosition = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 0, 0, 0); aa1.CarbonAlphaPosition = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 1, 0, 0); aa1.CarbonPosition = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 1, 1, 0); aa2.NitrogenPosition = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 0, 1, 0); aa2.CarbonAlphaPosition = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 0, 1, 1); aa2.CarbonPosition = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 1, 1, 1); aa3.NitrogenPosition = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 1, 0, 1); aa3.CarbonAlphaPosition = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 0, 0, 1); aa3.CarbonPosition = new UnitPoint3D(SIPrefix.Pico, Unit.Meter, 0.5, 0.5, 0.5); var result = CompactnessMeasurer.Measure(peptide); var volume = result.Volume.Value; var picoMultiplier = SIPrefix.Pico.GetMultiplier(); var cubicPicoMultiplier = picoMultiplier * picoMultiplier * picoMultiplier; Assert.That(volume / cubicPicoMultiplier, Is.EqualTo(1).Within(1e-6)); }
public SimulationTimestepCompleteEventArgs(UnitValue t, ApproximatePeptide peptide) : this(t) { PeptideCopy = peptide.DeepClone(); Atoms = AtomExtractor.FromApproximatePeptide(peptide); Atoms.ForEach(atom => atom.IsBackbone = true); }
public static CompactnessMeasurerResult Measure(ApproximatePeptide peptide) { var vertices = ToVertices(peptide.AminoAcids); var convexHull = ConvexHull.Create(vertices); var volume = CalculateVolume(convexHull.Result); var convexHullGraph = ToGraph(convexHull.Result); return(new CompactnessMeasurerResult(volume, convexHullGraph)); }
public ApproximatePeptide Simulate( IList <AminoAcidName> aminoAcidSequence, MultiLevelGrowingFoldingSimulatorSettings settings) { var peptide = new ApproximatePeptide(); var aminoAcidStack = new Stack <AminoAcidName>(aminoAcidSequence.Reverse()); // See MultiLevelGrowingFoldingSimulatorStudy.StackInit RecursiveAddAndPositionNewAminoAcid(peptide, aminoAcidStack, settings); FoldSecondaryStructure(peptide); return(peptide); }
public static ApproximatePeptideFoldingSimulator Create(ApproximatePeptide peptide, ApproximatePeptideSimulationSettings simulationSettings, string ramachadranDataDirectory) { var compactnessForceCalculator = new CompactingForceCalculator(); var ramachandranPlotDistributionSource = new RamachandranPlotGradientDistributionFileSource(ramachadranDataDirectory); var ramachadranForceCalculator = new RamachandranForceCalculator(ramachandranPlotDistributionSource); var bondForceCalculator = new BondForceCalculator(); return(new ApproximatePeptideFoldingSimulator(peptide, simulationSettings, compactnessForceCalculator, ramachadranForceCalculator, bondForceCalculator)); }
public ApproximatePeptideFoldingSimulator(ApproximatePeptide peptide, ApproximatePeptideSimulationSettings simulationSettings, CompactingForceCalculator compactnessForceCalculator, RamachandranForceCalculator ramachandranForceCalculator, BondForceCalculator bondForceCalculator) { this.simulationSettings = simulationSettings; this.compactnessForceCalculator = compactnessForceCalculator; this.ramachandranForceCalculator = ramachandranForceCalculator; this.bondForceCalculator = bondForceCalculator; Peptide = peptide; if (peptide.AminoAcids.Count <= 3) { simulationSettings.UseCompactingForce = false; // Cannot be done } }
private void RecursiveAddAndPositionNewAminoAcid( ApproximatePeptide peptide, Stack <AminoAcidName> aminoAcidQueue, MultiLevelGrowingFoldingSimulatorSettings settings) { var aminoAcidName = aminoAcidQueue.Pop(); var lastAminoAcid = peptide.AminoAcids.LastOrDefault(); var lastPosition = lastAminoAcid?.CarbonAlphaPosition ?? new UnitPoint3D(Unit.Meter, 0, 0, 0); var influencingAminoAcids = peptide.AminoAcids .Where(x => x.CarbonAlphaPosition.DistanceTo(lastPosition) < settings.InfluenceHorizont) .ToList(); var ramachandranPlot = ramachandranPlotSource.Get(aminoAcidName); var sequenceNumber = lastAminoAcid?.SequenceNumber + 1 ?? 0; var isTimeForSecondaryStructureFolding = sequenceNumber % settings.SecondaryStructureFoldingFrequency == 0; if (isTimeForSecondaryStructureFolding) { FoldSecondaryStructure(peptide); } var remainingPositionAttempts = settings.PositioningAttempts; do { try { var aminoAcid = new ApproximatedAminoAcid(aminoAcidName, sequenceNumber); PositionAminoAcid(aminoAcid, lastAminoAcid, ramachandranPlot, influencingAminoAcids, settings); peptide.Add(aminoAcid); RecursiveAddAndPositionNewAminoAcid(peptide, aminoAcidQueue, settings); return; } catch (AminoAcidCannotBePositionedException) { remainingPositionAttempts--; } } while (remainingPositionAttempts > 0); aminoAcidQueue.Push(aminoAcidName); throw new AminoAcidCannotBePositionedException(aminoAcidName, sequenceNumber); }
public static List <Atom> FromApproximatePeptide(ApproximatePeptide peptide) { var atoms = new List <Atom>(); foreach (var aminoAcid in peptide.AminoAcids) { var nitrogenAtom = Atom.FromStableIsotope(ElementName.Nitrogen); nitrogenAtom.Position = aminoAcid.NitrogenPosition; var carbonAlphaAtom = Atom.FromStableIsotope(ElementName.Carbon); carbonAlphaAtom.Position = aminoAcid.CarbonAlphaPosition; var carbonAtom = Atom.FromStableIsotope(ElementName.Carbon); carbonAtom.Position = aminoAcid.CarbonPosition; atoms.Add(nitrogenAtom); atoms.Add(carbonAlphaAtom); atoms.Add(carbonAtom); } return(atoms); }
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 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)); }
public Dictionary <ApproximatedAminoAcid, ApproximateAminoAcidForces> Calculate(ApproximatePeptide peptide) { // VALIDATED: Forces point in the right direction and restore expected bond length var bondForces = peptide.AminoAcids.ToDictionary(aa => aa, aa => new ApproximateAminoAcidForces()); for (var aminoAcidIdx = 0; aminoAcidIdx < peptide.AminoAcids.Count; aminoAcidIdx++) { var aminoAcid = peptide.AminoAcids[aminoAcidIdx]; var previousAminoAcid = aminoAcidIdx > 0 ? peptide.AminoAcids[aminoAcidIdx - 1] : null; CalculateBondLengthForces(previousAminoAcid, aminoAcid, bondForces); CalculateBondAngleForces(previousAminoAcid, aminoAcid, bondForces); } return(bondForces); }
public ApproximatePeptideCompleter(ApproximatePeptide approximatePeptide) { this.approximatePeptide = approximatePeptide; }
private void FoldSecondaryStructure(ApproximatePeptide peptide) { // Do nothing for now }
public static Dictionary <ApproximatedAminoAcid, AminoAcidAngles> MeasureAngles(ApproximatePeptide peptide) { var measurements = new Dictionary <ApproximatedAminoAcid, AminoAcidAngles>(); AminoAcidAngles lastAngles = null; UnitPoint3D lastNitrogenPosition = null; UnitPoint3D lastCarbonAlphaPosition = null; UnitPoint3D lastCarbonPosition = null; foreach (var aminoAcid in peptide.AminoAcids) { var nitrogenPosition = aminoAcid.NitrogenPosition; var carbonAlphaPosition = aminoAcid.CarbonAlphaPosition; var carbonPosition = aminoAcid.CarbonPosition; if (lastAngles != null && lastNitrogenPosition != null && lastCarbonAlphaPosition != null && lastCarbonPosition != null && nitrogenPosition != null) { var psi = DihedralAngleCalculator.Calculate( lastNitrogenPosition, lastCarbonAlphaPosition, lastCarbonPosition, nitrogenPosition); lastAngles.Psi = psi; } UnitValue omega = null; if (lastCarbonAlphaPosition != null && lastCarbonPosition != null && nitrogenPosition != null && carbonAlphaPosition != null) { omega = DihedralAngleCalculator.Calculate( lastCarbonAlphaPosition, lastCarbonPosition, nitrogenPosition, carbonAlphaPosition); } UnitValue phi = null; if (lastCarbonPosition != null && nitrogenPosition != null && carbonAlphaPosition != null && carbonPosition != null) { phi = DihedralAngleCalculator.Calculate( lastCarbonPosition, nitrogenPosition, carbonAlphaPosition, carbonPosition); } var angles = new AminoAcidAngles { Omega = omega, Phi = phi }; measurements.Add(aminoAcid, angles); lastNitrogenPosition = nitrogenPosition; lastCarbonAlphaPosition = carbonAlphaPosition; lastCarbonPosition = carbonPosition; lastAngles = angles; } return(measurements); }
/// <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); }