Archive for the 'Computació' 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.

Python, “splits” amb expresions regulars

Avui he descobert un mòdul de Python amb una funció molt i molt interessant re.split. Segurament és una xorrada, però és ben útil. Per què? per que separa elements d’una cadena fent ús de diferents patrons. La funció que jo emprava fins al moment, split, és útil quan per separar una cadena hi ha només un element comú.

Un exemple ben clar: una molècula. Tinc la cadena següent: C-C-N-C-O. Per separar els diferents àtoms és ben senzill, simplement cal fer un split indicant que el separador és el guionet -. La funció retorna un array.

molecule = ‘C-C-N-C-O’
atoms_array = molecule.split(’-',”)

Ara, imaginem una molècula on, a banda dels enllaços senzills (-) en tenim de dobles i triples (= i #, respectivament i en notació SMILE). La cadena exemple seria: C#C-N-C=O. Aquí, els marcadors que separen els diferents àtoms no segueixen un únic patró i poden ser -, = i #. La funció anterior no ens serveix. Aquí és on entra en joc la funció que he comentat:

import re
molecule = ‘C#C-N-C=O’
atoms_array = re.split(’[\-\=\#]’,molecule)

El patró, aquí \-\=\#, pot ser divers: símbols, lletres, números, qualsevol dígit número enter,… En fi, per mi m’és molt còmode :-)

SMILES (II). Uns quants exemples

L’SMILE més senzill és el metà, representat per una simple C. El segueix l’età (CC) el propà (CCC) i, així, successivament. Molècules més complexes, com ara el l’acetat de metil (CC(=O)OC) ja introdueixen dobles enllaços (=) i cadenes laterals (es posen entre parèntesis.

Cada molècula té el seu SMILE únic i pot ser més o menys senzill representar-lo. Buscant alguns exemples per fer proves (i no trencar-me les banyes fent els SMILES) he trobat una web prou interessant ja que recull un fotimer d’exemples per diferents tipus de molècules. Ho podeu trobar aquí.

SMILES

SMILES, de l’anglès Simplified Molecular Input Line Entry Specification, és una notació per descriure, de manera única, l’estructura d’una molècula fent servir una simple cadena de caràcters alfanumèrics en format ASCII. Aquesta manera d’anomenar les molècules, va néixer als anys vuitanta de la mà de n’Arthur Weininger (qui va desenvolupar diferents programes i algoritmes per manejar-les).

Aquesta notació té un seguit de coses positives que la fan interessant. És un “llenguatge” fàcil d’entendre tant per ordinadors com per persones. És un nom “únic”, és a dir, és una manera universal i única d’anomenar una molècula. Requereix poc espai d’emmagatzematge en sistemes informàtics. Com a principal pega és que si bé és relativament senzill transformar un SMILE a coordenades en dues dimensions (2D), obtenir quelcom en tres dimensions ja és molt més complicat.

Fa poc he descobert aquesta nomenclatura i m’hi estic mirant d’acostumar i entendre ja que és la manera amb que remenaré les molècules durant el post-doc.

La vida dins d’una cèl·lula…

Espectacular vídeo que reprodueix el que passa dins d’una cèl·lula i el seu entorn. És una animació en 3D que ensenya com es sintetitza una proteïna, com es mouen diferents orgànuls, proteïnes, la reproducció de l’ADN,…

Les imatges del vídeo anterior s’acompanyen de música ambiental. Si voleu, també hi ha una versió explicada aquí.

Tungstè/molibdè, seleni o sofre

Part de la meva tesi són estudis teòrics en models de selenoproteïnes comparades amb models idèntics però sense selenocisteïna (amb cisteïna en el seu lloc). Aquest models tenen, com a àtom central, un metall. Normalment, de fet, pràcticament totes les proteïnes de la família que he estudiat (les formiat deshidrogenases), aquest metall és un àtom de molibdè. Però també n’hi ha alguna que, en comptes de molibdè, té tungstè. Així doncs, he calculat models de les diferents combinacions: seleni+molibdè, sofre+molibdè, seleni+tungstè i sofre+tungstè.

He vist que cada “factor” té el seu comportament. Comparant seleni i sofre en els models amb tungstè veig que el seu comportament segueix el mateix patró, de la mateixa manera que tant el seleni com el sofre segueixen un comportament similar en els models amb molibdè i en els models amb tungstè. Per exemple, “reduir” el sistema és més costós amb tungstè però en canvi “oxidar-lo” és més senzill amb aquest metall. També hem vist que la reducció és menys costosa en tots els models amb sofre mentre que l’oxidació és, amb diferència, més senzilla quan tenim seleni. A la vegada, les diferències seleni/sofre són molt més grans en sistemes amb molibdè, de fet, amb tungstè, les diferències seleni/sofre són molt petites.

Per què? S’ha vist que les metal·loproteïnes que contenen molibdè són, pràcticament, a totes les espècies de bacteris, llevats, animals i plantes. Mentre que, en canvi, les proteïnes que contenen tungstè es limiten a algunes espècies de bacteris que, a més a més, són hipertermòfiles i/o anaeròbiques (creixen sense oxigen).

Els models que he calculat poden concloure que, les proteïnes amb molibdè treballarien millor en ambients més oxidants mentre que les que contenen tungstè ho fan millor en ambients més reductors (amb menys presència d’oxigen). Això explicaria el per què les proteïnes que contenen tungstè es troben bàsicament en ambients anaerobis.

Ara bé, per que s’observa que les diferències seleni/sofre són més grans en els models amb molibdè? El molibdè és un metall una mica més petit i menys electronegatiu que el tungstè.  El seleni és més gran que el sofre i més electronegatiu. Segons això, doncs, la coordinació seleni/sofre-metall és molt més eficient quan el metall és el molibdè i, a més a més, aquest es veu molt més afectat pel seleni que no pas pel sofre.

L’altra qüestió és, si inserir una selenocisteïna en la cadena peptídica d’una proteïna és molt més complicat que qualsevol altre aminoàcid (les selenocisteïnes requereixen un complex i específic mecanisme) i, a més a més, en els models amb tungstè no aporta quasi res de nou, per que hi ha proteïnes amb tungstè i selenocisteïna (el model calculat es basa en una d’elles). L’ambient tendeix a ser cada vegada més oxidant i cal adaptar-s’hi. Així doncs, aquesta proteïna en concret pot estar en fase de canvi, és a dir, preparant-se per treballar en ambients més oxidants i canviar el seu tungstè per un molibdè.  Hi ha moltes molibdoproteïnes que contenen seleni, així dons, aquesta proteïna en concret podria haver incorporat el seleni com a pas previ a la mutació cap al tungstè. Això darrer, és una simple hipòtesi.

L’ideal seria fer un estudi bioinformàtic per avaluar la proporció de seleni/sofre en proteïnes amb molibdè i en proteïnes amb tungstè però, malauradament, degut a que les proteïnes amb tungstè són, bàsicament, en organismes anaerobis, n’hi ha molt poques d’identificades i, menys encara, de ben seqüenciades i anotades.

“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

Ciència i desenvolupament. Un cas pràctic: Cuba

La ciència és quelcom exclusiu dels països rics? en certa manera sí. Només quan tens unes necessitats socials mínimes cobertes, decideixes invertir en ciència. La ciència és cara i, si en països com el nostre no hi ha una aposta clara de les institucions per la recerca, encara n’hi haurà menys en països on els recursos són més limitats.

Però, podem parlar realment d’exclusivitat? No. I us cito un cas pràctic: Cuba. Consideracions polítiques al marge, el país destaca pel gran nombre de metges i el seu elevat nivell de formació. I, és més, per la “cooperació” que fa aquest país amb els seus metges. Admirable. A Nicaragua, després de la Revolució Sandinista es van fer les brigades alfabetitzadores, sanitàries,… gent amb bona formació acadèmica anava arreu del país per alfabetitzar als seus conciutadans, vacunar-los,… Cuba ho fa amb els seus metges però lluny, fins i tot de les seves fronteres.

Però, tornant a la ciència. En un país embargat és difícil aconseguir material científic, molt difícil! però és un país amb un bon capital humà, amb miseria, sí, però també amb gent molt ben formada en medicina, biologia,… I, pel que sembla, la biologia computacional està esdevenint una sortida a molts científics del país. És més senzill (tot i que no és fàcil) aconseguir ordinadors que reactius.

Un article, Computational Biology in Cuba: An Opportunity to Promote Science in a Developing Country,  publicat el novembre passat a PLoS Computational Biology fa un resum de la situació d’aquest camp de la ciència a Cuba. Parla dels antecedents, del que busquen, dels problemes que tenen iles solucions,…


Computational biology can be considered a supradisciplinary field of knowledge that merges biology, chemistry, physics, and computer science into a broad-based science that is important to furthering our understanding of the life sciences. Although a relatively new area of research, it is recognized as a crucial field for scientific advancement in developing countries. This Perspective introduces our vision of the role of computational biology in biomedical research and teaching in Cuba. Except where individuals are directly quoted, any opinions expressed herein should be considered those of the authors.

Next Page »