diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 0439bb3b..220db383 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -20,7 +20,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.9", "3.10", "3.11"] steps: - uses: actions/checkout@v4 diff --git a/simulations/terphenyl_mop/tetramer_remd/t_250_450/bespoke/remd_parameters.yml b/simulations/terphenyl_mop/tetramer_remd/t_250_450/bespoke/remd_parameters.yml index 9345e3ce..40637fb5 100644 --- a/simulations/terphenyl_mop/tetramer_remd/t_250_450/bespoke/remd_parameters.yml +++ b/simulations/terphenyl_mop/tetramer_remd/t_250_450/bespoke/remd_parameters.yml @@ -9,4 +9,4 @@ sim_id : sim build_foldamer : mop_tetramer.build param_method : bespoke n_replicas : 3 -gromacs_exe : +gromacs_exe : gmx diff --git a/terphenyl_simulations/analysis_workflows/remd.py b/terphenyl_simulations/analysis_workflows/remd.py index 31d2a459..6d617fb7 100644 --- a/terphenyl_simulations/analysis_workflows/remd.py +++ b/terphenyl_simulations/analysis_workflows/remd.py @@ -103,11 +103,22 @@ def parameterize_foldamer(job): path = job.fn("") ) top_generator.assign_parameters() + job.doc['foldamer_topology'] = top_generator.top_file + job.doc['foldamer_gro'] = top_generator.gro_file @FlowProject.pre.after(parameterize_foldamer) @FlowProject.operation def minimize_foldamer(job): + top_dir = os.path.abspath(".") + os.chdir(job.fn("")) + gmx_wrapper = terphenyl_simulations.gromacs_wrapper.GromacsWrapper(job.sp['gromacs_exe']) + out_name = job.doc['foldamer_gro'].split('.gro')[0] + '_centered.gro' + gmx_wrapper.center(job.doc['foldamer_gro'], out_name) + job.doc['foldamer_gro'] = out_name + gmx_wrapper.minimize(job.doc['foldamer_gro'], job.doc['foldamer_topology']) + os.chdir(top_dir) + @FlowProject.pre.after(build_system) diff --git a/terphenyl_simulations/build.py b/terphenyl_simulations/build.py index 4583dc91..330f9743 100644 --- a/terphenyl_simulations/build.py +++ b/terphenyl_simulations/build.py @@ -234,8 +234,15 @@ def __init__(self, build_file_yml, ff_method, path="", ff_name = "openff-2.0.0") 'force field parameter generation methods. Please pick from:\n' + \ ' '.join(self._ff_generation_methods.keys())) + # Define other attributes populated by other functions + self.md_engine = None + self.top_file = None + self.gro_file = None + def set_simulation_engine(self, md_engine_object): self.md_engine = md_engine_object def assign_parameters(self): - self.ff_generator.assign_parameters() \ No newline at end of file + top_file, gro_file = self.ff_generator.assign_parameters() + self.top_file = top_file + self.gro_file = gro_file \ No newline at end of file diff --git a/terphenyl_simulations/force_fields.py b/terphenyl_simulations/force_fields.py index 030cb698..19ba8ad6 100644 --- a/terphenyl_simulations/force_fields.py +++ b/terphenyl_simulations/force_fields.py @@ -23,7 +23,8 @@ def __init__(self, mol_file, pdb_file, path="", ff_str="openff-2.0.0"): def assign_parameters(self, charge_method = 'am1bcc'): self._get_partial_charges(charge_method) - self._generate_ff_topologies() + top_file, gro_file = self._generate_ff_topologies() + return top_file, gro_file def _get_partial_charges(self, method="am1bcc"): sdf_file = os.path.join( @@ -45,8 +46,12 @@ def _generate_ff_topologies(self): ) interchange.positions = self.pdb_file.getPositions() - interchange.to_top(os.path.join(self.path, self.name + "_openff-2.0.0.top")) - interchange.to_gro(os.path.join(self.path, self.name + "_openff-2.0.0.gro")) + top_file = os.path.join(self.path, self.name + "_openff-2.0.0.top") + gro_file = os.path.join(self.path, self.name + "_openff-2.0.0.gro") + interchange.to_top(top_file) + interchange.to_gro(gro_file) + + return top_file, gro_file diff --git a/terphenyl_simulations/gromacs_wrapper.py b/terphenyl_simulations/gromacs_wrapper.py index bd97b731..60d2c0c2 100644 --- a/terphenyl_simulations/gromacs_wrapper.py +++ b/terphenyl_simulations/gromacs_wrapper.py @@ -30,9 +30,16 @@ def __init__(self, gromacs_exe = None, path = '.'): self.mpi = True self.gmx = 'mpirun -np 1 ' + self.gmx + def center(self, gro_file, out_file): + editconf_call = self.gmx + ' editconf -f ' + gro_file + \ + ' -c yes' + \ + ' -o ' + out_file + process = subprocess.Popen(editconf_call.split(' ')) + process.wait() + def minimize(self, gro_file, top_file, prefix = 'em', mdp = 'em.mdp'): # Check for mdp file - if mdp not in os.listdir(self.path): + if not mdp in os.listdir(self.path): mdp = os.path.join(ROOT_DIR, 'data/simulation_templates/remd/em.mdp') # Run gmx grompp @@ -50,7 +57,7 @@ def minimize(self, gro_file, top_file, prefix = 'em', mdp = 'em.mdp'): process = subprocess.Popen(mdrun_call.split(' ')) process.wait() - +