Practica3 PC (Laboratori Integrat) (2016)

Ejercicio Catalán
Universidad Universidad Autónoma de Barcelona (UAB)
Grado Genética - 2º curso
Asignatura Tècniques Instrumentals
Año del apunte 2016
Páginas 12
Fecha de subida 02/04/2016
Descargas 13
Subido por

Vista previa del texto

Grau de Genètica curs 2015-2016 Laboratori Integrat IV Tècniques Instrumentals pràctica 3: Estructures de control a Perl Professors: Raquel Egea (raquel.egea@uab.cat) Sergi Hervás (sergi.hervas@uab.cat) Introducció Les estructures de control (o de control de flux) ens permetran alterar i gestionar l'entrada, processament i sortida de les dades al nostre programa. Amb elles podrem crear programes que responguin d'una manera o una altra segons les nostres necessitats, o repetir diverses vegades un conjunt d'instruccions de manera automàtica. Veurem les següents estructures:     if / elsif / else while for foreach A més a més, veurem la funció substr per obtenir fragments concrets dins d'un text, i realitzarem cerques de patró simples dins de les nostres seqüències.
1.- Estructures de Control.
1.1 if / elsif / else L'estructura if ens permet realitzar accions condicionals dins del nostre programa. Té la següent sintaxi: if (condició) { #instruccions } Així doncs, les instruccions dins del bloc separat per claus { } només seran executades si es compleix la condició dins dels parèntesis. Les condicions són generalment comparacions (de cadena, booleanes o numèriques) entre variables. Així doncs el següent programa ens comprova si 2 variables numèriques són iguals: $x = 10; $y = 10; if ($x == $y) { print "$x és igual a $y"; } Podem ampliar la funcionalitat amb les instruccions elsif i else. La primera ens permet anar afegint blocs de condicions que s'executaran si l'anterior condició no s'ha complert.
else només s'afegeix al final d'un conjunt de blocs if/elsif sense cap condició associada ja que s'executarà en cas que cap altre bloc hagi complert les seves condicions if (condició 1) { #instruccions 1 } elsif (condició 2) { #instruccions 2 } ...
} else { #instruccions } En cas que per a diferents condicions vulguem executar les mateixes instruccions podem posar-les dins del mateix bloc if / elsif fent servir els operadors && ('AND' o d'unió) ó || ('OR' o d'exclusió) : #SUMAR CONDICIONS if (condició1 && condició2 && condició3) { #instruccions } #EXCLOURE CONDICIONS if (condició1 || condició2 || condició3) { #instruccions } Activitat 1.1: Crea un programa que comprovi si 2 seqüències de DNA són iguals (et caldrà l'estructura if/elsif/else i la funció length per indicar si són igual de llargues però amb diferent contingut) 1.2 while L'estructura while és iterativa, repetirà les instruccions del bloc mentre es compleixi la condició. Té la següent sintaxi: while (condició) { #instruccions } L'estructura de blocs i condicions és idèntica a l’if/else. Fent servir un while el següent programa compta d'1 a 10: $x = 0; while ($x <= 10) { print "$x\n"; $x++; } Activitat 1.2: Crea un programa que faci un compte enrere des de 3 fins a 0 mostrant cada número excepte el 0 que ha de mostrar un missatge que indiqui que s’ha acabat el compte.
1.3 foraech L'estructura foreach llegeix un per un cada element d'un array. Té la següent sintaxi: foreach $element (@array) { print $element ."\n"; } L'exemple anterior ens imprimeix cada element de l'array que li hem donat. Cada element s’assigna a la variable escalar $element en cada iteració. En el següent exemple, en comptes de $element, utilitzem el nom $name per accedir a cada element de l’array.
@geneNames = ('hs6st', 'moe', 'brca2'); foreach $name (@geneNames) { print $name ."\n"; } Podríem no especificar un nom de variable escalar per accedir als diferents elements de la matriu i aleshores hauríem de fer servir la variable especial de Perl $_. Aquesta variable escalar es crea automàticament i guarda l’element actual amb el que estem treballant i es modifica en cada iteració.
@geneNames = ('hs6st', 'moe', 'brca2'); foreach (@geneNames) { print $_."\n"; } Activitat 1.3: Crea un programa per comptar cada tipus de nucleòtid d'una seqüència però fent servir un bucle foreach. (NOTA: hauràs de fer servir if/elsif i split).
1.4 FOR L'estructura for genera un bucle on tenim molt més control del què ocorre a cada iteració.
Té la següent sintaxi: for ( inici comptador; condició; modificació comptador ) { #instruccions } El programa que hem creat per comptar fins a 10 el podem fer integrant dins del parèntesis tant la condició com l’inici del comptatge i la modificació (un increment en aquest cas): for ( $i = 0; $i <= 10; $i++) { print "$i\n"; } Activitat 1.4: Crea el mateix programa per comptar cada tipus de nucleòtid d'una seqüència però fent servir un bucle for. (NOTA: hauràs de fer servir if/elsif i split) 2.- Iterar sobre les files d’un arxiu Podem fer servir el FILEHANDLE o sobrenom de l'arxiu obert per llegir-lo fila per fila si envoltem aquest sobrenom entre els símbols < >. Així doncs la lectura d’un arxiu fila per fila amb un bucle while tindria la següent estructura: open (ARXIU,ruta_arxiu) or die $! ; while (<ARXIU>) { #instruccions } close (ARXIU); Però potser ens interessa més un bucle foreach, així doncs podem guardar de la mateixa manera tot l'arxiu en un array on cada fila serà un element de l'array. D’aquesta manera podem tancar la connexió amb l’arxiu abans de llegir-lo amb el bucle.
open (ARXIU,ruta_arxiu) or die $! ; @arxiu = <ARXIU>; close (ARXIU); foreach $fila (@arxiu) { #instruccions } 3.- Cerques de patró i extracció de fragments.
Per realitzar una cerca d'un patró dins d'una cadena de text podem fer servir la següent estructura: $variable =~ /patró/ El símbol '=~' indica inici d'una cerca de patró sobre una variable, i retorna un resultat booleà (1/0 , True/False) segons es trobi o no, per això és molt útil en estructures de control. El símbol ‘=~’ s’ha d’escriure tot seguit, no hi pot haver un espai en blanc al mig o l’intèrpret de Perl creurà que estem assignant un valor a la variable.
El patró que cerquem pot ser qualsevol conjunt de caràcters numèrics, de text o especials que anomenem expressió regular.
3.1 Substitucions Dins d'una cadena de text podem substituir un patró concret per un altre: $variable =~ s/patró/canvi/g En aquest cas 's' indica substitució, i la 'g' al final indica que es realitzarà la substitució per cada patró trobat (sense això, només es realitzaria la substitució al primer patró trobat).
Activitat 3.1: Crea un programa que transformi una cadena de DNA existent en una d'RNA .
(substitueix T per U) Amplia'l per a que pugui transformar aquesta mateixa cadena de DNA en la seva complementària. (Substitueix cada base per la seva complementària).
T’has trobat algun problema? 3.2 Transcripcions Per poder realitzar un canvi de diversos elements d'un patró a uns altres en un sol pas podem escriure: $variable =~ tr/patró/canvi/ En aquest cas amb 'tr' es realitzarà la cerca sobre tota la cadena i no cal la 'g' final.
Activitat 3.2: Adapta el programa anterior per transformar una cadena de DNA a la seva complementària reversa.
3.3 SUBSTRING Podem extreure fragments més petits d'una cadena de text més gran ja existent amb la funció substr. Aquesta funció te la següent sintaxi: substr(variable, inici, llargada) Per exemple, de la següent cadena de text en volem extreure els 3 primers elements: $text = 'abcdefghijk'; $abc = substr($text, 0, 3); # la nova variable $abc conté els 3 primers elements Tot i que la funció substr es fa servir sobre variables escalars, comença a comptar en la posició 0!! La variable de la qual s’extreu un fragment no es veu modificada. En el cas anterior $text continua sent ‘abcdefghijk’.
Activitat 3.3: De la pràctica anterior, crea un programa que agafi el primer exó del gen hs6st de D. melanogaster que es troba a les coordenades 1 a 362 (referents al gen) i l’emmagatzemi en una nova variable escalar.
Exercici per entregar: Crea un programa que llegeixi una seqüència en format FASTA i la retorni en el mateix format, però canviant el nombre de nucleòtids a imprimir a cada fila de la seqüència. Fes servir la seqüència del primer exó del gen hs6st.
Passos: 1.- Llegir arxiu i guardar-lo a variable (open) 2.- Separar fila d'ID de la seqüència (expressions regulars o funcions d'array) 3.- Eliminar salts de línia i espais de la seqüència (Substitució de patró) 4.- Tornar a imprimir ID i seqüència en un nou arxiu, aquest cop amb el nombre de nucleòtids per fila diferent del de l’arxiu inicial (bucle + substr) Exercici per aprofundir: Basat en el programa de l'exercici per entregar crea un programa que llegeixi 2 arxius: un FASTA amb la seqüència del gen hs6st i un altre arxiu indicant les coordenades de cada intró i exó (arxiu d'anotacions).
L'arxiu d'anotacions tindria aquest format (chromosome, start, stop, name): 2L 2L 2L ...
1 301 823 300 822 954 exon1 intron1 exon2 La separació entre les columnes és un espai tabulador (invisible pels editors de text, però no per l’intèrpret de Perl (\t)).
A partir de les coordenades de l'arxiu d'anotacions imprimeix la seqüència corresponent a cada element del gen.
Passos: 1.- Llegir arxiu FASTA i guardar la seqüència en una variable (passos 1, 2, 3 de l'exercici per entregar).
2.- Llegir arxiu d'Anotacions 3.- Iterar per cada anotació, agafar-ne les coordenades, extreure el fragment de seqüència corresponent (bucles + split + substr).
4.- Mostra la informació per pantalla (element del gen i seqüència corresponent).
...