Spaces:
Paused
Paused
Download utils.py from andreamena/PDCNet: direct link, hf CLI and curl.
- Browser
- Download file 3.15 kB
-
https://huggingface.co/spaces/andreamena/PDCNet/resolve/main/utils.py
- Command line
-
hf download hf://spaces/andreamena/PDCNet/utils.py
-
curl -L -o utils.py https://huggingface.co/spaces/andreamena/PDCNet/resolve/main/utils.py
3.15 kB
| from rdkit import Chem | |
| from rdkit.Chem import rdmolfiles, rdmolops | |
| import numpy as np | |
| import openbabel as ob | |
| import os | |
| import csv | |
| from rdkit import RDConfig | |
| from rdkit.Chem import FragmentCatalog | |
| def fg_list(): # 47 FGs list | |
| fName=os.path.join(RDConfig.RDDataDir,'FunctionalGroups.txt') | |
| fparams = FragmentCatalog.FragCatParams(1,6,fName) | |
| fg_list = [] | |
| for i in range(fparams.GetNumFuncGroups()): | |
| fg_list.append(fparams.GetFuncGroup(i)) | |
| fg_list.pop(27) | |
| x = [Chem.MolToSmiles(_) for _ in fg_list]+['*C=C','*F','*Cl','*Br','*I','[Na+]','*P','*P=O','*[Se]','*[Si]'] | |
| y = set(x) | |
| return list(y) | |
| def obsmitosmile(smi): | |
| conv = ob.OBConversion() | |
| conv.SetInAndOutFormats("smi", "can") | |
| conv.SetOptions("K", conv.OUTOPTIONS) | |
| mol = ob.OBMol() | |
| conv.ReadString(mol, smi) | |
| smile = conv.WriteString(mol) | |
| smile = smile.replace('\t\n', '') | |
| return smile | |
| def molecular_fg(smiles): # Getting functional groups (including rings) in molecules | |
| mol = Chem.MolFromSmiles(smiles) | |
| if mol is None: | |
| print('error') | |
| mol = Chem.MolFromSmiles(obsmitosmile(smiles)) | |
| assert mol is not None, smiles + ' is not valid ' | |
| a = fg_list() | |
| ssr = Chem.GetSymmSSSR(mol) | |
| num_ring = len(ssr) | |
| ring_dict = {} | |
| for i in range(num_ring): | |
| ring_dict[i+1] = list(ssr[i]) | |
| f_g_list = [] | |
| for i in ring_dict.values(): | |
| f_g_list.append(i) | |
| for i in a: | |
| patt = Chem.MolFromSmarts(i) | |
| flag = mol.HasSubstructMatch(patt) | |
| if flag: | |
| atomids = mol.GetSubstructMatches(patt) | |
| for atomid in atomids: | |
| f_g_list.append(list(atomid)) | |
| return f_g_list | |
| def smiles2adjoin(smiles,explicit_hydrogens=True,canonical_atom_order=False): # Converting molecules in SMILES format to atom lists and adjacency matrices | |
| mol = Chem.MolFromSmiles(smiles) | |
| if mol is None: | |
| print('error') | |
| mol = Chem.MolFromSmiles(obsmitosmile(smiles)) | |
| assert mol is not None, smiles + ' is not valid ' | |
| if explicit_hydrogens: | |
| mol = Chem.AddHs(mol) | |
| else: | |
| mol = Chem.RemoveHs(mol) | |
| if canonical_atom_order: | |
| new_order = rdmolfiles.CanonicalRankAtoms(mol) | |
| mol = rdmolops.RenumberAtoms(mol, new_order) | |
| num_atoms = mol.GetNumAtoms() | |
| atoms_list = [] | |
| for i in range(num_atoms): | |
| atom = mol.GetAtomWithIdx(i) | |
| atoms_list.append(atom.GetSymbol()) | |
| adjoin_matrix = np.eye(num_atoms) | |
| num_bonds = mol.GetNumBonds() | |
| for i in range(num_bonds): | |
| bond = mol.GetBondWithIdx(i) | |
| u = bond.GetBeginAtomIdx() | |
| v = bond.GetEndAtomIdx() | |
| adjoin_matrix[u,v] = 1.0 | |
| adjoin_matrix[v,u] = 1.0 | |
| return atoms_list,adjoin_matrix | |
| def get_header(path): | |
| with open(path) as f: | |
| header = next(csv.reader(f)) | |
| return header | |
| def get_task_names(path, use_compound_names=False): | |
| index = 2 if use_compound_names else 1 | |
| task_names = get_header(path)[index:] | |
| return task_names |