Search in sources :

Example 11 with EnergyException

use of ffx.potential.utils.EnergyException in project ffx by mjschnie.

the class OctTopologyEnergy method energyAndGradient.

@Override
public double energyAndGradient(double[] x, double[] g, boolean verbose) {
    // if (inParallel) {
    region.setX(x);
    region.setG(g);
    region.setVerbose(verbose);
    try {
        team.execute(region);
    } catch (Exception ex) {
        throw new EnergyException(String.format(" Exception in calculating quad-topology energy: %s", ex.toString()), false);
    }
    /*} else {
            doublesTo(x, xA, xB);

            energyA = dualTopA.energyAndGradient(xA, gA, verbose);
            dEdL_A = linterA.getdEdL();
            d2EdL2_A = linterA.getd2EdL2();

            energyB = dualTopB.energyAndGradient(xB, gB, verbose);
            dEdL_B = linterB.getdEdL();
            d2EdL2_B = linterB.getd2EdL2();

            subtractDoublesFrom(g, gA, gB);

            dEdL = dEdL_A - dEdL_B;
            d2EdL2 = d2EdL2_A - d2EdL2_B;
            totalEnergy = energyA - energyB;
        }*/
    if (verbose) {
        logger.info(String.format(" Total quad-topology energy: %12.4f", totalEnergy));
    }
    return totalEnergy;
}
Also used : EnergyException(ffx.potential.utils.EnergyException) EnergyException(ffx.potential.utils.EnergyException)

Example 12 with EnergyException

use of ffx.potential.utils.EnergyException in project ffx by mjschnie.

the class QuadTopologyEnergy method energy.

@Override
public double energy(double[] x, boolean verbose) {
    region.setX(x);
    region.setVerbose(verbose);
    try {
        team.execute(region);
    } catch (Exception ex) {
        throw new EnergyException(String.format(" Exception in calculating quad-topology energy: %s", ex.toString()), false);
    }
    if (verbose) {
        logger.info(String.format(" Total quad-topology energy: %12.4f", totalEnergy));
    }
    return totalEnergy;
}
Also used : EnergyException(ffx.potential.utils.EnergyException) EnergyException(ffx.potential.utils.EnergyException)

Example 13 with EnergyException

use of ffx.potential.utils.EnergyException in project ffx by mjschnie.

the class DualTopologyEnergy method energyAndGradient.

/**
 * The coordinate and gradient arrays are unpacked/packed based on the dual
 * topology.
 *
 * @param x the coordinate array.
 * @param g the gradient array.
 * @param verbose
 * @return the DualTopologyEnergy total energy.
 */
@Override
public double energyAndGradient(double[] x, double[] g, boolean verbose) {
    try {
        region.setX(x);
        region.setG(g);
        region.setVerbose(verbose);
        team.execute(region);
    } catch (Exception ex) {
        throw new EnergyException(String.format(" Exception in calculating dual-topology energy: %s", ex.toString()), false);
    }
    return totalEnergy;
}
Also used : EnergyException(ffx.potential.utils.EnergyException) EnergyException(ffx.potential.utils.EnergyException)

Example 14 with EnergyException

use of ffx.potential.utils.EnergyException in project ffx by mjschnie.

the class RefinementEnergy method energyAndGradient.

/**
 * {@inheritDoc}
 *
 * Implementation of the {@link Potential} interface for the
 * RefinementEnergy.
 */
@Override
public double energyAndGradient(double[] x, double[] g) {
    double weight = data.getWeight();
    double e = 0.0;
    fill(g, 0.0);
    if (thermostat != null) {
        kTScale = Thermostat.convert / (thermostat.getTargetTemperature() * Thermostat.kB);
    }
    if (optimizationScaling != null) {
        int len = x.length;
        for (int i = 0; i < len; i++) {
            x[i] /= optimizationScaling[i];
        }
    }
    int assemblysize = molecularAssemblies.length;
    switch(refinementMode) {
        case COORDINATES:
            // Compute the chemical energy and gradient.
            for (int i = 0; i < assemblysize; i++) {
                try {
                    ForceFieldEnergy fe = molecularAssemblies[i].getPotentialEnergy();
                    getAssemblyi(i, x, xChemical[i]);
                    double curE = fe.energyAndGradient(xChemical[i], gChemical[i]);
                    e += (curE - e) / (i + 1);
                    setAssemblyi(i, g, gChemical[i]);
                } catch (EnergyException ex) {
                    ex.printStackTrace();
                    if (printOnFailure) {
                        String timeString = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy_MM_dd-HH_mm_ss"));
                        String filename = String.format("%s-ERROR-%s.pdb", FilenameUtils.removeExtension(molecularAssemblies[i].getFile().getName()), timeString);
                        PotentialsFunctions ef = new PotentialsUtils();
                        filename = ef.versionFile(filename);
                        logger.info(String.format(" Writing on-error snapshot to file %s", filename));
                        ef.saveAsPDB(molecularAssemblies[i], new File(filename));
                    }
                    if (ex.doCauseSevere()) {
                        ex.printStackTrace();
                        logger.log(Level.SEVERE, " Error in calculating energies or gradients", ex);
                    } else {
                        ex.printStackTrace();
                        // Rethrow exception
                        throw ex;
                    }
                    // Should ordinarily be unreachable.
                    return 0;
                }
            }
            double chemE = e;
            e = chemE * kTScale;
            // normalize gradients for multiple-counted atoms
            if (assemblysize > 1) {
                for (int i = 0; i < nXYZ; i++) {
                    g[i] /= assemblysize;
                }
            }
            for (int i = 0; i < nXYZ; i++) {
                g[i] *= kTScale;
            }
            // Compute the X-ray target energy and gradient.
            if (gXray == null || gXray.length != nXYZ) {
                gXray = new double[nXYZ];
            }
            double xE = dataEnergy.energyAndGradient(x, gXray);
            // System.out.println("Xray E: " + xE + " scaled Xray E: " + weight * xE);
            e += weight * xE;
            // Add the chemical and X-ray gradients.
            for (int i = 0; i < nXYZ; i++) {
                g[i] += weight * gXray[i];
            }
            break;
        case BFACTORS:
        case OCCUPANCIES:
        case BFACTORS_AND_OCCUPANCIES:
            // Compute the X-ray target energy and gradient.
            e = dataEnergy.energyAndGradient(x, g);
            break;
        case COORDINATES_AND_BFACTORS:
        case COORDINATES_AND_OCCUPANCIES:
        case COORDINATES_AND_BFACTORS_AND_OCCUPANCIES:
            // Compute the chemical energy and gradient.
            for (int i = 0; i < assemblysize; i++) {
                try {
                    ForceFieldEnergy fe = molecularAssemblies[i].getPotentialEnergy();
                    getAssemblyi(i, x, xChemical[i]);
                    double curE = fe.energyAndGradient(xChemical[i], gChemical[i]);
                    e += (curE - e) / (i + 1);
                    setAssemblyi(i, g, gChemical[i]);
                } catch (EnergyException ex) {
                    ex.printStackTrace();
                    if (printOnFailure) {
                        String timeString = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy_MM_dd-HH_mm_ss"));
                        String filename = String.format("%s-ERROR-%s.pdb", FilenameUtils.removeExtension(molecularAssemblies[i].getFile().getName()), timeString);
                        PotentialsFunctions ef = new PotentialsUtils();
                        filename = ef.versionFile(filename);
                        logger.info(String.format(" Writing on-error snapshot to file %s", filename));
                        ef.saveAsPDB(molecularAssemblies[i], new File(filename));
                    }
                    if (ex.doCauseSevere()) {
                        ex.printStackTrace();
                        logger.log(Level.SEVERE, " Error in calculating energies or gradients", ex);
                    } else {
                        ex.printStackTrace();
                        // Rethrow exception
                        throw ex;
                    }
                    // Should ordinarily be unreachable.
                    return 0;
                }
            }
            // normalize gradients for multiple-counted atoms
            if (assemblysize > 1) {
                for (int i = 0; i < nXYZ; i++) {
                    g[i] /= assemblysize;
                }
            }
            // Compute the X-ray target energy and gradient.
            if (gXray == null || gXray.length != n) {
                gXray = new double[n];
            }
            e += weight * dataEnergy.energyAndGradient(x, gXray);
            // Add the chemical and X-ray gradients.
            for (int i = 0; i < nXYZ; i++) {
                g[i] += weight * gXray[i];
            }
            // bfactors, occ
            if (n > nXYZ) {
                for (int i = nXYZ; i < n; i++) {
                    g[i] = weight * gXray[i];
                }
            }
            break;
        default:
            String message = "Unknown refinement mode.";
            logger.log(Level.SEVERE, message);
    }
    if (optimizationScaling != null) {
        int len = x.length;
        for (int i = 0; i < len; i++) {
            x[i] *= optimizationScaling[i];
            g[i] /= optimizationScaling[i];
        }
    }
    totalEnergy = e;
    return e;
}
Also used : PotentialsFunctions(ffx.potential.utils.PotentialsFunctions) ForceFieldEnergy(ffx.potential.ForceFieldEnergy) File(java.io.File) EnergyException(ffx.potential.utils.EnergyException) PotentialsUtils(ffx.potential.utils.PotentialsUtils)

Example 15 with EnergyException

use of ffx.potential.utils.EnergyException in project ffx by mjschnie.

the class RefinementEnergy method energy.

@Override
public double energy(double[] x) {
    double weight = data.getWeight();
    double e = 0.0;
    if (thermostat != null) {
        kTScale = Thermostat.convert / (thermostat.getTargetTemperature() * Thermostat.kB);
    }
    if (optimizationScaling != null) {
        int len = x.length;
        for (int i = 0; i < len; i++) {
            x[i] /= optimizationScaling[i];
        }
    }
    int assemblysize = molecularAssemblies.length;
    switch(refinementMode) {
        case COORDINATES:
            // Compute the chemical energy.
            for (int i = 0; i < assemblysize; i++) {
                try {
                    ForceFieldEnergy fe = molecularAssemblies[i].getPotentialEnergy();
                    getAssemblyi(i, x, xChemical[i]);
                    double curE = fe.energy(xChemical[i]);
                    e += (curE - e) / (i + 1);
                } catch (EnergyException ex) {
                    ex.printStackTrace();
                    if (printOnFailure) {
                        String timeString = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy_MM_dd-HH_mm_ss"));
                        String filename = String.format("%s-ERROR-%s.pdb", FilenameUtils.removeExtension(molecularAssemblies[i].getFile().getName()), timeString);
                        PotentialsFunctions ef = new PotentialsUtils();
                        filename = ef.versionFile(filename);
                        logger.info(String.format(" Writing on-error snapshot to file %s", filename));
                        ef.saveAsPDB(molecularAssemblies[i], new File(filename));
                    }
                    if (ex.doCauseSevere()) {
                        ex.printStackTrace();
                        logger.log(Level.SEVERE, " Error in calculating energies or gradients", ex);
                    } else {
                        ex.printStackTrace();
                        // Rethrow exception
                        throw ex;
                    }
                    // Should ordinarily be unreachable.
                    return 0;
                }
            }
            double chemE = e;
            e = chemE * kTScale;
            // Compute the X-ray target energy.
            double xE = dataEnergy.energy(x);
            e += weight * xE;
            break;
        case BFACTORS:
        case OCCUPANCIES:
        case BFACTORS_AND_OCCUPANCIES:
            // Compute the X-ray target energy and gradient.
            e = dataEnergy.energy(x);
            break;
        case COORDINATES_AND_BFACTORS:
        case COORDINATES_AND_OCCUPANCIES:
        case COORDINATES_AND_BFACTORS_AND_OCCUPANCIES:
            // Compute the chemical energy and gradient.
            for (int i = 0; i < assemblysize; i++) {
                try {
                    ForceFieldEnergy fe = molecularAssemblies[i].getPotentialEnergy();
                    getAssemblyi(i, x, xChemical[i]);
                    double curE = fe.energy(xChemical[i]);
                    e += (curE - e) / (i + 1);
                } catch (EnergyException ex) {
                    ex.printStackTrace();
                    if (printOnFailure) {
                        String timeString = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy_MM_dd-HH_mm_ss"));
                        String filename = String.format("%s-ERROR-%s.pdb", FilenameUtils.removeExtension(molecularAssemblies[i].getFile().getName()), timeString);
                        PotentialsFunctions ef = new PotentialsUtils();
                        filename = ef.versionFile(filename);
                        logger.info(String.format(" Writing on-error snapshot to file %s", filename));
                        ef.saveAsPDB(molecularAssemblies[i], new File(filename));
                    }
                    if (ex.doCauseSevere()) {
                        ex.printStackTrace();
                        logger.log(Level.SEVERE, " Error in calculating energies or gradients", ex);
                    } else {
                        ex.printStackTrace();
                        // Rethrow exception
                        throw ex;
                    }
                    // Should ordinarily be unreachable.
                    return 0;
                }
            }
            e += weight * dataEnergy.energy(x);
            break;
        default:
            String message = "Unknown refinement mode.";
            logger.log(Level.SEVERE, message);
    }
    if (optimizationScaling != null) {
        int len = x.length;
        for (int i = 0; i < len; i++) {
            x[i] *= optimizationScaling[i];
        }
    }
    totalEnergy = e;
    return e;
}
Also used : PotentialsFunctions(ffx.potential.utils.PotentialsFunctions) ForceFieldEnergy(ffx.potential.ForceFieldEnergy) File(java.io.File) EnergyException(ffx.potential.utils.EnergyException) PotentialsUtils(ffx.potential.utils.PotentialsUtils)

Aggregations

EnergyException (ffx.potential.utils.EnergyException)18 ForceFieldString (ffx.potential.parameters.ForceField.ForceFieldString)6 CoordRestraint (ffx.potential.nonbonded.CoordRestraint)4 PotentialsFunctions (ffx.potential.utils.PotentialsFunctions)4 PotentialsUtils (ffx.potential.utils.PotentialsUtils)4 File (java.io.File)4 Atom (ffx.potential.bonded.Atom)3 COMRestraint (ffx.potential.nonbonded.COMRestraint)3 NCSRestraint (ffx.potential.nonbonded.NCSRestraint)3 Crystal (ffx.crystal.Crystal)2 ForceFieldEnergy (ffx.potential.ForceFieldEnergy)2 Respa (ffx.algorithms.integrators.Respa)1 Stochastic (ffx.algorithms.integrators.Stochastic)1 MultiResidue (ffx.potential.bonded.MultiResidue)1 Residue (ffx.potential.bonded.Residue)1 OpenMM_System_addConstraint (simtk.openmm.OpenMMLibrary.OpenMM_System_addConstraint)1 OpenMM_Vec3 (simtk.openmm.OpenMM_Vec3)1