Pycon

Embed Size (px)

Citation preview

Pycon.it 2009

Python e bioinformatica

Giovanni Marco Dall'Olio
Universit Pompeu Fabra, Biologia Evolutiva, Barcelona

Bioinformatica

E' la scienza che si occupa di analizzare e trattare tutti i dati prodotti dalla ricerca scientifica, tramite metodi computazionali

Nata negli anni '70, con lo sviluppo di un metodo per confrontare due sequenze di proteine (Matrici PAM)

Non molto corretto dire che le matrici PAM siano state sviluppate come metodo per confrontare due sequenze di proteine.Sono un modello? ...

Esplosione di dati scientifici

Al giorno d'oggi si producono pi dati scientifici di quanto si riesca ad analizzare

Costi e tempi diminuiti rapidamente

n. sequenze (GenBank)20091996

Tipico esempio di bioinformatica

Il sequenziamento del genoma umano nel 2001:CCGACGGTTTAACCGCGGGACCGACCTTTGAGAATATCGGTACTCGCGAGACGGATTATCTGTAGAGTGATCGTTGGAATTTGCTCGATAATCCCCCTCTGCTGGTGAACATGGGAAATAACGAGAACCCAAAATGCGTACCAGCTTCGCTCCAATATATAGTGGAGGCGCATCATACAATCCAGATCCTAACGCCCTAAGAGAAGATTGTCAGCCTCGAGTGCAACGATTGAGCGAGAGAGAAGATAGGGCGGTGAAGACTTTCTCTCAGATAATTCTAACTCTTCCGACTCAAAACGGCCTGTCAATGGCCTATGCGGAAGAGTATTGAGTATTGAACCTACGCGATCCTCAGTGTGGCGTGCGACGTCCTCACCAATGTTACGTAAGAGTTCTAACCGTTTTCTGGACCCCTAGCCAGGTGGTCAGGGGTACGAACTTTTAATCACCAATGTTACGTAAGAGTTCTAACCGTTTTCTGGACCCCTAGCCAGGTGGTCAGGGGTACGAACTTTTAAAGTGTTCGGCGAATCCCGAACGCCGTTAGTGGCGCACTCAAATTCCCCATCTAGGAGGTTTTCGTGATGTTAATATTTGCGCGAGGATACTTCACCAAGC.......

Una enorme sequenza di 3*10^9 caratteri

Genoma umano

Immaginate una sequenza come quella del genoma umano

Non molto utile finch non la integriamo con altri dati

Che strumenti utilizzare per analizzarla?

Che approcci, che tecniche?

Esempio di annotazione

CCGACGGTTTAACCGCGGGACCGACCTTTGAGAATATCGGTACTCGCGAGACGGATTATCTGTAGAGTGATCGTTGGAATTTGCTCGATAATCCCCCTCTGCTGGTGAACATGGGAAATAACGAGAACCCAAAATGCGTACCAGCTTCGCTCCAATATATAGTGGAGGCGCATCATACAATCCAGATCCTAACGCCCTAAGAGAAGATTGTCAGCCTCGAGTGCAACGATTGAGCGAGAGAGAAGATAGGGCGGTGAAGACTTTCTCTCAGATAATTCTAACTCTTCCGACTCAAAACGGCCTGTCAATGGCCTATGCGGAAGAGTATTGAGTATTGAACCTACGCGATCCTCAGTGTGGCGTGCGACGTCCTCACCAATGTTACGTAAGAGTTCTAACCGTTTTCTGGACCCCTAGCCAGGTGGTCAGGGGTACGAACTTTTAAAGTGTTCGGCGAATCCCGAACGCCGTTAGTGGCGCACTCAAATTCCCCATCTAGGAGGTTTTCGTGATGTTAATATTTGCGCGAGGATACTTCACCAAGC.......

Coding

SNP

????

Bioinfo altri casi d'uso

Biologia strutturale: studiare strutture di proteine, predirle

Docking molecolare: simulare l'efficacia di una molecola come farmaco

Bioinfo altri casi d'uso

Data integration ovvero riunire informazioni da piu' fonti

La maggior parte del lavoro di un bioinformatico consiste in questoScaricare una lista di geni da un sito, le loro sequenze da un altro, ...

Unire i risultati di pi esperimenti indipendenti

Altri esempi presentare i dati

La comunicazione via web molto importante

Senza, sarebbe impossibile coordinare qualsiasi progetto di ricerca

Alcuni portali (ncbi, uniprot, ) mettono a disposizione dati e tool pubblici

Ncbi (sequenze, geni, genomi, ....)

Uniprot (proteine)

Pubmed (articoli)

....

Bioinformatica e programmazione

La maggior parte delle persone che lavorano come bioinformatici ha un background in biologia Non molti programmatori professionisti

Per molte operazioni mostrate nelle slide precedenti, non necessario utilizzare linguaggi a basso livello

in bioinformatica sono molto diffusi linguaggi di scripting (perl, python, R, ...)

Python e bioinformatica

Python uno dei linguaggi pi utilizzati in bioinformatica

www.bioinformatics.org survey

Java

Perl

Python

Vantaggi di Python in bioinfo

Sintassi chiara, documentazione

Facile da imparare

Ottimo per scripting

Librerie per database, testing, documentazione, calcolo scientifico

Orientato ad oggetti, ma multi-paradigma

Python e bioinformatica

Curva d'apprendimentoFacile da imparare ma potente

LeggibilitTestingDoctest, unittest, nose

Comunit open sourceBioPerl e BioConductor sono piu' ampi

Paradigmi di programmazioneMulti paradigma, OO

Velocit di esecuzioneInterpretato;

DatabaseOttimi ORM (sqlalchemy), supporto ad altri tipi di db

Other voices:- community?

Bioinformatica e programmazione

Bioinformatica un approccio diverso rispetto alla programmazione di un softwareUso estensivo di scripts e moduli

Makefiles e simili per creare pipelines

Tests utilizzati anche per comunicare con non-programmatori

Continua necessit di riadattare scripts

Bioinformatica, caratteristiche:Uso estensivo di scripts

Makefiles e simili per creare pipelines

Tests utilizzati per comunicare con non-programmatori

Continua necessit di riadattare uno script a funzionalit diverse (feature creep)

Cose che preoccupano di meno:Sicurezza del codice (a meno che non si lavori su wwb)

Portabilit

Bioinformatica e scripts

Piu' che scrivere programmi completi, spesso si scrivono piccoli scripts e libreriePi facili da scrivere

Piu' facili da riadattare

Makefiles e simili posso essere utilizzati per creare pipelines

Esempio di pipeline (Makefile)

all: get_sequences result1 result2

get_sequences:
python download_sequence.py -gene 'XYZ' -database 'ncbi' -...
python ....

result1:
python calculate_result.py --input data1.txt

result2: data2.txt
cut -f 1, 3 data2.txt > result2.txt

Esempio pi complicato di pipeline

mask(S)
flat: S.masked
run: RepeatMasker -lib $(RMLIB) S

mask_then_blast(S,D)
flat: S-results/S.D.blast.raw
req: mask(S) blastindex(D)
srun: blastall -p blastx -i
.......

BioMake
(http://skam.sourceforge.net/skam-intro.html )

Testing usato per comunicare

Immaginate che questo grafico sia il risultato di una vostra analisi

Come dimostrare che sia corretto?

Testing - esempio

La parte piu' difficile di un esperimento scegliere i controlli e i background corretti

In bioinformatica la stessa cosa, solo che molto si fa al computer

Testing - esempio

Abbiamo scritto un programma per leggere il formato Fasta e convertirlo al formato GenBank

Abbiamo scritto un programma per leggere il formato Fasta e convertirlo al formato GenBank, e testato il suo funzionamento corretto su un file con una sola sequenza, su un file con sequenze multiple, su un file corrotto.....

Python e testing

Python ha delle buone librerie per il testingDoctest esempi inclusi nella documentazione

Unittest unit test classico con fixtures

Nosetest individua tutte le funzioni che assomigliano a tests e le esegue

doctest

>>> help(say_hello)

Help on function say_hello in module __main__:

say_hello(name) print hello to the screen example: >>> say_hello('Albert Einstein') hello Albert Einstein!!!

Doctest esempio 2

Le doctest sono comode per comunicare con un non-programmatore

unittest

From unittest import *

class SimpleFastaSeqCase(unittest.TestCase):

@classmethod
def setUpClass(cls):.....
@classmethoddef tearDownClass(cls):.....def setUp(self):.....def tearDown(self):.....def testCondition1(self):.....def testCondition2(self):
.....

Istruzioni da eseguire
prima/dopo tutti i test

Istruzioni da eseguire prima/dopo ogni test

Tests

Python a oggetti

Un genoma composto da diversi cromosomi

Su ogni cromosoma possiamo individuare diversi elementi, come geni, fattori di regolazione, etc..

Ogni gene codifica per pi trascritti, che a loro volta possono dare origine a pi proteine

> la programmazione a oggetti si presta molto bene a rappresentare dati di tipo biologico\

Programmazione a oggetti - esempio

genes = {'gene1': { 'position': 10000, 'chromosome': 11, 'sequence': 'GTAGCCTGATGAACGGGCTAGCATGC....', 'transcripts':
{'transcript1': [......],'transcript2': [......],},},'gene1':{ 'position': ...........},.....}

def get_subseq(genes, geneid, start, end):''' get a subsequence of a gene, given a dictionary of gene annotations, a gene id, and start/end position '''pass

Programmazione a oggetti - esempio

genes = {'gene1': { 'position': 10000, 'chromosome': 11, 'sequence': 'GTAGCCTGATGAACGGGCTAGCATGC....', 'transcripts':
{'transcript1': [......],'transcript2': [......],},},'gene1':{ 'position': ...........},.....}

def get_subseq(genes, geneid, start, end):''' get a subsequence of a gene, given a dictionary of gene annotations, a gene id, and start/end position '''pass

The previous code (where each 'gene' was a dictionary of dictionaries with lists) can be better structured as an object

Un oggetto in python

class gene:

def __init__(self):
position = None
sequence = ''
transcripts = []

def get_subseq(self, start, end):
pass

La sintassi di Python per gli oggetti chiara e semplice

Pi concisa di Java, inoltre non obbligatorio usare OO

OO piuttosto complicato in perl

Python and Java classes

public class Gene {

public int position;
public str chromosome;
public str transcripts[];

public Gene(int pos){
position = pos
}

public void getSubseq(int start, int end) {
pass
}

class gene:

def __init__(self,pos):
self.position = pos
self.sequence = ''
self.transcripts = []

def get_subseq(self,
start, end):
pass

(Una classe in python)

(Una classe in Java)
(non sono un programmatore Java!)

Lavorare con dati scientifici

Un problema serio quello di immagazzinare i dati e accedervi

diffusione di vari formati di testo

disputa tra flat files, database, e altri sistemi

Python e database

Python ha ottimi moduli per gestire database relazionaliSqlalchemy, elixir.....

sqlalchemy example

Python e database

Python ha ottimi moduli per gestire database relazionaliSqlalchemy, elixir.....

I db relazionali non vanno sempre bene per gestire dati scientificiRappresentare grafi?

Strutture gerarchiche?

Merging di insiemi di dati?

Grafi e database relazionali

E' facile rappresentare un grafo in un db relazionale, ma difficile navigarlo (query ricorsive)

Problema comune in bioinformatica

http://phenomics.cs.ucla.edu/

SELECT * FROM exons t1, exons t2, exons t3, splices t4, splices t5, splices t6 WHERE t1.cluster_id=t4.cluster_id AND t1.gen_end=t4.gen_start AND t4.cluster_id=t2.cluster_id AND t4.gen_end=t2.gen_start AND t2.cluster_id=t5.cluster_id AND t2.gen_end=t5.gen_start AND t5.cluster_id=t3.cluster_id AND t5.gen_end=t3.gen_start AND t1.cluster_id=t6.cluster_id AND t1.gen_end=t6.gen_start AND t6.cluster_id=t3.cluster_id AND t6.gen_end=t3.gen_start;

Strutture gerarchiche e db

I db relazionali non sono adatti per rappresentare dati sequenziali

Difficile rappresentare 'sottosequenze' (o slice di stringhe)

Altri tipi di database

Python ha delle buone librerie per interagire con altri tipi di database

db a oggetti: ZODB

db gerarchico: PyTables

...

HDF5

HDF5 un formato di file binario, usato un fisica e astronomia

Database gerarchico (tabelle dentro altre tabelle)

Ottime APIs in python (PyTables)

SNP object

- id

- position

- chromosome

- genotypes

individualgenotype

- allele1- allele2- stats

populationiHSFst

Nested tables

Librerie open source per la bioinformatica

Vediamo qualche modulo di utilit generica..

Biopython

Una collezione di moduli per la bioinformatica

Numero di funzionalit implementate:bioconductor > bioperl > biopython > tutti gli altri

Punti forti di Biopython:Supporto a diversi formati

APIs per entrez e alcuni database importanti

Pdb / strutture

Biopython Esempi

# Leggere un file in formato fasta e salvarlo in un dizionario
from Bio.SeqIO import SeqIO
seqfile = open('fastafile.fa', 'r')

sequences = SeqIO.to_dict(SeqIO.parse(seqfile))


# Query NCBI
results = Entrez.esearch(db='nucleotide', term='cox2')
Entrez.read(results)

Pygr

Ottimo per analisi su genomi

Punti fortiNasconde il problema del salvataggio di dati (database, files)

Usare e configurare blast locali

Creare annotazioni

Interfaccia con ncbi, ensembl, ucsc

Pygr esempi

# Ensembl APIs
serverRegistry = get_registry(
host='ensembldb.ensembl.org',
user='anonymous')
coreDBAdaptor = serverRegistry.get_DBAdaptor(
'homo_sapiens', 'core',
'47_36i')
sequence = coreDBAdaptor.fetch_slice_by_seqregion(
coordSystemName, seqregionName)

# Scarica la seq del genoma umano da ucsc(18)
import pygr.Data
hg18 = pygr.Data.Bio.Seq.Genome.HUMAN.hg18(
download=True)

Scientific Python

Numpy: modulo per calcolo numerico (array, matrici..)

Scipy: calcolo matematico avanzato, test statistici..

Matplotlib: plottare grafici

Alcune alternative:sage

rpy (interfaccia a R)

Numpy/Scipy example

Note: ipython -pylab per trasformare python in un ambiente simile a R

Svantaggi di Python in bioinfo

La comunit open source di Python attiva, ma quelle di Perl e R lo sono di pi

In alcuni campi, mancano ancora buone librerie

Problemi con multi-threading

Problemi della bioinfo

Mentalit 'Publish or Perish'dopo aver pubblicato, programmi e database vengono abbandonati

Il testing poco diffuso, difficile riconoscere gli erroriMolti scripts non sono inclusi nelle pubblicazioni!

Poca cultura su software engineering

Babele di formati/database/scripts

Grazie per l'attenzione!!

Ringraziamenti:Bologna biocomp group

molecularlab.it

Biologia evolutiva UPF

nodalpoint.org and all bioinfo bloggers

Fine talk

Sequenziamento genoma umano

Immaginate una sequenza grande come il genoma umano

Come trarre ordine da una massa di dati come questa?

Come associare un gene ad una posizione, sequenza?

Che strumenti? Che tecniche?

Che approcci?

Esempio di annotazione di una sequenza

Annotazione di una sequenza -> identificiare posizioni di geni, fattori di regolazione, ...

Esempio di esperimento bioinformatico

Ipotesi: il gene XYZ conservato in uomo e topo.

Assunzioni: I genomi di entrambi gli organismi sono stati sequenziati con lo stesso livello di qualit;

....

....

Esempio di esperimento bioinformatico

Per dimostrare che il gene XYZ conservato in entrambe le specie, potrei scrivere diversi scripts:download_sequences.py

check_sequences.py

compare_length.py

Il modo pi semplice di organizzare una pipeline tramite Make o tool simili