Source code for icolos.core.workflow_steps.schrodinger.prepwizard
from icolos.utils.enums.step_enums import StepGromacsEnum, StepPrepwizEnum
from icolos.utils.enums.program_parameters import SchrodingerExecutablesEnum
from icolos.core.workflow_steps.schrodinger.base import StepSchrodingerBase
from icolos.utils.execute_external.schrodinger import SchrodingerExecutor
from icolos.core.containers.generic import GenericData
from pydantic import BaseModel
from copy import deepcopy
import os
_SEE = SchrodingerExecutablesEnum()
_SGE = StepGromacsEnum()
_SPE = StepPrepwizEnum()
[docs]class StepPrepwizard(StepSchrodingerBase, BaseModel):
"""
Interface to Schrodinger's PrepWizard program for protein prep
"""
def __init__(self, **data):
super().__init__(**data)
self._initialize_backend(executor=SchrodingerExecutor)
self._check_backend_availability()
def _parse_args(self):
parameters = deepcopy(self.settings.arguments.parameters)
arguments = []
if len(self.settings.arguments.flags) > 0:
for flag in self.settings.arguments.flags:
arguments.append(str(flag))
if parameters:
for key in parameters.keys():
arguments.append(key)
if parameters[key] is not None and parameters[key] != "":
arguments.append(str(parameters[key]))
input_file = self.data.generic.get_file_names_by_extension("pdb")[0]
output_file = input_file # write to the same file name to keep things tidy
arguments.append(input_file)
arguments.append(output_file)
return arguments
def _parse_output(self, tmp_dir: str):
output_pdb = os.path.join(
tmp_dir, self.data.generic.get_file_names_by_extension("pdb")[0]
)
with open(output_pdb, "r") as f:
data = f.read()
self.data.generic.clear_file_dict()
output_file = GenericData(file_name=_SGE.COMPLEX_PDB, file_data=data)
self.data.generic.add_file(output_file)
def _remove_ligand(self, tmp_dir):
remove_res = self.settings.additional[_SPE.REMOVE_RES]
pdb_file = self.data.generic.get_argument_by_extension("pdb")
cleaned_pdb_lines = []
# handle ligand removal mode: strip ligands, leave cofactors
if remove_res != _SPE.LIGANDS and not isinstance(remove_res, list):
remove_res = list(remove_res)
with open(os.path.join(tmp_dir, pdb_file), "r") as f:
if remove_res == _SPE.LIGANDS:
# automatically remove ligands, keep cofactors that are specified in the enum.
for line in f.readlines():
if (
line is not None
and len(line.split()) > 3
and (
line.split()[0] == "ATOM"
or any(l in line for l in _SPE.COFACTOR_IDS)
)
):
cleaned_pdb_lines.append(line)
else:
for line in f.readlines():
if not any(l in line for l in remove_res):
cleaned_pdb_lines.append(line)
with open(os.path.join(tmp_dir, pdb_file), "w") as f:
f.writelines(cleaned_pdb_lines)
[docs] def execute(self):
tmp_dir = self._make_tmpdir()
args = self._parse_args()
self.data.generic.write_out_all_files(tmp_dir)
if (
_SPE.REMOVE_RES in self.settings.additional.keys()
and self.settings.additional[_SPE.REMOVE_RES] is not None
):
self._remove_ligand(tmp_dir)
self._backend_executor.execute(
command=_SEE.PREPWIZARD, arguments=args, check=True, location=tmp_dir
)
self._parse_output(tmp_dir)