Category Archives: Programari

TEDxBarcelonaChange

Ahir al vespre es va celebrar la TEDxChange i a Barcelona vam tenir la sort de tenir la TEDXBarcelonaChange. Les TEDxChange són actes TED patrocinats per la Fundació Bill i Melinda Gates i estan enfocats al desenvolupament.

He de dir que, tot i que alguna vegada he vist el video d’alguna TED talk per internet, mai havia assistit a cap conferència, ahir va ser la primera vegada. La impressió que em vaig endur és bona (molt coneixement concentrat en un sol acte) però, potser criticaria el fet de concentrar “tant” en una sola nit, pel meu gust, va ser una mica llarg. L’acte va començar amb la retransmissió en directe de la TEDxChange de Seatle i, a la segona part, vam poder gaudir de les mini-xerrades locals. De fet, em saltaria la primera part, l’streaming de les xerrades de Seatle, no em van aportar res i, a més a més, si les vull veure, ja en buscaré els videos.

Si eliminem l’streaming i ens quedem amb les xerrades locals, un deu. Em van agradar. Xerrades curtes, amb el desenvolupament, positive disruption, com a tema central. Vam veure de tot, des del punt de vista d’un inversor, el Dr. Lluís Pareres fins a una apologia de la passió per la feina i la recerca en salut internacional de l’investigador de l’ISGlobal Quique Bassat. Passant per l’humor de “Africa for Norway“, amb la seva campanya Radi-AID (us recomano que mireu el video del seu web). Un total de catorze ponents parlant de quin és el seu rol en el desenvolupament.

Mind the Byte s’uneix al programa BizSpark Plus de Microsoft

No és una novetat d’avui mateix però fins ara no he trobat el moment per escriure sobre el tema. El mes de Juny passat Mind the Byte va entrar al programa BizSpark Plus de Microsoft. El programa BizSpark Plus és una extensió del BizSpark, un paquet d’ofertes, serveis de networking, i suport que Microsoft ofereix a empreses que tenen un alt potencial.

Ser membres de BizSpark Plus ens permetrà, a banda d’accedir a una àmplia xarxa de contactes i possibles inversors, donar una empenta al desenvolupament d’iMols, la nostra eina cloud chemoinformatics, ja que un dels grans punts de BizSpark Plus és que ofereix fer ús de WindowsAzure, la tecnologia cloud de Microsoft, de manera gratuïta (fins a uns límits).

iMols

Primera novetat de l’any i és una novetat de les grosses: iMols! iMols és una plataforma de serveis, eines i bases de dades quimio i bioinformàtiques en la que he estat treballant els darrere mesos (bé, podria dir any!). De fet, quan vaig fundar Mind the Byte ja tenia l’eina al cap i l’anava perfilant en la meva imaginació i algun esbós des de feia molt de temps.

Amb iMols, els usuaris poden (concretament, podran, ja que no totes les funcionalitats esta actives) cercar molècules, predir-ne activitats i gestionar quimio i proteoteques, entre moltes altres funcionalitats. En una primera fase, l’eina incorpora només informació provinent d’una base de dades pública però la intenció és anar-la enriquint amb més informació tnat pública (sempre que la lllicència ho permeti), com d’empreses de síntesi, així com la pròpia dels usuaris (aquesta darrera però estarà només disponible per als usuaris que l’hagin afegit).

De moment hem publicat una versió “alpha” gratuïta i de prova ja que som conscients que les funcionalitats de la plataforma són encara un xic limitades i, tot i que hem vetllat per l’estabilitat del sistema i la integritat de les dades que hi ha, és tot just la primera versió d’una eina molt complexa per dins i volem estar segurs que tot funciona bé. D’aquí unes setmanes, quan hi afegim més funcionalitats i en garantim l’estabilitat, oferirem ja versions de pagament.

Podeu accedir a iMols des d’aquí: www.imols.com

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()

Generar imatges de molècules amb Python i ChemAxon

Fins ara, sempre que volia generar imatges per molècules, ho feia amb pybel. De fet, ho seguiré fent servir. És fàcil, senzill i lliure. Però a vegades hi ha algun problema amb la qualitat de les imatges generades, àtoms que se sobreposen, angles una mica dubtosos. En aquests casos, calen alternatives.

Com a alternativa i gràcies a un company del meu grup (gràcies Xavi!), he trobat una nova manera de fer-ho: amb MarvinBeans, de ChemAxon i fent un script amb python. El sistema no és lliure (MarvinBeans només és gratuït per a usos acadèmics), però és funcional.

Primer de tot cal anar al web de ChemAxon i entrar a Download > Marvin > For Java Developers. Una vegada aquí, accepteu la llicència i descarregueu el “Cross platform package without installer”. Aquí us demanarà un usuari i clau, cal que l’entreu o que us doneu d’alta. Descarregueu el fitxer, deseu-lo al vostre ordinador i descomprimiu-lo.

Ara la part de python. El codi és senzillet, simplement cal cridar-lo:

1
python sdf2img.py -i input.sdf

El codi el que fa és obrir el fitxer sdf i, molècula a molècula, generar les imatges. Per fer-ho, crea un sdf temporal per a cada molècula, genera la imatge i esborra el fitxer temporal. Abans de fer-ho anar però, cal canviar el PATH al .jar de MarvinBeans (a les primeres linies del codi python). Les imatges generades són png, canviant una mica el codi, podeu fer pdf i svg.

?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
"""
Script to generate images from an SDF using ChemAxon MarvinBeans
Alfons Nonell-Canals - June 2010
"""
 
import optparse
import os
from pybel import *
 
#Configure the path to MarvinBeans
MARVIN_PATH = "$HOME/soft/ChemAxon/marvinbeans/lib/MarvinBeans.jar"
 
#Read input options
p = optparse.OptionParser()
p.add_option('--sdf', '-i', help='SDF input file')
 
options, arguments = p.parse_args()
sdf = options.sdf
 
#Iterate the sd file
for molecule in readfile('sdf',sdf):
    #Write a temp file with the molecule
    outputfile = Outputfile("sdf", (molecule.title)+'.sdf')
    print molecule.title
    outputfile.write(molecule)
    format = 'png'
    file = molecule.title+'.sdf'
    outfile = molecule.title+'.png'
    #generate the image
    run = "java -classpath %s chemaxon.formats.MolConverter %s:a,w1000,h1000,#ffffff,wireframe %s -Y -2 -o %s"%(\
        MARVIN_PATH,\
        format,\
        file,\
        outfile)
    os.system(run)
    #remove tmp files
    run = 'rm '+file
    os.system(run)

Codi per posar un camp d’un sdf al títol de la molècula

Sovint, mentre manipulem fitxers sdf ens trobem que volem canviar el títol de la molècula. Moltes vegades, com a títol hi volem posar algun camp de les dades addicionals de la molècula en qüestió. M’he fet un petit script per fer aquesta tasca de manera automàtica i senzilla.

El programet llegeix l’sdf i, molècula a molècula, en llegeix el camp que volguem, l’assigna com a títol i desa la molècula en un nou fitxer. A més a més, agafa el títol original i el desa en un camp “old_title”.

?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
"""
Script to move a field to an id in a sdf
Alfons Nonell-Canals - April 2010
"""
 
import optparse
import sys
from pybel import *
 
p = optparse.OptionParser()
p.add_option('--sdf', '-i', help='SDF file to modify')
p.add_option('--field', '-f', help='Field to you want to set as molecule title')
options, arguments = p.parse_args()
 
if not options.sdf  or not options.field:
        p.error('An input sdf file and a field are required')
 
molfile = options.sdf
field = options.field
 
outFile = molfile.replace('.sdf','')+'.Mod.sdf'
out = Outputfile('sdf',outFile)
 
for mol in readfile("sdf", molfile):
        oldTitle = mol.title
        mol.data['old_title'] = oldTitle
        newtitle = mol.data[field]
        mol.OBMol.SetTitle(newtitle)
        out.write(mol)

Pymol en mans d’Schrödinger

Segons llegeixo a Depth-First, després de la mort del desenvolupador de Pymol, el manteniment del programa passarà a mans de la coneguda empresa de programari quimioinformàtic Schrödinger.

On January 8, 2010 Schrödinger reached an agreement with the estate of the late Dr. Warren L. DeLano to acquire PyMOL. Schrödinger will take over continued development and maintenance, as well as support and sales of PyMOL, including all current subscriptions. Schrödinger will also continue to actively support the open-source community of PyMOL.

Prior to Warren’s tragic and unexpected passing, he had been working closely with Schrödinger to progressively integrate PyMOL with Schrödinger’s graphical interface, Maestro. With a great sense of humility, we will work hard to pick up as best we can where Warren left off and will strive to honor his memory by continuing in the spirit and tradition of PyMOL.

Al tanto amb el pybel i la memòria

Com he dit algunes vegades, empro el pybel a diari.Aquest conjunt de classes que permeten cridar l’openbabel des de qualsevol script python, van molt bé per fer diverses tasques en quimioinformàtica (manejar molècules, càlculs de descriptors, dibuixar molècules,…).

Va molt bé però, cal vigilar amb la memòria quan es treballa amb un gran nombre de molècules (parlo de l’ordre de milions de molècules). Si es fa servir a “petita escala” no hi ha cap problema, ara bé, si s’empra a gran escala cal tenir cura de l’ús de la memòria.

He estat dos dies lluitant amb això. Tenia un programet per analitzar uns quants milions de molècules, totes les proves m’anaven bé fins que en feia ús a gran escala. Aleshores la memòria s’anava carregant gradualment fins a saturar la màquina. M’he mirat el codi de dalt a baix, esborrat totes les variables després de fer-ne ús, escriure tots els fitxers de sortida al moment,… però res, memòria a “tope”. Finalment he vist que l’error venia del pybel (no sé si del propi pybel o de l’openbabel).

Afegir el títol de la molècula a l’sdf amb pybel

Pybel és un conjunt de classes escrites en Python per treballar amb l’OpenBabel. És una eina molt potent que et permet fer ús de totes les utilitats de l’OpenBabel des de Python. Jo l’empro molt i a diari!

Per, per exemple, llegir un smile i escriure’n un sdf només cal fer el següent:

?View Code PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
#Importar el pybel
from pybel import *
 
#Ara llegirem l'smile
mol = readstring('smi', 'CCCC(Cl)CCF')
 
#Obrim el fitxer de sortida
out =Outputfile('sdf','NomDelFitxer.sdf')
#Hi escrivim i tanquem
 
out.write(mol)
out.close()

Això va molt bé però m’he trobat que escriu sdfs sense posar cap títol (nom) a les molècules. Pel que ho estic emprant ara però, necessito posar els InchiK com a títol de cada molècula. Hi he estat hores i hores, intentant entendre la classe “Outputfile”, però he desistit, no crec que es pugui fer, així, directament.

Com a alternativa he decidit emprar els mètodes natius de Python per escriure fitxers, barrejat amb el Pybel (l’opció molecula.write). Així doncs:

?View Code PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#Importar el pybel
from pybel import *
 
#Ara llegirem l'smile
mol = readstring('smi', 'CCCC(Cl)CCF')
 
#Obrim el fitxer de sortida (tal com es fa amb Python). Li diem que és per escriure
out = open('NomDelFitxer.sdf','w')
 
#Hi escrivim el títol
out.write('TítolDeLaMolecula')
 
#I ara, la molècula
out.write(mol.write('sdf'))
 
#Finalment, tanquem
out.close()

De moment, és l’única solució que he trobat i va prou bé.

pDynamo, llibreries python per la simulació molecular

pDynamo és una llibreria en python per a fer simulacions moleculars mitjançant mecànica quàntica, mecànica molecular i mètodes híbrids mecànica quàntica/mecànica molecular. Està basat en Dynamo, unes llibreries en Fortran 90 de les que per desgràcia, no en tinc massa bones referències. Tot i això i, encara que fa més o menys un any que no s’actualitza (desconec si el projecte segueix viu), caldrà fer-li una ullada :-)