148{
149 G4Track* gTrack = aStep->GetTrack() ;
150
151 G4double globalT=gTrack->GetGlobalTime();
152 if(isnan(globalT)){
153 G4cout<<"MdcSD:error, globalT is nan "<<G4endl;
154 return false;
155 }
156 if(globalT > 2000)return false;
157
158
159 G4int charge = gTrack->GetDefinition()->GetPDGCharge();
160 if (charge == 0) return false;
161
162
163 G4double stepLength=aStep->GetStepLength();
164 if(stepLength==0){
165
166 return false;
167 }
168
169 G4double edep = aStep->GetTotalEnergyDeposit() / stepLength;
170 if(edep==0.) return false;
171
172
173 G4StepPoint* prePoint = aStep->GetPreStepPoint() ;
174 G4StepPoint* postPoint = aStep->GetPostStepPoint() ;
175
176
177 G4ThreeVector pointIn = prePoint->GetPosition();
178 G4ThreeVector pointOut = postPoint->GetPosition();
179
180
181 const G4VTouchable *touchable = prePoint->GetTouchable();
182 G4VPhysicalVolume *volume = touchable->GetVolume(0);
183
184 G4double driftD = 0;
185 G4double driftT = 0;
186 G4double edepTemp = 0;
187 G4double lengthTemp = 0;
188 G4int cellId=0;
189 G4int layerId = touchable->GetVolume(1)->GetCopyNo();
190 if(volume->IsReplicated()){
191 cellId = touchable->GetReplicaNumber();
192 }else{
193 cellId=touchable->GetVolume(0)->GetCopyNo();
194 }
195 if(layerId==18&&(cellId==27||cellId==42))return false;
196
198
199
200 if(layerId >= 36) layerId = 36 + (layerId-36)/2;
201 }
202
203 G4double halfLayerLength=mdcGeomSvc->
Layer(layerId)->
Length()/2.;
204 if(((fabs(pointIn.z())-halfLayerLength)>-7.)
205 &&((fabs(pointOut.z())-halfLayerLength)>-7.))return false;
206
207 G4int trackID= gTrack->GetTrackID();
208 G4int truthID, g4TrackID;
210
211 G4double theta=gTrack->GetMomentumDirection().theta();
212
213 G4ThreeVector hitPosition=0;
214 G4double transferT=0;
215 driftD =
Distance(layerId,cellId,pointIn,pointOut,hitPosition,transferT);
216
217 G4double posPhi, wirePhi;
218 posPhi=hitPosition.phi();
219 if(posPhi<0)posPhi += 2*
pi;
220 wirePhi=mdcGeoPointer->
SignalWire(layerId,cellId).
Phi(hitPosition.z());
221
222 G4int posFlag;
223 if(posPhi<=wirePhi){
224 posFlag = 0;
225 }else{
226 posFlag = 1;
227 }
228
229 if(posPhi < 1. && wirePhi > 5.)posFlag = 1;
230 if(posPhi > 5. && wirePhi < 1.)posFlag = 0;
231
232 G4ThreeVector hitLine=pointOut-pointIn;
233 G4double enterAngle=hitLine.phi()-wirePhi;
234 while(enterAngle<-
pi/2.)enterAngle+=
pi;
235 while(enterAngle>
pi/2.)enterAngle-=
pi;
236
238 G4double betaGamma=aStep->GetPreStepPoint()->GetBeta() * aStep->GetPreStepPoint()->GetGamma();
239 if(betaGamma<0.01)return false;
240
241
242 G4double eCount=dedxSample(betaGamma, charge, theta);
243 edep=eCount;
244 }
245
248
252 newHit->
SetPos(hitPosition);
257
258
260
261 driftT=mdcCalPointer->
D2T(driftD);
262 globalT+=transferT;
263 driftT+=globalT;
264
267
268 if (hitPointer[layerId][cellId] == -1) {
269 hitsCollection->insert(newHit);
270 G4int NbHits = hitsCollection->entries();
271 hitPointer[layerId][cellId]=NbHits-1;
272 }
273 else
274 {
275 G4int pointer=hitPointer[layerId][cellId];
276 if (g4TrackID == trackID) {
277 G4double preDriftT=(*hitsCollection)[pointer]->GetDriftT();
278 }
279
280 G4double preDriftT = (*hitsCollection)[pointer]->GetDriftT();
281 if (driftT < preDriftT) {
282 (*hitsCollection)[pointer]->SetTrackID(truthID);
283
284 (*hitsCollection)[pointer]->SetDriftD(driftD);
285 (*hitsCollection)[pointer]->SetDriftT(driftT);
286 (*hitsCollection)[pointer]->SetPos(hitPosition);
287 (*hitsCollection)[pointer]->SetGlobalT(globalT);
288 (*hitsCollection)[pointer]->SetTheta(theta);
289 (*hitsCollection)[pointer]->SetPosFlag(posFlag);
290 (*hitsCollection)[pointer]->SetEnterAngle(enterAngle);
291 }
292
293 delete newHit;
294 }
295
296
297 if(truthCollection){
298 if(g4TrackID==trackID){
299 G4int pointer=truthPointer[layerId][cellId];
300 if(pointer==-1){
306 truthHit->
SetPos (hitPosition);
313
314 truthCollection->insert(truthHit);
315 G4int NbHits = truthCollection->entries();
316 truthPointer[layerId][cellId]=NbHits-1;
317 }
318 else {
319 if(truthID == (*truthCollection)[pointer]->GetTrackID()){
320 G4double preDriftT=(*truthCollection)[pointer]->GetDriftT();
321 if(driftT<preDriftT){
322 (*truthCollection)[pointer]->SetDriftD(driftD);
323 (*truthCollection)[pointer]->SetDriftT(driftT);
324 (*truthCollection)[pointer]->SetPos(hitPosition);
325 (*truthCollection)[pointer]->SetGlobalT(globalT);
326 (*truthCollection)[pointer]->SetTheta(theta);
327 (*truthCollection)[pointer]->SetPosFlag(posFlag);
328 (*truthCollection)[pointer]->SetEnterAngle(enterAngle);
329 }
330 edepTemp=(*truthCollection)[pointer]->GetEdep();
331 (*truthCollection)[pointer]->SetEdep(edepTemp+edep);
332 } else {
338 truthHit->
SetPos(hitPosition);
345
346 truthCollection->insert(truthHit);
347 G4int NbHits = truthCollection->entries();
348 truthPointer[layerId][cellId]=NbHits-1;
349 }
350 }
351 }
352 }
353
354
355
356
357 return true;
358}
double D2T(double driftDNew)
void SetHitPointer(BesMdcHit *hit)
BesMdcWire SignalWire(int, int)
void SetEdep(G4double de)
void SetDriftT(G4double time)
void SetEnterAngle(G4double angle)
void SetCellNo(G4int cell)
void SetPos(G4ThreeVector xyz)
void SetTrackID(G4int track)
void SetLayerNo(G4int layer)
void SetTheta(G4double angle)
void SetDriftD(G4double distance)
void SetGlobalT(G4double time)
void SetPosFlag(G4int flag)
G4double Distance(G4int, G4int, G4ThreeVector, G4ThreeVector, G4ThreeVector &, G4double &)
void GetCurrentTrackIndex(G4int &trackIndex, G4int &g4TrackId) const