BmnRoot
Loading...
Searching...
No Matches
run8_sim_bmn.cxx
Go to the documentation of this file.
1#if !defined(__CLING__) || defined(__MAKECLING__)
2// ROOT includes
3#include "TApplication.h"
4#include "TDatabasePDG.h"
5#include "TGeoManager.h"
6#include "TKey.h"
7#include "TPRegexp.h"
8#include "TROOT.h"
9#include "TRandom.h"
10#include "TStopwatch.h"
11#include "TString.h"
12#include "TSystem.h"
13#include "TVirtualMC.h"
14
15// FairRoot includes
16#include "FairBoxGenerator.h"
17#include "FairCave.h"
18#include "FairDetector.h"
19#include "FairIonGenerator.h"
20#include "FairMagnet.h"
21#include "FairModule.h"
22#include "FairParRootFileIo.h"
23#include "FairParticleGenerator.h"
24#include "FairPipe.h"
25#include "FairPrimaryGenerator.h"
26#include "FairRootFileSink.h"
27#include "FairRunSim.h"
28#include "FairRuntimeDb.h"
29#include "FairTarget.h"
30#include "FairTrajFilter.h"
31
32// BmnRoot includes
33#include "BmnBd.h"
34#include "BmnCSC.h"
35#include "BmnCSCConfiguration.h"
36#include "BmnCSCDigitizer.h"
37#include "BmnDch.h"
38#include "BmnEcal.h"
39#include "BmnEcalDigitizer.h"
40#include "BmnFD.h"
41#include "BmnFHCal.h"
42#include "BmnFHCalDigitizer.h"
43#include "BmnFieldConst.h"
44#include "BmnFieldMap.h"
45#include "BmnFieldPar.h"
46#include "BmnFunctionSet.h"
47#include "BmnGemStripDigitizer.h"
48#include "BmnGemStripMedium.h"
49#include "BmnHodo.h"
50#include "BmnMwpc.h"
51#include "BmnNewFieldMap.h"
52#include "BmnScWall.h"
53#include "BmnSiBT.h"
54#include "BmnSiBTDigitizer.h"
55#include "BmnSiMD.h"
56#include "BmnSiMDDigitizer.h"
57#include "BmnSilicon.h"
58#include "BmnSiliconDigitizer.h"
59#include "BmnTOF.h"
60#include "BmnTOF1.h"
61#include "BmnZdc.h"
62#include "BmnZdcDigitizer.h"
63#include "CbmStack.h"
64#include "CbmSts.h"
65#include "MpdDCMSMMGenerator.h"
66#include "MpdGetNumEvents.h"
67#include "MpdLAQGSMGenerator.h"
68#include "MpdPHSDGenerator.h"
69#include "MpdUrqmdGenerator.h"
70#include "UniRun.h"
71
72// GEANT3 and 4 includes
73#include "TG4RunConfiguration.h"
74#include "TGeant4.h"
75#include "TPythia6Decayer.h"
76#include "TVirtualMC.h"
77// #include "TGeant3.h"
78// #include "TGeant3TGeo.h"
79
80#include "../../gconfig/g4Config.C"
81// #include "../../gconfig/g3Config.C"
82#include "../../gconfig/SetCuts.C"
83
84// C++ includes
85#include <iostream>
86using namespace std;
87#endif
88
90{
91 Config();
92 SetCuts();
93}
95{
96 Config();
97}
98
99#define GEANT4 // Choose: GEANT3 GEANT4
100// enumeration of generator names corresponding input files
112// inFile - input file with generator data, if needed
113// outFile - output file with MC data, default: bmnsim.root
114// nStartEvent - start event in the input generator file to begin transporting, default: 0
115// nEvents - number of events to transport
116// generatorName - generator name for the input file (enumeration above)
117// useRealEffects - whether we use realistic effects at simulation (Lorentz, misalignment)
118void run8_sim_bmn(TString inFile = "DCMSMM_XeCsI_3.9AGeV_mb_10k_142.r12",
119 TString outFile = "$VMCWORKDIR/macro/run8/bmnsim.root",
120 Int_t nStartEvent = 0,
121 Int_t nEvents = 10,
122 enumGenerators generatorName = BOX,
123 Bool_t useRealEffects = kFALSE)
124{
125 TStopwatch timer;
126 timer.Start();
127 gDebug = 0;
128
129 // ----- Create simulation run ----------------------------------------
130 FairRunSim* fRun = new FairRunSim();
131
132 // Choose the Geant Navigation System
133#ifdef GEANT4
134 fRun->SetName("TGeant4");
135#else
136 fRun->SetName("TGeant3");
137#endif
138
139 // load BM@N geometry
140 fRun->SetMaterials("media.geo");
141
142 // ----- Create passive volumes -------------------------
143 FairModule* cave = new FairCave("CAVE");
144 cave->SetGeometryFileName("cave.geo");
145 fRun->AddModule(cave);
146
147 FairModule* magnet = new FairMagnet("MAGNET");
148 magnet->SetGeometryFileName("magnet_modified.root");
149 fRun->AddModule(magnet);
150
151 FairModule* target = new FairTarget("Target");
152 target->SetGeometryFileName("target_CsI.geo");
153 fRun->AddModule(target);
154
155 // ----- Create detectors -------------------------
156
157 FairDetector* sibt = new BmnSiBT("SiBT", kTRUE);
158 sibt->SetGeometryFileName("SiBT_Run8.root");
159 fRun->AddModule(sibt);
160
161 FairDetector* simd = new BmnSiMD("SiMD", kTRUE);
162 simd->SetGeometryFileName("SiMD_run8_v1.root");
163 fRun->AddModule(simd);
164
165 FairDetector* bd = new BmnBd("BD", kTRUE);
166 bd->SetGeometryFileName("BD_run8_v1.root");
167 fRun->AddModule(bd);
168
169 FairDetector* fd = new BmnFD("FD", kTRUE);
170 fd->SetGeometryFileName("FD_run8.root");
171 fRun->AddModule(fd);
172
173 FairDetector* silicon = new BmnSilicon("SILICON", kTRUE);
174 silicon->SetGeometryFileName("Silicon_Run8_3stations_detailed.root");
175 fRun->AddModule(silicon);
176
177 FairDetector* gems = new CbmSts("GEM", kTRUE);
178 gems->SetGeometryFileName("GEMS_Run8_detailed.root");
179 fRun->AddModule(gems);
180
181 FairDetector* csc = new BmnCSC("CSC", kTRUE);
182 csc->SetGeometryFileName("CSC_Run8_detailed.root");
183 fRun->AddModule(csc);
184
185 FairDetector* tof1 = new BmnTOF1("TOF1", kTRUE);
186 tof1->SetGeometryFileName("TOF400_RUN7.root");
187 fRun->AddModule(tof1);
188
189 FairDetector* dch = new BmnDch("DCH", kTRUE);
190 dch->SetGeometryFileName("DCH_Run8.root");
191 fRun->AddModule(dch);
192
193 FairDetector* tof2 = new BmnTOF("TOF", kTRUE);
194 tof2->SetGeometryFileName("tof700_run8_with_support.root");
195 fRun->AddModule(tof2);
196
197 FairDetector* ecal = new BmnEcal("ECAL", kTRUE);
198 ecal->SetGeometryFileName("ECAL_v3_run8_pos5.root");
199 fRun->AddModule(ecal);
200
201 FairDetector* scwall = new BmnScWall("SCWALL", kTRUE);
202 scwall->SetGeometryFileName("ScWall_with_box_with_hole_XeCsI_3.9GeV_field_Extrap_scale_1800_900_Zpos_875.0cm_"
203 "Xshift_78.0cm_Yshift_0.0cm_rotationY_0.0deg_v1.root");
204 fRun->AddModule(scwall);
205
206 FairDetector* hodo = new BmnHodo("HODO", kTRUE);
207 hodo->SetGeometryFileName("Hodo_with_box_XeCsI_3.9GeV_field_Extrap_scale_1800_900_Zpos_892.0cm_Xshift_55.50cm_"
208 "Yshift_0.0cm_rotationY_0.0deg_v1.root");
209 fRun->AddModule(hodo);
210
211 BmnFHCal* fhcal = new BmnFHCal("FHCal", kTRUE);
212 // zdc->SetBirk();
213 fhcal->SetGeometryFileName("FHCal_54mods_hole_XeCsI_3.9GeV_field_Extrap_scale_1800_900_Zpos_900.0cm_Xshift_55.5cm_"
214 "Yshift_0.0cm_rotationY_0.0deg_v1.root");
215 fRun->AddModule(fhcal);
216
217 // Use the experiment specific MC Event header instead of the default one
218 // This one stores additional information about the reaction plane
219 // MpdMCEventHeader* mcHeader = new MpdMCEventHeader();
220 // fRun->SetMCEventHeader(mcHeader);
221
222 // Create and Set Event Generator
223 FairPrimaryGenerator* primGen = new FairPrimaryGenerator();
224 fRun->SetGenerator(primGen);
225
226 // Smearing of beam interaction point, if needed, and primary vertex position
227 // DO NOT do it in corresponding gen. sections to avoid incorrect summation!!!
228 primGen->SetBeam(0.0, 0.0, 1.6, 1.6); // (beamX0, beamY0, beamSigmaX, beamSigmaY)
229 primGen->SetTarget(0.0875, 0.0875); // (targetZ, targetDz)
230 primGen->SmearVertexZ(kTRUE);
231 primGen->SmearVertexXY(kTRUE);
232 gRandom->SetSeed(0);
233
234 switch (generatorName) {
235 // ------- UrQMD Generator
236 case URQMD: {
237 if (!BmnFunctionSet::CheckFileExist(inFile, 1))
238 exit(-1);
239
240 MpdUrqmdGenerator* urqmdGen = new MpdUrqmdGenerator(inFile);
241 // urqmdGen->SetEventPlane(0., 360.);
242 primGen->AddGenerator(urqmdGen);
243 if (nStartEvent > 0)
244 urqmdGen->SkipEvents(nStartEvent);
245
246 // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
247 if (nEvents == 0)
248 nEvents = MpdGetNumEvents::GetNumURQMDEvents(inFile.Data()) - nStartEvent;
249 break;
250 }
251
252 // ------- Particle Generator
253 case PART: {
254 // FairParticleGenerator generates a single particle type (PDG, mult, [GeV] px, py, pz, [cm] vx, vy, vz)
255 FairParticleGenerator* partGen = new FairParticleGenerator(211, 10, 1, 0, 3, 1, 0, 0);
256 primGen->AddGenerator(partGen);
257 break;
258 }
259
260 // ------- Ion Generator
261 case ION: {
262 // Start beam from a far point to check mom. reconstruction procedure (Z, A, q, mult, [GeV] px, py, pz, [cm]
263 // vx, vy, vz)
264 FairIonGenerator* fIongen = new FairIonGenerator(54, 131, 54, 1, 0., 0., -4.8, 0., 0., 0.); // Xe
265 primGen->AddGenerator(fIongen);
266 break;
267 }
268
269 // ------- Box Generator
270 case BOX: {
271 gRandom->SetSeed(0);
272 FairBoxGenerator* boxGen = new FairBoxGenerator(2212, 1); // 13 = muon; 1 = multipl.
273 boxGen->SetPRange(0.2, 5.0); // GeV/c, setPRange vs setPtRange
274 boxGen->SetPhiRange(0, 360); // Azimuth angle range [degree]
275 boxGen->SetThetaRange(0, 40.0); // Polar angle in lab system range [degree]
276 primGen->AddGenerator(boxGen);
277 break;
278 }
279
280 // ------- HSD/PHSD Generator
281 case HSD: {
282 if (!BmnFunctionSet::CheckFileExist(inFile, 1))
283 exit(-1);
284
285 MpdPHSDGenerator* hsdGen = new MpdPHSDGenerator(inFile.Data());
286 // hsdGen->SetPsiRP(0.); // set fixed Reaction Plane angle instead of random
287 primGen->AddGenerator(hsdGen);
288 if (nStartEvent > 0)
289 hsdGen->SkipEvents(nStartEvent);
290
291 // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
292 if (nEvents == 0)
293 nEvents = MpdGetNumEvents::GetNumPHSDEvents(inFile.Data()) - nStartEvent;
294 break;
295 }
296
297 // ------- LAQGSM/DCM-QGSM Generator
298 case QGSM:
299 case DCMQGSM: {
300
301 if (!BmnFunctionSet::CheckFileExist(inFile, 1))
302 exit(-1);
303
304 MpdLAQGSMGenerator* guGen = new MpdLAQGSMGenerator(inFile.Data(), kFALSE);
305 primGen->AddGenerator(guGen);
306 if (nStartEvent > 0)
307 guGen->SkipEvents(nStartEvent);
308
309 // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
310 if (nEvents == 0)
311 nEvents = MpdGetNumEvents::GetNumQGSMEvents(inFile.Data()) - nStartEvent;
312 break;
313 }
314 case DCMSMM: {
315
316 if (!BmnFunctionSet::CheckFileExist(inFile, 1))
317 exit(-1);
318
319 MpdDCMSMMGenerator* smmGen = new MpdDCMSMMGenerator(inFile.Data());
320 primGen->AddGenerator(smmGen);
321 if (nStartEvent > 0)
322 smmGen->SkipEvents(nStartEvent);
323
324 // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
325 if (nEvents == 0)
326 nEvents = MpdGetNumEvents::GetNumDCMSMMEvents(inFile.Data()) - nStartEvent;
327 break;
328 }
329
330 default: {
331 cout << "ERROR: Generator name was not pre-defined: " << generatorName << endl;
332 exit(-3);
333 }
334 } // end of switch (generatorName)
335
336 // if directory for the output file does not exist, then create
337 if (BmnFunctionSet::CreateDirectoryTree(outFile, 1) < 0)
338 exit(-2);
339 fRun->SetSink(new FairRootFileSink(outFile.Data()));
340 fRun->SetIsMT(false);
341
342 // ----- Create magnetic field ----------------------------------------
343 BmnFieldMap* magField = new BmnNewFieldMap("field_sp41v5_ascii_Extrap.root");
344 Double_t fieldScale = 1800. / 900.;
345 magField->SetScale(fieldScale);
346 fRun->SetField(magField);
347
348 fRun->SetStoreTraj(kTRUE);
349 fRun->SetRadLenRegister(kFALSE); // radiation length manager
350
351 // ----- Digitizers: converting MC points to detector digits -----------
352 // SiBT-Digitizer
354 BmnSiBTDigitizer* sibtDigit = new BmnSiBTDigitizer();
355 sibtDigit->SetCurrentConfig(sibt_config);
356 fRun->AddTask(sibtDigit);
357
358 // SiMD-Digitizer
359 BmnSiMDDigitizer* simdDigit = new BmnSiMDDigitizer();
360 fRun->AddTask(simdDigit);
361
362 // SI-Digitizer
364 BmnSiliconDigitizer* siliconDigit = new BmnSiliconDigitizer();
365 siliconDigit->SetCurrentConfig(si_config);
366 siliconDigit->SetUseRealEffects(useRealEffects);
367 fRun->AddTask(siliconDigit);
368
369 // GEM-Digitizer
371 if (useRealEffects)
375 gemDigit->SetCurrentConfig(gem_config);
376 gemDigit->SetUseRealEffects(useRealEffects);
377 fRun->AddTask(gemDigit);
378
379 // CSC-Digitizer
381 BmnCSCDigitizer* cscDigit = new BmnCSCDigitizer();
382 cscDigit->SetCurrentConfig(csc_config);
383 fRun->AddTask(cscDigit);
384
385 // FHCal-Digitizer
386 BmnFHCalDigitizer* zdcDigit = new BmnFHCalDigitizer();
387 zdcDigit->SetScale(28.2e3);
388 zdcDigit->SetThreshold(0.);
389 fRun->AddTask(zdcDigit);
390
391 // ECAL-Digitizer
392 // FIXME some problems with channels
393 // BmnEcalDigitizer * ecalDigit = new BmnEcalDigitizer();
394 // fRun->AddTask(ecalDigit);
395
396 fRun->Init();
397 magField->Print("");
398
399 // Trajectories Visualization (TGeoManager only)
400 FairTrajFilter* trajFilter = FairTrajFilter::Instance();
401 // Set cuts for storing the trajectories
402 trajFilter->SetStepSizeCut(0.01); // [cm]
403 trajFilter->SetVertexCut(-200., -200., -1000., 200., 200., 1100.); // (vxMin, vyMin, vzMin, vxMax, vyMax, vzMax)
404 trajFilter->SetMomentumCutP(30e-3); // p_lab > 30 MeV
405 trajFilter->SetEnergyCut(0., 10.); // 0 < Etot < 10 GeV
406 trajFilter->SetStorePrimaries(kTRUE);
407 trajFilter->SetStoreSecondaries(kTRUE); // kFALSE
408
409 // Fill the Parameter containers for this run
410 FairRuntimeDb* rtdb = fRun->GetRuntimeDb();
411
412 BmnFieldPar* fieldPar = (BmnFieldPar*)rtdb->getContainer("BmnFieldPar");
413 fieldPar->SetParameters(magField);
414 fieldPar->setChanged();
415 fieldPar->setInputVersion(fRun->GetRunId(), 1);
416 Bool_t kParameterMerged = kTRUE;
417 FairParRootFileIo* output = new FairParRootFileIo(kParameterMerged);
418 // AZ output->open(parFile.Data());
419 output->open(gFile);
420 rtdb->setOutput(output);
421
422 rtdb->saveOutput();
423 rtdb->print();
424
425 // Transport nEvents
426 fRun->Run(nEvents);
427
428 // gGeoManager->CheckOverlaps(0.0001);
429 // gGeoManager->PrintOverlaps();
430
431 fRun->CreateGeometryFile("full_geometry.root"); // save the full setup geometry to the additional file
432
433 if ((generatorName == QGSM) || (generatorName == DCMQGSM)) {
434 TString Pdg_table_name =
435 TString::Format("%s%s%c%s", gSystem->BaseName(inFile.Data()), ".g", (fRun->GetName())[6], ".pdg_table.dat");
436 (TDatabasePDG::Instance())->WritePDGTable(Pdg_table_name.Data());
437 }
438
439 timer.Stop();
440 Double_t rtime = timer.RealTime(), ctime = timer.CpuTime();
441 printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime);
442 cout << "Macro finished successfully." << endl; // marker of successfully execution for software testing systems
443
444 delete fRun;
445 // delete magField;
446}
447
448int main(int argc, char** arg)
449{
450 run8_sim_bmn();
451}
Definition BmnBd.h:9
void SetCurrentConfig(BmnCSCConfiguration::CSC_CONFIG config)
Definition BmnFD.h:22
void SetThreshold(double setValue)
void SetScale(double scale)
void SetScale(Double_t factor)
Definition BmnFieldMap.h:55
virtual void Print(Option_t *) const
void SetParameters(FairField *field)
static int CreateDirectoryTree(TString &fileName, int iVerbose=0, EAccessMode mode=kWritePermission)
static int CheckFileExist(TString &fileName, int iVerbose=0, EAccessMode mode=kFileExists)
void SetCurrentConfig(BmnGemStripConfiguration::GEM_CONFIG config)
void SetUseRealEffects(Bool_t opt=kTRUE)
static BmnGemStripMedium & GetInstance()
Bool_t SetCurrentConfiguration(BmnGemStripMediumConfiguration::MEDIUM medium)
void SetCurrentConfig(BmnSiBTConfiguration::SiBT_CONFIG config)
void SetCurrentConfig(BmnSiliconConfiguration::SILICON_CONFIG config)
void SetUseRealEffects(Bool_t opt=kTRUE)
Bool_t SkipEvents(Int_t count)
static Int_t GetNumPHSDEvents(const char *filename, int iVerbose=2)
static Int_t GetNumQGSMEvents(const char *fileName, int iVerbose=2)
static Int_t GetNumURQMDEvents(const char *fileName, int iVerbose=2)
static Int_t GetNumDCMSMMEvents(const char *fileName, int iVerbose=2)
Bool_t SkipEvents(Int_t nSkip)
Bool_t SkipEvents(Int_t n)
Bool_t SkipEvents(Int_t count)
STL namespace.
void geant4_setup()
void geant3_setup()
enumGenerators
@ PART
@ BOX
@ QGSM
@ HSD
@ URQMD
@ ION
@ DCMSMM
@ DCMQGSM
void run8_sim_bmn(TString inFile="DCMSMM_XeCsI_3.9AGeV_mb_10k_142.r12", TString outFile="$VMCWORKDIR/macro/run8/bmnsim.root", Int_t nStartEvent=0, Int_t nEvents=10, enumGenerators generatorName=BOX, Bool_t useRealEffects=kFALSE)
int main()