File indexing completed on 2026-05-01 07:39:07
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 #include "LXePMTSD.hh"
0030
0031 #include "LXeDetectorConstruction.hh"
0032 #include "LXePMTHit.hh"
0033 #include "LXeUserTrackInformation.hh"
0034
0035 #include "G4LogicalVolume.hh"
0036 #include "G4ParticleDefinition.hh"
0037 #include "G4ParticleTypes.hh"
0038 #include "G4SDManager.hh"
0039 #include "G4Step.hh"
0040 #include "G4TouchableHistory.hh"
0041 #include "G4Track.hh"
0042 #include "G4VPhysicalVolume.hh"
0043 #include "G4VTouchable.hh"
0044 #include "G4ios.hh"
0045
0046
0047
0048 LXePMTSD::LXePMTSD(G4String name) : G4VSensitiveDetector(name)
0049 {
0050 collectionName.insert("pmtHitCollection");
0051 }
0052
0053
0054
0055 LXePMTSD::~LXePMTSD()
0056 {
0057 delete fPMTPositionsX;
0058 delete fPMTPositionsY;
0059 delete fPMTPositionsZ;
0060 }
0061
0062
0063
0064 void LXePMTSD::SetPmtPositions(const std::vector<G4ThreeVector>& positions)
0065 {
0066 for (size_t i = 0; i < positions.size(); ++i) {
0067 if (fPMTPositionsX) fPMTPositionsX->push_back(positions[i].x());
0068 if (fPMTPositionsY) fPMTPositionsY->push_back(positions[i].y());
0069 if (fPMTPositionsZ) fPMTPositionsZ->push_back(positions[i].z());
0070 }
0071 }
0072
0073
0074
0075 void LXePMTSD::Initialize(G4HCofThisEvent* hitsCE)
0076 {
0077 fPMTHitCollection = new LXePMTHitsCollection(SensitiveDetectorName, collectionName[0]);
0078
0079 if (fHitCID < 0) {
0080 fHitCID = G4SDManager::GetSDMpointer()->GetCollectionID(fPMTHitCollection);
0081 }
0082 hitsCE->AddHitsCollection(fHitCID, fPMTHitCollection);
0083 }
0084
0085
0086
0087 G4bool LXePMTSD::ProcessHits(G4Step*, G4TouchableHistory*)
0088 {
0089 return false;
0090 }
0091
0092
0093
0094
0095
0096
0097
0098 G4bool LXePMTSD::ProcessHits_boundary(const G4Step* aStep, G4TouchableHistory*)
0099 {
0100
0101 if (aStep->GetTrack()->GetDefinition() != G4OpticalPhoton::OpticalPhotonDefinition())
0102 return false;
0103
0104
0105
0106 G4int pmtNumber = aStep->GetPostStepPoint()->GetTouchable()->GetReplicaNumber(1);
0107 G4VPhysicalVolume* physVol = aStep->GetPostStepPoint()->GetTouchable()->GetVolume(1);
0108
0109
0110 size_t n = fPMTHitCollection->entries();
0111 LXePMTHit* hit = nullptr;
0112 for (size_t i = 0; i < n; ++i) {
0113 if ((*fPMTHitCollection)[i]->GetPMTNumber() == pmtNumber) {
0114 hit = (*fPMTHitCollection)[i];
0115 break;
0116 }
0117 }
0118
0119 if (hit == nullptr) {
0120 hit = new LXePMTHit();
0121 hit->SetPMTNumber(pmtNumber);
0122 hit->SetPMTPhysVol(physVol);
0123 fPMTHitCollection->insert(hit);
0124 hit->SetPMTPos((*fPMTPositionsX)[pmtNumber], (*fPMTPositionsY)[pmtNumber],
0125 (*fPMTPositionsZ)[pmtNumber]);
0126 }
0127
0128 hit->IncPhotonCount();
0129
0130 if (!LXeDetectorConstruction::GetSphereOn()) {
0131 hit->SetDrawit(true);
0132
0133 }
0134 else {
0135 auto trackInfo = (LXeUserTrackInformation*)aStep->GetTrack()->GetUserInformation();
0136 if (trackInfo->GetTrackStatus() & hitSphere)
0137
0138 hit->SetDrawit(true);
0139 }
0140
0141 return true;
0142 }