robert-m-elder commited on
Commit
edc1923
·
1 Parent(s): 7368d75

refactor lookup from name

Browse files
Files changed (1) hide show
  1. ChemID.py +57 -3
ChemID.py CHANGED
@@ -50,7 +50,8 @@ def ResolveChemical(chemName, IDtype):
50
  error = 0
51
 
52
  name = smiles2name(smiles)
53
- cas = name2cas(name)
 
54
 
55
  try:
56
  mol = Chem.MolFromSmiles(smiles)
@@ -67,10 +68,10 @@ def ResolveChemical(chemName, IDtype):
67
  im64 = None
68
  error = 0
69
 
70
- cas = name2cas(name)
71
- smiles = cas2smiles(cas)
72
 
73
  if smiles:
 
74
  try:
75
  mol = Chem.MolFromSmiles(smiles)
76
  Mw = Descriptors.MolWt(mol)
@@ -350,6 +351,59 @@ def name2cas(name):
350
  cas = None
351
  return cas
352
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
353
  def check_cas(cas):
354
  n1,n2,n3 = cas.split('-')
355
  # combine and flip first 2 numbers
 
50
  error = 0
51
 
52
  name = smiles2name(smiles)
53
+ if name:
54
+ cas = name2cas(name)
55
 
56
  try:
57
  mol = Chem.MolFromSmiles(smiles)
 
68
  im64 = None
69
  error = 0
70
 
71
+ smiles = name2smiles(name)
 
72
 
73
  if smiles:
74
+ cas = name2cas(name)
75
  try:
76
  mol = Chem.MolFromSmiles(smiles)
77
  Mw = Descriptors.MolWt(mol)
 
351
  cas = None
352
  return cas
353
 
354
+ # function to convert name to SMILES
355
+ def name2smiles(name):
356
+ smiles = None
357
+ # first try chemicals package
358
+ try:
359
+ cm = chemicals.search_chemical(name)
360
+ smiles = cm.smiles
361
+ except:
362
+ smiles = None
363
+ # then try pubchem for compounds
364
+ if not smiles:
365
+ try:
366
+ compounds = pcp.get_compounds(name, namespace='name')
367
+ c = compounds[0]
368
+ smiles = c.isomeric_smiles
369
+ except:
370
+ smiles = None
371
+ # next try cirpy
372
+ if not smiles:
373
+ try:
374
+ smiles = cirpy.resolve(name, 'smiles')
375
+ except:
376
+ smiles = None
377
+ if type(smiles) is list:
378
+ smiles = smiles[0]
379
+ # then try it as a pubchem substance
380
+ if not smiles:
381
+ try:
382
+ compounds = pcp.get_substances(name, namespace='name')
383
+ # sometimes there are multiple substances, and multiple synonyms per substance
384
+ allsyns = [syn for c in compounds for syn in c.isomeric_smiles if name not in syn]
385
+ # choose the most common synonym
386
+ fd = nltk.FreqDist(allsyns)
387
+ smiles = fd.most_common(1)[0][0]
388
+ except:
389
+ smiles = None
390
+ # finally try to resolve SMILES from name using OPSIN
391
+ #if not smiles:
392
+ # try:
393
+ # with open('opsin.tmp.1', 'w') as fp:
394
+ # fp.write(name)
395
+ # os.system('java -jar /Users/robert.elder/software/utils/opsin-2.4.0-jar-with-dependencies.jar -osmi opsin.tmp.1 opsin.tmp.2 &> /dev/null')
396
+ # with open('opsin.tmp.2') as fp:
397
+ # smiles = fp.read()
398
+ # if smiles == '\n':
399
+ # smiles = None
400
+ # smiles = smiles.strip() #remove trailing newline
401
+ # except KeyboardInterrupt:
402
+ # raise
403
+ # except:
404
+ # smiles = None
405
+ return smiles
406
+
407
  def check_cas(cas):
408
  n1,n2,n3 = cas.split('-')
409
  # combine and flip first 2 numbers