Archive for juliol, 2010

“Me hago doctor”

Una vegada llicenciats, una tesi pot ser una solució contra l’atur (o no). Vist a Vorada.

Com buscar molècules similars

Moltes vegades tenim un conjunt de molècules i volem seleccionar, en un segon conjunt, aquelles parelles de molècules que més s’assemblen. Per exemple, tenim n molècules que hem vist que són actives per una determinada proteïna i volem buscar fàrmacs que s’hi assemblin (com més semblança, possiblement, millor semblança en activitat).

He fet un petit script que fa això fent servir el coeficient de Tanimoto (a partir dels fingerprints) per mesurar la semblança. El codi agafa les molècules query i les compara amb totes aquelles molècules de la base de dades on volem trobar molècules semblants (en l’exemple, els fàrmacs). Finalment, n’extreu aquelles parelles que estan dintre d’uns límits de semblança definits (éssent el coeficient 1 per dues molècules iguals i 0 per dues molècules completament diferents). Els resultats, les parelles de molècules, es desen en un sd file on s’ha afegint un camp relatiu a la semblança.

El codi està desenvolupat amb python fent ús de les llibreries de pybel. La crida del codi és ben senzilla, simplement cal indicar-li el fitxer amb les molècules query, el fitxer amb les molècules de referència i el límit de semblança (predefinit a 0.9).

1
python SimMolecules.py -i query.sdf -d db.sdf

A continuació teniu el codi:

?View Code PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
"""
SimMolecules, a script to compare two molecular databases
Alfons Nonell-Canals - July 2010
"""
 
import fileinput
from pybel import *
import optparse
 
p = optparse.OptionParser()
p.add_option('--DBFile', '-d', default='0', help='Database of molecules used as a reference')
p.add_option('--sdf','-i',default='0', help='File with the query molecules')
p.add_option('--CutOff','-c',default='0.9', help = 'Similarity CutOff.')
options, arguments = p.parse_args()
 
#Read commandline options
db = options.DBFile
input= options.sdf
cutOff = float(options.CutOff)
 
RefDbfp = {}
RefDbmols = {}
 
for mol in readfile('sdf',db):
    fp = mol.calcfp()
    RefDbfp[mol.title] = fp
    RefDbmols[mol.title] = mol
 
for mol in readfile('sdf',input):
    fp = mol.calcfp()
    for RefMol in RefDbfp:
        tanimoto = fp|RefDbfp[RefMol]
        if tanimoto >= cutOff:
            print mol.title, RefMol, tanimoto
            mol.data['Similarity'] = tanimoto
            outRef = input.replace('sdf','Refs.sdf')
            out = open(outRef,'a')
            out.write(mol.write('sdf'))
            RefMolMol = RefDbmols[RefMol]
            out.write(RefMolMol.write('sdf'))
            out.close()