diff --git a/src/musredit_qt6/mupp/PmuppGui.cpp b/src/musredit_qt6/mupp/PmuppGui.cpp index c1965a337..c911d6898 100644 --- a/src/musredit_qt6/mupp/PmuppGui.cpp +++ b/src/musredit_qt6/mupp/PmuppGui.cpp @@ -1955,8 +1955,9 @@ void PmuppGui::createMacro() fout << " gStyle->SetCanvasColor(TColor::GetColor(255,255,255)); // canvas bkg to white" << Qt::endl; fout << Qt::endl; fout << " Int_t nn=0, i=0;" << Qt::endl; - fout << " Double_t null[512];" << Qt::endl; fout << " Double_t xx[512];" << Qt::endl; + fout << " Double_t xxPosErr[512];" << Qt::endl; + fout << " Double_t xxNegErr[512];" << Qt::endl; fout << " Double_t yy[512];" << Qt::endl; fout << " Double_t yyPosErr[512];" << Qt::endl; fout << " Double_t yyNegErr[512];" << Qt::endl; @@ -1966,7 +1967,7 @@ void PmuppGui::createMacro() QString collName(""); QString xLabel(""), yLabel(""); char gLabel[128]; - QVector xx, yy, yyPosErr, yyNegErr; + QVector xx, xxPosErr, xxNegErr, yy, yyPosErr, yyNegErr; double xMin=1.0e10, xMax=-1.0e10, yMin=1.0e10, yMax=-1.0e10; bool ok; for (int i=0; i(xx.size(), 0.0); + xxNegErr = getNegErr(collName, xLabel, ok); + if (!ok) + xxNegErr = QVector(xx.size(), 0.0); getMinMax(xx, xMin, xMax); // a couple of x-vector specifics if ((xLabel == "dataT") || (xLabel == "dataE")) @@ -2019,14 +2026,18 @@ void PmuppGui::createMacro() snprintf(gLabel, sizeof(gLabel), "g_%d_%d", i, j); fout << " nn = " << xx.size() << ";" << Qt::endl; fout << Qt::endl; - fout << " // null value vector" << Qt::endl; - for (int k=0; k xx, yy, yyPosErr, yyNegErr; + QVector xx, xxPosErr, xxNegErr, yy, yyPosErr, yyNegErr; QVector< QVector > yyy, yyyPosErr, yyyNegErr; bool ok; @@ -2165,13 +2176,19 @@ void PmuppGui::plot() xLabel = fXY[i].getXlabel(); pos = xLabel.indexOf(" (-"); xLabel.remove(pos, xLabel.length()-pos); - // get x-vector + // get x-vector and x-errors (x-errors are optional; use 0.0 if not available) xx = getValues(collName, xLabel, ok); if (!ok) { QString msg = QString("Couldn't get x-axis data from '%1', coll: '%2'").arg(xLabel).arg(collName); QMessageBox::critical(this, "ERROR", msg); return; } + xxPosErr = getPosErr(collName, xLabel, ok); + if (!ok) + xxPosErr = QVector(xx.size(), 0.0); + xxNegErr = getNegErr(collName, xLabel, ok); + if (!ok) + xxNegErr = QVector(xx.size(), 0.0); xLabel = substituteDefaultLabels(xLabel); fout << "xLabel: " << xLabel << ", "; @@ -2253,9 +2270,9 @@ void PmuppGui::plot() } } - // data + // data: x, xPosErr, xNegErr, y1, y1PosErr, y1NegErr, ... for (int j=0; jSetCanvasColor(TColor::GetColor(255,255,255)); // canvas bkg to white" << Qt::endl; fout << Qt::endl; fout << " Int_t nn=0, i=0;" << Qt::endl; - fout << " Double_t null[512];" << Qt::endl; fout << " Double_t xx[512];" << Qt::endl; + fout << " Double_t xxPosErr[512];" << Qt::endl; + fout << " Double_t xxNegErr[512];" << Qt::endl; fout << " Double_t yy[512];" << Qt::endl; fout << " Double_t yyPosErr[512];" << Qt::endl; fout << " Double_t yyNegErr[512];" << Qt::endl; fout << Qt::endl; // write data - QVector xx, yy, yyPosErr, yyNegErr; + QVector xx, xxPosErr, xxNegErr, yy, yyPosErr, yyNegErr; QString collName; int count=0; double x_min=0.0, x_max=0.0, x_min_new=0.0, x_max_new=0.0, y_min=0.0, y_max=0.0, y_min_new=0.0, y_max_new=0.0; @@ -812,6 +813,19 @@ int PmuppScript::macro(const QString str, const QString plotFln) std::vector xVal = fVarHandler[idx].getValues(); QVector qvec(xVal.begin(), xVal.end()); xx = qvec; + // use variable errors for x + std::vector xErr = fVarHandler[idx].getErrors(); + QVector qvecE(xErr.begin(), xErr.end()); + xxPosErr = qvecE; + xxNegErr = qvecE; + } else { + // x-errors from parameter data handler (0.0 if not available) + xxPosErr = fParamDataHandler->GetPosErr(collName, fPlotInfo[i].xLabel); + if (xxPosErr.size() == 0) + xxPosErr = QVector(xx.size(), 0.0); + xxNegErr = fParamDataHandler->GetNegErr(collName, fPlotInfo[i].xLabel); + if (xxNegErr.size() == 0) + xxNegErr = QVector(xx.size(), 0.0); } // get x-axis min/max minMax(xx, x_min, x_max); @@ -858,14 +872,18 @@ int PmuppScript::macro(const QString str, const QString plotFln) } fout << " // " << ++count << ". data set" << Qt::endl; fout << " nn = " << xx.size() << ";" << Qt::endl; - fout << " // null-values" << Qt::endl; - for (int k=0; kGetEntries() != (noOfDataTokens-1)*3+1) { + if (tok->GetEntries() != noOfDataTokens*3) { std::cerr << "**ERROR** number of token in data line (" << tok->GetEntries() << ") is inconsistent with no of labels (" << noOfDataTokens << ")." << std::endl; fin.close(); return -4; @@ -431,7 +431,7 @@ int PMuppCanvas::ReadPlotData(const Char_t *fln) data.yValue.resize(noOfDataTokens-1); // raw data point - // x-value + // x-value (token 0) ostr = dynamic_cast(tok->At(0)); str = ostr->GetString(); if (!str.IsFloat()) { @@ -441,9 +441,29 @@ int PMuppCanvas::ReadPlotData(const Char_t *fln) } data.xValue.push_back(str.Atof()); - // y-value(s) + // pos x error-value (token 1) + ostr = dynamic_cast(tok->At(1)); + str = ostr->GetString(); + if (!str.IsFloat()) { + std::cerr << "**ERROR** token found in data line is not a number (" << str << ")." << std::endl; + fin.close(); + return -5; + } + data.xErrPos.push_back(str.Atof()); + + // neg x error-value (token 2) + ostr = dynamic_cast(tok->At(2)); + str = ostr->GetString(); + if (!str.IsFloat()) { + std::cerr << "**ERROR** token found in data line is not a number (" << str << ")." << std::endl; + fin.close(); + return -5; + } + data.xErrNeg.push_back(str.Atof()); + + // y-value(s): starting at token 3, each group of 3 = y, yposErr, ynegErr Int_t idx=0; - for (Int_t i=1; iGetEntries(); i+=3) { + for (Int_t i=3; iGetEntries(); i+=3) { // y-value ostr = dynamic_cast(tok->At(i)); str = ostr->GetString(); @@ -525,6 +545,8 @@ void PMuppCanvas::InitDataCollection(PDataCollection &coll) coll.xLabel = TString(""); coll.yLabel.clear(); coll.xValue.clear(); + coll.xErrPos.clear(); + coll.xErrNeg.clear(); coll.yValue.clear(); } @@ -553,7 +575,8 @@ void PMuppCanvas::UpdateGraphs() gg = new TGraphAsymmErrors(fPlotData[i].xValue.size()); for (UInt_t k=0; kSetPoint(k, fPlotData[i].xValue[k], fPlotData[i].yValue[j][k].y); - gg->SetPointError(k, 0.0, 0.0, fabs(fPlotData[i].yValue[j][k].eYneg), fPlotData[i].yValue[j][k].eYpos); + gg->SetPointError(k, fabs(fPlotData[i].xErrNeg[k]), fPlotData[i].xErrPos[k], + fabs(fPlotData[i].yValue[j][k].eYneg), fPlotData[i].yValue[j][k].eYpos); // set marker style and size if (idxS < fMarkerStyleList.size()) { gg->SetMarkerStyle(fMarkerStyleList[idxS]); @@ -666,12 +689,14 @@ void PMuppCanvas::ExportData() std::ofstream fout(fi.fFilename, std::ios_base::out); // write header for (int i=0; i > yValue; ///< y-values with errors for each dataset };