Source code for schrodinger.application.vss.csvsmiles

import csv

from voluptuous import Required
from voluptuous import Schema

from schrodinger.job import jobcontrol
from schrodinger.utils.fileutils import open_maybe_compressed


[docs]class CsvSmilesFile: SCHEMA = Schema({ Required('filename'): str, Required('smiles_col'): str, Required('cid_col'): str, 'truth_col': str, })
[docs] def __init__(self, *, filename, smiles_col, cid_col, truth_col=None): self.filename = jobcontrol.get_runtime_path(filename) self.cid_col = cid_col self.truth_col = truth_col self.smiles_col = smiles_col
[docs] def to_dict(self): return {k: v for k, v in vars(self).items() if v}
[docs] def validate(self): ''' :return: Validation success and error message. :rtype: (bool, str) ''' with open_maybe_compressed(self.filename, 'rt', newline='') as fp: reader = csv.DictReader(fp) columns = set(reader.fieldnames or []) for col in (self.cid_col, self.smiles_col, self.truth_col): if col and col not in columns: return (False, f"'{self.filename}': lacks '{col}' column") return (True, '')
[docs] def get_dict_reader(self, stack): ''' :param stack: Exit stack. :type stack: `contextlib.ExitStack` ''' return csv.DictReader( stack.enter_context( open_maybe_compressed(self.filename, 'rt', newline='')))
[docs] def get_dict_writer(self, stack, fieldnames=None): ''' :param stack: Exit stack. :type stack: `contextlib.ExitStack` :param fieldnames: CSV column names. :type fieldnames: list(str) or NoneType ''' if fieldnames is None: fieldnames = [self.smiles_col, self.cid_col] if self.truth_col: fieldnames.append(self.truth_col) return csv.DictWriter(stack.enter_context( open_maybe_compressed(self.filename, 'wt', newline='')), fieldnames=fieldnames)
@property def input_files(self): return [self.filename]