Archive for the 'Programari' Category

Reintentar una connexió a la base de dades amb Python

Fins ahir tenia un problema prou complicat: estic treballant en un programa en Python que requereix múltiples i constants connexions a una base de dades mySQL. Quan treballava en local, no tenia cap problema però, quan executava el programa en màquines diferents apuntant cap a un servidor de bases de dades (com passaria, per exemple, en un cluster), de tant en tant i de manera aleatòria, el servidor mySQL es quedava “tonto” i no responia. Aquesta pèrdua de connexió feia que el programa “petés”.

Amb l’administrador de sistemes del grup hem treballat per mirar què passa amb el mySQL ja que sembla que el problema és allà, però no hem trobat solució. No hi ha ni problemes ni amb el límit màxim de connexions, ni amb la memòria, cpu,… en fi, per algun motiu que desconeixem, el servidor es satura i té petites penjades. Així dons, la solució passa per fer alguna cosa al programa perquè no peti quan la base de dades no respongui.

La solució està en les “excepcions” (de l’anglès exception, desconec si aquesta traducció literal és vàlida). És a dir, per defecte, quan python intenta accedir a la base de dades, si aquesta no respon, es crea una excepció que, si no se li diu res, provoca la sortida del programa. La idea està en modificar aquesta excepció perquè quan python vegi que la base de dades no respon, la solució no sigui sortir del programa sinó reintentar-ho. He jugat amb el try i except.

db = DB()
cursor = db.cursor()
sql = ’select count(*) from molecules’
number = cursor.execute(sql)

class DB:
def cursor(self):
try:
bd = MySQLdb.connect(host=HOSTNAME, user=”USERNAMEl”, passwd=”PASSWD”,db=”DB_NAME)
cursor = bd.cursor()
return cursor
except MySQLdb.OperationalError, message:
return self.cursor()

La primera part del codi inicia la classe DB i n’obté el “cursor”, operador amb el que realitzarem les crides sql. La part més interessant però és la classe DB, que conté la funció “cursor”. Aquesta funció connecta amb la base de dades i retorna el “cursor”, comanda dins l’ordre try. Però, el fet de jugar amb el try i except fa que el programa primer provi el que hi ha a try però, si falla i troba una excepció que coincideix amb la indicada a except, en l’exemple MySQLdb.OperationalError, en comptes d’aturar l’execució del programa (el que faria per defecte) fa el que se li diu, en aquest cas que torni a executar la funció.

Eina: obprop

Obprop és una aplicació inclosa al paquet Openbabel i que calcula alguns descriptors per una molècula donada. Cal passar-li la molècula en un fitxer sdf (hi pot haver diverses molècules dins el fitxer) i et retorna la seva fórmula, l’SMILE canònic, el pes molecular, el logP,…

Per fer-la servir simplement cal executar l’ordre:

obprop fitxer_amb_molècules.sdf

I, com a resultat, s’obté quelcom com ara:

name [Name]
formula [Formula]
mol_weight [Molecular Weight]
exact_mass [Isotopic Mass]
canonical_SMILES [String]
num_atoms [Number]
num_bonds [Number]
num_residues [Number]
sequence [Residue Sequence]
num_rings [Number of Rings (by SSSR)]
logP [Number (octanol-water partition)]
PSA [Number (topological polar surface area)]
MR [Number (molar refractivity)]
$$$

Eina útil, senzilla i ràpida per obtenir les quatre dades bàsiques d’una molècula.

“Silenciar” part d’un residu en una dinàmica (II)

Fa un parell de dies parlava d’una opció que tenim per “silenciar” part d’un residu en una dinàmica. El que comentava era que, ajustàvem la càrrega d’aquella part a zero i llestos. Per fer això, cada programa té les seves maneres.

La cosa està però en que allò que vaig dir no és ben bé cert i, si només ajustem la càrrega a zero, seguirem tenint tot de boles (àtoms) sense càrrega voltant per la proteïna. La dinàmica té en compte la càrrega i el diàmetre de cada àtom de manera que si només ajustem la càrrega a zero, seguim tenint les “boles” fent nosa.

Doncs, com fer-ho bé (ara espero que sí!)? Ajustant el radi de Van der Waals també a zero. La manera més senzilla per fer-ho és modificant el tipus atòmic dels àtoms que volem “silenciar”, fent-ne un a l’atzar, per exemple Oz, per silenciar un oxigen. Després, a la llibreria de tipus atòmic hi afegim aquest nou “tipus” assignant-li un radi de Van der Waals de zero. I llestos!

“Silenciar” part d’un residu en una dinàmica

Fins fa una estona, tenia un problema: estic fent unes dinàmiques moleculars d’un enzim que catal·litza una reacció determinada, en aquest cas, l’oxidació de l’anió formiat a diòxid de carboni. La reacció transfereix un protó a l’enzim que, després s’ha de regenerar per recomençar el cicle. Fer la dinàmica d’aquesta reacció és relativament senzill, he afegit el substrat (formiat) al PDB de la proteïna i he fet la dinàmica. Perfecte, obtinc el CO2 i l’enzim protonat. Fer les dinàmiques de la regeneració de l’enzim ja no és tant fàcil: vull eliminar producte (el diòxid de carboni) però part del residu introduït al PDB (l’anió formiat) no vull que desapareixi, ja que és el protó que he d’estudiar com deixa l’enzim.

Hi ha opcions complicades: eliminar part del formiat (el CO2) del PDB, però això implica canviar la llibreria d’aminoàcids. També es pot modificar el PDB per situar el CO2 llunt del centre actiu, però això fa que el programa no entengui que un residu tingui el seu hidrogen, per exemple, a 100 amstrongs. En fi, ho he provat i no és gens fàcil.

La solució? “silenciar” part del residu formiat. Les dinàmiques que estic fent són una mena de QM/MM i, de fet, en la regeneració de l’enzim ja tinc el diòxid de carboni fora de la part QM mentre el protó sí que hi és. En estar fora de la part QM, es podria dir que la importància de cada àtom rau en la seva càrrega (que s’obté de la llibreria de residus). Doncs, si poso a zero la càrrega del CO2, problema resolt! es pot fer modificant la llibreria però, per fer-ho de manera senzilla jo ho faig als fitxers d’entrada del càlcul. Com?

1) dic al programa que el residu “formiat” té càrrega zero
2) assigno una càrrega concreta al protó.

En MOLARIS, el programa que estic emprant, es faria així. Abans de començar cada dinàmica cal posar el següent:

enzymix
pre_enz
setcrg0 720
setcrg 11192 0.013
quit
quit

Caràcters matemàtics per HTML

Sempre que he de fer algun resum o presentació per la feina ho faig amb LaTeX. M’és senzill, m’ho formata tot de manera ben senzilla i, quelcom que també és important (com a mínim per la meva feina), és molt senzill escriure-hi fórmules matemàtiques.

Doncs, si bé, com dic, amb LaTeX, no tinc cap problema per fer símbols matemàtics, lletres gregues,… amb HTML no em passava el mateix. Sincerament, tot i conèixer prou el llenguatge, no tenia ni idea de com entrar aquests caràcters. Dies enrere vaig fer una cerca a la xarxa, vaig trobar molta cosa però, la millor: HTML Character Reference.

DebianSeq

Debian Sequence Analysis, a la wiki de Debian, interessant recull d’eines, moltes lliures, enfocades a l’anàlisi de seqüències (proteïnes, DNA,…). Aplicacions en línia de comanda, gui, web,… El llistat inclou l’enllaç al projecte, la llicència i, si es dóna el cas, l’estat de desenvolupament del corresponent paquet Debian.

Problema bioinformàtic

Petit problema bioinformàtic: treballo amb uns enzims anomenats Formiat deshidrogenasa. És una gran família d’enzims que tenen com a funció oxidar el formiat a diòxid de carboni obtenint dos electrons i un protó. Aquests enzims són presents en bacteris i aquests els empren com a font d’electrons i protons.

Fins ara he treballat, bàsicament, amb la Formiat deshidrogenasa H, d’Escherichia coli, que té, com a fets característics, una selenocisteïna i un àtom de molibdè. Però hi ha, com he dit, moltes formiat deshidrogenases, n’hi ha que són selenoproteïnes (com la meva), n’hi ha que no (en comptes de selenocisteïna tenen cisteïna), i, curiosament, n’hi ha que canvien el molibdè per un altre metall, el tungstè. He estudiat, amb un model a nivell quàntic, quines implicacions pot tenir el canvi de metall i ho he comparat tant en models amb seleni (selenoproteïnes) com amb models amb sofre. Hi ha diferències importants.

El dubte/problema que se’ns planteja ara: quina proporció de seleni/sofre hi ha en les proteïnes amb molibdè? i en les proteïnes amb tungstè? Amb els resultats quàntics em puc arriscar a fer les meves prediccions (que no anunciaré fins que no siguin segures), però només amb aquests resultats no puc confirmar res. Aquí entra en joc la bioinformàtica, que espero que m’il·lumini una mica el tema i pugui donar resultats ja més demostrables.

Properament (espero), la solució.

Aproximació de la càrrega al llarg d’una reacció

Aquests dies estic jugant a fer dinàmiques moleculars, té el seu què, a més a més, em permet seguir amb més detall com evoluciona una reacció tenint en compte el seu entorn. Una cosa que m’interessa saber, entre d’altres coses, és l’evolució de la càrrega de diferents àtoms al llarg de la reacció, partint de la base que només conec la càrrega inicial i la final.

Per fer aquesta aproximació (evolució de la càrrega) així com d’altres aproximacions de paràmetres que varien al llarg de la reacció, introdueixo el factor “lambda” (λ). Lambda va variant al llarg de la reacció, comença per un valor de zero (reactius) i va fins a 1 (productes). Així doncs, quan tenim un λ=0 estem a reactius, λ0.5, podem dir que és un punt intermedi de la reacció (no té per que ser l’estat de trancisió) i, amb λ=1 som a productes. Així doncs, la variació d’una propietat, per exemple, la càrrega (q) al llarg d¡una reacció es pot explicar com a:


q=qi(1-λ)+qiiλ

On qi és la càrrega inicial, qii la càrrega final i q la càrrega del moment. Si som a reactius, tenim que λ=0, per tant, qiiλ=0 i, per tant, q=qi(1-λ), que, com que λ és zero, queda com a q=qi(1-0) i, finalment, q=qi. Podeu fer la mateixa extrapolació per a λ=1. Així doncs, l’equació ens permet saber l’estat d’una propietat determinada en un moment concret de la reacció. En el meu cas, m’interessa saber la càrrega.

Per a fer un càlcul ràpid, es pot programar un script que no té massa complicació (aquí en teniu un exemple en php). Simplement cal modificar el codi per dir-li quina és la càrrega inicial, la final i a córrer!

Jabref, endreça lliurement la bibliografia

jabrefJabref és un programa gràfic, de codi obert, per gestionar bibliografia. Però no només això, sinó que el que per a mi el fa especial (a banda que és programari lliure), és que desa la informació directament en firtxers bibtex, cosa que el fa molt interessant.

Bibtex és el format de fitxer que fa servir LaTeX per a la bibliografia. El fet de tenir un programa gràfic que treballi directament amb aquest format (Jabref fa servir com a base de dades el mateix bibtex) facilita molt les tasques tant d’escriure articles/treballs com d’importar bibliografies. És a dir, vas manipulant la base de dades amb el programa gràfic (desenganyem-nos, és el més còmode), i en qualsevol moment pots lincar el fitxer en un document LaTeX i llestos! sense haver d’importar coses, manipular a mà,… res.

Però la cosa no es queda aquí. A banda de l’aplicació bàsica de manipular una base de dades bibtex, Jabref té moltes més funcionalitats que simplifiquen encara més la feina. Pel que fa a la manipulació estricta de la base de dades, té funcions de cerca, filtrat, enllaç amb PDF (és automàtic si el nom del fitxer és el mateix que l’etiqueta bibtex de l’entrada), avisa de duplicats,… I, a banda, permet descarregar referències directament de bases de dades públiques (com el MedLine, on hi fa la cerca directament) i importar fitxers de bibliografia d’altres bases de dades (com la Web of Knowledge) i diverses revistes.

Per acabar, és un programa multiplataforma. Què vol dir? funciona en tots els sistemes operatius. Està escrit en java i simplement cal tenir el java instal·lat per a fer-lo anar:

java -jar jabref-versió.jar

I, llestos!

ScientificPhp: Usos científics del php

PHPFa molt temps ja (anys!) que tinc el php com a llenguatge de referència per a fer les meves webs (i aplicacions web). És un llenguatge que corre al servidor i origina un HTML que entén el navegador. L’aventatge que té és que permet “programar”, fer quelcom més que un simple HTML. Connecta amb bases de dades, interacciona amb el sistema (podent executar, fins i tot, programes externs), pots “programar” petites aplicacions,… en fi, genial! i tot ben lliure!

Però darrerament li estic trobant una bona utilitat més enllà del navegador. Fa temps que existeixen projectes com BioPerl, BioJava, BioPhyton i… fins i tot, BioPhp (una mica apagat des de bon principi). Sempre que m’havia de programar quelcom per treballar amb resultats (extreure energies, coordenades dels àtoms, manipular resultats d’un Blast,… ) em feia els meus programets en Perl. M’anava bé. Però, com que ho feia de tant en tant, sempre  que m’hi posava havia de refrescar massa la memòria.

Ara fa uns dies que he provat de fer totes aquestes coses: fer ús del php com a llenguatge scripting i executar-lo des d’una shell. Primer va ser un script molt “tonto” per escriure uns fitxers d’entrada, però poc a poc m’he anat animant i puc dir que estic gratament sorprès dels resultats. Si bé no he dubtat mai de la potència d’aquest llenguatge en el món d’internet, mai l’havia posat a prova (realment) fora del servidor, l’experiència no m’ha decebut. Primer de tot, per que és un llenguatge que, més o  menys, domino. Segon, em permet fer tot allò que necessito: llegir i escriure fitxers, operar, manipular dades, interacutar amb funcions pròpies del sistema (fer greps i similars),…

No puc dir que m’inclogui dins la gent del BioPhp (dedicat a la bioinformàtica), però si a un ChemBioPhp o, éssent més general: ScientificPhp :-)

Next Page »