runMC.C 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. // Macro for running Fair with Geant3 or Geant4 (M. Al-Turany , D. Bertini)
  2. // Modified 22/06/2005 D.Bertini
  3. // Last modified 18/07/2013 P.Batyuk (MPD)
  4. #if !defined(__CINT__) || defined(__MAKECINT__)
  5. #include "TString.h"
  6. #include "TStopwatch.h"
  7. #include "TROOT.h"
  8. #include "TSystem.h"
  9. #include "FairRunSim.h"
  10. #include "FairRuntimeDb.h"
  11. #include "FairParRootFileIo.h"
  12. #include "FairTrajFilter.h"
  13. #include "FairUrqmdGenerator.h"
  14. #include "FairPrimaryGenerator.h"
  15. #include "FairCave.h"
  16. #include "FairPipe.h"
  17. #include "FairMagnet.h"
  18. #include "MpdSts.h"
  19. #include "TpcDetector.h"
  20. #include "MpdEtof.h"
  21. #include "MpdFsa.h"
  22. #include "MpdBbc.h"
  23. #include "MpdCpc.h"
  24. #include "MpdTof.h"
  25. #include "MpdStrawendcap.h"
  26. #include "MpdZdc.h"
  27. #include "MpdFfd.h"
  28. #include "MpdGetNumEvents.h"
  29. #include <iostream>
  30. using namespace std;
  31. #endif
  32. // inFile - input file with generator data, default: auau.09gev.mbias.98k.ftn14
  33. // nStartEvent - for compatibility, any number
  34. // nEvents - number of events to transport, default: 1
  35. // outFile - output file with MC data, default: evetest.root
  36. // flag_store_FairRadLenPoint
  37. // FieldSwitcher: 0 - corresponds to the ConstantField (0, 0, 5) kG (It is used by default); 1 - corresponds to the FieldMap ($VMCWORKDIR/input/B-field_v2.dat)
  38. void runMC(TString inFile = "auau.04gev.0_3fm.10k.f14", TString outFile = "$VMCWORKDIR/macro/mpd/test/evetest.root", Int_t nStartEvent = 0, Int_t nEvents = 1, Int_t nSkip = 0,Bool_t flag_store_FairRadLenPoint = kFALSE, Int_t FieldSwitcher = 0) {
  39. #define LAQGSM
  40. //#define SHIELD
  41. //#define URQMD
  42. //#define HADGEN
  43. TStopwatch timer;
  44. timer.Start();
  45. gDebug = 0;
  46. gROOT->LoadMacro("$VMCWORKDIR/macro/mpd/mpdloadlibs.C");
  47. mpdloadlibs(1, 1); // load main libraries
  48. //gROOT->LoadMacro("$VMCWORKDIR/macro/mpd/geometry_v2.C");
  49. //gROOT->LoadMacro("$VMCWORKDIR/macro/mpd/geometry_stage1.C");
  50. gROOT->LoadMacro("/lustre/nyx/cbm/users/marina/laqgsm/AuAuss11mb/geometry_stage1.C");
  51. FairRunSim *fRun = new FairRunSim();
  52. // Choose the Geant Navigation System
  53. //fRun->SetName("TGeant3");
  54. fRun->SetName("TGeant4");
  55. // fRun->SetGeoModel("G3Native");
  56. geometry_stage1(fRun, kTRUE); // load mpd geometry
  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. FairMCEventHeader* mcHeader = new FairMCEventHeader();
  61. fRun->SetMCEventHeader(mcHeader);
  62. // Create and Set Event Generator
  63. //-------------------------------
  64. FairPrimaryGenerator* primGen = new FairPrimaryGenerator();
  65. fRun->SetGenerator(primGen);
  66. // smearing of beam interaction point
  67. //primGen->SetBeam(0.0,0.0,0.1,0.1);
  68. primGen->SetTarget(0.0,24.0);
  69. primGen->SmearGausVertexZ(kTRUE);
  70. //primGen->SmearVertexXY(kTRUE);
  71. #ifdef URQMD
  72. // ------- Urqmd Generator
  73. TString hostname = gSystem->HostName(), dataFile;
  74. if (inFile.Contains("/"))
  75. dataFile = inFile;
  76. else {
  77. dataFile = find_path_to_URQMD_files();
  78. if ((hostname == "lxmpd-ui.jinr.ru") || (hostname == "lxmpd-ui"))
  79. dataFile += "auau.09gev.mbias.10k.f14";
  80. else
  81. dataFile += inFile;
  82. }
  83. if (!CheckFileExist(dataFile)) return;
  84. MpdUrqmdGenerator* urqmdGen = new MpdUrqmdGenerator(dataFile);
  85. primGen->AddGenerator(urqmdGen);
  86. if (nStartEvent > 0) urqmdGen->SkipEvents(nStartEvent);
  87. // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
  88. if (nEvents == 0)
  89. nEvents = MpdGetNumEvents::GetNumURQMDEvents(dataFile.Data()) - nStartEvent;
  90. #else
  91. #ifdef FLUID
  92. Mpd3fdGenerator* fluidGen = new Mpd3fdGenerator(inFile);
  93. fluidGen->SkipEvents(0);
  94. primGen->AddGenerator(fluidGen);
  95. //if (nStartEvent > 0) urqmdGen->SkipEvents(nStartEvent);
  96. // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
  97. // if (nEvents == 0)
  98. // nEvents = MpdGetNumEvents::GetNumURQMDEvents(dataFile.Data()) - nStartEvent;
  99. #else
  100. #ifdef PART
  101. // ------- Particle Generator
  102. FairParticleGenerator* partGen =
  103. new FairParticleGenerator(211, 10, 1, 0, 3, 1, 0, 0);
  104. primGen->AddGenerator(partGen);
  105. #else
  106. #ifdef ION
  107. // ------- Ion Generator
  108. FairIonGenerator *fIongen =
  109. new FairIonGenerator(79, 197, 79, 1, 0., 0., 25, 0., 0., -1.);
  110. primGen->AddGenerator(fIongen);
  111. #else
  112. #ifdef BOX
  113. gRandom->SetSeed(0);
  114. // ------- Box Generator
  115. FairBoxGenerator* boxGen = new
  116. FairBoxGenerator(13, 1); // 13 = muon; 1 = multipl.
  117. boxGen->SetPRange(0.25, 2.5); // GeV/c //setPRange vs setPtRange
  118. boxGen->SetPhiRange(0, 360); // Azimuth angle range [degree]
  119. boxGen->SetThetaRange(0, 180); // Polar angle in lab system range [degree]
  120. boxGen->SetXYZ(0., 0., 0.); // mm o cm ??
  121. primGen->AddGenerator(boxGen);
  122. #else
  123. #ifdef HSD
  124. // ------- HSD/PHSD Generator
  125. TString dataFile;
  126. ~ if (inFile.Contains("/"))
  127. dataFile = inFile;
  128. else {
  129. dataFile = find_path_to_URQMD_files();
  130. dataFile += "/../../HSD/"; // nc-farm
  131. dataFile += inFile;
  132. }
  133. if (!CheckFileExist(dataFile)) return;
  134. MpdPHSDGenerator *hsdGen = new MpdPHSDGenerator(dataFile.Data());
  135. //hsdGen->SetPsiRP(0.); // set fixed Reaction Plane angle instead of random
  136. primGen->AddGenerator(hsdGen);
  137. if (nStartEvent > 0) hsdGen->SkipEvents(nStartEvent);
  138. // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
  139. if (nEvents == 0)
  140. nEvents = MpdGetNumEvents::GetNumPHSDEvents(dataFile.Data()) - nStartEvent;
  141. #else
  142. #ifdef SHIELD
  143. // ------- SHIELD Generator
  144. /*
  145. TString dataFile;
  146. if (inFile.Contains("/"))
  147. dataFile = inFile;
  148. else {
  149. dataFile = find_path_to_URQMD_files();
  150. dataFile += "/../../QGSM/"; // nc-farm
  151. dataFile += inFile;
  152. }
  153. if (!CheckFileExist(dataFile)) return;
  154. */
  155. TString dataFile;
  156. dataFile = inFile;
  157. if (!CheckFileExist(dataFile)) return;
  158. Bool_t use_collider_system = kTRUE;
  159. //Double_t collider_energy = 6.631;
  160. Double_t collider_energy = 62.482;
  161. //=6.631 sqrt(s)=(2+2) (GeV)
  162. //=11.418 sqrt(s)=(2.5+2.5)
  163. //=24.184 sqrt(s)=(3.5+3.5)
  164. //=41.205 sqrt(s)=(4.5+4.5)
  165. //=62.482 sqrt(s)=(5.5+5.5)
  166. FairShieldGenerator* shieldGen = new FairShieldGenerator(inFile,use_collider_system,collider_energy);
  167. primGen->AddGenerator(shieldGen);
  168. /*
  169. //TString inFile = inDir + "FOR038_au" + sEn + "au_100ev_" + sfileNum + ".dat";
  170. nEvents = 40;
  171. //inFile = "FOR038_au6.631au_test.dat";
  172. //inFile = "FOR038_au6.631au_test_3.dat";
  173. //inFile = "FOR038_au6.631au_10000_notfull.dat";
  174. //inFile = "FOR038_au6.631au_10ev.dat";
  175. //inFile = "/hera/cbm/users/marina/shield/shield_code/au62.482au/test.dat";
  176. inFile = "/hera/cbm/users/marina/shield/shield_code/au62.482au/test_40ev.dat";
  177. Bool_t use_collider_system = kTRUE;
  178. //Double_t collider_energy = 6.631;
  179. Double_t collider_energy = 62.482;
  180. //=6.631 sqrt(s)=(2+2) (GeV)
  181. //=11.418 sqrt(s)=(2.5+2.5)
  182. //=24.184 sqrt(s)=(3.5+3.5)
  183. //=41.205 sqrt(s)=(4.5+4.5)
  184. //=62.482 sqrt(s)=(5.5+5.5)
  185. cout <<"marina 1" <<endl;
  186. FairShieldGenerator* shieldGen = new FairShieldGenerator(inFile,use_collider_system,collider_energy);
  187. cout <<"marina 2" <<endl;
  188. primGen->AddGenerator(shieldGen);
  189. cout <<"marina 3" <<endl;
  190. //if (nStartEvent > 0) guGen->SkipEvents(nStartEvent);
  191. */
  192. // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
  193. /*
  194. if (nEvents == 0)
  195. nEvents = MpdGetNumEvents::GetNumQGSMEvents(dataFile.Data()) - nStartEvent;
  196. */
  197. #else
  198. #ifdef LAQGSM
  199. // ------- LAQGSM Generator
  200. /*
  201. TString dataFile;
  202. if (inFile.Contains("/"))
  203. dataFile = inFile;
  204. else {
  205. dataFile = find_path_to_URQMD_files();
  206. dataFile += "/../../QGSM/"; // nc-farm
  207. dataFile += inFile;
  208. }
  209. */
  210. TString dataFile;
  211. dataFile = inFile;
  212. if (!CheckFileExist(dataFile)) return;
  213. //nEvents = 2;
  214. //Int_t nSkip=0;
  215. Bool_t use_collider_system = kTRUE;
  216. Int_t QGSM_format_ID;
  217. //inFile = "/hera/cbm/users/marina/laqgsm/AuAuss11mb/AuAuss11mb_1.r12";
  218. //inFile = "AuAuss11mb_1.r12";
  219. dataFile = inFile;
  220. //MpdLAQGSMGenerator* guGen = new MpdLAQGSMGenerator(inFile);
  221. MpdLAQGSMGenerator* guGen = new MpdLAQGSMGenerator(dataFile.Data(),use_collider_system,QGSM_format_ID);
  222. primGen->AddGenerator(guGen);
  223. //if (nStartEvent > 0) guGen->SkipEvents(nStartEvent);
  224. cout <<"runMC " <<nSkip <<endl;
  225. guGen->SkipEvents(nSkip);
  226. //primGen->SetTarget(50.0,24.0);
  227. // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
  228. //if (nEvents == 0)
  229. //nEvents = MpdGetNumEvents::GetNumQGSMEvents(dataFile.Data()) - nStartEvent;
  230. /*
  231. TString dataFile;
  232. dataFile = inFile;
  233. if (!CheckFileExist(dataFile)) return;
  234. MpdLAQGSMGenerator* guGen = new MpdLAQGSMGenerator(dataFile.Data());
  235. primGen->AddGenerator(guGen);
  236. if (nStartEvent > 0) guGen->SkipEvents(nStartEvent);
  237. // if nEvents is equal 0 then all events (start with nStartEvent) of the given file should be processed
  238. if (nEvents == 0)
  239. nEvents = MpdGetNumEvents::GetNumQGSMEvents(dataFile.Data()) - nStartEvent;
  240. */
  241. #else
  242. #ifdef HADGEN
  243. THadgen* hadGen = new THadgen();
  244. //hadGen->SetRandomSeed(clock() + time(0));
  245. hadGen->SetNuclid(79);
  246. hadGen->SetParticleFromPdgCode(0, 196.9665, 79);
  247. //hadGen->SetEnergy(6.5E3);
  248. hadGen->SetEnergy(6.5);
  249. MpdGeneralGenerator* generalHad = new MpdGeneralGenerator(hadGen);
  250. hadGen->FileOut("shield_out.txt");
  251. primGen->AddGenerator(generalHad);
  252. #endif
  253. #endif
  254. #endif
  255. #endif
  256. #endif
  257. #endif
  258. #endif
  259. #endif
  260. #endif
  261. fRun->SetOutputFile(outFile.Data());
  262. // Magnetic Field Map - for proper use in the analysis MultiField is necessary here
  263. // --------------------
  264. MpdMultiField *fField = new MpdMultiField();
  265. if (FieldSwitcher == 0) {
  266. MpdConstField *fMagField = new MpdConstField();
  267. fMagField->SetField(0., 0., 5.); // values are in kG: 1T = 10kG
  268. fMagField->SetFieldRegion(-230, 230, -230, 230, -375, 375);
  269. fField->AddField(fMagField);
  270. fRun->SetField(fField);
  271. cout << "FIELD at (0., 0., 0.) = (" <<
  272. fMagField->GetBx(0., 0., 0.) << "; " << fMagField->GetBy(0., 0., 0.) << "; " << fMagField->GetBz(0., 0., 0.) << ")" << endl;
  273. } else if (FieldSwitcher == 1) {
  274. MpdFieldMap* fMagField = new MpdFieldMap("B-field_v2", "A");
  275. fMagField->Init();
  276. fField->AddField(fMagField);
  277. fRun->SetField(fField);
  278. cout << "FIELD at (0., 0., 0.) = (" <<
  279. fMagField->GetBx(0., 0., 0.) << "; " << fMagField->GetBy(0., 0., 0.) << "; " << fMagField->GetBz(0., 0., 0.) << ")" << endl;
  280. }
  281. fRun->SetStoreTraj(kTRUE);
  282. fRun->SetRadLenRegister(flag_store_FairRadLenPoint); // radiation length manager
  283. // MpdTpcDigitizerTask* tpcDigitizer = new MpdTpcDigitizerTask();
  284. // tpcDigitizer->SetOnlyPrimary(kTRUE); /// Digitize only primary track
  285. // tpcDigitizer->SetMakeQA(kTRUE); /// SetMakeQA(kTRUE) prepares Quality Assurance Histograms
  286. // tpcDigitizer->SetDiffuse(kFALSE);
  287. // tpcDigitizer->SetDebug(kFALSE);
  288. // tpcDigitizer->SetDistort(kFALSE);
  289. // tpcDigitizer->SetResponse(kFALSE);
  290. // tpcDigitizer->SetDistribute(kFALSE);
  291. //fRun->AddTask(tpcDigitizer);
  292. fRun->Init();
  293. // -Trajectories Visualization (TGeoManager Only )
  294. // -----------------------------------------------
  295. // Set cuts for storing the trajectories
  296. FairTrajFilter* trajFilter = FairTrajFilter::Instance();
  297. trajFilter->SetStepSizeCut(0.01); // 1 cm
  298. // trajFilter->SetVertexCut(-2000., -2000., 4., 2000., 2000., 100.);
  299. trajFilter->SetMomentumCutP(.50); // p_lab > 500 MeV
  300. // trajFilter->SetEnergyCut(.2, 3.02); // 0 < Etot < 1.04 GeV
  301. //trajFilter->SetStorePrimaries(kTRUE);
  302. trajFilter->SetStorePrimaries(kFALSE);
  303. trajFilter->SetStoreSecondaries(kFALSE);
  304. // Fill the Parameter containers for this run
  305. //-------------------------------------------
  306. FairRuntimeDb *rtdb = fRun->GetRuntimeDb();
  307. Bool_t kParameterMerged = kTRUE;
  308. FairParRootFileIo* output = new FairParRootFileIo(kParameterMerged);
  309. //AZ output->open(parFile.Data());
  310. output->open(gFile);
  311. rtdb->setOutput(output);
  312. MpdMultiFieldPar* Par = (MpdMultiFieldPar*) rtdb->getContainer("MpdMultiFieldPar");
  313. if (fField)
  314. Par->SetParameters(fField);
  315. Par->setInputVersion(fRun->GetRunId(), 1);
  316. Par->setChanged();
  317. // Par->printParams();
  318. rtdb->saveOutput();
  319. rtdb->print();
  320. // Transport nEvents
  321. // -----------------
  322. fRun->Run(nEvents);
  323. #ifdef LAQGSM
  324. TString Pdg_table_name = TString::Format("%s%s%c%s", gSystem->BaseName(dataFile.Data()), ".g", (fRun->GetName())[6], ".pdg_table.dat");
  325. (TDatabasePDG::Instance())->WritePDGTable(Pdg_table_name.Data());
  326. #endif
  327. Bool_t file = fRun->GetWriteRunInfoFile();
  328. timer.Stop();
  329. Double_t rtime = timer.RealTime(), ctime = timer.CpuTime();
  330. printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime);
  331. cout << "Macro finished succesfully." << endl;
  332. gApplication->Terminate();
  333. }