Source code for mlipx.nodes.smiles

import pathlib

import ase
import ase.io as aio
import zntrack


[docs] class Smiles2Conformers(zntrack.Node): """Create conformers from a SMILES string. Parameters ---------- smiles : str The SMILES string. num_confs : int The number of conformers to generate. random_seed : int The random seed. max_attempts : int The maximum number of attempts. """ smiles: str = zntrack.params() num_confs: int = zntrack.params() random_seed: int = zntrack.params(42) max_attempts: int = zntrack.params(1000) frames_path: pathlib.Path = zntrack.outs_path(zntrack.nwd / "frames.xyz") def run(self): from rdkit2ase import smiles2conformers conformers = smiles2conformers( self.smiles, numConfs=self.num_confs, randomSeed=self.random_seed, maxAttempts=self.max_attempts, ) aio.write(self.frames_path, conformers) @property def frames(self) -> list[ase.Atoms]: with self.state.fs.open(self.frames_path, "r") as f: return list(aio.iread(f, format="extxyz"))
[docs] class BuildBox(zntrack.Node): """Build a box from a list of atoms. Parameters ---------- data : list[list[ase.Atoms]] A list of lists of ASE Atoms objects representing the molecules to be packed. counts : list[int] A list of integers representing the number of each type of molecule. density : float The target density of the packed system in kg/m^3 """ data: list[list[ase.Atoms]] = zntrack.deps() counts: list[int] = zntrack.params() density: float = zntrack.params(1000) frames_path: pathlib.Path = zntrack.outs_path(zntrack.nwd / "frames.xyz") def run(self): from rdkit2ase import pack atoms = pack(data=self.data, counts=self.counts, density=self.density) aio.write(self.frames_path, atoms) @property def frames(self) -> list[ase.Atoms]: with self.state.fs.open(self.frames_path, "r") as f: return list(aio.iread(f, format="extxyz"))