Example #1
0
        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));
        }
Example #2
0
        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));
        }
Example #4
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));
        }
Example #7
0
        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);
        }
Example #8
0
        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));
        }
Example #9
0
        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));
        }
Example #10
0
        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));
        }