private void PositionAminoAcid(
            ApproximatedAminoAcid aminoAcid,
            ApproximatedAminoAcid lastAminoAcid,
            RamachandranPlot ramachandranPlot,
            List <ApproximatedAminoAcid> influencingAminoAcids,
            MultiLevelGrowingFoldingSimulatorSettings settings)
        {
            var influencingCenter = CalculateCenter(influencingAminoAcids);

            var positionAttempt = 1;

            do
            {
                var aminoAcidAngles = ramachandranPlot.GetRandomPhiPsi();
                aminoAcid.OmegaAngle = aminoAcidAngles.Omega;
                aminoAcid.PhiAngle   = aminoAcidAngles.Phi;
                aminoAcid.PsiAngle   = aminoAcidAngles.Psi;
                ApproximateAminoAcidPositioner.PositionAminoAcid(aminoAcid, lastAminoAcid, new UnitPoint3D(Unit.Meter, 0, 0, 0));

                // Note: Clashing distance was determined using MultiLevelGrowingFoldingSimulatorStudy.MeasureAverageAminoAcidDistance
                var isClashingWithAnyInfluencingAminoAcid = influencingAminoAcids
                                                            .Any(otherAminoAcid => otherAminoAcid.CarbonAlphaPosition.DistanceTo(aminoAcid.CarbonAlphaPosition).In(SIPrefix.Nano, Unit.Meter) < 1.0);
                if (isClashingWithAnyInfluencingAminoAcid)
                {
                    positionAttempt++;
                    continue;
                }

                if (lastAminoAcid != null && influencingAminoAcids.Count > 0)
                {
                    var isTooFarAway = aminoAcid.CarbonAlphaPosition.DistanceTo(influencingCenter) > lastAminoAcid.CarbonAlphaPosition.DistanceTo(influencingCenter) &&
                                       aminoAcid.CarbonAlphaPosition.DistanceTo(influencingCenter) > 0.8 * settings.InfluenceHorizont;
                    if (isTooFarAway)
                    {
                        positionAttempt++;
                        continue;
                    }
                }
                return;
            } while (positionAttempt < settings.PositioningAttempts);

            throw new AminoAcidCannotBePositionedException(aminoAcid.Name, aminoAcid.SequenceNumber);
        }
Exemplo n.º 2
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));
        }
Exemplo n.º 3
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));
        }
Exemplo n.º 4
0
        public void GenerateProteins()
        {
            var angleInverseDistributions = LoadInverseAngleDistributions();
            var pdbId                  = "1a2b";
            var aminoAcidSequence      = ReadAminoAcidSequenceFromPositionFile($@"G:\Projects\HumanGenome\Protein-PDBs\HumanProteins\AminoAcidPositions\pdb{pdbId}_model000.csv");
            var distanceMapsDirectory  = @"G:\Projects\HumanGenome\generatedProteins\DistanceMaps";
            var positionFilesDirectory = @"G:\Projects\HumanGenome\generatedProteins\PositionFiles";
            var distanceMean           = 380;
            var distanceSigma          = 4;

            var iterations = 1000;

            for (int iteration = 0; iteration < iterations; iteration++)
            {
                var aminoAcidPositions = new List <Point3D> {
                    new Point3D(0, 0, 0)
                };
                var lastAminoAcidLetter = aminoAcidSequence[0];
                for (var aminoAcidIdx = 1; aminoAcidIdx < aminoAcidSequence.Count; aminoAcidIdx++)
                {
                    var aminoAcidLetter = aminoAcidSequence[aminoAcidIdx];
                    var distance        = StaticRandom.NextGaussian(distanceMean, distanceSigma);
                    if (aminoAcidPositions.Count < 2)
                    {
                        aminoAcidPositions.Add(new Point3D(distance, 0, 0));
                        lastAminoAcidLetter = aminoAcidLetter;
                        continue;
                    }

                    var angleInverseDistribution = angleInverseDistributions[lastAminoAcidLetter];
                    var angleInRadians           = angleInverseDistribution.ValueAtX(StaticRandom.Rng.NextDouble());
                    var lastPosition             = aminoAcidPositions.Last().To(SIPrefix.Pico, Unit.Meter);
                    var vector1 = aminoAcidPositions[aminoAcidIdx - 2].VectorTo(aminoAcidPositions[aminoAcidIdx - 1]);
                    var vector2 = aminoAcidIdx >= 3
                        ? aminoAcidPositions[aminoAcidIdx - 3].VectorTo(aminoAcidPositions[aminoAcidIdx - 2])
                        : new Vector3D(0, 1, 0);
                    var bestPositionedPoint = ApproximateAminoAcidPositioner.CalculateAtomPosition(
                        lastPosition,
                        vector1,
                        vector2,
                        distance.To(SIPrefix.Pico, Unit.Meter),
                        angleInRadians.To(Unit.Radians),
                        (2 * Math.PI * (StaticRandom.Rng.NextDouble() - 0.5)).To(Unit.Radians));
                    var       isColliding           = CollidesWithExistingPositions(bestPositionedPoint, aminoAcidPositions, out var distanceToClosest);
                    var       bestDistanceToClosest = distanceToClosest;
                    const int MaxPositionIterations = 3;
                    var       positionIteration     = 0;
                    while (isColliding && positionIteration < MaxPositionIterations)
                    {
                        positionIteration++;
                        var pointCandidate = ApproximateAminoAcidPositioner.CalculateAtomPosition(
                            lastPosition,
                            vector1,
                            vector2,
                            distance.To(SIPrefix.Pico, Unit.Meter),
                            angleInRadians.To(Unit.Radians),
                            (2 * Math.PI * (StaticRandom.Rng.NextDouble() - 0.5)).To(Unit.Radians));
                        isColliding = CollidesWithExistingPositions(bestPositionedPoint, aminoAcidPositions, out distanceToClosest);
                        if (!isColliding)
                        {
                            bestPositionedPoint = pointCandidate;
                            break;
                        }
                        if (distanceToClosest > bestDistanceToClosest)
                        {
                            bestPositionedPoint   = pointCandidate;
                            bestDistanceToClosest = distanceToClosest;
                        }
                    }
                    aminoAcidPositions.Add(bestPositionedPoint.In(SIPrefix.Pico, Unit.Meter));

                    lastAminoAcidLetter = aminoAcidLetter;
                }

                var filenameBase = $"pdb{pdbId}_gen{iteration}";
                var distanceMap  = DistanceMapGenerator.Generate(aminoAcidPositions);
                distanceMap.Save(Path.Combine(distanceMapsDirectory, filenameBase + ".png"));
                File.WriteAllLines(
                    Path.Combine(positionFilesDirectory, filenameBase + ".csv"),
                    Enumerable.Range(0, aminoAcidSequence.Count)
                    .Select(idx => $"{aminoAcidSequence[idx]};{aminoAcidPositions[idx].ToString()}"));
            }
        }
Exemplo n.º 5
0
 public void UpdatePositions()
 {
     ApproximateAminoAcidPositioner.Position(AminoAcids, new UnitPoint3D(Unit.Meter, 0, 0, 0));
 }