Histogram2D.h add save/load graphic cuts into/from txt file
This commit is contained in:
parent
839b3d2a58
commit
c8e032390a
507
Histogram2D.h
507
Histogram2D.h
|
@ -19,173 +19,7 @@ const QList<QPair<QColor, QString>> colorCycle = { {QColor(Qt::red), "Red"},
|
||||||
class Histogram2D : public QCustomPlot{
|
class Histogram2D : public QCustomPlot{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Histogram2D(QString title, QString xLabel, QString yLabel, int xbin, double xmin, double xmax, int ybin, double ymin, double ymax, QWidget * parent = nullptr) : QCustomPlot(parent){
|
Histogram2D(QString title, QString xLabel, QString yLabel, int xbin, double xmin, double xmax, int ybin, double ymin, double ymax, QWidget * parent = nullptr);
|
||||||
// DebugPrint("%s", "Histogram2D");
|
|
||||||
for( int i = 0; i < 3; i ++ ){
|
|
||||||
for( int j = 0; j < 3; j ++ ){
|
|
||||||
box[i][j] = nullptr;
|
|
||||||
txt[i][j] = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
isChannelMap = false;
|
|
||||||
tickStep = 1; // only used when isChannelMap = true
|
|
||||||
isLogZ = false;
|
|
||||||
|
|
||||||
axisRect()->setupFullAxesBox(true);
|
|
||||||
xAxis->setLabel(xLabel);
|
|
||||||
yAxis->setLabel(yLabel);
|
|
||||||
|
|
||||||
colorMap = new QCPColorMap(xAxis, yAxis);
|
|
||||||
Rebin(xbin, xmin, xmax, ybin, ymin, ymax);
|
|
||||||
colorMap->setInterpolate(false);
|
|
||||||
|
|
||||||
QCPTextElement *titleEle = new QCPTextElement(this, title, QFont("sans", 12));
|
|
||||||
plotLayout()->insertRow(0);
|
|
||||||
plotLayout()->addElement(0, 0, titleEle);
|
|
||||||
|
|
||||||
colorScale = new QCPColorScale(this);
|
|
||||||
plotLayout()->addElement(1, 1, colorScale);
|
|
||||||
colorScale->setType(QCPAxis::atRight);
|
|
||||||
colorMap->setColorScale(colorScale);
|
|
||||||
|
|
||||||
|
|
||||||
QCPColorGradient color;
|
|
||||||
color.setNanHandling(QCPColorGradient::NanHandling::nhNanColor);
|
|
||||||
color.setNanColor(QColor("white"));
|
|
||||||
color.clearColorStops();
|
|
||||||
// color.setColorStopAt( 0.0, QColor("white" ));
|
|
||||||
color.setColorStopAt( 0.0, QColor("purple" ));
|
|
||||||
color.setColorStopAt( 0.2, QColor("blue"));
|
|
||||||
color.setColorStopAt( 0.4, QColor("cyan"));
|
|
||||||
color.setColorStopAt( 0.6, QColor("green"));
|
|
||||||
color.setColorStopAt( 0.8, QColor("yellow"));
|
|
||||||
color.setColorStopAt( 1.0, QColor("red"));
|
|
||||||
colorMap->setGradient(color);
|
|
||||||
|
|
||||||
double xPosStart = 0.02;
|
|
||||||
double xPosStep = 0.07;
|
|
||||||
double yPosStart = 0.02;
|
|
||||||
double yPosStep = 0.05;
|
|
||||||
|
|
||||||
for( int i = 0; i < 3; i ++ ){
|
|
||||||
for( int j = 0; j < 3; j ++ ){
|
|
||||||
box[i][j] = new QCPItemRect(this);
|
|
||||||
|
|
||||||
box[i][j]->topLeft->setType(QCPItemPosition::ptAxisRectRatio);
|
|
||||||
box[i][j]->topLeft->setCoords(xPosStart + xPosStep*i, yPosStart + yPosStep*j);
|
|
||||||
box[i][j]->bottomRight->setType(QCPItemPosition::ptAxisRectRatio);
|
|
||||||
box[i][j]->bottomRight->setCoords(xPosStart + xPosStep*(i+1), yPosStart + yPosStep*(j+1));
|
|
||||||
|
|
||||||
txt[i][j] = new QCPItemText(this);
|
|
||||||
txt[i][j]->setPositionAlignment(Qt::AlignLeft);
|
|
||||||
txt[i][j]->position->setType(QCPItemPosition::ptAxisRectRatio);
|
|
||||||
txt[i][j]->position->setCoords(xPosStart + xPosStep/2 + xPosStep*i, yPosStart + yPosStep*j);;
|
|
||||||
txt[i][j]->setText("0");
|
|
||||||
txt[i][j]->setFont(QFont("Helvetica", 9));
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cutList.clear();
|
|
||||||
cutEntryList.clear();
|
|
||||||
|
|
||||||
rescaleAxes();
|
|
||||||
|
|
||||||
usingMenu = false;
|
|
||||||
isDrawCut = false;
|
|
||||||
tempCutID = -1;
|
|
||||||
numCut = 0;
|
|
||||||
lastPlottableID = -1;
|
|
||||||
|
|
||||||
line = new QCPItemLine(this);
|
|
||||||
line->setPen(QPen(Qt::gray, 1, Qt::DashLine));
|
|
||||||
line->setVisible(false);
|
|
||||||
|
|
||||||
isBusy = false;
|
|
||||||
|
|
||||||
connect(this, &QCustomPlot::mouseMove, this, [=](QMouseEvent *event){
|
|
||||||
double x = xAxis->pixelToCoord(event->pos().x());
|
|
||||||
double y = yAxis->pixelToCoord(event->pos().y());
|
|
||||||
int xI, yI;
|
|
||||||
colorMap->data()->coordToCell(x, y, &xI, &yI);
|
|
||||||
double z = colorMap->data()->cell(xI, yI);
|
|
||||||
|
|
||||||
QString coordinates = QString("X: %1, Y: %2, Z: %3").arg(x).arg(y).arg(z);
|
|
||||||
QToolTip::showText(event->globalPosition().toPoint(), coordinates, this);
|
|
||||||
|
|
||||||
//when drawing cut, show dashhed line
|
|
||||||
if( isDrawCut && tempCut.size() > 0 ){
|
|
||||||
line->end->setCoords(x,y);
|
|
||||||
line->setVisible(true);
|
|
||||||
replot();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
connect(this, &QCustomPlot::mousePress, this, [=](QMouseEvent * event){
|
|
||||||
|
|
||||||
if (event->button() == Qt::LeftButton && !usingMenu && !isDrawCut){
|
|
||||||
setSelectionRectMode(QCP::SelectionRectMode::srmZoom);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event->button() == Qt::LeftButton && isDrawCut){
|
|
||||||
|
|
||||||
oldMouseX = xAxis->pixelToCoord(event->pos().x());
|
|
||||||
oldMouseY = yAxis->pixelToCoord(event->pos().y());
|
|
||||||
|
|
||||||
tempCut.push_back(QPointF(oldMouseX,oldMouseY));
|
|
||||||
|
|
||||||
line->start->setCoords(oldMouseX, oldMouseY);
|
|
||||||
line->end->setCoords(oldMouseX, oldMouseY);
|
|
||||||
line->setVisible(true);
|
|
||||||
|
|
||||||
DrawCut();
|
|
||||||
}
|
|
||||||
|
|
||||||
//^================= right click
|
|
||||||
if (event->button() == Qt::RightButton) rightMouseClickMenu(event);
|
|
||||||
});
|
|
||||||
|
|
||||||
//connect( this, &QCustomPlot::mouseDoubleClick, this, [=](QMouseEvent *event){
|
|
||||||
connect( this, &QCustomPlot::mouseDoubleClick, this, [=](){
|
|
||||||
if( isDrawCut) {
|
|
||||||
tempCut.push_back(tempCut[0]);
|
|
||||||
DrawCut();
|
|
||||||
isDrawCut = false;
|
|
||||||
line->setVisible(false);
|
|
||||||
|
|
||||||
plottableIDList.push_back(plottableCount() -1 );
|
|
||||||
|
|
||||||
cutNameList.push_back("Cut-" + QString::number(cutList.count()));
|
|
||||||
cutEntryList.push_back(0);
|
|
||||||
|
|
||||||
QCPItemText * text = new QCPItemText(this);
|
|
||||||
text->setText(cutNameList.last());
|
|
||||||
text->position->setCoords(tempCut[0].rx(), tempCut[0].ry());
|
|
||||||
int colorID = tempCutID% colorCycle.count();
|
|
||||||
text->setColor(colorCycle[colorID].first);
|
|
||||||
cutTextIDList.push_back(itemCount() - 1);
|
|
||||||
|
|
||||||
replot();
|
|
||||||
|
|
||||||
cutList.push_back(tempCut);
|
|
||||||
cutIDList.push_back(tempCutID);
|
|
||||||
|
|
||||||
// qDebug() << "----------- end of create cut";
|
|
||||||
// qDebug() << " cutIDList " << cutIDList ;
|
|
||||||
// qDebug() << "plottableIDList " << plottableIDList << ", " << plottableCount();
|
|
||||||
// qDebug() << " cutTextIDList " << cutTextIDList << ", " << itemCount();
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
connect(this, &QCustomPlot::mouseRelease, this, [=](){
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
//^===================================
|
|
||||||
|
|
||||||
void SetXTitle(QString xTitle) { xAxis->setLabel(xTitle);}
|
void SetXTitle(QString xTitle) { xAxis->setLabel(xTitle);}
|
||||||
void SetYTitle(QString yTitle) { yAxis->setLabel(yTitle);}
|
void SetYTitle(QString yTitle) { yAxis->setLabel(yTitle);}
|
||||||
|
@ -194,25 +28,7 @@ public:
|
||||||
|
|
||||||
void SetChannelMap(bool onOff, int tickStep = 1) { isChannelMap = onOff; this->tickStep = tickStep;}
|
void SetChannelMap(bool onOff, int tickStep = 1) { isChannelMap = onOff; this->tickStep = tickStep;}
|
||||||
|
|
||||||
void UpdatePlot(){
|
void UpdatePlot(){ colorMap->rescaleDataRange(); replot(); }
|
||||||
// QCPColorGradient color;
|
|
||||||
// color.clearColorStops();
|
|
||||||
// color.setNanColor(QColor("white"));
|
|
||||||
// // color.setColorStopAt( 0.0, QColor("white" ));
|
|
||||||
// // color.setColorStopAt( 1.0/entry[1][1], QColor("purple" ));
|
|
||||||
// color.setColorStopAt( 0.0, QColor("purple" ));
|
|
||||||
// color.setColorStopAt( 0.2, QColor("blue"));
|
|
||||||
// color.setColorStopAt( 0.4, QColor("cyan"));
|
|
||||||
// color.setColorStopAt( 0.6, QColor("green"));
|
|
||||||
// color.setColorStopAt( 0.8, QColor("yellow"));
|
|
||||||
// color.setColorStopAt( 1.0, QColor("red"));
|
|
||||||
// colorMap->setGradient(color);
|
|
||||||
|
|
||||||
colorMap->rescaleDataRange();
|
|
||||||
|
|
||||||
replot();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Clear(); // Clear Data and histrogram
|
void Clear(); // Clear Data and histrogram
|
||||||
|
|
||||||
void Fill(double x, double y);
|
void Fill(double x, double y);
|
||||||
|
@ -232,6 +48,9 @@ public:
|
||||||
double GetYMin() const {return yMin;}
|
double GetYMin() const {return yMin;}
|
||||||
double GetYMax() const {return yMax;}
|
double GetYMax() const {return yMax;}
|
||||||
|
|
||||||
|
void SaveCuts(QString cutFileName);
|
||||||
|
void LoadCuts(QString cutFileName);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double xMin, xMax, yMin, yMax;
|
double xMin, xMax, yMin, yMax;
|
||||||
int xBin, yBin;
|
int xBin, yBin;
|
||||||
|
@ -252,15 +71,15 @@ private:
|
||||||
|
|
||||||
QPolygonF tempCut;
|
QPolygonF tempCut;
|
||||||
int tempCutID; // only incresing;
|
int tempCutID; // only incresing;
|
||||||
QList<QPolygonF> cutList;
|
|
||||||
QList<int> cutIDList;
|
|
||||||
int numCut;
|
int numCut;
|
||||||
|
QList<QPolygonF> cutList;
|
||||||
|
QList<QString> cutNameList; // name of the cut
|
||||||
|
QList<int> cutEntryList; // number of entry inside the cut.
|
||||||
|
QList<int> cutIDList; // ID of the cut
|
||||||
|
QList<int> cutTextIDList; //
|
||||||
|
QList<int> plottableIDList;
|
||||||
bool isDrawCut;
|
bool isDrawCut;
|
||||||
int lastPlottableID;
|
int lastPlottableID;
|
||||||
QList<int> cutTextIDList;
|
|
||||||
QList<int> plottableIDList;
|
|
||||||
QList<QString> cutNameList;
|
|
||||||
QList<int> cutEntryList;
|
|
||||||
|
|
||||||
QCPItemLine * line;
|
QCPItemLine * line;
|
||||||
double oldMouseX = 0.0, oldMouseY = 0.0;
|
double oldMouseX = 0.0, oldMouseY = 0.0;
|
||||||
|
@ -275,6 +94,174 @@ private:
|
||||||
//^###############################################
|
//^###############################################
|
||||||
//^###############################################
|
//^###############################################
|
||||||
|
|
||||||
|
inline Histogram2D::Histogram2D(QString title, QString xLabel, QString yLabel, int xbin, double xmin, double xmax, int ybin, double ymin, double ymax, QWidget * parent) : QCustomPlot(parent){
|
||||||
|
// DebugPrint("%s", "Histogram2D");
|
||||||
|
for( int i = 0; i < 3; i ++ ){
|
||||||
|
for( int j = 0; j < 3; j ++ ){
|
||||||
|
box[i][j] = nullptr;
|
||||||
|
txt[i][j] = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isChannelMap = false;
|
||||||
|
tickStep = 1; // only used when isChannelMap = true
|
||||||
|
isLogZ = false;
|
||||||
|
|
||||||
|
axisRect()->setupFullAxesBox(true);
|
||||||
|
xAxis->setLabel(xLabel);
|
||||||
|
yAxis->setLabel(yLabel);
|
||||||
|
|
||||||
|
colorMap = new QCPColorMap(xAxis, yAxis);
|
||||||
|
Rebin(xbin, xmin, xmax, ybin, ymin, ymax);
|
||||||
|
colorMap->setInterpolate(false);
|
||||||
|
|
||||||
|
QCPTextElement *titleEle = new QCPTextElement(this, title, QFont("sans", 12));
|
||||||
|
plotLayout()->insertRow(0);
|
||||||
|
plotLayout()->addElement(0, 0, titleEle);
|
||||||
|
|
||||||
|
colorScale = new QCPColorScale(this);
|
||||||
|
plotLayout()->addElement(1, 1, colorScale);
|
||||||
|
colorScale->setType(QCPAxis::atRight);
|
||||||
|
colorMap->setColorScale(colorScale);
|
||||||
|
|
||||||
|
|
||||||
|
QCPColorGradient color;
|
||||||
|
color.setNanHandling(QCPColorGradient::NanHandling::nhNanColor);
|
||||||
|
color.setNanColor(QColor("white"));
|
||||||
|
color.clearColorStops();
|
||||||
|
// color.setColorStopAt( 0.0, QColor("white" ));
|
||||||
|
color.setColorStopAt( 0.0, QColor("purple" ));
|
||||||
|
color.setColorStopAt( 0.2, QColor("blue"));
|
||||||
|
color.setColorStopAt( 0.4, QColor("cyan"));
|
||||||
|
color.setColorStopAt( 0.6, QColor("green"));
|
||||||
|
color.setColorStopAt( 0.8, QColor("yellow"));
|
||||||
|
color.setColorStopAt( 1.0, QColor("red"));
|
||||||
|
colorMap->setGradient(color);
|
||||||
|
|
||||||
|
double xPosStart = 0.02;
|
||||||
|
double xPosStep = 0.07;
|
||||||
|
double yPosStart = 0.02;
|
||||||
|
double yPosStep = 0.05;
|
||||||
|
|
||||||
|
for( int i = 0; i < 3; i ++ ){
|
||||||
|
for( int j = 0; j < 3; j ++ ){
|
||||||
|
box[i][j] = new QCPItemRect(this);
|
||||||
|
|
||||||
|
box[i][j]->topLeft->setType(QCPItemPosition::ptAxisRectRatio);
|
||||||
|
box[i][j]->topLeft->setCoords(xPosStart + xPosStep*i, yPosStart + yPosStep*j);
|
||||||
|
box[i][j]->bottomRight->setType(QCPItemPosition::ptAxisRectRatio);
|
||||||
|
box[i][j]->bottomRight->setCoords(xPosStart + xPosStep*(i+1), yPosStart + yPosStep*(j+1));
|
||||||
|
|
||||||
|
txt[i][j] = new QCPItemText(this);
|
||||||
|
txt[i][j]->setPositionAlignment(Qt::AlignLeft);
|
||||||
|
txt[i][j]->position->setType(QCPItemPosition::ptAxisRectRatio);
|
||||||
|
txt[i][j]->position->setCoords(xPosStart + xPosStep/2 + xPosStep*i, yPosStart + yPosStep*j);;
|
||||||
|
txt[i][j]->setText("0");
|
||||||
|
txt[i][j]->setFont(QFont("Helvetica", 9));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cutList.clear();
|
||||||
|
cutEntryList.clear();
|
||||||
|
|
||||||
|
rescaleAxes();
|
||||||
|
|
||||||
|
usingMenu = false;
|
||||||
|
isDrawCut = false;
|
||||||
|
tempCutID = -1;
|
||||||
|
numCut = 0;
|
||||||
|
lastPlottableID = -1;
|
||||||
|
|
||||||
|
line = new QCPItemLine(this);
|
||||||
|
line->setPen(QPen(Qt::gray, 1, Qt::DashLine));
|
||||||
|
line->setVisible(false);
|
||||||
|
|
||||||
|
isBusy = false;
|
||||||
|
|
||||||
|
connect(this, &QCustomPlot::mouseMove, this, [=](QMouseEvent *event){
|
||||||
|
double x = xAxis->pixelToCoord(event->pos().x());
|
||||||
|
double y = yAxis->pixelToCoord(event->pos().y());
|
||||||
|
int xI, yI;
|
||||||
|
colorMap->data()->coordToCell(x, y, &xI, &yI);
|
||||||
|
double z = colorMap->data()->cell(xI, yI);
|
||||||
|
|
||||||
|
QString coordinates = QString("X: %1, Y: %2, Z: %3").arg(x).arg(y).arg(z);
|
||||||
|
QToolTip::showText(event->globalPosition().toPoint(), coordinates, this);
|
||||||
|
|
||||||
|
//when drawing cut, show dashhed line
|
||||||
|
if( isDrawCut && tempCut.size() > 0 ){
|
||||||
|
line->end->setCoords(x,y);
|
||||||
|
line->setVisible(true);
|
||||||
|
replot();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(this, &QCustomPlot::mousePress, this, [=](QMouseEvent * event){
|
||||||
|
|
||||||
|
if (event->button() == Qt::LeftButton && !usingMenu && !isDrawCut){
|
||||||
|
setSelectionRectMode(QCP::SelectionRectMode::srmZoom);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event->button() == Qt::LeftButton && isDrawCut){
|
||||||
|
|
||||||
|
oldMouseX = xAxis->pixelToCoord(event->pos().x());
|
||||||
|
oldMouseY = yAxis->pixelToCoord(event->pos().y());
|
||||||
|
|
||||||
|
tempCut.push_back(QPointF(oldMouseX,oldMouseY));
|
||||||
|
|
||||||
|
line->start->setCoords(oldMouseX, oldMouseY);
|
||||||
|
line->end->setCoords(oldMouseX, oldMouseY);
|
||||||
|
line->setVisible(true);
|
||||||
|
|
||||||
|
DrawCut();
|
||||||
|
}
|
||||||
|
|
||||||
|
//^================= right click
|
||||||
|
if (event->button() == Qt::RightButton) rightMouseClickMenu(event);
|
||||||
|
});
|
||||||
|
|
||||||
|
//connect( this, &QCustomPlot::mouseDoubleClick, this, [=](QMouseEvent *event){
|
||||||
|
connect( this, &QCustomPlot::mouseDoubleClick, this, [=](){
|
||||||
|
if( isDrawCut) {
|
||||||
|
tempCut.push_back(tempCut[0]);
|
||||||
|
DrawCut();
|
||||||
|
isDrawCut = false;
|
||||||
|
line->setVisible(false);
|
||||||
|
|
||||||
|
plottableIDList.push_back(plottableCount() -1 );
|
||||||
|
|
||||||
|
cutNameList.push_back("Cut-" + QString::number(cutList.count()));
|
||||||
|
cutEntryList.push_back(0);
|
||||||
|
|
||||||
|
QCPItemText * text = new QCPItemText(this);
|
||||||
|
text->setText(cutNameList.last());
|
||||||
|
text->position->setCoords(tempCut[0].rx(), tempCut[0].ry());
|
||||||
|
int colorID = tempCutID% colorCycle.count();
|
||||||
|
text->setColor(colorCycle[colorID].first);
|
||||||
|
cutTextIDList.push_back(itemCount() - 1);
|
||||||
|
|
||||||
|
replot();
|
||||||
|
|
||||||
|
cutList.push_back(tempCut);
|
||||||
|
cutIDList.push_back(tempCutID);
|
||||||
|
|
||||||
|
// qDebug() << "----------- end of create cut";
|
||||||
|
// qDebug() << " cutIDList " << cutIDList ;
|
||||||
|
// qDebug() << "plottableIDList " << plottableIDList << ", " << plottableCount();
|
||||||
|
// qDebug() << " cutTextIDList " << cutTextIDList << ", " << itemCount();
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(this, &QCustomPlot::mouseRelease, this, [=](){
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
inline void Histogram2D::Fill(double x, double y){
|
inline void Histogram2D::Fill(double x, double y){
|
||||||
// DebugPrint("%s", "Histogram2D");
|
// DebugPrint("%s", "Histogram2D");
|
||||||
if( isBusy ) return;
|
if( isBusy ) return;
|
||||||
|
@ -391,7 +378,7 @@ inline void Histogram2D::ClearAllCuts(){
|
||||||
inline void Histogram2D::PrintCutEntry() const{
|
inline void Histogram2D::PrintCutEntry() const{
|
||||||
DebugPrint("%s", "Histogram2D");
|
DebugPrint("%s", "Histogram2D");
|
||||||
if( numCut == 0 ) return;
|
if( numCut == 0 ) return;
|
||||||
printf("=============== There are %d cuts.\n", numCut);
|
printf("=============== There are %d cuts. (%lld, %lld)\n", numCut, cutList.count(), cutEntryList.count());
|
||||||
for( int i = 0; i < cutList.count(); i++){
|
for( int i = 0; i < cutList.count(); i++){
|
||||||
if( cutList[i].isEmpty() ) continue;
|
if( cutList[i].isEmpty() ) continue;
|
||||||
printf("%10s | %d \n", cutNameList[i].toStdString().c_str(), cutEntryList[i]);
|
printf("%10s | %d \n", cutNameList[i].toStdString().c_str(), cutEntryList[i]);
|
||||||
|
@ -423,7 +410,7 @@ inline void Histogram2D::DrawCut(){
|
||||||
}
|
}
|
||||||
replot();
|
replot();
|
||||||
|
|
||||||
//qDebug() << "Plottable count : " << plottableCount() << ", cutList.count :" << cutList.count() << ", cutID :" << lastPlottableID;
|
// qDebug() << "Plottable count : " << plottableCount() << ", cutList.count :" << cutList.count() << ", cutID :" << lastPlottableID;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Histogram2D::rightMouseClickMenu(QMouseEvent * event){
|
inline void Histogram2D::rightMouseClickMenu(QMouseEvent * event){
|
||||||
|
@ -439,8 +426,11 @@ inline void Histogram2D::rightMouseClickMenu(QMouseEvent * event){
|
||||||
QAction * a2 = menu->addAction("Clear hist.");
|
QAction * a2 = menu->addAction("Clear hist.");
|
||||||
QAction * a3 = menu->addAction("Toggle Stat.");
|
QAction * a3 = menu->addAction("Toggle Stat.");
|
||||||
QAction * a4 = menu->addAction("Rebin (clear histogram)");
|
QAction * a4 = menu->addAction("Rebin (clear histogram)");
|
||||||
|
QAction * a8 = menu->addAction("Load Cut(s)");
|
||||||
QAction * a5 = menu->addAction("Create a Cut");
|
QAction * a5 = menu->addAction("Create a Cut");
|
||||||
|
QAction * a7 = nullptr;
|
||||||
if( numCut > 0 ) {
|
if( numCut > 0 ) {
|
||||||
|
a7 = menu->addAction("Save Cut(s)");
|
||||||
menu->addSeparator();
|
menu->addSeparator();
|
||||||
menu->addAction("Add/Edit names to Cuts");
|
menu->addAction("Add/Edit names to Cuts");
|
||||||
menu->addAction("Clear all Cuts");
|
menu->addAction("Clear all Cuts");
|
||||||
|
@ -575,6 +565,27 @@ inline void Histogram2D::rightMouseClickMenu(QMouseEvent * event){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( selectedAction == a8 ){ // load Cuts
|
||||||
|
QString filePath = QFileDialog::getOpenFileName(this,
|
||||||
|
"Load Cuts from File",
|
||||||
|
QDir::homePath(),
|
||||||
|
"Text file (*.txt)");
|
||||||
|
|
||||||
|
if (!filePath.isEmpty()) LoadCuts(filePath);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if( selectedAction == a7 ){ // Save Cuts
|
||||||
|
|
||||||
|
QString filePath = QFileDialog::getSaveFileName(this,
|
||||||
|
"Save Cuts to File",
|
||||||
|
QDir::homePath(),
|
||||||
|
"Text file (*.txt)");
|
||||||
|
|
||||||
|
if (!filePath.isEmpty()) SaveCuts(filePath);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -674,5 +685,113 @@ inline void Histogram2D::rightMouseClickRebin(){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void Histogram2D::SaveCuts(QString cutFileName){
|
||||||
|
|
||||||
|
QFile file(cutFileName);
|
||||||
|
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
||||||
|
QTextStream out(&file);
|
||||||
|
|
||||||
|
// Define the text to write
|
||||||
|
QStringList lines;
|
||||||
|
|
||||||
|
for( int i = 0; i < cutList.size(); i++){
|
||||||
|
lines << "====== "+ cutNameList[i];
|
||||||
|
for( int pt = 0 ; pt < cutList[i].size(); pt ++){
|
||||||
|
lines << QString::number(cutList[i][pt].rx(), 'g', 5) + "," + QString::number(cutList[i][pt].ry(), 'g', 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lines << "#===== End of File";
|
||||||
|
|
||||||
|
// Write each line to the file
|
||||||
|
for (const QString &line : lines) out << line << "\n";
|
||||||
|
|
||||||
|
// Close the file
|
||||||
|
file.close();
|
||||||
|
qDebug() << "File written successfully to" << cutFileName;
|
||||||
|
}else{
|
||||||
|
qWarning() << "Unable to open file" << cutFileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Histogram2D::LoadCuts(QString cutFileName){
|
||||||
|
|
||||||
|
QFile file(cutFileName);
|
||||||
|
QString cutNameTemp;
|
||||||
|
|
||||||
|
// Open the file in read mode
|
||||||
|
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
|
QTextStream in(&file);
|
||||||
|
|
||||||
|
ClearAllCuts();
|
||||||
|
tempCut.clear();
|
||||||
|
|
||||||
|
// Read each line and append to the QStringList
|
||||||
|
|
||||||
|
while (!in.atEnd()) {
|
||||||
|
QString line = in.readLine();
|
||||||
|
|
||||||
|
if( line.contains("======") ){
|
||||||
|
if( !tempCut.isEmpty() ) {
|
||||||
|
DrawCut();
|
||||||
|
plottableIDList.push_back(plottableCount() -1 );
|
||||||
|
cutNameList.push_back(cutNameTemp);
|
||||||
|
cutEntryList.push_back(0);
|
||||||
|
QCPItemText * text = new QCPItemText(this);
|
||||||
|
text->setText(cutNameList.last());
|
||||||
|
text->position->setCoords(tempCut[0].rx(), tempCut[0].ry());
|
||||||
|
int colorID = tempCutID% colorCycle.count();
|
||||||
|
text->setColor(colorCycle[colorID].first);
|
||||||
|
cutTextIDList.push_back(itemCount() - 1);
|
||||||
|
// cutList.push_back(tempCut);
|
||||||
|
cutIDList.push_back(tempCutID);
|
||||||
|
}
|
||||||
|
tempCut.clear();
|
||||||
|
tempCutID ++;
|
||||||
|
numCut ++;
|
||||||
|
|
||||||
|
int spacePos = line.indexOf(' ');
|
||||||
|
cutNameTemp = line.mid(spacePos + 1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( line.contains("#==") ) {
|
||||||
|
DrawCut();
|
||||||
|
plottableIDList.push_back(plottableCount() -1 );
|
||||||
|
cutNameList.push_back(cutNameTemp);
|
||||||
|
cutEntryList.push_back(0);
|
||||||
|
QCPItemText * text = new QCPItemText(this);
|
||||||
|
text->setText(cutNameList.last());
|
||||||
|
text->position->setCoords(tempCut[0].rx(), tempCut[0].ry());
|
||||||
|
int colorID = tempCutID% colorCycle.count();
|
||||||
|
text->setColor(colorCycle[colorID].first);
|
||||||
|
cutTextIDList.push_back(itemCount() - 1);
|
||||||
|
cutList.push_back(tempCut);
|
||||||
|
cutIDList.push_back(tempCutID);
|
||||||
|
break;
|
||||||
|
}else{
|
||||||
|
QStringList haha = line.split(",");
|
||||||
|
// qDebug() << haha;
|
||||||
|
tempCut.push_back(QPointF(haha[0].toFloat(), haha[1].toFloat()));
|
||||||
|
DrawCut();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close the file
|
||||||
|
file.close();
|
||||||
|
qDebug() << "File read successfully from" << cutFileName;
|
||||||
|
|
||||||
|
// PrintCutEntry();
|
||||||
|
// DrawCut();
|
||||||
|
replot();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
qWarning() << "Unable to open file" << cutFileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
Loading…
Reference in New Issue
Block a user