62 LOG(info) <<
"Setup experimental run...";
64 auto geoFileName = Form(
"current_geo_file_%d.root", UInt_t(TRandom2(0).Integer(UINT32_MAX)));
65 Int_t nearest_geometry_run = runNumber + 1;
67 LOG(error) <<
"Could not read geometry file from the Unified Condition Database";
71 auto geoFile = std::make_unique<TFile>(geoFileName,
"READ");
72 if (!geoFile->IsOpen()) {
73 LOG(error) <<
"Could not open ROOT file with geometry: " << geoFileName;
77 TIter next(geoFile->GetListOfKeys());
78 auto key = std::unique_ptr<TKey>(
static_cast<TKey*
>(next()));
79 TString className(key->GetClassName());
80 if (className.BeginsWith(
"TGeoManager"))
83 LOG(error) <<
"TGeoManager is not top element in geometry file " << geoFileName;
87 auto currentRun = std::unique_ptr<UniRun>(
UniRun::GetRun(fRunPeriod, runNumber));
91 auto magneticFieldVoltage = currentRun->GetFieldVoltage();
92 if (!magneticFieldVoltage) {
93 LOG(error) <<
"No field voltage was found for run " << fRunPeriod <<
":" << runNumber;
97 Double_t mapCurrent = (fRunPeriod == 8) ? 112.0 : (fRunPeriod == 7) ? 55.87 : 0.0;
98 Double_t magneticFieldScale = 0.;
99 if (*magneticFieldVoltage < 10) {
100 magneticFieldScale = 0;
102 magneticFieldScale = (*magneticFieldVoltage) / mapCurrent;
105 auto magneticField =
new BmnNewFieldMap(
"FieldMap_1900_extrap_noPed.root");
106 magneticField->SetScale(magneticFieldScale);
107 magneticField->Init();
108 fRunAna->SetField(magneticField);
110 TString target =
"-";
111 if (currentRun->GetTargetParticle() !=
"")
112 target = currentRun->GetTargetParticle();
114 auto beam = currentRun->GetBeamParticle();
116 LOG(info) <<
"Complete!";
118 LOG(info) <<
"Experimental run summary:";
119 LOG(info) <<
"\tPeriod: run" << fRunPeriod;
120 LOG(info) <<
"\tNumber: " << runNumber;
121 LOG(info) <<
"\tBeam: " << beam;
122 LOG(info) <<
"\tTarget: " << target;
123 LOG(info) <<
"\tMagnetic field scale: " << setprecision(4) << magneticFieldScale;
132 fRegisteredBranches.clear();
134 auto branches = inputTree->GetListOfBranches();
135 for (Long64_t branchIndex = 0; branchIndex < branches->GetEntriesFast(); branchIndex++) {
136 auto branch =
static_cast<TBranchElement*
>(branches->At(branchIndex));
137 if (strcmp(branch->GetClassName(),
"TClonesArray") == 0) {
138 fRegisteredBranches[branch->GetName()] = std::make_unique<TClonesArray>(branch->GetClonesName());
142 for (
auto& branch : fRegisteredBranches) {
143 FairRootManager::Instance()->RegisterInputObject(branch.first.c_str(), branch.second.get());
162 LOG(info) <<
"Initializing reconstruction tasks...";
174 auto triggerInfo = std::make_unique<BmnFillTrigInfoDst>(kTRUE);
175 fTasks.push_back(std::move(triggerInfo));
178 auto sibtHM = std::make_unique<BmnSiBTHitMaker>(fRunPeriod, runNumber, kTRUE);
179 sibtHM->SetHitMatching(kFALSE);
180 fTasks.push_back(std::move(sibtHM));
183 auto siliconHM = std::make_unique<BmnSiliconHitMaker>(fRunPeriod, runNumber, kTRUE);
184 siliconHM->SetHitMatching(kFALSE);
185 fTasks.push_back(std::move(siliconHM));
188 auto gemHM = std::make_unique<BmnGemStripHitMaker>(fRunPeriod, runNumber, kTRUE);
189 gemHM->SetHitMatching(kFALSE);
190 fTasks.push_back(std::move(gemHM));
193 auto cscHM = std::make_unique<BmnCSCHitMaker>(fRunPeriod, runNumber, kTRUE);
194 cscHM->SetHitMatching(kFALSE);
195 fTasks.push_back(std::move(cscHM));
198 auto tof1HP = std::make_unique<BmnTof1HitProducer>(
"TOF400",
kTOF1, kFALSE, 0, kFALSE);
199 tof1HP->SetPeriodRun(fRunPeriod, runNumber);
200 fTasks.push_back(std::move(tof1HP));
203 auto tof700HP = std::make_unique<BmnTof1HitProducer>(
"TOF700",
kTOF701, kFALSE, 0, kFALSE);
204 tof700HP->SetPeriodRun(fRunPeriod, runNumber);
205 fTasks.push_back(std::move(tof700HP));
227 auto fhcalReco = std::make_unique<BmnFHCalReconstructor>(kTRUE, kTRUE);
228 fhcalReco->SetRecoCutsFile(
"FHCAL_reco_cuts_period8.txt");
229 fTasks.push_back(std::move(fhcalReco));
247 auto innerTrackBranchName =
"StsVector";
248 auto hitConverter = std::make_unique<BmnToCbmHitConverter>(0, kTRUE);
249 hitConverter->EnableAlignment(kFALSE);
250 hitConverter->SetFixedErrors(0.08 /
sqrt(12) * 1.2, 0.1234, 0.01 /
sqrt(12), 0.1234);
251 fTasks.push_back(std::move(hitConverter));
253 auto kalmanFilter = std::make_unique<CbmKF>();
254 fTasks.push_back(std::move(kalmanFilter));
256 auto l1Tracking = std::make_unique<CbmL1>();
257 l1Tracking->SetMaterialBudgetFileName(
"");
258 fTasks.push_back(std::move(l1Tracking));
260 auto vectorFinder = std::make_unique<BmnStsVectorFinder>();
261 vectorFinder->SetMatBudgetFileName(
"$VMCWORKDIR/parameters/sts_matbudget_run8.root");
291 auto glTF = std::make_unique<BmnGlobalTracking>(kTRUE, kFALSE);
292 glTF->SetInnerTracksBranchName(innerTrackBranchName);
293 fTasks.push_back(std::move(glTF));
295 for (
auto&& task : fTasks) {
300 LOG(info) <<
"Complete!";
305 std::unique_ptr<TTree> inputTree(
nullptr);
306 RootSerializer().Deserialize(*inputMessage, inputTree);
308 if (fCurrentEvent == 0) {
309 Int_t runNumber = -1;
318 LOG(info) <<
"Event #" << fCurrentEvent;
320 auto resultTree = std::make_unique<TTree>();
321 for (
auto&& task : fTasks) {
323 task->OnlineWrite(resultTree);
326 auto message = NewMessage();
327 RootSerializer().Serialize(*message, resultTree);
330 LOG(error) <<
"Sending message failed!";