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)
270 if(evt->button()==Qt::LeftButton) {
271 const int xc = evt->x();
272 const int yc = evt->y();
273 const int nochunk = (float(yc) / vertical_step);
274 if (nochunk >= nvchunks) {
278 const int chunkIndex = xc - label_width;
279 const int dataIndex = (int)((
float)chunkIndex/dataChunks[vchunks[nochunk]]->getDPRatio());
280 if ((dataIndex < 0) || (dataIndex >= chunksize)) {
283 float val = dataChunks[vchunks[nochunk]]->getValue(dataIndex);
284 val = dataChunks[vchunks[nochunk]]->linearMap(val,0.0, 1.0,dataChunks[vchunks[nochunk]]->getRangeMin(), dataChunks[vchunks[nochunk]]->getRangeMax());
289 pickStep = (int)stepChunk->getValue((
int)((
float)chunkIndex/dataChunks[vchunks[nochunk]]->getDPRatio()));
290 pickValueVisible =
true;
296 if(evt->button()==Qt::RightButton) {
298 elw =
new EvoListViewer (this->dataChunks,this->nchunks, &this->nviewChange);
300 elw->restoreSelected();
301 elw->setVisible(
true);
307 void EvoDataViewer::pickUnvisible()
309 pickValueVisible=
false;
319 stepChunk->setDataRaw(step);
340 int EvoDataViewer::visibleChunks()
343 for(
int i=0;i<nchunks;i++)
344 if(dataChunks[i]->isVisible())
354 for(
int i=0;i<this->nchunks;i++)
356 if (dataChunks[i]->isVisible())
364 vertical_step=height()/(double)nvchunks;
367 void EvoDataViewer::setChunkColor(
int ch, QColor color)
369 dataChunks[ch]->setColor(color);
374 dataChunks[ch]->setRange(rangeMin, rangeMax);
375 dataChunks[ch]->setLabel(label);
376 dataChunks[ch]->setColor(color);
377 dataChunks[ch]->setVisible(visible);
384 vertical_step=height()/(double)nvchunks;
386 for(
int i=0;i<nchunks;i++)
389 dataChunks[i]->setDPRatio((
double)(width()-label_width)/(
double)chunksize);
396 DataChunk::DataChunk(
const QString& lab,
const QColor& col,
int s,
bool vis)
410 data=
new double[size];
412 for(
int i=0;i<size;i++) {
417 DataChunk::~DataChunk()
422 void DataChunk::setColor(QColor color)
428 void DataChunk::setData(
double value)
432 data[index]=linearMap(value, min, max);
433 checkMaxValue(data[index]);
435 if(index>size-2) index=-1;
438 void DataChunk::setDataRaw(
double value)
442 checkMaxValue(value);
445 if(index>size-2) index=-1;
447 void DataChunk::setDataRaw(
int ind,
double value)
449 if(ind>-1 && ind<size)
451 checkMaxValue(value);
454 void DataChunk::setLabel(
const QString& label)
459 void DataChunk::setRange(
double min,
double max)
463 zeroValue=linearMap(0.0,min,max);
466 void DataChunk::setStyle(
int style)
471 QString DataChunk::getLabel()
const
478 double DataChunk::getValueToDraw()
483 int DataChunk::getIndex()
488 double DataChunk::linearMap(
double x,
double rmin,
double rmax,
double outMin,
double outMax)
491 double m = ( outMax-outMin )/( rmax-rmin );
492 double q = outMin - m*rmin;
494 if (ret < outMin)
return outMin;
495 if (ret > outMax)
return outMax;
501 double DataChunk::getRangeMin()
507 double DataChunk::getRangeMax()
512 double DataChunk::getZeroValue()
517 void DataChunk::setDPRatio(
double val)
523 double DataChunk::getDPRatio()
528 double DataChunk::getValue(
int ind)
533 bool DataChunk::isVisible()
538 void DataChunk::setVisible(
bool vis)
542 QColor& DataChunk::getColor()
546 double DataChunk::getMaxValue()
551 namespace __DataChunk_loadRawData_helpers {
554 bool orderByNumberAfterColon(
const QString& s1,
const QString& s2)
558 QStringList list = s1.split(
':', QString::SkipEmptyParts);
559 if (list.size() < 2) {
562 const double ns1 = list[1].toDouble();
563 list = s2.split(
':', QString::SkipEmptyParts);
564 if (list.size() < 2) {
567 const double ns2 = list[1].toDouble();
572 void DataChunk::checkMaxValue(
double val)
574 if(val>maxValue) maxValue=val;
576 bool DataChunk::loadRawData(
const QString &filename,
int column)
579 if (filename.endsWith(
".fit", Qt::CaseInsensitive)) {
581 QFile file(filename);
583 if(file.open(QIODevice::ReadOnly)) {
584 QTextStream in(&file);
585 line = in.readLine();
587 while(!line.isNull()) {
590 list = line.split(
" ");
591 if (column<0 && column>=list.size()) {
592 Logger::error(QString(
"column number %1 does not exist in the loaded file.").arg(column));
596 QString value=(QString)list.at(column);
597 setDataRaw(index, value.toDouble());
610 if (!params.loadParameters(filename)) {
618 paramName =
"bestFitness";
621 paramName =
"averageFitness";
624 paramName =
"worstFitness";
627 paramName =
"Unknown";
632 QStringList genotypes = params.getGroupsWithPrefixList(
"/",
"GENOTYPES:");
634 qSort(genotypes.begin(), genotypes.end(), __DataChunk_loadRawData_helpers::orderByNumberAfterColon);
636 for (
int i = 0; i < genotypes.size(); i++) {
652 EvoListViewer::EvoListViewer(DataChunk **dataChunks,
int n,
bool *nviewChange , QWidget *parent) :
655 this->dataChunks=dataChunks;
657 this->nvchange=nviewChange;
658 QListWidgetItem *listItem;
661 layout=
new QGridLayout();
662 listwidget =
new QListWidget();
663 deselectAll =
new QPushButton(
"deselect all");
664 QPushButton *bcancel =
new QPushButton(
"cancel");
665 QPushButton *bok =
new QPushButton(
"ok");
669 listwidget->insertItem(i,
new QListWidgetItem());
671 listItem=listwidget->item(i);
672 listItem->setText(dataChunks[i]->getLabel());
673 Qt::ItemFlags mflags;
674 mflags= Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;
675 listItem->setFlags(mflags);
676 listItem->setCheckState(Qt::Checked);
682 layout->addWidget(deselectAll, 0,0);
683 layout->addWidget(listwidget,1,0);
684 layout->addWidget(bcancel,2,0);
685 layout->addWidget(bok,3,0);
689 this->setLayout(layout);
690 this->setWindowTitle(
"Chunks List");
692 this->setGeometry(50,50,250,300);
693 this->setVisible(
true);
696 QObject::connect(bok,SIGNAL(clicked()),
this,SLOT(okSelected()));
697 QObject::connect(bcancel,SIGNAL(clicked()),
this,SLOT(restoreSelected()));
698 QObject::connect(deselectAll, SIGNAL(clicked()),
this,SLOT(allOnOrAllOff()));
708 void EvoListViewer::okSelected()
710 for(
int i=0;i<nchunks;i++)
712 if(this->listwidget->item(i)->checkState()== Qt::Checked)
713 dataChunks[i]->setVisible(
true);
715 dataChunks[i]->setVisible(
false);
717 this->setVisible(
false);
721 void EvoListViewer::restoreSelected()
724 this->setVisible(
false);
725 for(
int i=0;i<nchunks;i++)
727 if(dataChunks[i]->isVisible())
728 this->listwidget->item(i)->setCheckState(Qt::Checked);
730 this->listwidget->item(i)->setCheckState(Qt::Unchecked);
736 void EvoListViewer::allOnOrAllOff()
738 bool someoneIsChecked =
false;
739 for(
int i=0;i<nchunks;i++)
741 if(listwidget->item(i)->checkState() == Qt::Checked)
742 someoneIsChecked =
true;
749 deselectAll->setText(
"select all");
754 deselectAll->setText(
"deselect all");
757 for(
int i=0;i<nchunks;i++)
760 this->listwidget->item(i)->setCheckState(Qt::Checked);
762 this->listwidget->item(i)->setCheckState(Qt::Unchecked);
773 EvoListViewer::~EvoListViewer()
783 void FitViewer::setValues(
int gen,
double min,
double average,
double max)
787 fitVal[gen][1]=average;
794 checkGraphRange(min);
795 checkGraphRange(average);
796 checkGraphRange(max);
801 int FitViewer::checkGraphRange(
double val)
817 void FitViewer::checkChunkRange(
int chunk)
820 for(
int c=0;c<=currentGen;c++)
821 checkGraphRange(dataChunks[chunk]->getValue(c));
824 FitViewer::FitViewer( QWidget* parent, Qt::WindowFlags flags ) : QWidget( parent, flags )
834 FitViewer::FitViewer(
int nchunks,
int chunksize, QWidget* parent, Qt::WindowFlags flags) : QWidget( parent, flags )
839 this->nchunks=nchunks;
840 this->chunksize=chunksize;
842 sortedIndex=
new int[nchunks];
843 dataChunks =
new DataChunk*[nchunks];
844 for(
int i=0;i<nchunks;i++) {
845 dataChunks[i] =
new DataChunk(QString(
"chunk"),QColor(255,0,0),chunksize,
true);
850 FitViewer::~FitViewer()
852 delete[] sortedIndex;
853 if (dataChunks != NULL) {
854 for (
int i = 0; i < nchunks; i++) {
855 delete dataChunks[i];
861 void FitViewer::paintEvent(QPaintEvent* )
863 QPainter painter(
this);
864 QPen blackPen(Qt::black);
865 QPen bluePen(Qt::blue);
866 QPen greenPen(Qt::green);
867 QPen redPen(Qt::red);
870 painter.fillRect(0,0,width(),height(),Qt::white);
871 painter.setPen(blackPen);
872 painter.setRenderHint(QPainter::Antialiasing,
false);
873 xstep=(double)(width()-2*padding)/(
double)(currentGen);
874 wyaxes=height()-2*padding;
876 painter.drawRect(padding,padding,width()-2*padding,height()-2*padding);
877 if (vmin>0) zeroy=height()-padding;
880 zeroy=((-1*vmin)/(vmax-vmin))*wyaxes;
883 painter.drawLine(padding,height()-padding-zeroy,width()-padding,height()-padding-zeroy);
884 painter.drawText(padding/2.0,padding,QString::number(vmax));
885 painter.drawText(padding/2.0,height()-padding,QString::number(vmin));
886 painter.drawText(padding/2.0,height()-padding-zeroy,QString::number(0));
889 painter.drawText(width()-padding,height()-padding-zeroy,QString::number(currentGen));
892 painter.drawText(width()/2.0-padding,padding/2.0,gtitle);
895 painter.drawText(width()/2.0-padding,height()-padding/2.0,xlabel);
901 painter.translate(xt,yt);
902 painter.rotate(-90.0);
903 painter.drawText(0,0,ylabel);
916 painter.setRenderHint(QPainter::Antialiasing,
true);
917 for (
int dc=0;dc<nchunks;dc++)
919 int c=sortedIndex[dc];
920 painter.setPen(dataChunks[c]->getColor());
921 painter.drawText(width()-padding+2,padding+dc*20,dataChunks[c]->getLabel());
923 for (
int i=1;i<currentGen+1;i++)
934 checkGraphRange(dataChunks[c]->getValue(i-1));
935 painter.drawLine(padding+xstep*(i-1), height()-padding-getYnormValue(dataChunks[c]->getValue(i-1)),padding+xstep*i,height()-padding-getYnormValue(dataChunks[c]->getValue(i)));
943 double FitViewer::getYnormValue(
double val)
947 return (val/vmax)*wyaxes;
952 return ((val-vmin)/(vmax-vmin))*wyaxes;
957 void FitViewer::setChunkLabel(
int ch,
const QString &label)
960 dataChunks[ch]->setLabel(label);
962 void FitViewer::setChunkProperties(
int ch,
const QString &label, QColor color,
bool visible)
964 dataChunks[ch]->setLabel(label);
965 dataChunks[ch]->setColor(color);
966 dataChunks[ch]->setVisible(visible);
969 void FitViewer::setChunkValue(
int ch,
int ind,
double value)
971 if (ch>= 0 && ch < this->nchunks)
973 dataChunks[ch]->setDataRaw(ind,value);
974 checkGraphRange(value);
978 bool FitViewer::setChunkValue(
const QString &name,
int ind,
double value)
980 for(
int i=0;i<nchunks;i++)
982 if(name == dataChunks[i]->getLabel())
984 setChunkValue(i,ind, value);
985 checkGraphRange(value);
992 void FitViewer::diplayUntilStep(
int st)
997 void FitViewer::setLabels(
const QString &title,
const QString &xlabel,
const QString &ylabel)
1000 this->xlabel=xlabel;
1001 this->ylabel=ylabel;
1004 void FitViewer::reset()
1009 setMinimumSize(padding*4,padding*4);
1013 bool FitViewer::loadRawData(
int nchunk,
const QString &filename,
int column)
1016 res=dataChunks[nchunk]->loadRawData(filename,column);
1020 if((dataChunks[nchunk]->getIndex()-1)>currentGen) currentGen=dataChunks[nchunk]->getIndex()-1;
1022 checkChunkRange(nchunk);
1026 int FitViewer::getCurrentGeneration()
1031 void FitViewer::sortchunks()
1034 for(
int i=0;i<nchunks;i++)
1043 for(
int i=0;i<nchunks-1;i++)
1045 if (dataChunks[sortedIndex[i]]->getMaxValue()<dataChunks[sortedIndex[i+1]]->getMaxValue())
1048 sortedIndex[i]=sortedIndex[i+1];
void setChunkValue(int ch, double value)
set chunk value by chunck id
void listVisibleChunks()
Creates a list of the visible chunks.
void setChunkRange(int ch, double mn, double mx)
set the range of the incoming data
void setCurrentStep(int step)
it stores the current step for each value.
void setChunkLabel(int ch, const QString &label)
set the chunk label
FARSA_UTIL_TEMPLATE const T max(const T &t1, const U &t2)
void setChunkProperties(int ch, double rangeMin, double rangeMax, const QString &label, QColor color, bool visible)
Set all the chunk properties in one step.
static void error(QString msg)
void setStyle(int style)
set the drawing style 0: filled lines, 1: simple line
EvoDataViewer(int nchunks, int chunksize, int style=0, QWidget *parent=0, Qt::WindowFlags flags=0)
EvodaViewer constructor.
FARSA_UTIL_TEMPLATE const T min(const T &t1, const U &t2)
static QString GroupSeparator()
void reset()
Cleans the screen and resets chunk indexes in order to display new data.