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


