15#include "G4VPhysicalVolume.hh"
17#include "G4VTouchable.hh"
18#include "G4TouchableHistory.hh"
19#include "G4SDManager.hh"
36 ,Detector(det),fBesEmcGeometry(besEMCGeometry)
38 collectionName.insert(
"BesEmcHitsCollection");
39 collectionName.insert(
"BesEmcHitsList");
40 collectionName.insert(
"BesEmcTruthHitsList");
41 HitID =
new G4int[40000];
56 (SensitiveDetectorName,collectionName[0]);
57 for (G4int j=0;j<40000;j++)
67 (SensitiveDetectorName,collectionName[1]);
69 (SensitiveDetectorName,collectionName[2]);
77 HLID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[1]);
78 G4HCofThisEvent* HCE = evt->GetHCofThisEvent();
79 HCE->AddHitsCollection(HLID,CalList);
83 HTID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[2]);
84 HCE->AddHitsCollection(HTID,CalTruthList);
92 gErrorIgnoreLevel = kFatal;
94 G4double edep = aStep->GetTotalEnergyDeposit();
95 G4double stepl = aStep->GetStepLength();
96 if ((edep==0.)&&(stepl==0.))
return false;
98 G4TouchableHistory* theTouchable
99 = (G4TouchableHistory*)(aStep->GetPreStepPoint()->GetTouchable());
100 G4VPhysicalVolume* physVol = theTouchable->GetVolume();
102 if(physVol->GetName().contains(
"physicalCrystal"))
105 CryNumberPhi=theTouchable->GetReplicaNumber(2);
106 CryNumberTheta=theTouchable->GetReplicaNumber(1);
108 else if(physVol->GetName().contains(
"logicalCrystal"))
111 std::istringstream thetaBuf((theTouchable->GetVolume(1)->GetName()).substr(16,2));
112 thetaBuf >> CryNumberTheta ;
113 CryNumberPhi = 308-theTouchable->GetCopyNumber(2);
115 else if(physVol->GetName().contains(
"physicalEndCrystal"))
117 PartId=theTouchable->GetReplicaNumber(3);
118 G4int endSector=theTouchable->GetReplicaNumber(2);
119 G4int endNb=theTouchable->GetReplicaNumber(0);
122 else if(physVol->GetName().contains(
"logicalEndCrystal"))
124 PartId=2-2*theTouchable->GetCopyNumber(3);
125 G4int endSector=theTouchable->GetCopyNumber(2);
126 G4int endNb,endNbGDML;
127 std::istringstream thetaBuf((theTouchable->GetVolume(0)->GetName()).substr(20,2));
133 else if(physVol->GetName().contains(
"physicalPD"))
137 CryNumberPhi=theTouchable->GetReplicaNumber(2);
138 CryNumberTheta=theTouchable->GetReplicaNumber(1);
140 else if(physVol->GetName().contains(
"logicalPD"))
144 G4int nb=theTouchable->GetCopyNumber(1);
148 CryNumberTheta = 43-(nb-2)/5;
150 CryNumberPhi = 308-theTouchable->GetCopyNumber(2);
154 G4cout <<
"(Check ID)New EMC Hit on crystal: "
155 << CryNumberPhi <<
"(phi)"
156 << CryNumberTheta <<
"(theta)"
157 <<
" and the volume is " << physVol->GetName()
161 G4int trackId = aStep->GetTrack()->GetTrackID();
168 calHit->
SetPosCrystal(aStep->GetPreStepPoint()->GetPosition());
169 calHit->
SetTimeCrystal(aStep->GetPreStepPoint()->GetGlobalTime());
170 calHit->
SetMomentum(aStep->GetPreStepPoint()->GetMomentum());
174 G4int idhit = CalCollection->insert(calHit)-1;
175 if(nHit<40000) HitID[nHit]=idhit;
188 G4int trackIndex, g4TrackId;
192 if(m_trackIndex != trackIndex)
194 m_trackIndex = trackIndex;
197 G4int pdg =
abs(aStep->GetTrack()->GetDefinition()->GetPDGEncoding());
198 if(pdg==12 || pdg==14 || pdg==16) {
202 if(
flag && aStep->GetTrack()->GetTrackID()==g4TrackId )
209 truHit->
SetPosCrystal(aStep->GetPreStepPoint()->GetPosition());
210 truHit->
SetTimeCrystal(aStep->GetPreStepPoint()->GetGlobalTime());
211 truHit->
SetMomentum(aStep->GetPreStepPoint()->GetMomentum());
213 CalList->insert(truHit);
217 else if(m_trackIndex == trackIndex)
219 G4int length = CalList->entries();
222 for(G4int i=0;i<length;i++)
239 G4int trackIndex, g4TrackId;
244 if(CalTruthList->entries()>0) {
245 for(G4int i=0;i<CalTruthList->entries();i++) {
250 if(oldHit->
Find(
id)!=oldHit->
End()) {
261 G4int pdg =
abs(aStep->GetTrack()->GetDefinition()->GetPDGEncoding());
262 if(!(pdg==12 || pdg==14 || pdg==16)) {
270 if(aStep->GetTrack()->GetTrackID()==g4TrackId) {
272 truHit->
SetPDGCode(aStep->GetTrack()->GetDefinition()->GetPDGEncoding());
273 truHit->
SetPDGCharge(aStep->GetTrack()->GetDefinition()->GetPDGCharge());
274 truHit->
SetParticleName(aStep->GetTrack()->GetDefinition()->GetParticleName());
275 truHit->
SetTime(aStep->GetPreStepPoint()->GetGlobalTime());
276 truHit->
SetPosition(aStep->GetPreStepPoint()->GetPosition());
277 truHit->
SetMomentum(aStep->GetPreStepPoint()->GetMomentum());
282 std::vector<BesTruthTrack*> *trackList = sensitiveManager->
GetTrackList();
284 for(
unsigned i=0;i<trackList->size();i++) {
287 if(trackIndex==truthTrack->
GetIndex()) {
307 CalTruthList->insert(truHit);
319 if((sector>=0)&&(sector<3))
326 CryNumberPhi = (sector-3)*4+nb;
328 else if((nb>=4)&&(nb<8))
331 CryNumberPhi = (sector-3)*4+nb-4;
333 else if((nb>=8)&&(nb<13))
336 CryNumberPhi = (sector-3)*5+nb-8;
338 else if((nb>=13)&&(nb<18))
341 CryNumberPhi = (sector-3)*5+nb-13;
343 else if((nb>=18)&&(nb<24))
346 CryNumberPhi = (sector-3)*6+nb-18;
348 else if((nb>=24)&&(nb<30))
351 CryNumberPhi = (sector-3)*6+nb-24;
390 switch(CryNumberTheta)
394 CryNumberPhi = 31-CryNumberPhi;
396 CryNumberPhi = 95-CryNumberPhi;
400 CryNumberPhi = 31-CryNumberPhi;
402 CryNumberPhi = 95-CryNumberPhi;
406 CryNumberPhi = 39-CryNumberPhi;
408 CryNumberPhi = 119-CryNumberPhi;
412 CryNumberPhi = 39-CryNumberPhi;
414 CryNumberPhi = 119-CryNumberPhi;
418 CryNumberPhi = 47-CryNumberPhi;
420 CryNumberPhi = 143-CryNumberPhi;
424 CryNumberPhi = 47-CryNumberPhi;
426 CryNumberPhi = 143-CryNumberPhi;
435 if(copyNb<0||copyNb>15) {
437 G4cout<<
"Wrong copy number of EMC Endcap Phi Volume!"<<G4endl;
441 if(copyNb==0||copyNb==1) {
443 }
else if(copyNb==2||copyNb==3) {
445 }
else if(copyNb<=9) {
482 static G4int HCID = -1;
484 { HCID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]); }
485 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.