BmnRoot 26.10.0-19-g6979a6c6
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
run_sim_filter.C
Go to the documentation of this file.
1R__ADD_INCLUDE_PATH($VMCWORKDIR)
2R__ADD_INCLUDE_PATH($SIMPATH / include / fairmq)
3
4#include "macro/run/geometry_run/geometry_run7.C"
5
6#include <cstdint>
7#include <root/TDirectory.h>
8
9#define GEANT3 // Choose: GEANT3 GEANT4
10// enumeration of generator names corresponding input files
21
22// inFile - input file with generator data, if needed
23// outFile - output file with MC data, default: evetest.root
24// nStartEvent - start event in the input generator file to begin transporting, default: 0
25// nEvents - number of events to transport
26// generatorName - generator name for the input file (enumeration above)
27// useRealEffects - whether we use realistic effects at simulation (Lorentz, misalignment)
28
30 TString expFile = "bmn_run4649_digi.root",
31 TString inFile = "$VMCWORKDIR/macro/run/Filtered_ArAl_3.2AGeV.root",
32 // TString inFile = "/ncx/eos/nica/bmn/sim/gen/DCMQGSM/ArAl_3.2AGeV_mb/ArAl_3.2AGeV_mb_2.r12",
33 TString outFile = "$VMCWORKDIR/macro/run/evetest.root",
34 Int_t nStartEvent = 0,
35 Int_t nEvents = 10,
36 enumGenerators generatorName = QGSM,
37 Bool_t useRealEffects = kTRUE,
38 Int_t selPDG = 3122,
39 Int_t fMinHitsR = 4)
40{
41 TStopwatch timer;
42 timer.Start();
43 gDebug = 0;
44 Int_t fVerbose = 0;
45 // ----- Create simulation run ----------------------------------------
46 BmnFairRunSim* fRun = new BmnFairRunSim();
47
48 // Choose the Geant Navigation System
49#ifdef GEANT3
50 fRun->SetName("TGeant3");
51#else
52 fRun->SetName("TGeant4");
53#endif
54
55 geometry(fRun); // load BM@N geometry
56
57 // Use the experiment specific MC Event header instead of the default one
58 // This one stores additional information about the reaction plane
59 // MpdMCEventHeader* mcHeader = new MpdMCEventHeader();
60 // fRun->SetMCEventHeader(mcHeader);
61
62 // Create and Set Event Generator
63 FairPrimaryGenerator* primGen = new FairPrimaryGenerator();
64 fRun->SetGenerator(primGen);
65
66 // Smearing of beam interaction point, if needed, and primary vertex position
67 // DO NOT do it in corresponding gen. sections to avoid incorrect summation!!!
68 primGen->SetBeam(0.0, 0.0, 0.0, 0.0);
69 primGen->SetTarget(0.0, 0.0);
70 primGen->SmearVertexZ(kFALSE);
71 primGen->SmearVertexXY(kFALSE);
72
73 BmnPVGetter* pvg = new BmnPVGetter(expFile, nEvents);
74 pvg->SetVerbose(fVerbose);
75 pvg->SetGenerator(primGen);
76
77 switch (generatorName) {
78 // ------- UrQMD Generator
79 case URQMD: {
81 return;
82
83 MpdUrqmdGenerator* urqmdGen = new MpdUrqmdGenerator(inFile);
84 // urqmdGen->SetEventPlane(0., 360.);
85 primGen->AddGenerator(urqmdGen);
86 if (nStartEvent > 0)
87 urqmdGen->SkipEvents(nStartEvent);
88
89 // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
90 if (nEvents == 0)
91 nEvents = MpdGetNumEvents::GetNumURQMDEvents(inFile.Data()) - nStartEvent;
92 break;
93 }
94
95 // ------- Particle Generator
96 case PART: {
97 FairParticleGenerator* partGen = new FairParticleGenerator(211, 10, 1, 0, 3, 1, 0, 0);
98 primGen->AddGenerator(partGen);
99 break;
100 }
101
102 // ------- Ion Generator
103 case ION: {
104 // Start beam from a far point to check mom. reconstruction procedure
105 FairIonGenerator* fIongen = new FairIonGenerator(6, 12, 6, 1, 0., 0., 4.4, 0., 0., -647.);
106 primGen->AddGenerator(fIongen);
107 break;
108 }
109
110 // ------- Box Generator
111 case BOX: {
112 gRandom->SetSeed(0);
113 FairBoxGenerator* boxGen =
114 new FairBoxGenerator(3122, 1); // 13 = muon; 1 = multipl. // 2212 = proton, 3122 - Lambda
115 boxGen->SetPRange(2.5, 3.); // GeV/c, setPRange vs setPtRange
116 boxGen->SetPhiRange(0, 360); // Azimuth angle range [degree]
117 boxGen->SetThetaRange(5, 15); // Polar angle in lab system range [degree]
118 primGen->AddGenerator(boxGen);
119 // if (nEvents == 0)
120 // nEvents = pvg->GetNFileEvents();
121 break;
122 }
123
124 // ------- HSD/PHSD Generator
125 case HSD: {
127 return;
128
129 MpdPHSDGenerator* hsdGen = new MpdPHSDGenerator(inFile.Data());
130 // hsdGen->SetPsiRP(0.); // set fixed Reaction Plane angle instead of random
131 primGen->AddGenerator(hsdGen);
132 if (nStartEvent > 0)
133 hsdGen->SkipEvents(nStartEvent);
134
135 // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
136 if (nEvents == 0)
137 nEvents = MpdGetNumEvents::GetNumPHSDEvents(inFile.Data()) - nStartEvent;
138 break;
139 }
140
141 // ------- LAQGSM/DCM-QGSM Generator
142 case QGSM:
143 case DQGSM: {
144 //
145 // Int_t lastSlash = inFile.Last('/');
146 // TString simDir = (lastSlash == TString::kNPOS) ? "" : TString(inFile(0, lastSlash + 1));
147 // vector<TString> fileVec = BmnRecoTools::GetFileVecFromDir(simDir);
148 MpdLAQGSMGeneratorExt* guGen = new MpdLAQGSMGeneratorExt({inFile}, kFALSE, 0, 0, selPDG, kFALSE);
149 primGen->AddGenerator(guGen);
150 break;
151 }
152
153 default: {
154 cout << "ERROR: Generator name was not pre-defined: " << generatorName << endl;
155 return;
156 }
157 } // end of switch (generatorName)
158
159 pvg->SetRunSimInst(fRun);
160 fRun->AddTask(pvg);
161
162 // FairMQProxy * sink = new FairMQProxy();
163 // fRun->SetSink((FairSink*)sink);
164 fRun->SetSink(new FairRootFileSink(outFile.Data()));
165 fRun->SetIsMT(false);
166
167 // ----- Create magnetic field ----------------------------------------
168 BmnFieldMap* magField = new BmnNewFieldMap("field_sp41v4_ascii_Extrap.root");
169 Double_t fieldScale = 1200. / 900.;
170 magField->SetScale(fieldScale);
171 fRun->SetField(magField);
172
173 fRun->SetStoreTraj(kTRUE);
174 fRun->SetRadLenRegister(kFALSE); // radiation length manager
175
176 // recunstructability checker
177 BmnCheckMCTask* checker = new BmnCheckMCTask(nEvents, fMinHitsR);
178 checker->SetVerbose(fVerbose);
179 checker->SetRunSimInst(fRun);
180 fRun->AddTask(checker);
181
182 // SI-Digitizer
184 BmnSiliconDigitizer* siliconDigit = new BmnSiliconDigitizer();
185 siliconDigit->SetCurrentConfig(si_config);
186 siliconDigit->SetOnlyPrimary(kFALSE);
187 siliconDigit->SetStripMatching(kFALSE);
188 siliconDigit->SetUseRealEffects(useRealEffects);
189 siliconDigit->SetVerbose(fVerbose);
190 fRun->AddTask(siliconDigit);
191
192 // GEM-Digitizer
194 if (useRealEffects)
198 gemDigit->SetCurrentConfig(gem_config);
199 gemDigit->SetOnlyPrimary(kFALSE);
200 gemDigit->SetStripMatching(kFALSE);
201 gemDigit->SetUseRealEffects(useRealEffects);
202 gemDigit->SetVerbose(fVerbose);
203 fRun->AddTask(gemDigit);
204
205 // CSC-Digitizer
207 BmnCSCDigitizer* cscDigit = new BmnCSCDigitizer();
208 cscDigit->SetCurrentConfig(csc_config);
209 cscDigit->SetOnlyPrimary(kFALSE);
210 cscDigit->SetStripMatching(kFALSE);
211 cscDigit->SetVerbose(fVerbose);
212 fRun->AddTask(cscDigit);
213
214 fRun->Init();
215 magField->Print();
216
217 // Trajectories Visualization (TGeoManager only)
218 FairTrajFilter* trajFilter = FairTrajFilter::Instance();
219 // Set cuts for storing the trajectories
220 trajFilter->SetStepSizeCut(0.01); // 1 cm
221 trajFilter->SetVertexCut(-200., -200., -150., 200., 200., 1100.);
222 trajFilter->SetMomentumCutP(10e-3); // p_lab > 10 MeV
223 trajFilter->SetEnergyCut(0., 4.); // 0 < Etot < 1.04 GeV //
224 trajFilter->SetStorePrimaries(kTRUE);
225 trajFilter->SetStoreSecondaries(kTRUE); // kFALSE
226
227 // Fill the Parameter containers for this run
228 FairRuntimeDb* rtdb = fRun->GetRuntimeDb();
229
230 BmnFieldPar* fieldPar = (BmnFieldPar*)rtdb->getContainer("BmnFieldPar");
231 fieldPar->SetParameters(magField);
232 fieldPar->setChanged();
233 fieldPar->setInputVersion(fRun->GetRunId(), 1);
234 Bool_t kParameterMerged = kTRUE;
235 FairParRootFileIo* output = new FairParRootFileIo(kParameterMerged);
236 // AZ output->open(parFile.Data());
237 output->open(gFile);
238 rtdb->setOutput(output);
239
240 rtdb->saveOutput();
241 rtdb->print();
242
243 // Transport nEvents
244 Int_t doNEvents = (generatorName == QGSM || generatorName == BOX) ? INT32_MAX : nEvents;
245 fRun->Run(doNEvents);
246 // gGeoManager->CheckOverlaps(0.0001);
247 // gGeoManager->PrintOverlaps();
248
249 // fRun->CreateGeometryFile("full_geometry.root"); // save the full setup geometry to the additional file
250
251 if ((generatorName == QGSM) || (generatorName == DQGSM)) {
252 TString Pdg_table_name =
253 TString::Format("%s%s%c%s", gSystem->BaseName(inFile.Data()), ".g", (fRun->GetName())[6], ".pdg_table.dat");
254 (TDatabasePDG::Instance())->WritePDGTable(Pdg_table_name.Data());
255 }
256
257 timer.Stop();
258 Double_t rtime = timer.RealTime(), ctime = timer.CpuTime();
259 printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime);
260 cout << "Macro finished successfully." << endl; // marker of successfully execution for software testing systems
261}
bool Bool_t
int Int_t
Int_t gDebug
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
#define R__ADD_INCLUDE_PATH(PATH)
#define gFile
R__EXTERN TRandom * gRandom
R__EXTERN TSystem * gSystem
void SetOnlyPrimary(Bool_t opt=kFALSE)
void SetStripMatching(Bool_t opt=kTRUE)
void SetCurrentConfig(BmnCSCConfiguration::CSC_CONFIG config)
void SetRunSimInst(BmnFairRunSim *v)
void SetScale(Double_t factor)
Set a global field scaling factor.
Definition BmnFieldMap.h:55
virtual void Print(Option_t *) const
Screen output.
void SetParameters(FairField *field)
Set parameters from BmnField.
static int CheckFileExist(TString &fileName, int iVerbose=0, EAccessMode mode=kFileExists)
void SetCurrentConfig(BmnGemStripConfiguration::GEM_CONFIG config)
void SetStripMatching(Bool_t opt=kTRUE)
void SetOnlyPrimary(Bool_t opt=kFALSE)
void SetUseRealEffects(Bool_t opt=kTRUE)
static BmnGemStripMedium & GetInstance()
Bool_t SetCurrentConfiguration(BmnGemStripMediumConfiguration::MEDIUM medium)
Field Map does not have any symmetries w.r.t coordinate axises.
BmnPVGetter Task for Primary Vertex parameters extraction from DST file.
Definition BmnPVGetter.h:21
void SetRunSimInst(BmnFairRunSim *v)
Definition BmnPVGetter.h:33
void SetGenerator(FairPrimaryGenerator *v)
Definition BmnPVGetter.h:40
void SetCurrentConfig(BmnSiliconConfiguration::SILICON_CONFIG config)
void SetStripMatching(Bool_t opt=kTRUE)
void SetOnlyPrimary(Bool_t opt=kFALSE)
void SetUseRealEffects(Bool_t opt=kTRUE)
static Int_t GetNumPHSDEvents(const char *filename, int iVerbose=2)
static Int_t GetNumURQMDEvents(const char *fileName, int iVerbose=2)
Bool_t SkipEvents(Int_t n)
Skip n events, return kTRUE if successful.
Bool_t SkipEvents(Int_t count)
static TDatabasePDG * Instance()
Double_t RealTime()
void Start(Bool_t reset=kTRUE)
Double_t CpuTime()
void Stop()
const char * Data() const
static TString Format(const char *fmt,...)
enumGenerators
@ PART
@ QGSM
@ HSD
@ URQMD
@ ION
@ DQGSM
void run_sim_filter(TString expFile="bmn_run4649_digi.root", TString inFile="$VMCWORKDIR/macro/run/Filtered_ArAl_3.2AGeV.root", TString outFile="$VMCWORKDIR/macro/run/evetest.root", Int_t nStartEvent=0, Int_t nEvents=10, enumGenerators generatorName=QGSM, Bool_t useRealEffects=kTRUE, Int_t selPDG=3122, Int_t fMinHitsR=4)