BmnRoot
Loading...
Searching...
No Matches
run_sim_src.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 "TKey.h"
6#include "TPRegexp.h"
7#include "TROOT.h"
8#include "TRandom.h"
9#include "TStopwatch.h"
10#include "TString.h"
11#include "TSystem.h"
12#include "TVirtualMC.h"
13
14// FairRoot includes
15#include "FairBoxGenerator.h"
16#include "FairCave.h"
17#include "FairDetector.h"
18#include "FairIonGenerator.h"
19#include "FairMagnet.h"
20#include "FairModule.h"
21#include "FairParRootFileIo.h"
22#include "FairParticleGenerator.h"
23#include "FairPipe.h"
24#include "FairPrimaryGenerator.h"
25#include "FairRootFileSink.h"
26#include "FairRunSim.h"
27#include "FairRuntimeDb.h"
28#include "FairTrajFilter.h"
29
30// BmnRoot includes
31#include "BmnArmTrig.h"
32#include "BmnBC.h"
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 "BmnFieldConst.h"
42#include "BmnFieldMap.h"
43#include "BmnFieldPar.h"
44#include "BmnFunctionSet.h"
45#include "BmnGemStripDigitizer.h"
46#include "BmnGemStripMedium.h"
47#include "BmnMwpc.h"
48#include "BmnNewFieldMap.h"
49#include "BmnSilicon.h"
50#include "BmnSiliconDigitizer.h"
51#include "BmnTOF.h"
52#include "BmnTOF1.h"
53#include "BmnZdc.h"
54#include "BmnZdcDigitizer.h"
55#include "CbmStack.h"
56#include "CbmSts.h"
57#include "MpdDCMSMMGenerator.h"
58#include "MpdGetNumEvents.h"
59#include "MpdLAQGSMGenerator.h"
60#include "MpdPHSDGenerator.h"
61#include "MpdUrqmdGenerator.h"
62#include "UniRun.h"
63
64// GEANT3 includes
65#include "../../gconfig/SetCuts.C"
66#include "../../gconfig/g3Config.C"
67#include "TGeant3.h"
68#include "TGeant3TGeo.h"
69
70// C++ includes
71#include <iostream>
72using namespace std;
73#endif
74
76{
77 Config();
78 SetCuts();
79}
80
81#define GEANT3 // Choose: GEANT3 GEANT4
82#define BOX
83// inFile - input file with generator data, if needed
84// outFile - output file with MC data, default: bmnsim.root
85// nStartEvent - start event in the input generator file to begin transporting, default: 0
86// nEvents - number of events to transport
87// generatorName - generator name for the input file (enumeration above)
88// useRealEffects - whether we use realistic effects at simulation (Lorentz, misalignment)
89void run_sim_src(TString inFile = "",
90 TString outFile = "$VMCWORKDIR/macro/run/srcsim.root",
91 Int_t nStartEvent = 0,
92 Int_t nEvents = 10,
93 Bool_t useRealEffects = kFALSE)
94{
95 TStopwatch timer;
96 timer.Start();
97 gDebug = 0;
98
99 // ----- Create simulation run ----------------------------------------
100 FairRunSim* fRun = new FairRunSim();
101 fRun->SetSimSetup(geant3_setup);
102
103 // Choose the Geant Navigation System
104#ifdef GEANT3
105 fRun->SetName("TGeant3");
106#else
107 fRun->SetName("TGeant4");
108#endif
109
110 fRun->SetMaterials("media.geo");
111
112 // ----- Create passive volumes -------------------------
113 FairModule* cave = new FairCave("CAVE");
114 cave->SetGeometryFileName("cave.geo");
115 fRun->AddModule(cave);
116
117 FairModule* magnet = new FairMagnet("MAGNET");
118 magnet->SetGeometryFileName("magnet_modified.root");
119 fRun->AddModule(magnet);
120
121 FairModule* magnetSP57 = new FairMagnet("MAGNET_SP57");
122 magnetSP57->SetGeometryFileName("magnetSP57_1.root");
123 fRun->AddModule(magnetSP57);
124
125 // ----- Create detectors -------------------------
126
127 FairDetector* mwpc = new BmnMwpc("MWPC", kTRUE);
128 mwpc->SetGeometryFileName("MWPC_RunSRCSpring2018.root");
129 fRun->AddModule(mwpc);
130
131 FairDetector* silicon = new BmnSilicon("SILICON", kTRUE);
132 silicon->SetGeometryFileName("Silicon_RunSRCSpring2018.root");
133 fRun->AddModule(silicon);
134
135 FairDetector* sts = new CbmSts("STS", kTRUE);
136 sts->SetGeometryFileName("GEMS_RunSRCSpring2018.root");
137 fRun->AddModule(sts);
138
139 FairDetector* csc = new BmnCSC("CSC", kTRUE);
140 csc->SetGeometryFileName("CSC_RunSRCSpring2018.root");
141 fRun->AddModule(csc);
142
143 FairDetector* tof1 = new BmnTOF1("TOF1", kTRUE);
144 tof1->SetGeometryFileName("TOF400_RUN7_SRC_AllignmentZY_v3.root");
145 fRun->AddModule(tof1);
146
147 FairDetector* tof = new BmnTOF("TOF", kTRUE);
148 tof->SetGeometryFileName("tof700_run7_with_support.root");
149 fRun->AddModule(tof);
150
151 FairDetector* dch = new BmnDch("DCH", kTRUE);
152 dch->SetGeometryFileName("DCH_RunSpring2018.root");
153 fRun->AddModule(dch);
154
155 BmnZdc* zdc = new BmnZdc("ZDC", kTRUE);
156 zdc->SetGeometryFileName("ZDC_RunSpring2018.root");
157 fRun->AddModule(zdc);
158
159 FairDetector* arm = new BmnArmTrig("SRCArmTriggers", kTRUE);
160 arm->SetGeometryFileName("SRCArmTriggers_Spring2018.root");
161 fRun->AddModule(arm);
162
163 FairDetector* bc = new BmnBC("BC", kTRUE);
164 bc->SetGeometryFileName("BC_RunSRCSpring2018.root");
165 fRun->AddModule(bc);
166
167 // Create and Set Event Generator
168 FairPrimaryGenerator* primGen = new FairPrimaryGenerator();
169 fRun->SetGenerator(primGen);
170
171 // Smearing of beam interaction point, if needed, and primary vertex position
172 // DO NOT do it in corresponding gen. sections to avoid incorrect summation!!!
173 primGen->SetBeam(0.5, -4.6, 0.0, 0.0);
174 primGen->SetTarget(-647.5, 0.0);
175 primGen->SmearVertexZ(kFALSE);
176 primGen->SmearVertexXY(kFALSE);
177
178#ifdef URQMD
179 // ------- UrQMD Generator
181 return;
182
183 MpdUrqmdGenerator* urqmdGen = new MpdUrqmdGenerator(inFile);
184 // urqmdGen->SetEventPlane(0., 360.);
185 primGen->AddGenerator(urqmdGen);
186 if (nStartEvent > 0)
187 urqmdGen->SkipEvents(nStartEvent);
188
189 // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
190 if (nEvents == 0)
191 nEvents = MpdGetNumEvents::GetNumURQMDEvents(inFile.Data()) - nStartEvent;
192
193#else
194#ifdef PART
195 // ------- Particle Generator
196 FairParticleGenerator* partGen = new FairParticleGenerator(211, 10, 1, 0, 3, 1, 0, 0);
197 primGen->AddGenerator(partGen);
198
199#else
200#ifdef ION
201 // ------- Ion Generator
202 // Start beam from a far point to check mom. reconstruction procedure
203 FairIonGenerator* fIongen = new FairIonGenerator(6, 12, 6, 1, 0., 0., 4., 0., 0., -647.);
204 primGen->AddGenerator(fIongen);
205
206#else
207#ifdef BOX
208 gRandom->SetSeed(0);
209 // ------- Box Generator
210 FairBoxGenerator* boxGen = new FairBoxGenerator(2212, 10); // 13 = muon; 1 = multipl.
211 boxGen->SetPRange(2., 2.); // GeV/c, setPRange vs setPtRange
212 boxGen->SetPhiRange(0, 360); // Azimuth angle range [degree]
213 boxGen->SetThetaRange(0., 40.); // Polar angle in lab system range [degree]
214 primGen->AddGenerator(boxGen);
215
216#else
217#ifdef HSD
218 // ------- HSD/PHSD Generator
220 return;
221
222 MpdPHSDGenerator* hsdGen = new MpdPHSDGenerator(inFile.Data());
223 // hsdGen->SetPsiRP(0.); // set fixed Reaction Plane angle instead of random
224 primGen->AddGenerator(hsdGen);
225 if (nStartEvent > 0)
226 hsdGen->SkipEvents(nStartEvent);
227
228 // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
229 if (nEvents == 0)
230 nEvents = MpdGetNumEvents::GetNumPHSDEvents(inFile.Data()) - nStartEvent;
231
232#else
233#ifdef QGSM
234 // ------- LAQGSM/DCM-QGSM Generator
236 return;
237
238 MpdLAQGSMGenerator* guGen = new MpdLAQGSMGenerator(inFile.Data(), kFALSE);
239 primGen->AddGenerator(guGen);
240 if (nStartEvent > 0)
241 guGen->SkipEvents(nStartEvent);
242
243 // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
244 if (nEvents == 0)
245 nEvents = MpdGetNumEvents::GetNumQGSMEvents(inFile.Data()) - nStartEvent;
246
247#endif
248#endif
249#endif
250#endif
251#endif
252#endif
253
254 fRun->SetSink(new FairRootFileSink(outFile.Data()));
255 fRun->SetIsMT(false);
256
257 // ----- Create magnetic field ----------------------------------------
258 Double_t fieldScale = 1800. / 900.;
259 BmnFieldMap* magField = new BmnNewFieldMap("field_sp41v5_ascii_Extrap.root");
260 magField->SetScale(fieldScale);
261 fRun->SetField(magField);
262
263 fRun->SetStoreTraj(kTRUE);
264 fRun->SetRadLenRegister(kFALSE); // radiation length manager
265
266 // SI-Digitizer
268 BmnSiliconDigitizer* siliconDigit = new BmnSiliconDigitizer();
269 siliconDigit->SetCurrentConfig(si_config);
270 siliconDigit->SetOnlyPrimary(kFALSE);
271 fRun->AddTask(siliconDigit);
272
273 // GEM-Digitizer
275 if (useRealEffects)
279 gemDigit->SetCurrentConfig(gem_config);
280 gemDigit->SetOnlyPrimary(kFALSE);
281 gemDigit->SetStripMatching(kTRUE);
282 fRun->AddTask(gemDigit);
283
284 // CSC-Digitizer
286 BmnCSCDigitizer* cscDigit = new BmnCSCDigitizer();
287 cscDigit->SetCurrentConfig(csc_config);
288 cscDigit->SetOnlyPrimary(kFALSE);
289 cscDigit->SetStripMatching(kTRUE);
290 fRun->AddTask(cscDigit);
291
292 fRun->Init();
293 magField->Print("");
294
295 // Trajectories Visualization (TGeoManager only)
296 FairTrajFilter* trajFilter = FairTrajFilter::Instance();
297 // Set cuts for storing the trajectories
298 trajFilter->SetStepSizeCut(0.01); // 1 cm
299 trajFilter->SetVertexCut(-200., -200., -150., 200., 200., 1100.);
300 trajFilter->SetMomentumCutP(10e-3); // p_lab > 10 MeV
301 trajFilter->SetEnergyCut(0., 4.); // 0 < Etot < 1.04 GeV //
302 trajFilter->SetStorePrimaries(kTRUE);
303 trajFilter->SetStoreSecondaries(kTRUE); // kFALSE
304
305 // Fill the Parameter containers for this run
306 FairRuntimeDb* rtdb = fRun->GetRuntimeDb();
307
308 BmnFieldPar* fieldPar = (BmnFieldPar*)rtdb->getContainer("BmnFieldPar");
309 fieldPar->SetParameters(magField);
310 fieldPar->setChanged();
311 fieldPar->setInputVersion(fRun->GetRunId(), 1);
312 Bool_t kParameterMerged = kTRUE;
313 FairParRootFileIo* output = new FairParRootFileIo(kParameterMerged);
314 // AZ output->open(parFile.Data());
315 output->open(gFile);
316 rtdb->setOutput(output);
317
318 rtdb->saveOutput();
319 rtdb->print();
320
321 // Transport nEvents
322 fRun->Run(nEvents);
323
324 // gGeoManager->CheckOverlaps(0.0001);
325 // gGeoManager->PrintOverlaps();
326 // fRun->CreateGeometryFile("full_geometry.root"); // save the full setup geometry to the additional file
327
328#ifdef QGSM
329 TString Pdg_table_name =
330 TString::Format("%s%s%c%s", gSystem->BaseName(inFile.Data()), ".g", (fRun->GetName())[6], ".pdg_table.dat");
331 (TDatabasePDG::Instance())->WritePDGTable(Pdg_table_name.Data());
332#endif
333
334 timer.Stop();
335 Double_t rtime = timer.RealTime(), ctime = timer.CpuTime();
336 printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime);
337 cout << "Macro finished successfully." << endl; // marker of successfully execution for software testing systems
338 delete fRun;
339 delete magField;
340}
341
342int main(int argc, char** arg)
343{
344 run_sim_src();
345}
Definition BmnBC.h:26
void SetOnlyPrimary(Bool_t opt=kFALSE)
void SetStripMatching(Bool_t opt=kTRUE)
void SetCurrentConfig(BmnCSCConfiguration::CSC_CONFIG config)
void SetScale(Double_t factor)
Definition BmnFieldMap.h:55
virtual void Print(Option_t *) const
void SetParameters(FairField *field)
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)
static BmnGemStripMedium & GetInstance()
Bool_t SetCurrentConfiguration(BmnGemStripMediumConfiguration::MEDIUM medium)
void SetCurrentConfig(BmnSiliconConfiguration::SILICON_CONFIG config)
void SetOnlyPrimary(Bool_t opt=kFALSE)
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)
Bool_t SkipEvents(Int_t nSkip)
Bool_t SkipEvents(Int_t n)
Bool_t SkipEvents(Int_t count)
STL namespace.
int main()
void geant3_setup()
void run_sim_src(TString inFile="", TString outFile="$VMCWORKDIR/macro/run/srcsim.root", Int_t nStartEvent=0, Int_t nEvents=10, Bool_t useRealEffects=kFALSE)