2015-10-16 12 views
2

Я пытаюсь написать функцию python, которая принимает два списка в качестве входных: один, который содержит некоторые молекулы SMILES-коды, а другой - имена молекул.Функция python, которая отбрасывает молекулы, которые слишком похожи на основе коэффициента Tanimoto?

Затем он вычисляет коэффициент TANIMOTO между всеми парами молекул (у меня уже есть функция для этого) и возвращает два новых списка с SMILES и именами соответственно молекул, чей Tanimoto с любым другим не выше, чем определенный порог.

Это то, что я сделал до сих пор, но это дает неверные результаты (большинство молекул, которые я получаю почти то же самое ...):

def TanimotoFilter(molist,namelist,threshold): 
    # molist is the smiles list 
    # namelist is the name list (SURPRISE!) is this some global variable name? 
    # threshold is the tanimoto threshold (SURPRISE AGAIN!) 
    smilesout=[] 
    names=[] 
    tans=[] 
    exclude=[] 
    for i in range(1,len(molist)): 
     if i not in exclude: 
      smilesout.append(molist[i]) 
      names.append(namelist[i]) 
      for j in range(i,len(molist)): 
       if i==j: 
        tans.append('SAME') 
       else: 
        tanimoto=tanimoto_calc(molist[i],molist[j]) 
        if tanimoto>threshold: 
         exclude.append(j) 
         #print 'breaking for '+str(i)+' '+str(j) 
         break 
        else: 
         tans.append(tanimoto) 

    return smilesout, names, tans 

Я был бы очень благодарен, если модификации вы предлагаете как можно более базовые, так как этот код предназначен для людей, которые почти не видели терминал в своей жизни ... Не имеет значения, полно ли он петель, которые замедляют работу.

Спасибо всем!

ответ

0

Я внесла некоторые изменения в логику функции. Как упоминалось в вопросе, он возвращает два списка с SMILES и именами. Я не уверен в цели загара, поскольку значение танимото для кортежа, а не для одной молекулы. Не удалось проверить код без данных, сообщите мне, если это работает.

def TanimotoFilter(molist, namelist, threshold): 
    # molist is the smiles list 
    # namelist is the name list (SURPRISE!) is this some global variable name? 
    # threshold is the tanimoto threshold (SURPRISE AGAIN!) 
    smilesout=[] 
    names=[] 
    tans=[] 
    exclude=[] 

    for i in range(0, len(molist)): 
     if i not in exclude: 
      temp_exclude = [] 
      for j in range(i + 1, len(molist)): 
       tanimoto = tanimoto_calc(molist[i], molist[j]) 
       if tanimoto > threshold: 
        temp_exclude.append(j) 
      if temp_exclude: 
       temp_exclude.append(i) 
       exclude.extend(temp_exclude) 
      else: 
       smilesout.append(molist[i]) 
       names.append(namelist[i]) 

    return smilesout, names 
+0

Hi Vivek! Спасибо за вашу идею. Он отлично работает (я думаю). Список танов был фактически списком списков (я неправильно написал функцию). Благодаря вашей идее я смог получить также этот список списков со всеми коэффициентами Tanimoto между всеми парами молекул. – user3091644