def get_atom_with_map_num(mol, map_num, expected_results): atom = utils.get_atom_with_map_num(mol, map_num) symbol, num_hydrogens = expected_results assert (atom.GetSymbol() == symbol) assert (atom.GetTotalNumHs() == num_hydrogens)
def _create_reactants(self): self._process_nucleophile() map_nums = (self.TEMPLATE_OLIGOMERIZATION_MAP_NUM, self.BACKBONE_NITROGEN_MAP_NUM) if isinstance(self.model, models.Sidechain): monomer = self._create_monomer() self.reactants = [ utils.connect_mols(monomer, self.template, map_nums=map_nums, clear_map_nums=False) ] else: # remove wildcard atom attached to n-terminus added in call to tag_monomer_connection_atom() wildcard_atom = utils.get_atom_with_map_num( self.reacting_atom, self.N_TERM_WILDCARD_MAP_NUM) self.reacting_mol = Chem.RWMol(self.reacting_mol) self.reacting_mol.RemoveAtom(wildcard_atom.GetIdx()) # connect template to monomer self.reactants = [ utils.connect_mols(self.reacting_mol, self.template, map_nums=map_nums, clear_map_nums=False) ]
def test_remove_atom(mol, map_num, symbol): atom = utils.get_atom_with_map_num(mol, map_num) prev_num_atoms = len(mol.GetAtoms()) mol = utils.remove_atom(mol, atom.GetIdx()) atoms = mol.GetAtoms() assert (len(atoms) == prev_num_atoms - 1) for atom in atoms: assert (atom.GetSymbol() != symbol)
def _validate_sidechain(self): connection_atom = utils.get_atom_with_map_num( self.reacting_mol, self.SIDECHAIN_OLIGOMERIZATION_MAP_NUM) paths = Chem.FindAllPathsOfLengthN( self.reacting_mol, 3, useBonds=False, rootedAtAtom=self.reacting_atom.GetIdx()) atoms = set().union([atom for path in paths for atom in path]) if connection_atom.GetIdx() not in atoms - set( atom.GetIdx() for atom in connection_atom.GetNeighbors()): raise InvalidMolecule( 'The attachment point of the reacting sidechain must be two atoms away from the reacting atom in a pictet spangler reaction!' )
def _validate_monomer(self): try: n_term_atom = utils.get_atom_with_map_num( self.reacting_mol, self.BACKBONE_NITROGEN_MAP_NUM) paths = Chem.FindAllPathsOfLengthN( self.reacting_mol, 5, useBonds=False, rootedAtAtom=self.reacting_atom.GetIdx()) atoms = set().union([atom for path in paths for atom in path]) if n_term_atom.GetIdx() not in atoms - set( atom.GetIdx() for atom in n_term_atom.GetNeighbors()): raise InvalidMolecule( 'The reacting atom in the monomer must be 4 atoms away from the N-terminus!' ) except (AttributeError, RuntimeError): raise InvalidMolecule
def get_atom_with_map_num_fail(mol, map_num): with pytest.raises(RuntimeError): atom = utils.get_atom_with_map_num(mol, map_num)