def get_representative_molecule(self, mode='minimal', update=True): if mode == 'minimal': # create a molecule from fragment.vertices.copy mapping = self.copyAndMap() # replace CuttingLabel with H atoms = [] for vertex in self.vertices: mapped_vertex = mapping[vertex] if isinstance(mapped_vertex, CuttingLabel): # replace cutting label with atom H atom_H = Atom(element=getElement('H'), radicalElectrons=0, charge=0, lonePairs=0) for bondedAtom, bond in mapped_vertex.edges.iteritems(): new_bond = Bond(bondedAtom, atom_H, order=bond.order) bondedAtom.edges[atom_H] = new_bond del bondedAtom.edges[mapped_vertex] atom_H.edges[bondedAtom] = new_bond mapping[vertex] = atom_H atoms.append(atom_H) else: atoms.append(mapped_vertex) # Note: mapping is a dict with # key: self.vertex and value: mol_repr.atom mol_repr = Molecule() mol_repr.atoms = atoms if update: mol_repr.update() return mol_repr, mapping
def toSMILES(self): cutting_label_list = [] for vertex in self.vertices: if isinstance(vertex, CuttingLabel): cutting_label_list.append(vertex.symbol) SMILES_before = self.copy(deep=True) final_vertices = [] for ind, atom in enumerate(SMILES_before.atoms): element_symbol = atom.symbol if isinstance(atom, CuttingLabel): substi_name = 'Si' substi = Atom(element=substi_name) substi.label = element_symbol for bondedAtom, bond in atom.edges.iteritems(): new_bond = Bond(bondedAtom, substi, order=bond.order) bondedAtom.edges[substi] = new_bond del bondedAtom.edges[atom] substi.edges[bondedAtom] = new_bond substi.radicalElectrons = 3 final_vertices.append(substi) else: final_vertices.append(atom) SMILES_before.vertices = final_vertices mol_repr = Molecule() mol_repr.atoms = SMILES_before.vertices SMILES_after = mol_repr.toSMILES() import re smiles = re.sub('\[Si\]', '', SMILES_after) return smiles
def assign_representative_molecule(self): # create a molecule from fragment.vertices.copy mapping = self.copyAndMap() # replace CuttingLabel with CC atoms = [] additional_atoms = [] additional_bonds = [] for vertex in self.vertices: mapped_vertex = mapping[vertex] if isinstance(mapped_vertex, CuttingLabel): # replace cutting label with atom C atom_C1 = Atom(element=getElement('C'), radicalElectrons=0, charge=0, lonePairs=0) for bondedAtom, bond in mapped_vertex.edges.iteritems(): new_bond = Bond(bondedAtom, atom_C1, order=bond.order) bondedAtom.edges[atom_C1] = new_bond del bondedAtom.edges[mapped_vertex] atom_C1.edges[bondedAtom] = new_bond # add hydrogens and carbon to make it CC atom_H1 = Atom(element=getElement('H'), radicalElectrons=0, charge=0, lonePairs=0) atom_H2 = Atom(element=getElement('H'), radicalElectrons=0, charge=0, lonePairs=0) atom_C2 = Atom(element=getElement('C'), radicalElectrons=0, charge=0, lonePairs=0) atom_H3 = Atom(element=getElement('H'), radicalElectrons=0, charge=0, lonePairs=0) atom_H4 = Atom(element=getElement('H'), radicalElectrons=0, charge=0, lonePairs=0) atom_H5 = Atom(element=getElement('H'), radicalElectrons=0, charge=0, lonePairs=0) atoms.append(atom_C1) additional_atoms.extend( [atom_H1, atom_H2, atom_H3, atom_H4, atom_H5, atom_C2]) additional_bonds.extend([ Bond(atom_C1, atom_H1, 1), Bond(atom_C1, atom_H2, 1), Bond(atom_C2, atom_H3, 1), Bond(atom_C2, atom_H4, 1), Bond(atom_C2, atom_H5, 1), Bond(atom_C1, atom_C2, 1) ]) else: atoms.append(mapped_vertex) mol_repr = Molecule() mol_repr.atoms = atoms for atom in additional_atoms: mol_repr.addAtom(atom) for bond in additional_bonds: mol_repr.addBond(bond) # update connectivity mol_repr.update() # create a species object from molecule self.mol_repr = mol_repr return mapping