Source code for pestifer.tasks.domainswap
# Author: Cameron F. Abrams, <cfa22@drexel.edu>
"""
Definition of the :class:`DomainSwapTask` class for performing domain swaps in molecular dynamics simulations.
This class is a descendant of the :class:`MDTask <pestifer.tasks.md.MDTask>` class and is used to perform domain swaps
using the NAMD molecular dynamics engine.
It generates the necessary input files for a domain swap operation, runs NAMD to execute the swap,
and saves the resulting state of the simulation.
It uses the :ref:`tcl-domainswap` Tcl script. Usage is described in the :ref:`config_ref tasks domainswap` documentation.
"""
import logging
from .mdtask import MDTask
from ..core.artifacts import *
from ..scripters import VMDScripter
logger=logging.getLogger(__name__)
[docs]
class DomainSwapTask(MDTask):
"""
DomainSwapTask class for performing domain swaps in molecular dynamics simulations.
"""
_yaml_header = 'domainswap'
[docs]
def do(self):
self.make_inputs()
self.result = self.namdrun(
baselabel = 'domainswap-run',
extras = {'colvars': 'on', 'colvarsconfig': self.statevars['cv']},
single_gpu_only = True)
return self.result
[docs]
def make_inputs(self):
specs = self.specs
self.next_basename('domainswap-prep')
vm: VMDScripter = self.get_scripter('vmd')
vm.newscript(self.basename)
state: StateArtifacts = self.get_current_artifact('state')
vm.usescript('domainswap')
vm.writescript()
vm.runscript(
psf = state.psf.name,
pdb = state.pdb.name,
swap_domain_def = ','.join(specs['swap_domain_def'].split()),
anchor_domain_def = ','.join(specs['anchor_domain_def'].split()),
chain_swap_pairs = ':'.join([','.join(x) for x in specs['chain_directional_swaps']]),
force_constant = specs['force_constant'],
target_numsteps = specs['target_numsteps'],
cv = f'{self.basename}-cv.in',
refpdb = f'{self.basename}-ref.pdb'
)
self.register(f'{self.basename}-cv', key='in', artifact_type=NAMDColvarsConfigArtifact)
self.register(self.basename, key='tcl', artifact_type=VMDScriptArtifact)
self.register(f'{self.basename}-ref', key='refpdb', artifact_type=PDBFileArtifact)
self.register({self.basename}, key='log', artifact_type=LogFileArtifact)