HTML

Programozó Páternoszter

Ez a Programozó Páternoszter (PP) blogja, a programozásról szól. Aktualitása, hogy a Debreceni Egyetem Informatikai Kara Magasszintű programozási nyelvek 1-2, C++ esattanulmányok, Java esettanulmányok című kurzusainak blogja is egyben.

A vadászat

A Debreceni Egyetem Programozói Évkönyve: az UDPROG projekt. A szakmai fórumunk a Facebook-en. Az új előadások a prezin.
A régi előadások:
Prog1:
1. C bevezetés
2. C tárgyalás
3. C befejezés
4. C a gyakorlatban
5. C++ bevezetés
6. C++ tárgyalás
7. C++ befejezés
8. C++ a gyakorlatban
9. Java platform bevezetés
10. Kvantuminformatikai alg. bev.
Prog2:
1. Java bevezetés
2. Java tárgyalás
3. Java befejezés
4. Java a gyakorlatban
5. Software Engineering bev.
6. Java EE bevezetés
7. AspectJ bevezetés
8. BPMN-BPEL SOA programozás
9. C++ haladó
10. Tensorflow

Kövess engem!

Friss topikok

Linkblog

Szőnyegen a humán genom

2011.03.05. 14:00 nb

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
ö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
A felszolgálás:

[norbi@sgu GenAblak]$ qmake-qt4 -project
[norbi@sgu GenAblak]$ qmake-qt4 GenAblak.pro
[norbi@sgu GenAblak]$ make
[norbi@sgu GenAblak]$ ./GenAblak
Lapozz a tovább linkkel a forrásokhoz:

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!

 

9 komment

A bejegyzés trackback címe:

https://progpater.blog.hu/api/trackback/id/tr702706421

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Painkiller19910110 2011.03.07. 19:59:49

Tisztelt Tanár Úr,
Megvolnék a poszt 4 trófeás feladatával, remélem jól értelnmeztem a feladatot.

imagerz.com/QEIQXktvAwMEX1hEEQVQ

imagerz.com/QEIQXktvAwMEX1hEEAVQ

Painkiller19910110 2011.03.08. 13:35:22

Legyen szíves megnézni hogy jó-e a megoldásom.

nb · http://fersml.blog.hu 2011.03.08. 13:50:53

@Painkiller19910110: már néztem a képeket, s kéne a forrás is.

Painkiller19910110 2011.03.09. 20:08:14

Itt van a forráskódja is.

void GenSzal::run()
{
while(true) {
QThread::msleep(80);

char c;
int jegy=0;
char szt[3]={'K','K','K'};
int elso,masodik,harmadik;
for(int i=0; i < szelesseg && (fajl->getChar(&c) != -1); ++i)
{

if(c==0x0a)
continue;

switch(c)
{
case 'T':{
szt[jegy]=c;
jegy++;
break;}
case 'C':{
szt[jegy]=c;
jegy++;
break;}
case 'A':{
szt[jegy]=c;
jegy++;
break;}
case 'G':{
szt[jegy]=c;
jegy++;
break;}
default:{
egySor[i] = qRgb (255, 255, 255);
break;}
}
if (jegy == 3)
{
if((szt[0]=='T') & (szt[1]== 'T') & (szt[2]=='T')) egySor[i] = qRgb (128,0,0);
if((szt[0]=='T') & (szt[1]== 'T') & (szt[2]=='C')) egySor[i] = qRgb (255,0,255);
if((szt[0]=='T') & (szt[1]== 'T') & (szt[2]=='A')) egySor[i] = qRgb (119,136,153);
if((szt[0]=='T') & (szt[1]== 'T') & (szt[2]=='G')) egySor[i] = qRgb (255,182,193);
if((szt[0]=='C') & (szt[1]== 'T') & (szt[2]=='T')) egySor[i] = qRgb (211,211,211);
if((szt[0]=='C') & (szt[1]== 'T') & (szt[2]=='C')) egySor[i] = qRgb (224,255,255);
if((szt[0]=='C') & (szt[1]== 'T') & (szt[2]=='A')) egySor[i] = qRgb (173,216,230);
if((szt[0]=='C') & (szt[1]== 'T') & (szt[2]=='G')) egySor[i] = qRgb (124,252,0);
if((szt[0]=='A') & (szt[1]== 'T') & (szt[2]=='T')) egySor[i] = qRgb (230,230,250);
if((szt[0]=='A') & (szt[1]== 'T') & (szt[2]=='C')) egySor[i] = qRgb (255,255,240);
if((szt[0]=='A') & (szt[1]== 'T') & (szt[2]=='A')) egySor[i] = qRgb (205,92,92);
if((szt[0]=='A') & (szt[1]== 'T') & (szt[2]=='G')) egySor[i] = qRgb (255,105,180);
if((szt[0]=='T') & (szt[1]== 'C') & (szt[2]=='T')) egySor[i] = qRgb (173,255,47);
if((szt[0]=='T') & (szt[1]== 'C') & (szt[2]=='C')) egySor[i] = qRgb (255,215,0);
if((szt[0]=='T') & (szt[1]== 'C') & (szt[2]=='A')) egySor[i] = qRgb (34,139,34);
if((szt[0]=='T') & (szt[1]== 'C') & (szt[2]=='G')) egySor[i] = qRgb (178,34,34);
if((szt[0]=='C') & (szt[1]== 'C') & (szt[2]=='T')) egySor[i] = qRgb (30,144,255);
if((szt[0]=='C') & (szt[1]== 'C') & (szt[2]=='C')) egySor[i] = qRgb (105,105,105);
if((szt[0]=='C') & (szt[1]== 'C') & (szt[2]=='A')) egySor[i] = qRgb (0,206,209);
if((szt[0]=='C') & (szt[1]== 'C') & (szt[2]=='G')) egySor[i] = qRgb (72,61,139);
if((szt[0]=='A') & (szt[1]== 'C') & (szt[2]=='T')) egySor[i] = qRgb (233,150,122);
if((szt[0]=='A') & (szt[1]== 'C') & (szt[2]=='C')) egySor[i] = qRgb (153,50,204);
if((szt[0]=='A') & (szt[1]== 'C') & (szt[2]=='A')) egySor[i] = qRgb (139,0,139);
if((szt[0]=='A') & (szt[1]== 'C') & (szt[2]=='G')) egySor[i] = qRgb (0,100,0);
if((szt[0]=='T') & (szt[1]== 'A') & (szt[2]=='T')) egySor[i] = qRgb (184,134,11);
if((szt[0]=='T') & (szt[1]== 'A') & (szt[2]=='C')) egySor[i] = qRgb (0,139,139);
if((szt[0]=='T') & (szt[1]== 'A') & (szt[2]=='A')) egySor[i] = qRgb (0,0,139);
if((szt[0]=='T') & (szt[1]== 'A') & (szt[2]=='G')) egySor[i] = qRgb (0,255,255);
if((szt[0]=='C') & (szt[1]== 'A') & (szt[2]=='T')) egySor[i] = qRgb (220,20,60);
if((szt[0]=='C') & (szt[1]== 'A') & (szt[2]=='C')) egySor[i] = qRgb (255,248,220);
if((szt[0]=='C') & (szt[1]== 'A') & (szt[2]=='A')) egySor[i] = qRgb (100,149,237);
if((szt[0]=='C') & (szt[1]== 'A') & (szt[2]=='G')) egySor[i] = qRgb (255,127,80);
if((szt[0]=='A') & (szt[1]== 'A') & (szt[2]=='T')) egySor[i] = qRgb (210,105,30);
if((szt[0]=='A') & (szt[1]== 'A') & (szt[2]=='C')) egySor[i] = qRgb (127,255,0);
if((szt[0]=='A') & (szt[1]== 'A') & (szt[2]=='A')) egySor[i] = qRgb (95,158,160);
if((szt[0]=='A') & (szt[1]== 'A') & (szt[2]=='G')) egySor[i] = qRgb (222,184,135);
if((szt[0]=='T') & (szt[1]== 'G') & (szt[2]=='T')) egySor[i] = qRgb (165,42,42);
if((szt[0]=='T') & (szt[1]== 'G') & (szt[2]=='C')) egySor[i] = qRgb (138,43,226);
if((szt[0]=='T') & (szt[1]== 'G') & (szt[2]=='A')) egySor[i] = qRgb (0,0,255);
if((szt[0]=='T') & (szt[1]== 'G') & (szt[2]=='G')) egySor[i] = qRgb (255,235,205);
if((szt[0]=='C') & (szt[1]== 'G') & (szt[2]=='T')) egySor[i] = qRgb (0,0,0);
if((szt[0]=='C') & (szt[1]== 'G') & (szt[2]=='C')) egySor[i] = qRgb (255,228,196);
if((szt[0]=='C') & (szt[1]== 'G') & (szt[2]=='A')) egySor[i] = qRgb (245,245,220);
if((szt[0]=='C') & (szt[1]== 'G') & (szt[2]=='G')) egySor[i] = qRgb (240,255,255);
if((szt[0]=='A') & (szt[1]== 'G') & (szt[2]=='T')) egySor[i] = qRgb (127,255,212);
if((szt[0]=='A') & (szt[1]== 'G') & (szt[2]=='C')) egySor[i] = qRgb (0,255,255);
if((szt[0]=='A') & (szt[1]== 'G') & (szt[2]=='A')) egySor[i] = qRgb (250,235,215);
if((szt[0]=='A') & (szt[1]== 'G') & (szt[2]=='G')) egySor[i] = qRgb (240,248,255);
jegy=0;

}
}
genAblak->vissza(egySor, szelesseg);
}

}

nb · http://fersml.blog.hu 2011.03.09. 20:32:58

@Painkiller19910110: OK., azért kértem, mert a képeken is ezt láttam: a case: break; páros összefogja az utasításokat, a blokk használata zavaró. De ott a trófea, persze. A másik, hogy a színezésnél ez így elég lassú: a sok if helyett egy if else-if lenne elegánsabb és gyorsabb, illetve ki kéne találni egy "jobb" színezési mechanizmust. Ha ragaszkodsz ahhoz, ami most van, hogy minden aminonak külön szín, akkor előtte a színek be egy tömbbe és ugyanazzal a függvénnyel, mint a laboron nyomtuk a d.c-ben kiszámolod az indexet, így megspórolunk 64 if-et :)

Painkiller19910110 2011.03.09. 21:52:20

Tanár Úr, a könyveléshez írjam megint priviben az adataim vagy majd a gyakvezéremmel beszéljek? Azért kérdezem mert múlt héten betegség miatt kihagytam a gyakorlatot.

nb · http://fersml.blog.hu 2011.03.10. 10:47:32

@Painkiller19910110: már vezetlek a Vadászok dobozban, ha a laborodon is kapsz, figyelmeztesd a laborvezed, hogy jelezze nekem és a blogon így mindig kint lesz az aktuálisod.

nb · http://fersml.blog.hu 2013.03.31. 14:21:45

@km92: projekt fájlok le vannak generálva, minden forrás ott van? Milyen parancsokat adtál ki a make előtt?

Tanács: ne dolgozz rootként.
süti beállítások módosítása