1 #include <fwk/RunController.h>
2 #include <fwk/VModule.h>
3 #include <fwk/RandomEngineRegistry.h>
4 #include <utl/RandomEngine.h>
10 #include "G4RunManager.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"
23 using namespace TelescopeSimulatorLX;
24 using CLHEP::RandFlat;
27 FDsimG4EventAction::FDsimG4EventAction()
36 fWrite2ROOT = write2Root;
40 FDsimG4EventAction::~FDsimG4EventAction()
47 fOpticalHitsCollID = -1;
48 fOpticalHitsColl = NULL;
53 dynamic_cast<TelescopeSimulator&
>(fwk::RunController::GetInstance().GetModule(
"TelescopeSimulatorLX"));
54 fFDSimulator = &FDSimulator;
59 FDsimG4EventAction::BeginOfEventAction(
const G4Event*
const)
61 #ifdef __TELESCOPE_SIMULATOR_LX_USE_ROOT__
69 FDsimG4EventAction::EndOfEventAction(
const G4Event*
const evt)
71 static G4SDManager* SDman = G4SDManager::GetSDMpointer();
73 if (fOpticalHitsCollID == -1)
74 fOpticalHitsCollID = SDman->GetCollectionID(
"OpticalHits");
76 G4HCofThisEvent* HCE = evt->GetHCofThisEvent();
78 if (fOpticalHitsCollID != -1)
82 G4String drawFlag =
"all";
83 G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance();
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();
98 fOpticalHitsColl->DrawAllHits();
100 if (fFDSimulator && fOpticalHitsColl) {
101 for (G4int iHit = 0; iHit < fOpticalHitsColl->entries(); iHit++){
103 CopyHit((*fOpticalHitsColl)[iHit], &StoreOpticalHit);
104 fFDSimulator->SetG4PixelHit(StoreOpticalHit);
108 #ifdef __TELESCOPE_SIMULATOR_LX_USE_ROOT__
109 static G4bool useSD =
111 ((G4RunManager::GetRunManager())->GetUserDetectorConstruction()))->
112 GetUseSensitiveDetectors();
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);
124 G4PrimaryVertex* vertex = evt->GetPrimaryVertex();
125 G4PrimaryParticle*
particle = vertex->GetPrimary();
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();
133 G4double p0 = particle->GetMomentum().mag();
134 G4double mass = particle->GetMass();
135 G4double E0 =
sqrt(p0*p0+mass*mass);
137 G4double DirX = particle->GetMomentum().x()/p0;
138 G4double DirY = particle->GetMomentum().y()/p0;
139 G4double DirZ = particle->GetMomentum().z()/p0;
154 fWrite2ROOT->SetINPhoton(&thePrimary);
156 fWrite2ROOT->WriteIt();
162 #ifdef __TELESCOPE_SIMULATOR_LX_USE_ROOT__
165 FDsimG4EventAction::WriteHits(
string HitsCollectionName,G4HCofThisEvent* HCE)
167 static G4SDManager* SDman = G4SDManager::GetSDMpointer();
168 G4int HitsCollID = SDman->GetCollectionID(HitsCollectionName);
175 G4int nHits = HitsCollection->entries();
177 G4int iHit = nHits-1;
181 CopyHit((*HitsCollection)[iHit], &StoreOpticalHit);
184 if (HitsCollectionName ==
"FilterHits")
185 fWrite2ROOT->SetG4FilterPhoton(&StoreOpticalHit);
187 if (HitsCollectionName ==
"LensHits")
188 fWrite2ROOT->SetG4LensPhoton(&StoreOpticalHit);
190 if (HitsCollectionName ==
"MirrorHits")
191 fWrite2ROOT->SetG4MirrorPhoton(&StoreOpticalHit);
193 if (HitsCollectionName ==
"MercedesHits")
194 fWrite2ROOT->SetG4MercedesPhoton(&StoreOpticalHit);
196 if (HitsCollectionName ==
"FocalSurfaceHits")
197 fWrite2ROOT->SetG4FSPhoton(&StoreOpticalHit);
199 if (HitsCollectionName ==
"OpticalHits")
200 fWrite2ROOT->SetG4Photon(&StoreOpticalHit);
210 G4double HitEnergy = theHit->
GetEnergy();
211 G4double HitTime = theHit->
GetTime();
221 theStoreHit->
Reset();
232 double r = HitPos.mag() +
233 0.000001*
mm * RandFlat::shoot(&RandomEngine.
GetEngine(),0.0,1.0);
236 theStoreHit->
SetDirX(HitDir.x());
237 theStoreHit->
SetDirY(HitDir.y());
238 theStoreHit->
SetDirZ(HitDir.z());
G4double GetWavelength() const
void SetLocalPosY(double y=0.0)
G4THitsCollection< FDsimG4OpticalHit > FDsimG4OpticalHitsCollection
void SetWeight(double w=1.0)
void SetPosY(double y=0.0)
RandomEngineType & GetEngine()
void Init()
Initialise the registry.
void SetPosX(double x=0.0)
G4double GetEnergy() const
G4double GetWeight() const
void SetLocalPosX(double x=0.0)
constexpr double nanometer
G4ThreeVector GetDirection() const
Wraps the random number engine used to generate distributions.
void SetEnergy(double fEne=0.0)
void SetDirX(double dx=0.0)
void SetPixelPosZ(double z=0.0)
G4ThreeVector GetPixelPosition() const
void SetWavelength(double fWvl=0.0)
G4ThreeVector GetWorldPosition() const
void SetDirZ(double dz=0.0)
struct particle_info particle[80]
void SetPixelPosX(double x=0.0)
void SetPosZ(double z=0.0)
void SetLocalPosZ(double z=0.0)
void SetTime(double fTi=0.0)
void SetPixelPosY(double y=0.0)
void SetDirY(double dy=0.0)
G4ThreeVector GetPosition() const
void SetPosR(double r=0.0)
Simulates the FD telescope using Geant4.