simulate.py 5.61 KiB
import os
import tempfile
from .coords import readArbdCoords, readAvgArbdCoords
import shutil
from . import get_resource_path
arbd="/home/cmaffeo2/development/cuda/arbd.dbg/src/arbd" # reduced the mem footprint cause vmd
namd="/home/cmaffeo2/development/namd-bin/NAMD_Git-2017-07-06_Linux-x86_64-multicore-CUDA/namd2"
def multiresolution_simulation( model, output_name,
job_id=None,
gpu = 0,
directory=None,
coarse_steps = 5e7,
fine_steps = 5e7,
coarse_output_period = 1e5,
fine_output_period = 1e5,
remove_long_bonds=False,
backbone_scale=1.0,
):
## Round steps up to nearest multiple of output_period, plus 1
coarse_steps = ((coarse_steps+coarse_output_period-1)//coarse_output_period)*coarse_output_period+1
fine_steps = ((fine_steps+fine_output_period-1)//fine_output_period)
if fine_steps == 1: fine_steps += 1
fine_steps = fine_steps*fine_output_period+1
ret = None
d_orig = os.getcwd()
try:
if directory is None:
tmp = job_id if job_id is not None else output_name
directory = tempfile.mkdtemp(prefix='origami-%s-' % tmp, dir='/dev/shm/')
elif not os.path.exists(directory):
os.makedirs(directory)
os.chdir(directory)
output_directory = "output"
# TODO: add the output directory in to the readArbdCoords functions or make it an attribute of the model object
""" Coarse simulation """
simargs = dict(timestep=200e-6, output_period=coarse_output_period, gpu=gpu)
model._clear_beads()
model._generate_bead_model( 5, 5, local_twist=False )
if remove_long_bonds:
output_prefix = "%s-0" % output_name
full_output_prefix = "%s/%s" % (output_directory,output_prefix)
## TODO Remove long bonds
model.simulate( output_name = output_prefix, numSteps=0.05*coarse_steps, **simargs )
try:
coordinates = readArbdCoords('%s.restart' % full_output_prefix)
except:
coordinates = readArbdCoords('%s.0.restart' % full_output_prefix)
output_prefix = "%s-1" % output_name
model.update_splines(coordinates)
model.simulate( output_prefix = output_prefix, num_steps=0.95*coarse_steps, **simargs )
else:
output_prefix = "%s-1" % output_name
full_output_prefix = "%s/%s" % (output_directory,output_prefix)
model.simulate( output_name = output_prefix, num_steps=coarse_steps, **simargs )
try:
coordinates = readArbdCoords('%s.restart' % full_output_prefix)
except:
coordinates = readArbdCoords('%s.0.restart' % full_output_prefix)
""" Fine simulation """
output_prefix = "%s-2" % output_name
full_output_prefix = "%s/%s" % (output_directory,output_prefix)
simargs['timestep'] = 50e-6
simargs['output_period'] = fine_output_period
model.update_splines(coordinates)
model._clear_beads()
model._generate_bead_model( 1, 1, local_twist=True, escapable_twist=True )
model.simulate( output_name = output_prefix, num_steps=fine_steps, **simargs )
if fine_steps <= 2*fine_output_period+1:
try:
coordinates = readArbdCoords('%s.restart' % full_output_prefix)
except:
coordinates = readArbdCoords('%s.0.restart' % full_output_prefix)
else:
try:
coordinates = readAvgArbdCoords('%s.psf' % output_prefix,'%s.pdb' % output_prefix, '%s.dcd' % full_output_prefix, rmsdThreshold=1)
except:
coordinates = readAvgArbdCoords('%s.psf' % output_prefix,'%s.pdb' % output_prefix, '%s.0.dcd' % full_output_prefix, rmsdThreshold=1)
""" Freeze twist """
output_prefix = "%s-3" % output_name
full_output_prefix = "%s/%s" % (output_directory,output_prefix)
model.update_splines(coordinates)
model._clear_beads()
model._generate_bead_model( 1, 1, local_twist=True, escapable_twist=False )
model.simulate( output_name = output_prefix, num_steps=fine_steps, **simargs )
if fine_steps <= 2*fine_output_period+1:
try:
coordinates = readArbdCoords('%s.restart' % full_output_prefix)
except:
coordinates = readArbdCoords('%s.0.restart' % full_output_prefix)
else:
try:
coordinates = readAvgArbdCoords('%s.psf' % output_prefix,'%s.pdb' % output_prefix, '%s.dcd' % full_output_prefix, rmsdThreshold=1)
except:
coordinates = readAvgArbdCoords('%s.psf' % output_prefix,'%s.pdb' % output_prefix, '%s.0.dcd' % full_output_prefix, rmsdThreshold=1)
""" Atomic simulation """
output_prefix = "%s-4" % output_name
full_output_prefix = "%s/%s" % (output_directory,output_prefix)
model.update_splines(coordinates)
model._clear_beads()
model._generate_atomic_model(scale=backbone_scale)
try:
shutil.copytree( get_resource_path("charmm36.nbfix"), "charmm36.nbfix" )
except FileExistsError:
...
model.write_atomic_ENM( output_prefix )
model.atomic_simulate( output_name = output_prefix )
ret = directory
except:
raise
finally:
os.chdir(d_orig)
return ret