Source code for icolos.core.workflow_steps.calculation.lomap

import lomap
from icolos.core.containers.perturbation_map import PerturbationMap
from icolos.core.workflow_steps.step import StepBase
from pydantic import BaseModel
import networkx as nx
import os
from icolos.utils.enums.program_parameters import OpenBabelEnum

from icolos.utils.execute_external.openbabel import OpenBabelExecutor
from rdkit import Chem

_OBE = OpenBabelEnum()


[docs]class StepLomap(StepBase, BaseModel): _openbabel_executor: OpenBabelExecutor = None def __init__(self, **data): super().__init__(**data) self._openbabel_executor = OpenBabelExecutor()
[docs] def execute(self): # compute either mcs or radial graph, end up with networkX object which needs to be parsed into a PerturbationMap object tmp_dir = self._make_tmpdir() existing_dir = os.getcwd() os.chdir(tmp_dir) self.write_conformers(os.path.join(tmp_dir, "confs.sdf")) # separate into individual files with obabel args = ["-isdf", "confs.sdf", "-osdf", "-O", "out.sdf", "-m"] self._openbabel_executor.execute( command=_OBE.OBABEL, arguments=args, check=True, location=tmp_dir ) os.remove(os.path.join(tmp_dir, "confs.sdf")) # now rename each file such that it matches the index string for f in os.listdir(tmp_dir): with Chem.SDMolSupplier(f) as s: header = s[0].GetProp("_Name") os.rename(f, f"{header}.sdf") topology = self._get_additional_setting("topology") radial = True if topology == "radial" else False # hub_compound_name = self._get_additional_setting("hub_compound") # assert hub_compound_name is not None # hub_compound = self.get_compound_by_name(hub_compound_name) # if hub_compound: # raise NameError( # f"Hub compound {hub_compound_name} was not found in the compound list!" # ) # write mols out to sdf files dbmol = lomap.DBMolecules( tmp_dir, self.execution.parallelization.jobs, output=True, radial=radial ) strict, loose = dbmol.build_matrices() strict_np = strict.to_numpy_2D_array() loose_np = loose.to_numpy_2D_array() # generate the nx graph nx_graph = dbmol.build_graph() p_map = PerturbationMap( compounds=self.get_compounds(), ) p_map.generate_from_lomap_output( os.path.join(tmp_dir, "out_score_with_connection.txt") ) # revert to old wd os.chdir(existing_dir) self.get_workflow_object().set_perturbation_map(p_map)