Source code for drugforge.data.readers.meta_ligand_factory
import logging
from pathlib import Path
from typing import Optional
from drugforge.data.readers.molfile import MolFileFactory
from drugforge.data.schema.ligand import Ligand
from drugforge.data.services.postera.postera_factory import PosteraFactory
from drugforge.data.services.services_config import PosteraSettings
from pydantic import BaseModel, Field, model_validator
logger = logging.getLogger(__name__)
[docs]
class MetaLigandFactory(BaseModel):
"""
Factory for loading ligands from file or Postera
Parameters
----------
postera : bool
use Postera
postera_molset_name : str
Postera molecule set name
ligand_file : str
Ligand file to read
"""
postera: bool = Field(..., description="use Postera")
postera_molset_name: Optional[str] = Field(
None, description="Postera molecule set name"
)
ligand_file: Optional[str | Path] = Field(..., description="Ligand file to read")
@model_validator(mode="before")
def options_mutex(cls, values):
postera = values.get("postera")
ligand_file = values.get("ligand_file")
if postera and ligand_file:
raise ValueError("cannot specify postera and ligand_file")
return values
@model_validator(mode="before")
def postera_molset_and_name(cls, values):
postera_molset_name = values.get("postera_molset_name")
postera = values.get("postera")
if postera and not postera_molset_name:
raise ValueError("must specify postera_molset_name if postera is specified")
return values
def load(self) -> list[Ligand]:
if self.postera:
# load postera
logger.info(
f"Loading Postera database molecule set {self.postera_molset_name}"
)
postera_settings = PosteraSettings()
postera = PosteraFactory(
settings=postera_settings, molecule_set_name=self.postera_molset_name
)
query_ligands = postera.pull()
else:
# load from file
logger.info(f"Loading ligands from file: {self.ligand_file}")
molfile = MolFileFactory(filename=self.ligand_file)
query_ligands = molfile.load()
return query_ligands