71#include <QProcessEnvironment>
103 fAdmin = std::make_unique<PmuppAdmin>();
140 std::cerr << std::endl <<
"**ERROR** couldn't invoke data handler ..." << std::endl << std::endl;
146 for (
int i=0; i<
fScript.size(); i++) {
149 if (cmd.startsWith(
"loadPath")) {
151 }
else if (cmd.startsWith(
"savePath")) {
153 }
else if (cmd.startsWith(
"load ")) {
155 }
else if (cmd.startsWith(
"selectAll")) {
157 }
else if (cmd.startsWith(
"select ")) {
159 }
else if (cmd.startsWith(
"x")) {
161 }
else if (cmd.startsWith(
"y")) {
163 }
else if (cmd.startsWith(
"norm")) {
165 }
else if (cmd.startsWith(
"plot")) {
167 }
else if (cmd.startsWith(
"macro")) {
169 }
else if (cmd.startsWith(
"var")) {
171 }
else if (cmd.startsWith(
"col")) {
173 }
else if (cmd.startsWith(
"<python>")) {
176 std::cerr <<
"**ERROR** found unkown script command '" << cmd.toLatin1().constData() <<
"'." << std::endl << std::endl;
216 str = str.remove(
"loadPath ");
219 tok = str.split(
"/", Qt::SkipEmptyParts);
222 QProcessEnvironment procEnv = QProcessEnvironment::systemEnvironment();
223 QString path = QString(
"");
224 for (
int i=0; i<tok.size(); i++) {
226 if (str.startsWith(
"$")) {
227 str = str.remove(
"$");
228 QString var = procEnv.value(str,
"");
262 str = str.remove(
"savePath ");
265 tok = str.split(
"/", Qt::SkipEmptyParts);
268 QProcessEnvironment procEnv = QProcessEnvironment::systemEnvironment();
269 QString path = QString(
"");
270 for (
int i=0; i<tok.size(); i++) {
272 if (str.startsWith(
"$")) {
273 str = str.remove(
"$");
274 QString var = procEnv.value(str,
"");
304 fln = fln.remove(
"load ");
311 QString errorMsg(
"");
339 QStringList tok = cmd.split(
' ', Qt::SkipEmptyParts);
340 if (tok.size() != 2) {
341 std::cerr << std::endl <<
"**ERROR** wrong 'select' command syntax." << std::endl << std::endl;
346 int ival = tok[1].toInt(&ok);
349 std::cerr << std::endl <<
"**ERROR** try to select a collection with index " << ival <<
", which is >= # collections (" <<
fParamDataHandler->GetNoOfCollections() <<
")." << std::endl << std::endl;
356 std::cerr << std::endl <<
"**ERROR** couldn't find collection '" << tok[1].toLatin1().constData() <<
"'." << std::endl << std::endl;
360 std::cerr << std::endl <<
"**ERROR** try to select a collection with index " << ival <<
", which is >= # collections (" <<
fParamDataHandler->GetNoOfCollections() <<
")." << std::endl << std::endl;
387 std::cerr << std::endl <<
"**ERROR** no collections present, hence it is not possible to select them." << std::endl << std::endl;
422 QString cmd = str, label;
423 QStringList tok = cmd.split(
' ', Qt::SkipEmptyParts);
425 if (tok.size() != 2) {
426 std::cerr << std::endl <<
"**ERROR** in addX: number of tokens missmatch." << std::endl << std::endl;
429 label = tok[1].trimmed();
433 std::cerr << std::endl <<
"**ERROR** in addX. addX called without previous 'select' command." << std::endl << std::endl;
441 bool foundInColl(
true), foundInVar(
true);
442 QString collName(
"");
456 if (!foundInColl && !foundInVar) {
457 std::cerr << std::endl <<
"**ERROR** couldn't find '" << label.toLatin1().constData() <<
"' in collection '" << collName.toLatin1().constData() <<
"'," << std::endl;
458 std::cerr <<
" nor is it a defined variable" << std::endl << std::endl;
474 std::cerr << std::endl <<
"**ERROR** in addX: selected collection couldn't be found ..." << std::endl << std::endl;
478 bool foundInColl(
true), foundInVar(
true);
479 QString collName(
"");
489 if (!foundInColl && !foundInVar) {
490 std::cerr << std::endl <<
"**ERROR** couldn't find '" << label.toLatin1().constData() <<
"' in collection '" << collName.toLatin1().constData() <<
"'," << std::endl;
491 std::cerr <<
" nor is it a defined variable" << std::endl << std::endl;
536 QVector<QString> label;
537 QStringList tok = cmd.split(
' ', Qt::SkipEmptyParts);
539 if (tok.size() < 2) {
540 std::cerr << std::endl <<
"**ERROR** in addY: number of tokens < 2." << std::endl << std::endl;
544 for (
int i=1; i<tok.size(); i++)
545 label.push_back(tok[i].trimmed());
549 std::cerr << std::endl <<
"**ERROR** in addY. addY called without previous 'select' command." << std::endl << std::endl;
554 bool foundInColl(
true), foundInVar(
true);
556 QString collName(
"");
559 for (
int j=0; j<label.size(); j++) {
569 for (
int i=0; i<label.size(); i++) {
577 if (!foundInColl && !foundInVar) {
578 std::cerr << std::endl <<
"**ERROR** couldn't find '" << label[idx].toLatin1().constData() <<
"' in collection '" << collName.toLatin1().constData() <<
"'," << std::endl;
579 std::cerr <<
" nor is it a defined variable" << std::endl << std::endl;
594 std::cerr << std::endl <<
"**ERROR** in addY: selected collection couldn't be found ..." << std::endl << std::endl;
599 bool foundInColl(
true), foundInVar(
true);
601 QString collName(
"");
602 for (
int i=0; i<label.size(); i++) {
611 for (
int i=0; i<label.size(); i++) {
619 if (!foundInColl && !foundInVar) {
620 std::cerr << std::endl <<
"**ERROR** couldn't find '" << label[idx].toLatin1().constData() <<
"' in collection '" << collName.toLatin1().constData() <<
"'," << std::endl;
621 std::cerr <<
" nor is it a defined variable" << std::endl << std::endl;
665 QStringList tok = cmd.split(
' ', Qt::SkipEmptyParts);
666 if (tok.size() != 2) {
667 std::cerr << std::endl <<
"**ERROR** in plot: number of tokens != 2." << std::endl << std::endl;
671 QString macroOut =
fSavePath +
"__out.C";
673 if (
macro(QString(
"macro " + macroOut), flnOut) != 0) {
674 std::cerr << std::endl <<
"**ERROR** temporary macro generation failed." << std::endl << std::endl;
679 QProcess *proc =
new QProcess(
this);
680 if (proc ==
nullptr) {
681 std::cerr << std::endl <<
"**ERROR** couldn't invoke root.exe in batch mode." << std::endl << std::endl;
686 QString exec_cmd =
"root.exe";
692 QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
693#if defined(Q_OS_DARWIN)
694 env.insert(
"DYLD_LIBRARY_PATH", env.value(
"ROOTSYS") +
"/lib:/usr/local/lib:" + env.value(
"DYLD_LIBRARY_PATH"));
696 env.insert(
"LD_LIBRARY_PATH", env.value(
"ROOTSYS") +
"/lib:" + env.value(
"LD_LIBRARY_PATH"));
698 proc->setProcessEnvironment(env);
700 proc->start(exec_cmd, arg);
701 if (!proc->waitForStarted()) {
702 std::cerr << std::endl <<
"**ERROR** Could not execute the output command: " << exec_cmd.toLatin1().constData() << std::endl << std::endl;
703 QFile::remove(macroOut);
706 proc->waitForFinished();
708 QFile::remove(macroOut);
753 QVector<PmuppMarker> marker =
fAdmin->getMarkers();
754 QVector<PmuppColor> color =
fAdmin->getColors();
757 QStringList tok = cmd.split(
' ', Qt::SkipEmptyParts);
758 if (tok.size() != 2) {
759 std::cerr << std::endl <<
"**ERROR** macro command with wrong number of arguments (" << tok.size() <<
")." << std::endl << std::endl;
762 QString macroName = tok[1].trimmed();
766 if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
767 std::cerr << std::endl <<
"**ERROR** Couldn't open macro file for writting." << std::endl << std::endl;
771 QTextStream fout(&file);
774 fout <<
"// --------------------------" << Qt::endl;
775 fout <<
"// " << fln.toLatin1().constData() << Qt::endl;
776 fout <<
"// " << QDateTime::currentDateTime().toString(
"yy/MM/dd - HH:mm:ss") << Qt::endl;
777 fout <<
"// --------------------------" << Qt::endl;
778 fout <<
"{" << Qt::endl;
779 fout <<
" gROOT->Reset();" << Qt::endl;
781 fout <<
" gStyle->SetOptTitle(0);" << Qt::endl;
782 fout <<
" gStyle->SetOptDate(0);" << Qt::endl;
783 fout <<
" gStyle->SetPadColor(TColor::GetColor(255,255,255)); // pad bkg to white" << Qt::endl;
784 fout <<
" gStyle->SetCanvasColor(TColor::GetColor(255,255,255)); // canvas bkg to white" << Qt::endl;
786 fout <<
" Int_t nn=0, i=0;" << Qt::endl;
787 fout <<
" Double_t xx[512];" << Qt::endl;
788 fout <<
" Double_t xxPosErr[512];" << Qt::endl;
789 fout <<
" Double_t xxNegErr[512];" << Qt::endl;
790 fout <<
" Double_t yy[512];" << Qt::endl;
791 fout <<
" Double_t yyPosErr[512];" << Qt::endl;
792 fout <<
" Double_t yyNegErr[512];" << Qt::endl;
796 QVector<double> xx, xxPosErr, xxNegErr, yy, yyPosErr, yyNegErr;
799 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;
800 double dval, y_min_norm=1.0e10;
805 if (xx.size() == 0) {
808 std::cerr << std::endl;
809 std::cerr <<
"**ERROR** Couldn't get x-label '" <<
fPlotInfo[i].xLabel.toLatin1().data() <<
"'." << std::endl;
810 std::cerr <<
" This should never happens." << std::endl;
813 std::vector<double> xVal =
fVarHandler[idx].getValues();
814 QVector<double> qvec(xVal.begin(), xVal.end());
817 std::vector<double> xErr =
fVarHandler[idx].getErrors();
818 QVector<double> qvecE(xErr.begin(), xErr.end());
824 if (xxPosErr.size() == 0)
825 xxPosErr = QVector<double>(xx.size(), 0.0);
827 if (xxNegErr.size() == 0)
828 xxNegErr = QVector<double>(xx.size(), 0.0);
836 if (x_min < x_min_new)
838 if (y_max > x_max_new)
842 for (
int j=0; j<
fPlotInfo[i].yLabel.size(); j++) {
846 if (yy.size() == 0) {
849 std::cerr << std::endl;
850 std::cerr <<
"**ERROR** Couldn't get y-label '" <<
fPlotInfo[i].yLabel[j].toLatin1().data() <<
"'." << std::endl;
851 std::cerr <<
" This should never happens." << std::endl;
854 std::vector<double> yVal =
fVarHandler[idx].getValues();
855 QVector<double> qvecV(yVal.begin(), yVal.end());
857 std::vector<double> yErr =
fVarHandler[idx].getErrors();
858 QVector<double> qvecE(yErr.begin(), yErr.end());
868 if (y_min < y_min_new)
870 if (y_max > y_max_new)
873 fout <<
" // " << ++count <<
". data set" << Qt::endl;
874 fout <<
" nn = " << xx.size() <<
";" << Qt::endl;
875 fout <<
" // x-values" << Qt::endl;
876 for (
int k=0; k<xx.size(); k++) {
877 fout <<
" xx[" << k <<
"]=" << xx[k] <<
";" << Qt::endl;
879 fout <<
" // xxPosErr-values" << Qt::endl;
880 for (
int k=0; k<xxPosErr.size(); k++) {
881 fout <<
" xxPosErr[" << k <<
"]=" << fabs(xxPosErr[k]) <<
";" << Qt::endl;
883 fout <<
" // xxNegErr-values" << Qt::endl;
884 for (
int k=0; k<xxNegErr.size(); k++) {
885 fout <<
" xxNegErr[" << k <<
"]=" << fabs(xxNegErr[k]) <<
";" << Qt::endl;
887 fout <<
" // y-values" << Qt::endl;
888 for (
int k=0; k<yy.size(); k++) {
892 if (dval < y_min_norm)
895 fout <<
" yy[" << k <<
"]=" << dval <<
";" << Qt::endl;
897 fout <<
" // yyNegErr-values" << Qt::endl;
898 for (
int k=0; k<yyNegErr.size(); k++) {
899 dval = fabs(yyNegErr[k]);
902 fout <<
" yyNegErr[" << k <<
"]=" << dval <<
";" << Qt::endl;
904 fout <<
" // yyPosErr-values" << Qt::endl;
905 for (
int k=0; k<yyPosErr.size(); k++) {
906 dval = fabs(yyPosErr[k]);
909 fout <<
" yyPosErr[" << k <<
"]=" << dval <<
";" << Qt::endl;
912 fout <<
" TGraphAsymmErrors *g_" << i <<
"_" << j <<
" = new TGraphAsymmErrors(nn, xx, yy, xxNegErr, xxPosErr, yyNegErr, yyPosErr);" << Qt::endl;
924 x_max = x_max_new + 0.05*diff;
925 diff = y_max_new - y_min_new;
926 y_min = y_min_new - 0.05 * diff;
927 y_max = y_max_new + 0.05 * diff;
929 diff = 1.0 - y_min_norm;
930 y_min = y_min_norm - 0.05 * diff;
931 y_max = 1.0 + 0.05 * diff;
935 fout <<
" //**********" << Qt::endl;
936 fout <<
" // plotting " << Qt::endl;
937 fout <<
" //**********" << Qt::endl;
938 fout <<
" TCanvas *c1 = new TCanvas(\"c1\", \"" << macroName.toLatin1().constData() <<
"\", 10, 10, 600, 700);" << Qt::endl;
944 for (
int j=0; j<
fPlotInfo[i].yLabel.size(); j++) {
946 if (count < marker.size()) {
947 fout <<
" g_" << i <<
"_" << j <<
"->SetMarkerStyle(" << marker[count].getMarker() <<
");" << Qt::endl;
948 fout <<
" g_" << i <<
"_" << j <<
"->SetMarkerSize(" << marker[count].getMarkerSize() <<
");" << Qt::endl;
949 color[count].getRGB(rr, gg, bb);
950 fout <<
" g_" << i <<
"_" << j <<
"->SetMarkerColor(TColor::GetColor(" << rr <<
"," << gg <<
"," << bb <<
"));" << Qt::endl;
951 fout <<
" g_" << i <<
"_" << j <<
"->SetLineColor(TColor::GetColor(" << rr <<
"," << gg <<
"," << bb <<
"));" << Qt::endl;
953 fout <<
" g_" << i <<
"_" << j <<
"->SetMarkerStyle(20);" << Qt::endl;
954 fout <<
" g_" << i <<
"_" << j <<
"->SetMarkerSize(1.3);" << Qt::endl;
955 fout <<
" g_" << i <<
"_" << j <<
"->SetMarkerColor(TColor::GetColor(0,0,0));" << Qt::endl;
956 fout <<
" g_" << i <<
"_" << j <<
"->SetLineColor(TColor::GetColor(0,0,0));" << Qt::endl;
958 fout <<
" g_" << i <<
"_" << j <<
"->SetFillColor(kWhite);" << Qt::endl;
959 fout <<
" g_" << i <<
"_" << j <<
"->GetXaxis()->SetTitle(\"" <<
getNicerLabel(
fPlotInfo[0].xLabel).toLatin1().data() <<
"\");" << Qt::endl;
960 fout <<
" g_" << i <<
"_" << j <<
"->GetXaxis()->SetTitleSize(0.05);" << Qt::endl;
961 fout <<
" g_" << i <<
"_" << j <<
"->GetXaxis()->SetDecimals(kTRUE);" << Qt::endl;
962 fout <<
" g_" << i <<
"_" << j <<
"->GetXaxis()->SetLimits(" << x_min <<
"," << x_max <<
");" << Qt::endl;
963 fout <<
" g_" << i <<
"_" << j <<
"->GetYaxis()->SetTitle(\"" <<
getNicerLabel(
fPlotInfo[0].yLabel[0]).toLatin1().data() <<
"\");" << Qt::endl;
964 fout <<
" g_" << i <<
"_" << j <<
"->GetYaxis()->SetTitleSize(0.05);" << Qt::endl;
965 fout <<
" g_" << i <<
"_" << j <<
"->GetYaxis()->SetTitleOffset(1.30);" << Qt::endl;
966 fout <<
" g_" << i <<
"_" << j <<
"->GetYaxis()->SetRangeUser(" << y_min <<
"," << y_max <<
");" << Qt::endl;
967 fout <<
" g_" << i <<
"_" << j <<
"->Draw(\"AP\");" << Qt::endl;
969 if (count < marker.size()) {
970 fout <<
" g_" << i <<
"_" << j <<
"->SetMarkerStyle(" << marker[count].getMarker() <<
");" << Qt::endl;
971 fout <<
" g_" << i <<
"_" << j <<
"->SetMarkerSize(" << marker[count].getMarkerSize() <<
");" << Qt::endl;
972 color[count].getRGB(rr, gg, bb);
973 fout <<
" g_" << i <<
"_" << j <<
"->SetMarkerColor(TColor::GetColor(" << rr <<
"," << gg <<
"," << bb <<
"));" << Qt::endl;
974 fout <<
" g_" << i <<
"_" << j <<
"->SetLineColor(TColor::GetColor(" << rr <<
"," << gg <<
"," << bb <<
"));" << Qt::endl;
976 fout <<
" g_" << i <<
"_" << j <<
"->SetMarkerStyle(20);" << Qt::endl;
977 fout <<
" g_" << i <<
"_" << j <<
"->SetMarkerSize(1.3);" << Qt::endl;
978 fout <<
" g_" << i <<
"_" << j <<
"->SetMarkerColor(TColor::GetColor(0,0,0));" << Qt::endl;
979 fout <<
" g_" << i <<
"_" << j <<
"->SetLineColor(TColor::GetColor(0,0,0));" << Qt::endl;
981 fout <<
" g_" << i <<
"_" << j <<
"->SetFillColor(kWhite);" << Qt::endl;
982 fout <<
" g_" << i <<
"_" << j <<
"->Draw(\"Psame\");" << Qt::endl;
987 fout <<
" c1->SetMargin(0.15, 0.05, 0.12, 0.05);" << Qt::endl;
988 fout <<
" c1->Update();" << Qt::endl;
989 if (!plotFln.isEmpty()) {
991 fout <<
" c1->SaveAs(\"" << plotFln.toLatin1().constData() <<
"\");" << Qt::endl;
993 fout <<
"}" << Qt::endl;
1036 tok = str.split(
' ', Qt::SkipEmptyParts);
1037 if (tok[1].endsWith(
"Err"))
1045 if (tok.last() ==
"python") {
1049 if (pyBlock.isEmpty()) {
1050 std::cerr <<
"**ERROR** variable '" << tok[1].toLatin1().data()
1051 <<
"' declared as python, but no <python> ... </python> block was found." << std::endl;
1056 std::vector<PmuppCollection*> allColl;
1060 pyBlock.toLatin1().data(), tok[1].toLatin1().data(), allColl);
1063 QString mupp_err = QString(
"%1/.musrfit/mupp/mupp_err.log").arg(QString(qgetenv(
"HOME")));
1064 QFile fout(mupp_err);
1065 if (fout.open(QIODevice::ReadOnly | QIODevice::Text)) {
1067 while (!fout.atEnd()) {
1068 msg = fout.readLine();
1069 std::cerr << msg.toLatin1().data();
1071 QFile::remove(mupp_err);
1080 QString varErr = QString(
"%1%2").arg(tok[1]).arg(
"Err");
1081 QString varErrCmd(
"");
1082 for (
int i=0; i<
fScript.size(); i++) {
1083 if (
fScript.at(i).contains(varErr, Qt::CaseSensitive)) {
1089 std::string parse_str = str.toLatin1().data();
1090 if (!varErrCmd.isEmpty()) {
1092 parse_str += varErrCmd.toLatin1().data();
1098 QString mupp_err = QString(
"%1/.musrfit/mupp/mupp_err.log").arg(QString(qgetenv(
"HOME")));
1101 QFile fout(mupp_err);
1102 if (fout.open(QIODevice::ReadOnly | QIODevice::Text)) {
1104 while (!fout.atEnd()) {
1105 msg = fout.readLine();
1106 std::cerr << msg.toLatin1().data();
1109 QFile::remove(mupp_err);
1133 bool result =
false;
1134 for (
int i=0; i<coll->
GetRun(0).GetNoOfParam(); i++) {
1158 bool result =
false;
1209 for (
int i=0; i<dvec.size(); i++) {
1245 QString nice = label;
1247 if (label ==
"dataE") {
1249 }
else if (label ==
"dataT") {
1251 }
else if (label ==
"dataB") {
1253 }
else if (!label.compare(
"sigma", Qt::CaseInsensitive)) {
1255 nice =
"#sigma/max(#sigma)";
1257 nice =
"#sigma (1/#mus)";
1258 }
else if (!label.compare(
"lambda", Qt::CaseInsensitive)) {
1260 nice =
"#lambda/max(#lambda)";
1262 nice =
"#lambda (1/#mus)";
1263 }
else if (!label.compare(
"rate", Qt::CaseInsensitive)) {
1265 nice =
"Rate/max(Rate)";
1267 nice =
"Rate (1/#mus)";
1268 }
else if (!label.compare(
"alpha_LR", Qt::CaseInsensitive)) {
1270 nice =
"#alpha_{LR}/max(#alpha_{LR})";
1272 nice =
"#alpha_{LR}";
1273 }
else if (!label.compare(
"alpha_TB", Qt::CaseInsensitive)) {
1275 nice =
"#alpha_{TB}/max(#alpha_{TB})";
1277 nice =
"#alpha_{TB}";
1280 nice = label +
"/ max(" + label +
")";
1304 for (
int i=start_idx+1; i<
fScript.size(); i++) {
1305 if (
fScript.at(i).startsWith(
"<python>"))
1329 for (
int i=0; i<
fScript.size(); i++) {
1331 if (cmd.startsWith(
"col")) {
1333 tok = cmd.split(
' ', Qt::SkipEmptyParts);
1334 if (tok[3] == var_name) {
1335 idx = tok[1].toInt(&ok);
Scripting interface for mupp batch processing.
The PVarHandler class handles variable parsing, evaluation, and data management.
bool isValid()
Checks if the parsing and evaluation were successful.
Represents a collection of related experimental runs.
PmuppRun GetRun(unsigned int idx)
Retrieves a run from a collection by index.
QString GetName()
Gets the collection name.
QString GetName()
Gets the parameter name.
PmuppParam GetParam(unsigned int idx)
Retrieves a parameter from a run by index.
PmuppPlotEntry fPlotEntry
single plot configuration (for specific selection)
QString fSavePath
directory path for saving output files
void setSavePath(const QString cmd)
Sets the save path for output files.
int getCollectionIndex(const QString var_name)
Gets the collection index associated with a variable.
QVector< PmuppPlotEntry > fPlotInfo
vector of all plot configurations (for all selections)
int select(const QString str)
Selects a specific collection for plotting.
int fSelected
selection state: -2=none, -1=all, >=0=specific index
QString getPythonBlock(int start_idx=-1)
Returns the verbatim <python> ... </python> block of the script.
int addX(const QString str)
Adds a parameter to the X-axis.
std::unique_ptr< PmuppAdmin > fAdmin
administration object for configuration
QString fLoadPath
directory path for loading input data files
PmuppScript(QStringList script)
Constructor. Initializes the script interpreter.
QString getNicerLabel(const QString label)
Converts parameter labels to prettier ROOT format.
int addY(const QString str)
Adds one or more parameters to the Y-axis.
void minMax(QVector< double > dvec, double &min, double &max)
Finds minimum and maximum values in a data vector.
void setLoadPath(const QString cmd)
Sets the load path for input data files.
int macro(const QString str, const QString plotFln="")
Generates a ROOT macro for plotting.
int executeScript()
Executes all script commands sequentially.
int plot(const QString str)
Creates a plot file by generating and executing a ROOT macro.
QVector< PVarHandler > fVarHandler
vector of variable expression handlers
int selectAll()
Selects all loaded collections for plotting.
int var_cmd(const QString str, int script_idx=-1)
Processes a variable definition command.
QStringList fScript
list of script commands to execute
bool foundLabel(PmuppCollection *coll, const QString label)
Checks if a parameter label exists in a collection.
int loadCollection(const QString str)
Loads a data collection from file.
void finished()
Signal emitted when script execution completes.
int getVarIndex(const QString var)
Gets the index of a variable in the handler vector.
std::unique_ptr< PParamDataHandler > fParamDataHandler
handler for parameter data collections
bool foundVariable(const QString var)
Checks if a variable is defined in the variable handler.
bool fNorm
normalization flag (true = normalize Y-data to max value)