1433 f.GetObject(
"RunInfo", folder);
1435 TObject *obj = f.FindObjectAny(
"RunHeader");
1436 if (obj ==
nullptr) {
1437 std::cerr << std::endl <<
">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't neither obtain RunInfo (LEM),";
1438 std::cerr << std::endl <<
" nor RunHeader (MusrRoot) from " <<
fRunPathName.Data() << std::endl;
1442 if (!strcmp(obj->ClassName(),
"TFolder"))
1444 else if (!strcmp(obj->ClassName(),
"TDirectoryFile"))
1447 std::cerr << std::endl <<
"PRunDataHandler::ReadRootFile: **ERROR** RunHeader (MusrRoot) from '" <<
fRunPathName.Data() <<
"' is neither a TFolder nor a TDirectory. Found: '" << obj->ClassName() <<
"'" << std::endl;
1457 TLemRunHeader *runHeader =
dynamic_cast<TLemRunHeader*
>(folder->FindObjectAny(
"TLemRunHeader"));
1461 std::cerr << std::endl <<
">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't obtain run header info from ROOT file " <<
fRunPathName.Data() << std::endl;
1474 TObjString ostr = runHeader->GetRunTitle();
1478 runData.
SetRunNumber(
static_cast<Int_t
>(runHeader->GetRunNumber()));
1482 runData.
SetTemperature(0, runHeader->GetSampleTemperature(), runHeader->GetSampleTemperatureError());
1485 runData.
SetField(runHeader->GetSampleBField());
1488 runData.
SetEnergy(runHeader->GetImpEnergy());
1494 runData.
SetSetup(runHeader->GetLemSetup().GetString());
1498 time_t idt =
static_cast<time_t
>(runHeader->GetStartTime());
1500 struct tm *dt = localtime(&idt);
1502 strftime(str,
sizeof(str),
"%F", dt);
1506 memset(str, 0,
sizeof(str));
1507 strftime(str,
sizeof(str),
"%T", dt);
1513 idt =
static_cast<time_t
>(runHeader->GetStopTime());
1515 dt = localtime(&idt);
1516 memset(str, 0,
sizeof(str));
1517 strftime(str,
sizeof(str),
"%F", dt);
1521 memset(str, 0,
sizeof(str));
1522 strftime(str,
sizeof(str),
"%T", dt);
1530 Int_t noOfHistos = runHeader->GetNHist();
1533 Double_t *t0 = runHeader->GetTimeZero();
1536 TObjArray *runSummary =
dynamic_cast<TObjArray*
>(folder->FindObjectAny(
"RunSummary"));
1540 std::cout << std::endl <<
"**INFO** Couldn't obtain run summary info from ROOT file " <<
fRunPathName.Data() << std::endl;
1545 TObjArrayIter summIter(runSummary);
1546 TObjString *os(
dynamic_cast<TObjString*
>(summIter.Next()));
1547 TObjArray *oa(
nullptr);
1548 TObjString *objTok(
nullptr);
1549 while (os !=
nullptr) {
1550 s = os->GetString();
1552 if (s.Contains(
"RA-L")) {
1553 oa = s.Tokenize(
" ");
1554 TObjArrayIter lineIter(oa);
1555 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1556 while (objTok !=
nullptr) {
1557 if (!objTok->GetString().CompareTo(
"RA-L")) {
1558 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1559 if ((objTok !=
nullptr) && !objTok->GetString().CompareTo(
"=")) {
1560 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1565 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1574 if (s.Contains(
"RA-R")) {
1575 oa = s.Tokenize(
" ");
1576 TObjArrayIter lineIter(oa);
1577 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1578 while (objTok !=
nullptr){
1579 if (!objTok->GetString().CompareTo(
"RA-R")) {
1580 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1581 if (objTok !=
nullptr && !objTok->GetString().CompareTo(
"=")) {
1582 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1587 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1596 if (s.Contains(
"RA-T")) {
1597 oa = s.Tokenize(
" ");
1598 TObjArrayIter lineIter(oa);
1599 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1600 while (objTok !=
nullptr){
1601 if (!objTok->GetString().CompareTo(
"RA-T")) {
1602 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1603 if ((objTok !=
nullptr) && !objTok->GetString().CompareTo(
"=")) {
1604 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1609 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1618 if (s.Contains(
"RA-B")) {
1619 oa = s.Tokenize(
" ");
1620 TObjArrayIter lineIter(oa);
1621 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1622 while (objTok !=
nullptr){
1623 if (!objTok->GetString().CompareTo(
"RA-B")) {
1624 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1625 if ((objTok !=
nullptr) && !objTok->GetString().CompareTo(
"=")) {
1626 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1631 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1640 os =
dynamic_cast<TObjString*
>(summIter.Next());
1647 f.GetObject(
"histos", folder);
1649 std::cerr << std::endl <<
">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't obtain histos from " <<
fRunPathName.Data() << std::endl;
1655 Char_t histoName[32];
1656 for (Int_t i=0; i<noOfHistos; i++) {
1657 snprintf(histoName,
sizeof(histoName),
"hDecay%02d", i);
1658 TH1F *histo =
dynamic_cast<TH1F*
>(folder->FindObjectAny(histoName));
1660 std::cerr << std::endl <<
">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't get histo " << histoName;
1661 std::cerr << std::endl;
1667 for (Int_t j=1; j<=histo->GetNbinsX(); j++) {
1668 histoData.push_back(histo->GetBinContent(j));
1673 dataSet.
SetName(histo->GetTitle());
1687 if (!folder->FindObjectAny(histoName)) {
1688 std::cerr << std::endl <<
">> PRunDataHandler::ReadRootFile: **WARNING** Couldn't get histo " << histoName;
1689 std::cerr << std::endl <<
">> most probably this is an old (2006 or earlier) LEM file without post pileup histos.";
1690 std::cerr << std::endl;
1692 for (Int_t i=0; i<noOfHistos; i++) {
1694 TH1F *histo =
dynamic_cast<TH1F*
>(folder->FindObjectAny(histoName));
1696 std::cerr << std::endl <<
">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't get histo " << histoName;
1697 std::cerr << std::endl;
1703 for (Int_t j=1; j<=histo->GetNbinsX(); j++)
1704 histoData.push_back(histo->GetBinContent(j));
1708 dataSet.
SetName(histo->GetTitle());
1723 std::unique_ptr<TMusrRunHeader> header = std::make_unique<TMusrRunHeader>(
true);
1724 if (header ==
nullptr) {
1725 std::cerr << std::endl <<
">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't invoke MusrRoot RunHeader in file:" <<
fRunPathName;
1726 std::cerr << std::endl;
1733 f.GetObject(
"RunHeader", folder);
1736 if (!header->ExtractAll(folder)) {
1737 std::cerr << std::endl <<
">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't invoke MusrRoot RunHeader (TFolder) in file:" <<
fRunPathName;
1738 std::cerr << std::endl;
1743 TDirectoryFile *runHeader =
nullptr;
1744 f.GetObject(
"RunHeader", runHeader);
1747 if (!header->ExtractAll(runHeader)) {
1748 std::cerr << std::endl <<
">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't invoke MusrRoot RunHeader (TDirectoryFile) in file:" <<
fRunPathName;
1749 std::cerr << std::endl;
1757 TString str, path, pathName;
1758 Int_t ival, noOfHistos=0;
1763 header->Get(
"RunInfo/Version", str, ok);
1767 header->Get(
"RunInfo/Generic Validator URL", str, ok);
1771 header->Get(
"RunInfo/Specific Validator URL", str, ok);
1775 header->Get(
"RunInfo/Generator", str, ok);
1779 header->Get(
"RunInfo/File Name", str, ok);
1783 header->Get(
"RunInfo/Run Title", str, ok);
1787 header->Get(
"RunInfo/Run Number", ival, ok);
1791 header->Get(
"RunInfo/Run Start Time", str, ok);
1793 Ssiz_t pos = str.Index(
' ');
1794 TString substr = str;
1795 substr.Remove(pos, str.Length());
1798 substr.Remove(0, pos+1);
1802 header->Get(
"RunInfo/Run Stop Time", str, ok);
1804 Ssiz_t pos = str.Index(
' ');
1805 TString substr = str;
1806 substr.Remove(pos, str.Length());
1809 substr.Remove(0, pos+1);
1813 header->Get(
"RunInfo/Laboratory", str, ok);
1817 header->Get(
"RunInfo/Instrument", str, ok);
1821 header->Get(
"RunInfo/Muon Beam Momentum", prop, ok);
1823 if (!prop.
GetUnit().CompareTo(
"MeV/c"))
1827 header->Get(
"RunInfo/Muon Species", str, ok);
1831 header->Get(
"RunInfo/Muon Source", str, ok);
1835 header->Get(
"RunInfo/Muon Spin Angle", prop, ok);
1840 header->Get(
"RunInfo/Setup", str, ok);
1844 header->Get(
"RunInfo/Comment", str, ok);
1848 header->Get(
"RunInfo/Sample Name", str, ok);
1852 header->Get(
"RunInfo/Sample Temperature", prop, ok);
1856 header->Get(
"RunInfo/Sample Magnetic Field", prop, ok);
1859 if (!prop.
GetUnit().CompareTo(
"G") || !prop.
GetUnit().CompareTo(
"Gauss"))
1861 else if (!prop.
GetUnit().CompareTo(
"T") || !prop.
GetUnit().CompareTo(
"Tesla"))
1866 header->Get(
"RunInfo/No of Histos", ival, ok);
1871 header->Get(
"RunInfo/Time Resolution", prop, ok);
1874 if (!prop.
GetUnit().CompareTo(
"ps") || !prop.
GetUnit().CompareTo(
"picosec"))
1876 else if (!prop.
GetUnit().CompareTo(
"ns") || !prop.
GetUnit().CompareTo(
"nanosec"))
1878 else if (!prop.
GetUnit().CompareTo(
"us") || !prop.
GetUnit().CompareTo(
"microsec"))
1881 std::cerr << std::endl <<
">> PRunDataHandler::ReadRootFile: **ERROR** Found unrecognized Time Resolution unit: " << prop.
GetUnit() << std::endl;
1885 header->Get(
"RunInfo/RedGreen Offsets", ivec, ok);
1890 redGreenOffsets.push_back(0);
1893 Bool_t found =
false;
1894 for (UInt_t i=0; i<
fAny2ManyInfo->groupHistoList.size(); i++) {
1896 for (UInt_t j=0; j<ivec.size(); j++) {
1901 std::cerr << std::endl <<
">> PRunDataHandler::ReadRootFile: **ERROR** requested histo group " <<
fAny2ManyInfo->groupHistoList[i];
1902 std::cerr << std::endl <<
">> which is NOT present in the data file." << std::endl;
1911 redGreenOffsets = ivec;
1916 header->Get(
"RunInfo/Sample Orientation", str, ok);
1922 header->Get(
"RunInfo/Moderator HV", prop, ok);
1926 header->Get(
"RunInfo/Implantation Energy", prop, ok);
1932 header->Get(
"SampleEnvironmentInfo/Cryo", str, ok);
1938 header->Get(
"MagneticFieldEnvironmentInfo/Magnet Name", str, ok);
1944 header->Get(
"BeamlineInfo/Name", str, ok);
1949 TObjArray *runSummary =
nullptr;
1951 runSummary =
dynamic_cast<TObjArray*
>(folder->FindObjectAny(
"RunSummary"));
1953 f.GetObject(
"RunHeader/RunSummary", runSummary);
1958 std::cout << std::endl <<
"**INFO** Couldn't obtain run summary info from ROOT file " <<
fRunPathName.Data() << std::endl;
1963 TObjArrayIter summIter(runSummary);
1964 TObjString *os(
dynamic_cast<TObjString*
>(summIter.Next()));
1965 TObjArray *oa(
nullptr);
1966 TObjString *objTok(
nullptr);
1967 while (os !=
nullptr) {
1968 s = os->GetString();
1970 if (s.Contains(
"RA-L")) {
1971 oa = s.Tokenize(
" ");
1972 TObjArrayIter lineIter(oa);
1973 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1974 while (objTok !=
nullptr) {
1975 if (!objTok->GetString().CompareTo(
"RA-L")) {
1976 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1977 if ((objTok !=
nullptr) && !objTok->GetString().CompareTo(
"=")) {
1978 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1983 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1992 if (s.Contains(
"RA-R")) {
1993 oa = s.Tokenize(
" ");
1994 TObjArrayIter lineIter(oa);
1995 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1996 while (objTok !=
nullptr){
1997 if (!objTok->GetString().CompareTo(
"RA-R")) {
1998 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
1999 if ((objTok !=
nullptr) && !objTok->GetString().CompareTo(
"=")) {
2000 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
2005 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
2014 if (s.Contains(
"RA-T")) {
2015 oa = s.Tokenize(
" ");
2016 TObjArrayIter lineIter(oa);
2017 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
2018 while (objTok !=
nullptr){
2019 if (!objTok->GetString().CompareTo(
"RA-T")) {
2020 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
2021 if ((objTok !=
nullptr) && !objTok->GetString().CompareTo(
"=")) {
2022 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
2027 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
2036 if (s.Contains(
"RA-B")) {
2037 oa = s.Tokenize(
" ");
2038 TObjArrayIter lineIter(oa);
2039 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
2040 while (objTok !=
nullptr){
2041 if (!objTok->GetString().CompareTo(
"RA-B")) {
2042 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
2043 if ((objTok !=
nullptr) && !objTok->GetString().CompareTo(
"=")) {
2044 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
2049 objTok =
dynamic_cast<TObjString*
>(lineIter.Next());
2058 os =
dynamic_cast<TObjString*
>(summIter.Next());
2066 f.GetObject(
"histos", folder);
2068 std::cerr << std::endl <<
">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't obtain histos from " <<
fRunPathName.Data() << std::endl;
2074 for (UInt_t i=0; i<redGreenOffsets.size(); i++) {
2075 for (Int_t j=0; j<noOfHistos; j++) {
2076 str.Form(
"hDecay%03d", redGreenOffsets[i]+j+1);
2077 TH1F *histo =
dynamic_cast<TH1F*
>(folder->FindObjectAny(str.Data()));
2079 std::cerr << std::endl <<
">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't get histo " << str;
2080 std::cerr << std::endl;
2086 dataSet.
SetTitle(histo->GetTitle());
2090 path.Form(
"DetectorInfo/Detector%03d/", redGreenOffsets[i]+j+1);
2091 pathName = path +
"Name";
2092 header->Get(pathName, str, ok);
2095 pathName = path +
"Time Zero Bin";
2096 header->Get(pathName, dval, ok);
2099 pathName = path +
"First Good Bin";
2100 header->Get(pathName, ival, ok);
2103 pathName = path +
"Last Good Bin";
2104 header->Get(pathName, ival, ok);
2110 for (Int_t j=1; j<=histo->GetNbinsX(); j++) {
2111 histoData.push_back(histo->GetBinContent(j));
2123 for (UInt_t i=0; i<redGreenOffsets.size(); i++) {
2124 for (Int_t j=0; j<noOfHistos; j++) {
2125 str.Form(
"histos/DecayAnaModule/hDecay%03d", redGreenOffsets[i]+j+1);
2126 f.GetObject(str, histo);
2128 std::cerr << std::endl <<
">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't get histo " << str;
2129 std::cerr << std::endl;
2135 dataSet.
SetTitle(histo->GetTitle());
2139 path.Form(
"DetectorInfo/Detector%03d/", redGreenOffsets[i]+j+1);
2140 pathName = path +
"Name";
2141 header->Get(pathName, str, ok);
2144 pathName = path +
"Time Zero Bin";
2145 header->Get(pathName, dval, ok);
2148 pathName = path +
"First Good Bin";
2149 header->Get(pathName, ival, ok);
2152 pathName = path +
"Last Good Bin";
2153 header->Get(pathName, ival, ok);
2159 for (Int_t j=1; j<=histo->GetNbinsX(); j++) {
2160 histoData.push_back(histo->GetBinContent(j));
2178 fData.push_back(runData);
2869 std::cerr << std::endl <<
">> **ERROR** Couldn't open mud-file " <<
fRunPathName.Data() <<
", sorry.";
2870 std::cerr << std::endl;
2880 success = MUD_getLab( fh, str,
sizeof(str) );
2882 std::cerr << std::endl <<
">> **WARNING** Couldn't obtain the laboratory name of run " <<
fRunName.Data();
2883 std::cerr << std::endl;
2889 success = MUD_getArea( fh, str,
sizeof(str) );
2891 std::cerr << std::endl <<
">> **WARNING** Couldn't obtain the beamline of run " <<
fRunName.Data();
2892 std::cerr << std::endl;
2898 success = MUD_getApparatus( fh, str,
sizeof(str) );
2900 std::cerr << std::endl <<
">> **WARNING** Couldn't obtain the instrument name of run " <<
fRunName.Data();
2901 std::cerr << std::endl;
2907 success = MUD_getTitle( fh, str,
sizeof(str) );
2909 std::cerr << std::endl <<
">> **WARNING** Couldn't obtain the run title of run " <<
fRunName.Data();
2910 std::cerr << std::endl;
2915 success = MUD_getRunNumber( fh, &val );
2924 success = MUD_getTimeBegin( fh, (
UINT32*)&tval );
2927 dt = localtime((
const time_t*)&tval);
2931 strftime(str,
sizeof(str),
"%F", dt);
2935 memset(str, 0,
sizeof(str));
2936 strftime(str,
sizeof(str),
"%T", dt);
2940 std::cerr <<
"PRunDataHandler::ReadMudFile: **WARNING** run start time readback wrong, will set it to 1900-01-01, 00:00:00" << std::endl;
2941 stime =
"1900-01-01";
2948 stime = TString(
"");
2949 success = MUD_getTimeEnd( fh, (
UINT32*)&tval );
2952 dt = localtime((
const time_t*)&tval);
2956 strftime(str,
sizeof(str),
"%F", dt);
2960 memset(str, 0,
sizeof(str));
2961 strftime(str,
sizeof(str),
"%T", dt);
2965 std::cerr <<
"PRunDataHandler::ReadMudFile: **WARNING** run stop time readback wrong, will set it to 1900-01-01, 00:00:00" << std::endl;
2966 stime =
"1900-01-01";
2975 REAL64 timeResMultiplier = 1.0e9;
2976 success = MUD_getLab( fh, str,
sizeof(str) );
2978 setup = TString(str) + TString(
"/");
2980 success = MUD_getArea( fh, str,
sizeof(str) );
2982 setup += TString(str) + TString(
"/");
2983 if (TString(str) ==
"BNQR" || TString(str) ==
"BNMR") {
2984 std::cerr <<
"PRunDataHandler::ReadMudFile: **INFORMATION** this run was performed on " << str << std::endl;
2985 std::cerr <<
"PRunDataHandler::ReadMudFile: **INFORMATION** apply correction to time resolution" << std::endl;
2987 timeResMultiplier = 1.0e9;
2990 success = MUD_getApparatus( fh, str,
sizeof(str) );
2992 setup += TString(str) + TString(
"/");
2994 success = MUD_getSample( fh, str,
sizeof(str) );
2996 setup += TString(str);
3006 success = MUD_getField( fh, str,
sizeof(str) );
3008 success = sscanf(str,
"%lf G", &dval);
3019 success = MUD_getTemperature( fh, str,
sizeof(str) );
3021 success = sscanf(str,
"%lf K", &dval);
3032 success = MUD_getHists(fh, &type, &val);
3034 std::cerr << std::endl <<
">> **ERROR** Couldn't obtain the number of histograms of run " <<
fRunName.Data();
3035 std::cerr << std::endl;
3039 Int_t noOfHistos =
static_cast<Int_t
>(val);
3045 REAL64 timeResolution = 0.0;
3047 for (Int_t i=1; i<=noOfHistos; i++) {
3050 std::cerr << std::endl <<
">> **ERROR** Couldn't obtain the time resolution of run " <<
fRunName.Data();
3051 std::cerr << std::endl <<
">> which is fatal, sorry.";
3052 std::cerr << std::endl;
3057 timeResolution = lrval;
3059 if (lrval != timeResolution) {
3060 std::cerr << std::endl <<
">> **ERROR** various time resolutions found in run " <<
fRunName.Data();
3061 std::cerr << std::endl <<
">> this is currently not supported, sorry.";
3062 std::cerr << std::endl;
3069 runData.
SetTimeResolution(
static_cast<Double_t
>(timeResolution) * timeResMultiplier);
3082 for (Int_t i=1; i<=noOfHistos; i++) {
3088 success = MUD_getHistT0_Bin( fh, i, &val );
3090 std::cerr << std::endl <<
">> **WARNING** Couldn't get t0 of histo " << i <<
" of run " <<
fRunName.Data();
3091 std::cerr << std::endl;
3096 success = MUD_getHistBkgd1( fh, i, &val );
3098 std::cerr << std::endl <<
">> **WARNING** Couldn't get bkg bin 1 of histo " << i <<
" of run " <<
fRunName.Data();
3099 std::cerr << std::endl;
3104 success = MUD_getHistBkgd2( fh, i, &val );
3106 std::cerr << std::endl <<
">> **WARNING** Couldn't get bkg bin 2 of histo " << i <<
" of run " <<
fRunName.Data();
3107 std::cerr << std::endl;
3113 success = MUD_getHistGoodBin1( fh, i, &val );
3115 std::cerr << std::endl <<
">> **WARNING** Couldn't get good bin 1 of histo " << i <<
" of run " <<
fRunName.Data();
3116 std::cerr << std::endl;
3121 success = MUD_getHistGoodBin2( fh, i, &val );
3123 std::cerr << std::endl <<
">> **WARNING** Couldn't get good bin 2 of histo " << i <<
" of run " <<
fRunName.Data();
3124 std::cerr << std::endl;
3130 success = MUD_getHistNumBins( fh, i, &val );
3132 std::cerr << std::endl <<
">> **ERROR** Couldn't get the number of bins of histo " << i <<
".";
3133 std::cerr << std::endl <<
">> This is fatal, sorry.";
3134 std::cerr << std::endl;
3138 noOfBins =
static_cast<UInt_t
>(val);
3140 pData = (
UINT32*)malloc(noOfBins*
sizeof(pData));
3141 if (pData ==
nullptr) {
3142 std::cerr << std::endl <<
">> **ERROR** Couldn't allocate memory for data.";
3143 std::cerr << std::endl <<
">> This is fatal, sorry.";
3144 std::cerr << std::endl;
3152 std::cerr << std::endl <<
">> **ERROR** Couldn't get histo no " << i <<
".";
3153 std::cerr << std::endl <<
">> This is fatal, sorry.";
3154 std::cerr << std::endl;
3159 for (UInt_t j=0; j<noOfBins; j++) {
3160 histoData.push_back(pData[j]);
3165 Double_t maxVal = 0.0;
3167 for (UInt_t j=0; j<histoData.size(); j++) {
3168 if (histoData[j] > maxVal) {
3169 maxVal = histoData[j];
3185 fData.push_back(runData);
3221 Bool_t success =
true;
3229 std::cerr << std::endl <<
">> PRunDataHandler::ReadMduAsciiFile **ERROR** Couldn't open data file (" <<
fRunPathName.Data() <<
") for reading, sorry ...";
3230 std::cerr << std::endl;
3241 TString line, workStr;
3242 Bool_t headerTag =
false;
3243 Bool_t dataTag =
false;
3244 Int_t dataLineCounter = 0;
3246 TObjArray *tokens =
nullptr;
3250 Double_t dval = 0.0, unitScaling = 0.0;
3251 std::vector<PDoubleVector> data;
3254 f.getline(instr,
sizeof(instr));
3255 line = TString(instr);
3259 if (line.BeginsWith(
"#") || line.BeginsWith(
"%"))
3263 if (line.IsWhitespace())
3268 workStr.Remove(TString::kLeading,
' ');
3269 if (workStr.BeginsWith(
"header", TString::kIgnoreCase)) {
3277 workStr.Remove(TString::kLeading,
' ');
3278 if (workStr.BeginsWith(
"data", TString::kIgnoreCase)) {
3286 workStr.Remove(TString::kLeading,
' ');
3287 if (workStr.BeginsWith(
"title:", TString::kIgnoreCase)) {
3288 runData.
SetRunTitle(TString(workStr.Data()+workStr.First(
":")+2));
3289 }
else if (workStr.BeginsWith(
"field:", TString::kIgnoreCase)) {
3290 tokens = workStr.Tokenize(
":(");
3292 if (tokens->GetEntries() != 3) {
3293 std::cerr << std::endl <<
">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo <<
", invalid field entry in header.";
3294 std::cerr << std::endl <<
">> " << line.Data();
3295 std::cerr << std::endl;
3300 ostr =
dynamic_cast<TObjString*
>(tokens->At(1));
3301 if (ostr->GetString().IsFloat()) {
3302 dval = ostr->GetString().Atof();
3304 std::cerr << std::endl <<
">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo <<
", field value is not float/doulbe.";
3305 std::cerr << std::endl <<
">> " << line.Data();
3306 std::cerr << std::endl;
3311 ostr =
dynamic_cast<TObjString*
>(tokens->At(2));
3312 if (ostr->GetString().Contains(
"G"))
3314 else if (ostr->GetString().Contains(
"T"))
3315 unitScaling = 1.0e4;
3317 std::cerr << std::endl <<
">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo <<
", unkown field units.";
3318 std::cerr << std::endl <<
">> " << line.Data();
3319 std::cerr << std::endl;
3323 runData.
SetField(dval*unitScaling);
3330 }
else if (workStr.BeginsWith(
"temp:", TString::kIgnoreCase)) {
3331 tokens = workStr.Tokenize(
":(");
3333 if (tokens->GetEntries() != 3) {
3334 std::cerr << std::endl <<
">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo <<
", invalid temperatue entry in header.";
3335 std::cerr << std::endl <<
">> " << line.Data();
3336 std::cerr << std::endl;
3341 ostr =
dynamic_cast<TObjString*
>(tokens->At(1));
3342 if (ostr->GetString().IsFloat()) {
3343 dval = ostr->GetString().Atof();
3345 std::cerr << std::endl <<
">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo <<
", temperature value is not float/doulbe.";
3346 std::cerr << std::endl <<
">> " << line.Data();
3347 std::cerr << std::endl;
3358 }
else if (workStr.BeginsWith(
"setup:", TString::kIgnoreCase)) {
3359 runData.
SetSetup(TString(workStr.Data()+workStr.First(
":")+2));
3360 }
else if (workStr.BeginsWith(
"groups:", TString::kIgnoreCase)) {
3361 workStr = TString(workStr.Data()+workStr.First(
":")+2);
3362 groups = workStr.Atoi();
3364 std::cerr << std::endl <<
">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo <<
", groups is not a number or 0.";
3365 std::cerr << std::endl;
3369 data.resize(groups);
3370 }
else if (workStr.BeginsWith(
"channels:", TString::kIgnoreCase)) {
3371 workStr = TString(workStr.Data()+workStr.First(
":")+2);
3372 channels = workStr.Atoi();
3373 if (channels == 0) {
3374 std::cerr << std::endl <<
">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo <<
", channels is not a number or 0.";
3375 std::cerr << std::endl;
3379 }
else if (workStr.BeginsWith(
"resolution:", TString::kIgnoreCase)) {
3380 tokens = workStr.Tokenize(
":(");
3382 if (tokens->GetEntries() != 3) {
3383 std::cerr << std::endl <<
">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo <<
", invalid time resolution entry in header.";
3384 std::cerr << std::endl << line.Data();
3385 std::cerr << std::endl;
3390 ostr =
dynamic_cast<TObjString*
>(tokens->At(1));
3391 if (ostr->GetString().IsFloat()) {
3392 dval = ostr->GetString().Atof();
3394 std::cerr << std::endl <<
">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo <<
", time resolution value is not float/doulbe.";
3395 std::cerr << std::endl <<
">> " << line.Data();
3396 std::cerr << std::endl;
3401 ostr =
dynamic_cast<TObjString*
>(tokens->At(2));
3402 if (ostr->GetString().Contains(
"fs"))
3403 unitScaling = 1.0e-6;
3404 else if (ostr->GetString().Contains(
"ps"))
3405 unitScaling = 1.0e-3;
3406 else if (ostr->GetString().Contains(
"ns"))
3408 else if (ostr->GetString().Contains(
"us"))
3409 unitScaling = 1.0e3;
3411 std::cerr << std::endl <<
">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo <<
", unkown time resolution units.";
3412 std::cerr << std::endl <<
">> " << line.Data();
3413 std::cerr << std::endl;
3425 std::cerr << std::endl <<
">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo <<
", illegal header line.";
3426 std::cerr << std::endl;
3430 }
else if (dataTag) {
3432 tokens = line.Tokenize(
" ,\t");
3434 if (tokens->GetEntries() != groups+1) {
3435 std::cerr << std::endl <<
">> PRunDataHandler::ReadMduAsciiFile **ERROR** found data line with a wrong data format, cannot be handled (line no " << lineNo <<
")";
3436 std::cerr << std::endl <<
">> line:";
3437 std::cerr << std::endl <<
">> " << line.Data();
3438 std::cerr << std::endl;
3443 for (Int_t i=1; i<tokens->GetEntries(); i++) {
3444 ostr =
dynamic_cast<TObjString*
>(tokens->At(i));
3445 data[i-1].push_back(ostr->GetString().Atof());
3460 for (UInt_t i=0; i<data.size(); i++) {
3466 Double_t maxVal = 0.0;
3468 for (UInt_t j=0; j<data[i].size(); j++) {
3469 if (data[i][j] > maxVal) {
3470 maxVal = data[i][j];
3479 for (UInt_t i=0; i<data.size(); i++)
3483 if (dataLineCounter != channels) {
3484 std::cerr << std::endl <<
">> PRunDataHandler::ReadMduAsciiFile **WARNING** found " << dataLineCounter <<
" data bins,";
3485 std::cerr << std::endl <<
">> expected " << channels <<
" according to the header." << std::endl;
3488 fData.push_back(runData);
3852 Bool_t success =
true;
3860 std::cerr << std::endl <<
">> PRunDataHandler::ReadDBFile **ERROR** Couldn't open data file (" <<
fRunPathName.Data() <<
") for reading, sorry ...";
3861 std::cerr << std::endl;
3873 TString line, workStr;
3875 Bool_t firstData =
true;
3876 Bool_t labelledFormat =
true;
3877 Bool_t dataTagsRead =
false;
3882 TObjArray *tokens =
nullptr;
3886 f.getline(instr,
sizeof(instr));
3887 line = TString(instr);
3891 if (line.BeginsWith(
"#") || line.BeginsWith(
"%"))
3895 if (line.IsWhitespace())
3900 workStr.Remove(TString::kLeading,
' ');
3901 if (workStr.BeginsWith(
"title", TString::kIgnoreCase)) {
3904 }
else if (workStr.BeginsWith(
"abstract", TString::kIgnoreCase)) {
3907 }
else if (workStr.BeginsWith(
"comments", TString::kIgnoreCase)) {
3910 }
else if (workStr.BeginsWith(
"label", TString::kIgnoreCase)) {
3913 }
else if (workStr.BeginsWith(
"data", TString::kIgnoreCase) && !dataTagsRead) {
3914 dataTagsRead =
true;
3918 tokens = workStr.Tokenize(
" ,\t");
3919 for (Int_t i=1; i<tokens->GetEntries(); i++) {
3920 ostr =
dynamic_cast<TObjString*
>(tokens->At(i));
3947 if (workStr.BeginsWith(
"\\-e", TString::kIgnoreCase) ||
3948 workStr.BeginsWith(
"\\e", TString::kIgnoreCase) ||
3949 workStr.BeginsWith(
"/-e", TString::kIgnoreCase) ||
3950 workStr.BeginsWith(
"/e", TString::kIgnoreCase)) {
3957 tokens = workStr.Tokenize(
",");
3958 ostr =
dynamic_cast<TObjString*
>(tokens->At(0));
3959 if (!ostr->GetString().IsFloat()) {
3960 labelledFormat =
true;
3962 labelledFormat =
false;
3980 if (labelledFormat) {
3982 const Char_t *str = workStr.Data();
3983 if (isdigit(str[0])) {
3987 std::cerr << std::endl <<
">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo <<
":";
3988 std::cerr << std::endl <<
">> " << workStr.Data();
3989 std::cerr << std::endl <<
">> found potential run data line without run data tag.";
3993 tokens = workStr.Tokenize(
",");
3994 ostr =
dynamic_cast<TObjString*
>(tokens->At(0));
3995 tstr = ostr->GetString();
3996 if (!tstr.IsFloat()) {
3997 std::cerr << std::endl <<
">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo <<
":";
3998 std::cerr << std::endl <<
">> " << workStr.Data();
3999 std::cerr << std::endl <<
">> Expected db-data line with structure: runNo,,, runTitle";
4000 std::cerr << std::endl <<
">> runNo = " << tstr.Data() <<
", seems to be not a number.";
4009 workStr.ReplaceAll(
" ",
"");
4011 tokens = workStr.Tokenize(
"=,");
4012 if (tokens->GetEntries() < 3) {
4013 std::cerr << std::endl <<
">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo <<
":";
4014 std::cerr << std::endl <<
">> " << workStr.Data();
4015 std::cerr << std::endl <<
">> Expected db-data line with structure: tag = val,err1,err2,\\";
4019 ostr =
dynamic_cast<TObjString*
>(tokens->At(0));
4020 tstr = ostr->GetString();
4023 std::cerr << std::endl <<
">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo <<
":";
4024 std::cerr << std::endl <<
">> " << workStr.Data();
4025 std::cerr << std::endl <<
">> data tag error: " << tstr.Data() <<
" seems not present in the data tag list";
4030 switch (tokens->GetEntries()) {
4032 ostr =
dynamic_cast<TObjString*
>(tokens->At(1));
4033 tstr = ostr->GetString();
4034 if (!tstr.IsFloat()) {
4035 std::cerr << std::endl <<
">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo <<
":";
4036 std::cerr << std::endl <<
">> " << workStr.Data();
4037 std::cerr << std::endl <<
">> Expected db-data line with structure: tag = val,err1,err2,\\";
4038 std::cerr << std::endl <<
">> val = " << tstr.Data() <<
", seems to be not a number.";
4049 ostr =
dynamic_cast<TObjString*
>(tokens->At(1));
4050 tstr = ostr->GetString();
4051 if (!tstr.IsFloat()) {
4052 std::cerr << std::endl <<
">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo <<
":";
4053 std::cerr << std::endl <<
">> " << workStr.Data();
4054 std::cerr << std::endl <<
">> Expected db-data line with structure: tag = val,err1,err2,\\";
4055 std::cerr << std::endl <<
">> val = " << tstr.Data() <<
", seems to be not a number.";
4062 ostr =
dynamic_cast<TObjString*
>(tokens->At(2));
4063 tstr = ostr->GetString();
4064 if (!tstr.IsFloat()) {
4065 std::cerr << std::endl <<
">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo <<
":";
4066 std::cerr << std::endl <<
">> " << workStr.Data();
4067 std::cerr << std::endl <<
">> Expected db-data line with structure: tag = val,err1,err2,\\";
4068 std::cerr << std::endl <<
">> err1 = " << tstr.Data() <<
", seems to be not a number.";
4076 std::cerr << std::endl <<
">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo <<
":";
4077 std::cerr << std::endl <<
">> " << workStr.Data();
4078 std::cerr << std::endl <<
">> Expected db-data line with structure: tag = val,err1,err2,\\";
4086 tokens = workStr.Tokenize(
",");
4088 std::cerr << std::endl <<
">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo <<
":";
4089 std::cerr << std::endl <<
">> " << workStr.Data();
4090 std::cerr << std::endl <<
">> Expected db-data line with structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle";
4091 std::cerr << std::endl <<
">> found = " << tokens->GetEntries() <<
" tokens, however expected " << 3*runData.
fDataNonMusr.
GetDataTags()->size()+1;
4092 std::cerr << std::endl <<
">> Perhaps there are commas without space inbetween, like 12.3,, 3.2,...";
4098 for (Int_t i=0; i<tokens->GetEntries()-1; i+=3) {
4100 ostr =
dynamic_cast<TObjString*
>(tokens->At(i));
4101 tstr = ostr->GetString();
4102 if (!tstr.IsFloat()) {
4103 std::cerr << std::endl <<
">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo <<
":";
4104 std::cerr << std::endl <<
">> " << workStr.Data();
4105 std::cerr << std::endl <<
">> Expected db-data line with structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle";
4106 std::cerr << std::endl <<
">> value=" << tstr.Data() <<
" seems not to be a number";
4113 ostr =
dynamic_cast<TObjString*
>(tokens->At(i+1));
4114 tstr = ostr->GetString();
4115 if (tstr.IsWhitespace()) {
4117 }
else if (tstr.IsFloat()) {
4120 std::cerr << std::endl <<
">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo <<
":";
4121 std::cerr << std::endl <<
">> " << workStr.Data();
4122 std::cerr << std::endl <<
">> Expected db-data line with structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle";
4123 std::cerr << std::endl <<
">> error1=" << tstr.Data() <<
" seems not to be a number";
4140 std::cerr << std::endl <<
">> PRunDataHandler::ReadDBFile **ERROR**";
4141 std::cerr << std::endl <<
">> number of LABELS found = " << runData.
fDataNonMusr.
GetLabels()->size();
4143 std::cerr << std::endl <<
">> They have to be equal!!";
4154 std::cerr << std::endl <<
">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo;
4157 std::cerr << std::endl <<
">> They have to be equal!!";
4162 std::cerr << std::endl <<
">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo;
4165 std::cerr << std::endl <<
">> They have to be equal!!";
4180 fData.push_back(runData);
4358 std::cout << std::endl <<
">> PRunDataHandler::WriteMusrRootFile(): writing a root data file (" << fln.Data() <<
") ... " << std::endl;
4361 std::unique_ptr<TFile> fout = std::make_unique<TFile>(fln,
"RECREATE", fln);
4362 if (fout ==
nullptr) {
4363 std::cerr << std::endl <<
"PRunDataHandler::WriteMusrRootFile(): **ERROR** Couldn't create ROOT file '" << fln <<
"'" << std::endl;
4369 std::unique_ptr<TMusrRunHeader> header = std::make_unique<TMusrRunHeader>(
true);
4370 TFolder *histosFolder, *decayAnaModule, *runHeader;
4371 TDirectory *histosDir, *decayAnaDir, *runHeaderDir;
4373 histosFolder =
new TFolder(
"histos",
"Histograms");
4374 decayAnaModule = histosFolder->AddFolder(
"DecayAnaModule",
"muSR decay histograms");
4375 runHeader =
new TFolder(
"RunHeader",
"MusrRoot Run Header Info");
4377 histosDir = fout->mkdir(
"histos");
4378 decayAnaDir = histosDir->mkdir(
"decayAnaModule");
4379 runHeaderDir = fout->mkdir(
"RunHeader");
4383 TString str, pathName;
4386 time_t start{0}, stop{0};
4387 Bool_t valid{
false};
4391 str =
fData[0].GetGenericValidatorUrl()->Copy();
4392 header->Set(
"RunInfo/Generic Validator URL", str);
4393 str =
fData[0].GetSpecificValidatorUrl()->Copy();
4394 header->Set(
"RunInfo/Specific Validator URL", str);
4395 str =
fData[0].GetGenerator()->Copy();
4396 header->Set(
"RunInfo/Generator", str);
4397 str =
fData[0].GetFileName()->Copy();
4398 header->Set(
"RunInfo/File Name", str);
4399 str =
fData[0].GetRunTitle()->Copy();
4400 header->Set(
"RunInfo/Run Title", str);
4401 header->Set(
"RunInfo/Run Number",
fData[0].GetRunNumber());
4402 str =
fData[0].GetStartDate()->Copy() +
" " +
fData[0].GetStartTime()->Copy();
4403 header->Set(
"RunInfo/Run Start Time", str);
4404 str =
fData[0].GetStopDate()->Copy() +
" " +
fData[0].GetStopTime()->Copy();
4405 header->Set(
"RunInfo/Run Stop Time", str);
4406 start =
fData[0].CalcStartDateTime(valid);
4408 stop =
fData[0].CalcStopDateTime(valid);
4410 ival = (int)stop - (
int)start;
4411 prop.
Set(
"Run Duration", ival,
"sec");
4412 header->Set(
"RunInfo/Run Duration", prop);
4413 str =
fData[0].GetLaboratory()->Copy();
4414 header->Set(
"RunInfo/Laboratory", str);
4415 str =
fData[0].GetInstrument()->Copy();
4416 header->Set(
"RunInfo/Instrument", str);
4417 dval[0] =
fData[0].GetMuonBeamMomentum();
4418 prop.
Set(
"Muon Beam Momentum", dval[0],
"MeV/c");
4419 header->Set(
"RunInfo/Muon Beam Momentum", prop);
4420 str =
fData[0].GetMuonSpecies()->Copy();
4421 header->Set(
"RunInfo/Muon Species", str);
4422 str =
fData[0].GetMuonSource()->Copy();
4423 header->Set(
"RunInfo/Muon Source", str);
4424 str =
fData[0].GetSetup()->Copy();
4425 header->Set(
"RunInfo/Setup", str);
4426 str =
fData[0].GetComment()->Copy();
4427 header->Set(
"RunInfo/Comment", str);
4428 str =
fData[0].GetSample()->Copy();
4429 header->Set(
"RunInfo/Sample Name", str);
4430 dval[0] =
fData[0].GetTemperature(0);
4431 dval[1] =
fData[0].GetTempError(0);
4433 header->Set(
"RunInfo/Sample Temperature", prop);
4434 dval[0] =
fData[0].GetField();
4435 prop.
Set(
"Sample Magnetic Field", dval[0],
"G");
4436 header->Set(
"RunInfo/Sample Magnetic Field", prop);
4437 header->Set(
"RunInfo/No of Histos",
static_cast<Int_t
>(
fData[0].GetNoOfHistos()));
4438 dval[0] =
fData[0].GetTimeResolution();
4439 prop.
Set(
"Time Resolution", dval[0],
"ns");
4440 header->Set(
"RunInfo/Time Resolution", prop);
4441 header->Set(
"RunInfo/RedGreen Offsets",
fData[0].GetRedGreenOffset());
4446 UInt_t size =
fData[0].GetNoOfHistos();
4447 for (UInt_t i=0; i<size; i++) {
4448 dataSet =
fData[0].GetDataSet(i,
false);
4449 if (dataSet ==
nullptr) {
4450 std::cerr << std::endl <<
">> PRunDataHandler::WriteMusrRootFile: **ERROR** Couldn't get data set (idx=" << i <<
")";
4451 std::cerr << std::endl <<
">> something is really wrong!" << std::endl;
4455 pathName.Form(
"DetectorInfo/Detector%03d/Name", histoNo);
4457 if (!str.CompareTo(
"n/a"))
4458 str.Form(
"Detector%3d", histoNo);
4459 header->Set(pathName, str);
4460 pathName.Form(
"DetectorInfo/Detector%03d/Histo Number", histoNo);
4461 header->Set(pathName, histoNo);
4462 pathName.Form(
"DetectorInfo/Detector%03d/Histo Length", histoNo);
4464 pathName.Form(
"DetectorInfo/Detector%03d/Time Zero Bin", histoNo);
4466 pathName.Form(
"DetectorInfo/Detector%03d/First Good Bin", histoNo);
4468 header->Set(pathName,
static_cast<Int_t
>(ival/
fAny2ManyInfo->rebin));
4469 pathName.Form(
"DetectorInfo/Detector%03d/Last Good Bin", histoNo);
4471 header->Set(pathName,
static_cast<Int_t
>(ival/
fAny2ManyInfo->rebin));
4475 str =
fData[0].GetCryoName()->Copy();
4476 header->Set(
"SampleEnvironmentInfo/Cryo", str);
4479 str =
fData[0].GetMagnetName()->Copy();
4480 header->Set(
"MagneticFieldEnvironmentInfo/Magnet Name", str);
4483 str =
fData[0].GetBeamline()->Copy();
4484 header->Set(
"BeamlineInfo/Name", str);
4487 std::vector<TH1F*> histos;
4488 TH1F *histo =
nullptr;
4491 for (UInt_t i=0; i<size; i++) {
4492 dataSet =
fData[0].GetDataSet(i,
false);
4493 if (dataSet ==
nullptr) {
4494 std::cerr << std::endl <<
">> PRunDataHandler::WriteMusrRootFile: **ERROR** Couldn't get data set (idx=" << i <<
")";
4495 std::cerr << std::endl <<
">> something is really wrong!" << std::endl;
4498 str.Form(
"hDecay%03d", dataSet->
GetHistoNo());
4499 length = dataSet->
GetData()->size();
4500 histo =
new TH1F(str.Data(), str.Data(), length+1, -0.5,
static_cast<Double_t
>(length)+0.5);
4501 Int_t sum=0, entries=0;
4502 for (UInt_t j=0; j<length; j++) {
4503 entries = dataSet->
GetData()->at(j);
4504 histo->SetBinContent(j+1, entries);
4507 histo->SetEntries(sum);
4508 histos.push_back(histo);
4511 UInt_t dataRebin = 0;
4512 UInt_t dataCount = 0;
4513 for (UInt_t i=0; i<size; i++) {
4514 dataSet =
fData[0].GetDataSet(i,
false);
4515 if (dataSet ==
nullptr) {
4516 std::cerr << std::endl <<
">> PRunDataHandler::WriteMusrRootFile: **ERROR** Couldn't get data set (idx=" << i <<
")";
4517 std::cerr << std::endl <<
">> something is really wrong!" << std::endl;
4520 str.Form(
"hDecay%03d", dataSet->
GetHistoNo());
4521 length = dataSet->
GetData()->size();
4522 histo =
new TH1F(str.Data(), str.Data(),
static_cast<Int_t
>(length/
fAny2ManyInfo->rebin)+1, -0.5,
static_cast<Double_t
>(
static_cast<Int_t
>(length/
fAny2ManyInfo->rebin))+0.5);
4524 Int_t sum=0, entries=0;
4525 for (UInt_t j=0; j<length; j++) {
4528 histo->SetBinContent(dataCount, dataRebin);
4531 entries = dataSet->
GetData()->at(j);
4533 dataRebin +=
static_cast<UInt_t
>(entries);
4535 histo->SetEntries(sum);
4536 histos.push_back(histo);
4542 for (UInt_t i=0; i<histos.size(); i++)
4543 decayAnaModule->Add(histos[i]);
4546 for (UInt_t i=0; i<histos.size(); i++)
4547 decayAnaDir->Add(histos[i]);
4551 if (header->FillFolder(runHeader))
4553 histosFolder->Write();
4555 if (header->FillDirectory(runHeaderDir)) {
4556 runHeaderDir->Write();
4569 is.open(fln.Data(), std::ios::binary);
4570 if (!is.is_open()) {
4571 std::cerr << std::endl <<
"PRunDataHandler::WriteMusrRootFile(): **ERROR** Couldn't open the root-file for streaming." << std::endl;
4577 is.seekg(0, std::ios::end);
4578 length = is.tellg();
4579 is.seekg(0, std::ios::beg);
4582 std::cerr << std::endl <<
"PRunDataHandler::WriteMusrRootFile(): **ERROR** Couldn't determine the root-file size." << std::endl;
4588 buffer =
new char [length];
4592 is.read(buffer, length);
4593 std::cout.write(buffer, length);
4809#ifdef PNEXUS_ENABLED
4810 std::string str{
""};
4817 std::cout << std::endl <<
">> PRunDataHandler::WriteNexusFile(): writing a NeXus data file (" << fln.Data() <<
") ... " << std::endl;
4819 if (format.Contains(
"HDF4", TString::kIgnoreCase)) {
4823 std::unique_ptr<nxH4::PNeXus>
nxs = std::make_unique<nxH4::PNeXus>();
4824 if (
nxs ==
nullptr) {
4825 std::cerr << std::endl <<
">> PRunDataHandler::WriteNexusFile(): **ERROR** couldn't invoke the NeXus object." << std::endl;
4830 nxs->AddGroupAttribute(
"/",
"NeXus_version", std::string(
"4.3.0"));
4833 nxs->AddGroupAttribute(
"/",
"HDF_version",
nxs->GetHdf4LibVersion());
4836 nxs->AddGroupAttribute(
"/",
"file_name", std::string(fln.Data()));
4840 nxs->AddGroupAttribute(
"/",
"file_time", dt);
4849 #ifdef HAVE_CONFIG_H
4850 str = PACKAGE_VERSION;
4852 nxs->AddDatasetAttribute<std::string>(
"/run/program_name",
"version", str);
4867 str = *
fData[0].GetLaboratory();
4871 str = *
fData[0].GetBeamline();
4875 str = std::string(
fData[0].GetStartDate()->Data()) + std::string(
"T") + std::string(
fData[0].GetStartTime()->Data());
4879 str = std::string(
fData[0].GetStopDate()->Data()) + std::string(
"T") + std::string(
fData[0].GetStopTime()->Data());
4896 nxs->AddDatasetAttribute<
float>(
"/run/sample/temperature",
"units", std::string(
"Kelvin"));
4900 nxs->AddDatasetAttribute<
float>(
"/run/sample/magnetic_field",
"units", std::string(
"Gauss"));
4910 nxs->AddDatasetAttribute<
float>(
"/run/sample/magnetic_field_vector",
"coordinate_system", std::string(
"cartesian"));
4911 nxs->AddDatasetAttribute<
float>(
"/run/sample/magnetic_field_vector",
"units", std::string(
"Gauss"));
4912 nxs->AddDatasetAttribute<
float>(
"/run/sample/magnetic_field_vector",
"available", 0);
4915 str = *
fData[0].GetInstrument();
4926 double total_counts = 0;
4928 for (
unsigned int i=0; i<
fData[0].GetNoOfHistos(); i++) {
4929 dataSet =
fData[0].GetDataSet(i,
false);
4930 if (dataSet ==
nullptr) {
4931 std::cerr << std::endl <<
">> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=0" << i <<
")";
4932 std::cerr << std::endl <<
">> something is really wrong!" << std::endl;
4935 for (
unsigned int j=0; j<dataSet->
GetData()->size(); j++)
4936 total_counts += dataSet->
GetData()->at(j);
4938 float total_counts_mev = (float) total_counts / 1.0e6;
4940 nxs->AddDatasetAttribute<
float>(
"/run/instrument/beam/total_counts",
"units", std::string(
"MEv"));
4945 nxs->AddDatasetAttribute<
float>(
"/run/histogram_data_1/resolution",
"units", std::string(
"picoseconds"));
4949 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/time_zero",
"units", std::string(
"microseconds"));
4950 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/time_zero",
"available", 0);
4954 dataSet =
fData[0].GetDataSet(0,
false);
4956 std::vector<float> time;
4957 for (
unsigned int i=0; i<length; i++)
4958 time.push_back(((
float)i+0.5)*res);
4960 nxs->AddDatasetAttribute<
float>(
"/run/histogram_data_1/raw_time",
"axis", 1);
4961 nxs->AddDatasetAttribute<
float>(
"/run/histogram_data_1/raw_time",
"primary", 0);
4962 nxs->AddDatasetAttribute<
float>(
"/run/histogram_data_1/raw_time",
"units", std::string(
"microseconds"));
4963 nxs->AddDatasetAttribute<
float>(
"/run/histogram_data_1/raw_time",
"available", 0);
4967 nxs->AddDatasetAttribute<
float>(
"/run/histogram_data_1/corrected_time",
"axis", 1);
4968 nxs->AddDatasetAttribute<
float>(
"/run/histogram_data_1/corrected_time",
"units", std::string(
"microseconds"));
4969 nxs->AddDatasetAttribute<
float>(
"/run/histogram_data_1/corrected_time",
"available", 0);
4972 std::vector<int> grouping(
fData[0].GetNoOfHistos(), 0);
4974 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/grouping",
"avaliabe", 0);
4979 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/alpha",
"avaliabe", 0);
4985 int noHisto, histoLength;
4987 noHisto =
fData[0].GetNoOfHistos();
4988 for (UInt_t i=0; i<
fData[0].GetNoOfHistos(); i++) {
4989 dataSet =
fData[0].GetDataSet(i,
false);
4990 if (dataSet ==
nullptr) {
4991 std::cerr << std::endl <<
">> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=" << i <<
")";
4992 std::cerr << std::endl <<
">> something is really wrong!" << std::endl;
4995 size = dataSet->
GetData()->size();
4997 for (UInt_t j=0; j<size; j++) {
4998 data.push_back((UInt_t)dataSet->
GetData()->at(j));
5002 UInt_t dataRebin = 0;
5003 UInt_t dataCount = 0;
5004 noHisto =
fData[0].GetNoOfHistos();
5005 for (UInt_t i=0; i<
fData[0].GetNoOfHistos(); i++) {
5006 dataSet =
fData[0].GetDataSet(i,
false);
5007 if (dataSet ==
nullptr) {
5008 std::cerr << std::endl <<
">> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=" << i <<
")";
5009 std::cerr << std::endl <<
">> something is really wrong!" << std::endl;
5012 size = dataSet->
GetData()->size();
5014 for (UInt_t j=0; j<size; j++) {
5017 data.push_back(dataRebin);
5020 dataRebin +=
static_cast<UInt_t
>(dataSet->
GetData()->at(j));
5026 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/counts",
"units", std::string(
"counts"));
5027 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/counts",
"signal", 1);
5028 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/counts",
"number", noHisto);
5029 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/counts",
"length", (int)size);
5030 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/counts",
"t0_bin", 0);
5031 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/counts",
"first_good_bin", 0);
5032 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/counts",
"last_good_bin", 0);
5034 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/counts",
"offset", res);
5036 nxs->AddGroupAttribute(
"/raw_data_1",
"NX_class", std::string(
"NXentry"));
5042 str = *
fData[0].GetBeamline();
5055 str = std::string(
fData[0].GetStartDate()->Data()) + std::string(
"T") + std::string(
fData[0].GetStartTime()->Data());
5057 nxs->AddDatasetAttribute<std::string>(
"/raw_data_1/start_time",
"units",
"ISO8601");
5060 str = std::string(
fData[0].GetStopDate()->Data()) + std::string(
"T") + std::string(
fData[0].GetStopTime()->Data());
5062 nxs->AddDatasetAttribute<std::string>(
"/raw_data_1/end_time",
"units",
"ISO8601");
5069 nxs->AddGroupAttribute(
"/raw_data_1/instrument",
"NX_class", std::string(
"NXinstrument"));
5072 str = *
fData[0].GetInstrument();
5076 nxs->AddGroupAttribute(
"/raw_data_1/instrument/source",
"NX_class", std::string(
"NXsource"));
5079 str =
fData[0].GetLaboratory()->Data();
5083 TString tstr = *
fData[0].GetInstrument();
5084 std::string type{
"n/a"};
5085 if (tstr.Contains(
"LEM", TString::kIgnoreCase)) {
5086 type =
"low energy muon source";
5087 }
else if (tstr.Contains(
"GPS", TString::kIgnoreCase) || tstr.Contains(
"GPD", TString::kIgnoreCase) ||
5088 tstr.Contains(
"LTF", TString::kIgnoreCase) || tstr.Contains(
"FLAME", TString::kIgnoreCase) ||
5089 tstr.Contains(
"HAL-9500", TString::kIgnoreCase) || tstr.Contains(
"DOLLY", TString::kIgnoreCase) ||
5090 tstr.Contains(
"VMS", TString::kIgnoreCase)) {
5091 type =
"quasi-continous muon source";
5092 }
else if (tstr.Contains(
"EMU", TString::kIgnoreCase) || tstr.Contains(
"MUSR", TString::kIgnoreCase) ||
5093 tstr.Contains(
"HIFI", TString::kIgnoreCase)) {
5094 type =
"pulsed muon source";
5099 str =
"positive muons";
5103 nxs->AddGroupAttribute(
"/raw_data_1/instrument/detector_1",
"NX_class", std::string(
"NXdetector"));
5106 int noHistos =
fData[0].GetNoOfHistos();
5107 std::vector<int> spectrum_index(noHistos);
5108 for (
unsigned int i=0; i<spectrum_index.size(); i++)
5109 spectrum_index[i] = i+1;
5110 nxs->AddDataset<
int>(
"/raw_data_1/instrument/detector_1/spectrum_index", spectrum_index, {(uint32_t)spectrum_index.size()},
nxH4::H4DataType::kINT32);
5115 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/instrument/detector_1/raw_time",
"available", 0);
5123 int noHisto, histoLength;
5125 noHisto =
fData[0].GetNoOfHistos();
5126 for (UInt_t i=0; i<
fData[0].GetNoOfHistos(); i++) {
5127 dataSet =
fData[0].GetDataSet(i,
false);
5128 if (dataSet ==
nullptr) {
5129 std::cerr << std::endl <<
">> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=" << i <<
")";
5130 std::cerr << std::endl <<
">> something is really wrong!" << std::endl;
5133 size = dataSet->GetData()->size();
5135 for (UInt_t j=0; j<size; j++) {
5136 data.push_back((UInt_t)dataSet->GetData()->at(j));
5140 UInt_t dataRebin = 0;
5141 UInt_t dataCount = 0;
5142 noHisto =
fData[0].GetNoOfHistos();
5143 for (UInt_t i=0; i<
fData[0].GetNoOfHistos(); i++) {
5144 dataSet =
fData[0].GetDataSet(i,
false);
5145 if (dataSet ==
nullptr) {
5146 std::cerr << std::endl <<
">> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=" << i <<
")";
5147 std::cerr << std::endl <<
">> something is really wrong!" << std::endl;
5150 size = dataSet->GetData()->size();
5152 for (UInt_t j=0; j<size; j++) {
5155 data.push_back(dataRebin);
5158 dataRebin +=
static_cast<UInt_t
>(dataSet->GetData()->at(j));
5163 nxs->AddDataset<
int>(
"/raw_data_1/instrument/detector_1/counts", data, {(uint32_t)noHisto, (uint32_t)size},
nxH4::H4DataType::kINT32);
5164 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/instrument/detector_1/counts",
"axes", std::string(
"spectrum_index,time_bin"));
5165 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/instrument/detector_1/counts",
"long_name", std::string(
"positon counts"));
5166 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/instrument/detector_1/counts",
"signal", 1);
5168 std::vector<int> t0_bin;
5169 for (
unsigned int i=0; i<
fData[0].GetNoOfHistos(); i++)
5171 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/instrument/detector_1/counts",
"t0_bin", {t0_bin});
5172 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/instrument/detector_1/counts",
"units", std::string(
"counts"));
5175 nxs->AddGroupAttribute(
"/raw_data_1/detector_1",
"NX_class", std::string(
"NXdata"));
5179 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/detector_1/counts",
"axes", std::string(
"spectrum_index,time_bin"));
5180 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/detector_1/counts",
"long_name", std::string(
"positon counts"));
5181 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/detector_1/counts",
"signal", 1);
5186 std::cerr << std::endl <<
"**ERROR** PRunDataHandler::WriteNexusFile, fln=" << fln << std::endl;
5189 }
catch (
const std::runtime_error& e) {
5190 std::cerr << std::endl <<
"HDF4 error: " << e.what() << std::endl;
5197 std::unique_ptr<nxH5::PNeXus>
nxs = std::make_unique<nxH5::PNeXus>();
5198 if (
nxs ==
nullptr) {
5199 std::cerr << std::endl <<
">> PRunDataHandler::WriteNexusFile(): **ERROR** couldn't invoke the NeXus object." << std::endl;
5204 nxs->AddGroupAttribute(
"/",
"NeXus_version", std::string(
"4.3.0"));
5207 nxs->AddGroupAttribute(
"/",
"HDF_version",
nxs->GetHdf5LibVersion());
5210 nxs->AddGroupAttribute(
"/",
"file_name", std::string(fln.Data()));
5214 nxs->AddGroupAttribute(
"/",
"file_time", dt);
5218 nxs->AddDataset<
int>(
"/run/IDF_version", {(int)
fAny2ManyInfo->idf}, {1}, H5::PredType::NATIVE_INT32);
5221 nxs->AddDataset<std::string>(
"/run/program_name", {
"any2many"}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5223 #ifdef HAVE_CONFIG_H
5224 str = PACKAGE_VERSION;
5226 nxs->AddDatasetAttribute<std::string>(
"/run/program_name",
"version", str);
5229 nxs->AddDataset<
int>(
"/run/number", {
fData[0].GetRunNumber()}, {1}, H5::PredType::NATIVE_INT32);
5232 nxs->AddDataset<std::string>(
"/run/title", {
fData[0].GetRunTitle()->Data()}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5235 nxs->AddDataset<std::string>(
"/run/notes", {std::string(
"n/a")}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5238 nxs->AddDataset<std::string>(
"/run/analysis", {std::string(
"muonTD")}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5241 str = *
fData[0].GetLaboratory();
5242 nxs->AddDataset<std::string>(
"/run/lab", {str}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5245 str = *
fData[0].GetBeamline();
5246 nxs->AddDataset<std::string>(
"/run/beamline", {str}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5249 str = std::string(
fData[0].GetStartDate()->Data()) + std::string(
"T") + std::string(
fData[0].GetStartTime()->Data());
5250 nxs->AddDataset<std::string>(
"/run/start_time", {str}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5253 str = std::string(
fData[0].GetStopDate()->Data()) + std::string(
"T") + std::string(
fData[0].GetStopTime()->Data());
5254 nxs->AddDataset<std::string>(
"/run/stop_time", {str}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5257 nxs->AddDataset<
int>(
"/run/switching_states", {1}, {1}, H5::PredType::NATIVE_INT32);
5260 nxs->AddDataset<std::string>(
"/run/user/name", {std::string(
"n/a")}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5263 nxs->AddDataset<std::string>(
"/run/user/experiment_number", {std::string(
"n/a")}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5266 nxs->AddDataset<std::string>(
"/run/sample/name", {
fData[0].GetSample()->Data()}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5269 nxs->AddDataset<
float>(
"/run/sample/temperature", {(float)
fData[0].GetTemperature(0)}, {1}, H5::PredType::NATIVE_FLOAT);
5270 nxs->AddDatasetAttribute<
float>(
"/run/sample/temperature",
"units", std::string(
"Kelvin"));
5273 nxs->AddDataset<
float>(
"/run/sample/magnetic_field", {(float)
fData[0].GetField()}, {1}, H5::PredType::NATIVE_FLOAT);
5274 nxs->AddDatasetAttribute<
float>(
"/run/sample/magnetic_field",
"units", std::string(
"Gauss"));
5277 nxs->AddDataset<std::string>(
"/run/sample/environment", {
fData[0].GetSetup()->Data()}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5280 nxs->AddDataset<std::string>(
"/run/sample/shape", {std::string(
"n/a")}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5283 nxs->AddDataset<
float>(
"/run/sample/magnetic_field_vector", {1.0, 1.0, 1.0}, {3}, H5::PredType::NATIVE_FLOAT);
5284 nxs->AddDatasetAttribute<
float>(
"/run/sample/magnetic_field_vector",
"coordinate_system", std::string(
"cartesian"));
5285 nxs->AddDatasetAttribute<
float>(
"/run/sample/magnetic_field_vector",
"units", std::string(
"Gauss"));
5286 nxs->AddDatasetAttribute<
float>(
"/run/sample/magnetic_field_vector",
"available", 0);
5289 str = *
fData[0].GetInstrument();
5290 nxs->AddDataset<std::string>(
"/run/instrument/name", {str}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5293 nxs->AddDataset<
int>(
"/run/instrument/detector/number", {(int)
fData[0].GetNoOfHistos()}, {1}, H5::PredType::NATIVE_INT32);
5296 nxs->AddDataset<std::string>(
"/run/instrument/collimator/type", {std::string(
"n/a")}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5300 double total_counts = 0;
5302 for (
unsigned int i=0; i<
fData[0].GetNoOfHistos(); i++) {
5303 dataSet =
fData[0].GetDataSet(i,
false);
5304 if (dataSet ==
nullptr) {
5305 std::cerr << std::endl <<
">> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=0" << i <<
")";
5306 std::cerr << std::endl <<
">> something is really wrong!" << std::endl;
5309 for (
unsigned int j=0; j<dataSet->
GetData()->size(); j++)
5310 total_counts += dataSet->
GetData()->at(j);
5312 float total_counts_mev = (float) total_counts / 1.0e6;
5313 nxs->AddDataset<
float>(
"/run/instrument/beam/total_counts", {total_counts_mev}, {1}, H5::PredType::NATIVE_FLOAT);
5314 nxs->AddDatasetAttribute<
float>(
"/run/instrument/beam/total_counts",
"units", std::string(
"MEv"));
5318 nxs->AddDataset<
float>(
"/run/histogram_data_1/resolution", {res}, {1}, H5::PredType::NATIVE_FLOAT);
5319 nxs->AddDatasetAttribute<
float>(
"/run/histogram_data_1/resolution",
"units", std::string(
"picoseconds"));
5322 nxs->AddDataset<
int>(
"/run/histogram_data_1/time_zero", {0}, {1}, H5::PredType::NATIVE_INT32);
5323 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/time_zero",
"units", std::string(
"microseconds"));
5324 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/time_zero",
"available", 0);
5328 dataSet =
fData[0].GetDataSet(0,
false);
5330 std::vector<float> time;
5331 for (
unsigned int i=0; i<length; i++)
5332 time.push_back(((
float)i+0.5)*res);
5333 nxs->AddDataset<
float>(
"/run/histogram_data_1/raw_time", time, {length}, H5::PredType::NATIVE_FLOAT);
5334 nxs->AddDatasetAttribute<
float>(
"/run/histogram_data_1/raw_time",
"axis", 1);
5335 nxs->AddDatasetAttribute<
float>(
"/run/histogram_data_1/raw_time",
"primary", 0);
5336 nxs->AddDatasetAttribute<
float>(
"/run/histogram_data_1/raw_time",
"units", std::string(
"microseconds"));
5337 nxs->AddDatasetAttribute<
float>(
"/run/histogram_data_1/raw_time",
"available", 0);
5340 nxs->AddDataset<
float>(
"/run/histogram_data_1/corrected_time", time, {length}, H5::PredType::NATIVE_FLOAT);
5341 nxs->AddDatasetAttribute<
float>(
"/run/histogram_data_1/corrected_time",
"axis", 1);
5342 nxs->AddDatasetAttribute<
float>(
"/run/histogram_data_1/corrected_time",
"units", std::string(
"microseconds"));
5343 nxs->AddDatasetAttribute<
float>(
"/run/histogram_data_1/corrected_time",
"available", 0);
5346 std::vector<int> grouping(
fData[0].GetNoOfHistos(), 0);
5347 nxs->AddDataset<
int>(
"/run/histogram_data_1/grouping", grouping, {grouping.size()}, H5::PredType::NATIVE_INT32);
5348 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/grouping",
"avaliabe", 0);
5352 nxs->AddDataset<
int>(
"/run/histogram_data_1/alpha", {ival}, {1}, H5::PredType::NATIVE_INT32);
5353 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/alpha",
"avaliabe", 0);
5359 int noHisto, histoLength;
5361 noHisto =
fData[0].GetNoOfHistos();
5362 for (UInt_t i=0; i<
fData[0].GetNoOfHistos(); i++) {
5363 dataSet =
fData[0].GetDataSet(i,
false);
5364 if (dataSet ==
nullptr) {
5365 std::cerr << std::endl <<
">> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=" << i <<
")";
5366 std::cerr << std::endl <<
">> something is really wrong!" << std::endl;
5369 size = dataSet->
GetData()->size();
5371 for (UInt_t j=0; j<size; j++) {
5372 data.push_back((UInt_t)dataSet->
GetData()->at(j));
5376 UInt_t dataRebin = 0;
5377 UInt_t dataCount = 0;
5378 noHisto =
fData[0].GetNoOfHistos();
5379 for (UInt_t i=0; i<
fData[0].GetNoOfHistos(); i++) {
5380 dataSet =
fData[0].GetDataSet(i,
false);
5381 if (dataSet ==
nullptr) {
5382 std::cerr << std::endl <<
">> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=" << i <<
")";
5383 std::cerr << std::endl <<
">> something is really wrong!" << std::endl;
5386 size = dataSet->
GetData()->size();
5388 for (UInt_t j=0; j<size; j++) {
5391 data.push_back(dataRebin);
5394 dataRebin +=
static_cast<UInt_t
>(dataSet->
GetData()->at(j));
5399 nxs->AddDataset<
int>(
"/run/histogram_data_1/counts", data, {(
long unsigned int)noHisto, size}, H5::PredType::NATIVE_INT32);
5400 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/counts",
"units", std::string(
"counts"));
5401 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/counts",
"signal", 1);
5402 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/counts",
"number", noHisto);
5403 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/counts",
"length", size);
5404 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/counts",
"t0_bin", 0);
5405 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/counts",
"first_good_bin", 0);
5406 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/counts",
"last_good_bin", 0);
5408 nxs->AddDatasetAttribute<
int>(
"/run/histogram_data_1/counts",
"offset", res);
5410 nxs->AddGroupAttribute(
"/raw_data_1",
"NX_class", std::string(
"NXentry"));
5413 nxs->AddDataset<
int>(
"/raw_data_1/IDF_version", {(int)
fAny2ManyInfo->idf}, {1}, H5::PredType::NATIVE_INT32);
5416 str = *
fData[0].GetBeamline();
5417 nxs->AddDataset<std::string>(
"/raw_data_1/beamline", {str}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5420 nxs->AddDataset<std::string>(
"/raw_data_1/definition", {std::string(
"muonTD")}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5423 nxs->AddDataset<
int>(
"/raw_data_1/run_number", {
fData[0].GetRunNumber()}, {1}, H5::PredType::NATIVE_INT32);
5426 nxs->AddDataset<std::string>(
"/raw_data_1/title", {
fData[0].GetRunTitle()->Data()}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5429 str = std::string(
fData[0].GetStartDate()->Data()) + std::string(
"T") + std::string(
fData[0].GetStartTime()->Data());
5430 nxs->AddDataset<std::string>(
"/raw_data_1/start_time", {str}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5431 nxs->AddDatasetAttribute<std::string>(
"/raw_data_1/start_time",
"units",
"ISO8601");
5434 str = std::string(
fData[0].GetStopDate()->Data()) + std::string(
"T") + std::string(
fData[0].GetStopTime()->Data());
5435 nxs->AddDataset<std::string>(
"/raw_data_1/end_time", {str}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5436 nxs->AddDatasetAttribute<std::string>(
"/raw_data_1/end_time",
"units",
"ISO8601");
5440 nxs->AddDataset<std::string>(
"/raw_data_1/experiment_identifier", {str}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5443 nxs->AddGroupAttribute(
"/raw_data_1/instrument",
"NX_class", std::string(
"NXinstrument"));
5446 str = *
fData[0].GetInstrument();
5447 nxs->AddDataset<std::string>(
"/raw_data_1/instrument/name", {str}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5450 nxs->AddGroupAttribute(
"/raw_data_1/instrument/source",
"NX_class", std::string(
"NXsource"));
5453 str =
fData[0].GetLaboratory()->Data();
5454 nxs->AddDataset<std::string>(
"/raw_data_1/instrument/source/name", {str}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5457 TString tstr = *
fData[0].GetInstrument();
5458 std::string type{
"n/a"};
5459 if (tstr.Contains(
"LEM", TString::kIgnoreCase)) {
5460 type =
"low energy muon source";
5461 }
else if (tstr.Contains(
"GPS", TString::kIgnoreCase) || tstr.Contains(
"GPD", TString::kIgnoreCase) ||
5462 tstr.Contains(
"LTF", TString::kIgnoreCase) || tstr.Contains(
"FLAME", TString::kIgnoreCase) ||
5463 tstr.Contains(
"HAL-9500", TString::kIgnoreCase) || tstr.Contains(
"DOLLY", TString::kIgnoreCase) ||
5464 tstr.Contains(
"VMS", TString::kIgnoreCase)) {
5465 type =
"quasi-continous muon source";
5466 }
else if (tstr.Contains(
"EMU", TString::kIgnoreCase) || tstr.Contains(
"MUSR", TString::kIgnoreCase) ||
5467 tstr.Contains(
"HIFI", TString::kIgnoreCase)) {
5468 type =
"pulsed muon source";
5470 nxs->AddDataset<std::string>(
"/raw_data_1/instrument/source/type", {type}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5473 str =
"positive muons";
5474 nxs->AddDataset<std::string>(
"/raw_data_1/instrument/source/probe", {str}, {1}, H5::StrType(H5::PredType::C_S1, H5T_VARIABLE));
5477 nxs->AddGroupAttribute(
"/raw_data_1/instrument/detector_1",
"NX_class", std::string(
"NXdetector"));
5480 int noHistos =
fData[0].GetNoOfHistos();
5481 std::vector<int> spectrum_index(noHistos);
5482 for (
unsigned int i=0; i<spectrum_index.size(); i++)
5483 spectrum_index[i] = i+1;
5484 nxs->AddDataset<
int>(
"/raw_data_1/instrument/detector_1/spectrum_index", spectrum_index, {spectrum_index.size()}, H5::PredType::NATIVE_INT32);
5488 nxs->AddDataset<
int>(
"/raw_data_1/instrument/detector_1/raw_time", {ival}, {1}, H5::PredType::NATIVE_INT32);
5489 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/instrument/detector_1/raw_time",
"available", 0);
5497 int noHisto, histoLength;
5499 noHisto =
fData[0].GetNoOfHistos();
5500 for (UInt_t i=0; i<
fData[0].GetNoOfHistos(); i++) {
5501 dataSet =
fData[0].GetDataSet(i,
false);
5502 if (dataSet ==
nullptr) {
5503 std::cerr << std::endl <<
">> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=" << i <<
")";
5504 std::cerr << std::endl <<
">> something is really wrong!" << std::endl;
5507 size = dataSet->GetData()->size();
5509 for (UInt_t j=0; j<size; j++) {
5510 data.push_back((UInt_t)dataSet->GetData()->at(j));
5514 UInt_t dataRebin = 0;
5515 UInt_t dataCount = 0;
5516 noHisto =
fData[0].GetNoOfHistos();
5517 for (UInt_t i=0; i<
fData[0].GetNoOfHistos(); i++) {
5518 dataSet =
fData[0].GetDataSet(i,
false);
5519 if (dataSet ==
nullptr) {
5520 std::cerr << std::endl <<
">> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=" << i <<
")";
5521 std::cerr << std::endl <<
">> something is really wrong!" << std::endl;
5524 size = dataSet->GetData()->size();
5526 for (UInt_t j=0; j<size; j++) {
5529 data.push_back(dataRebin);
5532 dataRebin +=
static_cast<UInt_t
>(dataSet->GetData()->at(j));
5537 nxs->AddDataset<
int>(
"/raw_data_1/instrument/detector_1/counts", data, {(
long unsigned int)noHisto, size}, H5::PredType::NATIVE_INT32);
5538 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/instrument/detector_1/counts",
"axes", std::string(
"spectrum_index,time_bin"));
5539 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/instrument/detector_1/counts",
"long_name", std::string(
"positon counts"));
5540 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/instrument/detector_1/counts",
"signal", 1);
5542 std::vector<int> t0_bin;
5543 for (
unsigned int i=0; i<
fData[0].GetNoOfHistos(); i++)
5545 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/instrument/detector_1/counts",
"t0_bin", {t0_bin});
5546 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/instrument/detector_1/counts",
"units", std::string(
"counts"));
5549 nxs->AddGroupAttribute(
"/raw_data_1/detector_1",
"NX_class", std::string(
"NXdata"));
5552 nxs->AddDataset<
int>(
"/raw_data_1/detector_1/counts", data, {(
long unsigned int)noHisto, size}, H5::PredType::NATIVE_INT32);
5553 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/detector_1/counts",
"axes", std::string(
"spectrum_index,time_bin"));
5554 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/detector_1/counts",
"long_name", std::string(
"positon counts"));
5555 nxs->AddDatasetAttribute<
int>(
"/raw_data_1/detector_1/counts",
"signal", 1);
5560 std::cerr << std::endl <<
"**ERROR** PRunDataHandler::WriteNexusFile, fln=" << fln << std::endl;
5563 }
catch (
const H5::Exception& e) {
5564 std::cerr << std::endl <<
"HDF5 error: " << e.getDetailMsg() << std::endl;
5570 std::cout << std::endl <<
">> PRunDataHandler::WriteNexusFile(): Sorry, not enabled at configuration level, i.e. -Dnexus=1 when executing configure" << std::endl << std::endl;