86{
87
88 G4double edep = aStep->GetTotalEnergyDeposit();
89 G4double stepl = aStep->GetStepLength();
90 if ((edep==0.)&&(stepl==0.)) return false;
91
92 G4TouchableHistory* theTouchable
93 = (G4TouchableHistory*)(aStep->GetPreStepPoint()->GetTouchable());
94 G4VPhysicalVolume* physVol = theTouchable->GetVolume();
95
96 if(physVol->GetName().contains("physicalCrystal"))
97 {
98 PartId=1;
99 CryNumberPhi=theTouchable->GetReplicaNumber(2);
100 CryNumberTheta=theTouchable->GetReplicaNumber(1);
101 }
102 else if(physVol->GetName().contains("logicalCrystal"))
103 {
104 PartId=1;
105 std::istringstream thetaBuf((theTouchable->GetVolume(1)->GetName()).substr(16,2));
106 thetaBuf >> CryNumberTheta ;
107 CryNumberPhi = 308-theTouchable->GetCopyNumber(2);
108 }
109 else if(physVol->GetName().contains("physicalEndCrystal"))
110 {
111 PartId=theTouchable->GetReplicaNumber(3);
112 G4int endSector=theTouchable->GetReplicaNumber(2);
113 G4int endNb=theTouchable->GetReplicaNumber(0);
115 }
116 else if(physVol->GetName().contains("logicalEndCrystal"))
117 {
118 PartId=2-2*theTouchable->GetCopyNumber(3);
119 G4int endSector=theTouchable->GetCopyNumber(2);
120 G4int endNb,endNbGDML;
121 std::istringstream thetaBuf((theTouchable->GetVolume(0)->GetName()).substr(20,2));
122 thetaBuf >> endNb ;
126 }
127 else if(physVol->GetName().contains("physicalPD"))
128 {
129 edep*=50.;
130 PartId=1;
131 CryNumberPhi=theTouchable->GetReplicaNumber(2);
132 CryNumberTheta=theTouchable->GetReplicaNumber(1);
133 }
134 else if(physVol->GetName().contains("logicalPD"))
135 {
136 edep*=50.;
137 PartId=1;
138 G4int nb=theTouchable->GetCopyNumber(1);
139 if(nb==216) {
140 CryNumberTheta=0;
141 } else {
142 CryNumberTheta = 43-(nb-2)/5;
143 }
144 CryNumberPhi = 308-theTouchable->GetCopyNumber(2);
145 }
146
147 if (verboseLevel>1)
148 G4cout << "(Check ID)New EMC Hit on crystal: "
149 << CryNumberPhi << "(phi)"
150 << CryNumberTheta << "(theta)"
151 << " and the volume is " << physVol->GetName()
152 << G4endl;
153
154
155 G4int trackId = aStep->GetTrack()->GetTrackID();
156
162 calHit->
SetPosCrystal(aStep->GetPreStepPoint()->GetPosition());
163 calHit->
SetTimeCrystal(aStep->GetPreStepPoint()->GetGlobalTime());
164 calHit->
SetMomentum(aStep->GetPreStepPoint()->GetMomentum());
166
167 if(edep>0&&nHit<20000)
168 HitID[nHit]=CalCollection->insert(calHit)-1;
169 else
170 {
171 delete calHit;
172
173
174 }
175 nHit++;
176
177
178 if(CalList)
179 {
180 G4int trackIndex, g4TrackId;
183
184 if(m_trackIndex != trackIndex)
185 {
186 m_trackIndex = trackIndex;
187
188 G4int flag=1;
189 G4int pdg =
abs(aStep->GetTrack()->GetDefinition()->GetPDGEncoding());
190 if(pdg==12 || pdg==14 || pdg==16) {
191 flag=0;
192 }
193
194 if(flag && aStep->GetTrack()->GetTrackID()==g4TrackId )
195 {
201 truHit->
SetPosCrystal(aStep->GetPreStepPoint()->GetPosition());
202 truHit->
SetTimeCrystal(aStep->GetPreStepPoint()->GetGlobalTime());
203 truHit->
SetMomentum(aStep->GetPreStepPoint()->GetMomentum());
205 CalList->insert(truHit);
206 }
207 }
208
209 else if(m_trackIndex == trackIndex)
210 {
211 G4int length = CalList->entries();
212 if(length>=1)
213 {
214 for(G4int i=0;i<length;i++)
215 {
218 {
220 break;
221 }
222 }
223 }
224 }
225
226 }
227
228
229 if(CalTruthList)
230 {
231 G4int trackIndex, g4TrackId;
234
235 G4int flag=1;
236 if(CalTruthList->entries()>0) {
237 for(G4int i=0;i<CalTruthList->entries();i++) {
240 flag=0;
242 if(oldHit->
Find(
id)!=oldHit->
End()) {
244 } else {
246 }
247 break;
248 }
249 }
250 }
251
252 if(flag==1) {
253 G4int pdg =
abs(aStep->GetTrack()->GetDefinition()->GetPDGEncoding());
254 if(!(pdg==12 || pdg==14 || pdg==16)) {
261
262 if(aStep->GetTrack()->GetTrackID()==g4TrackId) {
264 truHit->
SetPDGCode(aStep->GetTrack()->GetDefinition()->GetPDGEncoding());
265 truHit->
SetPDGCharge(aStep->GetTrack()->GetDefinition()->GetPDGCharge());
266 truHit->
SetParticleName(aStep->GetTrack()->GetDefinition()->GetParticleName());
267 truHit->
SetTime(aStep->GetPreStepPoint()->GetGlobalTime());
268 truHit->
SetPosition(aStep->GetPreStepPoint()->GetPosition());
269 truHit->
SetMomentum(aStep->GetPreStepPoint()->GetMomentum());
270
271 } else {
272
274 std::vector<BesTruthTrack*> *trackList = sensitiveManager->
GetTrackList();
275
276 for(unsigned i=0;i<trackList->size();i++) {
278
279 if(trackIndex==truthTrack->
GetIndex()) {
284
288 } else {
291 }
292
293 break;
294 }
295
296 }
297 }
298
299 CalTruthList->insert(truHit);
300 }
301 }
302 }
303
304 return true;
305}
double abs(const EvtComplex &c)
void SetNumCrystal(G4int id, G4int numTheta, G4int numPhi)
void SetEdepCrystal(G4double de)
void SetMomentum(G4ThreeVector momen)
G4double GetEdepCrystal()
void SetPosCrystal(G4ThreeVector position)
void SetTimeCrystal(G4double t)
void SetTrakCrystal(G4double dl)
void SetG4Index(G4int index)
void SetTrackIndex(G4int index)
G4int ComputeEndCopyNb(G4int)
void ComputeThetaPhi(G4int, G4int, G4int)
G4int EndPhiNumberForGDML(G4int)
void SetIdentify(Identifier id)
G4int GetTrackIndex() const
void SetMomentum(G4ThreeVector p)
void SetPosition(G4ThreeVector pos)
void AddEHit(Identifier, G4double)
void SetPDGCode(G4int code)
void SetTrackIndex(G4int index)
std::map< Identifier, G4double >::const_iterator End() const
std::map< Identifier, G4double >::const_iterator Find(Identifier) const
void Insert(Identifier, G4double)
void SetG4TrackId(G4int trackId)
void SetEDep(G4double de)
void SetParticleName(G4String name)
void SetTime(G4double time)
void SetPDGCharge(G4double charge)
void GetCurrentTrackIndex(G4int &trackIndex, G4int &g4TrackId) const
std::vector< BesTruthTrack * > * GetTrackList()
static BesSensitiveManager * GetSensitiveManager()
BesTruthVertex * GetTerminalVertex() const
G4double GetPDGCharge() const
G4String GetParticleName() const
G4ThreeVector GetPosition() const
static Identifier crystal_id(const unsigned int barrel_ec, const unsigned int theta_module, const unsigned int phi_module)
For a single crystal.