Source code for openff.bespokefit.executor.services.fragmenter.cache

import hashlib

import redis
from openff.toolkit.topology import Molecule

from openff.bespokefit.executor.services.fragmenter import worker
from openff.bespokefit.executor.services.fragmenter.models import FragmenterPOSTBody


[docs]def cached_fragmentation_task( task: FragmenterPOSTBody, redis_connection: redis.Redis ) -> str: """ Check if the fragmentation has been done before if not send it to a worker. """ molecule: Molecule = Molecule.from_mapped_smiles(task.cmiles) fragment_string = task.fragmenter.json() if task.fragmenter else "null" target_bonds_string = ( str(task.target_bond_smarts) if task.target_bond_smarts else "null" ) task_string = ( molecule.to_inchikey(fixed_hydrogens=True) + fragment_string + target_bonds_string ) task_hash = hashlib.sha512(task_string.encode()).hexdigest() task_id = redis_connection.hget("fragmenter:task-ids", task_hash) if task_id is not None: return task_id.decode() task_id = worker.fragment.delay( cmiles=task.cmiles, fragmenter_json=fragment_string, target_bond_smarts=task.target_bond_smarts, ).id # store the result redis_connection.hset("fragmenter:task-ids", task_hash, task_id) return task_id