A Mandelbrotos bevezető példánk kódját használd föl egy "kromoszóma monitor" elkészítésére: a szál ne a fraktál egy sorát számolja ki, hanem olvasson be egy adott mennyiséget a kromoszóma genetikai kódjából és a T, C, A, G betűknek egy színt megfeleltetve rajzolja ki az ífy kapott képet.
Alul jön a genom, a teteje csak a program szünetjele :)
Természetesen megy a progi Linux/Windows alatt a Qt SDK-val, vagy ahogy szoktuk parancssorból. A hozzávalók:
[norbi@sgu GenAblak]$ ls -l
A felszolgálás:
összesen 20
-rw-rw-r--. 1 norbi norbi 1288 márc 5 19.58 genablak.cpp
-rw-rw-r--. 1 norbi norbi 498 márc 5 19.58 genablak.h
-rw-rw-r--. 1 norbi norbi 1137 márc 5 19.58 genszal.cpp
-rw-rw-r--. 1 norbi norbi 383 márc 5 19.58 genszal.h
-rw-rw-r--. 1 norbi norbi 231 márc 5 19.58 main.cpp
[norbi@sgu GenAblak]$ qmake-qt4 -project
Lapozz a tovább linkkel a forrásokhoz:
[norbi@sgu GenAblak]$ qmake-qt4 GenAblak.pro
[norbi@sgu GenAblak]$ make
[norbi@sgu GenAblak]$ ./GenAblak
main.cpp
#include <QtGui/QApplication> #include "genablak.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); GenAblak w("/home/norbi/C/tcag/hs_alt_Hs_Celera_chr2.fa", 600, 300); w.show(); return a.exec(); }
genablak.h
#ifndef GENABLAK_H #define GENABLAK_H #include <QtGui/QMainWindow> #include <QPainter> #include "genszal.h" class GenSzal; class GenAblak : public QMainWindow { Q_OBJECT public: GenAblak(const char *fajlNev, int szelesseg = 600, int magassag = 800, QWidget *parent = 0); ~GenAblak(); void vissza(int *sor, int meret) ; protected: int **minta; int szelesseg; int magassag; void paintEvent(QPaintEvent*); private: GenSzal *szonyeg; }; #endif // GENABLAK_H
genablak.cpp
// genablak.cpp // // Genomikus szőnyeg // 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: // // 0.0.1 http://progpater.blog.hu/2011/03/03/szonyegen_a_human_genom // Feladat: 3 genomi betűt olvasva valamilyen színkódolással 3 betűnek // feleltessünk meg egy színt a képen #include "genablak.h" GenAblak::GenAblak(const char *fajlNev, int szelesseg, int magassag, QWidget *parent) : QMainWindow(parent) { setWindowTitle("TCAG szonyeg"); this->magassag = magassag; this->szelesseg = szelesseg; setFixedSize(QSize(szelesseg, magassag)); minta = new int*[magassag]; for(int i=0; i<magassag; ++i) minta[i] = new int [szelesseg]; // inic: szőnyeg mintája kezdetben for(int i=0; i<magassag; ++i) for(int j=0; j<szelesseg; ++j) minta[i][j] = qRgb (i%255, 255, 0); szonyeg = new GenSzal(fajlNev, szelesseg, this); szonyeg->start(); } void GenAblak::paintEvent(QPaintEvent*) { QPainter qpainter(this); for(int i=0; i<magassag; ++i) { for(int j=0; j<szelesseg; ++j) { qpainter.setPen(QPen(QColor(minta[i][j]), 1)); qpainter.drawPoint(j, i); } } qpainter.end(); } void GenAblak::vissza(int *sor, int meret) { for(int i=1; i<magassag; ++i) for(int j=0; j<szelesseg; ++j) minta[i-1][j] = minta[i][j]; for(int i=0; i<meret; ++i) minta[magassag-1][i] = sor[i]; update(); } GenAblak::~GenAblak() { for(int i=0; i<magassag; ++i) { delete[] minta[i]; } delete[] minta; }
genszal.h
#ifndef GENSZAL_H #define GENSZAL_H #include <QThread> #include <QFile> #include "genablak.h" class GenAblak; class GenSzal : public QThread { Q_OBJECT public: GenSzal(const char *fajlNev, int szelesseg, GenAblak *genAblak); ~GenSzal(); void run(); protected: int szelesseg; GenAblak *genAblak; int *egySor; QFile *fajl; }; #endif // GENSZAL_H
genszal.cpp
// genszal.cpp // // Genomikus szőnyeg // 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: // // 0.0.1 http://progpater.blog.hu/2011/03/03/szonyegen_a_human_genom // Feladat: 3 genomi betűt olvasva valamilyen színkódolással 3 betűnek // feleltessünk meg egy színt a képen #include "genszal.h" GenSzal::GenSzal(const char *fajlNev, int szelesseg, GenAblak *genAblak) { this->szelesseg = szelesseg; this->genAblak = genAblak; egySor = new int[szelesseg]; fajl = new QFile(fajlNev); fajl->open(QIODevice::ReadOnly); } void GenSzal::run() { while(true) { QThread::msleep(80); char c; for(int i=0; i < szelesseg && (fajl->getChar(&c) != -1); ++i) { if(c==0x0a) continue; switch(c) { case 'T': egySor[i] = qRgb (255, 0, 0); break; case 'C': egySor[i] = qRgb (0, 255, 0); break; case 'A': egySor[i] = qRgb (0, 0, 255); break; case 'G': egySor[i] = qRgb (100, 0, 50); break; default: egySor[i] = qRgb (255, 255, 255); break; } } genAblak->vissza(egySor, szelesseg); } } GenSzal::~GenSzal() { fajl->close(); delete fajl; delete[] egySor; }
Kisbajnokság
Négy trófeáért lenne az első beküldőnek az a feladat, hogy az animált szőnyegen ne egy betű legyen egy pont (pixel), hanem olvassuk 3 betűnként a genetikai kódot (T, C, A, vagy G betűk egyike, vagy más, de azzal nem foglalkozunk, ez a mostanin a fehár) és a három betűnek megadva valami színezést egyetlen egy pixelt gyújtsunk ki a szőnyegen!