diff --git a/macro/beamtime/mcbm2020/unpack_tsa_mcbm_with_eb.C b/macro/beamtime/mcbm2020/unpack_tsa_mcbm_with_eb.C new file mode 100644 index 0000000000000000000000000000000000000000..dc23fab9eb5b028ae67440f53c1017b9858324c9 --- /dev/null +++ b/macro/beamtime/mcbm2020/unpack_tsa_mcbm_with_eb.C @@ -0,0 +1,756 @@ +/** @file MCBM DATA unpacking + ** @author Florian Uhlig <f.uhlig@gsi.de> + ** @date 20.06.2016 + ** Modified by P.-A. Loizeau + ** @date 30.01.2019 + ** ROOT macro to read tsa files which have been produced with the new data transport + ** Convert data into cbmroot format. + ** Uses CbmMcbm2018Source as source task. + */ +// In order to call later Finish, we make this global +FairRunOnline* run = NULL; + +/// FIXME: Disable clang formatting to keep easy parameters overview +/* clang-format off */ +Bool_t unpack_tsa_mcbm_with_eb(TString inFile = "", + UInt_t uRunId = 0, + UInt_t uNbTimeslices = 0, + TString sOutDir = "data", + Int_t iSpillIndex = -1, + Int_t iSpillnumber = 3, + UInt_t uSpillLimType = 1) +{ + /// FIXME: Re-enable clang formatting after parameters initial values setting + /* clang-format on */ + + TString srcDir = gSystem->Getenv("VMCWORKDIR"); + + // --- Specify output file name (this is just an example) + TString runId = TString::Format("%03u", uRunId); + TString unpOutFile = sOutDir + "/unp_mcbm_" + runId; + TString parFile = sOutDir + "/unp_mcbm_params_" + runId; + if (0 <= iSpillIndex) { + unpOutFile += TString::Format("_%02i", iSpillIndex); + parFile += TString::Format("_%02i", iSpillIndex); + } // if( 0 <= iSpillIndex ) + unpOutFile += ".root"; + parFile += ".root"; + + /* + std::cout << inFile << std::endl << sOutDir << std::endl; + std::cout << parFile << std::endl + << unpOutFile << std::endl; + std::cout << uRunId << " " << uNbTimeslices << std::endl; + + return kTRUE; + */ + + // --- Set log output levels + FairLogger::GetLogger(); + gLogger->SetLogScreenLevel("INFO"); + //gLogger->SetLogScreenLevel("DEBUG4"); + gLogger->SetLogVerbosityLevel("MEDIUM"); + //gLogger->SetLogVerbosityLevel("LOW"); + + // --- Define parameter files + TList* parFileList = new TList(); + TString paramDir = srcDir + "/macro/beamtime/mcbm2020/"; + + // --- Load the geometry setup ---- + // This is currently only required by the TRD + std::string geoSetupTag = "mcbm_beam_2020_03"; + CbmSetup* geoSetup = CbmSetup::Instance(); + geoSetup->LoadSetup(geoSetupTag.data()); + + TString paramFileSts = paramDir + "mStsPar.par"; + TObjString* parStsFileName = new TObjString(paramFileSts); + parFileList->Add(parStsFileName); + + TString paramFileMuch = paramDir + "mMuchPar.par"; + TObjString* parMuchFileName = new TObjString(paramFileMuch); + parFileList->Add(parMuchFileName); + + // ---- Trd ---- + TString geoTagTrd = ""; + bool isActiveTrd = (geoSetup->GetGeoTag(ECbmModuleId::kTrd, geoTagTrd)) ? true : false; + if (!isActiveTrd) { + LOG(warning) << Form("TRD - parameter loading - Trd not found in CbmSetup(%s) -> parameters " + "can not be loaded correctly!", + geoSetupTag.data()); + } + else { + TString paramFilesTrd(Form("%s/parameters/trd/trd_%s", srcDir.Data(), geoTagTrd.Data())); + std::vector<std::string> paramFilesVecTrd; + CbmTrdParManager::GetParFileExtensions(¶mFilesVecTrd); + for (auto parIt : paramFilesVecTrd) { + parFileList->Add(new TObjString(Form("%s.%s.par", paramFilesTrd.Data(), parIt.data()))); + } + // Add timeshift calibration, currently only available for run 831 others to come + if (uRunId == 831) + parFileList->Add(new TObjString( + Form("%s/parameters/trd/mcbm2020_special/CbmMcbm2020TrdTshiftPar_run%d.par", srcDir.Data(), uRunId))); + } + + TString paramFileTof = paramDir + "mTofPar.par"; + if (uRunId >= 708 && uRunId < 754) paramFileTof = paramDir + "mTofPar_2Stack.par"; + else if (uRunId >= 754) + paramFileTof = paramDir + "mTofPar_3Stack.par"; + + TObjString* parTofFileName = new TObjString(paramFileTof); + parFileList->Add(parTofFileName); + + TString paramFileRich = paramDir + "mRichPar.par"; + if (uRunId > 698) paramFileRich = paramDir + "mRichPar_70.par"; + TObjString* parRichFileName = new TObjString(paramFileRich); + parFileList->Add(parRichFileName); + + TString paramFilePsd = paramDir + "mPsdPar.par"; + TObjString* parPsdFileName = new TObjString(paramFilePsd); + parFileList->Add(parPsdFileName); + + // --- Set debug level + gDebug = 0; + + std::cout << std::endl; + std::cout << ">>> unpack_tsa: output file is " << unpOutFile << std::endl; + + // ======================================================================== + // ======================================================================== + std::cout << std::endl; + std::cout << ">>> unpack_tsa: Initialising..." << std::endl; + + CbmMcbm2018UnpackerTaskSts* unpacker_sts = new CbmMcbm2018UnpackerTaskSts(); + CbmMcbm2018UnpackerTaskMuch* unpacker_much = new CbmMcbm2018UnpackerTaskMuch(); + CbmMcbm2018UnpackerTaskTrdR* unpacker_trdR = new CbmMcbm2018UnpackerTaskTrdR(); + CbmMcbm2018UnpackerTaskTof* unpacker_tof = new CbmMcbm2018UnpackerTaskTof(); + CbmMcbm2018UnpackerTaskRich* unpacker_rich = new CbmMcbm2018UnpackerTaskRich(); + CbmMcbm2018UnpackerTaskPsd* unpacker_psd = new CbmMcbm2018UnpackerTaskPsd(); + + /* + * Do not generate plots by default + unpacker_sts ->SetMonitorMode(); + unpacker_much->SetMonitorMode(); + unpacker_trdR->SetMonitorMode(); // Assume histo server present, not like other unpackers + unpacker_tof ->SetMonitorMode(); + unpacker_rich->SetMonitorMode(); + unpacker_psd->SetMonitorMode(); +*/ + + unpacker_sts->SetIgnoreOverlapMs(); + unpacker_much->SetIgnoreOverlapMs(); + // unpacker_trdR ->SetIgnoreOverlapMs(); /// Default is kTRUE + unpacker_tof->SetIgnoreOverlapMs(); + unpacker_rich->SetIgnoreOverlapMs(); + unpacker_psd->SetIgnoreOverlapMs(); + + /// Starting from first run on Tuesday 28/04/2020, STS uses bin sorter FW + if (692 <= uRunId) unpacker_sts->SetBinningFwFlag(kTRUE); + /// Starting from first run on Monday 04/05/2020, MUCH uses bin sorter FW + if (811 <= uRunId) unpacker_much->SetBinningFwFlag(kTRUE); + + /// FIXME: Disable clang formatting for parameters tuning for now + /* clang-format off */ + // unpacker_sts ->SetAdcCut( 3 ); + unpacker_sts ->MaskNoisyChannel(1,768 , true ); + unpacker_sts ->MaskNoisyChannel(1,894 , true ); + unpacker_sts ->MaskNoisyChannel(1,896 , true ); + + unpacker_sts ->MaskNoisyChannel(2,930 , true ); + unpacker_sts ->MaskNoisyChannel(2,926 , true ); + unpacker_sts ->MaskNoisyChannel(2,892 , true ); + + unpacker_sts ->MaskNoisyChannel(3,770 , true ); + + unpacker_tof->SetSeparateArrayT0(); + + // ------------------------------ // + // Enable Asic type for MUCH data. + // fFlag = 0 ==> Asic type 2.0 (20) ---> December 2018 and March 2019 Data + // fFlag = 1 ==> Asic type 2.1 (21) ---> December 2019 Data + // This is to correct the channel fliping problem in smx 2.1 chip + Int_t fFlag = 1; + unpacker_much->EnableAsicType(fFlag); + // ------------------------------ // + /// General System offsets (= offsets between sub-systems) + unpacker_sts->SetTimeOffsetNs(-936); // Run 811-866 + unpacker_much->SetTimeOffsetNs(-885); // Run 811-866 + unpacker_trdR->SetTimeOffsetNs(0); // Run 811-866 + unpacker_tof->SetTimeOffsetNs(30); // Run 811-866 + unpacker_rich->SetTimeOffsetNs(-310); // Run 811-866 + unpacker_psd->SetTimeOffsetNs(-225); // Run 811-866 + + // ----------- ASIC by ASIC STS ---------------- + // the first 8 Unused + unpacker_sts ->SetTimeOffsetNsAsic( 0, 0.0 ); // Unused + unpacker_sts ->SetTimeOffsetNsAsic( 1, 0.0 ); // Unused + unpacker_sts ->SetTimeOffsetNsAsic( 2, 0.0 ); // Unused + unpacker_sts ->SetTimeOffsetNsAsic( 3, 0.0 ); // Unused + unpacker_sts ->SetTimeOffsetNsAsic( 4, 0.0 ); // Unused + unpacker_sts ->SetTimeOffsetNsAsic( 5, 0.0 ); // Unused + unpacker_sts ->SetTimeOffsetNsAsic( 6, 0.0 ); // Unused + unpacker_sts ->SetTimeOffsetNsAsic( 7, 0.0 ); // Unused + // + unpacker_sts ->SetTimeOffsetNsAsic(8, -0.360078 ); + unpacker_sts ->SetTimeOffsetNsAsic(9, 2.73976 ); + unpacker_sts ->SetTimeOffsetNsAsic(10, -0.507079 ); + unpacker_sts ->SetTimeOffsetNsAsic(11, 1.74695 ); + unpacker_sts ->SetTimeOffsetNsAsic(12, -0.909864 ); + unpacker_sts ->SetTimeOffsetNsAsic(13, -0.255514 ); + unpacker_sts ->SetTimeOffsetNsAsic(14, 1.44034 ); + unpacker_sts ->SetTimeOffsetNsAsic(15, 2.64009 ); + // this side: revert order 23->16 + unpacker_sts ->SetTimeOffsetNsAsic(23, -0.442762 ); + unpacker_sts ->SetTimeOffsetNsAsic(22, 1.76543 ); + unpacker_sts ->SetTimeOffsetNsAsic(21, -0.94728 ); + unpacker_sts ->SetTimeOffsetNsAsic(20, -2.18516 ); + unpacker_sts ->SetTimeOffsetNsAsic(19, -0.68254 ); + unpacker_sts ->SetTimeOffsetNsAsic(18, -2.32241 ); + unpacker_sts ->SetTimeOffsetNsAsic(17, -1.53483 ); + unpacker_sts ->SetTimeOffsetNsAsic(16, -2.12455 ); + // + unpacker_sts ->SetTimeOffsetNsAsic(24, -0.41084 ); + unpacker_sts ->SetTimeOffsetNsAsic(25, 0.230455 ); + unpacker_sts ->SetTimeOffsetNsAsic(26, -0.206921 ); + unpacker_sts ->SetTimeOffsetNsAsic(27, 0.0913657 ); + unpacker_sts ->SetTimeOffsetNsAsic(28, -0.17252 ); + unpacker_sts ->SetTimeOffsetNsAsic(29, -0.32990 ); + unpacker_sts ->SetTimeOffsetNsAsic(30, 1.43535 ); + unpacker_sts ->SetTimeOffsetNsAsic(31, -0.155741 ); + // this side: revert order 39->32 + unpacker_sts ->SetTimeOffsetNsAsic(39, 1.53865 ); + unpacker_sts ->SetTimeOffsetNsAsic(38, 3.6318 ); + unpacker_sts ->SetTimeOffsetNsAsic(37, 1.3153 ); + unpacker_sts ->SetTimeOffsetNsAsic(36, -1.90278 ); + unpacker_sts ->SetTimeOffsetNsAsic(35, 2.00051 ); + unpacker_sts ->SetTimeOffsetNsAsic(34, -2.85656 ); + unpacker_sts ->SetTimeOffsetNsAsic(33, 1.28834 ); + unpacker_sts ->SetTimeOffsetNsAsic(32, 0.657113 ); + + switch (uRunId) { + case 707: { + /// General System offsets (= offsets between sub-systems) + //unpacker_sts ->SetTimeOffsetNs( -1750 ); // Run 707 + //unpacker_much->SetTimeOffsetNs( -1750 ); // Run 707 + + /// ASIC specific offsets (= offsets inside sub-system) + unpacker_much->SetTimeOffsetNsAsic(0, 0.0); // Run 707, DPB 0 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(1, 0.0); // Run 707, DPB 0 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(2, 0.0); // Run 707, DPB 0 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(3, 0.0); // Run 707, DPB 0 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(4, 0.0); // Run 707, DPB 0 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(5, 0.0); // Run 707, DPB 0 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(6, 0.0); // Run 707, DPB 1 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(7, 0.0); // Run 707, DPB 1 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(8, 0.0); // Run 707, DPB 1 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(9, 0.0); // Run 707, DPB 1 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(10, 0.0); // Run 707, DPB 1 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(11, 0.0); // Run 707, DPB 1 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(12, 0.0); // Run 707, DPB 2 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(13, 0.0); // Run 707, DPB 2 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(14, 0.0); // Run 707, DPB 2 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(15, 0.0); // Run 707, DPB 2 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(16, 0.0); // Run 707, DPB 2 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(17, 0.0); // Run 707, DPB 2 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(18, 9590.0); // Run 707, DPB 3 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(19, 9590.0); // Run 707, DPB 3 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(20, 9630.0); // Run 707, DPB 3 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(21, 9590.0); // Run 707, DPB 3 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(22, 0.0); // Run 707, DPB 3 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(23, 0.0); // Run 707, DPB 3 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(24, 0.0); // Run 707, DPB 4 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(25, 0.0); // Run 707, DPB 4 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(26, 0.0); // Run 707, DPB 4 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(27, 0.0); // Run 707, DPB 4 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(28, 0.0); // Run 707, DPB 4 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(29, 0.0); // Run 707, DPB 4 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(30, 0.0); // Run 707, DPB 5 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(31, 0.0); // Run 707, DPB 5 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(32, 7170.0); // Run 707, DPB 5 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(33, 7170.0); // Run 707, DPB 5 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(34, 0.0); // Run 707, DPB 5 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(35, 0.0); // Run 707, DPB 5 ASIC 5 + break; + } // 707 + case 750: { + /// General System offsets (= offsets between sub-systems) + //unpacker_sts ->SetTimeOffsetNs( -1750 ); // Run 750 + //unpacker_much->SetTimeOffsetNs( -1750 ); // Run 750 + + /// ASIC specific offsets (= offsets inside sub-system) + unpacker_much->SetTimeOffsetNsAsic(0, 0.0); // Run 750, DPB 0 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(1, 0.0); // Run 750, DPB 0 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(2, 0.0); // Run 750, DPB 0 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(3, 0.0); // Run 750, DPB 0 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(4, 0.0); // Run 750, DPB 0 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(5, 0.0); // Run 750, DPB 0 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(6, 0.0); // Run 750, DPB 1 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(7, 0.0); // Run 750, DPB 1 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(8, 0.0); // Run 750, DPB 1 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(9, 0.0); // Run 750, DPB 1 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(10, 0.0); // Run 750, DPB 1 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(11, 0.0); // Run 750, DPB 1 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(12, 0.0); // Run 750, DPB 2 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(13, 0.0); // Run 750, DPB 2 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(14, 0.0); // Run 750, DPB 2 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(15, 0.0); // Run 750, DPB 2 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(16, 0.0); // Run 750, DPB 2 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(17, 0.0); // Run 750, DPB 2 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(18, 6400.0); // Run 750, DPB 3 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(19, 6400.0); // Run 750, DPB 3 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(20, 6400.0); // Run 750, DPB 3 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(21, 6400.0); // Run 750, DPB 3 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(22, 0.0); // Run 750, DPB 3 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(23, 0.0); // Run 750, DPB 3 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(24, 0.0); // Run 750, DPB 4 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(25, 0.0); // Run 750, DPB 4 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(26, 0.0); // Run 750, DPB 4 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(27, 0.0); // Run 750, DPB 4 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(28, 0.0); // Run 750, DPB 4 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(29, 0.0); // Run 750, DPB 4 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(30, 0.0); // Run 750, DPB 5 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(31, 0.0); // Run 750, DPB 5 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(32, 3170.0); // Run 750, DPB 5 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(33, 3170.0); // Run 750, DPB 5 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(34, 0.0); // Run 750, DPB 5 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(35, 0.0); // Run 750, DPB 5 ASIC 5 + break; + } // 750 + case 759: { + /// General System offsets (= offsets between sub-systems) + //unpacker_sts ->SetTimeOffsetNs( -1759 ); // Run 759 + //unpacker_much->SetTimeOffsetNs( -1759 ); // Run 759 + unpacker_trdR->SetTimeOffsetNs(190); // Run 759 + + /// ASIC specific offsets (= offsets inside sub-system) + unpacker_much->SetTimeOffsetNsAsic(0, 0.0); // Run 759, DPB 0 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(1, 0.0); // Run 759, DPB 0 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(2, 0.0); // Run 759, DPB 0 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(3, 0.0); // Run 759, DPB 0 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(4, 0.0); // Run 759, DPB 0 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(5, 0.0); // Run 759, DPB 0 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(6, 0.0); // Run 759, DPB 1 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(7, 0.0); // Run 759, DPB 1 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(8, 0.0); // Run 759, DPB 1 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(9, 0.0); // Run 759, DPB 1 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(10, 0.0); // Run 759, DPB 1 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(11, 0.0); // Run 759, DPB 1 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(12, 0.0); // Run 759, DPB 2 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(13, 0.0); // Run 759, DPB 2 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(14, 0.0); // Run 759, DPB 2 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(15, 0.0); // Run 759, DPB 2 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(16, 0.0); // Run 759, DPB 2 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(17, 0.0); // Run 759, DPB 2 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(18, 3200.0); // Run 759, DPB 3 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(19, 3200.0); // Run 759, DPB 3 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(20, 3200.0); // Run 759, DPB 3 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(21, 3200.0); // Run 759, DPB 3 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(22, 0.0); // Run 759, DPB 3 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(23, 0.0); // Run 759, DPB 3 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(24, 3200.0); // Run 759, DPB 4 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(25, 3200.0); // Run 759, DPB 4 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(26, 3200.0); // Run 759, DPB 4 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(27, 0.0); // Run 759, DPB 4 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(28, 0.0); // Run 759, DPB 4 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(29, 0.0); // Run 759, DPB 4 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(30, 0.0); // Run 759, DPB 5 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(31, 0.0); // Run 759, DPB 5 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(32, -30.0); // Run 759, DPB 5 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(33, -30.0); // Run 759, DPB 5 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(34, 0.0); // Run 759, DPB 5 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(35, 0.0); // Run 759, DPB 5 ASIC 5 + break; + } // 759 + case 760: { + /// General System offsets (= offsets between sub-systems) + //unpacker_sts ->SetTimeOffsetNs( -1760 ); // Run 760 + //unpacker_much->SetTimeOffsetNs( -1760 ); // Run 760 + unpacker_trdR->SetTimeOffsetNs(-75); // Run 760 + + /// ASIC specific offsets (= offsets inside sub-system) + unpacker_much->SetTimeOffsetNsAsic(0, 0.0); // Run 760, DPB 0 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(1, 0.0); // Run 760, DPB 0 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(2, 0.0); // Run 760, DPB 0 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(3, 0.0); // Run 760, DPB 0 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(4, 0.0); // Run 760, DPB 0 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(5, 0.0); // Run 760, DPB 0 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(6, 0.0); // Run 760, DPB 1 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(7, 0.0); // Run 760, DPB 1 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(8, 0.0); // Run 760, DPB 1 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(9, 0.0); // Run 760, DPB 1 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(10, 0.0); // Run 760, DPB 1 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(11, 0.0); // Run 760, DPB 1 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(12, 0.0); // Run 760, DPB 2 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(13, 0.0); // Run 760, DPB 2 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(14, 0.0); // Run 760, DPB 2 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(15, 0.0); // Run 760, DPB 2 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(16, 0.0); // Run 760, DPB 2 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(17, 0.0); // Run 760, DPB 2 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(18, 0.0); // Run 760, DPB 3 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(19, 0.0); // Run 760, DPB 3 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(20, 0.0); // Run 760, DPB 3 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(21, 0.0); // Run 760, DPB 3 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(22, 0.0); // Run 760, DPB 3 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(23, 0.0); // Run 760, DPB 3 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(24, 3160.0); // Run 760, DPB 4 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(25, 3160.0); // Run 760, DPB 4 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(26, 3160.0); // Run 760, DPB 4 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(27, 0.0); // Run 760, DPB 4 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(28, 0.0); // Run 760, DPB 4 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(29, 0.0); // Run 760, DPB 4 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(30, 0.0); // Run 760, DPB 5 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(31, 0.0); // Run 760, DPB 5 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(32, -30.0); // Run 760, DPB 5 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(33, -30.0); // Run 760, DPB 5 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(34, 0.0); // Run 760, DPB 5 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(35, 0.0); // Run 760, DPB 5 ASIC 5 + break; + } // 760 + case 761: { + /// General System offsets (= offsets between sub-systems) + //unpacker_sts ->SetTimeOffsetNs( -1761 ); // Run 761 + //unpacker_much->SetTimeOffsetNs( -1761 ); // Run 761 + unpacker_trdR->SetTimeOffsetNs(90); // Run 761 + + /// ASIC specific offsets (= offsets inside sub-system) + unpacker_much->SetTimeOffsetNsAsic(0, 0.0); // Run 761, DPB 0 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(1, 0.0); // Run 761, DPB 0 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(2, 0.0); // Run 761, DPB 0 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(3, 0.0); // Run 761, DPB 0 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(4, 0.0); // Run 761, DPB 0 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(5, 0.0); // Run 761, DPB 0 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(6, 0.0); // Run 761, DPB 1 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(7, 0.0); // Run 761, DPB 1 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(8, 0.0); // Run 761, DPB 1 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(9, 0.0); // Run 761, DPB 1 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(10, 0.0); // Run 761, DPB 1 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(11, 0.0); // Run 761, DPB 1 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(12, 0.0); // Run 761, DPB 2 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(13, 0.0); // Run 761, DPB 2 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(14, 0.0); // Run 761, DPB 2 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(15, 0.0); // Run 761, DPB 2 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(16, 0.0); // Run 761, DPB 2 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(17, 0.0); // Run 761, DPB 2 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(18, 3200.0); // Run 761, DPB 3 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(19, 3200.0); // Run 761, DPB 3 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(20, 3200.0); // Run 761, DPB 3 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(21, 3200.0); // Run 761, DPB 3 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(22, 0.0); // Run 761, DPB 3 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(23, 0.0); // Run 761, DPB 3 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(24, 6360.0); // Run 761, DPB 4 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(25, 6360.0); // Run 761, DPB 4 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(26, 6360.0); // Run 761, DPB 4 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(27, 0.0); // Run 761, DPB 4 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(28, 0.0); // Run 761, DPB 4 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(29, 0.0); // Run 761, DPB 4 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(30, 0.0); // Run 761, DPB 5 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(31, 0.0); // Run 761, DPB 5 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(32, 6360.0); // Run 761, DPB 5 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(33, 6360.0); // Run 761, DPB 5 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(34, 0.0); // Run 761, DPB 5 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(35, 0.0); // Run 761, DPB 5 ASIC 5 + break; + } // 761 + case 762: { + /// General System offsets (= offsets between sub-systems) + //unpacker_sts ->SetTimeOffsetNs( -1762 ); // Run 762 + //unpacker_much->SetTimeOffsetNs( -1762 ); // Run 762 + unpacker_trdR->SetTimeOffsetNs(60); // Run 762 + + /// ASIC specific offsets (= offsets inside sub-system) + unpacker_much->SetTimeOffsetNsAsic(0, 0.0); // Run 762, DPB 0 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(1, 0.0); // Run 762, DPB 0 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(2, 0.0); // Run 762, DPB 0 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(3, 0.0); // Run 762, DPB 0 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(4, 0.0); // Run 762, DPB 0 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(5, 0.0); // Run 762, DPB 0 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(6, 0.0); // Run 762, DPB 1 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(7, 0.0); // Run 762, DPB 1 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(8, 0.0); // Run 762, DPB 1 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(9, 0.0); // Run 762, DPB 1 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(10, 0.0); // Run 762, DPB 1 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(11, 0.0); // Run 762, DPB 1 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(12, 0.0); // Run 762, DPB 2 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(13, 0.0); // Run 762, DPB 2 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(14, 0.0); // Run 762, DPB 2 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(15, 0.0); // Run 762, DPB 2 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(16, 0.0); // Run 762, DPB 2 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(17, 0.0); // Run 762, DPB 2 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(18, 4800.0); // Run 762, DPB 3 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(19, 4800.0); // Run 762, DPB 3 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(20, 4800.0); // Run 762, DPB 3 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(21, 4800.0); // Run 762, DPB 3 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(22, 0.0); // Run 762, DPB 3 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(23, 0.0); // Run 762, DPB 3 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(24, 9550.0); // Run 762, DPB 4 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(25, 9550.0); // Run 762, DPB 4 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(26, 9550.0); // Run 762, DPB 4 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(27, 0.0); // Run 762, DPB 4 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(28, 0.0); // Run 762, DPB 4 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(29, 0.0); // Run 762, DPB 4 ASIC 5 + unpacker_much->SetTimeOffsetNsAsic(30, 0.0); // Run 762, DPB 5 ASIC 0 + unpacker_much->SetTimeOffsetNsAsic(31, 0.0); // Run 762, DPB 5 ASIC 1 + unpacker_much->SetTimeOffsetNsAsic(32, -30.0); // Run 762, DPB 5 ASIC 2 + unpacker_much->SetTimeOffsetNsAsic(33, -30.0); // Run 762, DPB 5 ASIC 3 + unpacker_much->SetTimeOffsetNsAsic(34, 0.0); // Run 762, DPB 5 ASIC 4 + unpacker_much->SetTimeOffsetNsAsic(35, 0.0); // Run 762, DPB 5 ASIC 5 + break; + } // 762 + case 811: { + unpacker_trdR->SetTimeOffsetNs(84.38); + break; + } // 811 + case 812: { + unpacker_trdR->SetTimeOffsetNs(165.62); + break; + } // 812 + case 816: { + unpacker_trdR->SetTimeOffsetNs(-9.38); + break; + } // 816 + case 819: { + unpacker_trdR->SetTimeOffsetNs(-140.62); + break; + } // 819 + case 820: { + unpacker_trdR->SetTimeOffsetNs(109.38); + break; + } // 820 + case 821: { + unpacker_trdR->SetTimeOffsetNs(-65.62); + break; + } // 821 + case 822: { + unpacker_trdR->SetTimeOffsetNs(59.38); + break; + } // 822 + case 824: { + unpacker_trdR->SetTimeOffsetNs(-165.62); + break; + } // 824 + case 826: { + unpacker_trdR->SetTimeOffsetNs(59.38); + break; + } // 826 + case 827: { + unpacker_trdR->SetTimeOffsetNs(-15.62); + break; + } // 827 + case 828: { + unpacker_trdR->SetTimeOffsetNs(-109.38); + break; + } // 828 + case 830: { + unpacker_trdR->SetTimeOffsetNs(15.62); + break; + } // 830 + case 831: { + // unpacker_trdR->SetTimeOffsetNs( 70.00 ); + unpacker_trdR->SetTimeOffsetNs(-25.00); + + std::cout << "MUCH: Feb by feb time offset correction......" << std::endl; + UInt_t uRun, uNx; + Double_t offset; + ifstream infile_off(paramDir + "/parameters/time_offset_much.txt"); + if (!infile_off) { + std::cout << "can not open time offset MUCH parameter List" << std::endl; + return kFALSE; + } // if (!infile_off) + while (!infile_off.eof()) { + infile_off >> uRun >> uNx >> offset; + if(uRun != 831) continue; + unpacker_much->SetTimeOffsetNsAsic(uNx, offset); + } // while (!infile_off.eof()) + infile_off.close(); + std::cout << "masking noisy channels......" << std::endl; + UInt_t uChan = 0; + ifstream infile_noise(paramDir + "parameters/much_noisy_channel_list.txt"); + if (!infile_noise) { + std::cout << "can not open MUCH noisy channel List" << std::endl; + return kFALSE; + } // if (!infile_noise) + while (!infile_noise.eof()) { + infile_noise >> uRun >> uNx >> uChan; + if(uRun != 831) continue; + unpacker_much->MaskNoisyChannel(uNx, uChan, kTRUE ); + } // while (!infile_noise.eof()) + infile_noise.close(); + break; + } // 831 + case 836: { + unpacker_trdR->SetTimeOffsetNs(-40.62); + break; + } // 836 + default: break; + } // switch( uRunId ) + /// FIXME: Re-enable clang formatting after parameters tuning + /* clang-format on */ + + // --- Source task + CbmMcbm2018Source* source = new CbmMcbm2018Source(); + source->SetWriteOutputFlag(kTRUE); // For writing TS metadata + + source->SetFileName(inFile); + + source->AddUnpacker(unpacker_sts, 0x10, ECbmModuleId::kSts); // STS xyter + source->AddUnpacker(unpacker_much, 0x50, ECbmModuleId::kMuch); // MUCH xyter + if (isActiveTrd) source->AddUnpacker(unpacker_trdR, 0x40, ECbmModuleId::kTrd); // Trd + source->AddUnpacker(unpacker_tof, 0x60, ECbmModuleId::kTof); // gDPB TOF + source->AddUnpacker(unpacker_tof, 0x90, ECbmModuleId::kTof); // gDPB T0 + source->AddUnpacker(unpacker_rich, 0x30, ECbmModuleId::kRich); // RICH trb + source->AddUnpacker(unpacker_psd, 0x80, ECbmModuleId::kPsd); // PSD + + /// Select a pre-identified spills block through block index + block length (in spills) + /// Also select where we split the spills: beginning, middle or end of the spill break + source->UnpackSelectSpills(iSpillIndex * iSpillnumber, iSpillIndex * iSpillnumber + iSpillnumber - 1, uSpillLimType); + /// Disable clang formatting around vectors initialization by lists + /* clang-format off */ + switch (uRunId) { + case 831: { + source->LoadTsListSpillBreakBegin(std::vector<ULong64_t>( + { 1, 933, 1941, 2949, 4349, 5357, 6365, 7373, 8773, 9781, + 10789, 11801, 13197, 14209, 15217, 16225, 17625, 18633, 19645, 20653, + 22053, 23061, 24069, 25077, 26473, 27481, 28493, 29501, 30897, 31905, + 32913, 33921, 35321, 36329, 37337, 38345, 39745, 40753, 41761, 42769, + 44169, 45177, 46185, 47193, 48593})); + source->LoadTsListSpillBreakMiddle(std::vector<ULong64_t>( + { 111, 1081, 2087, 3299, 4495, 5503, 6513, 7721, 8921, 9927, + 10935, 12149, 13347, 14355, 15363, 16573, 17773, 18781, 19791, 21001, + 22199, 23209, 24215, 25423, 26619, 27629, 28637, 29847, 31045, 32051, + 33059, 34275, 35469, 36475, 37483, 38693, 39889, 40899, 41907, 43117, + 44315, 45323, 46333, 47543, 48689})); + source->LoadTsListSpillBreakEnd(std::vector<ULong64_t>( + { 221, 1229, 2233, 3649, 4641, 5649, 6661, 8069, 9069, 10073, + 11081, 12497, 13497, 14501, 15509, 16921, 17921, 18929, 19937, 21349, + 22345, 23357, 24361, 25769, 26765, 27777, 28781, 30193, 31193, 32197, + 33205, 34629, 35617, 36621, 37629, 39041, 40033, 41045, 42053, 43465, + 44461, 45469, 46481, 47893, 48786})); + break; + } // case 831 + } // switch (uRunId) + /// Re-enable clang formatting after vectors initialization by lists + /* clang-format on */ + + // --- Event builder + CbmTaskBuildRawEvents* eventBuilder = new CbmTaskBuildRawEvents(); + + eventBuilder->SetFillHistos(kTRUE); + + eventBuilder->SetEventOverlapMode(EOverlapModeRaw::NoOverlap); + // eventBuilder->SetEventOverlapMode(EOverlapModeRaw::MergeOverlap); + // eventBuilder->SetEventOverlapMode(EOverlapModeRaw::AllowOverlap); + + /* + * Available Pre-defined detectors: + * kEventBuilderDetSts + * kEventBuilderDetMuch + * kEventBuilderDetTrd + * kEventBuilderDetTof + * kEventBuilderDetRich + * kEventBuilderDetPsd + * kEventBuilderDetT0 + */ + + /// Change the selection window limits for T0 as ref + eventBuilder->SetTriggerWindow(ECbmModuleId::kSts, -50, 100); + eventBuilder->SetTriggerWindow(ECbmModuleId::kMuch, -150, 50); + eventBuilder->SetTriggerWindow(ECbmModuleId::kTrd, -50, 250); + eventBuilder->SetTriggerWindow(ECbmModuleId::kTof, -50, 50); + eventBuilder->SetTriggerWindow(ECbmModuleId::kRich, -50, 50); + eventBuilder->SetTriggerWindow(ECbmModuleId::kPsd, -50, 50); + /// To get T0 Digis (seed + close digis) in the event + eventBuilder->SetTriggerWindow(ECbmModuleId::kT0, -1, 10); + + /* + /// Use TOF as reference + eventBuilder->SetReferenceDetector( kEventBuilderDetTof ); + eventBuilder->AddDetector(kEventBuilderDetT0); + + /// Change the selection window limits for TOF as ref + /// => Should always be after changes of detector lists! + eventBuilder->SetTriggerWindow(ECbmModuleId::kT0, -150, 0); + eventBuilder->SetTriggerWindow(ECbmModuleId::kSts, -50, 100); + eventBuilder->SetTriggerWindow(ECbmModuleId::kMuch, -50, 200); + eventBuilder->SetTriggerWindow(ECbmModuleId::kTrd, -50, 300); + eventBuilder->SetTriggerWindow(ECbmModuleId::kTof, 0, 60); + eventBuilder->SetTriggerWindow(ECbmModuleId::kRich, -100, 150); + eventBuilder->SetTriggerWindow(ECbmModuleId::kPsd, -200, 50); +*/ + + /// Change the trigger requirements + /// => Should always be after changes of detector lists! + /// --- Minimum + eventBuilder->SetTriggerMinNumber(ECbmModuleId::kT0, 1); + eventBuilder->SetTriggerMinNumber(ECbmModuleId::kSts, 0); + eventBuilder->SetTriggerMinNumber(ECbmModuleId::kMuch, 0); + eventBuilder->SetTriggerMinNumber(ECbmModuleId::kTrd, 0); + eventBuilder->SetTriggerMinNumber(ECbmModuleId::kTof, 10); + eventBuilder->SetTriggerMinNumber(ECbmModuleId::kRich, 0); + eventBuilder->SetTriggerMinNumber(ECbmModuleId::kPsd, 0); + /// --- Maximum (-1 to disable cut) + eventBuilder->SetTriggerMaxNumber(ECbmModuleId::kT0, -1); + eventBuilder->SetTriggerMaxNumber(ECbmModuleId::kSts, -1); + eventBuilder->SetTriggerMaxNumber(ECbmModuleId::kMuch, -1); + eventBuilder->SetTriggerMaxNumber(ECbmModuleId::kTrd, -1); + eventBuilder->SetTriggerMaxNumber(ECbmModuleId::kTof, -1); + eventBuilder->SetTriggerMaxNumber(ECbmModuleId::kRich, -1); + eventBuilder->SetTriggerMaxNumber(ECbmModuleId::kPsd, -1); + + if (0 < uRunId) eventBuilder->SetOutFilename(Form("%s/HistosEvtWin_%03u.root", sOutDir.Data(), uRunId)); + + // --- Event header + FairEventHeader* event = new FairEventHeader(); + event->SetRunId(uRunId); + + // --- RootFileSink + FairRootFileSink* sink = new FairRootFileSink(unpOutFile); + + // --- Run + run = new FairRunOnline(source); + run->SetSink(sink); + run->SetEventHeader(event); + run->SetAutoFinish(kFALSE); + + // ----- Runtime database --------------------------------------------- + FairRuntimeDb* rtdb = run->GetRuntimeDb(); + Bool_t kParameterMerged = kTRUE; + FairParRootFileIo* parOut = new FairParRootFileIo(kParameterMerged); + FairParAsciiFileIo* parIn = new FairParAsciiFileIo(); + parOut->open(parFile.Data()); + parIn->open(parFileList, "in"); + rtdb->setFirstInput(parIn); + rtdb->setOutput(parOut); + + run->AddTask(eventBuilder); + run->Init(); + + // --- Start run + TStopwatch timer; + timer.Start(); + std::cout << ">>> unpack_tsa_mcbm: Starting run..." << std::endl; + if (0 == uNbTimeslices) { + run->Run(-1, 0); // run until end of input file + } + else { + run->Run(0, uNbTimeslices); // process N Timeslices + } + run->Finish(); + + timer.Stop(); + + std::cout << "Processed " << std::dec << source->GetTsCount() << " timeslices" << std::endl; + + // --- End-of-run info + Double_t rtime = timer.RealTime(); + Double_t ctime = timer.CpuTime(); + std::cout << std::endl << std::endl; + std::cout << ">>> unpack_tsa_mcbm: Macro finished successfully." << std::endl; + std::cout << ">>> unpack_tsa_mcbm: Output file is " << unpOutFile << std::endl; + std::cout << ">>> unpack_tsa_mcbm: Real time " << rtime << " s, CPU time " << ctime << " s" << std::endl; + std::cout << std::endl; + + /// --- Screen output for automatic tests + std::cout << " Test passed" << std::endl; + std::cout << " All ok " << std::endl; + + return kTRUE; +}