24 #include "evodataviewer.h"
28 #include <QPaintEvent>
29 #include <QApplication>
30 #include <QScrollArea>
32 #include <QStringList>
34 #include <QtAlgorithms>
35 #include <configurationparameters.h>
48 this->setMaximumWidth(chunksize+label_width);
49 this->setMinimumWidth(label_width*2);
50 this->setMinimumHeight(10*nchunks);
51 this->nviewChange=
false;
52 vchunks=
new int[nchunks];
54 this->setAttribute(Qt::WA_OpaquePaintEvent,
true);
56 qpixmap =
new QPixmap(width(), height());
59 this->nchunks = nchunks;
60 this->chunksize = chunksize;
61 this->nvchunks=nchunks;
64 for(
int i=0;i<nchunks;i++) {
65 dataChunks[i] =
new DataChunk(QString(
"chunk"),QColor(255,0,0),chunksize,
true);
68 stepChunk=
new DataChunk(QString(
"step"),QColor(255,0,0),chunksize,
false);
74 qtimer=
new QTimer(
this);
75 qtimer->setInterval(4000);
76 QObject::connect(qtimer,SIGNAL(timeout()),
this,SLOT(pickUnvisible()));
83 pickValueVisible =
false;
86 EvoDataViewer::~EvoDataViewer()
88 for(
int i=0;i<nchunks;i++) {
100 void EvoDataViewer::evoDataPaint()
103 QPainter painter(qpixmap);
104 QPen pen(Qt::black, 1);
105 QPen pen2(Qt::lightGray);
106 QPen pen3(Qt::darkGray);
110 painter.fillRect(0,0,width(),height(),Qt::white);
112 for(
int i=0;i<nvchunks+1;i++)
118 painter.drawText(4,(
int)(vertical_step*(i+1)-vertical_step/2.0),dataChunks[vchunks[i]]->getLabel());
119 painter.drawText(label_width-40,(
int)(vertical_step*(i+1))-4,QString::number(dataChunks[vchunks[i]]->getRangeMin()));
120 painter.drawText(label_width-40,(
int)(vertical_step*(i+1))-4-(
int)(vertical_step-20),QString::number(dataChunks[vchunks[i]]->getRangeMax()));
124 painter.drawLine(0,(
int)(vertical_step*i),width(),(
int)(vertical_step*i));
126 painter.setPen(pen3);
127 painter.drawLine(0,(
int)(vertical_step*i+1),width(),(
int)(vertical_step*i+1));
129 painter.setPen(pen2);
130 painter.drawLine(0,(
int)(vertical_step*i+2),width(),(
int)(vertical_step*i+2));
136 hh=(int)(vertical_step*(nvchunks));
139 painter.drawLine(label_width-1,0,label_width-1,hh);
140 painter.setPen(pen2);
142 painter.drawLine(label_width,0,label_width,hh);
143 painter.drawLine(label_width-2,0,label_width-2,hh);
147 void EvoDataViewer::updateGraphic(
int ch)
154 if (!dataChunks[ch]->isVisible()) {
159 QPainter painter(qpixmap);
160 const QPen pen(Qt::red);
161 const QPen penw(Qt::white);
162 const QPen leadpen(Qt::black);
166 for (
int ii = 0; ii < ch; ii++) {
167 if (dataChunks[ii]->isVisible()) {
172 int actualindex = -1;
175 if(dataChunks[i]->getIndex() > -1) {
176 actualindex=(int)(dataChunks[vchunks[i]]->getIndex()*dataChunks[vchunks[i]]->getDPRatio());
177 predindex=(int)((dataChunks[vchunks[i]]->getIndex()-1)*dataChunks[vchunks[i]]->getDPRatio());
180 QPen personalpen(dataChunks[vchunks[i]]->getColor());
181 painter.setPen(personalpen);
184 int zeropoint=(int)((vertical_step-panning_width-1)*dataChunks[vchunks[i]]->getZeroValue());
187 painter.drawLine(actualindex+label_width,(
int)(vertical_step*(i+1)-1)-zeropoint,actualindex+label_width,(
int)(vertical_step*(i+1)-1)-zeropoint-(
int)((dataChunks[vchunks[i]]->getValueToDraw()-dataChunks[vchunks[i]]->getZeroValue())*(vertical_step-panning_width)));
188 }
else if (style == 1) {
189 painter.drawLine(actualindex+label_width,(
int)(vertical_step*(i+1)-1)-zeropoint-(
int)((dataChunks[vchunks[i]]->getValueToDraw()-dataChunks[vchunks[i]]->getZeroValue())*(vertical_step-panning_width)),predindex+label_width,(
int)(vertical_step*(i+1)-1)-zeropoint-(
int)((dataChunks[vchunks[i]]->getValue(dataChunks[vchunks[i]]->getIndex()-1)-dataChunks[vchunks[i]]->getZeroValue())*(vertical_step-panning_width)));
195 painter.setPen(penw);
196 painter.drawLine(actualindex+label_width+1,(
int)(vertical_step*(i+1)-1),actualindex+label_width+1,(
int)(vertical_step*(i+1)-1)-(
int)(vertical_step-panning_width));
199 painter.setPen(leadpen);
200 painter.drawLine(actualindex+label_width+2,(
int)(vertical_step*(i+1)-1),actualindex+label_width+2,(
int)(vertical_step*(i+1)-1)-(
int)(vertical_step-panning_width));
203 void EvoDataViewer::resizeEvent(QResizeEvent *evt)
207 if (qpixmap!=NULL)
delete qpixmap;
208 qpixmap=
new QPixmap(width(), height());
212 void EvoDataViewer::paintEvent(QPaintEvent *evt)
218 if (pickY<20) offy=20-pickY;
219 if ((width()-pickX)<50) offx=-60;
221 QPainter painter(
this);
222 painter.drawPixmap(0, 0, width(), height(), *qpixmap);
225 QPen bpen(Qt::black);
226 painter.drawText(pickX+offx,pickY+offy,QString(
"Val : ")+QString::number(pickValue));
227 painter.drawText(pickX+offx,pickY+10+offy,QString(
"Step: ")+QString::number(pickStep));
234 dataChunks[ch]->setLabel(label);
240 if ((ch >= 0) && (ch < this->nchunks)) {
241 dataChunks[ch]->setData(value);
250 for(
int i=0;i<nchunks;i++)
252 if(name == dataChunks[i]->getLabel())
265 dataChunks[ch]->setRange(mn, mx);
268 void EvoDataViewer::mousePressEvent(QMouseEvent* evt)
271 if(evt->button()==Qt::LeftButton)
275 int nochunk = ((float)yc/vertical_step);
276 if (nochunk >= nvchunks) {
279 int chunkIndex = xc-label_width;
280 float val=dataChunks[vchunks[nochunk]]->getValue((
int)((
float)chunkIndex/dataChunks[vchunks[nochunk]]->getDPRatio()));
281 val = dataChunks[vchunks[nochunk]]->linearMap(val,0.0, 1.0,dataChunks[vchunks[nochunk]]->getRangeMin(), dataChunks[vchunks[nochunk]]->getRangeMax());
287 pickStep = (int)stepChunk->getValue((
int)((
float)chunkIndex/dataChunks[vchunks[nochunk]]->getDPRatio()));
288 pickValueVisible=
true;
294 if(evt->button()==Qt::RightButton)
297 elw =
new EvoListViewer (this->dataChunks,this->nchunks, &this->nviewChange);
301 elw->restoreSelected();
302 elw->setVisible(
true);
309 void EvoDataViewer::pickUnvisible()
311 pickValueVisible=
false;
321 stepChunk->setDataRaw(step);
342 int EvoDataViewer::visibleChunks()
345 for(
int i=0;i<nchunks;i++)
346 if(dataChunks[i]->isVisible())
356 for(
int i=0;i<this->nchunks;i++)
358 if (dataChunks[i]->isVisible())
366 vertical_step=height()/(double)nvchunks;
369 void EvoDataViewer::setChunkColor(
int ch, QColor color)
371 dataChunks[ch]->setColor(color);
376 dataChunks[ch]->setRange(rangeMin, rangeMax);
377 dataChunks[ch]->setLabel(label);
378 dataChunks[ch]->setColor(color);
379 dataChunks[ch]->setVisible(visible);
386 vertical_step=height()/(double)nvchunks;
388 for(
int i=0;i<nchunks;i++)
391 dataChunks[i]->setDPRatio((
double)(width()-label_width)/(
double)chunksize);
398 DataChunk::DataChunk(
const QString& lab,
const QColor& col,
int s,
bool vis)
412 data=
new double[size];
414 for(
int i=0;i<size;i++) {
419 DataChunk::~DataChunk()
424 void DataChunk::setColor(QColor color)
430 void DataChunk::setData(
double value)
434 data[index]=linearMap(value, min, max);
435 checkMaxValue(data[index]);
437 if(index>size-2) index=-1;
440 void DataChunk::setDataRaw(
double value)
444 checkMaxValue(value);
447 if(index>size-2) index=-1;
449 void DataChunk::setDataRaw(
int ind,
double value)
451 if(ind>-1 && ind<size)
453 checkMaxValue(value);
456 void DataChunk::setLabel(
const QString& label)
461 void DataChunk::setRange(
double min,
double max)
465 zeroValue=linearMap(0.0,min,max);
468 void DataChunk::setStyle(
int style)
473 QString DataChunk::getLabel()
const
480 double DataChunk::getValueToDraw()
485 int DataChunk::getIndex()
490 double DataChunk::linearMap(
double x,
double rmin,
double rmax,
double outMin,
double outMax)
493 double m = ( outMax-outMin )/( rmax-rmin );
494 double q = outMin - m*rmin;
496 if (ret < outMin)
return outMin;
497 if (ret > outMax)
return outMax;
503 double DataChunk::getRangeMin()
509 double DataChunk::getRangeMax()
514 double DataChunk::getZeroValue()
519 void DataChunk::setDPRatio(
double val)
525 double DataChunk::getDPRatio()
530 double DataChunk::getValue(
int ind)
535 bool DataChunk::isVisible()
540 void DataChunk::setVisible(
bool vis)
544 QColor& DataChunk::getColor()
548 double DataChunk::getMaxValue()
553 namespace __DataChunk_loadRawData_helpers {
556 bool orderByNumberAfterColon(
const QString& s1,
const QString& s2)
560 QStringList list = s1.split(
':', QString::SkipEmptyParts);
561 if (list.size() < 2) {
564 const double ns1 = list[1].toDouble();
565 list = s2.split(
':', QString::SkipEmptyParts);
566 if (list.size() < 2) {
569 const double ns2 = list[1].toDouble();
574 void DataChunk::checkMaxValue(
double val)
576 if(val>maxValue) maxValue=val;
578 bool DataChunk::loadRawData(
const QString &filename,
int column)
581 if (filename.endsWith(
".fit", Qt::CaseInsensitive)) {
583 QFile file(filename);
585 if(file.open(QIODevice::ReadOnly)) {
586 QTextStream in(&file);
587 line = in.readLine();
589 while(!line.isNull()) {
592 list = line.split(
" ");
593 if (column<0 && column>=list.size()) {
594 Logger::error(QString(
"column number %1 does not exist in the loaded file.").arg(column));
598 QString value=(QString)list.at(column);
599 setDataRaw(index, value.toDouble());
612 if (!params.loadParameters(filename)) {
620 paramName =
"bestFitness";
623 paramName =
"averageFitness";
626 paramName =
"worstFitness";
629 paramName =
"Unknown";
634 QStringList genotypes = params.getGroupsWithPrefixList(
"/",
"GENOTYPES:");
636 qSort(genotypes.begin(), genotypes.end(), __DataChunk_loadRawData_helpers::orderByNumberAfterColon);
638 for (
int i = 0; i < genotypes.size(); i++) {
654 EvoListViewer::EvoListViewer(DataChunk **dataChunks,
int n,
bool *nviewChange , QWidget *parent) :
657 this->dataChunks=dataChunks;
659 this->nvchange=nviewChange;
660 QListWidgetItem *listItem;
663 layout=
new QGridLayout();
664 listwidget =
new QListWidget();
665 deselectAll =
new QPushButton(
"deselect all");
666 QPushButton *bcancel =
new QPushButton(
"cancel");
667 QPushButton *bok =
new QPushButton(
"ok");
671 listwidget->insertItem(i,
new QListWidgetItem());
673 listItem=listwidget->item(i);
674 listItem->setText(dataChunks[i]->getLabel());
675 Qt::ItemFlags mflags;
676 mflags= Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;
677 listItem->setFlags(mflags);
678 listItem->setCheckState(Qt::Checked);
684 layout->addWidget(deselectAll, 0,0);
685 layout->addWidget(listwidget,1,0);
686 layout->addWidget(bcancel,2,0);
687 layout->addWidget(bok,3,0);
691 this->setLayout(layout);
692 this->setWindowTitle(
"Chunks List");
694 this->setGeometry(50,50,250,300);
695 this->setVisible(
true);
698 QObject::connect(bok,SIGNAL(clicked()),
this,SLOT(okSelected()));
699 QObject::connect(bcancel,SIGNAL(clicked()),
this,SLOT(restoreSelected()));
700 QObject::connect(deselectAll, SIGNAL(clicked()),
this,SLOT(allOnOrAllOff()));
710 void EvoListViewer::okSelected()
712 for(
int i=0;i<nchunks;i++)
714 if(this->listwidget->item(i)->checkState()== Qt::Checked)
715 dataChunks[i]->setVisible(
true);
717 dataChunks[i]->setVisible(
false);
719 this->setVisible(
false);
723 void EvoListViewer::restoreSelected()
726 this->setVisible(
false);
727 for(
int i=0;i<nchunks;i++)
729 if(dataChunks[i]->isVisible())
730 this->listwidget->item(i)->setCheckState(Qt::Checked);
732 this->listwidget->item(i)->setCheckState(Qt::Unchecked);
738 void EvoListViewer::allOnOrAllOff()
740 bool someoneIsChecked =
false;
741 for(
int i=0;i<nchunks;i++)
743 if(listwidget->item(i)->checkState() == Qt::Checked)
744 someoneIsChecked =
true;
751 deselectAll->setText(
"select all");
756 deselectAll->setText(
"deselect all");
759 for(
int i=0;i<nchunks;i++)
762 this->listwidget->item(i)->setCheckState(Qt::Checked);
764 this->listwidget->item(i)->setCheckState(Qt::Unchecked);
775 EvoListViewer::~EvoListViewer()
785 void FitViewer::setValues(
int gen,
double min,
double average,
double max)
789 fitVal[gen][1]=average;
796 checkGraphRange(min);
797 checkGraphRange(average);
798 checkGraphRange(max);
803 int FitViewer::checkGraphRange(
double val)
819 void FitViewer::checkChunkRange(
int chunk)
822 for(
int c=0;c<=currentGen;c++)
823 checkGraphRange(dataChunks[chunk]->getValue(c));
826 FitViewer::FitViewer( QWidget* parent, Qt::WindowFlags flags ) : QWidget( parent, flags )
836 FitViewer::FitViewer(
int nchunks,
int chunksize, QWidget* parent, Qt::WindowFlags flags) : QWidget( parent, flags )
841 this->nchunks=nchunks;
842 this->chunksize=chunksize;
844 sortedIndex=
new int[nchunks];
845 dataChunks =
new DataChunk*[nchunks];
846 for(
int i=0;i<nchunks;i++) {
847 dataChunks[i] =
new DataChunk(QString(
"chunk"),QColor(255,0,0),chunksize,
true);
852 FitViewer::~FitViewer()
854 delete[] sortedIndex;
855 if (dataChunks != NULL) {
856 for (
int i = 0; i < nchunks; i++) {
857 delete dataChunks[i];
863 void FitViewer::paintEvent(QPaintEvent* )
865 QPainter painter(
this);
866 QPen blackPen(Qt::black);
867 QPen bluePen(Qt::blue);
868 QPen greenPen(Qt::green);
869 QPen redPen(Qt::red);
872 painter.fillRect(0,0,width(),height(),Qt::white);
873 painter.setPen(blackPen);
874 painter.setRenderHint(QPainter::Antialiasing,
false);
875 xstep=(double)(width()-2*padding)/(
double)(currentGen);
876 wyaxes=height()-2*padding;
878 painter.drawRect(padding,padding,width()-2*padding,height()-2*padding);
879 if (vmin>0) zeroy=height()-padding;
882 zeroy=((-1*vmin)/(vmax-vmin))*wyaxes;
885 painter.drawLine(padding,height()-padding-zeroy,width()-padding,height()-padding-zeroy);
886 painter.drawText(padding/2.0,padding,QString::number(vmax));
887 painter.drawText(padding/2.0,height()-padding,QString::number(vmin));
888 painter.drawText(padding/2.0,height()-padding-zeroy,QString::number(0));
891 painter.drawText(width()-padding,height()-padding-zeroy,QString::number(currentGen));
894 painter.drawText(width()/2.0-padding,padding/2.0,gtitle);
897 painter.drawText(width()/2.0-padding,height()-padding/2.0,xlabel);
903 painter.translate(xt,yt);
904 painter.rotate(-90.0);
905 painter.drawText(0,0,ylabel);
918 painter.setRenderHint(QPainter::Antialiasing,
true);
919 for (
int dc=0;dc<nchunks;dc++)
921 int c=sortedIndex[dc];
922 painter.setPen(dataChunks[c]->getColor());
923 painter.drawText(width()-padding+2,padding+dc*20,dataChunks[c]->getLabel());
925 for (
int i=1;i<currentGen+1;i++)
936 checkGraphRange(dataChunks[c]->getValue(i-1));
937 painter.drawLine(padding+xstep*(i-1), height()-padding-getYnormValue(dataChunks[c]->getValue(i-1)),padding+xstep*i,height()-padding-getYnormValue(dataChunks[c]->getValue(i)));
945 double FitViewer::getYnormValue(
double val)
949 return (val/vmax)*wyaxes;
954 return ((val-vmin)/(vmax-vmin))*wyaxes;
959 void FitViewer::setChunkLabel(
int ch,
const QString &label)
962 dataChunks[ch]->setLabel(label);
964 void FitViewer::setChunkProperties(
int ch,
const QString &label, QColor color,
bool visible)
966 dataChunks[ch]->setLabel(label);
967 dataChunks[ch]->setColor(color);
968 dataChunks[ch]->setVisible(visible);
971 void FitViewer::setChunkValue(
int ch,
int ind,
double value)
973 if (ch>= 0 && ch < this->nchunks)
975 dataChunks[ch]->setDataRaw(ind,value);
976 checkGraphRange(value);
980 bool FitViewer::setChunkValue(
const QString &name,
int ind,
double value)
982 for(
int i=0;i<nchunks;i++)
984 if(name == dataChunks[i]->getLabel())
986 setChunkValue(i,ind, value);
987 checkGraphRange(value);
994 void FitViewer::diplayUntilStep(
int st)
999 void FitViewer::setLabels(
const QString &title,
const QString &xlabel,
const QString &ylabel)
1002 this->xlabel=xlabel;
1003 this->ylabel=ylabel;
1006 void FitViewer::reset()
1011 setMinimumSize(padding*4,padding*4);
1015 bool FitViewer::loadRawData(
int nchunk,
const QString &filename,
int column)
1018 res=dataChunks[nchunk]->loadRawData(filename,column);
1022 if((dataChunks[nchunk]->getIndex()-1)>currentGen) currentGen=dataChunks[nchunk]->getIndex()-1;
1024 checkChunkRange(nchunk);
1028 int FitViewer::getCurrentGeneration()
1033 void FitViewer::sortchunks()
1036 for(
int i=0;i<nchunks;i++)
1045 for(
int i=0;i<nchunks-1;i++)
1047 if (dataChunks[sortedIndex[i]]->getMaxValue()<dataChunks[sortedIndex[i+1]]->getMaxValue())
1050 sortedIndex[i]=sortedIndex[i+1];