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));
        }
Пример #2
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);
 }
Пример #4
0
        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));
        }
Пример #7
0
        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);
        }
Пример #9
0
        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);
        }
Пример #10
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));
        }
Пример #11
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));
        }
Пример #12
0
        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);
        }
Пример #13
0
 public ApproximatePeptideCompleter(ApproximatePeptide approximatePeptide)
 {
     this.approximatePeptide = approximatePeptide;
 }
 private void FoldSecondaryStructure(ApproximatePeptide peptide)
 {
     // Do nothing for now
 }
Пример #15
0
        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);
        }
Пример #16
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);
        }