Laborvezetőknek
A 3. előadás laborkártyáit kérdezzük végig a hallgatóktól (és persze a korábbiakból is osszunk ki, amelyeket fontosnak érezünk). Ha indokolt, akkor bevezethető a több sebességes labor, ahol az előre készülő hallgatók későbbi feladatokkal dolgoznak, vagy kapcsolódó mélyebb feladatot kapnak. A "tömeg", azaz a labor main stream-je pedig szorosabban együtt dolgozik a laborvezetővel.
Hallgatóknak
Sosem árt előre készülni a laborra, nálam szereztek így kisbajnokság trófeát. Ha többen is elkészítik, akkor holtversenyben mindannyian megkapják a "trófeákat".
Tematika
Az alábbi témák legtöbbjét próbáljuk lefedni a második gyakorlaton:
- Beszéljük meg és teszteljük a g.c-t, itt azt kell kiemelni, hogy hármasával olvassuk a betűket a fájlból, de nagyon rossz gyakorlat, ha a ciklusban ciklusolgatni kezdünk... e helyett egyetlen ciklust használunk:
// a betűket 3-asával "olvasom": nem kell cifrázni! egy ciklus // elvégzi, amiben megjegyzem, hogy melyik hányadik betű volt // aki ciklusban ciklusolgat, az már bénázik :) int main (void) { // hányadik betűn állok? int hanyadik_betu = -1; // azon a helyen mit olvastam? int elso = 0, masodik = 0, harmadik = 0, i = 0, jegy = 0; while ((i = getchar ()) != EOF) { switch (i) { case 'T': jegy = 0; break; case 'C': jegy = 1; break; case 'A': jegy = 2; break; case 'G': jegy = 3; break; } hanyadik_betu = (hanyadik_betu + 1) % 3; if (!hanyadik_betu) elso = jegy; else if (!(hanyadik_betu - 1)) masodik = jegy; else { harmadik = jegy; printf ("%s", genetikai_kod (elso * 16 + masodik * 4 + harmadik)); } } }
vedd észre, hogy a kód pici továbbfejlesztése a progpater.blog.hu/2011/02/27/a_human_genom_projekt poszt bevezető progijának, csak ott kettesével olvasunk és két betűből készítettünk egy hexadecimális jegyet. - Feladat (kisebb sebességű): készíts "aminosav-hisztogramot", azaz a progi továbbfejlesztésével mond meg, melyik aminosav hányszor szerepel? (egy trófea, jöhet kommentben előre is)
- Hogy változik ez a szám, ha az első kódoló betűt törlöd a bemenő fájlból (azaz a 2. betűtől méred fel a 3 betűket) (egy trófea, jöhet kommentben előre is)
- Hogy változik ez a szám, ha az első két kódoló betűt törlöd a bemenő fájlból (azaz a 3. betűtől méred fel a 3 betűket) (egy trófea, jöhet kommentben előre is)
- Feladat (nagyobb sebességű): módosítsd a z.c-t, hogy ne 0, 1 betűkre menjen, hanem a 4 T, C, A, G betűre és így építs fát (ez már nem bináris fa lesz persze), mennyi a 2. kromóra az LZW fa ághosszainak átlaga és sztenderd hibája? (ez 5 trófeát ér, jöhet kommentben is)
- További két kisbajnokság, aki gyorsabbat ír:
[norbi@sgu tcag]$ time ./g <hs_alt_Hs_Celera_chr2.fa >aminosavak
real 0m17.428s
user 0m16.593s
sys 0m0.714s
BN laborján
Tekerj tovább, itt jön a g.c teljes kódja is:
g.c
// g.c // // genetikai kód nyomtató // Programozó Páternoszter // // Copyright (C) 2011, Bátfai Norbert, nbatfai@inf.unideb.hu, nbatfai@gmail.com // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // // Ez a program szabad szoftver; terjeszthetõ illetve módosítható a // Free Software Foundation által kiadott GNU General Public License // dokumentumában leírtak; akár a licenc 3-as, akár (tetszõleges) késõbbi // változata szerint. // // Ez a program abban a reményben kerül közreadásra, hogy hasznos lesz, // de minden egyéb GARANCIA NÉLKÜL, az ELADHATÓSÁGRA vagy VALAMELY CÉLRA // VALÓ ALKALMAZHATÓSÁGRA való származtatott garanciát is beleértve. // További részleteket a GNU General Public License tartalmaz. // // A felhasználónak a programmal együtt meg kell kapnia a GNU General // Public License egy példányát; ha mégsem kapta meg, akkor // tekintse meg a <http://www.gnu.org/licenses/> oldalon. // // Version history: szösszenet // // A http://progpater.blog.hu/2011/02/27/a_human_genom_projekt poszt // bevezető kódjának alapötletét használjuk fel, de nem kettesével, // hanem most hármasával dolgozzuk fel az inputot // // Ennek a kódnak a részleteit az itteni kisbajnokikon is // kamatoztathatod: http://progpater.blog.hu/2011/03/05/szonyegen_a_human_genom #include <stdio.h> #include <unistd.h> // Egyszerűen felsorolom, pl. az alábbi alapján: // http://en.wikipedia.org/wiki/DNA_codon_table char *amino_sav[] = { "Stop", "Phe", "Leu", "Ile", "Met", "Val", "Ser", // 6. "Pro", "Thr", "Ala", "Tyr", // 10. "His", "Gln", "Asn", "Lys", "Asp", "Glu", "Cys", "Trp", // 18. "Arg", // 19. "Gly" // 20. }; // a 3 betű melyik aminosavat kódolja? char * genetikai_kod (int triplet) { int index = 0; switch (triplet) { case 0: // Phe case 1: index = 1; break; case 2: // Leu case 3: case 16: case 17: case 18: case 19: index = 2; break; case 32: // Ile case 33: case 34: index = 3; break; case 35: // Met index = 4; break; // hogy jön ez? az 5 indexű a "Val" // GTT-től GTG-ig van ez, jegyekben: // 300-tól 303-ig 4-es számrendszerben // ez van átváltva, pl.: // 303(4) -> 3*16+0*4+3*1 = 51(10) case 48: case 49: case 50: case 51: index = 5; break; case 4: case 5: case 6: case 7: index = 6; break; case 20: case 21: case 22: case 23: index = 7; break; case 36: case 37: case 38: case 39: index = 8; break; case 52: case 53: case 54: case 55: index = 9; break; case 8: case 9: index = 10; break; case 10: // Stop case 11: index = 0; break; case 24: case 25: index = 11; break; case 26: case 27: index = 12; break; case 40: case 41: index = 13; break; case 42: case 43: index = 14; break; case 56: case 57: index = 15; break; case 58: case 59: index = 16; break; case 12: // Cys case 13: index = 17; break; case 14: // Stop index = 0; break; case 15: // Trp index = 18; break; case 28: // Arg case 29: case 30: case 31: index = 19; break; case 44: // Ser case 45: index = 6; break; case 46: // Arg case 47: index = 19; break; case 60: // Gly case 61: case 62: case 63: index = 20; break; default: // csak tesztelesre a printf printf ("Zavar az eroben %d-nel", triplet); index = 0; break; } return amino_sav[index]; } // a betűket 3-asával "olvasom": nem kell cifrázni! egy ciklus // elvégzi, amiben megjegyzem, hogy melyik hányadik betű volt // aki ciklusban ciklusolgat, az már bénázik :) int main (void) { // hányadik betűn állok? int hanyadik_betu = -1; // azon a helyen mit olvastam? int elso = 0, masodik = 0, harmadik = 0, i = 0, jegy = 0; while ((i = getchar ()) != EOF) { switch (i) { case 'T': jegy = 0; break; case 'C': jegy = 1; break; case 'A': jegy = 2; break; case 'G': jegy = 3; break; } hanyadik_betu = (hanyadik_betu + 1) % 3; if (!hanyadik_betu) elso = jegy; else if (!(hanyadik_betu - 1)) masodik = jegy; else { harmadik = jegy; printf ("%s", genetikai_kod (elso * 16 + masodik * 4 + harmadik)); } } }
Mo.:
[norbi@sgu tcag]$ ./gh <hs_alt_Hs_Celera_chr2.fa
Stop 4226021
Phe 4938666
Leu 8650548
Ile 4703612
Met 1421143
Val 3903156
Ser 6864063
Pro 4211007
Thr 3892567
Ala 3197516
Tyr 2514516
His 2541712
Gln 3049116
Asn 3230810
Lys 4968633
Asp 1735431
Glu 2846839
Cys 2645039
Trp 1450350
Arg 3795349[norbi@sgu tcag]$ ./gh1 <hs_alt_Hs_Celera_chr2.fa
Stop 4221767
Phe 4937003
Leu 8656133
Ile 4707263
Met 1422311
Val 3906383
Ser 6867537
Pro 4209152
Thr 3892895
Ala 3197221
Tyr 2513279
His 2541506
Gln 3044589
Asn 3230946
Lys 4973403
Asp 1733840
Glu 2844519
Cys 2643748
Trp 1450806
Arg 3793309[norbi@sgu tcag]$ ./gh2 <hs_alt_Hs_Celera_chr2.fa
Stop 4229297
Phe 4936156
Leu 8652212
Ile 4707113
Met 1419910
Val 3904313
Ser 6867552
Pro 4209185
Thr 3892548
Ala 3196552
Tyr 2510652
His 2544819
Gln 3043507
Asn 3230271
Lys 4970475
Asp 1731580
Glu 2843714
Cys 2648913
Trp 1451891
Arg 3797276