Exemplo n.º 1
0
 def ReadHeader(self):
     """Read the trajectory header."""
     header = Unpickle(os.path.join(self.path, _HeaderName + _BlockPostfix))
     # . Set some object values.
     for (key, value) in header.iteritems():
         setattr(self, key, value)
     # . Set the number of dimensions.
     self.rank = len(self.labels)
     # . Return the data.
     return header
Exemplo n.º 2
0
 def ReadBlock(self):
     """Read a block of data."""
     if self.currentBlock < self.blocks:
         self.data = Unpickle(
             os.path.join(
                 self.path, _BlockPrefix +
                 "{:d}".format(self.currentBlock) + _BlockPostfix))
         self.blockSize = len(self.data) // self.rank
         self.current = 0
         self.currentBlock += 1
     else:
         raise IndexError("Invalid block index.")
Exemplo n.º 3
0
 def ReadFrame(self, frame=None, identifier=None, instance=None):
     """Read a frame."""
     if self.isReadable:
         data = Unpickle(
             os.path.join(
                 self.path,
                 _FramePrefix + "{:d}".format(frame) + _FramePostfix))
         if (instance is None) or isinstance(data, instance):
             return data
         else:
             for item in data:
                 if isinstance(item, instance): return item
     else: raise IOError("Reading from trajectory that is not readable.")
Exemplo n.º 4
0
    def runTest(self):
        """The test."""

        # . Output setup.
        dataPath = os.path.join(os.getenv("PDYNAMO_PMOLECULE"), "data")
        log = self.GetLog()

        # . Define the molecule.
        molecule = XYZFile_ToSystem(
            os.path.join(dataPath, "xyz", "serineOctamerZD4L4.xyz"))
        molecule.Summary(log=log)

        # . Define the randomNumberGenerator so as to have reproducible results.
        randomNumberGenerator = RandomNumberGenerator.WithSeed(314159)

        # . Do the test - 250000+ trajectories are generally necessary.
        observed = HardSphereIonMobilities(
            molecule,
            nreflections=30,
            ntrajectories=100000,
            log=log,
            randomNumberGenerator=randomNumberGenerator)

        # . Remove non-real values.
        keys = observed.keys()
        for key in keys:
            if not isinstance(observed[key], float): del observed[key]

        # . Generate the reference data.
        if self.generateReferenceData:
            referenceData = TestDataSet("Ion Mobilities")
            for (key, value) in observed.iteritems():
                referenceData.AddDatum(
                    TestReal(key,
                             value,
                             referenceData,
                             percentErrorTolerance=_percentErrorTolerance))
            referenceData.Summary(log=log)
            Pickle(self.referenceDataPath, referenceData)
            isOK = True
        # . Verify the observed data against the reference data.
        else:
            referenceData = Unpickle(self.referenceDataPath)
            results = referenceData.VerifyAgainst(observed)
            results.Summary(log=log, fullSummary=self.fullVerificationSummary)
            isOK = results.WasSuccessful()

        # . Success/failure.
        self.assertTrue(isOK)
Exemplo n.º 5
0
_ZBox = 60.0

# . Number and type of ions to add.
_NNegative   = 27
_NPositive   = 24
_NegativeIon = "chloride"
_PositiveIon = "potassium"

# . Reorient option.
_Reorient = False

# . Define the solvent MM and NB models.
mmModel = MMModelOPLS ( "bookSmallExamples" )

# . Get the system.
system = Unpickle ( os.path.join ( outPath, "step7.pkl" ) )
system.Summary ( )

# . Reorient the system if necessary (see the results of GetSolvationInformation.py).
masses = system.atoms.GetItemAttributes ( "mass" )
if _Reorient: system.coordinates3.ToPrincipalAxes ( weights = masses )

# . Get the positive and negative ions.
if _NNegative > 0:
    anion = MOLFile_ToSystem ( os.path.join ( dataPath, _NegativeIon + ".mol" ) )
    anion.DefineMMModel ( mmModel )
    anion.Summary ( )
if _NPositive > 0:
    cation = MOLFile_ToSystem ( os.path.join ( dataPath, _PositiveIon + ".mol" ) )
    cation.DefineMMModel ( mmModel )
    cation.Summary ( )
Exemplo n.º 6
0
"""Generate a MM model for a system."""

import os, os.path, sys
sys.path.append(
    os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "data"))

from Definitions import outPath
from pCore import Pickle, Unpickle
from pMolecule import MMModelOPLS

# . Set up a MM model.
mmModel = MMModelOPLS("protein")

# . Get the system.
system = Unpickle(os.path.join(outPath, "step3.pkl"))
system.Summary()

# . Add the energy model.
system.DefineMMModel(mmModel)
system.Summary()

# . Save the system.
mmModel.ClearModelBuildingData()
Pickle(os.path.join(outPath, "step4.pkl"), system)
Exemplo n.º 7
0
"""Hand-build coordinates for PKA."""

import os, os.path, sys
sys.path.append ( os.path.join ( os.path.dirname ( os.path.realpath ( __file__ ) ), "..", "data" ) )

from Definitions      import outPath
from pCore            import Selection, Pickle, Unpickle
from pMolecule        import NBModelABFS
from pMoleculeScripts import BuildHydrogenCoordinates3FromConnectivity

# . Define the atoms IDs and the parameters.
_ToBuild = ( ( "A:LYS.8:CB" , "A:LYS.8:CA" , "A:LYS.8:N"  , "A:LYS.8:CG"  , 1.54, 109.5, 0.0 ), \
             ( "I:SER.17:OG", "I:SER.17:CB", "I:SER.17:CA", "A:ATP.400:PG", 1.40, 109.5, 0.0 )  )

# . Get the system.
system = Unpickle ( os.path.join ( outPath, "step4.pkl" ) )
system.Summary ( )

# . Build the coordinates of the missing heavy atoms.
for ( id1, id2, id3, id4, r, theta, phi ) in _ToBuild:
    i = system.sequence.AtomIndex ( id1 )
    j = system.sequence.AtomIndex ( id2 )
    k = system.sequence.AtomIndex ( id3 )
    l = system.sequence.AtomIndex ( id4 )
    system.coordinates3.BuildPointFromDistanceAngleDihedral ( i, j, k, l, r, theta, phi )

# . Build the hydrogen atom coordinates.
BuildHydrogenCoordinates3FromConnectivity ( system )

# . Save the system.
Pickle ( os.path.join ( outPath, "step6.pkl" ), system )
Exemplo n.º 8
0
from pBabel           import PDBFile_FromSystem                                                                                                                   
from pCore            import Clone, NormalDeviateGenerator, Pickle, RandomNumberGenerator, Selection, Unpickle
from pMolecule        import AtomSelection, MMModelOPLS, NBModelABFS, SoftConstraintContainer, SoftConstraintEnergyModelHarmonic, SoftConstraintMultipleTether
from pMoleculeScripts import ConjugateGradientMinimize_SystemGeometry, LangevinDynamics_SystemGeometry, SolvateSystemBySuperposition                                                                                                         

# . Parameters.
# . Refine options.
_Optimize = True
_Refine   = True
_Steps    = 2000

# . Define the MM and NB models.
nbModel = NBModelABFS ( )

# . Get the solute system.
solute = Unpickle ( os.path.join ( outPath, "step8_a.pkl" ) )
solute.Summary ( )

# . Get the solvent system.
solvent = Unpickle ( os.path.join ( outPath, "waterBox.pkl" ) )
solvent.DefineNBModel ( nbModel )
solvent.Summary ( )

# . Create the solvated system.
solution       = SolvateSystemBySuperposition ( solute, solvent, reorientSolute = False )
solution.label = "Solvated PKA Simulation System - Chains A and I Only"
solution.DefineNBModel  ( nbModel )
solution.Summary ( )

# . Refinement.
if _Refine:
Exemplo n.º 9
0
    def runTest ( self ):
        """The test."""

        # . Paths.
        dataPath = os.path.join ( os.getenv ( "PDYNAMO_PMOLECULE" ), "data", "pdb" )
        if self.resultPath is None: outPath  = os.path.join ( os.getenv ( "PDYNAMO_SCRATCH" ), _Destination )
        else:                       outPath  = os.path.join ( self.resultPath, _Destination )
        if not os.path.exists ( outPath ): os.mkdir ( outPath )
        log = self.GetLog ( )

        # . Models.
        mmModel = MMModelCHARMM ( "c36a2" )
#        mmModel = MMModelOPLS ( "protein" )
        nbModel = NBModelABFS ( )

        # . Get all files.
        pdbFiles = glob.glob ( os.path.join ( dataPath, "*.pdb" ) )
        pdbFiles.sort ( )

        # . Read all PDB files.
        failures      = 0
        otherFailures = 0
        successes     = 0
        for pdbFile in pdbFiles:

            ( head, tail ) = os.path.split ( pdbFile )
            tag = tail[0:-4]

            if log is not None: log.Text ( "\nProcessing " + pdbFile + ":\n" )
            system = PDBFile_ToSystem ( pdbFile, log = log, useComponentLibrary = True )
            BuildHydrogenCoordinates3FromConnectivity ( system )
            try:

                # . Setup.
                if system.coordinates3.numberUndefined > 0: raise
                system.DefineMMModel ( mmModel, log = log )
                system.DefineNBModel ( nbModel )
                system.Summary ( log = log )
                referenceEnergy = system.Energy  ( log = log, doGradients = True )

                # . Pickling.
                pklFile  = os.path.join ( outPath, tag + ".pkl"  )
                yamlFile = os.path.join ( outPath, tag + ".yaml" )
                Pickle     ( pklFile , system )
                YAMLPickle ( yamlFile, system )

                # . Unpickling.
                pklSystem = Unpickle ( pklFile )
                pklSystem.label += " (Pickled)"
                pklSystem.Summary ( log = log )
                pklEnergy = pklSystem.Energy  ( log = log, doGradients = True )
                if math.fabs ( referenceEnergy - pklEnergy  <= _Tolerance ): successes += 1
                else:                                                        failures  += 1

                yamlSystem = YAMLUnpickle ( yamlFile )
                yamlSystem.label += " (YAMLPickled)"
                yamlSystem.Summary ( log = log )
                yamlEnergy = yamlSystem.Energy  ( log = log, doGradients = True )
                if math.fabs ( referenceEnergy - yamlEnergy  <= _Tolerance ): successes += 1
                else:                                                         failures  += 1
 
            except Exception as e:
                otherFailures += 1
                if log is not None: log.Text ( "\nError occurred> " +  e.args[0] + "\n" )

        # . Summary of results.
        if log is not None:
            summary = log.GetSummary ( )
            summary.Start ( "Pickle Tests" )
            summary.Entry ( "Pickle Successes", "{:d}".format ( successes            ) )
            summary.Entry ( "Pickle Failures" , "{:d}".format ( failures             ) )
            summary.Entry ( "Total Tests"     , "{:d}".format ( 2 * len ( pdbFiles ) ) )
            summary.Entry ( "Loop Failures"   , "{:d}".format ( otherFailures        ) )
            summary.Stop  ( )

        # . Success/failure.
        self.assertTrue ( ( failures == 0 ) and ( otherFailures == 0 ) )
Exemplo n.º 10
0
    def runTest(self):
        """The test."""

        # . Initialization.
        if self.generateReferenceData:
            referenceData = TestDataSet("AMBER Test")
        else:
            observed = {}

        # . Output setup.
        dataPath = os.path.join(os.getenv("PDYNAMO_PBABEL"), "data", "amber")
        log = self.GetLog()

        # . Models.
        nbModel = NBModelFull()

        # . Loop over the molecules.
        for label in _SystemLabels:

            # . Read the data.
            molecule = AmberTopologyFile_ToSystem(os.path.join(
                dataPath, label + ".top"),
                                                  log=log)
            molecule.coordinates3 = AmberCrdFile_ToCoordinates3(os.path.join(
                dataPath, label + ".crd"),
                                                                log=log)

            # . Calculation.
            molecule.DefineNBModel(nbModel)
            molecule.Summary(log=log)
            if log is not None:
                log.Text("\nFormula = " + molecule.atoms.FormulaString() +
                         ".\n")
            energy = molecule.Energy(doGradients=True, log=log)

            # . Get the dictionary of energies.
            localObserved = molecule.configuration.energyTerms.Terms(
                asDictionary=True)
            localObserved["Potential Energy"] = energy

            # . Test the gradients.
            if len(molecule.atoms) <= _MaximumAtoms:
                of = SystemGeometryObjectiveFunction.FromSystem(molecule)
                localObserved["Gradient Error"] = of.TestGradients(log=log)

            # . Generate reference data.
            if self.generateReferenceData:
                localData = TestDataSet(label, parent=referenceData)
                for (key, value) in localObserved.iteritems():
                    if key == "Gradient Error":
                        localData.AddDatum(
                            TestReal(key,
                                     value,
                                     localData,
                                     absoluteErrorTolerance=
                                     _GradientAbsoluteErrorTolerance))
                    else:
                        localData.AddDatum(
                            TestReal(
                                key,
                                value,
                                localData,
                                absoluteErrorTolerance=_AbsoluteErrorTolerance,
                                toleranceFormat="{:.3f}",
                                valueFormat="{:.3f}"))
                referenceData.AddDatum(localData)
            # . Accumulate observed data.
            else:
                observed[label] = localObserved

        # . Generate the reference data.
        if self.generateReferenceData:
            referenceData.Summary(log=log)
            Pickle(self.referenceDataPath, referenceData)
            isOK = True
        # . Verify the observed data against the reference data.
        else:
            referenceData = Unpickle(self.referenceDataPath)
            results = referenceData.VerifyAgainst(observed)
            results.Summary(log=log, fullSummary=self.fullVerificationSummary)
            isOK = results.WasSuccessful()

        # . Success/failure.
        self.assertTrue(isOK)
Exemplo n.º 11
0
    def runTest(self):
        """The test."""

        # . Initialization.
        log = self.GetLog()
        modelResults = {}
        numberEnergyTests = 0
        numberErrors = 0
        numberGradientTests = 0
        if self.testGradients:
            maximumGradientDeviation = 0.0

        # . Energy data.
        if self.generateReferenceData:
            referenceData = TestDataSet("MNDO RHF Energies")
            energyDataSets = {}
            for model in self.modelLabels:
                energyDataSet = TestDataSet(model, parent=referenceData)
                energyDataSets[model] = energyDataSet
                referenceData.AddDatum(energyDataSet)
        else:
            energyResults = {}

        # . Loop over systems.
        for testSystem in self.testSystems:

            # . Get results (if necessary).
            modelLabel = testSystem.modelLabel
            if not self.generateReferenceData:
                energies = energyResults.get(modelLabel, None)
                if energies is None:
                    energies = {}
                    energyResults[modelLabel] = energies
            results = modelResults.get(modelLabel, None)
            if results is None:
                results = {}
                modelResults[modelLabel] = results
            cycles = results.get("Cycles", None)
            if cycles is None:
                cycles = []
                results["Cycles"] = cycles

            # . Get the molecule.
            try:
                molecule = testSystem.GetSystem(
                    log=log, maximumAtoms=self.maximumEnergyAtoms)
            except:
                molecule = None
                results["Undefined"] = results.get("Undefined", 0) + 1
            if molecule is None: continue

            # . Determine an energy.
            try:
                try:
                    e = molecule.Energy(log=log, doGradients=True)
                    i = molecule.configuration.qcState.GetItem("SCF Cycles")
                    results["Converged"] = results.get("Converged", 0) + 1
                    cycles.append(float(i))
                    # . Generate reference data - converged only.
                    if self.generateReferenceData:
                        energyDataSet = energyDataSets[modelLabel]
                        energyDataSet.AddDatum(
                            TestReal(
                                molecule.label,
                                e,
                                energyDataSet,
                                absoluteErrorTolerance=_AbsoluteErrorTolerance,
                                toleranceFormat="{:.3f}",
                                valueFormat="{:.3f}"))
                    # . Accumulate observed data.
                    else:
                        energies[molecule.label] = e
                except Exception as e:
                    results["Not Converged"] = results.get("Not Converged",
                                                           0) + 1

                # . Bond orders.
                labels = []
                for i in range(len(molecule.atoms)):
                    labels.append(molecule.atoms[i].path)
                (bondOrders, charges, freevalence,
                 totalvalence) = molecule.energyModel.qcModel.BondOrders(
                     molecule.configuration)
                bondOrders.PrintWithCondition(
                    (lambda x, i, j:
                     (i != j) and (math.fabs(x) >= _BondOrderTolerance)),
                    itemFormat="{:.3f}",
                    labels=labels,
                    log=log,
                    title="Bond Orders")

                # . Charges.
                charges = molecule.AtomicCharges()
                charges.Print(log=log, title="Charges")
                if log is not None:
                    log.Paragraph("Total Charge = {:.3f}".format(sum(charges)))
                charges = molecule.AtomicCharges(spinDensities=True)
                charges.Print(log=log, title="Spin Densities")
                if log is not None:
                    log.Paragraph("Total Spin Density = {:.3f}".format(
                        sum(charges)))

                # . Dipole moment.
                dipole = molecule.DipoleMoment()
                dipole.Print(log=log, title="Dipole")

                # . Gradient testing.
                if self.testGradients and (len(
                        molecule.atoms) < self.maximumGradientAtoms) and (
                            numberGradientTests < self.maximumGradientTests):
                    of = SystemGeometryObjectiveFunction.FromSystem(molecule)
                    gradientDeviation = of.TestGradients(log=log)
                    maximumGradientDeviation = max(maximumGradientDeviation,
                                                   gradientDeviation)
                    numberGradientTests += 1

            # . Error.
            except Exception as e:
                numberErrors += 1
                if log is not None:
                    log.Text("\nError occurred> " + e.args[0] + "\n")

            # . Check the number of tests.
            numberEnergyTests += 1
            if numberEnergyTests >= self.maximumEnergyTests: break

        # . Print model results.
        if log is not None:
            models = modelResults.keys()
            models.sort()
            table = log.GetTable(columns=7 * [_TableModelWidth])
            table.Start()
            table.Title("Model Results")
            table.Heading("Model")
            table.Heading("Undefined")
            table.Heading("Not Converged")
            table.Heading("Converged")
            table.Heading("<Cycles>")
            table.Heading("Max. Cycles")
            table.Heading("Min. Cycles")
            for model in models:
                results = modelResults[model]
                cycles = Statistics(results["Cycles"])
                table.Entry(model, alignment="left")
                table.Entry("{:d}".format(results.get("Undefined", 0)))
                table.Entry("{:d}".format(results.get("Not Converged", 0)))
                table.Entry("{:d}".format(results.get("Converged", 0)))
                if cycles.size > 0:
                    table.Entry("{:.1f}".format(cycles.mean))
                    table.Entry("{:.0f}".format(cycles.maximum))
                    table.Entry("{:.0f}".format(cycles.minimum))
                else:
                    table.Entry("-")
                    table.Entry("-")
                    table.Entry("-")
            table.Stop()

        # . Energy data.
        # . Generate the reference data.
        if self.generateReferenceData:
            referenceData.Summary(log=log)
            Pickle(self.referenceDataPath, referenceData)
            isOK = True
        # . Verify the observed data against the reference data.
        else:
            referenceData = Unpickle(self.referenceDataPath)
            results = referenceData.VerifyAgainst(energyResults)
            results.Summary(log=log, fullSummary=self.fullVerificationSummary)
            isOK = results.WasSuccessful()

        # . Gradient data set.
        if self.testGradients:

            # . Get the observed and reference data.
            observed = {}
            referenceData = TestDataSet("MNDO RHF Gradients")
            observed["Gradient Error"] = maximumGradientDeviation
            referenceData.AddDatum(
                TestReal(
                    "Gradient Error",
                    0.0,
                    referenceData,
                    absoluteErrorTolerance=_GradientAbsoluteErrorTolerance,
                    toleranceFormat="{:.3f}",
                    valueFormat="{:.3f}"))

            # . Check for success/failure.
            if len(observed) > 0:
                results = referenceData.VerifyAgainst(observed)
                results.Summary(log=log,
                                fullSummary=self.fullVerificationSummary)
                isOK = isOK and results.WasSuccessful()

        # . Finish up.
        isOK = isOK and (numberErrors == 0)
        self.assertTrue(isOK)
Exemplo n.º 12
0
    def runTest(self):
        """The test."""

        # . Initialization.
        if self.generateReferenceData:
            referenceData = TestDataSet("Charmm Test")
        else:
            observed = {}

        # . Output setup.
        dataPath = os.path.join(os.getenv("PDYNAMO_PBABEL"), "data", "charmm")
        outPath = None
        if self.resultPath is not None:
            outPath = os.path.join(self.resultPath, "pdb")
            if not os.path.exists(outPath): os.mkdir(outPath)
        log = self.GetLog()

        # . Get the parameters.
        parameterPaths = []
        for parameterPath in _ParameterPaths:
            parameterPaths.append(
                os.path.join(dataPath, parameterPath + ".prm"))
        parameters = CHARMMParameterFiles_ToParameters(parameterPaths, log=log)

        # . Generate systems.
        for label in _SystemLabels:

            if log is not None:
                log.Text("\n" + (80 * "=") + "\n")
                log.Text(label + "\n")
                log.Text(80 * "=" + "\n")
            system = CHARMMPSFFile_ToSystem(os.path.join(
                dataPath, label + ".psfx"),
                                            isXPLOR=True,
                                            parameters=parameters,
                                            log=log)
            system.coordinates3 = CHARMMCRDFile_ToCoordinates3(os.path.join(
                dataPath, label + ".chm"),
                                                               log=log)
            system.label = label
            system.DefineNBModel(NBModelFull())
            system.Summary(log=log)
            energy = system.Energy(log=log)
            log.Text("\nEnergy (kcal/mole) = {:.4f}\n".format(
                energy /
                UNITS_ENERGY_KILOCALORIES_PER_MOLE_TO_KILOJOULES_PER_MOLE))

            # . Get the dictionary of energies.
            localObserved = system.configuration.energyTerms.Terms(
                asDictionary=True)
            localObserved["Potential Energy"] = energy

            # . Test gradients.
            if len(system.atoms) <= _MaximumAtoms:
                of = SystemGeometryObjectiveFunction.FromSystem(system)
                of.TestGradients(log=log)
                localObserved["Gradient Error"] = of.TestGradients(log=log)

            # . Write PDB file and do various sequence tests.
            if not self.generateReferenceData:
                if outPath is not None:
                    PDBFile_FromSystem(os.path.join(outPath, label + ".pdb"),
                                       system,
                                       useSegmentEntityLabels=True)
                system.sequence.PrintComponentSequence(log=log)
                log.Text("\nSelections:\n\n")
                for pattern in _Patterns[label]:
                    log.Text("{:<30s} {:5d}\n".format(
                        pattern,
                        len(AtomSelection.FromAtomPattern(system, pattern))))

            # . Generate reference data.
            if self.generateReferenceData:
                localData = TestDataSet(label, parent=referenceData)
                for (key, value) in localObserved.iteritems():
                    if key == "Gradient Error":
                        localData.AddDatum(
                            TestReal(key,
                                     value,
                                     localData,
                                     absoluteErrorTolerance=
                                     _GradientAbsoluteErrorTolerance))
                    else:
                        localData.AddDatum(
                            TestReal(
                                key,
                                value,
                                localData,
                                absoluteErrorTolerance=_AbsoluteErrorTolerance,
                                toleranceFormat="{:.3f}",
                                valueFormat="{:.3f}"))
                referenceData.AddDatum(localData)
            # . Accumulate observed data.
            else:
                observed[label] = localObserved

        # . Generate the reference data.
        if self.generateReferenceData:
            referenceData.Summary(log=log)
            Pickle(self.referenceDataPath, referenceData)
            isOK = True
        # . Verify the observed data against the reference data.
        else:
            referenceData = Unpickle(self.referenceDataPath)
            results = referenceData.VerifyAgainst(observed)
            results.Summary(log=log, fullSummary=self.fullVerificationSummary)
            isOK = results.WasSuccessful()

        # . Success/failure.
        self.assertTrue(isOK)
Exemplo n.º 13
0
    def runTest ( self ):
        """The test."""

        # . Initialization.
        failures      = 0
        otherFailures = 0
        successes     = 0

        # . Paths.
        dataPath = os.path.join ( os.getenv ( "PDYNAMO_PMOLECULE" ), "data", "pdb" )
        if self.resultPath is None: outPath  = os.path.join ( os.getenv ( "PDYNAMO_SCRATCH" ), _Destination )
        else:                       outPath  = os.path.join ( self.resultPath, _Destination )
        if not os.path.exists ( outPath ): os.mkdir ( outPath )
        log = self.GetLog ( )

        # . Models.
        mmModel = MMModelCHARMM ( "c36a2" )
        nbModel = NBModelABFS ( )
        qcModel = QCModelMNDO ( )

        # . Get the file.
        pdbFile = os.path.join ( dataPath, "2E4E_folded_solvated.pdb" )
        ( head, tail ) = os.path.split ( pdbFile )
        tag = tail[0:-4]

        if log is not None: log.Text ( "\nProcessing " + pdbFile + ":\n" )
        system = PDBFile_ToSystem ( pdbFile, log = log, useComponentLibrary = True )
        try:

            # . Fixed atoms.
            fixedAtoms = Selection ( ~ AtomSelection.FromAtomPattern ( system, "A:*:*" ) )

            # . QC selection.
            indices = set ( )
            for atomTag in _Tags:
                indices.add ( system.sequence.AtomIndex ( "A:TYR.2:" + atomTag ) )
            tyrosine = Selection ( indices )

            # . Setup.
            system.electronicState = ElectronicState ( charge = 0, multiplicity = 1 )
            system.DefineFixedAtoms ( fixedAtoms )
            system.DefineSymmetry   ( crystalClass = CrystalClassCubic ( ), a = _BoxSize )
            system.DefineMMModel    ( mmModel, log = log )
            system.DefineQCModel    ( qcModel, qcSelection = tyrosine )
            system.DefineNBModel    ( nbModel )
            system.Summary ( log = log )
            referenceEnergy = system.Energy  ( log = log, doGradients = True )

            # . Pickling.
            pklFile  = os.path.join ( outPath, tag + ".pkl"  )
            yamlFile = os.path.join ( outPath, tag + ".yaml" )
            Pickle     ( pklFile , system )
            YAMLPickle ( yamlFile, system )

            # . Unpickling.
            pklSystem = Unpickle ( pklFile )
            pklSystem.label += " (Pickled)"
            pklSystem.Summary ( log = log )
            pklEnergy = pklSystem.Energy  ( log = log, doGradients = True )
            if math.fabs ( referenceEnergy - pklEnergy  <= _Tolerance ): successes += 1
            else:                                                        failures  += 1

            yamlSystem = YAMLUnpickle ( yamlFile )
            yamlSystem.label += " (YAMLPickled)"
            yamlSystem.Summary ( log = log )
            yamlEnergy = yamlSystem.Energy  ( log = log, doGradients = True )
            if math.fabs ( referenceEnergy - yamlEnergy  <= _Tolerance ): successes += 1
            else:                                                         failures  += 1

        except Exception as e:
            otherFailures += 1
            if log is not None: log.Text ( "\nError occurred> " +  e.args[0] + "\n" )

        # . Summary of results.
        if log is not None:
            summary = log.GetSummary ( )
            summary.Start ( "Pickle Tests" )
            summary.Entry ( "Pickle Successes", "{:d}".format ( successes            ) )
            summary.Entry ( "Pickle Failures" , "{:d}".format ( failures             ) )
            summary.Entry ( "Total Tests"     , "2"                                    )
            summary.Entry ( "Loop Failures"   , "{:d}".format ( otherFailures        ) )
            summary.Stop  ( )

        # . Success/failure.
        self.assertTrue ( ( failures == 0 ) and ( otherFailures == 0 ) )
Exemplo n.º 14
0
    def runTest(self):
        """The test."""

        # . Initialization.
        observed = {}
        gromacsReference = True

        # . We have two references: One for energies obtained with Gromacs; another for pDynamo energies
        if gromacsReference:
            referenceDataPath = os.path.join(
                os.getenv("PDYNAMO_PBABEL"), "data",
                "reference/GromacsTopCrdRead_gromacsValues.pkl")
        else:
            referenceDataPath = os.path.join(
                os.getenv("PDYNAMO_PBABEL"), "data",
                "reference/GromacsTopCrdRead_pDynamoValues.pkl")

        # . Output setup.
        dataPath = os.path.join(os.getenv("PDYNAMO_PBABEL"), "data", "gromacs")
        outPath = None
        self.resultPath = dataPath
        if self.resultPath is not None:
            outPath = os.path.join(self.resultPath, "pdb")
            if not os.path.exists(outPath): os.mkdir(outPath)
        log = self.GetLog()

        # . Generate systems.
        for label in _SystemLabels:

            # . Force field.
            for ff in _ForceFields:

                # . Header.
                if log is not None:
                    log.Text("\n" + (120 * "=") + "\n")
                    log.Text(label + "-" + ff + "\n")
                    log.Text(120 * "=" + "\n")

                # . Get the parameters.
                filename = os.path.join(dataPath, label + "_" + ff)
                parameters = GromacsParameters_ToParameters(filename + ".top",
                                                            log=log)
                system = GromacsDefinitions_ToSystem(filename + ".top",
                                                     parameters=parameters,
                                                     log=log)
                system.coordinates3 = GromacsCrdFile_ToCoordinates3(filename +
                                                                    ".gro",
                                                                    log=log)
                system.label = label
                if hasattr(system.configuration, "symmetryParameters"):
                    system.DefineNBModel(NBModelABFS(**ABFS_options))
                else:
                    system.DefineNBModel(NBModelFull())
                system.Summary(log=log)
                energy = system.Energy(log=log)
                log.Text("\nEnergy (kcal/mole) = {:.4f}\n".format(
                    energy /
                    UNITS_ENERGY_KILOCALORIES_PER_MOLE_TO_KILOJOULES_PER_MOLE))

                # . Get the dictionary of energies.
                localObserved = system.configuration.energyTerms.Terms(
                    asDictionary=True)
                localObserved["Potential Energy"] = energy

                # . U-B term in Gromacs includes harmonic angle contribution, but not in pDynamo. Their sum should be equal, though.
                if gromacsReference and (ff == "CHARMM"):
                    localObserved["Harmonic Angle + U-B"] = localObserved[
                        "Harmonic Angle"] + localObserved["Urey-Bradley"]
                    del localObserved["Harmonic Angle"]
                    del localObserved["Urey-Bradley"]

                # . Test gradients.
                if len(system.atoms) <= _MaximumAtoms:
                    of = SystemGeometryObjectiveFunction.FromSystem(system)
                    of.TestGradients(log=log)
                    localObserved["Gradient Error"] = of.TestGradients(log=log)

                # . Write PDB file
                if outPath is not None:
                    PDBFile_FromSystem(os.path.join(outPath, label + ".pdb"),
                                       system)

                # . Accumulate current data
                dataLabel = label + "-" + ff
                observed[dataLabel] = localObserved

        # . Verify the observed data against the reference data.
        referenceData = Unpickle(referenceDataPath)
        results = referenceData.VerifyAgainst(observed)
        isOK = results.WasSuccessful()
        results.Summary(log=log, fullSummary=True)

        # . Success/failure.
        self.assertTrue(isOK)
Exemplo n.º 15
0
"""Merge systems into one."""

import os, os.path, sys
sys.path.append(
    os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "data"))

from Definitions import outPath
from pCore import Pickle, Unpickle
from pMoleculeScripts import MergeByAtom

# . Specify the file names containing the systems to merge.
pklFiles = ["part1.pkl", "part2.pkl", "part3.pkl"]

# . Recover the systems from the files.
parts = []
for pklFile in pklFiles:
    parts.append(Unpickle(os.path.join(outPath, pklFile)))

# . Merge the systems.
system = MergeByAtom(parts)
system.Summary()

# . Save the system.
Pickle(os.path.join(outPath, "step5.pkl"), system)