private void AddForce(ApproximateAminoAcidForces aminoAcidForces, Vector3D forceDirection, double forceMagnitude)
        {
            var force = forceMagnitude * forceDirection.To(Unit.Newton);

            aminoAcidForces.NitrogenForce    += force;
            aminoAcidForces.CarbonAlphaForce += force;
            aminoAcidForces.CarbonForce      += force;
        }
Exemple #2
0
        private void ApplyForce(ApproximatedAminoAcid aminoAcid,
                                ApproximateAminoAcidForces resultingForces,
                                UnitValue timeStepSize,
                                UnitValue reservoirTemperature)
        {
            var scaling                = 1e0;
            var nitrogenForce          = scaling * resultingForces.NitrogenForce;
            var nitrogenMass           = PeriodicTable.GetSingleAtomMass(ElementName.Nitrogen);
            var nitrogenAcceleration   = nitrogenForce / nitrogenMass;
            var nitrogenVelocityChange = nitrogenAcceleration * timeStepSize;

            aminoAcid.NitrogenVelocity += nitrogenVelocityChange;
            aminoAcid.NitrogenVelocity  = InteractWithReservoir(aminoAcid.NitrogenVelocity, nitrogenMass, reservoirTemperature);
            aminoAcid.NitrogenPosition += aminoAcid.NitrogenVelocity * timeStepSize;
            if (simulationSettings.ResetAtomVelocityAfterEachTimestep)
            {
                aminoAcid.NitrogenVelocity = new UnitVector3D(Unit.MetersPerSecond, 0, 0, 0);
            }

            var carbonAlphaForce          = scaling * resultingForces.CarbonAlphaForce;
            var carbonAlphaMass           = PeriodicTable.GetSingleAtomMass(ElementName.Carbon) + AminoAcidSideChainMassLookup.SideChainMasses[aminoAcid.Name];
            var carbonAlphaAcceleration   = carbonAlphaForce / carbonAlphaMass;
            var carbonAlphaVelocityChange = carbonAlphaAcceleration * timeStepSize;

            aminoAcid.CarbonAlphaVelocity += carbonAlphaVelocityChange;
            aminoAcid.CarbonAlphaVelocity  = InteractWithReservoir(aminoAcid.CarbonAlphaVelocity, carbonAlphaMass, reservoirTemperature);
            aminoAcid.CarbonAlphaPosition += aminoAcid.CarbonAlphaVelocity * timeStepSize;
            if (simulationSettings.ResetAtomVelocityAfterEachTimestep)
            {
                aminoAcid.CarbonAlphaVelocity = new UnitVector3D(Unit.MetersPerSecond, 0, 0, 0);
            }

            var carbonForce          = scaling * resultingForces.CarbonForce;
            var carbonMass           = PeriodicTable.GetSingleAtomMass(ElementName.Carbon);
            var carbonAcceleration   = carbonForce / carbonMass;
            var carbonVelocityChange = carbonAcceleration * timeStepSize;

            aminoAcid.CarbonVelocity += carbonVelocityChange;
            aminoAcid.CarbonVelocity  = InteractWithReservoir(aminoAcid.CarbonVelocity, carbonMass, reservoirTemperature);
            aminoAcid.CarbonPosition += aminoAcid.CarbonVelocity * timeStepSize;
            if (simulationSettings.ResetAtomVelocityAfterEachTimestep)
            {
                aminoAcid.CarbonVelocity = new UnitVector3D(Unit.MetersPerSecond, 0, 0, 0);
            }
        }
Exemple #3
0
        private void RunSimulation(CancellationToken cancellationToken)
        {
            var simulationTime = simulationSettings.SimulationTime;
            var dT             = simulationSettings.TimeStep;

            for (CurrentTime = 0.To(Unit.Second); CurrentTime < simulationTime; CurrentTime += dT)
            {
                cancellationToken.ThrowIfCancellationRequested();

                var compactnessForces = simulationSettings.UseCompactingForce
                    ? compactnessForceCalculator.Calculate(CompactnessMeasurer.Measure(Peptide))
                    : new Dictionary <ApproximatedAminoAcid, ApproximateAminoAcidForces>();
                var ramachandranForces = simulationSettings.UseRamachandranForce
                    ? ramachandranForceCalculator.Calculate(Peptide)
                    : new Dictionary <ApproximatedAminoAcid, ApproximateAminoAcidForces>();
                var bondForces = bondForceCalculator.Calculate(Peptide);
                foreach (var aminoAcid in Peptide.AminoAcids)
                {
                    var resultingForce = new ApproximateAminoAcidForces();
                    if (compactnessForces.ContainsKey(aminoAcid))
                    {
                        var compactnessForce = compactnessForces[aminoAcid];
                        resultingForce += compactnessForce;
                    }
                    if (ramachandranForces.ContainsKey(aminoAcid))
                    {
                        var ramachandranForce = ramachandranForces[aminoAcid];
                        resultingForce += ramachandranForce;
                    }
                    if (bondForces.ContainsKey(aminoAcid))
                    {
                        var bondForce = bondForces[aminoAcid];
                        resultingForce += bondForce;
                    }
                    ApplyForce(aminoAcid, resultingForce, dT, simulationSettings.ReservoirTemperature);
                }
                OnSimulationTimestepComplete(new SimulationTimestepCompleteEventArgs(CurrentTime, Peptide));
            }
            SimulationCompleted?.Invoke(this, EventArgs.Empty);
            IsSimulating = false;
        }