Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
‘AATT’
-“s.find(substring)”= cerca substring all’interno di “s” e restituisce
l’indice della prima occorrenza o -1 se non è presente
s1=’SpamSpamSpam’.
ESEMPIO:
i= s1.find(‘am’)i=2
tipi di dati composti:
• Sequences
• Str
• List
• Tuples
• []
-“list”= collezioni ordinate di elementi. Gli elementi possono essere di
tipi diversi all’interno della stessa lista. A ciascun elemento è associato
un indice (come nelle stringhe). Le liste sono modificabili. La stringa
rispetto alla lista non si può modificare. Con le liste si possono fare
delle strutture un po' più complicate.
Struttura list: L=[‘A’, ‘C’, ‘G’, ‘T’]
Modifica list: L[ind]= X modifica X
Metodi che agiscono sulle liste per modificarli: L.append(X) aggiunge X
alla fine della lista.
Ricerca in list: L.count(X) conta quante volte l’elemento X compare
nella lista.
Aliasing: se definisco NOME1 = NOME2 non vado a creare una copia
ma creo un sinonimo; perciò se modifico il contenuto di uno causo la
modifica del secondo. seqs
ESEMPIO 12_1: “La variabile contiene una lista di sequenze
proteiche. Scrivere un programma che calcola:
• La carica elettrica di ciascuna proteina.
• La carica media delle sequenze.
• La deviazione standard di questo valore.”
L=[…]
i= 0
while i< len(L):
S=S+L[i]
i= i+1
m= S/lun(L)
modifichiamolo utilizzando for:
L=[…]
S= 0
for X in L:
S= S+X
m= S/lun(L)
modifichiamolo ulteriormente utilizzando def:
def media (l):
s= 0
for X in L:
S= S+X
m= S/lun(X)
return m
L=[…]
S= 0
for X in L:
S= S + (X – media[L])**2
signe= (S/lun(L))**0.5
[questo programma è particolarmente lento da eseguire]
RISPOSTA ESERCIZIO 12_1: #noché: protein=[‘…’,’…’,’…’]
seqs=[‘…’,’…’,’…’] #anche: charges=[…]
chgs=[-1,+2,…]
for protein in proteins:
charge= get chg(protein)
charges_appeand(charge)
print(media(charges))
print(deviazione(charges))
ESEMPIO 12_2:”Scrivere un programma che a partire da una ricerca in
banca dati di sequenze proteiche calcola il valore medio e la
deviazione standard delle sequenze individuate:
• Scarica le sequenze dalla banca dati (Entrez Direct)
• Leggi i file
• Calcola le cariche (es12_1)”
RISPOSTA:
#!/bin/bash
esearch -db protein -quesry ‘…’ \ efetch -format fasta > proteins.fasta
.\calcola_carica.py
proteins= leggi(‘proteins.fasta’) Lezione 7
Alberi filogenetici: grafo che rappresenta le relazioni evolutive tra gli
elementi che lo compongono (organismi, sequenze nucleotidiche,
sequenze proteiche,…)
• Costituito da nodi e rami, ciacun ramo unisce due nodi [vedi
slide].
La domanda è: se ho n elementi e devo disporli su un albero, di quanti
alberi necessito? Formula: N = [(2N-5)!]/[2 (N-3)!]
N-3
alberi
Algoritmo UPGMA: calcoliamo una tabella che ci da la distanza tra gli
elementi più lontani e quelli più vicini.
Algoritmo Neighbor-Joining: iniziare la struttura dell’albero come
quella di un grafo a stella. Così provo a collegare ogni elemento
insieme provando tutte le possibili coppie creando un albero.
• Raggruppa gli elementi in coppia.
• Calcola la somma delle distanze lungo l’albero.
• Sceglie la coppia che minimizza la somma delle lunghezze di tutti
i rami dell’albero.
• Sostituisce i 2 nodi terminali selezionati con l’ancestore comune.
• [vedi slide].
Il metodo UPGMA tende a creare alberi (algoritmi) a scala. I metodi
UPGMA e Neighbor-Joining utilizzano come unica informazione la
distanza tra coppie di sequenze. Tutta la restante informazioni
contenute [vedi slide].
Metodo a massima parsimonia: calcola l’albero che richiede il minor
numero possibile di sostituzioni per spiegare la differenza tra le varie
sequenze.
Disposizione nodi: Metodo di Fitch: [vedi slide] se si conta le volte
che lungo gli alberi abbiamo una lettera mutata vuol dire che ha
seguito il metodo di massima parsimonia. Viene così scelta la
configurazione che minimizza le operazioni di unione.
Massima probabilità: dato un certo set di dati osservati si cercano i
parametri del modello che massimizzano la probabilità di osservare
[vedi slide].
Massima probabilità in alberi filogenetici: la probabilità degli
alberi è dettata dalla probabilità di avere i singoli amminoacidi. l’albero
con un prodotto di probabilità più alto sarà quello migliore.
Tree-puzzle: algoritmo a massima probabilità per il calcolo di alberi
filogenetici. La soluzione è ottenuta con una procedura di 3 fasi:
• Definizione di tutti i possibili alberi di 4 sequenze.
• Definizione di un albero completo combinando gli alberi di 4
sequenze.
• La fase 2 viene ripetuta N volte. L’albero finale viene definito
attraverso il confronto tra gli N alberi.
Una volta disposte le sequenze le disponiamo in ordine casuale.
Prendendo le prime 4 costituiamo un albero genetico; dopodiché
sovrapponiamo l’albero nuovo a quello dato inizialmente. Il
procedimento continua finché non si ottiene il risultato più alto; il
punteggio dipende da come vengono disposte le sequenze. Di tutti gli
alberi costruiti troveremo delle sequenze invariate.
Orologio molecolare: ipotesi che le mutazioni del DNA avvengano ad
una frequenza costante. Questo permette di calcolare la distanza
temporale tra due sequenze che derivano da un ancestore comune se
la frequenza di mutazione è nota.
Libro consigliato: “on the origins of species, Charles Darwin” &
“Evolution of increased complexity in a molecular machine” & “the
anchestor’s tale”.
PROGRAMMAZIONE:
f= open(NomeFile, Prop): crea un oggetto di tipo file di nome “f”
(“f” è il nome di una variabile, quindi segue le stesse regole). NomeFile
è una stringa che contiene il nome del file (se necessario con relativo
percorso nel file system). “prop” è una stringa che indica come il file
viene aperto (modalità e tipo).
È possibile specificare solo la probabilità e non il tipo. Nel caso il
default è “text”. Se si vuole specificare il tipo è necessario specificare
anche la modalità.
-“file.read([N])”: legge N caratteri, o fino la fine del file se N non è
specificato. Il fine riga, l’operazione di andare a capo, è un carattere e
si indica con “\n” (carattere speciale). E questo comando legge finchè
non legge questo carattere.
-“file.readline([N])”: legge una linea del file, e restituisce la linea,
incluso il carattere di fine linea. Se N è specificato legge al più N
caratteri. Readline sia read restituiscono una stringa vuota una volta
arrivati alla fine del file (quindi valore False).
-“file.readlines()”: legge le linee del file fino a fine file, e le restituisce
in una lista di stringhe.
-“strip()”: cancella gli spazzi della lista.
ESEMPIO:
il= 0
lines= fin.readlines()
while il< len(lines):
print(lines[il].strip())
il= il + 1
ALTRO ESEMPIO [con readline]:
line= fin.readline()
while line:
print(line.strip())
line= file.readline()
file.close()
scrittura di file di testo:
-“file.write(stringa)”: scrive la stringa nel file.
-“file.writelines(lista)”: scrive le stringhe presenti nella lista nel file
(si usa se si vogliono scrivere tante stringhe).
[write non si userà molto spesso]
ESEMPIO [con readlines]:
fin= file.open(nome,’rt’)
proteins= []
for L in fin.readlines():
L= l.strip()
If L: if L[0]== ‘>’:
proteins.append(protein)
protein= ‘…’
else: protein= protein + L
fin.close()
SET – INSIEME: insieme NON ordinato di elementi che NON contiene
ripetizioni. Gli elementi di un insieme possono contenere: int, float, str,
bool, tuples. Gli elementi di un insieme NON possono essere: lists, sets,
dictionares (in pratica non possono essere variabili modificabili). Gli
elementi non devono essere per forza dello stesso tipo.
L’insieme non contenendo le ripetizioni non è possibili aggiungere
caratteri o liste già presenti nell’insieme. Un insieme si definisce così:
S= {‘A’, ‘B’, ‘C’}
Non è possibile definire più insiemi (S1, S2, S3…). Si possono però
creare dei “set”:
-“SET1 | SET2”: definisce un nuovo SET con tutti gli elementi di SET1
e tutti gli elementi di SET2 (o qualsiasi altro [vedi slide].
L’operatore “in” “(not in)” e la funzione “len” viste per le variabili di
tipo str funzionano anche per variabili di tipo list e set (funzionano per
oggetti di tipo iterabile).
ES12_10:”dato un file contenente le varianti genomiche di 3 soggetti
(P1, P2, P3) con il seguente formato. [vedi tabella sulle slide] Scrivere
un programma che determini il numero di geni con varianti in tutti e 3 i
soggetti”.
SVOLGIMENTO:
f= open(‘…’, ‘rt’)
L= f.readline()
S1= {}
S2= {}
S3= {}
For L in f.readline():
l= l.strip()
if L: r= l.split(‘,’)
if r[0]== ‘P1’:
gene= r[-1]
S1.add(gene)
Print(S1&S2&S3) Lezione 8
-“D[key]”: Restituisce il valore associato a key. Errore se key non è
presente nel dizionario.
ESEMPIO: #il carattere “:” indicano un dizionario
D= {‘A’:’B’,’B:’b’}
D={}
D[‘A’]= ‘a’
D[‘B’]= ‘b’
Data la seguente variabile:
Z= {‘A’:{‘hb’:2,’pair’:’T’},’T’:{‘hb’:2,’pair’:’A’},
‘C’:{‘hb’:3,’pair’’G’},’G’:{‘hb’:3,’pair’:’C’}}
Indicare quali delle seguenti affermazioni è corretta:
- Z è una variabile di tipo dizionario
- Z[‘A’] è una variabile di tipo lista
- Z[‘T’][‘pair’] coincide con il carattere ‘A’
-Z[‘T’][