BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
run_sim_bmn_ecal.C
Go to the documentation of this file.
1#include <Rtypes.h>
2
3// inFile - input file with generator data, default: auau.09gev.mbias.98k.ftn14
4// nStartEvent - for compatibility, any number
5// nEvents - number of events to transport, default: 1
6// outFile - output file with MC data, default: evetest.root
7// flag_store_FairRadLenPoint
8void run_sim_bmn_ecal(TString inFile = "/nica/data4mpd1/QGSM/AuAu4mb_mer.r12.gz",
9 TString outFile = "evetest.root",
10 Int_t nStartEvent = 0,
11 Int_t nEvents = 1,
12 Bool_t flag_store_FairRadLenPoint = kFALSE,
13 Bool_t isFieldMap = kTRUE)
14{
15
16#define LAQGSM
17 // #define URQMD
18
19 TStopwatch timer;
20 timer.Start();
21 gDebug = 0;
22
23 gROOT->LoadMacro("$VMCWORKDIR/macro/run/bmnloadlibs.C");
24 bmnloadlibs(); // load libraries
25
26 gROOT->LoadMacro("$VMCWORKDIR/macro/ecal/geometry_ecal_only.C");
27
28 // ----- Create simulation run ----------------------------------------
29 FairRunSim* fRun = new FairRunSim();
30
31 // Choose the Geant Navigation System
32 // fRun->SetName("TGeant3");
33 fRun->SetName("TGeant4");
34 // fRun->SetGeoModel("G3Native");
35
36 // geometry_run1(fRun); // load bmn geometry
37 geometry(fRun); // load bmn geometry
38
39 // Use the experiment specific MC Event header instead of the default one
40 // This one stores additional information about the reaction plane
41 // MpdMCEventHeader* mcHeader = new MpdMCEventHeader();
42 // fRun->SetMCEventHeader(mcHeader);
43
44 // Create and Set Event Generator
45 //-------------------------------
46
47 // Use the CbmUrqmdGenrator which calculates a reaction plane and
48 // rotate all particles accordingly
49 // CbmUrqmdGenerator* urqmdGen = new CbmUrqmdGenerator(inFile);
50 // urqmdGen->SetEventPlane(0. , 360.);
51 // primGen->AddGenerator(urqmdGen);
52 // fRun->SetGenerator(primGen);
53
54 FairPrimaryGenerator* primGen = new FairPrimaryGenerator();
55 fRun->SetGenerator(primGen);
56
57 // smearing of beam interaction point
58 // primGen->SetBeam(0.0,0.0,0.1,0.1);
59 // primGen->SetTarget(0.0,24.0);
60 // primGen->SmearGausVertexZ(kTRUE);
61 // primGen->SmearVertexXY(kTRUE);
62
63#ifdef URQMD
64 // ------- Urqmd Generator
65 TString hostname = gSystem->HostName(), dataFile;
66
67 if (inFile.Contains("/"))
68 dataFile = inFile;
69 else {
70 dataFile = find_path_to_URQMD_files();
71 if ((hostname == "lxmpd-ui.jinr.ru") || (hostname == "lxmpd-ui"))
72 dataFile += "auau.09gev.mbias.10k.f14";
73 else
74 dataFile += inFile;
75 }
76
77 if (!CheckFileExist(dataFile))
78 return;
79
80 MpdUrqmdGenerator* urqmdGen = new MpdUrqmdGenerator(dataFile);
81 primGen->AddGenerator(urqmdGen);
82 if (nStartEvent > 0)
83 urqmdGen->SkipEvents(nStartEvent);
84
85 // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
86 if (nEvents == 0)
87 nEvents = MpdGetNumEvents::GetNumURQMDEvents(dataFile.Data()) - nStartEvent;
88
89#else
90#ifdef PART
91 // ------- Particle Generator
92 FairParticleGenerator* partGen = new FairParticleGenerator(211, 10, 1, 0, 3, 1, 0, 0);
93 primGen->AddGenerator(partGen);
94
95#else
96#ifdef ION
97 // ------- Ion Generator
98 FairIonGenerator* fIongen =
99 // new FairIonGenerator(79, 197, 79, 1, 0., 0., 25, 0., 0., -1.);
100 new FairIonGenerator(6, 12, 6, 100, 0., 0., 4, 0., 0., -1.);
101 primGen->AddGenerator(fIongen);
102 // fIongen = new FairIonGenerator(79, 197, 79, 5, 0., 0., 35, 0., 0., -1.);
103
104#else
105#ifdef BOX
106 gRandom->SetSeed(0);
107 // ------- Box Generator
108 FairBoxGenerator* boxGen = new FairBoxGenerator(13, 50); // 13 = muon; 1 = multipl.
109 boxGen->SetPRange(0.2, 5.05); // GeV/c //setPRange vs setPtRange
110 boxGen->SetPhiRange(0, 360); // Azimuth angle range [degree]
111 boxGen->SetThetaRange(5, 20); // Polar angle in lab system range [degree]
112 boxGen->SetXYZ(0., 0., 0.); // mm o cm ??
113 primGen->AddGenerator(boxGen);
114
115#else
116#ifdef HSD
117 // ------- HSD/PHSD Generator
118 TString dataFile;
119 if (inFile.Contains("/"))
120 dataFile = inFile;
121 else {
122 dataFile = find_path_to_URQMD_files();
123 dataFile += "/../../HSD/"; // nc-farm
124 dataFile += inFile;
125 }
126
127 if (!CheckFileExist(dataFile))
128 return;
129
130 MpdPHSDGenerator* hsdGen = new MpdPHSDGenerator(dataFile.Data());
131 // hsdGen->SetPsiRP(0.); // set fixed Reaction Plane angle instead of random
132 primGen->AddGenerator(hsdGen);
133 if (nStartEvent > 0)
134 hsdGen->SkipEvents(nStartEvent);
135
136 // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
137 if (nEvents == 0)
138 nEvents = MpdGetNumEvents::GetNumPHSDEvents(dataFile.Data()) - nStartEvent;
139
140#else
141#ifdef LAQGSM
142 // ------- LAQGSM Generator
143 TString dataFile;
144 if (inFile.Contains("/"))
145 dataFile = inFile;
146 else {
147 dataFile = find_path_to_URQMD_files();
148 dataFile += "/../../QGSM/"; // nc-farm
149 dataFile += inFile;
150 }
151
152 if (!CheckFileExist(dataFile))
153 return;
154
155 MpdLAQGSMGenerator* guGen = new MpdLAQGSMGenerator(dataFile.Data(), kFALSE, 0, 1 + nStartEvent + nEvents);
156 primGen->AddGenerator(guGen);
157 if (nStartEvent > 0)
158 guGen->SkipEvents(nStartEvent);
159
160 // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
161 if (nEvents == 0)
162 nEvents = MpdGetNumEvents::GetNumQGSMEvents(dataFile.Data()) - nStartEvent;
163
164#endif
165#endif
166#endif
167#endif
168#endif
169#endif
170
171 fRun->SetOutputFile(outFile.Data());
172
173 // ----- Create magnetic field ----------------------------------------
174 if (isFieldMap) {
175 Double_t fieldScale = 1.;
176 // BmnFieldMap* magField = new BmnNewFieldMap("field_sp41v2_ascii_noExtrap.dat");
177 BmnFieldMap* magField = new BmnNewFieldMap("field_sp41v3_ascii_Extrap.dat");
178 // Double_t fieldZ = 124.5; // field centre z position
179 // magField->SetPosition(0., 0., fieldZ);
180 magField->SetScale(fieldScale);
181 fRun->SetField(magField);
182 } else {
183 BmnFieldConst* magField = new BmnFieldConst();
184 magField->SetFieldRegion(-300., 300., -300., 300., -300., 300);
185 magField->SetField(0., -9. * 0.44, 0.);
186 fRun->SetField(magField);
187 }
188
189 fRun->SetStoreTraj(kTRUE);
190 fRun->SetRadLenRegister(flag_store_FairRadLenPoint); // radiation length manager
191
192 fRun->Init();
193 if (isFieldMap)
194 magField->Print();
195
196 // Trajectories Visualization (TGeoManager only)
197 //-------------------------------------------
198 FairTrajFilter* trajFilter = FairTrajFilter::Instance();
199 // Set cuts for storing the trajectories
200 trajFilter->SetStepSizeCut(0.01); // 1 cm
201 trajFilter->SetVertexCut(-200., -200., -150., 200., 200., 1100.); //
202 trajFilter->SetMomentumCutP(10e-3); // p_lab > 10 MeV
203 trajFilter->SetEnergyCut(0., 4.); // 0 < Etot < 1.04 GeV //
204 trajFilter->SetStorePrimaries(kTRUE);
205 trajFilter->SetStoreSecondaries(kTRUE); // kFALSE
206
207 // Fill the Parameter containers for this run
208 //-------------------------------------------
209 FairRuntimeDb* rtdb = fRun->GetRuntimeDb();
210
211 BmnFieldPar* fieldPar = (BmnFieldPar*)rtdb->getContainer("BmnFieldPar");
212 fieldPar->SetParameters(magField);
213 fieldPar->setChanged();
214 fieldPar->setInputVersion(fRun->GetRunId(), 1);
215 Bool_t kParameterMerged = kTRUE;
216 FairParRootFileIo* output = new FairParRootFileIo(kParameterMerged);
217 // AZ output->open(parFile.Data());
218 output->open(gFile);
219 rtdb->setOutput(output);
220
221 /*MpdMultiFieldPar* Par = (MpdMultiFieldPar*) rtdb->getContainer("MpdMultiFieldPar");
222 if (fField)
223 Par->SetParameters(fField);
224 Par->setInputVersion(fRun->GetRunId(),1);
225 Par->setChanged();
226 // Par->printParams();
227 */
228
229 rtdb->saveOutput();
230 rtdb->print();
231
232 // Transport nEvents
233 // -----------------
234 fRun->Run(nEvents);
235
236 fRun->CreateGeometryFile("geofile_full.root");
237
238#ifdef LAQGSM
239 TString Pdg_table_name =
240 TString::Format("%s%s%c%s", gSystem->BaseName(dataFile.Data()), ".g", (fRun->GetName())[6], ".pdg_table.dat");
241 (TDatabasePDG::Instance())->WritePDGTable(Pdg_table_name.Data());
242#endif
243
244 timer.Stop();
245 Double_t rtime = timer.RealTime(), ctime = timer.CpuTime();
246 printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime);
247
248 cout << "Macro finished succesfully." << endl;
249
250 gApplication->Terminate();
251}
bool Bool_t
int Int_t
Int_t gDebug
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
R__EXTERN TApplication * gApplication
#define gFile
#define gROOT
R__EXTERN TRandom * gRandom
R__EXTERN TSystem * gSystem
void SetField(Double_t bX, Double_t bY, Double_t bZ)
Set the field values.
void SetFieldRegion(Double_t xMin, Double_t xMax, Double_t yMin, Double_t yMax, Double_t zMin, Double_t zMax)
Set the field region.
void SetScale(Double_t factor)
Set a global field scaling factor.
Definition BmnFieldMap.h:55
void SetParameters(FairField *field)
Set parameters from BmnField.
Field Map does not have any symmetries w.r.t coordinate axises.
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)
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,...)
void run_sim_bmn_ecal(TString inFile="/nica/data4mpd1/QGSM/AuAu4mb_mer.r12.gz", TString outFile="evetest.root", Int_t nStartEvent=0, Int_t nEvents=1, Bool_t flag_store_FairRadLenPoint=kFALSE, Bool_t isFieldMap=kTRUE)