15#include "G4VPhysicalVolume.hh"
17#include "G4VTouchable.hh"
18#include "G4TouchableHistory.hh"
19#include "G4SDManager.hh"
33 ,Detector(det),fBesEmcGeometry(besEMCGeometry)
35 collectionName.insert(
"BesEmcHitsCollection");
36 collectionName.insert(
"BesEmcHitsList");
37 collectionName.insert(
"BesEmcTruthHitsList");
38 HitID =
new G4int[40000];
53 (SensitiveDetectorName,collectionName[0]);
54 for (G4int j=0;j<40000;j++)
64 (SensitiveDetectorName,collectionName[1]);
66 (SensitiveDetectorName,collectionName[2]);
74 HLID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[1]);
75 G4HCofThisEvent* HCE = evt->GetHCofThisEvent();
76 HCE->AddHitsCollection(HLID,CalList);
80 HTID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[2]);
81 HCE->AddHitsCollection(HTID,CalTruthList);
88 G4double edep = aStep->GetTotalEnergyDeposit();
89 G4double stepl = aStep->GetStepLength();
90 if ((edep==0.)&&(stepl==0.))
return false;
92 G4TouchableHistory* theTouchable
93 = (G4TouchableHistory*)(aStep->GetPreStepPoint()->GetTouchable());
94 G4VPhysicalVolume* physVol = theTouchable->GetVolume();
96 if(physVol->GetName().contains(
"physicalCrystal"))
99 CryNumberPhi=theTouchable->GetReplicaNumber(2);
100 CryNumberTheta=theTouchable->GetReplicaNumber(1);
102 else if(physVol->GetName().contains(
"logicalCrystal"))
105 std::istringstream thetaBuf((theTouchable->GetVolume(1)->GetName()).substr(16,2));
106 thetaBuf >> CryNumberTheta ;
107 CryNumberPhi = 308-theTouchable->GetCopyNumber(2);
109 else if(physVol->GetName().contains(
"physicalEndCrystal"))
111 PartId=theTouchable->GetReplicaNumber(3);
112 G4int endSector=theTouchable->GetReplicaNumber(2);
113 G4int endNb=theTouchable->GetReplicaNumber(0);
116 else if(physVol->GetName().contains(
"logicalEndCrystal"))
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));
127 else if(physVol->GetName().contains(
"physicalPD"))
131 CryNumberPhi=theTouchable->GetReplicaNumber(2);
132 CryNumberTheta=theTouchable->GetReplicaNumber(1);
134 else if(physVol->GetName().contains(
"logicalPD"))
138 G4int nb=theTouchable->GetCopyNumber(1);
142 CryNumberTheta = 43-(nb-2)/5;
144 CryNumberPhi = 308-theTouchable->GetCopyNumber(2);
148 G4cout <<
"(Check ID)New EMC Hit on crystal: "
149 << CryNumberPhi <<
"(phi)"
150 << CryNumberTheta <<
"(theta)"
151 <<
" and the volume is " << physVol->GetName()
155 G4int trackId = aStep->GetTrack()->GetTrackID();
162 calHit->
SetPosCrystal(aStep->GetPreStepPoint()->GetPosition());
163 calHit->
SetTimeCrystal(aStep->GetPreStepPoint()->GetGlobalTime());
164 calHit->
SetMomentum(aStep->GetPreStepPoint()->GetMomentum());
168 G4int idhit = CalCollection->insert(calHit)-1;
169 if(nHit<40000) HitID[nHit]=idhit;
182 G4int trackIndex, g4TrackId;
186 if(m_trackIndex != trackIndex)
188 m_trackIndex = trackIndex;
191 G4int pdg =
abs(aStep->GetTrack()->GetDefinition()->GetPDGEncoding());
192 if(pdg==12 || pdg==14 || pdg==16) {
196 if(
flag && aStep->GetTrack()->GetTrackID()==g4TrackId )
203 truHit->
SetPosCrystal(aStep->GetPreStepPoint()->GetPosition());
204 truHit->
SetTimeCrystal(aStep->GetPreStepPoint()->GetGlobalTime());
205 truHit->
SetMomentum(aStep->GetPreStepPoint()->GetMomentum());
207 CalList->insert(truHit);
211 else if(m_trackIndex == trackIndex)
213 G4int length = CalList->entries();
216 for(G4int i=0;i<length;i++)
233 G4int trackIndex, g4TrackId;
238 if(CalTruthList->entries()>0) {
239 for(G4int i=0;i<CalTruthList->entries();i++) {
244 if(oldHit->
Find(
id)!=oldHit->
End()) {
255 G4int pdg =
abs(aStep->GetTrack()->GetDefinition()->GetPDGEncoding());
256 if(!(pdg==12 || pdg==14 || pdg==16)) {
264 if(aStep->GetTrack()->GetTrackID()==g4TrackId) {
266 truHit->
SetPDGCode(aStep->GetTrack()->GetDefinition()->GetPDGEncoding());
267 truHit->
SetPDGCharge(aStep->GetTrack()->GetDefinition()->GetPDGCharge());
268 truHit->
SetParticleName(aStep->GetTrack()->GetDefinition()->GetParticleName());
269 truHit->
SetTime(aStep->GetPreStepPoint()->GetGlobalTime());
270 truHit->
SetPosition(aStep->GetPreStepPoint()->GetPosition());
271 truHit->
SetMomentum(aStep->GetPreStepPoint()->GetMomentum());
276 std::vector<BesTruthTrack*> *trackList = sensitiveManager->
GetTrackList();
278 for(
unsigned i=0;i<trackList->size();i++) {
281 if(trackIndex==truthTrack->
GetIndex()) {
301 CalTruthList->insert(truHit);
313 if((sector>=0)&&(sector<3))
320 CryNumberPhi = (sector-3)*4+nb;
322 else if((nb>=4)&&(nb<8))
325 CryNumberPhi = (sector-3)*4+nb-4;
327 else if((nb>=8)&&(nb<13))
330 CryNumberPhi = (sector-3)*5+nb-8;
332 else if((nb>=13)&&(nb<18))
335 CryNumberPhi = (sector-3)*5+nb-13;
337 else if((nb>=18)&&(nb<24))
340 CryNumberPhi = (sector-3)*6+nb-18;
342 else if((nb>=24)&&(nb<30))
345 CryNumberPhi = (sector-3)*6+nb-24;
384 switch(CryNumberTheta)
388 CryNumberPhi = 31-CryNumberPhi;
390 CryNumberPhi = 95-CryNumberPhi;
394 CryNumberPhi = 31-CryNumberPhi;
396 CryNumberPhi = 95-CryNumberPhi;
400 CryNumberPhi = 39-CryNumberPhi;
402 CryNumberPhi = 119-CryNumberPhi;
406 CryNumberPhi = 39-CryNumberPhi;
408 CryNumberPhi = 119-CryNumberPhi;
412 CryNumberPhi = 47-CryNumberPhi;
414 CryNumberPhi = 143-CryNumberPhi;
418 CryNumberPhi = 47-CryNumberPhi;
420 CryNumberPhi = 143-CryNumberPhi;
429 if(copyNb<0||copyNb>15) {
430 G4Exception(
"Wrong copy number of EMC Endcap Phi Volume!");
433 if(copyNb==0||copyNb==1) {
435 }
else if(copyNb==2||copyNb==3) {
437 }
else if(copyNb<=9) {
474 static G4int HCID = -1;
476 { HCID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]); }
477 HCE->AddHitsCollection(HCID,CalCollection);
G4THitsCollection< BesEmcTruthHit > BesEmcTruthHitsCollection
G4THitsCollection< BesEmcHit > BesEmcHitsCollection
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)
G4bool ProcessHits(G4Step *, G4TouchableHistory *)
void BeginOfTruthEvent(const G4Event *)
G4int ComputeEndCopyNb(G4int)
void EndOfEvent(G4HCofThisEvent *)
void ComputeThetaPhi(G4int, G4int, G4int)
G4int EndPhiNumberForGDML(G4int)
void Initialize(G4HCofThisEvent *)
BesEmcSD(G4String, BesEmcConstruction *, BesEmcGeometry *)
void EndOfTruthEvent(const G4Event *)
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.