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;
}
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;
}
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;
}
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;
}
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;
}
Aggregations