Project
Loading...
Searching...
No Matches
FairMCApplication.cxx
Go to the documentation of this file.
1/********************************************************************************
2 * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
3 * *
4 * This software is distributed under the terms of the *
5 * GNU Lesser General Public Licence (LGPL) version 3, *
6 * copied verbatim in the file "LICENSE" *
7 ********************************************************************************/
8// Modified for ALICE O2 in 2026: parts not used by O2 were removed (see README.md in this directory).
9// -------------------------------------------------------------------------
10// ----- FairMCApplication source file -----
11// ----- Created 06/01/04 by M. Al-Turany -----
12// -------------------------------------------------------------------------
13#include "FairMCApplication.h"
14
15#include "FairDetector.h" // for FairDetector
16#include "FairField.h" // for FairField
17#include "FairGenericStack.h" // for FairGenericStack
18#include "FairGeoInterface.h" // for FairGeoInterface
19#include "FairGeoLoader.h" // for FairGeoLoader
20#include "FairGeoMedia.h" // for FairGeoMedia
21#include "FairGeoMedium.h" // for FairGeoMedium
22#include "FairIon.h" // for FairIon
23#include "FairLogger.h" // for FairLogger, MESSAGE_ORIGIN
24#include "FairMCEventHeader.h" // for FairMCEventHeader
25#include "FairMesh.h" // for FairMesh
26#include "FairModule.h" // for FairModule, etc
27#include "FairParticle.h" // for FairParticle
28#include "FairPrimaryGenerator.h" // for FairPrimaryGenerator
29#include "FairRadGridManager.h" // for FairRadGridManager
30#include "FairRadLenManager.h" // for FairRadLenManager
31#include "FairRadMapManager.h" // for FairRadMapManager
32#include "FairRootFileSink.h" // for CloneForWorker (in MT mode only)
33#include "FairRootManager.h" // for FairRootManager
34#include "FairRun.h" // for FairRun
35#include "FairRunInfo.h" // for FairRunInfo
36#include "FairRunSim.h" // for FairRunSim
37#include "FairTask.h" // for FairTask
38#include "FairTrajFilter.h" // for FairTrajFilter
39#include "FairVolume.h" // for FairVolume
40
41#include <TDatabasePDG.h> // for TDatabasePDG
42#include <TFile.h> // for TFile
43#include <TGeoManager.h> // for gGeoManager, TGeoManager
44#include <TGeoMedium.h> // for TGeoMedium
45#include <TGeoNode.h> // for TGeoNode
46#include <TGeoPhysicalNode.h> // for TGeoPhysicalNode
47#include <TGeoTrack.h> // for TGeoTrack
48#include <TGeoVolume.h> // for TGeoVolume
49#include <TH2.h> // for TH2D
50#include <THashList.h> // for THashList
51#include <TInterpreter.h> // for TInterpreter, gInterpreter
52#include <TIterator.h> // for TIterator
53#include <TList.h> // for TList, TListIter
54#include <TObjArray.h> // for TObjArray
55#include <TObject.h> // for TObject
56#include <TParticlePDG.h> // for TParticlePDG
57#include <TROOT.h> // for TROOT, gROOT
58#include <TRefArray.h> // for TRefArray
59#include <TSystem.h> // for TSystem, gSystem
60#include <TVirtualMC.h> // for TVirtualMC
61#include <TVirtualMCStack.h> // for TVirtualMCStack
62class TParticle;
63
64#include <float.h> // for DBL_MAX
65#include <mutex> // std::mutex
66#include <stdlib.h> // for getenv, exit
67#include <utility> // for pair
68std::mutex mtx; // mutex for critical section
69
70using std::pair;
71
72FairMCApplication* FairMCApplication::fgMasterInstance = 0;
73
74//_____________________________________________________________________________
75FairMCApplication::FairMCApplication(const char* name, const char* title, TObjArray* ModList, const char*)
77 , fActiveDetectors(nullptr)
78 , fFairTaskList(nullptr)
79 , fDetectors(nullptr)
80 , fDetMap(nullptr)
81 , fModIter(nullptr)
82 , fModules(nullptr)
83 , fNoSenVolumes(0)
84 , fPythiaDecayer(kFALSE)
85 , fPythiaDecayerConfig("")
86 , fStack(nullptr)
87 , fRootManager(nullptr)
88 , fSenVolumes(nullptr)
89 , fxField(nullptr)
90 , fEvGen(nullptr)
91 , fMcVersion(-1)
92 , fTrajFilter(nullptr)
93 , fTrajAccepted(kFALSE)
94 , fUserDecay(kFALSE)
95 , fUserDecayConfig("")
96 , fDebug(kFALSE)
97 , fDisVol(nullptr)
98 , fDisDet(nullptr)
99 , fVolMap()
100 , fVolIter()
101 , fModVolMap()
102 , fModVolIter()
103 , fTrkPos(TLorentzVector(0, 0, 0, 0))
104 , fRadLength(kFALSE)
105 , fRadLenMan(nullptr)
106 , fRadMap(kFALSE)
107 , fRadMapMan(nullptr)
108 , fRadGridMan(nullptr)
109 , fEventHeader(nullptr)
110 , fMCEventHeader(nullptr)
111 , listActiveDetectors()
112 , listDetectors()
113 , fMC(nullptr)
114 , fRun(nullptr)
115 , fSaveCurrentEvent(kTRUE)
117 , fRunInfo()
118 , fGeometryIsInitialized(kFALSE)
119{
120 // Standard Simulation constructor
121
122 // Create an ObjArray of Modules and its iterator
123
124 LOG(debug) << "FairMCApplication-ctor " << this;
125
127 fModules = ModList;
128 fModIter = fModules->MakeIterator();
129 // Create and fill a list of active detectors
130 fDetectors = new TRefArray;
131 fActiveDetectors = new TRefArray();
132 fModIter->Reset();
133 FairDetector* detector;
134 TObject* obj;
135
136 while ((obj = fModIter->Next())) {
137 detector = dynamic_cast<FairDetector*>(obj);
138 if (detector) {
139 fDetectors->Add(detector);
140 listDetectors.push_back(detector);
141 if (detector->IsActive()) {
142 fActiveDetectors->Add(detector);
143 listActiveDetectors.push_back(detector);
144 }
145 } else if (!dynamic_cast<FairModule*>(obj)) {
146 LOG(error) << "Dynamic cast fails. Object neither FairDetector nor FairModule in module list";
147 }
148 }
149
150 // Create a Task list
151 fFairTaskList = new FairTask("Task List", 1);
152 gROOT->GetListOfBrowsables()->Add(fFairTaskList);
153 fMcVersion = -1;
154 // Initialise fTrajFilter pointer
155 fTrajFilter = nullptr;
156 fDetMap = new TRefArray(1000);
157 fDisVol = 0;
158 fDisDet = 0;
159
160 // This ctor is used to construct the application on master
161 fgMasterInstance = this;
162}
163
164//_____________________________________________________________________________
166 : TVirtualMCApplication(rhs.GetName(), rhs.GetTitle())
167 , fActiveDetectors(nullptr)
168 , fFairTaskList(nullptr)
169 , fDetectors(nullptr)
170 , fDetMap(nullptr)
171 , fModIter(nullptr)
172 , fModules(nullptr)
173 , fNoSenVolumes(0)
174 , fPythiaDecayer(kFALSE)
175 , fPythiaDecayerConfig(rhs.fPythiaDecayerConfig)
176 , fStack(nullptr)
177 , fRootManager(nullptr)
178 , fSenVolumes(nullptr)
179 , fxField(rhs.fxField)
180 , fEvGen(nullptr)
181 , fMcVersion(rhs.fMcVersion)
182 , fTrajFilter(nullptr)
183 , fTrajAccepted(kFALSE)
184 , fUserDecay(kFALSE)
185 , fUserDecayConfig(rhs.fUserDecayConfig)
186 , fDebug(rhs.fDebug)
187 , fDisVol(nullptr)
188 , fDisDet(nullptr)
189 , fVolMap()
190 , fVolIter()
191 , fModVolMap()
192 , fModVolIter()
193 , fTrkPos(rhs.fTrkPos)
194 , fRadLength(kFALSE)
195 , fRadLenMan(nullptr)
196 , fRadMap(kFALSE)
197 , fRadMapMan(nullptr)
198 , fRadGridMan(nullptr)
199 , fEventHeader(nullptr)
200 , fMCEventHeader(nullptr)
201 , listActiveDetectors()
202 , listDetectors()
203 , fMC(nullptr)
204 , fRun(nullptr)
205 , fSaveCurrentEvent(kTRUE)
207 , fRunInfo()
208 , fGeometryIsInitialized(kFALSE)
209{
210 // Copy constructor
211 // Do not create Root manager
212
213 LOG(debug) << "FairMCApplication-copy-ctor " << this;
214
215 // Create an ObjArray of Modules and its iterator
216 fModules = new TObjArray();
217 fModIter = fModules->MakeIterator();
218 // Clone modules
219 TObject* obj;
220 rhs.fModIter->Reset();
221 while ((obj = rhs.fModIter->Next())) {
222 LOG(debug) << "cloning " << (static_cast<FairModule*>(obj))->GetName();
223 fModules->Add(static_cast<FairModule*>(obj)->CloneModule());
224 }
225
226 // Create and fill a list of active detectors
227 fDetectors = new TRefArray;
228 fActiveDetectors = new TRefArray();
229 fModIter->Reset();
230 FairDetector* detector;
231 while ((obj = fModIter->Next())) {
232 if (obj->InheritsFrom("FairDetector")) {
233 detector = dynamic_cast<FairDetector*>(obj);
234 if (detector) {
235 fDetectors->Add(detector);
236 listDetectors.push_back(detector);
237 if (detector->IsActive()) {
238 fActiveDetectors->Add(detector);
239 listActiveDetectors.push_back(detector);
240 }
241 } else {
242 LOG(error) << "Dynamic cast fails.";
243 }
244 }
245 }
246
247 // Clone stack
248 fStack = rhs.fStack->CloneStack();
249
250 // Create a Task list
251 // Let's try without it
252 // fFairTaskList= new FairTask("Task List", 1);
253 // gROOT->GetListOfBrowsables()->Add(fFairTaskList);
254
255 fDetMap = new TRefArray(1000);
256}
257//_____________________________________________________________________________
260 , fActiveDetectors(0)
261 , fFairTaskList(0)
262 , fDetectors(0)
263 , fDetMap(0)
264 , fModIter(0)
265 , fModules(0)
266 , fNoSenVolumes(0)
267 , fPythiaDecayer(kFALSE)
268 , fPythiaDecayerConfig("")
269 , fStack(0)
270 , fRootManager(0)
271 , fSenVolumes(0)
272 , fxField(0)
273 , fEvGen(0)
274 , fMcVersion(-1)
275 , fTrajFilter(nullptr)
276 , fTrajAccepted(kFALSE)
277 , fUserDecay(kFALSE)
278 , fUserDecayConfig("")
279 , fDebug(kFALSE)
280 , fDisVol(0)
281 , fDisDet(0)
282 , fVolMap()
283 , fVolIter()
284 , fModVolMap()
285 , fModVolIter()
286 , fTrkPos(TLorentzVector(0, 0, 0, 0))
287 , fRadLength(kFALSE)
288 , fRadLenMan(nullptr)
289 , fRadMap(kFALSE)
290 , fRadMapMan(nullptr)
291 , fRadGridMan(nullptr)
292 , fEventHeader(nullptr)
293 , fMCEventHeader(nullptr)
294 , listActiveDetectors()
295 , listDetectors()
296 , fMC(nullptr)
297 , fRun(nullptr)
298 , fSaveCurrentEvent(kTRUE)
300 , fRunInfo()
301 , fGeometryIsInitialized(kFALSE)
302{
303 // Default constructor
304}
305//_____________________________________________________________________________
307{
308 // Destructor
309 // LOG(debug3) << "Enter Destructor of FairMCApplication";
310 delete fStack;
311 delete fActiveDetectors; // don't do fActiveDetectors->Delete() here
312 // the modules are already deleted in FairRunSim
313 delete fDetectors;
314 delete fModIter;
315 // LOG(debug3) << "Leave Destructor of FairMCApplication";
316 delete fMC;
317}
318
319//_____________________________________________________________________________
320FairMCApplication& FairMCApplication::operator=(const FairMCApplication& rhs)
321{
322 // Assignment operator
323
324 // check assignment to self
325 if (this != &rhs) {
326
327 // base class assignment
328 TVirtualMCApplication::operator=(rhs);
329
330 fActiveDetectors = nullptr;
331 fFairTaskList = nullptr;
332 fDetectors = nullptr;
333 fDetMap = nullptr;
334 fModIter = nullptr;
335 fModules = nullptr;
336 fNoSenVolumes = 0;
337 fPythiaDecayer = kFALSE;
338 fPythiaDecayerConfig = rhs.fPythiaDecayerConfig;
339 fStack = nullptr;
340 fRootManager = nullptr;
341 fSenVolumes = nullptr;
342 fxField = rhs.fxField;
343 fEvGen = nullptr;
344 fMcVersion = rhs.fMcVersion;
345 fTrajFilter = nullptr;
346 fTrajAccepted = kFALSE;
347 fUserDecay = kFALSE;
348 fUserDecayConfig = rhs.fUserDecayConfig;
349 fDebug = rhs.fDebug;
350 fDisVol = nullptr;
351 fDisDet = nullptr;
352 fTrkPos = rhs.fTrkPos;
353 fRadLength = kFALSE;
354 fRadLenMan = nullptr;
355 fRadMap = kFALSE;
356 fRadMapMan = nullptr;
357 fRadGridMan = nullptr;
358 fEventHeader = nullptr;
359 fMCEventHeader = nullptr;
360 fGeometryIsInitialized = kFALSE;
361
362 // Do not create Root manager
363
364 // Create an ObjArray of Modules and its iterator
365 fModules = new TObjArray();
366 fModIter = fModules->MakeIterator();
367 // Clone modules
368 TObject* obj;
369 while ((obj = rhs.fModIter->Next())) {
370 fModules->Add(static_cast<FairModule*>(obj)->CloneModule());
371 }
372
373 // Create and fill a list of active detectors
374 fDetectors = new TRefArray;
375 fActiveDetectors = new TRefArray();
376 fModIter->Reset();
377 FairDetector* detector;
378 while ((obj = fModIter->Next())) {
379 if (obj->InheritsFrom("FairDetector")) {
380 detector = dynamic_cast<FairDetector*>(obj);
381 if (detector) {
382 fDetectors->Add(detector);
383 listDetectors.push_back(detector);
384 if (detector->IsActive()) {
385 fActiveDetectors->Add(detector);
386 listActiveDetectors.push_back(detector);
387 }
388 } else {
389 LOG(error) << "Dynamic cast fails.";
390 }
391 }
392 }
393
394 // Clone stack
395 fStack = rhs.fStack->CloneStack();
396
397 // Create a Task list
398 // Let's try without it
399 // fFairTaskList= new FairTask("Task List", 1);
400 // gROOT->GetListOfBrowsables()->Add(fFairTaskList);
401
402 fDetMap = new TRefArray(1000);
403
404 fState = rhs.fState;
405 }
406
407 return *this;
408}
409
410//_____________________________________________________________________________
411void FairMCApplication::InitMC(const char*, const char*)
412{
413 // Initialize MC.
414 // ---
415 // This methode is called from FairRunSim::SetMCConfig which excucute first the gconfig
416 // macro that creates the MC instance (G3 or G4)
417
418 fMC = TVirtualMC::GetMC();
419
420 if (fMC == 0) {
421 LOG(fatal) << "No MC engine defined";
422 }
423
424 fStack = dynamic_cast<FairGenericStack*>(fMC->GetStack());
425 if (fStack == nullptr) {
426 LOG(fatal) << "No Stack defined.";
427 }
428 fMC->SetMagField(fxField);
429
431 // fRootManager->SetDebug(true);
432
433 fMC->Init();
434 fMC->BuildPhysics();
435 TString MCName = fMC->GetName();
436 if (MCName == "TGeant3" || MCName == "TGeant3TGeo") {
437 fMcVersion = 0;
438 } else if (MCName == "TGeant4") {
439 fMcVersion = 1;
440 } else if (MCName == "TFluka") {
441 fMcVersion = 2;
442 } else {
443 fMcVersion = 3; // Geane
444 }
446
447 LOG(info) << "Monte Carlo Engine Initialisation with: " << MCName.Data();
448}
449
450//_____________________________________________________________________________
451void FairMCApplication::RunMC(Int_t nofEvents)
452{
453 // Reset the time for FairRunInfo. Otherwise the time of the
454 // first event will include the time needed for initilization.
455 fRunInfo.Reset();
456
459
460 // MC run.
461 fMC->ProcessRun(nofEvents);
462 // finish run
463 FinishRun();
464}
465
466//____________________________________________________________________________
468{
469 // Finish MC run.
470 // ---
471
472 LOG(debug) << "FairMCMCApplication::FinishRun() start";
473
474 for (auto detectorPtr : listActiveDetectors) {
475 detectorPtr->FinishRun();
476 }
477
478 // TO DO: clone this in MT mode ?
479 if (fFairTaskList) {
481 }
482 // fRootManager->Fill();
483
485 // FairMCEventHeader* header = gen->GetEvent();
486 Int_t nprimary = gen->GetTotPrimary();
487 TObjArray* meshlist = nullptr;
488
489 // Only in sequential mode
490 if (fRadGridMan) {
491
492 meshlist = fRadGridMan->GetMeshList();
493
494 TH2D* tid = nullptr;
495 TH2D* flu = nullptr;
496 TH2D* seu = nullptr;
497
498 LOG(info) << "=======================================================";
499 LOG(info) << " Dosimetry histos saving in \"" << fRadGridMan->GetOutputFileName() << "\"";
500 LOG(info) << "=======================================================";
501
502 TFile* radGridFile = TFile::Open(fRadGridMan->GetOutputFileName(), "recreate");
503 radGridFile->mkdir("Dosimetry");
504 radGridFile->cd("Dosimetry");
505
506 for (Int_t i = 0; i < meshlist->GetEntriesFast(); i++) {
507 FairMesh* aMesh = dynamic_cast<FairMesh*>(meshlist->At(i));
508 if (aMesh) {
509 aMesh->Scale(1. / nprimary);
510 tid = aMesh->GetMeshTid();
511 flu = aMesh->GetMeshFlu();
512 seu = aMesh->GetMeshSEU();
513 tid->Write();
514 flu->Write();
515 seu->Write();
516 }
517 }
518 radGridFile->Write();
519 radGridFile->Close();
520 delete radGridFile;
521 }
522
523 // Save histograms with memory and runtime information in the output file
525 fRunInfo.WriteInfo();
526 }
527
528 if (!fRadGridMan && fRootManager) {
531 }
532
533 if (!fMC->IsMT()) {
534 UndoGeometryModifications();
535 }
536
537 LOG(debug) << "Done FairMCMCApplication::FinishRun()";
538}
539
540//_____________________________________________________________________________
542{
543 // User actions at beginning of event
544 // ---
545
546 for (auto detectorPtr : listActiveDetectors) {
547 detectorPtr->BeginEvent();
548 }
549}
550
551//_____________________________________________________________________________
553{
554 // User actions at beginning of a primary track
555 // ---
556 for (auto detectorPtr : listActiveDetectors) {
557 detectorPtr->BeginPrimary();
558 }
559}
560
561//_____________________________________________________________________________
563{
564 // User actions at beginning of each track
565 // ---
566
567 for (auto detectorPtr : listActiveDetectors) {
568 detectorPtr->PreTrack();
569 }
570
571 fTrajAccepted = kFALSE;
572 if (nullptr != fTrajFilter) {
573 // Get the pointer to current track
574 TParticle* particle = fStack->GetCurrentTrack();
575 // LOG(debug) << " FairMCApplication::PreTrack(): " << particle;
576 // Apply cuts
578 if (fTrajAccepted) {
579 // Add trajectory to geo manager
580 // Int_t trackId = fStack->GetCurrentTrackNumber();
581 TGeoTrack* fTrack = fTrajFilter->CheckAddTrack(fMC->GetStack()->GetCurrentTrackNumber(), particle);
582 // TLorentzVector pos;
583 fMC->TrackPosition(fTrkPos);
584 fTrack->AddPoint(fTrkPos.X(), fTrkPos.Y(), fTrkPos.Z(), fTrkPos.T());
585 }
586 }
587}
588
589//_____________________________________________________________________________
591{
592 mtx.lock();
593 LOG(info) << "FairMCApplication::CloneForWorker ";
594
595 // Create new FairRunSim object on worker
596 // and pass some data from master FairRunSim object
597 FairRunSim* workerRun = new FairRunSim(kFALSE);
598 workerRun->SetName(fRun->GetName()); // Transport engine
599 workerRun->SetSink(fRun->GetSink()->CloneSink());
600
601 // Trajectories filter is created explicitly as we do not call
602 // FairRunSim::Init on workers
603 if (fRun->GetStoreTraj()) {
604 new FairTrajFilter();
605 }
606
607 // Create new FairMCApplication object on worker
608 FairMCApplication* workerApplication = new FairMCApplication(*this);
609 workerApplication->SetGenerator(fEvGen->ClonePrimaryGenerator());
610
611 mtx.unlock();
612
613 return workerApplication;
614}
615
616//_____________________________________________________________________________
618{
619 // Create Root manager
621
622 LOG(info) << "FairMCApplication::InitForWorker " << fRootManager->GetInstanceId() << " " << this;
623
624 // Set FairRunSim worker(just for consistency, not needed on worker)
626
627 // Generate per-thread file name
628 // and create a new sink on worker
629 // moved to CloneForWorker and specific sink->CloneSink();
630
632
633 // Cache thread-local gMC
634 fMC = gMC;
635
636 // Set data to MC
637 fMC->SetStack(fStack);
638 fMC->SetMagField(fxField);
639
640 LOG(info) << "Monte Carlo Engine Worker Initialisation with: " << fMC->GetName();
641}
642
643//_____________________________________________________________________________
645{
646 LOG(debug) << "FairMCApplication::FinishRunOnWorker: ";
647
648 FinishRun();
649}
650
651//_____________________________________________________________________________
653{
654 // User actions at each step
655 // ---
656
657 // Work around for Fluka VMC, which does not call
658 // MCApplication::PreTrack()
659 static Int_t TrackId = 0;
660 if (fMcVersion == 2 && fMC->GetStack()->GetCurrentTrackNumber() != TrackId) {
661 PreTrack();
662 TrackId = fMC->GetStack()->GetCurrentTrackNumber();
663 }
664
665 // Check if the volume with id is in the volume multimap.
666 // If it is not in the map the volume is not a sensitive volume
667 // and we do not call nay of our ProcessHits functions.
668
669 // If the volume is in the multimap, check in second step if the current
670 // copy is alredy inside the multimap.
671 // If the volume is not in the multimap add the copy of the volume to the
672 // multimap.
673 // In any case call the ProcessHits function for this specific detector.
674 Int_t copyNo;
675 Int_t id = fMC->CurrentVolID(copyNo);
676 Bool_t InMap = kFALSE;
677 fDisVol = 0;
678 fDisDet = 0;
679 Int_t fCopyNo = 0;
680 fVolIter = fVolMap.find(id);
681
682 if (fVolIter != fVolMap.end()) {
683
684 // Call Process hits for FairVolume with this id, copyNo
685 do {
686 fDisVol = fVolIter->second;
687 fCopyNo = fDisVol->getCopyNo();
688 if (copyNo == fCopyNo) {
690 if (fDisDet) {
692 }
693 InMap = kTRUE;
694 break;
695 }
696 ++fVolIter;
697 } while (fVolIter != fVolMap.upper_bound(id));
698
699 // if (fDisVol && !InMap) { // fDisVolume is set previously, no check needed
700
701 // Create new FairVolume with this id, copyNo.
702 // Use the FairVolume with the same id found in the map to get
703 // the link to the detector.
704 // Seems that this never happens (?)
705 if (!InMap) {
706 // cout << "Volume not in map; fDisVol ? " << fDisVol << endl
707 FairVolume* fNewV = new FairVolume(fMC->CurrentVolName(), id);
708 fNewV->setMCid(id);
709 fNewV->setModId(fDisVol->getModId());
710 fNewV->SetModule(fDisVol->GetModule());
711 fNewV->setCopyNo(copyNo);
712 fVolMap.insert(pair<Int_t, FairVolume*>(id, fNewV));
714
715 // LOG(info) << "FairMCApplication::Stepping: new fair volume"
716 // << id << " " << copyNo << " " << fDisDet;
717 if (fDisDet) {
718 fDisDet->ProcessHits(fNewV);
719 }
720 }
721 }
722
723 // If information about the tracks should be stored the information as to be
724 // stored for any step.
725 // Information about each single step has also to be stored for the other
726 // special run modes of the simulation which are used to store information
727 // about
728 // 1.) Radiation length in each volume
729 // 2.) Energy deposition in each volume
730 // 3.) Fluence of particles through a defined plane which can be anywhere
731 // in the geometry. This plane has not to be correlated with any real
732 // volume
733 if (fTrajAccepted) {
734 if (fMC->TrackStep() > fTrajFilter->GetStepSizeCut()) {
735 fMC->TrackPosition(fTrkPos);
736 fTrajFilter->GetCurrentTrk()->AddPoint(fTrkPos.X(), fTrkPos.Y(), fTrkPos.Z(), fTrkPos.T());
737 }
738 }
739 if (fRadLenMan) {
740 id = fMC->CurrentVolID(copyNo);
741 fModVolIter = fgMasterInstance->fModVolMap.find(id);
743 }
744 if (fRadMapMan) {
745 id = fMC->CurrentVolID(copyNo);
746 fModVolIter = fgMasterInstance->fModVolMap.find(id);
748 }
749 if (fRadGridMan) {
751 }
752}
753
754//_____________________________________________________________________________
756{
757 // User actions after finishing of each track
758 // ---
759 for (auto detectorPtr : listActiveDetectors) {
760 detectorPtr->PostTrack();
761 }
762}
763
764//_____________________________________________________________________________
766{
767 // User actions after finishing of a primary track
768 // ---
769 for (auto detectorPtr : listActiveDetectors) {
770 detectorPtr->FinishPrimary();
771 }
772
774}
775
776//_____________________________________________________________________________
778{
779 FinishEvent();
780 FinishRun();
781 if (fRootManager) {
784 }
785 LOG(warn) << "StopRun() exiting not safetly oopps !!!@@@!!!";
786 exit(0);
787}
788
789//_____________________________________________________________________________
791{
792 if (fMC)
793 fMC->StopRun();
794}
795
796//_____________________________________________________________________________
798{
799 // User actions after finishing of an event
800 // ---
801 LOG(debug) << "[" << fRootManager->GetInstanceId()
802 << " FairMCMCApplication::FinishEvent: " << fMCEventHeader->GetEventID() << " (MC "
803 << gMC->CurrentEvent() << ")";
804 if (gMC->IsMT()
805 && fRun->GetSink()->GetSinkType() == kONLINESINK) { // fix the rare case when running G4 multithreaded on MQ
806 fMCEventHeader->SetEventID(gMC->CurrentEvent() + 1);
807 }
808
809 // --> Fill the stack output array
811 // --> Update track indizes in MCTracks and MCPoints
813 // --> Screen output of stack
814 // fStack->Print();
815
816 if (fFairTaskList) {
819 }
820
821 for (auto detectorPtr : listActiveDetectors) {
822 detectorPtr->FinishEvent();
823 }
824
827 } else {
828 fSaveCurrentEvent = kTRUE;
829 }
830
831 for (auto detectorPtr : listActiveDetectors) {
832 detectorPtr->EndOfEvent();
833 }
834
835 fStack->Reset();
836 if (nullptr != fTrajFilter) {
838 // TObjArray* fListOfTracks=gGeoManager->GetListOfTracks();
839 // fListOfTracks->Delete();
840 gGeoManager->GetListOfTracks()->Delete();
841 }
842 if (nullptr != fRadLenMan) {
843 fRadLenMan->Reset();
844 }
845 if (nullptr != fRadMapMan) {
846 fRadMapMan->Reset();
847 }
848
849 // Store information about runtime for one event and memory consuption
850 // for later usage.
851 if ((FairRunSim::Instance()->IsRunInfoGenerated()) && !gMC->IsMT()) {
852 fRunInfo.StoreInfo();
853 }
854}
855//_____________________________________________________________________________
857{
858 // No limit
859 // ---
860 return DBL_MAX;
861}
862//_____________________________________________________________________________
864{
865 // No limit
866 // ---
867 return DBL_MAX;
868}
869//_____________________________________________________________________________
871//_____________________________________________________________________________
873{
874 // The optical properties of ASCII-defined media used to be pushed into the
875 // MC here (TVirtualMC::SetCerenkov) by walking FairGeoLoader's media list.
876 // ALICE never loads an ASCII media file, so that list was always empty and
877 // the loop was a no-op - but it dereferenced FairGeoLoader::Instance()
878 // unconditionally, which meant the singleton had to be constructed even
879 // though it did nothing. Detectors that need optical media (HMPID) define
880 // them in their own ConstructOpGeometry() override, dispatched below.
881 fModIter->Reset();
882 FairModule* Mod = nullptr;
883 while ((Mod = dynamic_cast<FairModule*>(fModIter->Next()))) {
884 Mod->ConstructOpGeometry();
885 }
886}
887
888//_____________________________________________________________________________
890{
891 // Construct geometry and also fill following member data:
892 // - fModVolMap: (volId,moduleId)
893 // - fSenVolumes: list of sensitive volumes
894 if (!gGeoManager) {
895 LOG(fatal) << "gGeoManager not initialized at FairMCApplication::ConstructGeometry\n";
896 }
897
899
900 fModIter->Reset();
901 FairModule* Mod = nullptr;
902 Int_t NoOfVolumes = 0;
903 Int_t NoOfVolumesBefore = 0;
904 Int_t ModId = 0;
905
906 TObjArray* tgeovolumelist = gGeoManager->GetListOfVolumes();
907
908 while ((Mod = dynamic_cast<FairModule*>(fModIter->Next()))) {
909 NoOfVolumesBefore = tgeovolumelist->GetEntriesFast();
910 Mod->ConstructGeometry();
911 ModId = Mod->GetModId();
912 NoOfVolumes = tgeovolumelist->GetEntriesFast();
913 for (Int_t n = NoOfVolumesBefore; n < NoOfVolumes; n++) {
914 TGeoVolume* v = (TGeoVolume*)tgeovolumelist->At(n);
915 fModVolMap.insert(pair<Int_t, Int_t>(v->GetNumber(), ModId));
916 }
917 }
918
919 // LOG(debug) << "FairMCApplication::ConstructGeometry() : Now closing the geometry";
920 int NoOfVolumesBeforeClose = tgeovolumelist->GetEntries();
921 gGeoManager->CloseGeometry(); // close geometry
922 int NoOfVolumesAfterClose = tgeovolumelist->GetEntries();
923
924 // Check if CloseGeometry has modified the volume list which might happen for
925 // runtime shapes (parametrizations,etc). If this is the case, our lookup structures
926 // built above are likely out of date. Issue at least a warning here.
927 if (NoOfVolumesBeforeClose != NoOfVolumesAfterClose) {
928 LOG(error) << "TGeoManager::CloseGeometry() modified the volume list from " << NoOfVolumesBeforeClose << " to "
929 << NoOfVolumesAfterClose << "\n"
930 << "This almost certainly means inconsistent lookup structures used in simulation/stepping.\n";
931 }
932
933 if (fRun->IsImportTGeoToVMC()) {
934 TVirtualMC::GetMC()->SetRootGeometry(); // notify VMC about Root geometry
935 LOG(info) << "TGeometry will be imported to VMC"
936 << "\n";
937 } else {
938 LOG(info) << "TGeometry will not be imported to VMC"
939 << "\n";
940 }
941 Int_t Counter = 0;
942 TDatabasePDG* pdgDatabase = TDatabasePDG::Instance();
943 const THashList* list = pdgDatabase->ParticleList();
944 if (list == 0)
945 pdgDatabase->ReadPDGTable();
946 list = pdgDatabase->ParticleList();
947 if (list != 0) {
948 TIterator* particleIter = list->MakeIterator();
949 TParticlePDG* Particle = 0;
950 while ((Particle = dynamic_cast<TParticlePDG*>(particleIter->Next())) && (Counter <= 256)) {
951 TString Name = gGeoManager->GetPdgName(Particle->PdgCode());
952 // LOG(info) << Counter <<" : Particle name: "<< Name.Data() << " PDG " << Particle->PdgCode();
953 if (Name == "XXX")
954 gGeoManager->SetPdgName(Particle->PdgCode(), Particle->GetName());
955 Counter++;
956 }
957 delete particleIter;
958 }
959 fModIter->Reset();
960 while ((Mod = dynamic_cast<FairModule*>(fModIter->Next()))) {
962 }
963
964 // dont use this here anymore, use FairMCApplication::MisalignGeometry
965 // fRun->AlignGeometry()
966
967 gGeoManager->RefreshPhysicalNodes(kFALSE);
968
970}
971
972// ____________________________________________________________________________
974{
975 // call this only here
977 return true;
978}
979
980//_____________________________________________________________________________
982{
984
985 LOG(info) << "FairMCApplication::InitGeometry: " << fRootManager->GetInstanceId();
986
987 // ToBeDone
988 // Recently the InitGeometry is called twice from the G4VMC, This is a work around tell the problem get fixed in
989 // G4VMC
990 if (fGeometryIsInitialized)
991 return;
992
994
996 FairVolume* fv = 0;
997 Int_t id = 0;
998 fModIter->Reset();
999
1000 // Register stack
1001 if (fEvGen && fStack && fRootManager) {
1002 fStack->Register();
1003 } else {
1004 LOG(warn) << "Stack is not registered ";
1005 }
1006
1008 // initialize and register FairDetector objects in addition
1009 // Note: listActiveDetectors or fActiveDetectors not used to include passive modules in the same loop.
1010 FairModule* module;
1011 FairDetector* detector;
1012 TObject* obj;
1013 fModIter->Reset();
1014 while ((obj = fModIter->Next())) {
1015 detector = dynamic_cast<FairDetector*>(obj);
1016 module = dynamic_cast<FairModule*>(obj);
1017 if (module) {
1018 module->SetSpecialPhysicsCuts();
1019 }
1020 if (detector) {
1021 // check whether detector is active
1022 if (detector->IsActive()) {
1023 detector->Initialize();
1024 detector->Register();
1025 }
1026 }
1027 }
1028 fModIter->Reset();
1029
1034 if (fFairTaskList) {
1035 InitTasks();
1036 }
1037
1038 // store the EventHeader Info
1039 // Get and register EventHeader
1040 UInt_t runId = FairRunSim::Instance()->GetRunId();
1041
1042 LOG(info) << "Simulation RunID: " << runId;
1043
1044 // Get and register the MCEventHeader
1046 fMCEventHeader->SetRunID(runId);
1047 if (fRootManager) {
1049 }
1050
1051 if (fEvGen) {
1053 }
1055 if (nullptr != fTrajFilter) {
1056 fTrajFilter->Init();
1057 }
1058 if (nullptr != fRadLenMan) {
1059 fRadLenMan->Init();
1060 }
1061 if (nullptr != fRadMapMan) {
1062 fRadMapMan->Init();
1063 }
1064 if (nullptr != fRadGridMan) {
1065 fRadGridMan->Init();
1066 }
1067
1069 if (fRootManager) {
1071 }
1072
1073 // Get static thread local svList
1075 if (fSenVolumes) {
1076 fNoSenVolumes = fSenVolumes->GetEntries();
1077 }
1078
1079 // Fill sensitive volumes in fVolMap
1080 for (Int_t i = 0; i < fNoSenVolumes; i++) {
1081
1082 fv = dynamic_cast<FairVolume*>(fSenVolumes->At(i));
1083 if (!fv) {
1084 LOG(error) << "No FairVolume in fSenVolumes at position " << i;
1085 continue;
1086 }
1087 id = fv->getMCid();
1088 if (fv->getGeoNode() == 0) {
1089 TGeoNode* fN = 0;
1090 TGeoVolume* v = gGeoManager->GetVolume(fv->GetName());
1091 TObjArray* fNs = 0;
1092 if (v) {
1093 fNs = v->GetNodes();
1094 }
1095 if (fNs) {
1096 for (Int_t k = 0; k < fNs->GetEntriesFast(); k++) {
1097 fN = dynamic_cast<TGeoNode*>(fNs->At(k));
1098 if (!fN) {
1099 LOG(error) << "No TGeoNode in fNs at position " << k;
1100 continue;
1101 }
1102 FairVolume* fNewV = new FairVolume(fv->GetName(), id);
1103 fNewV->setModId(fv->getModId());
1104 fNewV->SetModule(fv->GetModule());
1105 fNewV->setCopyNo(fN->GetNumber());
1106 fNewV->setMCid(id);
1107 fVolMap.insert(pair<Int_t, FairVolume*>(id, fNewV));
1108 }
1109 } else {
1110 FairVolume* fNewV = new FairVolume(fv->GetName(), id);
1111 fNewV->setModId(fv->getModId());
1112 fNewV->SetModule(fv->GetModule());
1113 fNewV->setCopyNo(1);
1114 fNewV->setMCid(id);
1115 fVolMap.insert(pair<Int_t, FairVolume*>(id, fNewV));
1116 }
1117 } else {
1118 fVolMap.insert(pair<Int_t, FairVolume*>(id, fv));
1119 }
1120 } // end off loop Fill sensitive volumes
1121
1122 fGeometryIsInitialized = kTRUE;
1123
1125}
1126
1127//_____________________________________________________________________________
1129{
1130 // Fill the user stack (derived from TVirtualMCStack) with primary particles.
1131 // ---
1132 LOG(debug) << "FairMCApplication::GeneratePrimaries: " << fEvGen;
1133
1134 if (fEvGen) {
1135 // LOG(debug) << "FairMCApplication::GeneratePrimaries()";
1136 if (!fEvGen->GenerateEvent(fStack)) {
1137 StopRun();
1138 }
1139 }
1140}
1141//_____________________________________________________________________________
1143{
1144 return dynamic_cast<FairDetector*>(fModules->FindObject(DetName));
1145}
1146//_____________________________________________________________________________
1148{
1149 TDatabasePDG* pdgDatabase = TDatabasePDG::Instance();
1150 TObjArray* NewIons = fRun->GetUserDefIons();
1151 TIterator* Iter = NewIons->MakeIterator();
1152 Iter->Reset();
1153 TObject* obj = 0;
1154 FairIon* ion = 0;
1155 while ((obj = Iter->Next())) {
1156 ion = dynamic_cast<FairIon*>(obj);
1157 if (ion) {
1158 // Check if an ion with the calculated pdg code already exists in the
1159 // TDatabasePDG.
1160 // If the ion already exist don't create a new one because this fails for
1161 // Geant4. Instead modify the FairIon to use the already existing ion
1162 // from the TDatabasePDG.
1163 // The problem occured for example for Alphas which exist already.
1164 Int_t ionPdg = GetIonPdg(ion->GetZ(), ion->GetA());
1165 if (!pdgDatabase->GetParticle(ionPdg)) {
1166 fMC->DefineIon(
1167 ion->GetName(), ion->GetZ(), ion->GetA(), ion->GetQ(), ion->GetExcEnergy(), ion->GetMass());
1168
1169 } else {
1170 ion->SetName(pdgDatabase->GetParticle(ionPdg)->GetName());
1171 }
1172 // Add Ion to gGeoManager visualization
1173 if (gGeoManager) {
1174 gGeoManager->SetPdgName(pdgDatabase->GetParticle(ion->GetName())->PdgCode(), ion->GetName());
1175 }
1176 LOG(info) << "Add Ion: " << ion->GetName() << " with PDG "
1177 << pdgDatabase->GetParticle(ion->GetName())->PdgCode();
1178 }
1179 }
1180 delete Iter;
1182 if (fEvGen) {
1183 fEvGen->Init();
1184 }
1185}
1186//_____________________________________________________________________________
1188{
1189 TObjArray* NewPart = fRun->GetUserDefParticles();
1190 TIterator* parIter = NewPart->MakeIterator();
1191 parIter->Reset();
1192
1193 // check MC engine is not null (fMC is 0x00 at this line in case of Geant4)
1194 TVirtualMC* curMC = TVirtualMC::GetMC();
1195 if (!curMC)
1196 LOG(fatal) << "No MC engine was defined before AddParticles()";
1197
1198 TObject* obj = 0;
1199 FairParticle* particle = 0;
1200 while ((obj = parIter->Next())) {
1201 particle = dynamic_cast<FairParticle*>(obj);
1202 if (particle) { // (Int_t pdg, const char* name, TMCParticleType type, Double_t mass, Double_t charge,
1203 // Double_t lifetime);
1204 LOG(info) << "Add Particle: " << particle->GetName() << " with PDG " << particle->GetPDG() << "\n"
1205 << particle->GetName() << " // const TString& name \n"
1206 << particle->GetMCType() << " // TMCParticleType mcType \n"
1207 << particle->GetMass() << " // Double_t mass \n"
1208 << particle->GetCharge() << " // Double_t charge \n"
1209 << particle->GetDecayTime() << " // Double_t lifetime \n"
1210 << particle->GetPType() << " // const TString& pType, \n"
1211 << particle->GetWidth() << " // Double_t width \n"
1212 << particle->GetSpin() << " // Int_t iSpin \n"
1213 << particle->GetiParity() << " // Int_t iParity \n"
1214 << particle->GetConjugation() << " // Int_t iConjugation \n"
1215 << particle->GetIsospin() << " // Int_t iIsospin \n"
1216 << particle->GetIsospinZ() << " // Int_t iIsospinZ \n"
1217 << particle->GetgParity() << " // Int_t gParity \n"
1218 << particle->GetLepton() << " // Int_t lepton \n"
1219 << particle->GetBaryon() << " // Int_t baryon \n"
1220 << particle->IsStable() << " // Bool_t stable \n";
1221
1222 curMC->DefineParticle(particle->GetPDG(), // Int_t pdg
1223 particle->GetName(), // const TString& name
1224 particle->GetMCType(), // TMCParticleType mcType
1225 particle->GetMass(), // Double_t mass
1226 particle->GetCharge(), // Double_t charge
1227 particle->GetDecayTime(), // Double_t lifetime
1228 particle->GetPType(), // const TString& pType,
1229 particle->GetWidth(), // Double_t width
1230 particle->GetSpin(), // Int_t iSpin
1231 particle->GetiParity(), // Int_t iParity
1232 particle->GetConjugation(), // Int_t iConjugation
1233 particle->GetIsospin(), // Int_t iIsospin
1234 particle->GetIsospinZ(), // Int_t iIsospinZ
1235 particle->GetgParity(), // Int_t gParity
1236 particle->GetLepton(), // Int_t lepton
1237 particle->GetBaryon(), // Int_t baryon
1238 particle->IsStable() // Bool_t stable
1239 );
1240
1241 // Add Particle to gGeoManager visualization
1242 if (gGeoManager)
1243 gGeoManager->SetPdgName(particle->GetPDG(), particle->GetName());
1244 }
1245 }
1246
1247 delete parIter;
1248 AddDecayModes();
1249}
1250
1251//_____________________________________________________________________________
1253{
1254 TString work = getenv("VMCWORKDIR");
1255 TString work_config = work + "/gconfig/";
1256 work_config.ReplaceAll("//", "/");
1257
1258 TString config_dir = getenv("CONFIG_DIR");
1259 config_dir.ReplaceAll("//", "/");
1260
1261 Bool_t AbsPath = kFALSE;
1262
1263 if (!config_dir.EndsWith("/")) {
1264 config_dir += "/";
1265 }
1266 // set Pythia as external decayer
1267
1268 if (fPythiaDecayer) {
1269 TString decayConfig;
1270 if (fPythiaDecayerConfig.IsNull()) {
1271 decayConfig = "DecayConfig.C";
1272 fPythiaDecayerConfig = decayConfig;
1273 } else {
1274 if (fPythiaDecayerConfig.Contains("/")) {
1275 AbsPath = kTRUE;
1276 }
1277 decayConfig = fPythiaDecayerConfig;
1278 }
1279
1280 if (!AbsPath && TString(gSystem->FindFile(config_dir.Data(), decayConfig)) != TString("")) {
1281 LOG(info) << "---User path for Configuration (DecayConfig.C) is used : " << config_dir.Data();
1282 } else {
1283 if (AbsPath) {
1284 decayConfig = fPythiaDecayerConfig;
1285 } else {
1286 decayConfig = work_config + fPythiaDecayerConfig;
1287 }
1288 }
1289 // Add decay modes using an external configuration script
1290 LOG(info) << "External Decay Modes with script \n " << decayConfig.Data();
1291 // Load configuration script and execute it
1292 Int_t pyt = gROOT->LoadMacro(decayConfig.Data());
1293 if (pyt == 0) {
1294 gInterpreter->ProcessLine("DecayConfig()");
1295 }
1296 }
1297 // set user defined phase space decay for particles (ions)
1298 AbsPath = kFALSE;
1299 if (fUserDecay) {
1300 TString Userdecay;
1301 if (fUserDecayConfig.IsNull()) {
1302 Userdecay = "UserDecay.C";
1303 fUserDecayConfig = Userdecay;
1304 } else {
1305 if (fUserDecayConfig.Contains("/")) {
1306 AbsPath = kTRUE;
1307 }
1308 Userdecay = fUserDecayConfig;
1309 }
1310
1311 if (!AbsPath && TString(gSystem->FindFile(config_dir.Data(), Userdecay)) != TString("")) {
1312 LOG(info) << "---User path for Configuration (UserDecay.C) is used : " << config_dir.Data();
1313 } else {
1314 if (AbsPath) {
1315 Userdecay = fUserDecayConfig;
1316 } else {
1317 Userdecay = work_config + fUserDecayConfig;
1318 }
1319 }
1320 LOG(info) << "User Decay Modes with script \n " << Userdecay.Data();
1321 Int_t dec = gROOT->LoadMacro(Userdecay.Data());
1322 if (dec == 0) {
1323 gInterpreter->ProcessLine("UserDecayConfig()");
1324 }
1325 }
1326}
1327
1328//_____________________________________________________________________________
1330
1331//_____________________________________________________________________________
1333
1334//_____________________________________________________________________________
1336{
1337 if (!fFairTaskList) {
1338 fFairTaskList = new FairTask("Task List", 1);
1339 gROOT->GetListOfBrowsables()->Add(fFairTaskList);
1340 }
1341 fFairTaskList->Add(fTask);
1342 SetParTask();
1343}
1344
1345//_____________________________________________________________________________
1347
1348//_____________________________________________________________________________
1350
1351//_____________________________________________________________________________
1353{
1354 // Only RTDB init when more than Main Task list
1355 if (FairRun::Instance()->GetNTasks() >= 1) {
1357 }
1358 // The FairRuntimeDb parameter database has been removed: every module's
1359 // SetParContainers() was empty and no container was ever requested.
1360}
1361//_____________________________________________________________________________
1363{
1364
1365 // Only RTDB init when more than Main Task list
1366 if (FairRun::Instance()->GetNTasks() >= 1) {
1367 LOG(info) << "Initialize Tasks--------------------------";
1369 }
1370}
1371
1372//_____________________________________________________________________________
1374{
1375 if (fRootManager) {
1376 return fRootManager->GetInChain();
1377 } else {
1378 LOG(warn) << "The function is not available in MT mode";
1379 return 0;
1380 }
1381}
1382
1383//_____________________________________________________________________________
1385{
1386 fRadLength = RadLen;
1387 if (fRadLength) {
1389 }
1390}
1391
1392//_____________________________________________________________________________
1394{
1395 fRadMap = RadMap;
1396 if (fRadMap) {
1398 }
1399}
1400
1401//_____________________________________________________________________________
1402void FairMCApplication::AddMeshList(TObjArray* meshList)
1403{
1404 if (!fRadGridMan) {
1406 }
1407 fRadGridMan->AddMeshList(meshList);
1408}
1409
1410//_____________________________________________________________________________
1411Int_t FairMCApplication::GetIonPdg(Int_t z, Int_t a) const
1412{
1413 // Acording to
1414 // http://pdg.lbl.gov/2012/reviews/rpp2012-rev-monte-carlo-numbering.pdf
1415
1416 return 1000000000 + 10 * 1000 * z + 10 * a;
1417}
1418
1419//_____________________________________________________________________________
1420void FairMCApplication::UndoGeometryModifications()
1421{
1422 // Undo all misalignment done in the MisalignGeometry methods of the
1423 // several FairModuls.
1424 // In the output (parameter container and separate geometry file)
1425 // only the ideal geometry is stored.
1426 // I don't know any better way than to loop over all physical nodes
1427 // and to set the matrix back to the original one.
1428 // TODO: Check if it is more easy to write the ideal geometry before
1429 // the geometry is misaligned. In this case one does not have
1430 // to revert the misalignment.
1431
1432 TObjArray* physNodes = gGeoManager->GetListOfPhysicalNodes();
1433 Int_t numPhysNodes = physNodes->GetEntriesFast();
1434
1435 if (0 == numPhysNodes)
1436 return;
1437
1438 // fRootManager->CreateGeometryFile("misaligned_geometry.root");
1439 LOG(info) << "Undo all misalignment";
1440
1441 TGeoPhysicalNode* node = nullptr;
1442 TGeoHMatrix* ng3 = nullptr;
1443 for (Int_t k = 0; k < numPhysNodes; k++) {
1444 node = static_cast<TGeoPhysicalNode*>(physNodes->At(k));
1445 ng3 = node->GetOriginalMatrix(); //"real" global matrix, what survey sees
1446 node->Align(ng3);
1447 }
1448
1449 gGeoManager->ClearPhysicalNodes(kFALSE);
1450}
1451
default_random_engine gen(dev())
std::ostringstream debug
std::unique_ptr< expressions::Node > node
ClassImp(FairMCApplication)
std::mutex mtx
FairMCApplicationState
@ kONLINESINK
Definition FairSink.h:34
int32_t i
char error[CURL_ERROR_SIZE]
virtual Bool_t ProcessHits(FairVolume *v=0)=0
virtual void Initialize()
virtual void Register()
virtual void FinishPrimary()
virtual void UpdateTrackIndex(TRefArray *)
virtual void FillTrackArray()
virtual void Reset()
void SetDetArrayList(TRefArray *detArray)
Int_t GetZ() const
Definition FairIon.h:62
Int_t GetA() const
Definition FairIon.h:66
Int_t GetQ() const
Definition FairIon.h:70
Double_t GetMass() const
Definition FairIon.h:78
Double_t GetExcEnergy() const
Definition FairIon.h:74
void InitMC(const char *setup, const char *cuts)
virtual void AddParticles()
void SetRadiationMapReg(Bool_t RadMap)
void AddMeshList(TObjArray *meshList)
std::list< FairDetector * > listActiveDetectors
virtual void BeginPrimary()
virtual void FinishPrimary()
void AddTask(TTask *fTask)
virtual void FinishEvent()
FairMCEventHeader * fMCEventHeader
FairRadLenManager * fRadLenMan
TLorentzVector fTrkPos
FairRadGridManager * fRadGridMan
FairPrimaryGenerator * fEvGen
virtual void FinishRunOnWorker()
void SetField(FairField *field)
FairRadMapManager * fRadMapMan
FairGenericStack * fStack
std::map< Int_t, Int_t >::iterator fModVolIter
std::multimap< Int_t, FairVolume * >::iterator fVolIter
void SetGenerator(FairPrimaryGenerator *fxGenerator)
virtual void ConstructOpGeometry()
virtual void BeginEvent()
std::map< Int_t, Int_t > fModVolMap
FairRootManager * fRootManager
void RunMC(Int_t nofEvents)
virtual TVirtualMCApplication * CloneForWorker() const
std::list< FairDetector * > listDetectors
FairPrimaryGenerator * GetGenerator()
virtual void InitOnWorker()
FairEventHeader * fEventHeader
FairGenericStack * GetStack()
FairDetector * fDisDet
void SetRadiationLengthReg(Bool_t RadLen)
virtual void ConstructGeometry()
virtual void GeneratePrimaries()
FairTrajFilter * fTrajFilter
std::multimap< Int_t, FairVolume * > fVolMap
TRefArray * fActiveDetectors
FairMCApplicationState fState
virtual Double_t TrackingRmax() const
virtual void InitGeometry()
virtual Double_t TrackingZmax() const
FairDetector * GetDetector(const char *DetName)
virtual void AddDecayModes()
virtual Bool_t MisalignGeometry()
void SetRunID(UInt_t runId)
UInt_t GetEventID() const
run identifier
void SetEventID(UInt_t eventId)
virtual void Register()
TH2D * GetMeshFlu()
Definition FairMesh.h:66
void Scale(Double_t fac)
Definition FairMesh.h:77
TH2D * GetMeshSEU()
Definition FairMesh.h:67
TH2D * GetMeshTid()
Definition FairMesh.h:65
Int_t GetModId()
Definition FairModule.h:108
virtual void ConstructOpGeometry()
Bool_t IsActive()
Definition FairModule.h:112
virtual FairModule * CloneModule() const
virtual void RegisterAlignmentMatrices()
Definition FairModule.h:77
virtual void ConstructGeometry()
static thread_local TRefArray * svList
Definition FairModule.h:133
Int_t GetIsospin()
Double_t GetWidth()
virtual const char * GetName() const
Double_t GetMass()
Double_t GetCharge()
Bool_t IsStable()
Int_t GetPDG() const
const TString & GetPType()
TMCParticleType GetMCType()
Int_t GetiParity()
Int_t GetgParity()
Int_t GetConjugation()
Int_t GetLepton()
Double_t GetDecayTime()
Int_t GetBaryon()
Int_t GetSpin()
Int_t GetIsospinZ()
void SetEvent(FairMCEventHeader *event)
virtual FairPrimaryGenerator * ClonePrimaryGenerator() const
virtual Bool_t GenerateEvent(FairGenericStack *pStack)
void AddMeshList(TObjArray *list)
TObjArray * GetMeshList()
void AddPoint(Int_t &ModuleId)
void AddPoint(Int_t &ModuleId)
static FairRootManager * Instance()
Int_t GetInstanceId() const
Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0)
TChain * GetInChain()
void StoreInfo()
void WriteInfo()
TObjArray * GetUserDefIons()
FairMCEventHeader * GetMCEventHeader()
FairPrimaryGenerator * GetPrimaryGenerator()
Definition FairRunSim.h:122
static FairRunSim * Instance()
TObjArray * GetUserDefParticles()
Bool_t IsImportTGeoToVMC() const
Definition FairRunSim.h:183
Bool_t GetStoreTraj() const
Definition FairRunSim.h:96
Int_t GetRunId()
Definition FairRun.h:96
static FairRun * Instance()
Definition FairRun.cxx:31
FairSink * GetSink()
Definition FairRun.h:92
Bool_t IsRunInfoGenerated()
Definition FairRun.h:136
void SetSink(FairSink *tempSink)
Definition FairRun.h:83
void AlignGeometry() const
Definition FairRun.cxx:179
virtual Sink_Type GetSinkType()=0
virtual FairSink * CloneSink()=0
virtual void ExecuteTask(Option_t *option="0")
Definition FairTask.cxx:118
virtual void FinishTask()
Definition FairTask.cxx:90
void SetParTask()
Definition FairTask.cxx:73
void InitTask()
Definition FairTask.cxx:41
virtual void FinishEvent()
Definition FairTask.cxx:82
Bool_t IsAccepted(const TParticle *p) const
void Init(TString brName="GeoTracks", TString folderName="MCGeoTrack")
static FairTrajFilter * Instance()
Double_t GetStepSizeCut() const
TGeoTrack * CheckAddTrack(Int_t trackId, TParticle *p)
TGeoTrack * GetCurrentTrk()
void setModId(Int_t id)
Definition FairVolume.h:40
FairDetector * GetDetector()
Definition FairVolume.h:48
void setMCid(Int_t id)
Definition FairVolume.h:59
Int_t getCopyNo()
Definition FairVolume.h:58
Int_t getModId()
Definition FairVolume.h:39
void SetModule(FairModule *mod)
Definition FairVolume.h:49
Int_t getMCid()
Definition FairVolume.h:57
FairGeoNode * getGeoNode()
Definition FairVolume.h:60
FairModule * GetModule()
Definition FairVolume.h:47
void setCopyNo(Int_t id)
Definition FairVolume.h:41
GLdouble n
Definition glcorearb.h:1982
const GLdouble * v
Definition glcorearb.h:832
GLuint const GLchar * name
Definition glcorearb.h:781
GLboolean GLboolean GLboolean GLboolean a
Definition glcorearb.h:1233
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
D const SVectorGPU< T, D > & rhs
Definition SMatrixGPU.h:193
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"