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));
        }
Ejemplo n.º 2
0
        public void PhiPsiVectorPointingTowardTarget(double phi, double psi,
                                                     double expectedPhiComponent, double expectedPsiComponent)
        {
            var targetPhi = 30.To(Unit.Degree);
            var targetPsi = -10.To(Unit.Degree);

            var sut = new RamachandranPlotFixedDistribution(AminoAcidName.Alanine,
                                                            new UnitPoint2D(targetPhi, targetPsi));
            var actual = sut.GetPhiPsiVector(phi.To(Unit.Degree), psi.To(Unit.Degree));

            Assert.That(actual.In(Unit.Degree).X, Is.EqualTo(expectedPhiComponent).Within(1));
            Assert.That(actual.In(Unit.Degree).Y, Is.EqualTo(expectedPsiComponent).Within(1));
        }
        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()));
        }