Index: /trunk/FACT++/gui/RawEventsViewer/RawEventsViewer.cc
===================================================================
--- /trunk/FACT++/gui/RawEventsViewer/RawEventsViewer.cc	(revision 11696)
+++ /trunk/FACT++/gui/RawEventsViewer/RawEventsViewer.cc	(revision 11697)
@@ -19,4 +19,9 @@
 
 #include <QtGui/QFileDialog>
+
+#include <qwt_plot_grid.h>
+#include <qwt_symbol.h>
+
+#include "../../src/Configuration.h"
 
 //Coordinates of an hexagon of radius 1 and center 0
@@ -541,6 +546,10 @@
     renderText(bboxMax[0]+xShift/2.0f, bboxMin[1]-4*yShift, 0, QString("Slices"));
     renderText(bboxMin[0]-yShift/2.0f, bboxMin[1]-4*yShift, 0, QString("0"));
-    renderText(((bboxMin[0]+bboxMax[0])/2.0f)-xShift/2.0f, bboxMin[1]-4*yShift, 0, QString("512"));
-    renderText(bboxMax[0]-xShift/2.0f, bboxMin[1]-4*yShift, 0, QString("1024"));
+    ostringstream str;
+    str << nRoi/2;
+    renderText(((bboxMin[0]+bboxMax[0])/2.0f)-xShift/2.0f, bboxMin[1]-4*yShift, 0, QString(str.str().c_str()));
+    str.str("");
+    str << nRoi;
+    renderText(bboxMax[0]-xShift/2.0f, bboxMin[1]-4*yShift, 0, QString(str.str().c_str()));
 
 }
@@ -563,10 +572,11 @@
     rowNum = -1;
     eventStep = 1;
-    selectedPixel = 0;
+    selectedPixel = 393;
     inputFile = NULL;
     eventData = NULL;
-    drawPatch = false;
+    drawPatch = true;
     drawImpulse = false;
     drawBlur = false;
+    loopCurrentEvent = false;
 #ifdef LOAD_RAW
     loadEvents("/scratch/00000043.001_T.bin");
@@ -600,4 +610,5 @@
 
         hardwareMapping[softid] = hardid;
+        softwareMapping[hardid] = softid;
 
         l++;
@@ -642,13 +653,4 @@
     {
         color[0] = 0.5; color[1] = 0.5; color[2] = 0.3;
-//        if (i==0 || i==2 || i==5 || i==126 || i==10 || i==23 || i==28 || i==38 || i==132 || i==42 || i==55 ||
-//           i==18 || i==21 || i==34 || i==136 || i==122 || i==8 || i==14 || i==32 || i==45 || i==51 || i==138 ||
-//            i==93 || i==75 || i==54 || i==158 || i==111 || i==105 || i==94 || i==82 || i==66 || i==61 || i==79 ||
-//            i==156 || i==115 || i==102 || i==89 || i==71 || i==63 || i==152 || i==98 || i==84)
-//        {
-//            color[0] = 102.f/255.f;
-//            color[1] = 0.f;
-//            color[2] = 153.f/255.f;
-//        }
         for (int j=0;j<3;j++)
             patchesColor[i][j] = color[j];
@@ -657,7 +659,4 @@
     for (int i=0;i<1440;i++)
         updateNeighbors(i);
-
-
-
 }
 /************************************************************
@@ -712,5 +711,4 @@
     }
     glMatrixMode(GL_MODELVIEW);
-
 }
 
@@ -746,10 +744,10 @@
         drawPatches();
 
-    if (drawImpulse)
-    {
+   if (!drawBlur)
+   {
         glLineWidth(1.0f);
         glColor3f(1.0,1.0,1.0);
         drawHexagon(selectedPixel, false);
-    }
+   }
 }
 
@@ -805,4 +803,5 @@
     if (face != -1) {
         selectedPixel = face;
+        emit signalCurrentPixel(face);
         updateGL();
         }
@@ -871,16 +870,58 @@
     if (!*inputFile)
     {
-        cout << "Couldn't open file." << endl;
         delete inputFile;
         inputFile = NULL;
         return;
     }
+    vector<string> entriesToCheck;
+    entriesToCheck.push_back("NAXIS2");
+    entriesToCheck.push_back("NROI");
+    entriesToCheck.push_back("NTMARK");
+    entriesToCheck.push_back("RUNTYPE");
+    entriesToCheck.push_back("REVISION");
+    entriesToCheck.push_back("BLDVER");
+    entriesToCheck.push_back("RUNID");
+    entriesToCheck.push_back("NBOARD");
+    entriesToCheck.push_back("NPIX");
+    entriesToCheck.push_back("NROITM");
+    entriesToCheck.push_back("TIMESYS");
+    entriesToCheck.push_back("DATE");
+    entriesToCheck.push_back("NIGHT");
+    entriesToCheck.push_back("CAMERA");
+    entriesToCheck.push_back("DAQ");
+    entriesToCheck.push_back("ADCCOUNT");
+    entriesToCheck.push_back("TSTART");
+    entriesToCheck.push_back("TSTOP");
+    entriesToCheck.push_back("NBEVTOK");
+    entriesToCheck.push_back("NBEVTREJ");
+    entriesToCheck.push_back("NBEVTBAD");
+
+    for (vector<string>::const_iterator it=entriesToCheck.begin(); it != entriesToCheck.end(); it++)
+    {
+        if (!inputFile->HasKey(*it)){
+            cout << *it << " missing. Aborting load..." << endl;
+            return;}
+    }
     nRows = inputFile->GetInt("NAXIS2");
     nRoi = inputFile->GetInt("NROI");
-    runNumber = -1;
-    nTM = inputFile->GetInt("NTM");
+    runNumber = inputFile->GetInt("RUNID");
+    nTM = inputFile->GetInt("NTMARK");
     runType = inputFile->GetInt("RUNTYPE");
-    firstDataTime = -1;
-    lastDataTime = -1;
+    firstDataTime = inputFile->GetInt("TSTART");
+    lastDataTime = inputFile->GetInt("TSTOP");
+    nRoiTM = inputFile->GetInt("NROITM");
+    revision = inputFile->GetInt("REVISION");
+    builderVersion = inputFile->GetInt("BLDVER");
+    nBoards = inputFile->GetInt("NBOARD");
+    nPixels = inputFile->GetInt("NPIX");
+    timeSystem = inputFile->GetStr("TIMESYS");
+    creationDate = inputFile->GetStr("DATE");
+    nightInt = inputFile->GetInt("NIGHT");
+    camera = inputFile->GetStr("CAMERA");
+    daq = inputFile->GetStr("DAQ");
+    adcCount = inputFile->GetFloat("ADCCOUNT");
+    nbOk = inputFile->GetInt("NBEVTOK");
+    nbRej = inputFile->GetInt("NBEVTREJ");
+    nbBad = inputFile->GetInt("NBEVTBAD");
 
     eventNum = 0;
@@ -892,13 +933,29 @@
     if (eventData != NULL)
         delete[] eventData;
-    eventData = new int16_t[1440*nRoi];
-    inputFile->SetPtrAddress("Data", eventData);
-    inputFile->SetPtrAddress("EventNum", &eventNum);
-    inputFile->SetPtrAddress("TriggerType", &triggerType);
-    inputFile->SetPtrAddress("SoftTrig", &softTrig);
-    inputFile->SetPtrAddress("PCTime", &pcTime);
-    inputFile->SetPtrAddress("BoardTime", boardTime);
-    inputFile->SetPtrAddress("StartPix", startPix);
-    inputFile->SetPtrAddress("StartTM", startTM);
+    eventData = new int16_t[(1440+160)*nRoi];
+    if (!inputFile->SetPtrAddress("Data", eventData)){
+        cout << "Missing column " << "Data" << " Aborting load..." << endl;
+        nRoi = nRows = 0;}
+    if (!inputFile->SetPtrAddress("EventNum", &eventNum)){
+        cout << "Missing column " << "EventNum" << " Aborting load..." << endl;
+        nRoi = nRows = 0;}
+    if (!inputFile->SetPtrAddress("TriggerType", &triggerType)){
+        cout << "Missing column " << "TriggerType" << " Aborting load..." << endl;
+        nRoi = nRows = 0;}
+    if (!inputFile->SetPtrAddress("SoftTrig", &softTrig)){
+        cout << "Missing column " << "SoftTrig" << " Aborting load..." << endl;
+        nRoi = nRows = 0;}
+    if (!inputFile->SetPtrAddress("PCTime", &pcTime)){
+        cout << "Missing column " << "PCTime" << " Aborting load..." << endl;
+        nRoi = nRows = 0;}
+    if (!inputFile->SetPtrAddress("BoardTime", boardTime)){
+        cout << "Missing column " << "BoardTime" << " Aborting load..." << endl;
+        nRoi = nRows = 0;}
+    if (!inputFile->SetPtrAddress("StartCellData", startPix)){
+        cout << "Missing column " << "StartCellData" << " Aborting load..." << endl;
+        nRoi = nRows = 0;}
+    if (!inputFile->SetPtrAddress("StartCellTimeMarker", startTM)){
+        cout << "Missing column " << "StartCellTimeMarker" << " Aborting load..." << endl;
+        nRoi = nRows = 0;}
     int backupStep = eventStep;
     rowNum = -1;
@@ -907,4 +964,5 @@
     eventStep = backupStep;
     emit newFileLoaded();
+    emit signalCurrentPixel(selectedPixel);
 }
 
@@ -950,6 +1008,9 @@
     inputFile->GetRow(rowNum);
 #endif
+
     updateGL();
     emit signalCurrentEvent(eventNum);
+    emit signalCurrentPixel(selectedPixel);
+
 }
 /************************************************************
@@ -960,9 +1021,34 @@
     whichSlice++;
     if (whichSlice >= nRoi)
+    {
+        if (!loopCurrentEvent)
+        {
+            int backupStep = eventStep;
+            eventStep = 1;
+            eventStepping(true);
+            eventStep = backupStep;
+        }
         whichSlice=0;
-
+    }
     emit signalCurrentSlice(whichSlice);
     updateGL();
 }
+void RawDataViewer::previousSlice()
+{
+    whichSlice--;
+    if (whichSlice < 0)
+    {
+        if (!loopCurrentEvent)
+        {
+            int backupStep = eventStep;
+            eventStep = 1;
+            eventStepping(false);
+            eventStep = backupStep;
+        }
+        whichSlice = nRoi-1;
+    }
+    emit signalCurrentSlice(whichSlice);
+    updateGL();
+}
 /************************************************************
  * UICONNECTOR CONSTRUCTOR
@@ -970,7 +1056,21 @@
 UIConnector::UIConnector(QWidget*)
 {
-    timer.setInterval(1000.0);
+    timer.setInterval(10.0);
     QObject::connect(&timer, SIGNAL(timeout()),
                       this, SLOT(nextSlicePlease()));
+    hwID = 393;
+    swID = 0;
+    crateID = 9;
+    boardID = 8;
+    patchID = 1;
+    rescaleWholeCamera = true;
+}
+void UIConnector::slicesPlusPlus()
+{
+    viewer->nextSlice();
+}
+void UIConnector::slicesMinusMinus()
+{
+    viewer->previousSlice();
 }
 /************************************************************
@@ -1006,4 +1106,11 @@
         viewer->drawBlur = false;
     viewer->updateGL();
+}
+void UIConnector::loopEventCheckChange(int state)
+{
+    if (state)
+        viewer->loopCurrentEvent = true;
+    else
+        viewer->loopCurrentEvent = false;
 }
 /************************************************************
@@ -1214,24 +1321,43 @@
 {
     ostringstream str;
-    str << "File loaded: " << currentFile;
-    fileLoadedLabel->setText(QString(str.str().c_str()));
-    str.str("");
-    str << "Run number: " << viewer->runNumber;
-    runNumberLabel->setText(QString(str.str().c_str()));
-    str.str("");
-    str << "Number of Events/Slices: " << viewer->nRows << "/" << viewer->nRoi;
-    numberOfSlicesLabel->setText(QString(str.str().c_str()));
-    str.str("");
-    str << "Number of Time Marks: " << viewer->nTM;
-    numberOfTimeMarksLabel->setText(QString(str.str().c_str()));
-    str.str("");
-    str << "Run Type: " << viewer->runType;
-    runTypeLabel->setText(QString(str.str().c_str()));
-    str.str("");
-    str << "Time of 1st data: " << viewer->firstDataTime;
-    firstTimeLabel->setText(QString(str.str().c_str()));
-    str.str("");
-    str << "Time of last data: " << viewer->lastDataTime;
-    lastTimeLabel->setText(QString(str.str().c_str()));
+    str << "File loaded: " << currentFile << "\n";
+//    fileLoadedLabel->setText(QString(str.str().c_str()));
+//    str.str("");
+    str << "Run number: " << viewer->runNumber << "\n";
+//    runNumberLabel->setText(QString(str.str().c_str()));
+//    str.str("");
+    str << "Number of Events: " << viewer->nRows << "\n";
+    str << "Number of Slices: " << viewer->nRoi << "\n";// << "/1024";
+//    numberOfSlicesLabel->setText(QString(str.str().c_str()));
+//    str.str("");
+    str << "Number of Time Marks: " << viewer->nTM << "\n";
+//    numberOfTimeMarksLabel->setText(QString(str.str().c_str()));
+
+//    str.str("");
+    str << "Run Type: " << viewer->runType << "\n";
+//    runTypeLabel->setText(QString(str.str().c_str()));
+//    str.str("");
+    str << "Time of 1st data: " << viewer->firstDataTime << "\n";
+//    firstTimeLabel->setText(QString(str.str().c_str()));
+//    str.str("");
+    str << "Time of last data: " << viewer->lastDataTime << "\n";
+//    lastTimeLabel->setText(QString(str.str().c_str()));
+//    str.str("");
+    str << "SVN revision: " << viewer->revision << '\n';
+    str << "Number of boards: " << viewer->nBoards << '\n';
+    str << "Number of pixels: " << viewer->nPixels << '\n';
+    str << "Number of Slices TM: " << viewer->nRoiTM << '\n';
+    str << "Time system: " << viewer->timeSystem << '\n';
+    str << "Date: " << viewer->creationDate << '\n';
+    str << "Night: " << viewer->nightInt << '\n';
+    str << "Camera: " << viewer->camera << '\n';
+    str << "DAQ: " << viewer->daq << '\n';
+    str << "ADC Count: " << viewer->adcCount << '\n';
+    str << "NB Evts OK:" << viewer->nbOk << '\n';
+    str << "NB Evts Rejected: " << viewer->nbRej << '\n';
+    str << "NB Evts Bad: " << viewer->nbBad << '\n';
+    extraInfoLabel->setText(QString(str.str().c_str()));
+
+
 }
 /************************************************************
@@ -1254,4 +1380,10 @@
     QString qstr(str.str().c_str());
     emit updateCurrentSliceDisplay(qstr);
+
+    str.str("");
+    str << "Current Pixel val.: " << viewer->eventData[viewer->nRoi*viewer->selectedPixel + viewer->whichSlice];
+    qstr = qstr.fromStdString(str.str());
+    emit updateCurrentPixelSliceValue(qstr);
+
 }
 /************************************************************
@@ -1280,7 +1412,14 @@
     emit updateCurrentTriggerType(qstr);
 
+    str.str("");
+    str << "Current Pixel val.: " << viewer->eventData[viewer->nRoi*viewer->selectedPixel + viewer->whichSlice];
+    qstr = qstr.fromStdString(str.str());
+    emit updateCurrentPixelSliceValue(qstr);
+
     boardsTimeList->clear();
     startPixelsList->clear();
     startTimeMarksList->clear();
+    triggerDelayList->clear();
+    std::map<int, int> boardsHistoMap;
     for (int i=0;i <NBOARDS; i++)
     {
@@ -1292,5 +1431,10 @@
         str << ": " << viewer->boardTime[i];
         boardsTimeList->addItem(QString(str.str().c_str()));
-    }
+        if (boardsHistoMap.find(viewer->boardTime[i]) != boardsHistoMap.end())
+            boardsHistoMap[viewer->boardTime[i]]++;
+        else
+            boardsHistoMap[viewer->boardTime[i]] = 1;
+    }
+    std::map<int, int> pixelHistoMap;
     for (int i=0;i <NPIX; i++)
     {
@@ -1302,5 +1446,10 @@
         str << ": " << viewer->startPix[i];
         startPixelsList->addItem(QString(str.str().c_str()));
-    }
+        if (pixelHistoMap.find(viewer->startPix[i]) != pixelHistoMap.end())
+            pixelHistoMap[viewer->startPix[i]]++;
+        else
+            pixelHistoMap[viewer->startPix[i]] = 1;
+    }
+    std::map<int, int> timeMarksMap;
     for (int i=0;i <NTMARK; i++)
     {
@@ -1312,8 +1461,396 @@
         str << ": " << viewer->startTM[i];
         startTimeMarksList->addItem(QString(str.str().c_str()));
-    }
-
-}
-
+        if (timeMarksMap.find(viewer->startTM[i]) != timeMarksMap.end())
+            timeMarksMap[viewer->startTM[i]]++;
+        else
+            timeMarksMap[viewer->startTM[i]] = 1;
+    }
+    std::map<int,int> delayMap;
+    triggerDelayList->addItem(QString("Patch | Slice:Delay Slice:Delay..."));
+    for (int i=0;i<NTMARK; i++)
+    {
+        str.str("");
+        str << i << " | ";
+        for (int j=0;j<viewer->nRoi;j++)
+        {
+            int value = viewer->eventData[1440*viewer->nRoi + i*viewer->nRoi + j];
+            if (delayMap.find(value) != delayMap.end())
+                 delayMap[value]++;
+             else
+                 delayMap[value] = 1;
+            str << j << ":" << value << " ";
+         }
+        triggerDelayList->addItem(QString(str.str().c_str()));
+    }
+
+    QVector<QwtIntervalSample> boardsHistoSamples(boardsHistoMap.size());
+    std::map<int,int>::iterator it = boardsHistoMap.begin();
+    for (unsigned int i=0;i<boardsHistoMap.size();i++)
+    {
+        QwtInterval interval(double(it->first), it->first+1.0);
+        interval.setBorderFlags(QwtInterval::ExcludeMaximum);
+        boardsHistoSamples[i] = QwtIntervalSample(it->second, interval);
+        it++;
+    }
+    boardsTimeHistoItem.setData(new QwtIntervalSeriesData(boardsHistoSamples));
+
+    QVector<QwtIntervalSample> pixelHistoSamples(pixelHistoMap.size());
+    it = pixelHistoMap.begin();
+    for (unsigned int i=0;i<pixelHistoMap.size();i++)
+    {
+        QwtInterval interval(double(it->first), it->first+1.0);
+        interval.setBorderFlags(QwtInterval::ExcludeMaximum);
+        pixelHistoSamples[i] = QwtIntervalSample(it->second, interval);
+        it++;
+    }
+    startCellHistoItem.setData(new QwtIntervalSeriesData(pixelHistoSamples));
+
+    QVector<QwtIntervalSample> TMHistoSamples(timeMarksMap.size());
+    it = timeMarksMap.begin();
+    for (unsigned int i=0;i<timeMarksMap.size();i++)
+    {
+        QwtInterval interval(double(it->first), it->first+1.0);
+        interval.setBorderFlags(QwtInterval::ExcludeMaximum);
+        TMHistoSamples[i] = QwtIntervalSample(it->second, interval);
+        it++;
+    }
+    startTimeMarkHistoItem.setData(new QwtIntervalSeriesData(TMHistoSamples));
+
+    QVector<QwtIntervalSample> delayTriggerSamples(delayMap.size());
+    it = delayMap.begin();
+    for (unsigned int i=0;i<delayMap.size(); i++)
+    {
+        QwtInterval interval(double(it->first), it->first+1.0);
+        interval.setBorderFlags(QwtInterval::ExcludeMaximum);
+        delayTriggerSamples[i] = QwtIntervalSample(it->second, interval);
+        it++;
+    }
+    triggerDelayHistoItem.setData(new QwtIntervalSeriesData(delayTriggerSamples));
+
+//    startCellHistoZoom->setZoomBase(startCellHistoItem.boundingRect());
+    QStack< QRectF > stack;
+    stack.push(boardsTimeHistoItem.boundingRect());
+    boardsTimeHistoZoom->setZoomStack(stack);
+    stack.pop();
+    stack.push(startCellHistoItem.boundingRect());
+    startCellHistoZoom->setZoomStack(stack);
+    stack.pop();
+    stack.push(startTimeMarkHistoItem.boundingRect());
+    startTimeMarkHistoZoom->setZoomStack(stack);
+    stack.pop();
+    stack.push(triggerDelayHistoItem.boundingRect());
+    triggerDelayHistoZoom->setZoomStack(stack);
+    stack.pop();
+    pixelChanged(viewer->selectedPixel);
+
+
+
+}
+
+void UIConnector::initHistograms()
+{
+//    QwtPlot*     boardsTimeHisto;
+//    QwtPlotHistogram boardsTimeHistoItem;
+    QwtPlotGrid* grid = new QwtPlotGrid;
+    grid->enableX(false);
+    grid->enableY(true);
+    grid->enableXMin(false);
+    grid->enableYMin(false);
+    grid->setMajPen(QPen(Qt::black, 0, Qt::DotLine));
+    grid->attach(boardsTimeHisto);
+
+    grid = new QwtPlotGrid;
+    grid->enableX(false);
+    grid->enableY(true);
+    grid->enableXMin(false);
+    grid->enableYMin(false);
+    grid->setMajPen(QPen(Qt::black, 0, Qt::DotLine));
+    grid->attach(startCellHisto);
+
+    grid = new QwtPlotGrid;
+    grid->enableX(false);
+    grid->enableY(true);
+    grid->enableXMin(false);
+    grid->enableYMin(false);
+    grid->setMajPen(QPen(Qt::black, 0, Qt::DotLine));
+    grid->attach(startTimeMarkHisto);
+
+    grid = new QwtPlotGrid;
+    grid->enableX(false);
+    grid->enableY(true);
+    grid->enableXMin(false);
+    grid->enableYMin(false);
+    grid->setMajPen(QPen(Qt::black, 0, Qt::DotLine));
+    grid->attach(pixelValueCurve);
+
+    grid = new QwtPlotGrid;
+    grid->enableX(false);
+    grid->enableY(true);
+    grid->enableXMin(false);
+    grid->enableYMin(false);
+    grid->setMajPen(QPen(Qt::black, 0, Qt::DotLine));
+    grid->attach(triggerDelayHisto);
+
+
+    boardsTimeHisto->setAutoReplot(true);
+    startCellHisto->setAutoReplot(true);
+    startTimeMarkHisto->setAutoReplot(true);
+    pixelValueCurve->setAutoReplot(true);
+    triggerDelayHisto->setAutoReplot(true);
+    boardsTimeHisto->setTitle("Boards time values");
+    startCellHisto->setTitle("Start Cell values");
+    startTimeMarkHisto->setTitle("Start Time Marks values");
+    pixelValueCurve->setTitle("Current pixel values");
+    triggerDelayHisto->setTitle("Trigger Delays");
+
+    boardsTimeHistoItem.setBrush(QBrush(Qt::red));
+    startCellHistoItem.setBrush(QBrush(Qt::red));
+    startTimeMarkHistoItem.setBrush(QBrush(Qt::red));
+    triggerDelayHistoItem.setBrush(QBrush(Qt::red));
+//    pixelValueCurveItem.setBrush(QBrush(Qt::red));
+
+    boardsTimeHistoItem.attach(boardsTimeHisto);
+    startCellHistoItem.attach(startCellHisto);
+    startTimeMarkHistoItem.attach(startTimeMarkHisto);
+    triggerDelayHistoItem.attach(triggerDelayHisto);
+
+    //curve
+//    pixelValueCurveItem.setSymbol(new QwtSymbol(QwtSymbol::Cross, Qt::NoBrush, QPen(Qt::black), QSize(5,5)));
+    pixelValueCurveItem.setPen(QColor(Qt::darkGreen));
+    pixelValueCurveItem.setStyle(QwtPlotCurve::Lines);
+//    pixelValueCurveItem.setCurveAttribute(QwtPlotCurve::Fitted);
+    pixelValueCurveItem.attach(pixelValueCurve);
+
+    //FIXME delete these pointers with the destructor
+    curveZoom = new QwtPlotZoomer(pixelValueCurve->canvas());
+    curveZoom->setRubberBandPen(QPen(Qt::gray, 2, Qt::DotLine));
+    curveZoom->setTrackerPen(QPen(Qt::gray));
+    boardsTimeHistoZoom = new QwtPlotZoomer(boardsTimeHisto->canvas());
+    boardsTimeHistoZoom->setRubberBandPen(QPen(Qt::gray, 2, Qt::DotLine));
+    boardsTimeHistoZoom->setTrackerPen(QPen(Qt::gray));
+    startCellHistoZoom = new QwtPlotZoomer(startCellHisto->canvas());
+    startCellHistoZoom->setRubberBandPen(QPen(Qt::gray, 2, Qt::DotLine));
+    startCellHistoZoom->setTrackerPen(QPen(Qt::gray));
+    startTimeMarkHistoZoom = new QwtPlotZoomer(startTimeMarkHisto->canvas());
+    startTimeMarkHistoZoom->setRubberBandPen(QPen(Qt::gray, 2, Qt::DotLine));
+    startTimeMarkHistoZoom->setTrackerPen(QPen(Qt::gray));
+    triggerDelayHistoZoom = new QwtPlotZoomer(triggerDelayHisto->canvas());
+    triggerDelayHistoZoom->setRubberBandPen(QPen(Qt::gray, 2, Qt::DotLine));
+    triggerDelayHistoZoom->setTrackerPen(QPen(Qt::gray));
+
+
+}
+double xval[1024];
+double yval[1024];
+void UIConnector::pixelChanged(int pixel)
+{
+    if (!viewer->nRoi)
+        return;
+
+    for (int i=0;i<viewer->nRoi;i++)
+    {
+        xval[i] = i;
+#ifdef LOAD_RAW
+        yval[i] = eventsData[0][pixel][i];
+#else
+        yval[i] = viewer->eventData[viewer->nRoi*pixel + i];
+#endif
+    }
+    pixelValueCurveItem.setRawSamples(xval, yval, viewer->nRoi);
+
+    QStack< QRectF > stack;
+    stack.push(pixelValueCurveItem.boundingRect());
+    curveZoom->setZoomStack(stack);
+    stack.pop();
+
+    hwID = pixel;
+    swID = viewer->softwareMapping[pixel];
+    crateID = (pixel/4)/10;
+    boardID = (pixel/4)%10;
+    patchID = pixel%4;
+    HwIDBox->setValue(hwID);
+    SwIDBox->setValue(swID);
+    crateIDBox->setValue(crateID);
+    boardIDBox->setValue(boardID);
+    patchIDBox->setValue(patchID);
+
+    ostringstream str;
+    QString qstr;
+    str.str("");
+    str << "Current Pixel val.: " << viewer->eventData[viewer->nRoi*viewer->selectedPixel + viewer->whichSlice];
+    qstr = qstr.fromStdString(str.str());
+    emit updateCurrentPixelSliceValue(qstr);
+
+//    cout << "Pixel: " << viewer->softwareMapping[pixel] << " Hardware ID: " << pixel << " Patch: " << pixel%4;
+//    cout << " Board: " << (pixel/4)%10 << " Crate: " << (pixel/4)/10 << endl;
+
+ //   curveZoom->setZoomBase();
+//    cout << "pixel changed ! " << pixel << endl;
+}
+
+void UIConnector::hwIDChanged(int hwid)
+{
+    hwID = hwid;
+    swID = viewer->softwareMapping[hwid];
+    crateID = (hwid/4)/10;
+    boardID = (hwid/4)%10;
+    patchID = hwid%4;
+    HwIDBox->setValue(hwID);
+    SwIDBox->setValue(swID);
+    crateIDBox->setValue(crateID);
+    boardIDBox->setValue(boardID);
+    patchIDBox->setValue(patchID);
+
+    viewer->selectedPixel = hwid;
+    pixelChanged(hwid);
+    viewer->updateGL();
+
+}
+void UIConnector::swIDChanged(int swid)
+{
+    swID = swid;
+    hwID = viewer->hardwareMapping[swid];
+    crateID = (hwID/4)/10;
+    boardID = (hwID/4)%10;
+    patchID = hwID%4;
+    HwIDBox->setValue(hwID);
+    SwIDBox->setValue(swID);
+    crateIDBox->setValue(crateID);
+    boardIDBox->setValue(boardID);
+    patchIDBox->setValue(patchID);
+
+    viewer->selectedPixel = hwID;
+    pixelChanged(hwID);
+    viewer->updateGL();
+}
+void UIConnector::crateIDChanged(int cid)
+{
+    crateID = cid;
+    hwID = 40*crateID + 4*boardID + patchID;
+    swID = viewer->softwareMapping[hwID];
+    HwIDBox->setValue(hwID);
+    SwIDBox->setValue(swID);
+    viewer->selectedPixel = hwID;
+    pixelChanged(hwID);
+    viewer->updateGL();
+}
+void UIConnector::boardIDChanged(int bid)
+{
+    boardID = bid;
+    hwID = 40*crateID + 4*boardID + patchID;
+    swID = viewer->softwareMapping[hwID];
+    HwIDBox->setValue(hwID);
+    SwIDBox->setValue(swID);
+    viewer->selectedPixel = hwID;
+    pixelChanged(hwID);
+   viewer->updateGL();
+}
+void UIConnector::patchIDChanged(int pid)
+{
+    patchID = pid;
+    hwID = 40*crateID + 4*boardID + patchID;
+    swID = viewer->softwareMapping[hwID];
+    HwIDBox->setValue(hwID);
+    SwIDBox->setValue(swID);
+    viewer->selectedPixel = hwID;
+    pixelChanged(hwID);
+    viewer->updateGL();
+}
+void UIConnector::autoScalePressed()
+{
+    if (!viewer->nRoi)
+        return;
+    int start, end;
+    if (rescaleWholeCamera)
+    {
+        start = 0;
+        end = 1440;
+    }
+    else
+    {
+        start = viewer->selectedPixel;
+        end = viewer->selectedPixel+1;
+    }
+
+    int min = 10000; //real min = -2048
+    int max = -10000; //real max = 2047
+    long average = 0;
+    int numSamples = 0;
+    for (int i=start;i<end;i++)
+    {
+        for (int j=0;j<viewer->nRoi;j++)
+        {
+            int cValue = viewer->eventData[i*viewer->nRoi+j];
+            if (cValue > max)
+                max = cValue;
+            if (cValue < min)
+               min = cValue;
+            average+=cValue;
+            numSamples++;
+        }
+    }
+    average /= numSamples;
+
+    double minRange = (double)(min+(VALUES_SPAN/2))/(double)VALUES_SPAN;
+    double maxRange = (double)(max+(VALUES_SPAN/2))/(double)VALUES_SPAN;
+    double midRange = (double)(average+(VALUES_SPAN/2))/(double)VALUES_SPAN;
+    ss[0] = minRange;
+    range0->setValue(ss[0]);
+    ss[4] = maxRange;
+    range4->setValue(ss[4]);
+    ss[2] = midRange;
+    range2->setValue(ss[2]);
+    ss[1] = (minRange+midRange)/2;
+    range1->setValue(ss[1]);
+    ss[3] = (maxRange+midRange)/2;
+    range3->setValue(ss[3]);
+
+
+}
+void UIConnector::entireCameraChanged(bool state)
+{
+    if (state)
+    {
+        rescaleWholeCamera = true;
+        currentPixelScale->setChecked(false);
+    }
+    else
+    {
+        rescaleWholeCamera = false;
+        currentPixelScale->setChecked(true);
+    }
+}
+void UIConnector::currentPixelChanged(bool state)
+{
+
+    if (state)
+    {
+        rescaleWholeCamera = false;
+        entireCameraScale->setChecked(false);
+    }
+    else
+    {
+        rescaleWholeCamera = true;
+        entireCameraScale->setChecked(true);
+    }
+}
+void PrintHelp()
+{
+    cout <<
+            "\n"
+         << endl;
+}
+void SetupConfiguration(Configuration& conf)
+{
+    po::options_description configs("Raw Events Viewer Options");
+    configs.add_options()
+        ("colorRange", vars<double>(), "Range of the display colours")
+        ("colorRed", vars<double>(), "Range of red values")
+        ("colorGreen", vars<double>(), "Range of green values")
+        ("colorBlue", vars<double>(), "Range of blue values")
+        ("file,f", var<string>(), "File to be loaded at startup")
+        ;
+    conf.AddOptions(configs);
+}
 /************************************************************
  * MAIN PROGRAM FUNCTION.
@@ -1321,17 +1858,58 @@
 int main(int argc, char *argv[])
 {
-    if (argc > 1)
-    {
-        cout << "Sorry, this program does not accept options (yet)." << endl;
-        cout << "Usage: just launch it without arguments." << endl;
-        cout << "Once launched, you can load a fits file (compressed: .fits.gz) using the \"Load New File\" button" << endl;
-        cout << "Events stepping lets you crawl the events inside the loaded file, while the number between the \"-\" and \"+\" buttons determines how many events are skipped at every button click" << endl;
-        cout << "Play/Pause start or stops the animation of the camera (looping over the current event's slices), while the \"slices per sec\" number determines how many slices are diplayed every second" << endl;
-        cout << "The ranges, Red, Green and Blue series of inputs can be used to tweak the displayed colours. The range goes from 0 to 1, which would map to -32768 and 32767 respectively" << endl;
-        cout << "Only 3 intermediate steps can be given, and the given colours are interpolated for the pixels accordingly" << endl;
-        cout << "Eventually, the Draw Impulse, Draw Patches and Blur pixels checkboxes can be used to change what is displayed." << endl;
-        cout << "when \"Draw Impulse\" is checked, it is possible to select a pixel by double clicking on it, and the current slice can be drag and dropped." << endl;
-        return 0;
-    }
+    Configuration conf(argv[0]);
+    conf.SetPrintUsage(PrintHelp);
+    SetupConfiguration(conf);
+    if (!conf.DoParse(argc, const_cast<const char**>(argv), PrintHelp))
+        return -1;
+
+    if (conf.Has("colorRange"))
+    {
+        vector<double> value = conf.Vec<double>("colorRange");
+        if (value.size() != 5)
+        {
+            cout << "Error, colorRange option should have exactly 5 double values" << endl;
+            return -1;
+        }
+        for (int i=0;i<5;i++)
+            ss[i] = value[i];
+    }
+
+    if (conf.Has("colorRed"))
+    {
+        vector<double> value = conf.Vec<double>("colorRed");
+        if (value.size() != 5)
+        {
+            cout << "Error, colorRed option should have exactly 5 double values" << endl;
+            return -1;
+        }
+        for (int i=0;i<5;i++)
+            rr[i] = value[i];
+    }
+
+    if (conf.Has("colorGreen"))
+    {
+        vector<double> value = conf.Vec<double>("colorGreen");
+        if (value.size() != 5)
+        {
+            cout << "Error, colorGreen option should have exactly 5 double values" << endl;
+            return -1;
+        }
+        for (int i=0;i<5;i++)
+            gg[i] = value[i];
+    }
+
+    if (conf.Has("colorBlue"))
+    {
+        vector<double> value = conf.Vec<double>("colorBlue");
+        if (value.size() != 5)
+        {
+            cout << "Error, colorBlue option should have exactly 5 double values" << endl;
+            return -1;
+        }
+        for (int i=0;i<5;i++)
+            bb[i] = value[i];
+    }
+
     QApplication app(argc, argv);
 
@@ -1378,14 +1956,66 @@
     connector.setViewer(canvas);
     connector.boardsTimeList = myUi.boardsTimeList;
+    connector.boardsTimeHisto = myUi.boardsTimeHisto;
     connector.startPixelsList = myUi.startPixelsList;
+    connector.startCellHisto = myUi.startCellsHisto;
+    connector.startTimeMarkHisto = myUi.startTimeMarkHisto;
+    connector.pixelValueCurve = myUi.pixelValueCurve;
+    connector.triggerDelayHisto = myUi.triggerDelayHisto;
+    connector.triggerDelayList = myUi.triggerDelayList;
+
     connector.startTimeMarksList = myUi.startTimeMarksList;
-    connector.fileLoadedLabel = myUi.fileLoadedLabel;
-    connector.runNumberLabel = myUi.runNumberLabel;
-    connector.numberOfSlicesLabel = myUi.numberOfSlicesLabel;
-    connector.numberOfTimeMarksLabel = myUi.numberOfTimeMarksLabel;
-    connector.runTypeLabel = myUi.runTypeLabel;
-    connector.firstTimeLabel = myUi.timeOfFirstDataLabel;
-    connector.lastTimeLabel = myUi.timeOfLastDataLabel;
-
+//    connector.fileLoadedLabel = myUi.fileLoadedLabel;
+//    connector.runNumberLabel = myUi.runNumberLabel;
+//    connector.numberOfSlicesLabel = myUi.numberOfSlicesLabel;
+//    connector.numberOfTimeMarksLabel = myUi.numberOfTimeMarksLabel;
+//    connector.runTypeLabel = myUi.runTypeLabel;
+//    connector.firstTimeLabel = myUi.timeOfFirstDataLabel;
+//    connector.lastTimeLabel = myUi.timeOfLastDataLabel;
+    connector.currentPixelValue = myUi.currentPixelValue;
+
+    connector.currentPixelScale = myUi.currentPixelScale;
+    connector.entireCameraScale = myUi.entireCameraScale;
+
+    connector.extraInfoLabel = myUi.extraInfoLabel;
+
+    connector.HwIDBox = myUi.HwIDBox;
+    connector.SwIDBox = myUi.SwIDBox;
+    connector.crateIDBox = myUi.crateIDBox;
+    connector.boardIDBox = myUi.boardIDBox;
+    connector.patchIDBox = myUi.patchIDBox;
+
+    connector.range0 = myUi.colorRange0;
+    connector.range1 = myUi.colorRange1;
+    connector.range2 = myUi.colorRange2;
+    connector.range3 = myUi.colorRange3;
+    connector.range4 = myUi.colorRange4;
+
+    connector.initHistograms();
+
+    QObject::connect(myUi.slicesPlusPlusButton, SIGNAL(clicked()),
+                    &connector, SLOT(slicesPlusPlus()));
+    QObject::connect(myUi.slicesMinusMinusButton, SIGNAL(clicked()),
+                     &connector, SLOT(slicesMinusMinus()));
+    QObject::connect(myUi.autoScaleColor, SIGNAL(clicked()),
+                     &connector, SLOT(autoScalePressed()));
+    QObject::connect(myUi.currentPixelScale, SIGNAL(toggled(bool)),
+                     &connector, SLOT(currentPixelChanged(bool)));
+    QObject::connect(myUi.entireCameraScale, SIGNAL(toggled(bool)),
+                     &connector, SLOT(entireCameraChanged(bool)));
+
+    QObject::connect(myUi.HwIDBox, SIGNAL(valueChanged(int)),
+                         &connector, SLOT(hwIDChanged(int)));
+    QObject::connect(myUi.SwIDBox, SIGNAL(valueChanged(int)),
+                         &connector, SLOT(swIDChanged(int)));
+    QObject::connect(myUi.crateIDBox, SIGNAL(valueChanged(int)),
+                         &connector, SLOT(crateIDChanged(int)));
+    QObject::connect(myUi.boardIDBox, SIGNAL(valueChanged(int)),
+                         &connector, SLOT(boardIDChanged(int)));
+    QObject::connect(myUi.patchIDBox, SIGNAL(valueChanged(int)),
+                         &connector, SLOT(patchIDChanged(int)));
+
+ //   connector.pixelChanged(0);
+    QObject::connect(canvas, SIGNAL(signalCurrentPixel(int)),
+                     &connector, SLOT(pixelChanged(int)));
     QObject::connect(myUi.drawPatchCheckBox, SIGNAL(stateChanged(int)),
                      &connector, SLOT(drawPatchesCheckChange(int)));
@@ -1394,4 +2024,6 @@
     QObject::connect(myUi.drawBlurCheckBox, SIGNAL(stateChanged(int)),
                      &connector, SLOT(drawBlurCheckChange(int)));
+    QObject::connect(myUi.loopOverCurrentEventBox, SIGNAL(stateChanged(int)),
+                     &connector, SLOT(loopEventCheckChange(int)));
     QObject::connect(canvas, SIGNAL(newFileLoaded()),
                      &connector, SLOT(newFileLoaded()));
@@ -1480,4 +2112,13 @@
     QObject::connect(&connector, SIGNAL(updateCurrentTriggerType(QString)),
                      myUi.triggerTypeLabel, SLOT(setText(const QString)));
+    QObject::connect(&connector, SIGNAL(updateCurrentPixelSliceValue(const QString)),
+                     myUi.currentPixelValue, SLOT(setText(const QString)));
+
+    if (conf.Has("file"))
+    {
+        string str = conf.Get<string>("file");
+        QString qstr(str.c_str());
+        connector.fileSelected(qstr);
+    }
 
     mainWindow.show();
Index: /trunk/FACT++/gui/RawEventsViewer/RawEventsViewer.h
===================================================================
--- /trunk/FACT++/gui/RawEventsViewer/RawEventsViewer.h	(revision 11696)
+++ /trunk/FACT++/gui/RawEventsViewer/RawEventsViewer.h	(revision 11697)
@@ -24,6 +24,16 @@
 #include <QtGui/QColorDialog>
 #include <QtGui/QApplication>
+#include <QtGui/QSpinBox>
+#include <QtGui/QDoubleSpinBox>
+#include <QtGui/QRadioButton>
 #include <iostream>
 #include <GL/gl.h>
+
+#include "qwt_plot.h"
+#include "qwt_plot_histogram.h"
+#include "qwt_plot_curve.h"
+
+#include <qwt_plot_zoomer.h>
+
 
 //#define __MARS__
@@ -76,4 +86,5 @@
     void setEventStep(int step);
     void nextSlice();
+    void previousSlice();
 
 Q_SIGNALS:
@@ -81,4 +92,5 @@
     void signalCurrentSlice(int slice);
     void newFileLoaded();
+    void signalCurrentPixel(int pixel);
 
 protected:
@@ -116,4 +128,5 @@
     bool drawImpulse;
     bool drawBlur;
+    bool loopCurrentEvent;
     //allocate the maximum size for one event
     int16_t *eventData;
@@ -128,4 +141,5 @@
     int eventNum;
     int nRoi;
+    int nRoiTM;
     int runNumber;
     int nTM;
@@ -133,7 +147,22 @@
     int firstDataTime;
     int lastDataTime;
+    int revision;
+    int builderVersion;
+    int nBoards;
+    int nPixels;
+    string timeSystem;
+    string creationDate;
+    int nightInt;
+    string camera;
+    string daq;
+    float adcCount;
+    int nbOk;
+    int nbRej;
+    int nbBad;
+
     int eventStep;
 
     int hardwareMapping[1440];
+    int softwareMapping[1440];
     int patches[160][9];
     GLfloat patchesColor[160][3];
@@ -166,4 +195,5 @@
     void drawImpulseCheckChange(int state);
     void drawBlurCheckChange(int state);
+    void loopEventCheckChange(int state);
     void newFileLoaded();
     void playPauseClicked();
@@ -192,4 +222,15 @@
     void blueChanged3(double value);
     void blueChanged4(double value);
+    void pixelChanged(int pixel);
+    void hwIDChanged(int hwid);
+    void swIDChanged(int swid);
+    void crateIDChanged(int cid);
+    void boardIDChanged(int bid);
+    void patchIDChanged(int pid);
+    void autoScalePressed();
+    void entireCameraChanged(bool state);
+    void currentPixelChanged(bool state);
+    void slicesPlusPlus();
+    void slicesMinusMinus();
 
 Q_SIGNALS:
@@ -199,4 +240,5 @@
     void updateCurrentSoftTrigger(QString);
     void updateCurrentTriggerType(QString);
+    void updateCurrentPixelSliceValue(QString);
 
 
@@ -205,15 +247,58 @@
     QTimer timer;
     string currentFile;
+    int crateID;
+    int boardID;
+    int patchID;
+    int hwID;
+    int swID;
+    bool rescaleWholeCamera;
 public:
     QListWidget *boardsTimeList;
     QListWidget* startPixelsList;
     QListWidget* startTimeMarksList;
-    QLabel*      fileLoadedLabel;
-    QLabel*      runNumberLabel;
-    QLabel*      numberOfSlicesLabel;
-    QLabel*      numberOfTimeMarksLabel;
-    QLabel*      runTypeLabel;
-    QLabel*      firstTimeLabel;
-    QLabel*      lastTimeLabel;
+//   QLabel*      fileLoadedLabel;
+//    QLabel*      runNumberLabel;
+//    QLabel*      numberOfSlicesLabel;
+//    QLabel*      numberOfTimeMarksLabel;
+//    QLabel*      runTypeLabel;
+//    QLabel*      firstTimeLabel;
+//    QLabel*      lastTimeLabel;
+    QLabel*      currentPixelValue;
+    QLabel*      extraInfoLabel;
+
+    QwtPlot*     boardsTimeHisto;
+    QwtPlot*     startCellHisto;
+    QwtPlot*     startTimeMarkHisto;
+    QwtPlot*     pixelValueCurve;
+    QwtPlotHistogram boardsTimeHistoItem;
+    QwtPlotHistogram startCellHistoItem;
+    QwtPlotHistogram startTimeMarkHistoItem;
+    QwtPlotCurve     pixelValueCurveItem;
+    QwtPlotZoomer* curveZoom;
+    QwtPlotZoomer* boardsTimeHistoZoom;
+    QwtPlotZoomer* startCellHistoZoom;
+    QwtPlotZoomer* startTimeMarkHistoZoom;
+
+    QwtPlot*        triggerDelayHisto;
+    QwtPlotHistogram triggerDelayHistoItem;
+    QwtPlotZoomer* triggerDelayHistoZoom;
+    QListWidget* triggerDelayList;
+
+    QSpinBox*   HwIDBox;
+    QSpinBox*   SwIDBox;
+    QSpinBox*   crateIDBox;
+    QSpinBox*   boardIDBox;
+    QSpinBox*   patchIDBox;
+
+    QRadioButton* currentPixelScale;
+    QRadioButton* entireCameraScale;
+
+    QDoubleSpinBox* range0;
+    QDoubleSpinBox* range1;
+    QDoubleSpinBox* range2;
+    QDoubleSpinBox* range3;
+    QDoubleSpinBox* range4;
+
+    void initHistograms();
 
 };
Index: /trunk/FACT++/gui/RawEventsViewer/viewer.ui
===================================================================
--- /trunk/FACT++/gui/RawEventsViewer/viewer.ui	(revision 11696)
+++ /trunk/FACT++/gui/RawEventsViewer/viewer.ui	(revision 11697)
@@ -7,6 +7,6 @@
     <x>0</x>
     <y>0</y>
-    <width>1125</width>
-    <height>928</height>
+    <width>1133</width>
+    <height>1017</height>
    </rect>
   </property>
@@ -16,5 +16,5 @@
   <widget class="QWidget" name="centralwidget">
    <layout class="QGridLayout" name="gridLayout_2">
-    <item row="0" column="0">
+    <item row="0" column="1">
      <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="10,0">
       <item>
@@ -24,10 +24,187 @@
         </property>
         <item>
-         <widget class="RawDataViewer" name="GLWindow" native="true"/>
+         <widget class="QTabWidget" name="tabWidget_2">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tab_5">
+           <property name="layoutDirection">
+            <enum>Qt::LeftToRight</enum>
+           </property>
+           <attribute name="title">
+            <string>Camera View</string>
+           </attribute>
+           <layout class="QGridLayout" name="gridLayout_3">
+            <item row="0" column="0">
+             <widget class="RawDataViewer" name="GLWindow" native="true">
+              <property name="enabled">
+               <bool>true</bool>
+              </property>
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="maximumSize">
+               <size>
+                <width>10000</width>
+                <height>10000</height>
+               </size>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tab_6">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <attribute name="title">
+            <string>Data View</string>
+           </attribute>
+           <layout class="QVBoxLayout" name="verticalLayout_2">
+            <item>
+             <widget class="QTabWidget" name="tabWidget_3">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+                <horstretch>1</horstretch>
+                <verstretch>1</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="tabShape">
+               <enum>QTabWidget::Rounded</enum>
+              </property>
+              <property name="currentIndex">
+               <number>1</number>
+              </property>
+              <property name="elideMode">
+               <enum>Qt::ElideNone</enum>
+              </property>
+              <widget class="QWidget" name="tab_3">
+               <property name="sizePolicy">
+                <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+                 <horstretch>0</horstretch>
+                 <verstretch>0</verstretch>
+                </sizepolicy>
+               </property>
+               <attribute name="title">
+                <string>Arrays data</string>
+               </attribute>
+               <layout class="QVBoxLayout" name="verticalLayout_6">
+                <item>
+                 <widget class="QLabel" name="label_3">
+                  <property name="text">
+                   <string>Boards time values</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QListWidget" name="boardsTimeList">
+                  <property name="font">
+                   <font>
+                    <family>FreeMono</family>
+                   </font>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QLabel" name="label_13">
+                  <property name="text">
+                   <string>Start Cells</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QListWidget" name="startPixelsList">
+                  <property name="font">
+                   <font>
+                    <family>FreeMono</family>
+                   </font>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QLabel" name="StartTimeMarksList">
+                  <property name="text">
+                   <string>Start Time Marks</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QListWidget" name="startTimeMarksList">
+                  <property name="sizePolicy">
+                   <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+                    <horstretch>0</horstretch>
+                    <verstretch>0</verstretch>
+                   </sizepolicy>
+                  </property>
+                  <property name="font">
+                   <font>
+                    <family>FreeMono</family>
+                   </font>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QLabel" name="label_4">
+                  <property name="text">
+                   <string>Trigger Delays</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QListWidget" name="triggerDelayList"/>
+                </item>
+               </layout>
+              </widget>
+              <widget class="QWidget" name="tab_4">
+               <attribute name="title">
+                <string>Histograms</string>
+               </attribute>
+               <layout class="QVBoxLayout" name="verticalLayout_3">
+                <item>
+                 <widget class="QwtPlot" name="boardsTimeHisto"/>
+                </item>
+                <item>
+                 <widget class="QwtPlot" name="startCellsHisto"/>
+                </item>
+                <item>
+                 <widget class="QwtPlot" name="startTimeMarkHisto"/>
+                </item>
+                <item>
+                 <widget class="QwtPlot" name="triggerDelayHisto"/>
+                </item>
+               </layout>
+              </widget>
+              <widget class="QWidget" name="tab">
+               <attribute name="title">
+                <string>Pixel Curves</string>
+               </attribute>
+               <layout class="QGridLayout" name="gridLayout_4">
+                <item row="0" column="0">
+                 <widget class="QwtPlot" name="pixelValueCurve"/>
+                </item>
+               </layout>
+              </widget>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
         </item>
        </layout>
       </item>
       <item>
-       <layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,0,0,0,0,0,0,0,0,0">
+       <layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,0,0">
         <property name="sizeConstraint">
          <enum>QLayout::SetDefaultConstraint</enum>
@@ -36,57 +213,33 @@
          <widget class="QLabel" name="label">
           <property name="text">
-           <string>FACT - Raw events viewer - v0.1</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QLabel" name="fileLoadedLabel">
+           <string>FACT - Raw events viewer - v0.2</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QLabel" name="extraInfoLabel">
           <property name="text">
-           <string>File loaded: none</string>
-          </property>
-          <property name="wordWrap">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QLabel" name="runNumberLabel">
-          <property name="text">
-           <string>Run number:</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QLabel" name="numberOfSlicesLabel">
-          <property name="text">
-           <string>Number of Events/Slices:</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QLabel" name="numberOfTimeMarksLabel">
-          <property name="text">
-           <string>Number of Time Marks:</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QLabel" name="runTypeLabel">
-          <property name="text">
-           <string>Run Type:</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QLabel" name="timeOfFirstDataLabel">
-          <property name="text">
-           <string>Time of 1st data:</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QLabel" name="timeOfLastDataLabel">
-          <property name="text">
-           <string>Time of last data:</string>
+           <string>File loaded: none
+Run number:
+Number of Events:
+Number ofSlices:
+Number of Time Marks:
+Run Type:
+Time of 1st data:
+Time of last data:
+SVN revision:
+Number of boards:
+Number of pixels:
+Number of Slices TM:
+Time system:
+Date:
+Night:
+Camera:
+DAQ:
+ADC Count:
+NB Evts OK:
+NB Evts Rejected:
+NB Evts Bad:
+</string>
           </property>
          </widget>
@@ -95,5 +248,5 @@
          <layout class="QVBoxLayout" name="verticalLayout_5">
           <item>
-           <widget class="QLabel" name="label_8">
+           <widget class="QLabel" name="label_5">
             <property name="font">
              <font>
@@ -104,5 +257,5 @@
             </property>
             <property name="text">
-             <string>Arrays data</string>
+             <string>Selected Pixel</string>
             </property>
             <property name="alignment">
@@ -112,50 +265,102 @@
           </item>
           <item>
-           <widget class="QLabel" name="label_9">
-            <property name="text">
-             <string>Boards times</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QListWidget" name="boardsTimeList">
-            <property name="font">
-             <font>
-              <family>FreeMono</family>
-             </font>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QLabel" name="label_13">
-            <property name="text">
-             <string>Start Pixels</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QListWidget" name="startPixelsList">
-            <property name="font">
-             <font>
-              <family>FreeMono</family>
-             </font>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QLabel" name="StartTimeMarksList">
-            <property name="text">
-             <string>Start Time Marks</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QListWidget" name="startTimeMarksList">
-            <property name="font">
-             <font>
-              <family>FreeMono</family>
-             </font>
-            </property>
-           </widget>
+           <layout class="QHBoxLayout" name="horizontalLayout_6">
+            <item>
+             <widget class="QLabel" name="label_10">
+              <property name="text">
+               <string>Hardware ID</string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QSpinBox" name="HwIDBox">
+              <property name="maximum">
+               <number>10000</number>
+              </property>
+              <property name="value">
+               <number>393</number>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout_7">
+            <item>
+             <widget class="QLabel" name="label_11">
+              <property name="text">
+               <string>Software ID</string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QSpinBox" name="SwIDBox">
+              <property name="maximum">
+               <number>1440</number>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+          <item>
+           <layout class="QGridLayout" name="gridLayout_5">
+            <item row="2" column="0">
+             <widget class="QLabel" name="label_6">
+              <property name="text">
+               <string>Crate</string>
+              </property>
+             </widget>
+            </item>
+            <item row="2" column="1">
+             <widget class="QLabel" name="label_8">
+              <property name="text">
+               <string>Board</string>
+              </property>
+             </widget>
+            </item>
+            <item row="2" column="2">
+             <widget class="QLabel" name="label_9">
+              <property name="text">
+               <string>Patch</string>
+              </property>
+             </widget>
+            </item>
+            <item row="3" column="0">
+             <widget class="QSpinBox" name="crateIDBox">
+              <property name="maximum">
+               <number>39</number>
+              </property>
+              <property name="value">
+               <number>9</number>
+              </property>
+             </widget>
+            </item>
+            <item row="3" column="1">
+             <widget class="QSpinBox" name="boardIDBox">
+              <property name="maximum">
+               <number>9</number>
+              </property>
+              <property name="value">
+               <number>8</number>
+              </property>
+             </widget>
+            </item>
+            <item row="3" column="2">
+             <widget class="QSpinBox" name="patchIDBox">
+              <property name="maximum">
+               <number>3</number>
+              </property>
+              <property name="value">
+               <number>1</number>
+              </property>
+             </widget>
+            </item>
+           </layout>
           </item>
          </layout>
@@ -198,4 +403,11 @@
           </item>
           <item>
+           <widget class="QLabel" name="currentPixelValue">
+            <property name="text">
+             <string>Current Pixel val.:</string>
+            </property>
+           </widget>
+          </item>
+          <item>
            <widget class="QLabel" name="triggerTypeLabel">
             <property name="text">
@@ -220,24 +432,21 @@
          </layout>
         </item>
-        <item>
-         <layout class="QVBoxLayout" name="verticalLayout_3"/>
-        </item>
        </layout>
       </item>
      </layout>
     </item>
-    <item row="1" column="0">
+    <item row="1" column="1">
      <layout class="QGridLayout" name="gridLayout">
-      <item row="0" column="6">
+      <item row="0" column="7">
        <widget class="QDoubleSpinBox" name="colorRange4">
         <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="decimals">
-         <number>3</number>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="6">
+         <bool>true</bool>
+        </property>
+        <property name="decimals">
+         <number>3</number>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="7">
        <widget class="QDoubleSpinBox" name="greenValue4">
         <property name="decimals">
@@ -246,41 +455,44 @@
        </widget>
       </item>
+      <item row="1" column="7">
+       <widget class="QDoubleSpinBox" name="redValue4">
+        <property name="decimals">
+         <number>3</number>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="7">
+       <widget class="QDoubleSpinBox" name="blueValue4">
+        <property name="decimals">
+         <number>3</number>
+        </property>
+       </widget>
+      </item>
       <item row="1" column="6">
-       <widget class="QDoubleSpinBox" name="redValue4">
-        <property name="decimals">
-         <number>3</number>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="7">
-       <widget class="QPushButton" name="playPauseButton">
-        <property name="text">
-         <string>Play/Pause</string>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="6">
-       <widget class="QDoubleSpinBox" name="blueValue4">
-        <property name="decimals">
-         <number>3</number>
+       <widget class="QDoubleSpinBox" name="redValue3">
+        <property name="decimals">
+         <number>3</number>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="8">
+       <widget class="QPushButton" name="loadNewFileButton">
+        <property name="toolTip">
+         <string>Load a new fits file</string>
+        </property>
+        <property name="text">
+         <string>Load New File</string>
         </property>
        </widget>
       </item>
       <item row="1" column="5">
-       <widget class="QDoubleSpinBox" name="redValue3">
-        <property name="decimals">
-         <number>3</number>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="7">
-       <widget class="QPushButton" name="loadNewFileButton">
-        <property name="text">
-         <string>Load New File</string>
+       <widget class="QDoubleSpinBox" name="redValue2">
+        <property name="decimals">
+         <number>3</number>
         </property>
        </widget>
       </item>
       <item row="1" column="4">
-       <widget class="QDoubleSpinBox" name="redValue2">
+       <widget class="QDoubleSpinBox" name="redValue1">
         <property name="decimals">
          <number>3</number>
@@ -289,5 +501,5 @@
       </item>
       <item row="1" column="3">
-       <widget class="QDoubleSpinBox" name="redValue1">
+       <widget class="QDoubleSpinBox" name="redValue0">
         <property name="decimals">
          <number>3</number>
@@ -296,11 +508,4 @@
       </item>
       <item row="1" column="2">
-       <widget class="QDoubleSpinBox" name="redValue0">
-        <property name="decimals">
-         <number>3</number>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
        <widget class="QLabel" name="label_20">
         <property name="text">
@@ -312,5 +517,5 @@
        </widget>
       </item>
-      <item row="0" column="1">
+      <item row="0" column="2">
        <widget class="QLabel" name="label_21">
         <property name="text">
@@ -322,5 +527,5 @@
        </widget>
       </item>
-      <item row="2" column="1">
+      <item row="2" column="2">
        <widget class="QLabel" name="label_22">
         <property name="text">
@@ -332,5 +537,5 @@
        </widget>
       </item>
-      <item row="3" column="1">
+      <item row="3" column="2">
        <widget class="QLabel" name="label_23">
         <property name="text">
@@ -342,15 +547,15 @@
        </widget>
       </item>
-      <item row="0" column="2">
+      <item row="0" column="3">
        <widget class="QDoubleSpinBox" name="colorRange0">
         <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="decimals">
-         <number>3</number>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="2">
+         <bool>true</bool>
+        </property>
+        <property name="decimals">
+         <number>3</number>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="3">
        <widget class="QDoubleSpinBox" name="greenValue0">
         <property name="decimals">
@@ -359,5 +564,5 @@
        </widget>
       </item>
-      <item row="3" column="2">
+      <item row="3" column="3">
        <widget class="QDoubleSpinBox" name="blueValue0">
         <property name="decimals">
@@ -366,5 +571,5 @@
        </widget>
       </item>
-      <item row="0" column="3">
+      <item row="0" column="4">
        <widget class="QDoubleSpinBox" name="colorRange1">
         <property name="decimals">
@@ -373,5 +578,5 @@
        </widget>
       </item>
-      <item row="2" column="3">
+      <item row="2" column="4">
        <widget class="QDoubleSpinBox" name="greenValue1">
         <property name="decimals">
@@ -380,5 +585,5 @@
        </widget>
       </item>
-      <item row="3" column="3">
+      <item row="3" column="4">
        <widget class="QDoubleSpinBox" name="blueValue1">
         <property name="decimals">
@@ -387,5 +592,5 @@
        </widget>
       </item>
-      <item row="0" column="4">
+      <item row="0" column="5">
        <widget class="QDoubleSpinBox" name="colorRange2">
         <property name="decimals">
@@ -394,5 +599,5 @@
        </widget>
       </item>
-      <item row="2" column="4">
+      <item row="2" column="5">
        <widget class="QDoubleSpinBox" name="greenValue2">
         <property name="decimals">
@@ -401,5 +606,5 @@
        </widget>
       </item>
-      <item row="3" column="4">
+      <item row="3" column="5">
        <widget class="QDoubleSpinBox" name="blueValue2">
         <property name="decimals">
@@ -408,5 +613,5 @@
        </widget>
       </item>
-      <item row="0" column="5">
+      <item row="0" column="6">
        <widget class="QDoubleSpinBox" name="colorRange3">
         <property name="decimals">
@@ -415,5 +620,5 @@
        </widget>
       </item>
-      <item row="2" column="5">
+      <item row="2" column="6">
        <widget class="QDoubleSpinBox" name="greenValue3">
         <property name="decimals">
@@ -422,5 +627,5 @@
        </widget>
       </item>
-      <item row="3" column="5">
+      <item row="3" column="6">
        <widget class="QDoubleSpinBox" name="blueValue3">
         <property name="decimals">
@@ -429,5 +634,5 @@
        </widget>
       </item>
-      <item row="3" column="7">
+      <item row="3" column="8">
        <layout class="QHBoxLayout" name="horizontalLayout">
         <item>
@@ -443,4 +648,10 @@
         <item>
          <widget class="QDoubleSpinBox" name="slicesPerSecValue">
+          <property name="toolTip">
+           <string>Number of slices to display per seconds</string>
+          </property>
+          <property name="minimum">
+           <double>1.000000000000000</double>
+          </property>
           <property name="maximum">
            <double>1000.000000000000000</double>
@@ -450,5 +661,5 @@
           </property>
           <property name="value">
-           <double>1.000000000000000</double>
+           <double>100.000000000000000</double>
           </property>
          </widget>
@@ -456,5 +667,5 @@
        </layout>
       </item>
-      <item row="1" column="7">
+      <item row="1" column="8">
        <layout class="QHBoxLayout" name="horizontalLayout_4">
         <item>
@@ -467,4 +678,7 @@
         <item>
          <widget class="QPushButton" name="eventsMinusButton">
+          <property name="toolTip">
+           <string>Step backwards in events</string>
+          </property>
           <property name="text">
            <string>-</string>
@@ -474,4 +688,7 @@
         <item>
          <widget class="QSpinBox" name="eventsStepBox">
+          <property name="toolTip">
+           <string>Number of events to skip at each step</string>
+          </property>
           <property name="minimum">
            <number>1</number>
@@ -490,4 +707,7 @@
            </sizepolicy>
           </property>
+          <property name="toolTip">
+           <string>Step forward in events</string>
+          </property>
           <property name="text">
            <string>+</string>
@@ -499,4 +719,7 @@
       <item row="0" column="0">
        <widget class="QCheckBox" name="drawImpulseCheckBox">
+        <property name="toolTip">
+         <string>Whether the impulse of the current pixel should be drawn below the camera or not</string>
+        </property>
         <property name="layoutDirection">
          <enum>Qt::RightToLeft</enum>
@@ -509,4 +732,7 @@
       <item row="3" column="0">
        <widget class="QCheckBox" name="drawBlurCheckBox">
+        <property name="toolTip">
+         <string>Draw the pixels blurred (for having &quot;nice&quot;, non-scientific images).</string>
+        </property>
         <property name="layoutDirection">
          <enum>Qt::RightToLeft</enum>
@@ -519,4 +745,7 @@
       <item row="1" column="0">
        <widget class="QCheckBox" name="drawPatchCheckBox">
+        <property name="toolTip">
+         <string>Whether the pixels clustering should be drawn or not</string>
+        </property>
         <property name="layoutDirection">
          <enum>Qt::RightToLeft</enum>
@@ -525,8 +754,97 @@
          <string>Draw Patches</string>
         </property>
+        <property name="checked">
+         <bool>true</bool>
+        </property>
         <property name="tristate">
          <bool>false</bool>
         </property>
        </widget>
+      </item>
+      <item row="2" column="0">
+       <widget class="QCheckBox" name="loopOverCurrentEventBox">
+        <property name="toolTip">
+         <string>Whether the animation should loop over the current event, or continue to the next event</string>
+        </property>
+        <property name="layoutDirection">
+         <enum>Qt::RightToLeft</enum>
+        </property>
+        <property name="text">
+         <string>Loop event</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QPushButton" name="autoScaleColor">
+        <property name="toolTip">
+         <string>Rescale the coloring to match the values of the current event</string>
+        </property>
+        <property name="text">
+         <string>AutoScale !</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1">
+       <widget class="QRadioButton" name="entireCameraScale">
+        <property name="toolTip">
+         <string>Use the entire camera to do the scaling</string>
+        </property>
+        <property name="layoutDirection">
+         <enum>Qt::RightToLeft</enum>
+        </property>
+        <property name="text">
+         <string>entire camera</string>
+        </property>
+        <property name="checked">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="1">
+       <widget class="QRadioButton" name="currentPixelScale">
+        <property name="toolTip">
+         <string>Use the current pixel only to do the scaling</string>
+        </property>
+        <property name="layoutDirection">
+         <enum>Qt::RightToLeft</enum>
+        </property>
+        <property name="text">
+         <string>current pixel</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="8">
+       <layout class="QHBoxLayout" name="horizontalLayout_5">
+        <item>
+         <widget class="QPushButton" name="slicesMinusMinusButton">
+          <property name="toolTip">
+           <string>Step backward one slice</string>
+          </property>
+          <property name="text">
+           <string>Slice--</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QPushButton" name="playPauseButton">
+          <property name="toolTip">
+           <string>Play/Pause events animation</string>
+          </property>
+          <property name="text">
+           <string>Play/Pause</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QPushButton" name="slicesPlusPlusButton">
+          <property name="toolTip">
+           <string>Step forward one slice</string>
+          </property>
+          <property name="text">
+           <string>Slice++</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
       </item>
      </layout>
@@ -536,4 +854,10 @@
  </widget>
  <customwidgets>
+  <customwidget>
+   <class>QwtPlot</class>
+   <extends>QFrame</extends>
+   <header>qwt_plot.h</header>
+   <container>1</container>
+  </customwidget>
   <customwidget>
    <class>QGLWidget</class>
