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); }
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)); }
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 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()}")); } }
public void UpdatePositions() { ApproximateAminoAcidPositioner.Position(AminoAcids, new UnitPoint3D(Unit.Meter, 0, 0, 0)); }