public static UnitPoint3D CalculateAtomPosition(UnitPoint3D currentPosition, Vector vector1, Vector vector2, UnitValue bondLength, UnitValue bondAngle, UnitValue bondTorsion) { // Spherical coordinates var polarAngle = 180.To(Unit.Degree) - bondAngle; var azimuthAngle = bondTorsion; var atomCentricX = Math.Sin(polarAngle.In(Unit.Radians)) * Math.Cos(azimuthAngle.In(Unit.Radians)); var atomCentricY = Math.Sin(polarAngle.In(Unit.Radians)) * Math.Sin(azimuthAngle.In(Unit.Radians)); var atomCentricZ = Math.Cos(polarAngle.In(Unit.Radians)); var atomicBondVector = new Vector3D(atomCentricX, atomCentricY, atomCentricZ); var zAxis = vector1.Normalize().ToVector3D(); var xAxis = -(vector2 - vector2.ProjectOnto(zAxis)).Normalize().ToVector3D(); var yAxis = zAxis.CrossProduct(xAxis); var transformMatrix = new Matrix3X3(); transformMatrix.SetColumn(0, xAxis.Data); transformMatrix.SetColumn(1, yAxis.Data); transformMatrix.SetColumn(2, zAxis.Data); var bondVector = new Vector3D(transformMatrix.Data.Multiply(atomicBondVector.Data.ConvertToMatrix()).Vectorize()); var atomPosition = currentPosition + bondLength * bondVector; return(atomPosition); }
public static Point3D In(this UnitPoint3D unitPoint, CompoundUnit targetUnit) { var multiplier = new UnitValue(unitPoint.Unit, 1).In(targetUnit); return(new Point3D( multiplier * unitPoint.X, multiplier * unitPoint.Y, multiplier * unitPoint.Z)); }
public static Point3D In(this UnitPoint3D unitPoint, SIPrefix targetSIPrefix, IUnitDefinition targetUnit) { var multiplier = new UnitValue(unitPoint.Unit, 1).In(targetSIPrefix, targetUnit); return(new Point3D( multiplier * unitPoint.X, multiplier * unitPoint.Y, multiplier * unitPoint.Z)); }
public static void Position(IList <ApproximatedAminoAcid> aminoAcids, UnitPoint3D startPosition) { ApproximatedAminoAcid lastAminoAcid = null; foreach (var aminoAcid in aminoAcids) { PositionAminoAcid(aminoAcid, lastAminoAcid, startPosition); lastAminoAcid = aminoAcid; } }
private UnitPoint3D CalculateCenter(List <ApproximatedAminoAcid> aminoAcids) { var center = new UnitPoint3D(Unit.Meter, 0, 0, 0); foreach (var aminoAcid in aminoAcids) { center += aminoAcid.CarbonAlphaPosition; } return((1.0 / aminoAcids.Count) * center); }
private static bool CollidesWithExistingPositions(UnitPoint3D position, List <Point3D> otherPositions, out UnitValue distanceToClosest) { var positionInPicoMeter = position.In(SIPrefix.Pico, Unit.Meter); var closestOther = otherPositions .Take(otherPositions.Count - 1) .MinimumItem(p => p.DistanceTo(positionInPicoMeter)); var distance = closestOther.DistanceTo(positionInPicoMeter); distanceToClosest = distance.To(SIPrefix.Pico, Unit.Meter); return(distance < 390); }
private UnitVector3D CalculateBondLengthForce(UnitPoint3D atom1Position, UnitPoint3D atom2Position, UnitValue equilibriumBondLength) { // Settings const double BondSpringConstant = 1e4; var atomDistance = atom1Position.DistanceTo(atom2Position); var deviationFromEquilibrium = atomDistance - equilibriumBondLength; var forceMagnitude = (BondSpringConstant * deviationFromEquilibrium.In(Unit.Meter)).To(Unit.Newton); var forceDirection = atom1Position.VectorTo(atom2Position).Normalize().ToVector3D(); return(forceMagnitude * forceDirection); }
public static UnitVector3D VectorTo(this UnitPoint3D unitPoint1, UnitPoint3D unitPoint2) { #if CHECK_UNITS if (unitPoint1.Unit != unitPoint2.Unit) { throw new InvalidOperationException($"Cannot calculate vector between points with different units, got {unitPoint1.Unit} and {unitPoint2.Unit}"); } #endif var commonUnit = unitPoint1.Unit; var vector = unitPoint1.VectorTo((Point3D)unitPoint2); return(vector.To(commonUnit)); }
public static UnitValue DistanceTo(this UnitPoint3D unitPoint1, UnitPoint3D unitPoint2) { #if CHECK_UNITS if (unitPoint1.Unit != unitPoint2.Unit) { throw new InvalidOperationException($"Cannot calculate distance between points with different units, got {unitPoint1.Unit} and {unitPoint2.Unit}"); } #endif var commonUnit = unitPoint1.Unit; var distance = unitPoint1.DistanceTo((Point3D)unitPoint2); return(distance.To(commonUnit)); }
public static UnitValue Calculate(UnitPoint3D point1, UnitPoint3D point2, UnitPoint3D point3, UnitPoint3D point4) { var vector1 = point1.VectorTo(point2).Normalize().ToVector3D(); var vector2 = point2.VectorTo(point3).Normalize().ToVector3D(); var vector3 = point3.VectorTo(point4).Normalize().ToVector3D(); var plane12Normal = vector1.CrossProduct(vector2); var plane23Normal = vector2.CrossProduct(vector3); var angle = plane12Normal.AngleWith(plane23Normal); var sign = vector3.DotProduct(plane12Normal) > 0 ? 1 : -1; return(sign * angle); }
public static void PositionAminoAcid(ApproximatedAminoAcid aminoAcid, ApproximatedAminoAcid lastAminoAcid = null, UnitPoint3D startPosition = null) { if (lastAminoAcid == null && startPosition == null) { throw new ArgumentNullException("Either last amino acid or start position must be non-null"); } var nitrogenCarbonDistance = PeriodicTable.GetCovalentRadius(ElementName.Nitrogen) + PeriodicTable.GetCovalentRadius(ElementName.Carbon); var CaCDistance = 2 * PeriodicTable.GetCovalentRadius(ElementName.Carbon); UnitPoint3D carbonPosition; UnitPoint3D carbonAlphaPosition; Vector3D carbonAlphaCarbonBondDirection; Vector3D nitrogenCarbonAlphaBondDirection; if (lastAminoAcid == null) { carbonPosition = startPosition; carbonAlphaPosition = startPosition + new UnitPoint3D(SIPrefix.Pico, Unit.Meter, -CaCDistance.In(SIPrefix.Pico, Unit.Meter), 0, 0); carbonAlphaCarbonBondDirection = carbonAlphaPosition.VectorTo(carbonPosition); nitrogenCarbonAlphaBondDirection = new Vector3D(0, 1, 0); } else { carbonPosition = lastAminoAcid.CarbonPosition; carbonAlphaPosition = lastAminoAcid.CarbonAlphaPosition; carbonAlphaCarbonBondDirection = carbonAlphaPosition .VectorTo(carbonPosition); nitrogenCarbonAlphaBondDirection = lastAminoAcid.NitrogenPosition .VectorTo(carbonAlphaPosition); } var omega = aminoAcid.OmegaAngle ?? Math.PI.To(Unit.Radians); var phi = aminoAcid.PhiAngle ?? 0.To(Unit.Radians); var psi = lastAminoAcid?.PsiAngle ?? 0.To(Unit.Radians); var nitrogenPosition = CalculateAtomPosition(carbonPosition, carbonAlphaCarbonBondDirection, nitrogenCarbonAlphaBondDirection, nitrogenCarbonDistance, AminoAcidBondAngles.CaCNAngle, psi); carbonAlphaPosition = CalculateAtomPosition(nitrogenPosition, carbonPosition.VectorTo(nitrogenPosition), carbonAlphaCarbonBondDirection, nitrogenCarbonDistance, AminoAcidBondAngles.CNCaAngle, omega); carbonPosition = CalculateAtomPosition(carbonAlphaPosition, nitrogenPosition.VectorTo(carbonAlphaPosition), carbonPosition.VectorTo(nitrogenPosition), CaCDistance, AminoAcidBondAngles.NCaCAngle, phi); aminoAcid.NitrogenPosition = nitrogenPosition; aminoAcid.CarbonAlphaPosition = carbonAlphaPosition; aminoAcid.CarbonPosition = carbonPosition; if (aminoAcid.OmegaAngle == null) { aminoAcid.OmegaAngle = omega; } if (aminoAcid.PhiAngle == null) { aminoAcid.PhiAngle = phi; } if (lastAminoAcid != null && lastAminoAcid.PsiAngle == null) { lastAminoAcid.PsiAngle = psi; } }
public static Point3D In(this UnitPoint3D unitPoint, IUnitDefinition targetUnit) { return(unitPoint.In(SIPrefix.None, targetUnit)); }
public static Dictionary <AminoAcidReference, AminoAcidAngles> MeasureAngles(Peptide peptide) { var measurements = new Dictionary <AminoAcidReference, AminoAcidAngles>(); AminoAcidAngles lastAngles = null; UnitPoint3D lastNitrogenPosition = null; UnitPoint3D lastCarbonAlphaPosition = null; UnitPoint3D lastCarbonPosition = null; 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 nitrogenPosition = nitrogen != null && nitrogen.IsPositionFixed ? nitrogen.Position : null; var carbonAlphaPosition = carbonAlpha != null && carbonAlpha.IsPositionFixed ? carbonAlpha.Position : null; var carbonPosition = carbon != null && carbon.IsPositionFixed ? carbon.Position : null; 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); }
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); }