136void run_sim_bmn(TString genFile =
"DCMSMM_XeCsI_3.9AGeV_mb_10k_142.r12",
137 TString simFile =
"$VMCWORKDIR/macro/run/bmnsim.root",
138 Int_t nStartEvent = 0,
141 Bool_t useRealEffects = kTRUE,
142 Bool_t saveGeoInfo = kFALSE)
149 FairLogger::GetLogger()->SetLogScreenLevel(
"info");
155 FairRunSim* fRun =
new FairRunSim();
156 fRun->SetUseFairLinks(kTRUE);
160 fRun->SetName(
"TGeant4");
162 fRun->SetName(
"TGeant3");
173 FairPrimaryGenerator* primGen =
new FairPrimaryGenerator();
174 fRun->SetGenerator(primGen);
179 primGen->SetBeam(0.4376, 0.1239, 0.4537, 0.6925);
180 primGen->SetBeamAngle(0.011, 0.0, 0.0, 0.0);
181 primGen->SetTarget(-0.01942, 0.175);
182 primGen->SmearVertexZ(kTRUE);
183 primGen->SmearGausVertexXY(kTRUE);
186 switch (generatorName) {
192 unigen->RegisterIons();
193 primGen->AddGenerator(unigen);
194 unigen->SetEventPlane(-M_PI, M_PI);
195 auto n_events_in_tree = unigen->GetNEntries();
196 if (nStartEvent >= n_events_in_tree) {
197 cout <<
"You are trying to specify the event out reach of current tree" << generatorName << endl;
200 auto n_avail_events = n_events_in_tree - nStartEvent - 1;
202 nEvents = n_avail_events;
204 nEvents = std::min<int>(n_avail_events, nEvents);
205 cout << nEvents <<
" are availiable and will be processed" << endl;
207 unigen->SkipEvents(nStartEvent);
217 primGen->AddGenerator(urqmdGen);
230 FairParticleGenerator* partGen =
new FairParticleGenerator(211, 10, 1, 0, 3, 1, 0, 0);
231 primGen->AddGenerator(partGen);
239 FairIonGenerator* fIongen =
new FairIonGenerator(54, 124, 54, 1, 0., 0., 4.65, 0., 0., 0.);
240 primGen->AddGenerator(fIongen);
247 FairBoxGenerator* boxGen =
new FairBoxGenerator(2212, 1);
248 boxGen->SetPRange(0.2, 5.0);
249 boxGen->SetPhiRange(0, 360);
250 boxGen->SetThetaRange(0, 40.0);
251 primGen->AddGenerator(boxGen);
262 primGen->AddGenerator(hsdGen);
280 primGen->AddGenerator(guGen);
295 primGen->AddGenerator(smmGen);
306 cout <<
"ERROR: Generator name was not pre-defined: " << generatorName << endl;
312 simFile =
"$VMCWORKDIR/macro/run/bmnsim.root";
316 fRun->SetSink(
new FairRootFileSink(simFile.Data()));
317 fRun->SetIsMT(
false);
322 Double_t fieldScale = 0.929;
324 fRun->SetField(magField);
326 fRun->SetStoreTraj(kTRUE);
327 fRun->SetRadLenRegister(kFALSE);
335 fRun->AddTask(sibtDigit);
341 fRun->AddTask(siprofDigit);
345 fRun->AddTask(bdDigit);
349 fRun->AddTask(simdDigit);
356 siliconDigit->
SetNoise(45.0, 150.0);
357 fRun->AddTask(siliconDigit);
370 fRun->AddTask(gemDigit);
376 fRun->AddTask(cscDigit);
393 fRun->AddTask(fhcalDigit);
399 fScWallDigit->SetGeV2MIP(0.0021);
400 fScWallDigit->SetMIP2Pix(55);
401 fScWallDigit->SetMIPNoise(0.1);
402 fRun->AddTask(fScWallDigit);
408 fHodoDigit->SetEnergyResolutionTerms(0.085, 0.0);
409 fRun->AddTask(fHodoDigit);
413 fNdetDigit->SetTofCut(100.);
418 fRun->AddTask(fNdetDigit);
424 fRun->SetStoreTraj(saveGeoInfo);
430 FairTrajFilter* trajFilter = FairTrajFilter::Instance();
432 trajFilter->SetStepSizeCut(0.1);
433 trajFilter->SetVertexCut(-200., -200., -200., 200., 200.,
435 trajFilter->SetMomentumCutP(50e-3);
437 trajFilter->SetStorePrimaries(kTRUE);
438 trajFilter->SetStoreSecondaries(kTRUE);
442 FairRuntimeDb* rtdb = fRun->GetRuntimeDb();
443 Bool_t kParameterMerged = kTRUE;
444 FairParRootFileIo* output =
new FairParRootFileIo(kParameterMerged);
447 rtdb->setOutput(output);
455 gGeoManager->CheckOverlaps(0.0001);
456 gGeoManager->PrintOverlaps();
458 fRun->CreateGeometryFile(
"full_geometry.root");
461 if ((generatorName ==
QGSM) || (generatorName ==
DCMQGSM)) {
462 TString Pdg_table_name = TString::Format(
"%s%s%c%s", gSystem->BaseName(genFile.Data()),
".g",
463 (fRun->GetName())[6],
".pdg_table.dat");
464 (TDatabasePDG::Instance())->WritePDGTable(Pdg_table_name.Data());
470 Double_t rtime = timer.RealTime(), ctime = timer.CpuTime();
471 printf(
"RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime);
472 cout <<
"Macro finished successfully." << endl;