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;
            }
        }
Exemple #12
0
 public static Point3D In(this UnitPoint3D unitPoint, IUnitDefinition targetUnit)
 {
     return(unitPoint.In(SIPrefix.None, targetUnit));
 }
Exemple #13
0
        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);
        }
Exemple #14
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);
        }