1 | #include "ELYSE/TrackingAction.hh" |
---|
2 | |
---|
3 | //Geant4 |
---|
4 | #include "G4ParticleTable.hh" |
---|
5 | #include "G4ParticleTypes.hh" |
---|
6 | #include "G4TrackingManager.hh" |
---|
7 | #include "G4Track.hh" |
---|
8 | #include "G4ios.hh" |
---|
9 | #include "G4VProcess.hh" |
---|
10 | |
---|
11 | //ELYSE |
---|
12 | #include "ELYSE/Trajectory.hh" |
---|
13 | #include "ELYSE/TrackInformation.hh" |
---|
14 | #include "ELYSE/TrackingActionMessenger.hh" |
---|
15 | |
---|
16 | ELYSE::TrackingAction::TrackingAction() { |
---|
17 | ProcessList.insert("eIoni") ; |
---|
18 | |
---|
19 | G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable(); |
---|
20 | ParticleList.insert(particleTable->FindParticle("e-")->GetPDGEncoding()); |
---|
21 | ParticleList.insert(particleTable->FindParticle("e+")->GetPDGEncoding()); |
---|
22 | |
---|
23 | |
---|
24 | // don't put gammas there or there'll be too many |
---|
25 | |
---|
26 | messenger = new TrackingActionMessenger(this); |
---|
27 | |
---|
28 | }//Ctor |
---|
29 | |
---|
30 | //-------------------------------------------------------------------------------------------------- |
---|
31 | |
---|
32 | ELYSE::TrackingAction::~TrackingAction(){ |
---|
33 | //JEC 24/1/06 |
---|
34 | delete messenger; |
---|
35 | messenger = 0; |
---|
36 | }//Dtor |
---|
37 | |
---|
38 | //--------------------------------------------------------------------------------------------------- |
---|
39 | |
---|
40 | void ELYSE::TrackingAction::PreUserTrackingAction(const G4Track* aTrack) { |
---|
41 | |
---|
42 | G4ParticleDefinition* particleType = aTrack->GetDefinition(); |
---|
43 | G4String particleName = particleType->GetParticleName(); |
---|
44 | |
---|
45 | |
---|
46 | fpTrackingManager->SetStoreTrajectory(false); //Track default: no custom or G4Trajectories |
---|
47 | |
---|
48 | //-----------optical photon: store trajectory objects |
---|
49 | |
---|
50 | // G4cout << "(JEC) PreUserTrackingAction (" << particleName |
---|
51 | // << ") and DrawOptical = " << drawOpticalPhoton |
---|
52 | // << G4endl; |
---|
53 | |
---|
54 | if(!drawOpticalPhoton && (particleName == "opticalphoton") )return; |
---|
55 | |
---|
56 | if(drawOpticalPhoton && (particleName == "opticalphoton") ){ |
---|
57 | |
---|
58 | // G4cout << "(JEC) PreUserTrackingAction: Optical--ParentID : " << aTrack->GetParentID() |
---|
59 | // << G4endl; |
---|
60 | |
---|
61 | |
---|
62 | Trajectory* aTrajectory = new Trajectory(aTrack); |
---|
63 | fpTrackingManager->SetTrajectory(aTrajectory); |
---|
64 | fpTrackingManager->SetStoreTrajectory(true); //(JEC) 14/12/05 keep it and delete it a posteriori |
---|
65 | // only if it has not produced a hit |
---|
66 | |
---|
67 | TrackInformation* aInfo = new TrackInformation(aTrack); |
---|
68 | fpTrackingManager->SetUserTrackInformation(aInfo); |
---|
69 | |
---|
70 | return; |
---|
71 | |
---|
72 | }//eo optical photon |
---|
73 | |
---|
74 | //-----------other particle: store trajectory objects |
---|
75 | |
---|
76 | // A priori some tracks are worth to be saved |
---|
77 | // is it a primary ? |
---|
78 | // is the process in the set ? |
---|
79 | // is the particle in the set ? |
---|
80 | // is it a gamma with enough energy |
---|
81 | // due to lazy evaluation of the 'or' in C++ the order is important |
---|
82 | |
---|
83 | const G4VProcess* creatorProcess = aTrack->GetCreatorProcess(); |
---|
84 | G4double thresholdTobeSaved = 0.*keV; //JEC FIXME put in the messenger |
---|
85 | |
---|
86 | // G4cout << "(JEC) PreUserTrackingAction (" << particleName |
---|
87 | // << " ParentID " << aTrack->GetParentID(); |
---|
88 | // if (creatorProcess!=0) G4cout << ") and Process Name " << creatorProcess->GetProcessName(); |
---|
89 | // G4cout << G4endl; |
---|
90 | |
---|
91 | |
---|
92 | //JEC 20/2/06 debug: keep all particle for the moment |
---|
93 | // if( ( aTrack->GetParentID() == 0 ) || |
---|
94 | // ( (creatorProcess!=0) && ProcessList.count(creatorProcess->GetProcessName()) ) || |
---|
95 | // ( ParticleList.count(particleType->GetPDGEncoding()) ) || |
---|
96 | // ( (particleType->GetPDGEncoding() == 22) && (aTrack->GetTotalEnergy() > thresholdTobeSaved) ) ) { |
---|
97 | |
---|
98 | //G4cout <<"Pre Tracking::particle = " << particleName |
---|
99 | // << " " << aTrack << G4endl; |
---|
100 | |
---|
101 | Trajectory* aTrajectory = new Trajectory(aTrack); |
---|
102 | fpTrackingManager->SetTrajectory(aTrajectory); |
---|
103 | fpTrackingManager->SetStoreTrajectory(true); |
---|
104 | return; |
---|
105 | |
---|
106 | // }//eo particles |
---|
107 | |
---|
108 | |
---|
109 | |
---|
110 | }//PreUserTrackingAction |
---|
111 | |
---|
112 | //--------------------------------------------------------------------------------------------------- |
---|
113 | |
---|
114 | void ELYSE::TrackingAction::PostUserTrackingAction(const G4Track* aTrack) { |
---|
115 | |
---|
116 | //-----------Check StoreTrajectory for particle : true or false? |
---|
117 | |
---|
118 | G4bool storetrajectory = fpTrackingManager->GetStoreTrajectory(); |
---|
119 | if(!storetrajectory)return; |
---|
120 | |
---|
121 | G4ParticleDefinition* particleType = aTrack->GetDefinition(); |
---|
122 | G4String particleName = particleType->GetParticleName(); |
---|
123 | |
---|
124 | //-----------opticalphoton |
---|
125 | //---------------do not store it if it is not detected by the Tyvek |
---|
126 | |
---|
127 | if ( particleName == "opticalphoton" ) { |
---|
128 | |
---|
129 | TrackInformation* aInfo = (TrackInformation*)(aTrack->GetUserInformation()); |
---|
130 | |
---|
131 | //G4cout <<"PostTracking::opticalphoton = " |
---|
132 | // << particleName << " " << aTrack << " " << aInfo << G4endl; |
---|
133 | |
---|
134 | //------------- produced or not a hit: if not remove and return |
---|
135 | |
---|
136 | if ( !(aInfo->GetTrackStatus() & hitProduced) ) { |
---|
137 | //JEC temporary fpTrackingManager->SetStoreTrajectory(false); |
---|
138 | return; |
---|
139 | } |
---|
140 | |
---|
141 | }//eo optical photon |
---|
142 | |
---|
143 | //-----------Get the trajectory from TrackingManager |
---|
144 | //---------------and fill in |
---|
145 | |
---|
146 | //G4cout <<"PostTracking::particles = " |
---|
147 | // << particleName << " " << aTrack << G4endl; |
---|
148 | |
---|
149 | Trajectory *currentTrajectory = (Trajectory*)fpTrackingManager->GimmeTrajectory(); |
---|
150 | |
---|
151 | G4ThreeVector currentPosition = aTrack->GetPosition(); |
---|
152 | G4VPhysicalVolume* currentVolume = aTrack->GetVolume(); |
---|
153 | |
---|
154 | currentTrajectory->SetStoppingPoint(currentPosition); |
---|
155 | currentTrajectory->SetStoppingVolume(currentVolume); |
---|
156 | currentTrajectory->SetSaveFlag(true); //For saving into Tuple (see EventAction) |
---|
157 | |
---|
158 | //JEC to be fixed the above flag should not be needed now |
---|
159 | |
---|
160 | }//PostUserTrackingAction |
---|
161 | |
---|
162 | |
---|
163 | |
---|
164 | |
---|