Warning, file /geant4/examples/extended/optical/LXe/src/LXePMTSD.cc was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
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 }