Skip to content
Snippets Groups Projects
plotwindow.cpp 13.09 KiB
#include "plotwindow.h"
#include <QDebug>
#include <QDateTime>

QPlotWindow::QPlotWindow(QWidget *parent, const Setup* config_, PlotData* plotdata_)
    : QMainWindow(parent),
      config(config_),
      ui(new Ui::PlotWindow),
      plotdata(plotdata_)
{
    ui->setupUi(this);
    ui->imageCanvas->setID(1);
    ui->spectrumCanvas->setID(2);
    // hide asic and channel boxes
    // for image and spectrum canvas
    ui->imageCanvas->hideBoxes();
    ui->spectrumCanvas->hideBoxes();

    ui->LGCanvas->setID(3);
    ui->HGCanvas->setID(4);

    connect(ui->actionStart, &QAction::triggered, this, &QPlotWindow::handleStart);
    connect(ui->actionPause, &QAction::triggered, this, &QPlotWindow::handlePause);
    connect(ui->actionStop, &QAction::triggered, this, &QPlotWindow::handleStop);
    connect(ui->actionUnzoom, &QAction::triggered, this, &QPlotWindow::handleUnzoom);
    connect(ui->actionClearAll, &QAction::triggered, this, &QPlotWindow::handleClear);

    connect(ui->imageCanvas, &QCustomCanvas::canvasZoomedout, this, &QPlotWindow::handleUnzoom);
    connect(ui->spectrumCanvas, &QCustomCanvas::canvasZoomedout, this, &QPlotWindow::handleUnzoom);
    connect(ui->imageCanvas, &QCustomCanvas::canvasCleared, this, &QPlotWindow::handleClear);
    connect(ui->spectrumCanvas, &QCustomCanvas::canvasCleared, this, &QPlotWindow::handleClear);
    connect(ui->imageCanvas, &QCustomCanvas::canvasSaved2Image, this, &QPlotWindow::handleScreenshot);
    connect(ui->spectrumCanvas, &QCustomCanvas::canvasSaved2Image, this, &QPlotWindow::handleScreenshot);
    connect(ui->imageCanvas, &QCustomCanvas::canvasSaved2Txt, this, &QPlotWindow::handleSave2txt);
    connect(ui->spectrumCanvas, &QCustomCanvas::canvasSaved2Txt, this, &QPlotWindow::handleSave2txt);

    connect(ui->LGCanvas, &QCustomCanvas::canvasZoomedout, this, &QPlotWindow::handleUnzoom);
    connect(ui->HGCanvas, &QCustomCanvas::canvasZoomedout, this, &QPlotWindow::handleUnzoom);
    connect(ui->LGCanvas, &QCustomCanvas::canvasCleared, this, &QPlotWindow::handleClear);
    connect(ui->HGCanvas, &QCustomCanvas::canvasCleared, this, &QPlotWindow::handleClear);
    connect(ui->LGCanvas, &QCustomCanvas::canvasSaved2Image, this, &QPlotWindow::handleScreenshot);
    connect(ui->HGCanvas, &QCustomCanvas::canvasSaved2Image, this, &QPlotWindow::handleScreenshot);
    connect(ui->LGCanvas, &QCustomCanvas::canvasSaved2Txt, this, &QPlotWindow::handleSave2txt);
    connect(ui->HGCanvas, &QCustomCanvas::canvasSaved2Txt, this, &QPlotWindow::handleSave2txt);

    connect(ui->LGCanvas, &QCustomCanvas::asicChanged, this, &QPlotWindow::handleAsicChanged);
    connect(ui->LGCanvas, &QCustomCanvas::channelChanged, this, &QPlotWindow::handleChannelChanged);
    connect(ui->HGCanvas, &QCustomCanvas::asicChanged, this, &QPlotWindow::handleAsicChanged);
    connect(ui->HGCanvas, &QCustomCanvas::channelChanged, this, &QPlotWindow::handleChannelChanged);



    // draw image
    ui->imageCanvas->Canvas()->cd();
    plotdata->mMutex.lock();
    plotdata->drawImage();
    plotdata->drawCountsLabel();
    plotdata->mMutex.unlock();
    ui->imageCanvas->Canvas()->Modified();
    ui->imageCanvas->Canvas()->Update();

    // draw spectrum
    ui->spectrumCanvas->Canvas()->cd();
    plotdata->mMutex.lock();
    plotdata->drawSpectrum();
    plotdata->mMutex.unlock();
    ui->spectrumCanvas->Canvas()->Modified();
    ui->spectrumCanvas->Canvas()->Update();

    // draw LG spectrum
    ui->LGCanvas->Canvas()->cd();
    plotdata->mMutex.lock();
    plotdata->drawLGspectrum(LGAsicID, LGChannelID);
    plotdata->mMutex.unlock();
    ui->LGCanvas->Canvas()->Modified();
    ui->LGCanvas->Canvas()->Update();

    // draw HG spectrum
    ui->HGCanvas->Canvas()->cd();
    plotdata->mMutex.lock();
    plotdata->drawHGspectrum(HGAsicID, HGChannelID);
    plotdata->mMutex.unlock();
    ui->HGCanvas->Canvas()->Modified();
    ui->HGCanvas->Canvas()->Update();
}


QPlotWindow::~QPlotWindow()
{
    delete ui;
}

void QPlotWindow::handleStart(){
    emit runStarted();
    ui->statusbar->showMessage("Running.");
}
void QPlotWindow::handlePause()
{
    emit runPaused();
    ui->statusbar->showMessage("Paused.");
}
void QPlotWindow::handleStop()
{
    emit runStopped();
    ui->statusbar->showMessage("Stopped.");
}

void QPlotWindow::handleUnzoom(int id)
{
    if (id==0)
    {
        plotdata->unZoomImage();
        plotdata->unZoomSpectrum();
        // TODO
        plotdata->unZoomLG(LGAsicID, LGChannelID);
        plotdata->unZoomHG(HGAsicID, HGChannelID);
    }
    else if (id == ui->imageCanvas->getID())
    {
        plotdata->unZoomImage();
    }
    else if (id ==ui->spectrumCanvas->getID())
    {
        plotdata->unZoomSpectrum();
    }
    else if (id ==ui->LGCanvas->getID())
    {
        plotdata->unZoomLG(LGAsicID, LGChannelID);
    }
    else if (id ==ui->HGCanvas->getID())
    {
        plotdata->unZoomHG(HGAsicID, HGChannelID);
    }
}

void QPlotWindow::reopen()
{
    ui->imageCanvas->Canvas()->cd();
    ui->imageCanvas->Canvas()->Modified();
    ui->imageCanvas->Canvas()->Update();

    ui->spectrumCanvas->Canvas()->cd();
    ui->spectrumCanvas->Canvas()->Modified();
    ui->spectrumCanvas->Canvas()->Update();

    ui->LGCanvas->Canvas()->cd();
    ui->LGCanvas->Canvas()->Modified();
    ui->LGCanvas->Canvas()->Update();

    ui->HGCanvas->Canvas()->cd();
    ui->HGCanvas->Canvas()->Modified();
    ui->HGCanvas->Canvas()->Update();
}

void QPlotWindow::changeEvent(QEvent *e)
{
    if(e->type() == QEvent::WindowStateChange){
        QWindowStateChangeEvent *event = static_cast<QWindowStateChangeEvent *>(e);
        if((event->oldState() & Qt::WindowMaximized)||
                (event->oldState() & Qt::WindowMinimized)||
                (event->oldState() & Qt::WindowNoState &&
                 this->windowState() == Qt::WindowMaximized)){
            if(ui->imageCanvas->Canvas()){
                ui->imageCanvas->Canvas()->Resize();
                ui->imageCanvas->Canvas()->Update();
            }
            if(ui->spectrumCanvas->Canvas()){
                ui->spectrumCanvas->Canvas()->Resize();
                ui->spectrumCanvas->Canvas()->Update();
            }
        }
    }
}

void QPlotWindow::redraw()
{
    plotdata->mMutex.lock();
    ui->imageCanvas->Canvas()->cd();
    std::string strtmp = "Total counts: " + std::to_string(plotdata->counts);
    plotdata->getCountsText()->SetText(0.7, 0.92, strtmp.c_str());
    ui->imageCanvas->Canvas()->Modified();
    ui->imageCanvas->Canvas()->Update();

    ui->spectrumCanvas->Canvas()->cd();
    ui->spectrumCanvas->Canvas()->Modified();
    ui->spectrumCanvas->Canvas()->Update();

    ui->LGCanvas->Canvas()->cd();
    ui->LGCanvas->Canvas()->Modified();
    ui->LGCanvas->Canvas()->Update();

    ui->HGCanvas->Canvas()->cd();
    ui->HGCanvas->Canvas()->Modified();
    ui->HGCanvas->Canvas()->Update();

    plotdata->mMutex.unlock();
}

void QPlotWindow::handleClear(int id){
    if (id==0){
        qDebug() << "Clear all";
        plotdata->clearAll();
    }
    else if (id ==ui->imageCanvas->getID()) {
        qDebug() << "Clear image";
        plotdata->clearImage();
    }
    else if (id ==ui->spectrumCanvas->getID()) {
        qDebug() << "Clear spectrum";
        plotdata->clearSpectrum();
    }
    else if (id == ui->LGCanvas->getID())
    {
        qDebug() << "Clear LG spectrum";
//        plotdata->clearLGSpectrum();
    }
    else if (id == ui->HGCanvas->getID())
    {
        qDebug() << "Clear HG spectrum";
//        plotdata->clearHGSpectrum();
    }
}

void QPlotWindow::handleScreenshot(int id){
    QCustomCanvas* canvas;
    QString key;
    QDateTime dateTime = QDateTime::currentDateTime();
    QString currentDateTime = dateTime.toString("yyyy-MM-dd-HH-mm-ss");
    QString fileName;
    if (id==0){
        qDebug() << "Save all";
        handleScreenshot(ui->imageCanvas->getID());
        handleScreenshot(ui->spectrumCanvas->getID());
        handleScreenshot(ui->LGCanvas->getID());
        handleScreenshot(ui->HGCanvas->getID());
    }
    else if (id ==ui->imageCanvas->getID()) {
        key = "Image";
        canvas = ui->imageCanvas;
        fileName = config->outputDir.absolutePath() + QString("/Screenshot-%1-%2.png").arg(key, currentDateTime);
    }
    else if (id ==ui->spectrumCanvas->getID()) {
        key = "Coincidence-Spectrum";
        canvas = ui->spectrumCanvas;
        fileName = config->outputDir.absolutePath() + QString("/Screenshot-%1-%2.png").arg(key, currentDateTime);
    }
    else if (id ==ui->LGCanvas->getID()) {
        key = "LG-Spectrum";
        canvas = ui->LGCanvas;
        fileName = config->outputDir.absolutePath() +
                QString("/Screenshot-%1-%2-ASIC-%3-Channel-%4.png").arg(key, currentDateTime,
                                                                        QString::number(LGAsicID), QString::number(LGChannelID));
    }
    else if (id ==ui->HGCanvas->getID()) {
        key = "HG-Spectrum";
        canvas = ui->HGCanvas;
        fileName = config->outputDir.absolutePath() +
                QString("/Screenshot-%1-%2-ASIC-%3-Channel-%4.png").arg(key, currentDateTime,
                                                                        QString::number(HGAsicID), QString::number(HGChannelID));
    }
    else
        return;

    qDebug() << QString("Save %1").arg(key);
    plotdata->mMutex.lock();
    canvas->Canvas()->SaveAs(fileName.toLocal8Bit().constData());
    plotdata->mMutex.unlock();
    ui->statusbar->showMessage(QString("%1 saved to: %2").arg(key, fileName));
}

void QPlotWindow::handleSave2txt(int id){

    QDateTime dateTime = QDateTime::currentDateTime();
    QString currentDateTime = dateTime.toString("yyyy-MM-dd-HH-mm-ss");
    if (id==0){
        qDebug() << "Save all";
    }
    else if (id == ui->imageCanvas->getID()) {
        qDebug() << "Save image to txt";
        QString fileName = config->outputDir.absolutePath() + QString("/Image-%1.txt").arg(currentDateTime);
        plotdata->saveImage2txt(fileName.toStdString());
        ui->statusbar->showMessage(QString("Image saved to: %1").arg(fileName));
    }
    else if (id == ui->spectrumCanvas->getID()) {
        qDebug() << "Save coincidence spectrum to txt";
        QString fileName = config->outputDir.absolutePath() + QString("/Coincidence-Spectrum-%1.txt").arg(currentDateTime);
        plotdata->saveSpectrum2txt(fileName.toStdString());
        ui->statusbar->showMessage(QString("Spectrum saved to: %1").arg(fileName));
    }
    else if (id == ui->LGCanvas->getID()) {
        qDebug() << "Save LG spectrum to txt";
        QString fileName = config->outputDir.absolutePath() +
                QString("/LG-Spectrum-%1-ASIC-%2-Channel-%3.txt").arg(currentDateTime,
                                                                      QString::number(LGAsicID), QString::number(LGChannelID));
        plotdata->saveLGSpectrum2txt(fileName.toStdString(), LGAsicID, LGChannelID);
        ui->statusbar->showMessage(QString("LG Spectrum saved to: %1").arg(fileName));
    }
    else if (id == ui->HGCanvas->getID()) {
        qDebug() << "Save HG spectrum to txt";
        QString fileName = config->outputDir.absolutePath() +
                QString("/HG-Spectrum-%1-ASIC-%2-Channel-%3.txt").arg(currentDateTime,
                                                                      QString::number(HGAsicID), QString::number(HGChannelID));
        plotdata->saveHGSpectrum2txt(fileName.toStdString(), HGAsicID, HGChannelID);
        ui->statusbar->showMessage(QString("LG Spectrum saved to: %1").arg(fileName));
    }
}

void QPlotWindow::handleAsicChanged(int id)
{
    if (id == ui->LGCanvas->getID())
    {
        if (ui->LGCanvas->getAsicID() == LGAsicID)
            return;

        LGAsicID = ui->LGCanvas->getAsicID();
        switchLGHG(id);
    }
    else if (id == ui->HGCanvas->getID())
    {
        if (ui->HGCanvas->getAsicID() == HGAsicID)
            return;
        HGAsicID = ui->HGCanvas->getAsicID();
        switchLGHG(id);
    }
}

void QPlotWindow::handleChannelChanged(int id)
{
    if (id == ui->LGCanvas->getID())
    {
        if (ui->LGCanvas->getChannelID() == LGChannelID)
            return;
        LGChannelID = ui->LGCanvas->getChannelID();
        switchLGHG(id);
    }
    else if (id == ui->HGCanvas->getID())
    {
        if (ui->HGCanvas->getChannelID() == HGChannelID)
            return;
        HGChannelID = ui->HGCanvas->getChannelID();
        switchLGHG(id);
    }
}

void QPlotWindow::switchLGHG(int id)
{
    QCustomCanvas* canvas;
    if (id == ui->LGCanvas->getID())
        canvas = ui->LGCanvas;
    else if (id == ui->HGCanvas->getID())
       canvas = ui->HGCanvas;
    else
        return;

    // redraw
    plotdata->mMutex.lock();
    canvas->Canvas()->cd();
    canvas->Canvas()->Clear(); // clear canvas
    // draw new spectrum
    // TODO
    if (id == ui->LGCanvas->getID())
    {
        qDebug() << QString("Draw LG ASIC-%1, Channel-%2").arg(LGAsicID, LGChannelID);
        plotdata->drawLGspectrum(LGAsicID, LGChannelID);
    }
    else if (id == ui->HGCanvas->getID())
    {

        qDebug() << QString("Draw HG ASIC-%1, Channel-%2").arg(HGAsicID, HGChannelID);
        plotdata->drawHGspectrum(HGAsicID, HGChannelID);
    }
    canvas->Canvas()->Modified();
    canvas->Canvas()->Update();
    plotdata->mMutex.unlock();
}