Ejemplo n.º 1
0
def start_universe(pdb_file):
    """
    pdb_file:   str,    pdb file name
    return  MMTK.Universe
    """
    universe = InfiniteUniverse()
    molecules = _get_molecules(pdb_file)
    universe.addObject(molecules)
    return universe
Ejemplo n.º 2
0
    def _makeUniverse(self):
        import os.path
        parmDir = os.path.dirname(__file__)
        timestamp("_makeUniverse")
        from MMTK import InfiniteUniverse
        from MMTK.ForceFields.Amber import AmberData
        from MMTK.ForceFields.Amber.AmberForceField import readAmber99
        from MMTK.ForceFields.MMForceField import MMForceField
        #
        # GAFF uses lower case atom types to distinguish
        # from Amber atom types.  MMTK, however, normalizes
        # all atom types to upper case.  So we hack MMTK
        # and temporarily replace _normalizeName function
        # with ours while reading our parameter files.
        # (We have to reread the parameter file each time
        # because we potentially have different frcmod files
        # for the different universes.)
        #
        saveNormalizeName = AmberData._normalizeName
        AmberData._normalizeName = simpleNormalizeName
        modFiles = [m.frcmod for m in self.molecules if m.frcmod is not None]
        parameters = readAmber99(os.path.join(parmDir, "parm", "gaff.dat"),
                                 modFiles)
        self._mergeAmber99(parameters)
        bondedScaleFactor = 1.0
        ff = MMForceField("Amber99/GAFF", parameters, self.ljOptions,
                          self.esOptions, bondedScaleFactor)
        AmberData._normalizeName = saveNormalizeName

        timestamp("Made forcefield")
        self.universe = InfiniteUniverse(ff)
        timestamp("Made universe")
        for mm in self.molecules:
            self.universe.addObject(mm)
            timestamp("Added model %s" % mm.name)
        timestamp("end _makeUniverse")
Ejemplo n.º 3
0
	def _makeUniverse(self):
		import os.path
		parmDir = os.path.dirname(__file__)
		timestamp("_makeUniverse")
		from MMTK import InfiniteUniverse
		from MMTK.ForceFields.Amber import AmberData
		from MMTK.ForceFields.Amber.AmberForceField import readAmber99
		from MMTK.ForceFields.MMForceField import MMForceField
		#
		# GAFF uses lower case atom types to distinguish
		# from Amber atom types.  MMTK, however, normalizes
		# all atom types to upper case.  So we hack MMTK
		# and temporarily replace _normalizeName function
		# with ours while reading our parameter files.
		# (We have to reread the parameter file each time
		# because we potentially have different frcmod files
		# for the different universes.)
		#
		saveNormalizeName = AmberData._normalizeName
		AmberData._normalizeName = simpleNormalizeName
		modFiles = [ m.frcmod for m in self.molecules
				if m.frcmod is not None]
		parameters = readAmber99(os.path.join(parmDir,
							"parm", "gaff.dat"),
						modFiles)
		self._mergeAmber99(parameters)
		bondedScaleFactor = 1.0
		ff = MMForceField("Amber99/GAFF", parameters, self.ljOptions,
					self.esOptions, bondedScaleFactor)
		AmberData._normalizeName = saveNormalizeName

		timestamp("Made forcefield")
		self.universe = InfiniteUniverse(ff)
		timestamp("Made universe")
		for mm in self.molecules:
			self.universe.addObject(mm)
			timestamp("Added model %s" % mm.name)
		timestamp("end _makeUniverse")
Ejemplo n.º 4
0
from MMTK import Database
from MMTK import Molecule
from MMTK.ParticleProperties import Configuration
from MMTK.ForceFields import Amber12SBForceField
from MMTK import Universe, InfiniteUniverse
from MMTK import Units

R = 8.3144621*Units.J/Units.mol/Units.K

import CDHMC

parm_dir = '/share/apps/amber/16/dat/leap/parm/' # Amber parameters directory
newmol = Molecule(mol_FN)
mol_frcmod = os.path.join(mol_dir, 'ligand.frcmod')
gaff_FN = os.path.join(mol_dir,'gaff2.dat')
universe = InfiniteUniverse(Amber12SBForceField(parameter_file=gaff_FN, mod_files=['frcmod.ff12SB', mol_frcmod]))
universe.addObject(newmol)

universe.configuration();
configuration =  universe.configuration().array

CDIntegrator = CDHMC.CDHMCIntegrator(universe, mol_dir, parm_dir)
(confs, Es_MM, acc, ntrials, dt) = CDIntegrator.Call(10000, 10, 300, 0.0015, random.randint(1,300), 0, 1, 0.5)
print "GC: ", Es_MM
CDIntegrator.Clear()





Ejemplo n.º 5
0
from MMTK.ForceFields import Amber12SBForceField
from MMTK import Universe, InfiniteUniverse
from MMTK import Units

from VelocityVerlet import VelocityVerletIntegrator
import GCHMC

R = 8.3144621*Units.J/Units.mol/Units.K

mol_name = "ligand"
gaff_FN = 'gaff.dat'
parm_dir = './' 
mol_dir = '2but'
newmol = Molecule('2but')
mol_frcmod = os.path.join(mol_dir, 'ligand.frcmod')
universe = InfiniteUniverse(Amber12SBForceField(parameter_file=gaff_FN, mod_files=['frcmod.ff12SB', mol_frcmod]))
universe.addObject(newmol)

universe.configuration();
configuration =  universe.configuration().array

VVintegrator = VelocityVerletIntegrator(universe)
print "VV constructed"
GCintegrator = GCHMC.GCHMCIntegrator(universe, mol_dir, parm_dir + gaff_FN)
print "GCHMC constructed"

(confs, KEs_MM, Es_MM, acc, ntrials, dt) = VVintegrator(steps=200, steps_per_trial=50, T=300.0, delta_t=0.0015, \
     normalize=False, adapt=False, random_seed=random.randint(1,300))
print "Velocity Verlet finished"

(confs, Es_MM, acc, ntrials, dt) = GCintegrator.Call(30, 10, 300, 0.0015, random.randint(1,300), 0, 1, 0.5)
Ejemplo n.º 6
0
def normalmodes_mmtk(selection,
                     cutoff=12.0,
                     ff='Deformation',
                     first=7,
                     last=10,
                     prefix='mmtk',
                     states=7,
                     factor=-1,
                     quiet=1):
    '''
DESCRIPTION

    Fast normal modes for large proteins using an elastic network model (CA only)

    Based on:
    http://dirac.cnrs-orleans.fr/MMTK/using-mmtk/mmtk-example-scripts/normal-modes/
    '''
    try:
        import MMTK
    except ImportError:
        print('Failed to import MMTK, please add to PYTHONPATH')
        raise CmdException

    selection = selector.process(selection)
    cutoff = float(cutoff)
    first, last = int(first), int(last)
    states, factor, quiet = int(states), float(factor), int(quiet)

    from math import log
    from chempy import cpv

    from MMTK import InfiniteUniverse
    from MMTK.PDB import PDBConfiguration
    from MMTK.Proteins import Protein
    from MMTK.NormalModes import NormalModes

    from MMTK.ForceFields import DeformationForceField, CalphaForceField
    from MMTK.FourierBasis import FourierBasis, estimateCutoff
    from MMTK.NormalModes import NormalModes, SubspaceNormalModes

    model = 'calpha'
    ff = ff.lower()
    if 'deformationforcefield'.startswith(ff):
        forcefield = DeformationForceField(cutoff=cutoff / 10.)
    elif 'calphaforcefield'.startswith(ff):
        forcefield = CalphaForceField(cutoff=cutoff / 10.)
    elif 'amber94forcefield'.startswith(ff):
        from MMTK.ForceFields import Amber94ForceField
        forcefield = Amber94ForceField()
        model = 'all'
    else:
        raise NotImplementedError('unknown ff = ' + str(ff))
    if not quiet:
        print(' Forcefield:', forcefield.__class__.__name__)

    if model == 'calpha':
        selection = '(%s) and polymer and name CA' % (selection)

    f = StringIO(cmd.get_pdbstr(selection))
    conf = PDBConfiguration(f)
    items = conf.createPeptideChains(model)

    universe = InfiniteUniverse(forcefield)
    universe.protein = Protein(*items)

    nbasis = max(10, universe.numberOfAtoms() / 5)
    cutoff, nbasis = estimateCutoff(universe, nbasis)
    if not quiet:
        print(" Calculating %d low-frequency modes." % nbasis)

    if cutoff is None:
        modes = NormalModes(universe)
    else:
        subspace = FourierBasis(universe, cutoff)
        modes = SubspaceNormalModes(universe, subspace)

    natoms = modes.array.shape[1]
    frequencies = modes.frequencies

    if factor < 0:
        factor = log(natoms)
        if not quiet:
            print(' set factor to %.2f' % (factor))

    if True:  # cmd.count_atoms(selection) != natoms:
        import tempfile, os
        from MMTK import DCD
        filename = tempfile.mktemp(suffix='.pdb')
        sequence = DCD.writePDB(universe, None, filename)
        z = [a.index for a in sequence]
        selection = cmd.get_unused_name('_')
        cmd.load(filename, selection, zoom=0)
        os.remove(filename)

        if cmd.count_atoms(selection) != natoms:
            print('hmm... still wrong number of atoms')

    def eigenfacs_iter(mode):
        x = modes[mode - 1].array
        return iter(x.take(z, 0))

    for mode in range(first, min(last, len(modes)) + 1):
        name = prefix + '%d' % mode
        cmd.delete(name)

        if not quiet:
            print(' normalmodes: object "%s" for mode %d with freq. %.6f' % \
                    (name, mode, frequencies[mode-1]))

        for state in range(1, states + 1):
            cmd.create(name, selection, 1, state, zoom=0)
            cmd.alter_state(
                state,
                name,
                '(x,y,z) = cpv.add([x,y,z], cpv.scale(next(myit), myfac))',
                space={
                    'cpv': cpv,
                    'myit': eigenfacs_iter(mode),
                    'next': next,
                    'myfac':
                    1e2 * factor * ((state - 1.0) / (states - 1.0) - 0.5)
                })

    cmd.delete(selection)
    if model == 'calpha':
        cmd.set('ribbon_trace_atoms', 1, prefix + '*')
        cmd.show_as('ribbon', prefix + '*')
    else:
        cmd.show_as('lines', prefix + '*')
Ejemplo n.º 7
0
        forcefield = Amber94ForceField()
        model = 'all'
    else:
        raise NotImplementedError('unknown ff = ' + str(ff))
    if not quiet:
        print ' Forcefield:', forcefield.__class__.__name__

    if model == 'calpha':
        selection = '(%s) and polymer and name CA' % (selection)

    from cStringIO import StringIO
    f = StringIO(cmd.get_pdbstr(selection))
    conf = PDBConfiguration(f)
    items = conf.createPeptideChains(model)

    universe = InfiniteUniverse(forcefield)
    universe.protein = Protein(*items)

    nbasis = max(10, universe.numberOfAtoms()/5)
    cutoff, nbasis = estimateCutoff(universe, nbasis)
    if not quiet:
        print " Calculating %d low-frequency modes." % nbasis

    if cutoff is None:
        modes = NormalModes(universe)
    else:
        subspace = FourierBasis(universe, cutoff)
        modes = SubspaceNormalModes(universe, subspace)

    natoms = modes.array.shape[1]
    frequencies = modes.frequencies
Ejemplo n.º 8
0
        from MMTK.ForceFields import Amber94ForceField
        forcefield = Amber94ForceField()
        model = 'all'
    else:
        raise NotImplementedError('unknown ff = ' + str(ff))
    if not quiet:
        print(' Forcefield:', forcefield.__class__.__name__)

    if model == 'calpha':
        selection = '(%s) and polymer and name CA' % (selection)

    f = StringIO(cmd.get_pdbstr(selection))
    conf = PDBConfiguration(f)
    items = conf.createPeptideChains(model)

    universe = InfiniteUniverse(forcefield)
    universe.protein = Protein(*items)

    nbasis = max(10, universe.numberOfAtoms() / 5)
    cutoff, nbasis = estimateCutoff(universe, nbasis)
    if not quiet:
        print(" Calculating %d low-frequency modes." % nbasis)

    if cutoff is None:
        modes = NormalModes(universe)
    else:
        subspace = FourierBasis(universe, cutoff)
        modes = SubspaceNormalModes(universe, subspace)

    natoms = modes.array.shape[1]
    frequencies = modes.frequencies
Ejemplo n.º 9
0
class MMTKinter:
    def __init__(self,
                 mols,
                 nogui=False,
                 addhyd=True,
                 ljOptions=None,
                 esOptions=None,
                 callback=None):
        # MMTK lengths are in nm while Chimera ones are in Angstroms
        # so we need a scale factor when converting
        if not mols:
            raise ValueError("No molecules specified")
        self.tempDir = None
        self.molId = 0
        self.ljOptions = ljOptions
        self.esOptions = esOptions
        self.callback = callback
        self.mols = mols
        self._getParameters(mols, nogui, addhyd)

    def _finishInit(self):
        timestamp("_finishInit")
        self.molecules = []
        self.atomMap = {}
        try:
            for m in self.mols:
                self.molecules.append(self._makeMolecule(m))
            self._makeUniverse()
            if self.callback:
                self.callback(self)
                del self.callback
        finally:
            self._removeTempDir()

    def _makeUniverse(self):
        import os.path
        parmDir = os.path.dirname(__file__)
        timestamp("_makeUniverse")
        from MMTK import InfiniteUniverse
        from MMTK.ForceFields.Amber import AmberData
        from MMTK.ForceFields.Amber.AmberForceField import readAmber99
        from MMTK.ForceFields.MMForceField import MMForceField
        #
        # GAFF uses lower case atom types to distinguish
        # from Amber atom types.  MMTK, however, normalizes
        # all atom types to upper case.  So we hack MMTK
        # and temporarily replace _normalizeName function
        # with ours while reading our parameter files.
        # (We have to reread the parameter file each time
        # because we potentially have different frcmod files
        # for the different universes.)
        #
        saveNormalizeName = AmberData._normalizeName
        AmberData._normalizeName = simpleNormalizeName
        modFiles = [m.frcmod for m in self.molecules if m.frcmod is not None]
        parameters = readAmber99(os.path.join(parmDir, "parm", "gaff.dat"),
                                 modFiles)
        self._mergeAmber99(parameters)
        bondedScaleFactor = 1.0
        ff = MMForceField("Amber99/GAFF", parameters, self.ljOptions,
                          self.esOptions, bondedScaleFactor)
        AmberData._normalizeName = saveNormalizeName

        timestamp("Made forcefield")
        self.universe = InfiniteUniverse(ff)
        timestamp("Made universe")
        for mm in self.molecules:
            self.universe.addObject(mm)
            timestamp("Added model %s" % mm.name)
        timestamp("end _makeUniverse")

    def _getParameters(self, mols, nogui, addhyd):
        timestamp("_getParameters")
        import DockPrep
        import chimera
        self.originalAtoms = set([])
        for m in mols:
            self.originalAtoms.update(m.atoms)
        from AddCharge import AMBER99SB
        kw = {
            "doneCB": self._finishDockPrep,
            "gaffType": True,
            "chargeModel": AMBER99SB
        }
        if nogui or chimera.nogui:
            if not addhyd:
                kw["addHFunc"] = None
            DockPrep.prep(mols, nogui=nogui, **kw)
        else:
            from DockPrep.gui import DockPrepDialog
            from chimera import dialogs
            d = dialogs.display(DockPrepDialog.name, wait=True)
            d.addHydVar.set(addhyd)
            d.applyKeywords = kw
            d.molListBox.setvalue(mols)
            d.writeMol2Var.set(False)
        """
		d = DockPrep.memoryPrep("Minimize", "use", mols, nogui=nogui, **kw)
		if d:
			d.addHydVar.set(addhyd)
			d.writeMol2Var.set(False)
		"""

    def _finishDockPrep(self):
        timestamp("end _getParameters")
        from chimera import selection
        selectedAtoms = set(selection.currentAtoms())
        addSelected = []
        numAdded = 0
        for m in self.mols:
            for a in m.atoms:
                if a in self.originalAtoms:
                    continue
                numAdded += 1
                # This atom was added.  If it was added to
                # a selected atom, then we add this atom
                # into the current selection as well.
                for b in a.bonds:
                    oa = a.bonds[0].otherAtom(a)
                    if oa in selectedAtoms:
                        addSelected.append(a)
                        break
        del self.originalAtoms
        if addSelected:
            selection.addCurrent(addSelected)
        #from chimera import replyobj
        #replyobj.info("%d atoms added, %d selected\n"
        #		% (numAdded, len(addSelected)))
        self._finishInit()

    def _mergeAmber99(self, parm):
        "Merge MMTK Amber99 parameters into our parameters"
        from MMTK.ForceFields.Amber.AmberForceField import readAmber99
        parm99 = readAmber99()
        parm.atom_types.update(parm99.atom_types)
        parm.bonds.update(parm99.bonds)
        parm.bond_angles.update(parm99.bond_angles)
        parm.dihedrals.update(parm99.dihedrals)
        parm.dihedrals_2.update(parm99.dihedrals_2)
        parm.impropers.update(parm99.impropers)
        parm.impropers_1.update(parm99.impropers_1)
        parm.impropers_2.update(parm99.impropers_2)
        parm.hbonds.update(parm99.hbonds)
        parm.lj_equivalent.update(parm99.lj_equivalent)
        for name, ljpar_set99 in parm99.ljpar_sets.iteritems():
            try:
                ljpar_set = parm.ljpar_sets[name]
            except KeyError:
                parm.ljpar_sets[name] = ljpar_set99
            else:
                if ljpar_set.type != ljpar_set99.type:
                    print "incompatible ljpar_set"
                    print " GAFF type:", ljpar_set.type
                    print " AMBER99 type:", ljpar_set99.type
                ljpar_set.entries.update(ljpar_set99.entries)

    def _makeMolecule(self, m):
        timestamp("_makeMolecule %s" % m.name)
        mm = MMTKChimeraModel(m, self.molId, self)
        self.molId += 1
        timestamp("end _makeMolecule")
        return mm

    def setFixed(self, which):
        from chimera import selection
        if which == "none" or selection.currentEmpty():
            for ma in self.universe.atomList():
                ma.fixed = False
        elif which == "selected":
            import chimera
            for ma in self.universe.atomList():
                ma.fixed = False
            for a in selection.currentAtoms():
                if a.molecule in self.mols:
                    ma = self.atomMap[a]
                    ma.fixed = True
        else:
            import chimera
            for ma in self.universe.atomList():
                ma.fixed = True
            for a in selection.currentAtoms():
                if a.molecule in self.mols:
                    ma = self.atomMap[a]
                    ma.fixed = False

    def loadMMTKCoordinates(self):
        "Load MMTK coordinates from Chimera models"
        import chimera
        from Scientific.Geometry import Vector
        from MMTK import Units
        s = Units.Ang
        for ma in self.universe.atomList():
            try:
                ca = ma.getAtomProperty(ma, "chimera_atom")
            except AttributeError:
                pass
            else:
                c = ca.coord()
                p = Vector(c[0] * s, c[1] * s, c[2] * s)
                ma.setPosition(p)

    def saveMMTKCoordinates(self):
        "Save MMTK coordinates into Chimera models"
        import chimera
        from chimera import Coord
        from MMTK import Units
        s = Units.Ang
        sum = 0.0
        count = 0
        for ma in self.universe.atomList():
            if ma.fixed:
                continue
            ca = ma.getAtomProperty(ma, "chimera_atom")
            p = ma.position()
            c = Coord(p[0] / s, p[1] / s, p[2] / s)
            dsq = (c - ca.coord()).sqlength()
            ca.setCoord(c)
            #print "%.6f" % dsq
            sum += dsq
            count += 1
        import math
        if count > 0:
            print "Updated", count, "atoms.  RMSD: %.6f" \
             % math.sqrt(sum / count)
        else:
            print "No atoms updated."

    def minimize(self,
                 nsteps,
                 stepsize=0.02,
                 interval=None,
                 action=None,
                 **kw):
        from chimera import replyobj
        timestamp("_minimize")
        from MMTK import Units
        from MMTK.ForceFields.Amber import AmberData
        from MMTK.Minimization import SteepestDescentMinimizer
        from MMTK.Trajectory import LogOutput
        import sys
        if not interval:
            actions = []
        else:
            actions = [
                LogOutput(sys.stdout, ["energy"], interval, None, interval)
            ]
        kw["step_size"] = stepsize * Units.Ang
        minimizer = SteepestDescentMinimizer(self.universe,
                                             actions=actions,
                                             **kw)
        if action is None or not interval:
            interval = None
        msg = "Initial energy: %f" % self.universe.energy()
        replyobj.status(msg)
        replyobj.info(msg)
        saveNormalizeName = AmberData._normalizeName
        AmberData._normalizeName = simpleNormalizeName
        remaining = nsteps
        while remaining > 0:
            timestamp(" minimize interval")
            if interval is None:
                realSteps = remaining
            else:
                realSteps = min(remaining, interval)
            minimizer(steps=realSteps)
            remaining -= realSteps
            if action is not None:
                action(self)
            timestamp(" finished %d steps" % realSteps)
            msg = "Finished %d of %d minimization steps" % (nsteps - remaining,
                                                            nsteps)
            replyobj.status(msg)
            replyobj.info(msg)
        replyobj.info("\n")
        AmberData._normalizeName = saveNormalizeName
        timestamp("end _minimize")

    def getTempDir(self):
        if self.tempDir:
            return self.tempDir
        from tempfile import mkdtemp
        self.tempDir = mkdtemp()
        #self.tempDir = "."
        return self.tempDir

    def _removeTempDir(self):
        if not self.tempDir:
            return
        if True:
            import os, os.path
            for filename in os.listdir(self.tempDir):
                os.remove(os.path.join(self.tempDir, filename))
            os.rmdir(self.tempDir)
        else:
            print "Did not clean up temp dir", self.tempDir
        self.tempDir = None
Ejemplo n.º 10
0
class MMTKinter:

	def __init__(self, mols, nogui=False, addhyd=True,
			ljOptions=None, esOptions=None, callback=None):
		# MMTK lengths are in nm while Chimera ones are in Angstroms
		# so we need a scale factor when converting
		if not mols:
			raise ValueError("No molecules specified")
		self.tempDir = None
		self.molId = 0
		self.ljOptions = ljOptions
		self.esOptions = esOptions
		self.callback = callback
		self.mols = mols
		self._getParameters(mols, nogui, addhyd)

	def _finishInit(self):
		timestamp("_finishInit")
		self.molecules = []
		self.atomMap = {}
		try:
			for m in self.mols:
				self.molecules.append(self._makeMolecule(m))
			self._makeUniverse()
			if self.callback:
				self.callback(self)
				del self.callback
		finally:
			self._removeTempDir()

	def _makeUniverse(self):
		import os.path
		parmDir = os.path.dirname(__file__)
		timestamp("_makeUniverse")
		from MMTK import InfiniteUniverse
		from MMTK.ForceFields.Amber import AmberData
		from MMTK.ForceFields.Amber.AmberForceField import readAmber99
		from MMTK.ForceFields.MMForceField import MMForceField
		#
		# GAFF uses lower case atom types to distinguish
		# from Amber atom types.  MMTK, however, normalizes
		# all atom types to upper case.  So we hack MMTK
		# and temporarily replace _normalizeName function
		# with ours while reading our parameter files.
		# (We have to reread the parameter file each time
		# because we potentially have different frcmod files
		# for the different universes.)
		#
		saveNormalizeName = AmberData._normalizeName
		AmberData._normalizeName = simpleNormalizeName
		modFiles = [ m.frcmod for m in self.molecules
				if m.frcmod is not None]
		parameters = readAmber99(os.path.join(parmDir,
							"parm", "gaff.dat"),
						modFiles)
		self._mergeAmber99(parameters)
		bondedScaleFactor = 1.0
		ff = MMForceField("Amber99/GAFF", parameters, self.ljOptions,
					self.esOptions, bondedScaleFactor)
		AmberData._normalizeName = saveNormalizeName

		timestamp("Made forcefield")
		self.universe = InfiniteUniverse(ff)
		timestamp("Made universe")
		for mm in self.molecules:
			self.universe.addObject(mm)
			timestamp("Added model %s" % mm.name)
		timestamp("end _makeUniverse")

	def _getParameters(self, mols, nogui, addhyd):
		timestamp("_getParameters")
		import DockPrep
		import chimera
		self.originalAtoms = set([])
		for m in mols:
			self.originalAtoms.update(m.atoms)
		from AddCharge import AMBER99SB
		kw = { "doneCB": self._finishDockPrep, "gaffType": True,
			"chargeModel": AMBER99SB }
		if nogui or chimera.nogui:
			if not addhyd:
				kw["addHFunc"] = None
			DockPrep.prep(mols, nogui=nogui, **kw)
		else:
			from DockPrep.gui import DockPrepDialog
			from chimera import dialogs
			d = dialogs.display(DockPrepDialog.name, wait=True)
			d.addHydVar.set(addhyd)
			d.applyKeywords = kw
			d.molListBox.setvalue(mols)
			d.writeMol2Var.set(False)
		"""
		d = DockPrep.memoryPrep("Minimize", "use", mols, nogui=nogui, **kw)
		if d:
			d.addHydVar.set(addhyd)
			d.writeMol2Var.set(False)
		"""


	def _finishDockPrep(self):
		timestamp("end _getParameters")
		from chimera import selection
		selectedAtoms = set(selection.currentAtoms())
		addSelected = []
		numAdded = 0
		for m in self.mols:
			for a in m.atoms:
				if a in self.originalAtoms:
					continue
				numAdded += 1
				# This atom was added.  If it was added to
				# a selected atom, then we add this atom
				# into the current selection as well.
				for b in a.bonds:
					oa = a.bonds[0].otherAtom(a)
					if oa in selectedAtoms:
						addSelected.append(a)
						break
		del self.originalAtoms
		if addSelected:
			selection.addCurrent(addSelected)
		#from chimera import replyobj
		#replyobj.info("%d atoms added, %d selected\n"
		#		% (numAdded, len(addSelected)))
		self._finishInit()

	def _mergeAmber99(self, parm):
		"Merge MMTK Amber99 parameters into our parameters"
		from MMTK.ForceFields.Amber.AmberForceField import readAmber99
		parm99 = readAmber99()
		parm.atom_types.update(parm99.atom_types)
		parm.bonds.update(parm99.bonds)
		parm.bond_angles.update(parm99.bond_angles)
		parm.dihedrals.update(parm99.dihedrals)
		parm.dihedrals_2.update(parm99.dihedrals_2)
		parm.impropers.update(parm99.impropers)
		parm.impropers_1.update(parm99.impropers_1)
		parm.impropers_2.update(parm99.impropers_2)
		parm.hbonds.update(parm99.hbonds)
		parm.lj_equivalent.update(parm99.lj_equivalent)
		for name, ljpar_set99 in parm99.ljpar_sets.iteritems():
			try:
				ljpar_set = parm.ljpar_sets[name]
			except KeyError:
				parm.ljpar_sets[name] = ljpar_set99
			else:
				if ljpar_set.type != ljpar_set99.type:
					print "incompatible ljpar_set"
					print " GAFF type:", ljpar_set.type
					print " AMBER99 type:", ljpar_set99.type
				ljpar_set.entries.update(ljpar_set99.entries)

	def _makeMolecule(self, m):
		timestamp("_makeMolecule %s" % m.name)
		mm = MMTKChimeraModel(m, self.molId, self)
		self.molId += 1
		timestamp("end _makeMolecule")
		return mm

	def setFixed(self, which):
		from chimera import selection
		if which == "none" or selection.currentEmpty():
			for ma in self.universe.atomList():
				ma.fixed = False
		elif which == "selected":
			import chimera
			for ma in self.universe.atomList():
				ma.fixed = False
			for a in selection.currentAtoms():
				if a.molecule in self.mols:
					ma = self.atomMap[a]
					ma.fixed = True
		else:
			import chimera
			for ma in self.universe.atomList():
				ma.fixed = True
			for a in selection.currentAtoms():
				if a.molecule in self.mols:
					ma = self.atomMap[a]
					ma.fixed = False

	def loadMMTKCoordinates(self):
		"Load MMTK coordinates from Chimera models"
		import chimera
		from Scientific.Geometry import Vector
		from MMTK import Units
		s = Units.Ang
		for ma in self.universe.atomList():
			try:
				ca = ma.getAtomProperty(ma, "chimera_atom")
			except AttributeError:
				pass
			else:
				c = ca.coord()
				p = Vector(c[0] * s, c[1] * s, c[2] * s)
				ma.setPosition(p)

	def saveMMTKCoordinates(self):
		"Save MMTK coordinates into Chimera models"
		import chimera
		from chimera import Coord
		from MMTK import Units
		s = Units.Ang
		sum = 0.0
		count = 0
		for ma in self.universe.atomList():
			if ma.fixed:
				continue
			ca = ma.getAtomProperty(ma, "chimera_atom")
			p = ma.position()
			c = Coord(p[0] / s, p[1] / s, p[2] / s)
			dsq = (c - ca.coord()).sqlength()
			ca.setCoord(c)
			#print "%.6f" % dsq
			sum += dsq
			count += 1
		import math
		if count > 0:
			print "Updated", count, "atoms.  RMSD: %.6f" \
				% math.sqrt(sum / count)
		else:
			print "No atoms updated."

	def minimize(self, nsteps, stepsize=0.02,
			interval=None, action=None, **kw):
		from chimera import replyobj
		timestamp("_minimize")
		from MMTK import Units
		from MMTK.ForceFields.Amber import AmberData
		from MMTK.Minimization import SteepestDescentMinimizer
		from MMTK.Trajectory import LogOutput
		import sys
		if not interval:
			actions = []
		else:
			actions = [ LogOutput(sys.stdout, ["energy"],
						interval, None, interval) ]
		kw["step_size"] = stepsize * Units.Ang
		minimizer = SteepestDescentMinimizer(self.universe,
							actions=actions, **kw)
		if action is None or not interval:
			interval = None
		msg = "Initial energy: %f" % self.universe.energy()
		replyobj.status(msg)
		replyobj.info(msg)
		saveNormalizeName = AmberData._normalizeName
		AmberData._normalizeName = simpleNormalizeName
		remaining = nsteps
		while remaining > 0:
			timestamp(" minimize interval")
			if interval is None:
				realSteps = remaining
			else:
				realSteps = min(remaining, interval)
			minimizer(steps=realSteps)
			remaining -= realSteps
			if action is not None:
				action(self)
			timestamp(" finished %d steps" % realSteps)
			msg = "Finished %d of %d minimization steps" % (
						nsteps - remaining, nsteps)
			replyobj.status(msg)
			replyobj.info(msg)
		replyobj.info("\n")
		AmberData._normalizeName = saveNormalizeName
		timestamp("end _minimize")

	def getTempDir(self):
		if self.tempDir:
			return self.tempDir
		from tempfile import mkdtemp
		self.tempDir = mkdtemp()
		#self.tempDir = "."
		return self.tempDir

	def _removeTempDir(self):
		if not self.tempDir:
			return
		if True:
			import os, os.path
			for filename in os.listdir(self.tempDir):
				os.remove(os.path.join(self.tempDir, filename))
			os.rmdir(self.tempDir)
		else:
			print "Did not clean up temp dir", self.tempDir
		self.tempDir = None