FDsimG4EventAction.cc
Go to the documentation of this file.
1 #include <fwk/RunController.h>
2 #include <fwk/VModule.h>
3 #include <fwk/RandomEngineRegistry.h>
4 #include <utl/RandomEngine.h>
5 #include "FDsimG4Defs.hh"
6 #include "FDsimG4EventAction.hh"
9 #include "FDsimG4Write2ROOT.hh"
10 #include "G4RunManager.hh"
11 #include "G4Run.hh"
12 #include "G4Event.hh"
13 #include "G4EventManager.hh"
14 #include "G4SDManager.hh"
15 #include "G4GeneralParticleSource.hh"
16 #include "G4TrajectoryContainer.hh"
17 #include "G4Trajectory.hh"
18 #include "G4VVisManager.hh"
19 #include <cmath>
20 #include <fstream>
21 
22 using namespace std;
23 using namespace TelescopeSimulatorLX;
24 using CLHEP::RandFlat;
25 
26 
27 FDsimG4EventAction::FDsimG4EventAction()
28 {
29  Init();
30 }
31 
32 
33 FDsimG4EventAction::FDsimG4EventAction(FDsimG4Write2ROOT* write2Root)
34 {
35  Init();
36  fWrite2ROOT = write2Root;
37 }
38 
39 
40 FDsimG4EventAction::~FDsimG4EventAction()
41 { }
42 
43 
44 void
46 {
47  fOpticalHitsCollID = -1;
48  fOpticalHitsColl = NULL;
49  fFDSimulator = NULL;
50  fWrite2ROOT = NULL;
51 
52  TelescopeSimulator& FDSimulator =
53  dynamic_cast<TelescopeSimulator&>(fwk::RunController::GetInstance().GetModule("TelescopeSimulatorLX"));
54  fFDSimulator = &FDSimulator;
55 }
56 
57 
58 void
59 FDsimG4EventAction::BeginOfEventAction(const G4Event* const)
60 {
61 #ifdef __TELESCOPE_SIMULATOR_LX_USE_ROOT__
62  if (fWrite2ROOT)
63  fWrite2ROOT->Clean();
64 #endif
65 }
66 
67 
68 void
69 FDsimG4EventAction::EndOfEventAction(const G4Event* const evt)
70 {
71  static G4SDManager* SDman = G4SDManager::GetSDMpointer();
72 
73  if (fOpticalHitsCollID == -1)
74  fOpticalHitsCollID = SDman->GetCollectionID("OpticalHits");
75 
76  G4HCofThisEvent* HCE = evt->GetHCofThisEvent();
77  if (HCE) {
78  if (fOpticalHitsCollID != -1)
79  fOpticalHitsColl = (FDsimG4OpticalHitsCollection*)(HCE->GetHC(fOpticalHitsCollID));
80  }
81 
82  G4String drawFlag = "all";
83  G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance();
84  if (pVVisManager) {
85  G4TrajectoryContainer* trajectoryContainer = evt->GetTrajectoryContainer();
86  G4int n_trajectories = 0;
87  if (trajectoryContainer) n_trajectories = trajectoryContainer->entries();
88  for (G4int i = 0; i < n_trajectories; i++){
89  G4Trajectory* trj = (G4Trajectory *)((*(evt->GetTrajectoryContainer()))[i]);
90  if (drawFlag == "all")
91  trj->DrawTrajectory();
92  else if ((drawFlag == "charged") && (trj->GetCharge() != 0.))
93  trj->DrawTrajectory();
94  }
95  }
96 
97  if (fOpticalHitsColl)
98  fOpticalHitsColl->DrawAllHits();
99 
100  if (fFDSimulator && fOpticalHitsColl) {
101  for (G4int iHit = 0; iHit < fOpticalHitsColl->entries(); iHit++){
103  CopyHit((*fOpticalHitsColl)[iHit], &StoreOpticalHit);
104  fFDSimulator->SetG4PixelHit(StoreOpticalHit);
105  }
106  }
107 
108 #ifdef __TELESCOPE_SIMULATOR_LX_USE_ROOT__
109  static G4bool useSD =
110  (dynamic_cast<const FDsimG4DetectorConstruction*>
111  ((G4RunManager::GetRunManager())->GetUserDetectorConstruction()))->
112  GetUseSensitiveDetectors();
113 
114  if (fWrite2ROOT && useSD && HCE){
115  WriteHits("FilterHits",HCE);
116  WriteHits("LensHits",HCE);
117  WriteHits("MirrorHits",HCE);
118  WriteHits("MercedesHits",HCE);
119  WriteHits("FocalSurfaceHits",HCE);
120  WriteHits("OpticalHits",HCE);
121 
123 
124  G4PrimaryVertex* vertex = evt->GetPrimaryVertex();
125  G4PrimaryParticle* particle = vertex->GetPrimary();
126 
127  G4double T0 = vertex->GetT0();
128  G4double X0 = vertex->GetX0();
129  G4double Y0 = vertex->GetY0();
130  G4double Z0 = vertex->GetZ0();
131  G4double weight = vertex->GetWeight();
132 
133  G4double p0 = particle->GetMomentum().mag();
134  G4double mass = particle->GetMass();
135  G4double E0 = sqrt(p0*p0+mass*mass);
136 
137  G4double DirX = particle->GetMomentum().x()/p0;
138  G4double DirY = particle->GetMomentum().y()/p0;
139  G4double DirZ = particle->GetMomentum().z()/p0;
140 
141  thePrimary.Reset();
142  thePrimary.SetEnergy(E0/eV);
143  thePrimary.SetTime(T0/ns);
144  thePrimary.SetWavelength(h_Planck*c_light/E0/nm);
145  thePrimary.SetPosX(X0/mm);
146  thePrimary.SetPosY(Y0/mm);
147  thePrimary.SetPosZ(Z0/mm);
148 
149  thePrimary.SetDirX(DirX);
150  thePrimary.SetDirY(DirY);
151  thePrimary.SetDirZ(DirZ);
152  thePrimary.SetWeight(weight);
153 
154  fWrite2ROOT->SetINPhoton(&thePrimary);
155 
156  fWrite2ROOT->WriteIt();
157  }
158 #endif
159 }
160 
161 
162 #ifdef __TELESCOPE_SIMULATOR_LX_USE_ROOT__
163 
164 void
165 FDsimG4EventAction::WriteHits(string HitsCollectionName,G4HCofThisEvent* HCE)
166 {
167  static G4SDManager* SDman = G4SDManager::GetSDMpointer();
168  G4int HitsCollID = SDman->GetCollectionID(HitsCollectionName);
169  FDsimG4OpticalHitsCollection* HitsCollection;
170 
171  HitsCollection = (FDsimG4OpticalHitsCollection*)(HCE->GetHC(HitsCollID));
172  if (!HitsCollection)
173  return;
174 
175  G4int nHits = HitsCollection->entries();
176  if (nHits>0){
177  G4int iHit = nHits-1;
178 
180 
181  CopyHit((*HitsCollection)[iHit], &StoreOpticalHit);
182 
183 
184  if (HitsCollectionName == "FilterHits")
185  fWrite2ROOT->SetG4FilterPhoton(&StoreOpticalHit);
186  else
187  if (HitsCollectionName == "LensHits")
188  fWrite2ROOT->SetG4LensPhoton(&StoreOpticalHit);
189  else
190  if (HitsCollectionName == "MirrorHits")
191  fWrite2ROOT->SetG4MirrorPhoton(&StoreOpticalHit);
192  else
193  if (HitsCollectionName == "MercedesHits")
194  fWrite2ROOT->SetG4MercedesPhoton(&StoreOpticalHit);
195  else
196  if (HitsCollectionName == "FocalSurfaceHits")
197  fWrite2ROOT->SetG4FSPhoton(&StoreOpticalHit);
198  else
199  if (HitsCollectionName == "OpticalHits")
200  fWrite2ROOT->SetG4Photon(&StoreOpticalHit);
201  }
202 }
203 #endif
204 
205 
206 void
207 FDsimG4EventAction::CopyHit(const FDsimG4OpticalHit* theHit,
208  FDsimG4StoreOpticalHit* theStoreHit)
209 {
210  G4double HitEnergy = theHit->GetEnergy();
211  G4double HitTime = theHit->GetTime();
212  G4double HitWavelength = theHit->GetWavelength();
213  G4ThreeVector HitPos = theHit->GetWorldPosition();
214  G4ThreeVector HitLocalPos = theHit->GetPosition();
215  G4ThreeVector PixelPos = theHit->GetPixelPosition();
216  G4ThreeVector HitDir = theHit->GetDirection();
217  G4int HitID = theHit->GetHitID();
218  G4int PMTID = theHit->GetPMTid();
219  G4double weight = theHit->GetWeight();
220 
221  theStoreHit->Reset();
222  theStoreHit->SetEnergy(HitEnergy/eV);
223  theStoreHit->SetTime(HitTime/ns);
224  theStoreHit->SetWavelength(HitWavelength/nanometer);
225  theStoreHit->SetPosX(HitPos.x()/mm);
226  theStoreHit->SetPosY(HitPos.y()/mm);
227  theStoreHit->SetPosZ(HitPos.z()/mm);
228 
229  static utl::RandomEngine& RandomEngine =
230  fwk::RandomEngineRegistry::GetInstance().Get(fwk::RandomEngineRegistry::eDetector);
231 
232  double r = HitPos.mag() +
233  0.000001*mm * RandFlat::shoot(&RandomEngine.GetEngine(),0.0,1.0);
234 
235  theStoreHit->SetPosR(r/mm);
236  theStoreHit->SetDirX(HitDir.x());
237  theStoreHit->SetDirY(HitDir.y());
238  theStoreHit->SetDirZ(HitDir.z());
239  theStoreHit->SetLocalPosX(HitLocalPos.x()/mm);
240  theStoreHit->SetLocalPosY(HitLocalPos.y()/mm);
241  theStoreHit->SetLocalPosZ(HitLocalPos.z()/mm);
242  theStoreHit->SetPixelPosX(PixelPos.x()/mm);
243  theStoreHit->SetPixelPosY(PixelPos.y()/mm);
244  theStoreHit->SetPixelPosZ(PixelPos.z()/mm);
245  theStoreHit->SetHitID(HitID);
246  theStoreHit->SetPMTid(PMTID);
247  theStoreHit->SetWeight(weight);
248 }
const double eV
Definition: GalacticUnits.h:35
G4THitsCollection< FDsimG4OpticalHit > FDsimG4OpticalHitsCollection
constexpr double mm
Definition: AugerUnits.h:113
RandomEngineType & GetEngine()
Definition: RandomEngine.h:32
void Init()
Initialise the registry.
constexpr double nanometer
Definition: AugerUnits.h:102
const double ns
Wraps the random number engine used to generate distributions.
Definition: RandomEngine.h:27
struct particle_info particle[80]

, generated on Tue Sep 26 2023.