40#include "git-revision.h"
55#include <boost/algorithm/string.hpp>
56#include <boost/algorithm/string/case_conv.hpp>
58#include <boost/lexical_cast.hpp>
72 unsigned int number(0);
74 number = boost::lexical_cast<unsigned int>(s);
77 catch(boost::bad_lexical_cast &) {
88 std::cout << std::endl <<
"usage 0: msr2data [--version] | [--help]";
89 std::cout << std::endl <<
"usage 1: msr2data <run> <extension> options";
90 std::cout << std::endl <<
"usage 2: msr2data <run1> <run2> <extension> options";
91 std::cout << std::endl <<
"usage 3: msr2data \\[<runList>\\] <extension> options";
92 std::cout << std::endl <<
"usage 4: msr2data <runListFileName> <extension> options";
93 std::cout << std::endl;
94 std::cout << std::endl <<
" <runList> can be:";
95 std::cout << std::endl <<
" (i) <run0>, <run1>, <run2>, ... <runN> : run numbers, e.g. 123 124";
96 std::cout << std::endl <<
" (ii) <run0>-<runN> : a range, e.g. 123-125 -> 123 124 125";
97 std::cout << std::endl <<
" (iii) <run0>:<runN>:<step> : a sequence, e.g. 123:127:2 -> 123 125 127";
98 std::cout << std::endl <<
" <step> will give the step width and has to be a positive number!";
99 std::cout << std::endl <<
" a <runList> can also combine (i)-(iii), e.g. 123 128-130 133, etc.";
100 std::cout << std::endl <<
" <runListFileName> : an ASCII file containing a list of run numbers and optional";
101 std::cout << std::endl <<
" external parameters is passed to msr2data. For details see";
102 std::cout << std::endl <<
" the online documentation: http://lmu.web.psi.ch/musrfit/user/MUSR/Msr2Data.html";
103 std::cout << std::endl <<
" <extension> : msr-file extension, e.g. _tf_h13 for the file name 8472_tf_h13.msr";
104 std::cout << std::endl;
105 std::cout << std::endl <<
"options:";
106 std::cout << std::endl <<
" -o<outputfile> : specify the name of the DB or column-data output file; default: out.db/out.dat";
107 std::cout << std::endl <<
" if the option '-o none' is used, no output file will be written.";
108 std::cout << std::endl <<
" new : before writing a new output file, delete the contents of any existing file with the same name";
109 std::cout << std::endl <<
" data : instead of to a DB file the data are written to a simple column structure";
110 std::cout << std::endl <<
" header : force writing of the file header to the output file";
111 std::cout << std::endl <<
" noheader : no file header is written to the output file";
112 std::cout << std::endl <<
" If either none or both of the header options are given, the file header will be written";
113 std::cout << std::endl <<
" if a new file is created, but not if the output file exists already!";
114 std::cout << std::endl <<
" nosummary : no additional data from the run data file is written to the output file";
115 std::cout << std::endl <<
" paramList <param> : option used to select the parameters which shall be exported.";
116 std::cout << std::endl <<
" <param> is a list of parameter numbers to be exported. Allowed lists are:";
117 std::cout << std::endl <<
" 1-16 will export parameters 1 to 16. 1 3 5 will export parameters 1 3 5.";
118 std::cout << std::endl <<
" A combination of both is possible, e.g. 1-16 19 31 62, and so on.";
119 std::cout << std::endl <<
" fit : invoke musrfit to fit the specified runs";
120 std::cout << std::endl <<
" All msr input files are assumed to be present, none is newly generated!";
121 std::cout << std::endl <<
" fit-<template>! : generate msr files for the runs to be processed from the <template> run";
122 std::cout << std::endl <<
" and call musrfit for fitting these runs";
123 std::cout << std::endl <<
" fit-<template> : same as above, but the <template> run is only used for the first file creation---";
124 std::cout << std::endl <<
" the successive files are generated using the musrfit output from the preceding runs";
125 std::cout << std::endl <<
" msr-<template> : same as above without calling musrfit";
126 std::cout << std::endl <<
" In case any fitting option is present, this option is ignored!";
127 std::cout << std::endl <<
" -k, --keep-mn2-output : if fitting is used, pass the option --keep-mn2-output to musrfit";
128 std::cout << std::endl <<
" -t, --title-from-data-file : if fitting is used, pass the option --title-from-data-file to musrfit";
129 std::cout << std::endl <<
" -e, --estimateN0: estimate N0 for single histogram fits.";
130 std::cout << std::endl <<
" -y, --yaml: write fit results (MINUIT2.OUTPUT) into a yaml-file. Output <msr-file>.yaml";
131 std::cout << std::endl <<
" -p, --per-run-block-chisq: will per run block chisq to the msr-file.";
132 std::cout << std::endl <<
" -u, --use-no-of-threads <number>: if fitting is used, pass the option --use-no-of-threads <number> to musrfit";
133 std::cout << std::endl <<
" <number>: number of threads to be used (OpenMP). Needs to be <= max. number of cores.";
134 std::cout << std::endl;
135 std::cout << std::endl <<
" global : switch on the global-fit mode";
136 std::cout << std::endl <<
" Within that mode all specified runs will be united in a single msr file!";
137 std::cout << std::endl <<
" The fit parameters can be either run specific or common to all runs.";
138 std::cout << std::endl <<
" For a complete description of this feature please refer to the manual.";
139 std::cout << std::endl;
140 std::cout << std::endl <<
" global+[!] : operate in the global-fit mode, however, in case a global input file is created";
141 std::cout << std::endl <<
" all specified runs are pre-analyzed first one by one using the given template.";
142 std::cout << std::endl <<
" For the generation of the global input file, the run-specific parameter values are taken";
143 std::cout << std::endl <<
" from this pre-analysis for each run---they are not just copied from the template.";
144 std::cout << std::endl <<
" The specification of '!' determines which fit mode (see above) is used for this pre-analysis.";
145 std::cout << std::endl;
146 std::cout << std::endl <<
" Typical examples:";
147 std::cout << std::endl;
148 std::cout << std::endl <<
" msr2data 2047 2050 _tf_histo fit-2046";
149 std::cout << std::endl <<
" will use 2046_tf_histo.msr as templete, and subsequently generating 2047_tf_histo.msr until";
150 std::cout << std::endl <<
" 2050_tf_histo.msr and fit them.";
151 std::cout << std::endl;
152 std::cout << std::endl <<
" msr2data 2047 2050 _tf_histo msr-2046";
153 std::cout << std::endl <<
" will use 2046_tf_histo.msr as templete, and subsequently generating 2047_tf_histo.msr until";
154 std::cout << std::endl <<
" 2050_tf_histo.msr, but NO fitting will be done.";
155 std::cout << std::endl;
156 std::cout << std::endl <<
" msr2data 2046 2050 _tf_histo -o fitParam.db";
157 std::cout << std::endl <<
" will collect the fit parameters from runs 2046-2050 (msr-files 2046_tf_histo.msr etc.) and";
158 std::cout << std::endl <<
" write them to the file fitParam.db (DB-format).";
159 std::cout << std::endl;
160 std::cout << std::endl <<
" msr2data [2047:2053:2 2056] _tf_histo fit-2045";
161 std::cout << std::endl <<
" will use 2045_tf_histo.msr as templete, and subsequently generating msr-files from the run-list:";
162 std::cout << std::endl <<
" 2047 2049 2051 2053 2056 (2047_tf_histo.msr etc.) and fit them.";
163 std::cout << std::endl;
164 std::cout << std::endl <<
" msr2data 2046 2058 _tf_histo paramList 1-12 data -o fitParam.dat";
165 std::cout << std::endl <<
" will export the parameters number 1 trough 12 in a column like fashion of the runs 2046 to 2058,";
166 std::cout << std::endl <<
" collected form the msr-files 2046_tf_histo.msr and so on.";
167 std::cout << std::endl;
168 std::cout << std::endl <<
" For further information please refer to";
169 std::cout << std::endl <<
" http://lmu.web.psi.ch/musrfit/user/html/msr2data.html#msr2data";
170 std::cout << std::endl << std::endl;
188 for (std::vector<std::string>::const_iterator iter(arg.begin()); iter != arg.end(); ++iter) {
189 if ( (!iter->compare(
"header")) || (!iter->compare(
"noheader")) || (!iter->compare(
"nosummary")) \
190 || (!iter->substr(0,3).compare(
"fit")) || (!iter->compare(
"-k")) || (!iter->compare(
"--keep-mn2-output")) \
191 || (!iter->compare(
"-t")) || (!iter->compare(
"--title-from-data-file")) \
192 || (!iter->compare(
"-e")) || (!iter->compare(
"--estimateN0")) \
193 || (!iter->compare(
"-y") || (!iter->compare(
"--yaml"))) \
194 || (!iter->compare(
"-p")) || (!iter->compare(
"--per-run-block-chisq")) \
195 || (!iter->compare(
"data")) || (!iter->substr(0,4).compare(
"msr-")) || (!iter->compare(
"global")) \
196 || (!iter->compare(
"global+")) || (!iter->compare(
"global+!")) || (!iter->compare(
"new")) \
197 || !iter->compare(
"paramList") )
199 else if (!iter->substr(0,2).compare(
"-o")) {
201 if (!iter->compare(
"-o")) {
203 std::vector<std::string>::const_iterator iterNext(iter + 1);
204 if (iterNext == arg.end())
206 else if ((iterNext->compare(
"-u")) && (iterNext->compare(
"--use-no-of-threads")))
210 }
else if ((!iter->compare(
"-u")) || (!iter->compare(
"--use-no-of-threads"))) {
212 if (++iter == arg.end())
239 std::string outputFile;
241 outputFile =
"out.db";
243 outputFile =
"out.dat";
245 std::vector<std::string>::iterator iterNext(arg.begin());
246 for (std::vector<std::string>::iterator iter(arg.begin()); iter != arg.end(); ++iter) {
248 if (!iter->substr(0,2).compare(
"-o")) {
249 if (!iter->compare(
"-o")) {
250 if ((iterNext != arg.end()) && (iterNext->compare(
"header")) && (iterNext->compare(
"noheader")) && (iterNext->compare(
"nosummary")) \
251 && (iterNext->substr(0,3).compare(
"fit")) && (iterNext->compare(
"-k")) && (iterNext->compare(
"-t")) \
252 && (iterNext->compare(
"-e")) && (iterNext->compare(
"-p")) \
253 && (iterNext->compare(
"-u")) && (iterNext->compare(
"--use-no-of-threads")) \
254 && (iterNext->compare(
"data")) && (iterNext->substr(0,3).compare(
"msr")) && (iterNext->compare(
"global")) \
255 && (iterNext->compare(
"global+")) && (iterNext->compare(
"global+!")) && (iterNext->compare(
"new"))) {
256 outputFile = *iterNext;
261 std::cout << std::endl;
262 std::cout <<
">> msr2data: **WARNING** You did not specify an output file! The default one (" << outputFile <<
") will be used." << std::endl;
267 outputFile = iter->substr(2);
292 std::vector<std::string>::iterator iter;
293 iter = find(arg.begin(), arg.end(), s);
295 if (iter != arg.end()) {
317 std::vector<std::string>::iterator iter;
318 iter = find(arg.begin(), arg.end(),
"-u");
319 if (iter == arg.end())
320 iter = find(arg.begin(), arg.end(),
"--use-no-of-threads");
321 if (iter == arg.end())
324 std::vector<std::string>::iterator iterNext(iter + 1);
325 if (iterNext == arg.end()) {
326 std::cerr << std::endl <<
">> msr2data: **ERROR** found option --use-no-of-threads without <number>" << std::endl;
331 std::cerr << std::endl <<
">> msr2data: **ERROR** found option --use-no-of-threads where <number> is not a number: '" << *iterNext <<
"'" << std::endl;
337 noOfThreads = boost::lexical_cast<int>(*iterNext);
338 }
catch (boost::bad_lexical_cast &) {
341 if (noOfThreads <= 0) {
342 std::cerr << std::endl <<
">> msr2data: **ERROR** found option --use-no-of-threads with <number> <= 0" << std::endl;
347 arg.erase(iter, iterNext + 1);
372 std::vector<std::string>::iterator iter(arg.begin());
373 while (iter != arg.end()) {
374 if (!iter->compare(
"fit")) {
380 iter = arg.erase(iter);
382 else if (!iter->substr(0,4).compare(
"fit-")) {
387 std::string::size_type loc = s.rfind(
'!');
388 if (loc != std::string::npos) {
395 temp = boost::lexical_cast<int>(s);
398 catch(boost::bad_lexical_cast &) {
425 for (std::vector<std::string>::iterator iter(arg.begin()); iter != arg.end(); ++iter) {
426 if (!iter->substr(0,4).compare(
"msr-")) {
429 temp = boost::lexical_cast<int>(s);
432 catch(boost::bad_lexical_cast &) {
454 for (
unsigned int i=0; i<arg.size(); i++) {
455 if (!arg[i].compare(
"paramList")) {
466 if (idx == arg.size()) {
467 std::cerr << std::endl <<
"**ERROR** found paramList without any arguments!" << std::endl;
473 std::vector<std::string> str;
474 unsigned int idx_end=0;
475 size_t pos=std::string::npos;
476 for (
unsigned int i=idx; i<arg.size(); i++) {
477 pos = arg[i].find(
"-");
481 }
else if (pos != std::string::npos) {
482 boost::split(str, arg[i], boost::is_any_of(
"-"));
483 if (str.size() != 2) {
484 std::cerr << std::endl <<
"**ERROR** found token " << arg[i] <<
" in paramList command which cannot be handled." << std::endl;
488 if (!str[0].compare(
"fit") || !str[0].compare(
"msr")) {
493 std::cerr << std::endl <<
"**ERROR** found token " << arg[i] <<
" in paramList command which cannot be handled." << std::endl;
497 unsigned int start=boost::lexical_cast<unsigned int>(str[0]);
498 unsigned int end=boost::lexical_cast<unsigned int>(str[1]);
499 for (
unsigned int j=start; j<=end; j++)
500 paramList.push_back(j);
502 paramList.push_back(boost::lexical_cast<unsigned int>(arg[i]));
509 idx_end = arg.size();
512 arg.erase(arg.begin()+idx-1, arg.begin()+idx_end);
515 for (
unsigned int i=0; i<paramList.size(); i++) {
516 for (
unsigned int j=i+1; j<paramList.size(); j++) {
517 if (paramList[i] == paramList[j]) {
518 std::cerr << std::endl <<
"**ERROR** the parameter list numbers have to be unique. Found " << paramList[i] <<
" at least 2 times." << std::endl;
525 return paramList.size();
540int main(
int argc,
char *argv[])
544 if (!strcmp(argv[1],
"--help")) {
547 }
else if (!strcmp(argv[1],
"--version")) {
550 std::cout << std::endl <<
"msr2data version: " << PACKAGE_VERSION <<
", git-branch: " << GIT_BRANCH <<
", git-rev: " << GIT_CURRENT_SHA1 <<
" (" << BUILD_TYPE <<
"), ROOT version: " << ROOT_VERSION_USED << std::endl << std::endl;
552 std::cout << std::endl <<
"msr2data version: " << PACKAGE_VERSION <<
" (" << BUILD_TYPE <<
"), ROOT version: " << ROOT_VERSION_USED << std::endl << std::endl;
556 std::cout << std::endl <<
"msr2data git-branch: " << GIT_BRANCH <<
", git-rev: " << GIT_CURRENT_SHA1 << std::endl << std::endl;
558 std::cout << std::endl <<
"msr2data version: unknown." << std::endl << std::endl;
575 std::vector<std::string> arg;
576 for (
int i(1); i<argc; ++i) {
577 arg.push_back(argv[i]);
581 std::vector<unsigned int> run_vec;
582 std::string run_list;
583 std::string msrExtension;
584 std::vector<unsigned int> param_vec;
587 if (arg[0].at(0) ==
'[') {
590 unsigned int firstRunNumberInArg(0), lastRunNumberInArg(0);
591 unsigned int rightbracket(std::numeric_limits<unsigned int>::max());
593 if (!arg[0].compare(
"["))
594 firstRunNumberInArg = 1;
596 arg[0]=arg[0].substr(1);
598 for (
unsigned int i(firstRunNumberInArg); i<arg.size(); ++i) {
599 std::string::size_type loc = arg[i].rfind(
']');
600 if ( loc != std::string::npos ) {
602 if (!arg[i].compare(
"]") && i > 0)
603 lastRunNumberInArg = i-1;
605 arg[i]=arg[i].substr(0,loc);
606 lastRunNumberInArg = i;
611 if (rightbracket == std::numeric_limits<unsigned int>::max()) {
612 std::cerr << std::endl;
613 std::cerr <<
">> msr2data: **ERROR** You used the list specification without closing bracket (])! Quitting now." << std::endl;
618 for (
unsigned int i(firstRunNumberInArg); i<=lastRunNumberInArg; ++i) {
619 run_list += arg[i] +
" ";
622 std::unique_ptr<PStringNumberList> nl = std::make_unique<PStringNumberList>(run_list);
623 std::string errorMsg(
"");
624 if (!nl->Parse(errorMsg)) {
625 std::cerr << std::endl;
626 std::cerr <<
">> msr2data: " << errorMsg <<
" - Quitting now." << std::endl;
630 run_vec = nl->GetList();
632 msrExtension = arg[rightbracket + 1];
634 std::vector<std::string>::iterator iter(arg.begin());
635 for (
unsigned int i(0); i<rightbracket + 2; ++i) {
643 if (argOneIsNumber && argTwoIsNumber) {
646 if (arg.size() < 3) {
647 std::cerr << std::endl;
648 std::cerr <<
">> msr2data: **ERROR** No msr-file extension specified! Quitting now..." << std::endl;
654 run_vec.push_back(boost::lexical_cast<unsigned int>(arg[0]));
655 run_vec.push_back(boost::lexical_cast<unsigned int>(arg[1]));
657 msrExtension = arg[2];
659 std::vector<std::string>::iterator iter(arg.begin());
660 for (
unsigned int i(0); i < 3; i++) {
664 }
else if (argOneIsNumber && !argTwoIsNumber) {
666 run_vec.push_back(boost::lexical_cast<unsigned int>(arg[0]));
667 msrExtension = arg[1];
669 std::vector<std::string>::iterator iter(arg.begin());
670 for (
unsigned int i(0); i < 2; i++) {
677 msrExtension = arg[1];
679 std::vector<std::string>::iterator iter(arg.begin());
680 for (
unsigned int i(0); i < 2; i++) {
687 catch(boost::bad_lexical_cast &) {
688 std::cerr << std::endl;
689 std::cerr <<
">> msr2data: **ERROR** At least one given run number is out of range! Quitting..." << std::endl;
697 if (noParamList == -1) {
704 if (!wrongArgument.empty()) {
705 std::cerr << std::endl;
706 std::cerr <<
">> msr2data: **ERROR** Unknown argument: " << wrongArgument <<
". Quitting..." << std::endl;
719 bool realOutput(
true);
720 if (!boost::algorithm::to_lower_copy(outputFile).compare(
"none"))
724 std::unique_ptr<PMsr2Data> msr2dataHandler = std::make_unique<PMsr2Data>(msrExtension);
730 status = msr2dataHandler->SetRunNumbers(run_vec);
733 status = msr2dataHandler->SetRunNumbers(run_vec[0], run_vec[1]);
736 status = msr2dataHandler->SetRunNumbers(run_vec[0]);
739 status = msr2dataHandler->SetRunNumbers(run_list);
742 std::cerr << std::endl;
743 std::cerr <<
">> msr2data: **ERROR** None of the possible run list specifications has been detected! Quitting now..." << std::endl;
748 std::cerr << std::endl;
749 std::cerr <<
">> msr2data: **ERROR** The run numbers are out of range! Quitting..." << std::endl;
751 }
else if (
status == -1) {
759 bool chainfit(
true), onlyInputCreation(
false);
760 std::string musrfitOptions;
766 if (noOfThreads == -1) {
772 std::cerr << std::endl;
773 std::cerr <<
">> msr2data: **ERROR** More than one fitting options are specified! Quitting..." << std::endl;
775 }
else if (temp == -3) {
776 std::cerr << std::endl;
777 std::cerr <<
">> msr2data: **ERROR** The given template has not a valid run number! Quitting..." << std::endl;
785 musrfitOptions.append(
"-k ");
787 musrfitOptions.append(
"-t ");
789 musrfitOptions.append(
"-e ");
791 musrfitOptions.append(
"-y ");
793 musrfitOptions.append(
"-p ");
795 musrfitOptions.append(
"-u " + std::to_string(noOfThreads) +
" ");
801 if (onlyInputCreation) {
807 std::cerr << std::endl;
808 std::cerr <<
">> msr2data: **ERROR** The given template has not a valid run number! Quitting..." << std::endl;
815 unsigned int globalMode(0);
818 setNormalMode =
false;
821 setNormalMode =
false;
828 status = msr2dataHandler->DetermineRunNumberDigits(temp, setNormalMode);
830 status = msr2dataHandler->DetermineRunNumberDigits(msr2dataHandler->GetPresentRun(), setNormalMode);
838 status = msr2dataHandler->CheckRunNumbersInRange();
840 std::cerr << std::endl;
841 std::cerr <<
">> msr2data: **ERROR** At least one given run number is out of range! Quitting..." << std::endl;
845 bool writeSummary(
false);
846 unsigned int writeHeader(2);
851 std::unique_ptr<std::fstream> fileOutput;
869 fileOutput = std::make_unique<std::fstream>();
870 fileOutput->open(outputFile.c_str(), std::ios::in);
871 if (fileOutput->is_open()) {
872 std::cout << std::endl <<
">> msr2data: **INFO** Deleting output file " << outputFile << std::endl;
874 fileOutput->open(outputFile.c_str(), std::ios::out | std::ios::trunc);
877 std::cout << std::endl <<
">> msr2data: **INFO** Ignoring the 'new' option since " << outputFile <<
" does not exist yet." << std::endl;
879 if (writeHeader == 2) {
886 if (!setNormalMode) {
887 std::ostringstream strInfile;
888 strInfile << msr2dataHandler->GetPresentRun() <<
"+global" << msrExtension <<
".msr";
893 bool success(msr2dataHandler->PrepareGlobalInputFile(temp, strInfile.str(), globalMode, musrfitOptions));
896 std::cerr << std::endl <<
">> msr2data: **ERROR** Input file generation has not been successful! Quitting..." << std::endl;
902 if (!onlyInputCreation) {
904 std::string path(
"");
906 char *pathPtr(getenv(
"MUSRFITPATH"));
908 path = boost::lexical_cast<std::string>(pathPtr);
915 std::cerr << std::endl <<
">> msr2data: **WARNING** The MUSRFITPATH environment variable is not set!";
916 std::cerr << std::endl <<
">> msr2data: **WARNING** Please set it or at least ensure that musrfit can be found on the PATH!" << std::endl;
918 std::ostringstream oss;
919 oss << path <<
"musrfit" <<
" " << strInfile.str() <<
" " << musrfitOptions;
920 std::cout << std::endl <<
">> msr2data: **INFO** Calling " << oss.str() << std::endl;
921 if (system(oss.str().c_str()) == -1) {
922 std::cerr <<
"**ERROR** cmd: " << oss.str().c_str() <<
" failed." << std::endl;
930 status = msr2dataHandler->ParseXmlStartupFile();
934 status = msr2dataHandler->ReadMsrFile(strInfile.str());
942 status = msr2dataHandler->ReadRunDataFile();
944 unsigned int counter(0);
946 while (msr2dataHandler->GetPresentRun()) {
948 status = msr2dataHandler->WriteOutput(outputFile, param_vec, db, writeHeader, !setNormalMode, counter);
959 status = msr2dataHandler->ParseXmlStartupFile();
964 unsigned int oldtemp(0);
965 std::ostringstream strInfile;
967 while (msr2dataHandler->GetPresentRun()) {
970 strInfile << msr2dataHandler->GetPresentRun() << msrExtension <<
".msr";
976 if (firstrun || !chainfit)
977 success = msr2dataHandler->PrepareNewInputFile(temp,
false);
979 success = msr2dataHandler->PrepareNewInputFile(oldtemp,
false);
982 oldtemp = msr2dataHandler->GetPresentRun();
985 std::cerr << std::endl <<
">> msr2data: **ERROR** Input file generation has not been successful! Quitting..." << std::endl;
991 if (!onlyInputCreation) {
993 std::string path(
"");
995 char *pathPtr(getenv(
"MUSRFITPATH"));
997 path = boost::lexical_cast<std::string>(pathPtr);
1004 std::cerr << std::endl <<
">> msr2data: **WARNING** The MUSRFITPATH environment variable is not set!";
1005 std::cerr << std::endl <<
">> msr2data: **WARNING** Please set it or at least ensure that musrfit can be found on the PATH!" << std::endl;
1007 std::ostringstream oss;
1008 oss << path <<
"musrfit" <<
" " << strInfile.str() <<
" " << musrfitOptions;
1009 std::string cmdStr = oss.str();
1010 cmdStr.erase(std::remove(cmdStr.begin(), cmdStr.end(),
'\r'), cmdStr.end());
1011 cmdStr.erase(std::remove(cmdStr.begin(), cmdStr.end(),
'\n'), cmdStr.end());
1012 std::cout << std::endl <<
">> msr2data: **INFO** Calling " << cmdStr << std::endl;
1013 if (system(cmdStr.c_str()) == -1) {
1014 std::cerr <<
"**ERROR** cmd: " << cmdStr <<
" failed." << std::endl;
1021 status = msr2dataHandler->ReadMsrFile(strInfile.str());
1024 status = msr2dataHandler->WriteOutput(
"none", param_vec, db, writeHeader);
1035 status = msr2dataHandler->ReadRunDataFile();
1038 status = msr2dataHandler->WriteOutput(outputFile, param_vec, db, writeHeader);
1051 fileOutput = std::make_unique<std::fstream>();
1052 fileOutput->open(outputFile.c_str(), std::ios::in);
1053 if (fileOutput->is_open()) {
1054 fileOutput->close();
1055 fileOutput->open(outputFile.c_str(), std::ios::out | std::ios::app);
1056 if (fileOutput->is_open()) {
1057 *fileOutput << std::endl << std::endl;
1058 fileOutput->close();
1060 std::cerr << std::endl <<
">> msr2data: **ERROR** The output file " << outputFile <<
" cannot be opened! Please check!";
1061 std::cerr << std::endl;
1064 std::cerr << std::endl <<
">> msr2data: **WARNING** No output has been written to the file " << outputFile <<
"!";
1065 std::cerr << std::endl <<
">> msr2data: **WARNING** Please check the range of runs and the specified options!" << std::endl;
1070 std::cout << std::endl <<
">> msr2data: **INFO** The following command line arguments have been specified but not been used: " << std::endl;
1071 std::cout <<
">> msr2data: **INFO**";
1072 for (
unsigned int i(0); i<arg.size(); ++i)
1073 std::cout <<
" " << arg[i];
1074 std::cout << std::endl;
1077 std::cout << std::endl <<
">> msr2data: done ..." << std::endl;
#define PMUSR_SUCCESS
Successful operation completion.
int main(int argc, char *argv[])
int msr2data_doInputCreation(std::vector< std::string > &arg, bool &inputOnly)
std::string msr2data_outputfile(std::vector< std::string > &arg, bool db=true)
std::string msr2data_validArguments(const std::vector< std::string > &arg)
int msr2data_doFitting(std::vector< std::string > &arg, bool &chainfit)
int msr2data_noOfThreads(std::vector< std::string > &arg)
bool isNumber(const std::string &s)
bool msr2data_useOption(std::vector< std::string > &arg, const std::string &s)
int msr2data_paramList(std::vector< std::string > &arg, std::vector< unsigned int > ¶mList)