Commit 8985aee6 by Christian Margreitter

Improved temporary file generation and allowing auto-generation of required…

Improved temporary file generation and allowing auto-generation of required output folder structure for both ligand embedding and docking phases.
parent ac69a9e6
...@@ -18,6 +18,7 @@ from dockstream.utils.enums.AutodockVina_enums import AutodockVinaExecutablesEnu ...@@ -18,6 +18,7 @@ from dockstream.utils.enums.AutodockVina_enums import AutodockVinaExecutablesEnu
from dockstream.utils.execute_external.OpenBabel import OpenBabelExecutor from dockstream.utils.execute_external.OpenBabel import OpenBabelExecutor
from dockstream.utils.enums.OpenBabel_enums import OpenBabelExecutablesEnum from dockstream.utils.enums.OpenBabel_enums import OpenBabelExecutablesEnum
from dockstream.utils.enums.RDkit_enums import RDkitLigandPreparationEnum from dockstream.utils.enums.RDkit_enums import RDkitLigandPreparationEnum
from dockstream.utils.general_utils import gen_temp_file
from dockstream.utils.translations.molecule_translator import MoleculeTranslator from dockstream.utils.translations.molecule_translator import MoleculeTranslator
from dockstream.utils.dockstream_exceptions import DockingRunFailed from dockstream.utils.dockstream_exceptions import DockingRunFailed
...@@ -112,7 +113,7 @@ class AutodockVina(Docker, BaseModel): ...@@ -112,7 +113,7 @@ class AutodockVina(Docker, BaseModel):
def _write_molecule_to_pdbqt(self, path, molecule) -> bool: def _write_molecule_to_pdbqt(self, path, molecule) -> bool:
# generate temporary copy as PDB # generate temporary copy as PDB
_, temp_pdb = tempfile.mkstemp(suffix=".pdb") temp_pdb = gen_temp_file(suffix=".pdb")
Chem.MolToPDBFile(mol=molecule, filename=temp_pdb) Chem.MolToPDBFile(mol=molecule, filename=temp_pdb)
# Note: In contrast to the target preparation, # Note: In contrast to the target preparation,
...@@ -149,8 +150,8 @@ class AutodockVina(Docker, BaseModel): ...@@ -149,8 +150,8 @@ class AutodockVina(Docker, BaseModel):
for ligand in sublist: for ligand in sublist:
# generate temporary input files and output directory # generate temporary input files and output directory
cur_tmp_output_dir = tempfile.mkdtemp() cur_tmp_output_dir = tempfile.mkdtemp()
_, cur_tmp_input_pdbqt = tempfile.mkstemp(prefix=str(start_index), suffix=".pdbqt", dir=cur_tmp_output_dir) cur_tmp_input_pdbqt = gen_temp_file(prefix=str(start_index), suffix=".pdbqt", dir=cur_tmp_output_dir)
_, cur_tmp_output_sdf = tempfile.mkstemp(prefix=str(start_index), suffix=".sdf", dir=cur_tmp_output_dir) cur_tmp_output_sdf = gen_temp_file(prefix=str(start_index), suffix=".sdf", dir=cur_tmp_output_dir)
# write-out the temporary input file # write-out the temporary input file
if ligand.get_molecule() is None: if ligand.get_molecule() is None:
...@@ -250,11 +251,11 @@ class AutodockVina(Docker, BaseModel): ...@@ -250,11 +251,11 @@ class AutodockVina(Docker, BaseModel):
def _dock_subjob(self, input_path_pdbqt, output_path_sdf): def _dock_subjob(self, input_path_pdbqt, output_path_sdf):
# at the moment, the log file is not parsed # at the moment, the log file is not parsed
_, path_log_file = tempfile.mkstemp(suffix=".log", dir=os.path.dirname(input_path_pdbqt)) path_log_file = gen_temp_file(suffix=".log", dir=os.path.dirname(input_path_pdbqt))
# set up arguments list and execute # set up arguments list and execute
# TODO: support "ensemble docking" - currently, only the first entry is used # TODO: support "ensemble docking" - currently, only the first entry is used
_, tmp_pdbqt_docked = tempfile.mkstemp(suffix=".pdbqt", dir=os.path.dirname(input_path_pdbqt)) tmp_pdbqt_docked = gen_temp_file(suffix=".pdbqt", dir=os.path.dirname(input_path_pdbqt))
search_space = self.parameters.search_space search_space = self.parameters.search_space
arguments = [_EE.VINA_RECEPTOR, self.parameters.receptor_pdbqt_path[0], arguments = [_EE.VINA_RECEPTOR, self.parameters.receptor_pdbqt_path[0],
_EE.VINA_LIGAND, input_path_pdbqt, _EE.VINA_LIGAND, input_path_pdbqt,
......
...@@ -60,7 +60,7 @@ class AutodockVinaTargetPreparator(TargetPreparator): ...@@ -60,7 +60,7 @@ class AutodockVinaTargetPreparator(TargetPreparator):
def _export_as_pdb2pdbqt(self, path): def _export_as_pdb2pdbqt(self, path):
# generate temporary copy # generate temporary copy
_, temp_target_pdb = tempfile.mkstemp(suffix=".pdb") temp_target_pdb = gen_temp_file(suffix=".pdb")
Chem.MolToPDBFile(mol=self._target, filename=temp_target_pdb) Chem.MolToPDBFile(mol=self._target, filename=temp_target_pdb)
# set target pH value that determines the protein's side-chain states # set target pH value that determines the protein's side-chain states
......
...@@ -14,6 +14,7 @@ from dockstream.core.ligand.ligand import get_next_enumeration_number_for_ligand ...@@ -14,6 +14,7 @@ from dockstream.core.ligand.ligand import get_next_enumeration_number_for_ligand
from dockstream.core.ligand_preparator import LigandPreparator, _LE from dockstream.core.ligand_preparator import LigandPreparator, _LE
from dockstream.utils.dockstream_exceptions import LigandPreparationFailed from dockstream.utils.dockstream_exceptions import LigandPreparationFailed
from dockstream.utils.general_utils import gen_temp_file
from dockstream.utils.smiles import to_mol from dockstream.utils.smiles import to_mol
from dockstream.utils.execute_external.Corina import CorinaExecutor from dockstream.utils.execute_external.Corina import CorinaExecutor
...@@ -137,8 +138,8 @@ class CorinaLigandPreparator(LigandPreparator, BaseModel): ...@@ -137,8 +138,8 @@ class CorinaLigandPreparator(LigandPreparator, BaseModel):
# 1) generate temporary folder and files # 1) generate temporary folder and files
tmp_output_dir_path = tempfile.mkdtemp() tmp_output_dir_path = tempfile.mkdtemp()
fd, tmp_smiles_path = tempfile.mkstemp(suffix=".smi", dir=tmp_output_dir_path) tmp_smiles_path = gen_temp_file(suffix=".smi", dir=tmp_output_dir_path)
fd, tmp_molecules_path = tempfile.mkstemp(suffix=".sdf", dir=tmp_output_dir_path) tmp_molecules_path = gen_temp_file(suffix=".sdf", dir=tmp_output_dir_path)
# 2) save the SMILES # 2) save the SMILES
with open(tmp_smiles_path, 'w') as f: with open(tmp_smiles_path, 'w') as f:
......
...@@ -23,6 +23,7 @@ from dockstream.core.docker import Docker ...@@ -23,6 +23,7 @@ from dockstream.core.docker import Docker
from dockstream.core.Gold.Gold_result_parser import GoldResultParser from dockstream.core.Gold.Gold_result_parser import GoldResultParser
from dockstream.utils.enums.Gold_enums import GoldLigandPreparationEnum from dockstream.utils.enums.Gold_enums import GoldLigandPreparationEnum
from dockstream.utils.enums.Gold_enums import GoldTargetKeywordEnum, GoldExecutablesEnum, GoldOutputEnum from dockstream.utils.enums.Gold_enums import GoldTargetKeywordEnum, GoldExecutablesEnum, GoldOutputEnum
from dockstream.utils.general_utils import gen_temp_file
from dockstream.utils.translations.molecule_translator import MoleculeTranslator from dockstream.utils.translations.molecule_translator import MoleculeTranslator
from dockstream.utils.dockstream_exceptions import DockingRunFailed from dockstream.utils.dockstream_exceptions import DockingRunFailed
...@@ -114,15 +115,14 @@ class Gold(Docker): ...@@ -114,15 +115,14 @@ class Gold(Docker):
tmpdir = tempfile.mkdtemp() tmpdir = tempfile.mkdtemp()
if self._target_dict[_TK.CAVITY_METHOD] == _TK.CAVITY_METHOD_REFERENCE: if self._target_dict[_TK.CAVITY_METHOD] == _TK.CAVITY_METHOD_REFERENCE:
# write ligand to temporary file (ending copied over in settings) # write ligand to temporary file (ending copied over in settings)
_, tmp_ref_ligand_path = tempfile.mkstemp(suffix=self._target_dict[_TK.REFERENCE_LIGAND_FILENAME], tmp_ref_ligand_path = gen_temp_file(suffix=self._target_dict[_TK.REFERENCE_LIGAND_FILENAME], dir=tmpdir)
dir=tmpdir)
with open(tmp_ref_ligand_path, 'w') as file: with open(tmp_ref_ligand_path, 'w') as file:
for line in self._target_dict[_TK.REFERENCE_LIGAND]: for line in self._target_dict[_TK.REFERENCE_LIGAND]:
file.write(line) file.write(line)
self._logger.log(f"Wrote temporary ligand file {tmp_ref_ligand_path} with {len(self._target_dict[_TK.REFERENCE_LIGAND])} lines.", _LE.DEBUG) self._logger.log(f"Wrote temporary ligand file {tmp_ref_ligand_path} with {len(self._target_dict[_TK.REFERENCE_LIGAND])} lines.", _LE.DEBUG)
# write target PDB to temporary file # write target PDB to temporary file
_, tmp_target_path = tempfile.mkstemp(suffix=".pdb", dir=tmpdir) tmp_target_path = gen_temp_file(suffix=".pdb", dir=tmpdir)
with open(tmp_target_path, 'w') as file: with open(tmp_target_path, 'w') as file:
for line in self._target_dict[_TK.TARGET_PDB]: for line in self._target_dict[_TK.TARGET_PDB]:
file.write(line) file.write(line)
...@@ -172,7 +172,7 @@ class Gold(Docker): ...@@ -172,7 +172,7 @@ class Gold(Docker):
for start_index, sublist in zip(start_indices, sublists): for start_index, sublist in zip(start_indices, sublists):
# generate temporary input files and output directory # generate temporary input files and output directory
cur_tmp_output_dir = tempfile.mkdtemp() cur_tmp_output_dir = tempfile.mkdtemp()
_, cur_tmp_sdf = tempfile.mkstemp(prefix=str(start_index), suffix=".sdf", dir=cur_tmp_output_dir) cur_tmp_sdf = gen_temp_file(prefix=str(start_index), suffix=".sdf", dir=cur_tmp_output_dir)
# write-out the temporary input file # write-out the temporary input file
writer = Chem.SDWriter(cur_tmp_sdf) writer = Chem.SDWriter(cur_tmp_sdf)
...@@ -191,7 +191,7 @@ class Gold(Docker): ...@@ -191,7 +191,7 @@ class Gold(Docker):
continue continue
# add the path to which "_dock_subjob()" will write the result SDF # add the path to which "_dock_subjob()" will write the result SDF
_, output_sdf_path = tempfile.mkstemp(prefix=str(start_index), suffix="_result.sdf", dir=cur_tmp_output_dir) output_sdf_path = gen_temp_file(prefix=str(start_index), suffix="_result.sdf", dir=cur_tmp_output_dir)
tmp_output_dirs.append(cur_tmp_output_dir) tmp_output_dirs.append(cur_tmp_output_dir)
tmp_output_sdf_paths.append(output_sdf_path) tmp_output_sdf_paths.append(output_sdf_path)
tmp_input_sdf_paths.append(cur_tmp_sdf) tmp_input_sdf_paths.append(cur_tmp_sdf)
......
...@@ -14,6 +14,7 @@ from copy import deepcopy ...@@ -14,6 +14,7 @@ from copy import deepcopy
from dockstream.core.ligand.ligand import Ligand, get_enumerations_for_ligand from dockstream.core.ligand.ligand import Ligand, get_enumerations_for_ligand
from dockstream.core.ligand_preparator import LigandPreparator, _LE from dockstream.core.ligand_preparator import LigandPreparator, _LE
from dockstream.utils.general_utils import gen_temp_file
from dockstream.utils.parallelization.general_utils import split_into_sublists, get_progress_bar_string from dockstream.utils.parallelization.general_utils import split_into_sublists, get_progress_bar_string
from dockstream.loggers.blank_logger import BlankLogger from dockstream.loggers.blank_logger import BlankLogger
...@@ -158,8 +159,8 @@ class OmegaLigandPreparator(LigandPreparator, BaseModel): ...@@ -158,8 +159,8 @@ class OmegaLigandPreparator(LigandPreparator, BaseModel):
# generate temporary input files and output directory # generate temporary input files and output directory
cur_tmp_output_dir = tempfile.mkdtemp() cur_tmp_output_dir = tempfile.mkdtemp()
tmp_output_dirs.append(cur_tmp_output_dir) tmp_output_dirs.append(cur_tmp_output_dir)
_, cur_tmp_sdf = tempfile.mkstemp(prefix=str(start_index), suffix=".sdf", dir=cur_tmp_output_dir) cur_tmp_sdf = gen_temp_file(prefix=str(start_index), suffix=".sdf", dir=cur_tmp_output_dir)
_, cur_tmp_smi = tempfile.mkstemp(prefix=str(start_index), suffix=".smi", dir=cur_tmp_output_dir) cur_tmp_smi = gen_temp_file(prefix=str(start_index), suffix=".smi", dir=cur_tmp_output_dir)
tmp_input_smi_paths.append(cur_tmp_smi) tmp_input_smi_paths.append(cur_tmp_smi)
# write smiles to temporary file as "OMEGA" backend # write smiles to temporary file as "OMEGA" backend
...@@ -168,7 +169,7 @@ class OmegaLigandPreparator(LigandPreparator, BaseModel): ...@@ -168,7 +169,7 @@ class OmegaLigandPreparator(LigandPreparator, BaseModel):
f.write(lig.get_smile() + " " + lig.get_identifier() + "\n") f.write(lig.get_smile() + " " + lig.get_identifier() + "\n")
# add the path to which "_dock_subjob()" will write the result SDF # add the path to which "_dock_subjob()" will write the result SDF
_, output_sdf_path = tempfile.mkstemp(prefix=str(start_index), suffix="_result.sdf", dir=cur_tmp_output_dir) output_sdf_path = gen_temp_file(prefix=str(start_index), suffix="_result.sdf", dir=cur_tmp_output_dir)
tmp_output_sdf_paths.append(output_sdf_path) tmp_output_sdf_paths.append(output_sdf_path)
return tmp_output_dirs, tmp_input_smi_paths, tmp_output_sdf_paths return tmp_output_dirs, tmp_input_smi_paths, tmp_output_sdf_paths
......
...@@ -18,6 +18,7 @@ from dockstream.core.docker import Docker ...@@ -18,6 +18,7 @@ from dockstream.core.docker import Docker
from dockstream.core.OpenEyeHybrid.OpenEyeHybrid_result_parser import OpenEyeHybridResultParser from dockstream.core.OpenEyeHybrid.OpenEyeHybrid_result_parser import OpenEyeHybridResultParser
from dockstream.utils.enums.OE_Hybrid_enums import OpenEyeHybridLigandPreparationEnum from dockstream.utils.enums.OE_Hybrid_enums import OpenEyeHybridLigandPreparationEnum
from dockstream.utils.enums.OE_Hybrid_enums import OpenEyeHybridExecutablesEnum, OpenEyeHybridOutputKeywordsEnum from dockstream.utils.enums.OE_Hybrid_enums import OpenEyeHybridExecutablesEnum, OpenEyeHybridOutputKeywordsEnum
from dockstream.utils.general_utils import gen_temp_file
from dockstream.utils.translations.molecule_translator import MoleculeTranslator from dockstream.utils.translations.molecule_translator import MoleculeTranslator
from dockstream.utils.dockstream_exceptions import DockingRunFailed from dockstream.utils.dockstream_exceptions import DockingRunFailed
...@@ -101,7 +102,7 @@ class OpenEyeHybrid(Docker): ...@@ -101,7 +102,7 @@ class OpenEyeHybrid(Docker):
for start_index, sublist in zip(start_indices, sublists): for start_index, sublist in zip(start_indices, sublists):
# generate temporary input files and output directory # generate temporary input files and output directory
cur_tmp_output_dir = tempfile.mkdtemp() cur_tmp_output_dir = tempfile.mkdtemp()
_, cur_tmp_sdf = tempfile.mkstemp(prefix=str(start_index), suffix=".sdf", dir=cur_tmp_output_dir) cur_tmp_sdf = gen_temp_file(prefix=str(start_index), suffix=".sdf", dir=cur_tmp_output_dir)
# write-out the temporary input file # write-out the temporary input file
one_written = False one_written = False
...@@ -123,7 +124,7 @@ class OpenEyeHybrid(Docker): ...@@ -123,7 +124,7 @@ class OpenEyeHybrid(Docker):
tmp_input_sdf_paths.append(cur_tmp_sdf) tmp_input_sdf_paths.append(cur_tmp_sdf)
# add the path to which "_dock_subjob()" will write the result SDF # add the path to which "_dock_subjob()" will write the result SDF
_, output_sdf_path = tempfile.mkstemp(prefix=str(start_index), suffix="_result.sdf", dir=cur_tmp_output_dir) output_sdf_path = gen_temp_file(prefix=str(start_index), suffix="_result.sdf", dir=cur_tmp_output_dir)
tmp_output_sdf_paths.append(output_sdf_path) tmp_output_sdf_paths.append(output_sdf_path)
return tmp_output_dirs, tmp_input_sdf_paths, tmp_output_sdf_paths return tmp_output_dirs, tmp_input_sdf_paths, tmp_output_sdf_paths
......
...@@ -21,6 +21,7 @@ from dockstream.utils.enums.ligand_preparation_enum import LigandPreparationEnum ...@@ -21,6 +21,7 @@ from dockstream.utils.enums.ligand_preparation_enum import LigandPreparationEnum
from dockstream.utils.enums.Schrodinger_enums import SchrodingerExecutablesEnum, \ from dockstream.utils.enums.Schrodinger_enums import SchrodingerExecutablesEnum, \
SchrodingerDockingConfigurationEnum, \ SchrodingerDockingConfigurationEnum, \
SchrodingerOutputEnum SchrodingerOutputEnum
from dockstream.utils.general_utils import gen_temp_file
from dockstream.utils.translations.molecule_translator import MoleculeTranslator from dockstream.utils.translations.molecule_translator import MoleculeTranslator
from dockstream.utils.files_paths import any_in_file from dockstream.utils.files_paths import any_in_file
...@@ -336,7 +337,7 @@ class Glide(Docker, BaseModel): ...@@ -336,7 +337,7 @@ class Glide(Docker, BaseModel):
# arrange the elements and blocks # arrange the elements and blocks
if path is None: if path is None:
_, path = tempfile.mkstemp(suffix=".in") path = gen_temp_file(suffix=".in")
with open(path, mode='w') as f: with open(path, mode='w') as f:
self._logger.log(f"Writing GLIDE input file {path}:\n", _LE.DEBUG) self._logger.log(f"Writing GLIDE input file {path}:\n", _LE.DEBUG)
for line in element_lines: for line in element_lines:
...@@ -362,8 +363,8 @@ class Glide(Docker, BaseModel): ...@@ -362,8 +363,8 @@ class Glide(Docker, BaseModel):
for start_index, sublist in zip(start_indices, sublists): for start_index, sublist in zip(start_indices, sublists):
# generate temporary input files and output directory # generate temporary input files and output directory
cur_tmp_output_dir = tempfile.mkdtemp() cur_tmp_output_dir = tempfile.mkdtemp()
_, cur_tmp_sdf = tempfile.mkstemp(prefix=str(start_index), suffix=".sdf", dir=cur_tmp_output_dir) cur_tmp_sdf = gen_temp_file(prefix=str(start_index), suffix=".sdf", dir=cur_tmp_output_dir)
_, cur_tmp_mae = tempfile.mkstemp(prefix=str(start_index), suffix=".mae", dir=cur_tmp_output_dir) cur_tmp_mae = gen_temp_file(prefix=str(start_index), suffix=".mae", dir=cur_tmp_output_dir)
# write-out the temporary input file # write-out the temporary input file
writer = Chem.SDWriter(cur_tmp_sdf) writer = Chem.SDWriter(cur_tmp_sdf)
...@@ -385,7 +386,7 @@ class Glide(Docker, BaseModel): ...@@ -385,7 +386,7 @@ class Glide(Docker, BaseModel):
self._translate_SDF_to_MAE(sdf_path=cur_tmp_sdf, mae_path=cur_tmp_mae) self._translate_SDF_to_MAE(sdf_path=cur_tmp_sdf, mae_path=cur_tmp_mae)
# add the path to which "_dock_subjob()" will write the result SDF # add the path to which "_dock_subjob()" will write the result SDF
_, output_sdf_path = tempfile.mkstemp(prefix=str(start_index), suffix="_result.sdf", dir=cur_tmp_output_dir) output_sdf_path = gen_temp_file(prefix=str(start_index), suffix="_result.sdf", dir=cur_tmp_output_dir)
tmp_output_sdf_paths.append(output_sdf_path) tmp_output_sdf_paths.append(output_sdf_path)
tmp_input_mae_paths.append(cur_tmp_mae) tmp_input_mae_paths.append(cur_tmp_mae)
tmp_output_dirs.append(cur_tmp_output_dir) tmp_output_dirs.append(cur_tmp_output_dir)
...@@ -474,7 +475,7 @@ class Glide(Docker, BaseModel): ...@@ -474,7 +475,7 @@ class Glide(Docker, BaseModel):
keywords[_EE.GLIDE_LIGANDFILE] = mae_ligand_path keywords[_EE.GLIDE_LIGANDFILE] = mae_ligand_path
# 2) write the keyword-input file for the "Glide" backend; write-out to temporary file # 2) write the keyword-input file for the "Glide" backend; write-out to temporary file
_, glide_keywords_path = tempfile.mkstemp(suffix=".in", dir=tmp_output_dir) glide_keywords_path = gen_temp_file(suffix=".in", dir=tmp_output_dir)
_ = self._write_keywords_to_file(keywords=keywords, path=glide_keywords_path) _ = self._write_keywords_to_file(keywords=keywords, path=glide_keywords_path)
# 3) wait / sleep until job is completed # 3) wait / sleep until job is completed
......
...@@ -17,6 +17,7 @@ from dockstream.core.Schrodinger.license_token_guard import SchrodingerLicenseTo ...@@ -17,6 +17,7 @@ from dockstream.core.Schrodinger.license_token_guard import SchrodingerLicenseTo
from dockstream.loggers.blank_logger import BlankLogger from dockstream.loggers.blank_logger import BlankLogger
from dockstream.core.ligand_preparator import LigandPreparator, _LE from dockstream.core.ligand_preparator import LigandPreparator, _LE
from dockstream.utils.general_utils import gen_temp_file
from dockstream.utils.parallelization.general_utils import split_into_sublists, get_progress_bar_string from dockstream.utils.parallelization.general_utils import split_into_sublists, get_progress_bar_string
...@@ -215,8 +216,8 @@ class LigprepLigandPreparator(LigandPreparator, BaseModel): ...@@ -215,8 +216,8 @@ class LigprepLigandPreparator(LigandPreparator, BaseModel):
# generate temporary input files and output directory # generate temporary input files and output directory
cur_tmp_output_dir = tempfile.mkdtemp() cur_tmp_output_dir = tempfile.mkdtemp()
tmp_output_dirs.append(cur_tmp_output_dir) tmp_output_dirs.append(cur_tmp_output_dir)
_, cur_tmp_smi = tempfile.mkstemp(prefix=str(start_index), suffix=".smi", dir=cur_tmp_output_dir) cur_tmp_smi = gen_temp_file(prefix=str(start_index), suffix=".smi", dir=cur_tmp_output_dir)
_, cur_tmp_filter = tempfile.mkstemp(prefix=str(start_index), suffix=".lff", dir=cur_tmp_output_dir) cur_tmp_filter = gen_temp_file(prefix=str(start_index), suffix=".lff", dir=cur_tmp_output_dir)
tmp_input_smi_paths.append(cur_tmp_smi) tmp_input_smi_paths.append(cur_tmp_smi)
tmp_input_filter_paths.append(cur_tmp_filter) tmp_input_filter_paths.append(cur_tmp_filter)
...@@ -226,7 +227,7 @@ class LigprepLigandPreparator(LigandPreparator, BaseModel): ...@@ -226,7 +227,7 @@ class LigprepLigandPreparator(LigandPreparator, BaseModel):
f.write(lig.get_smile() + " " + lig.get_identifier() + "\n") f.write(lig.get_smile() + " " + lig.get_identifier() + "\n")
# add the path to which "_dock_subjob()" will write the result SDF # add the path to which "_dock_subjob()" will write the result SDF
_, output_sdf_path = tempfile.mkstemp(prefix=str(start_index), suffix="_result.sdf", dir=cur_tmp_output_dir) output_sdf_path = gen_temp_file(prefix=str(start_index), suffix="_result.sdf", dir=cur_tmp_output_dir)
tmp_output_sdf_paths.append(output_sdf_path) tmp_output_sdf_paths.append(output_sdf_path)
return tmp_output_dirs, tmp_input_smi_paths, tmp_output_sdf_paths, tmp_input_filter_paths return tmp_output_dirs, tmp_input_smi_paths, tmp_output_sdf_paths, tmp_input_filter_paths
......
...@@ -10,6 +10,7 @@ from dockstream.utils.execute_external.TautEnum import TautEnumExecutor ...@@ -10,6 +10,7 @@ from dockstream.utils.execute_external.TautEnum import TautEnumExecutor
from dockstream.utils.enums.taut_enum_enums import TautEnumEnum from dockstream.utils.enums.taut_enum_enums import TautEnumEnum
from dockstream.utils.enums.logging_enums import LoggingConfigEnum from dockstream.utils.enums.logging_enums import LoggingConfigEnum
from dockstream.core.ligand.ligand import Ligand, get_next_enumeration_number_for_ligand from dockstream.core.ligand.ligand import Ligand, get_next_enumeration_number_for_ligand
from dockstream.utils.general_utils import gen_temp_file
class TautEnumSmilePreparator: class TautEnumSmilePreparator:
...@@ -40,8 +41,8 @@ class TautEnumSmilePreparator: ...@@ -40,8 +41,8 @@ class TautEnumSmilePreparator:
# 1) generate temporary folder and files # 1) generate temporary folder and files
tmp_output_dir_path = tempfile.mkdtemp() tmp_output_dir_path = tempfile.mkdtemp()
fd, tmp_input_smiles_path = tempfile.mkstemp(suffix=".smi", dir=tmp_output_dir_path) tmp_input_smiles_path = gen_temp_file(suffix=".smi", dir=tmp_output_dir_path)
fd, tmp_output_smiles_path = tempfile.mkstemp(suffix=".smi", dir=tmp_output_dir_path) tmp_output_smiles_path = gen_temp_file(suffix=".smi", dir=tmp_output_dir_path)
# 2) save the SMILES # 2) save the SMILES
original_smiles = [] original_smiles = []
......
import os
import abc import abc
import time import time
from copy import deepcopy from copy import deepcopy
...@@ -12,6 +11,7 @@ from pydantic import BaseModel, PrivateAttr ...@@ -12,6 +11,7 @@ from pydantic import BaseModel, PrivateAttr
from dockstream.loggers.docking_logger import DockingLogger from dockstream.loggers.docking_logger import DockingLogger
from dockstream.loggers.blank_logger import BlankLogger from dockstream.loggers.blank_logger import BlankLogger
from dockstream.utils.dockstream_exceptions import DockingRunFailed from dockstream.utils.dockstream_exceptions import DockingRunFailed
from dockstream.utils.files_paths import generate_folder_structure
from dockstream.utils.parallelization.general_utils import split_into_sublists, get_progress_bar_string from dockstream.utils.parallelization.general_utils import split_into_sublists, get_progress_bar_string
from dockstream.utils.enums.ligand_preparation_enum import LigandPreparationEnum from dockstream.utils.enums.ligand_preparation_enum import LigandPreparationEnum
...@@ -285,6 +285,10 @@ class Docker(BaseModel, metaclass=abc.ABCMeta): ...@@ -285,6 +285,10 @@ class Docker(BaseModel, metaclass=abc.ABCMeta):
if not self._docking_performed: if not self._docking_performed:
raise DockingRunFailed("Do the docking first.") raise DockingRunFailed("Do the docking first.")
selected_conformers = self._select_conformers(mode=mode, mol_type=mol_type) selected_conformers = self._select_conformers(mode=mode, mol_type=mol_type)
# generate folder structure, if not available
generate_folder_structure(filepath=path)
if mol_type == _LPE.TYPE_RDKIT: if mol_type == _LPE.TYPE_RDKIT:
import rdkit.Chem as Chem import rdkit.Chem as Chem
writer = Chem.SDWriter(path) writer = Chem.SDWriter(path)
...@@ -377,6 +381,10 @@ class Docker(BaseModel, metaclass=abc.ABCMeta): ...@@ -377,6 +381,10 @@ class Docker(BaseModel, metaclass=abc.ABCMeta):
self._logger.log(f"Score output mode \"{mode}\" is unknown - write-out of scores failed.", self._logger.log(f"Score output mode \"{mode}\" is unknown - write-out of scores failed.",
_LE.ERROR) _LE.ERROR)
raise DockingRunFailed() raise DockingRunFailed()
# generate folder structure, if not available
generate_folder_structure(filepath=path)
df_buffer.to_csv(path_or_buf=path, df_buffer.to_csv(path_or_buf=path,
sep=',', sep=',',
na_rep='', na_rep='',
......
...@@ -19,6 +19,7 @@ from dockstream.utils.enums.RDkit_enums import RDkitLigandPreparationEnum ...@@ -19,6 +19,7 @@ from dockstream.utils.enums.RDkit_enums import RDkitLigandPreparationEnum
from dockstream.utils.enums.logging_enums import LoggingConfigEnum from dockstream.utils.enums.logging_enums import LoggingConfigEnum
from dockstream.utils.enums.transformations_enums import TransformationEnum from dockstream.utils.enums.transformations_enums import TransformationEnum
from dockstream.utils.enums.stereo_enumeration_enums import StereoEnumerationEnum from dockstream.utils.enums.stereo_enumeration_enums import StereoEnumerationEnum
from dockstream.utils.files_paths import generate_folder_structure
_DE = DockingConfigurationEnum() _DE = DockingConfigurationEnum()
_LP = LigandPreparationEnum() _LP = LigandPreparationEnum()
...@@ -220,6 +221,9 @@ class LigandPreparator(BaseModel): ...@@ -220,6 +221,9 @@ class LigandPreparator(BaseModel):
format = format.upper() format = format.upper()
ligands_copy = [deepcopy(lig) for lig in self.ligands] ligands_copy = [deepcopy(lig) for lig in self.ligands]
# generate folder structure, if not available
generate_folder_structure(filepath=path)
# check and specify format of file # check and specify format of file
# RDkit does not support the write-out of MOL2 files (apparently because of the format's inherent ambiguity) # RDkit does not support the write-out of MOL2 files (apparently because of the format's inherent ambiguity)
if format == _LP.OUTPUT_FORMAT_SDF: if format == _LP.OUTPUT_FORMAT_SDF:
......
...@@ -16,6 +16,7 @@ from dockstream.utils.enums.logging_enums import LoggingConfigEnum ...@@ -16,6 +16,7 @@ from dockstream.utils.enums.logging_enums import LoggingConfigEnum
from dockstream.utils.execute_external.rDock import rDockExecutor from dockstream.utils.execute_external.rDock import rDockExecutor
from dockstream.utils.enums.rDock_enums import rDockExecutablesEnum, rDockDockingConfigurationEnum, rDockRbdockOutputEnum from dockstream.utils.enums.rDock_enums import rDockExecutablesEnum, rDockDockingConfigurationEnum, rDockRbdockOutputEnum
from dockstream.utils.enums.RDkit_enums import RDkitLigandPreparationEnum from dockstream.utils.enums.RDkit_enums import RDkitLigandPreparationEnum
from dockstream.utils.general_utils import gen_temp_file
from dockstream.utils.translations.molecule_translator import MoleculeTranslator from dockstream.utils.translations.molecule_translator import MoleculeTranslator
from dockstream.utils.dockstream_exceptions import DockingRunFailed from dockstream.utils.dockstream_exceptions import DockingRunFailed
...@@ -88,7 +89,7 @@ class rDock(Docker): ...@@ -88,7 +89,7 @@ class rDock(Docker):
# generate temporary input file and output directory into which "rbdock" will deposit the poses # generate temporary input file and output directory into which "rbdock" will deposit the poses
cur_tmp_output_dir = tempfile.mkdtemp() cur_tmp_output_dir = tempfile.mkdtemp()
_, cur_tmp_sdf = tempfile.mkstemp(prefix=str(start_index), suffix=".sdf", dir=cur_tmp_output_dir) cur_tmp_sdf = gen_temp_file(prefix=str(start_index), suffix=".sdf", dir=cur_tmp_output_dir)
# write-out the temporary input file # write-out the temporary input file
one_written = False one_written = False
......
...@@ -70,7 +70,7 @@ class rDockTargetPreparator(TargetPreparator): ...@@ -70,7 +70,7 @@ class rDockTargetPreparator(TargetPreparator):
# --> bottom line: use openbabel instead of RDkit # --> bottom line: use openbabel instead of RDkit
# generate temporary copy in Mol2 file # generate temporary copy in Mol2 file
_, temp_target_pdb = tempfile.mkstemp(suffix=".pdb") temp_target_pdb = gen_temp_file(suffix=".pdb")
Chem.MolToPDBFile(mol=self._target, filename=temp_target_pdb) Chem.MolToPDBFile(mol=self._target, filename=temp_target_pdb)
# kekulization of bonds leads to problems with PDB conversion of aromatic side-chains - ignore for now # kekulization of bonds leads to problems with PDB conversion of aromatic side-chains - ignore for now
...@@ -97,7 +97,8 @@ class rDockTargetPreparator(TargetPreparator): ...@@ -97,7 +97,8 @@ class rDockTargetPreparator(TargetPreparator):
line = [line for line in lines if "Total volume" in line][0] line = [line for line in lines if "Total volume" in line][0]
result[self._GK.SPECIFYCAVITY_METADATA_TOTALVOLUME] = float(line.split()[2]) result[self._GK.SPECIFYCAVITY_METADATA_TOTALVOLUME] = float(line.split()[2])
# cavity 1, example: Cavity #1 Size=8206 points; Vol=1025.75 A^3; Min=(-5,1.5,18.5); Max=(13.5,20,31.5); Center=(4.5011,9.94851,24.5739); Extent=(18.5,18.5,13) # cavity 1, example: Cavity #1 Size=8206 points; Vol=1025.75 A^3; Min=(-5,1.5,18.5); Max=(13.5,20,31.5);
# Center=(4.5011,9.94851,24.5739); Extent=(18.5,18.5,13)
line = [line for line in lines if "Cavity #1" in line][0] line = [line for line in lines if "Cavity #1" in line][0]
parts = line.split() parts = line.split()
result[self._GK.SPECIFYCAVITY_METADATA_SIZEINPOINTS] = int(parts[2].split(sep='=')[1]) result[self._GK.SPECIFYCAVITY_METADATA_SIZEINPOINTS] = int(parts[2].split(sep='=')[1])
......
import os import os
import time import time
import json import json
from pathlib import Path
def wait_until_file_generation(path, interval_sec=1, maximum_sec=None) -> bool: def wait_until_file_generation(path, interval_sec=1, maximum_sec=None) -> bool:
...@@ -58,3 +59,8 @@ def any_in_file(path, strings): ...@@ -58,3 +59,8 @@ def any_in_file(path, strings):
return False return False
else: else:
return False return False
def generate_folder_structure(filepath: str):
folder_path = os.path.dirname(filepath)
Path(folder_path).mkdir(parents=True, exist_ok=True)
import os
import tempfile
from dockstream.utils.files_paths import attach_root_path from dockstream.utils.files_paths import attach_root_path
...@@ -44,3 +46,10 @@ def parse_setuppy(): ...@@ -44,3 +46,10 @@ def parse_setuppy():
if "author" in line: if "author" in line:
parsed_dict["author"] = line[line.find('"')+len('"'):line.rfind('"')] parsed_dict["author"] = line[line.find('"')+len('"'):line.rfind('"')]
return parsed_dict return parsed_dict
# note that "text" is True (in contrast to the underlying "mkstemp")
def gen_temp_file(suffix=None, prefix=None, dir=None, text=True) -> str:
filehandler, path = tempfile.mkstemp(suffix=suffix, prefix=prefix, dir=dir, text=text)
os.close(filehandler)
return path
...@@ -84,7 +84,7 @@ if __name__ == "__main__": ...@@ -84,7 +84,7 @@ if __name__ == "__main__":
pdb_prep = PDBPreparator(conf=config) pdb_prep = PDBPreparator(conf=config)
# generate a temporary PDB file, that will be the input later # generate a temporary PDB file, that will be the input later
_, temp_pdb_file = tempfile.mkstemp(suffix=".pdb") temp_pdb_file = gen_temp_file(suffix=".pdb")
# apply the specified fixing and set the input PDB file # apply the specified fixing and set the input PDB file
pdb_prep.fix_pdb(input_pdb_file=input_pdb_path, pdb_prep.fix_pdb(input_pdb_file=input_pdb_path,
......
...@@ -7,6 +7,7 @@ from rdkit import Chem ...@@ -7,6 +7,7 @@ from rdkit import Chem
from dockstream.core.pdb_preparator import PDBPreparator from dockstream.core.pdb_preparator import PDBPreparator
from dockstream.containers.target_preparation_container import TargetPreparationContainer from dockstream.containers.target_preparation_container import TargetPreparationContainer
from dockstream.utils.enums.target_preparation_enum import TargetPreparationEnum from dockstream.utils.enums.target_preparation_enum import TargetPreparationEnum
from dockstream.utils.general_utils import gen_temp_file
from tests.tests_paths import PATHS_1UYD from tests.tests_paths import PATHS_1UYD
from dockstream.utils.files_paths import attach_root_path from dockstream.utils.files_paths import attach_root_path
...@@ -33,7 +34,7 @@ class Test_PDBPreparation(unittest.TestCase): ...@@ -33,7 +34,7 @@ class Test_PDBPreparation(unittest.TestCase):
self._TE.FIX_REMOVEHETEROGENS: True, self._TE.FIX_REMOVEHETEROGENS: True,
self._TE.FIX_MISSINGHYDROGENS: False}}}) self._TE.FIX_MISSINGHYDROGENS: False}}})
input_pdb_file = attach_root_path(PATHS_1UYD.TARGET_APO_PDB) input_pdb_file = attach_root_path(PATHS_1UYD.TARGET_APO_PDB)
_, temp_pdb_output = tempfile.mkstemp(suffix=".pdb") temp_pdb_output = gen_temp_file(suffix=".pdb")
input_mol = Chem.MolFromPDBFile(input_pdb_file, sanitize=True) input_mol = Chem.MolFromPDBFile(input_pdb_file, sanitize=True)
# first processing: add water box and do not fix hydrogens that are missing # first processing: add water box and do not fix hydrogens that are missing
...@@ -51,7 +52,7 @@ class Test_PDBPreparation(unittest.TestCase): ...@@ -51,7 +52,7 @@ class Test_PDBPreparation(unittest.TestCase):
os.remove(temp_pdb_output) os.remove(temp_pdb_output)
# second processing: no water box and but add hydrogens # second processing: no water box and but add hydrogens
_, temp_pdb_output = tempfile.mkstemp(suffix=".pdb") temp_pdb_output = gen_temp_file(suffix=".pdb")
conf[self._TE.TARGETPREP][self._TE.FIX][self._TE.FIX_ADDWATERBOX] = False conf[self._TE.TARGETPREP][self._TE.FIX][self._TE.FIX_ADDWATERBOX] = False
conf[self._TE.TARGETPREP][self._TE.FIX][self._TE.FIX_MISSINGHYDROGENS] = True conf[self._TE.TARGETPREP][self._TE.FIX][self._TE.FIX_MISSINGHYDROGENS] = True
prep = PDBPreparator(conf=conf) prep = PDBPreparator(conf=conf)
...@@ -69,7 +70,7 @@ class Test_PDBPreparation(unittest.TestCase): ...@@ -69,7 +70,7 @@ class Test_PDBPreparation(unittest.TestCase):
self._TE.FIX_REMOVEHETEROGENS: True, self._TE.FIX_REMOVEHETEROGENS: True,
self._TE.FIX_MISSINGHYDROGENS: True}}}) self._TE.FIX_MISSINGHYDROGENS: True}}})
input_pdb_file = attach_root_path(PATHS_1UYD.LIGAND_MISSING_PARTS_PDB) input_pdb_file = attach_root_path(PATHS_1UYD.LIGAND_MISSING_PARTS_PDB)
_, temp_pdb_output = tempfile.mkstemp(suffix=".pdb") temp_pdb_output = gen_temp_file(suffix=".pdb")
input_mol = Chem.MolFromPDBFile(input_pdb_file, sanitize=True) input_mol = Chem.MolFromPDBFile(input_pdb_file, sanitize=True)
prep = PDBPreparator(conf=conf) prep = PDBPreparator(conf=conf)
self.assertEqual(input_mol.GetNumAtoms(), 1892) self.assertEqual(input_mol.GetNumAtoms(), 1892)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment