/* $Revision$ $Author$ $Date$
*
* Copyright (C) 2005-2007 Violeta Labarta <vlabarta@users.sf.net>
*
* Contact: cdk-devel@lists.sourceforge.net
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.openscience.cdk.modeling.forcefield;
import javax.vecmath.GVector;
import org.openscience.cdk.Molecule;
import org.openscience.cdk.graph.ConnectivityChecker;
/**
* To work with the coordinates of the molecule, like get the 3d coordinates of the atoms or
* calculate the distance between two atoms.
*@author vlabarta
*@cdk.module forcefield
* @cdk.githash
*
*/
public class ForceField extends GeometricMinimizer{
private String potentialFunction="mmff94";
boolean sdm_flag=true;
boolean cgm_flag=true;
boolean nrm_flag=true;
/**
* Constructor for the ForceField object
*/
public ForceField() {}
public ForceField(Molecule molecule) throws Exception {
setMolecule(molecule, false);
}
public void setPotentialFunction(String potentialName){
potentialFunction=potentialName;
}
public void setUsedGMMethods(boolean sdm, boolean cgm,boolean nrm){
sdm_flag=sdm;
cgm_flag=cgm;
nrm_flag=nrm;
}
public void minimize( ) throws Exception{
if (!ConnectivityChecker.isConnected(molecule)) {
throw new Exception("CDKError: Molecule is NOT connected,could not layout.");
}
GVector moleculeCoords = new GVector(3);
MMFF94EnergyFunction mmff94PF=null;
if (potentialFunction.equals("mmff94")){
//logger.debug("SET POTENTIAL FUNCTION TO MMFF94");
setMMFF94Tables(molecule);
mmff94PF=new MMFF94EnergyFunction(molecule,getPotentialParameterSet());
//logger.debug("PotentialFunction set:"+potentialFunction+", Hashtable:" +getPotentialParameterSet().size());
}
moleculeCoords.setSize(molecule.getAtomCount() * 3);
moleculeCoords.set(ForceFieldTools.getCoordinates3xNVector(molecule));
//logger.debug("PotentialFunction set:"+potentialFunction+" Molecule Coords set:"+moleculeCoords.getSize()+" Hashtable:"+getPotentialParameterSet().size());
//logger.debug(moleculeCoords.toString());
//logger.debug("Starting minmization at " + start);
if (sdm_flag) steepestDescentsMinimization(moleculeCoords,mmff94PF);
if (cgm_flag)conjugateGradientMinimization(moleculeCoords, mmff94PF);
//conjugateGradientMinimization(moleculeCoords, tpf);
//logger.debug("Finished minmization at " + stop);
//if ((stop - start)/1000 < 60) {
//logger.debug("Time for minimization: " + (stop - start)/1000 + " sec");
//}
// logger.debug("Time for minimization: " + (stop - start)/60000 + " min");
//}
//logger.debug("Minimization READY");
//ForceFieldTools.assignCoordinatesToMolecule(moleculeCoords, (AtomContainer) molecule);
}
}