173 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
174 std::cerr << std::endl;
175 std::cerr <<
"*********" << std::endl;
176 std::cerr <<
"**ERROR** couldn't open '" << fln <<
"'." << std::endl;
177 std::cerr <<
"*********" << std::endl;
181 QTextStream fin(&file);
184 bool inPython =
false;
186 while (!fin.atEnd()) {
187 line = fin.readLine();
192 if (!inPython && line.trimmed().startsWith(
"<python>")) {
194 pyBlock = line +
"\n";
198 pyBlock += line +
"\n";
199 if (line.trimmed() ==
"</python>") {
207 line = line.simplified();
210 if (line.startsWith(
"#") || line.startsWith(
"%") || line.startsWith(
"//"))
213 pos = line.indexOf(
"#");
215 line.remove(pos, line.length()-pos);
216 pos = line.indexOf(
"%");
218 line.remove(pos, line.length()-pos);
219 pos = line.indexOf(
"//");
221 line.remove(pos, line.length()-pos);
222 line = line.simplified();
227 std::cerr << std::endl;
228 std::cerr <<
"*********" << std::endl;
229 std::cerr <<
"**ERROR** <python> block not terminated with </python> in '" << fln <<
"'." << std::endl;
230 std::cerr <<
"*********" << std::endl;
295 QVector<QString> var_names;
296 QVector<bool> var_linked;
297 int noOfCollections = 0;
298 for (
int i=0; i<list.size(); i++) {
301 if (str.startsWith(
"loadPath")) {
302 tok = str.split(
' ', Qt::SkipEmptyParts);
303 if (tok.size() < 2) {
304 std::cerr << std::endl;
305 std::cerr <<
"****************" << std::endl;
306 std::cerr <<
"**SYNTAX ERROR** found '" << str.toLatin1().constData() <<
"'. <path> is missing." << std::endl;
307 std::cerr <<
"****************" << std::endl;
313 str = str.remove(
"loadPath ");
314 tok = str.split(
'/');
315 for (
int i=0; i<tok.size(); i++) {
316 if (tok.at(i).startsWith(
"$")) {
318 std::cerr << std::endl;
319 std::cerr <<
"****************" << std::endl;
320 std::cerr <<
"**SYNTAX ERROR** found in command '" << list.at(i).toLatin1().constData() <<
"' an empty bash variable '" << tok.at(i).toLatin1().constData() <<
"'." << std::endl;
321 std::cerr <<
"****************" << std::endl;
326 }
else if (str.startsWith(
"load")) {
327 tok = str.split(
' ', Qt::SkipEmptyParts);
328 if (tok.size() < 2) {
329 std::cerr << std::endl;
330 std::cerr <<
"****************" << std::endl;
331 std::cerr <<
"**SYNTAX ERROR** found '" << str.toLatin1().constData() <<
"'. At least one collection file name is expected." << std::endl;
332 std::cerr <<
"****************" << std::endl;
336 }
else if (str.startsWith(
"x")) {
337 tok = str.split(
' ', Qt::SkipEmptyParts);
338 if (tok.size() != 2) {
339 std::cerr << std::endl;
340 std::cerr <<
"****************" << std::endl;
341 std::cerr <<
"**SYNTAX ERROR** found '" << str.toLatin1().constData() <<
"'. Only one variable name is accepted." << std::endl;
342 std::cerr <<
"****************" << std::endl;
345 }
else if (str.startsWith(
"y")) {
346 tok = str.split(
' ', Qt::SkipEmptyParts);
347 if (tok.size() < 2) {
348 std::cerr << std::endl;
349 std::cerr <<
"****************" << std::endl;
350 std::cerr <<
"**SYNTAX ERROR** found '" << str.toLatin1().constData() <<
"'. At least one variable name is needed." << std::endl;
351 std::cerr <<
"****************" << std::endl;
354 }
else if (str.startsWith(
"select ")) {
355 tok = str.split(
' ', Qt::SkipEmptyParts);
356 if (tok.size() != 2) {
357 std::cerr << std::endl;
358 std::cerr <<
"****************" << std::endl;
359 std::cerr <<
"**SYNTAX ERROR** found '" << str.toLatin1().constData() <<
"'. Only one row-number of collection name is accepted." << std::endl;
360 std::cerr <<
"****************" << std::endl;
363 }
else if (str.startsWith(
"selectAll")) {
364 if (str.compare(
"selectAll")) {
365 std::cerr << std::endl;
366 std::cerr <<
"****************" << std::endl;
367 std::cerr <<
"**SYNTAX ERROR** found '" << str.toLatin1().constData() <<
"'. selectAll doesn't accept any options." << std::endl;
368 std::cerr <<
"****************" << std::endl;
371 }
else if (str.startsWith(
"savePath")) {
372 tok = str.split(
' ', Qt::SkipEmptyParts);
373 if (tok.size() != 2) {
374 std::cerr << std::endl;
375 std::cerr <<
"****************" << std::endl;
376 std::cerr <<
"**SYNTAX ERROR** found '" << str.toLatin1().constData() <<
"'. Only one save path is accepted." << std::endl;
377 std::cerr <<
"****************" << std::endl;
380 }
else if (str.startsWith(
"plot")) {
381 tok = str.split(
' ', Qt::SkipEmptyParts);
382 if (tok.size() != 2) {
383 std::cerr << std::endl;
384 std::cerr <<
"****************" << std::endl;
385 std::cerr <<
"**SYNTAX ERROR** found '" << str.toLatin1().constData() <<
"'. Only one file name is accepted." << std::endl;
386 std::cerr <<
"****************" << std::endl;
391 tok = str.split(
'.', Qt::SkipEmptyParts);
392 QString ext = tok.at(tok.size()-1);
394 if ((ext !=
"pdf") && (ext !=
"jpg") && (ext !=
"png") && (ext !=
"svg") && (ext !=
"gif")) {
395 std::cerr << std::endl;
396 std::cerr <<
"****************" << std::endl;
397 std::cerr <<
"**SYNTAX ERROR** found extension " << ext.toLatin1().constData() <<
" in '" << str.toLatin1().constData() <<
"' which is not supported." << std::endl;
398 std::cerr <<
" Currently only: pdf, jpg, png, svg, and gif are supported." << std::endl;
399 std::cerr <<
"****************" << std::endl;
402 }
else if (str.startsWith(
"macro")) {
403 tok = str.split(
' ', Qt::SkipEmptyParts);
404 if (tok.size() != 2) {
405 std::cerr << std::endl;
406 std::cerr <<
"****************" << std::endl;
407 std::cerr <<
"**SYNTAX ERROR** found '" << str.toLatin1().constData() <<
"'. Only one file name is accepted." << std::endl;
408 std::cerr <<
"****************" << std::endl;
413 tok = str.split(
'.', Qt::SkipEmptyParts);
414 QString ext = tok.at(tok.size()-1);
417 std::cerr << std::endl;
418 std::cerr <<
"****************" << std::endl;
419 std::cerr <<
"**SYNTAX ERROR** found extension " << ext.toLatin1().constData() <<
" in '" << str.toLatin1().constData() <<
"' which is not supported." << std::endl;
420 std::cerr <<
" Currently only: C are supported." << std::endl;
421 std::cerr <<
"****************" << std::endl;
424 }
else if (str.startsWith(
"norm")) {
426 }
else if (str.startsWith(
"var")) {
428 tok = str.split(
' ', Qt::SkipEmptyParts);
429 if (tok.size() < 2) {
430 std::cerr << std::endl;
431 std::cerr <<
"****************" << std::endl;
432 std::cerr <<
"**SYNTAX ERROR** found '" << str.toLatin1().constData() <<
"'." << std::endl;
433 std::cerr <<
" Illegal variable definition." << std::endl;
434 std::cerr <<
"****************" << std::endl;
438 var_names.push_back(tok[1]);
439 var_linked.push_back(
false);
441 }
else if (str.startsWith(
"col")) {
443 tok = str.split(
' ', Qt::SkipEmptyParts);
444 if (tok.size() != 4) {
445 std::cerr << std::endl;
446 std::cerr <<
"****************" << std::endl;
447 std::cerr <<
"**SYNTAX ERROR** found '" << str.toLatin1().constData() <<
"'. Syntax for variable collection linking is:" << std::endl;
448 std::cerr <<
" col <nn> : <var_name>. Where <nn> is the collection index, and <var_name> the variable name to be linked." << std::endl;
449 std::cerr <<
"****************" << std::endl;
453 std::cerr << std::endl;
454 std::cerr <<
"****************" << std::endl;
455 std::cerr <<
"**SYNTAX ERROR** found '" << str.toLatin1().constData() <<
"'. Syntax for variable collection linking is:" << std::endl;
456 std::cerr <<
" col <nn> : <var_name>. Where <nn> is the collection index, and <var_name> the variable name to be linked." << std::endl;
457 std::cerr <<
"****************" << std::endl;
463 int idx = tok[1].toInt(&ok);
465 std::cerr << std::endl;
466 std::cerr <<
"****************" << std::endl;
467 std::cerr <<
"**SYNTAX ERROR** found '" << str.toLatin1().constData() <<
"'. Syntax for variable collection linking is:" << std::endl;
468 std::cerr <<
" col <nn> : <var_name>. Where <nn> is the collection index, and <var_name> the variable name to be linked." << std::endl;
469 std::cerr <<
" collection index is not a number here!" << std::endl;
470 std::cerr <<
"****************" << std::endl;
473 if (idx >= noOfCollections) {
474 std::cerr << std::endl;
475 std::cerr <<
"****************" << std::endl;
476 std::cerr <<
"**SYNTAX ERROR** in '" << str.toLatin1().constData() <<
"'." << std::endl;
477 std::cerr <<
" Requested collection '" << idx <<
"' is out-of-range." << std::endl;
478 std::cerr <<
" Only " << noOfCollections <<
" or present." << std::endl;
479 std::cerr <<
" Collection indexing starts at 0, not 1." << std::endl;
480 std::cerr <<
"****************" << std::endl;
484 if (tok[3].endsWith(
"Err")) {
485 std::cerr << std::endl;
486 std::cerr <<
"****************" << std::endl;
487 std::cerr <<
"**SYNTAX ERROR** in '" << str.toLatin1().constData() <<
"'." << std::endl;
488 std::cerr <<
" Only variables can be linked, NOT error variables." << std::endl;
489 std::cerr <<
" Error variables are linked implicitly." << std::endl;
490 std::cerr <<
"****************" << std::endl;
494 for (
unsigned int i=0; i<var_names.size(); i++) {
495 if (tok[3] == var_names[i]) {
501 std::cerr << std::endl;
502 std::cerr <<
"****************" << std::endl;
503 std::cerr <<
"**SYNTAX ERROR** in '" << str.toLatin1().constData() <<
"'." << std::endl;
504 std::cerr <<
" Variable to be linked not defined yet." << std::endl;
505 std::cerr <<
"****************" << std::endl;
508 var_linked[idx] =
true;
509 }
else if (str.startsWith(
"<python>")) {
513 std::cerr <<
"*********" << std::endl;
514 std::cerr <<
"**ERROR** found unrecognized script command: '" << str.toLatin1().constData() <<
"'." << std::endl;
515 std::cerr <<
"*********" << std::endl;
520 if (noOfCollections == -1) {
521 std::cerr <<
"****************" << std::endl;
522 std::cerr <<
"**SYNTAX ERROR** no data loaded." << std::endl;
523 std::cerr <<
"****************" << std::endl;
527 if (var_names.size() != var_linked.size()) {
528 std::cerr <<
"****************" << std::endl;
529 std::cerr <<
"**SYNTAX ERROR**" << std::endl;
530 std::cerr <<
"****************" << std::endl;
531 std::cerr <<
"** Your never should have reached this point **" << std::endl;
532 std::cerr <<
"****************" << std::endl;
535 for (
int i=0; i<var_names.size(); i++) {
536 if (!var_names[i].endsWith(
"Err") && !var_linked[i]) {
537 std::cerr <<
"****************" << std::endl;
538 std::cerr <<
"** WARNING **" << std::endl;
539 std::cerr <<
"****************" << std::endl;
540 std::cerr <<
" Found unlinked variable : " << var_names[i].toLatin1().constData() << std::endl;
541 std::cerr <<
"****************" << std::endl;
611int main(
int argc,
char *argv[])
613 Q_INIT_RESOURCE(
mupp);
619 if (!qstrcmp(argv[1],
"-h") || !qstrcmp(argv[1],
"--help")) {
622 }
else if (!qstrcmp(argv[1],
"-v") || !qstrcmp(argv[1],
"--version")) {
624 std::cout << std::endl <<
"mupp version: " << MUPP_VERSION <<
", git-branch: " << GIT_BRANCH <<
", git-rev: " << GIT_CURRENT_SHA1 << std::endl << std::endl;
626 std::cout << std::endl <<
"mupp version: " << MUPP_VERSION << std::endl << std::endl;
629 }
else if (!qstrcmp(argv[1],
"-s") || !qstrcmp(argv[1],
"--script")) {
631 std::cerr << std::endl;
632 std::cerr <<
"*********" << std::endl;
633 std::cerr <<
"**ERROR** the script option cannot be combined with something else." << std::endl;
634 std::cerr <<
"*********" << std::endl;
639 if (!QFile::exists(argv[2])) {
640 std::cerr << std::endl;
641 std::cerr <<
"*********" << std::endl;
642 std::cerr <<
"**ERROR** the script file '" << argv[2] <<
"' doesn't exist." << std::endl;
643 std::cerr <<
"*********" << std::endl << std::endl;
649 std::cerr << std::endl;
650 std::cerr <<
"*********" << std::endl;
651 std::cerr <<
"**ERROR** couldn't read script '" << argv[2] <<
"'" << std::endl;
652 std::cerr <<
"*********" << std::endl;
660 }
else if (argc >= 2) {
664 if (!qstrcmp(argv[1],
"--path")) {
666 std::cerr << std::endl;
667 std::cerr <<
"*********" << std::endl;
668 std::cerr <<
"**ERROR** tag '--path' needs to be followed by a <fit-param-path> and at least one <fit-param-file-name>" << std::endl;
669 std::cerr <<
"*********" << std::endl;
676 for (
int i=start; i<argc; i++) {
677 fln.push_back(argv[i]);
679 if (!path.isEmpty()) {
680 for (
int i=0; i<fln.size(); i++) {
681 fln[i].prepend(path+
"/");
688 if (script.size() > 0) {
693 std::unique_ptr<PmuppGui> gui;
694 std::unique_ptr<PmuppScript> mupp_script;
695 if (qobject_cast<QApplication *>(app.get())) {
696 gui = std::make_unique<PmuppGui>(fln);
697 if (gui ==
nullptr) {
698 std::cerr << std::endl;
699 std::cerr <<
"*********" << std::endl;
700 std::cerr <<
"**ERROR** couldn't invoke mupp gui..." << std::endl;
701 std::cerr <<
"*********" << std::endl;
704 gui->setWindowTitle(
"muSR Parameter Plotter" );
705 gui->resize( 800, 500 );
708 app.get()->connect( app.get(), SIGNAL( lastWindowClosed() ), app.get(), SLOT( quit() ) );
709 app.get()->connect( app.get(), SIGNAL( aboutToQuit() ), gui.get(), SLOT( aboutToQuit() ) );
711 mupp_script = std::make_unique<PmuppScript>(script);
712 if (mupp_script ==
nullptr) {
713 std::cerr << std::endl;
714 std::cerr <<
"*********" << std::endl;
715 std::cerr <<
"**ERROR** couldn't invoke script class..." << std::endl;
716 std::cerr <<
"*********" << std::endl;
721 QObject::connect( mupp_script.get(), SIGNAL( finished() ), app.get(), SLOT( quit() ) );
724 QTimer::singleShot(0, mupp_script.get(), SLOT( executeScript() ) );
QCoreApplication * createApplication(int &argc, char *argv[], bool gui)
Factory function to create the appropriate Qt application object.