Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 #include "Par04SensitiveDetector.hh" 27 28 #include "Par04EventInformation.hh" // for Pa 29 #include "Par04Hit.hh" // for Par04Hit, Par04 30 31 #include "G4Event.hh" // for G4Event 32 #include "G4EventManager.hh" // for G4EventMa 33 #include "G4HCofThisEvent.hh" // for G4HCofTh 34 #include "G4SDManager.hh" // for G4SDManager 35 #include "G4Step.hh" // for G4Step 36 #include "G4Track.hh" // for G4Track 37 38 #include <CLHEP/Vector/Rotation.h> // for Hep 39 #include <CLHEP/Vector/ThreeVector.h> // for 40 #include <G4CollectionNameVector.hh> // for G 41 #include <G4FastHit.hh> // for G4FastHit 42 #include <G4FastTrack.hh> // for G4FastTrack 43 #include <G4RotationMatrix.hh> // for G4Rotat 44 #include <G4StepPoint.hh> // for G4StepPoint 45 #include <G4THitsCollection.hh> // for G4THit 46 #include <G4ThreeVector.hh> // for G4ThreeVec 47 #include <G4VSensitiveDetector.hh> // for G4V 48 #include <G4VUserEventInformation.hh> // for 49 #include <cmath> // for floor 50 #include <cstddef> // for size_t 51 #include <vector> // for vector 52 53 //....oooOO0OOooo........oooOO0OOooo........oo 54 55 Par04SensitiveDetector::Par04SensitiveDetector 56 { 57 collectionName.insert("hits"); 58 } 59 //....oooOO0OOooo........oooOO0OOooo........oo 60 61 Par04SensitiveDetector::Par04SensitiveDetector 62 63 : G4VSensitiveDetector(aName), fMeshNbOfCell 64 { 65 collectionName.insert("hits"); 66 } 67 68 //....oooOO0OOooo........oooOO0OOooo........oo 69 70 Par04SensitiveDetector::~Par04SensitiveDetecto 71 72 //....oooOO0OOooo........oooOO0OOooo........oo 73 74 void Par04SensitiveDetector::Initialize(G4HCof 75 { 76 fHitsCollection = new Par04HitsCollection(Se 77 if (fHitCollectionID < 0) { 78 fHitCollectionID = G4SDManager::GetSDMpoin 79 } 80 aHCE->AddHitsCollection(fHitCollectionID, fH 81 82 // reset entrance position 83 fEntrancePosition.set(-1, -1, -1); 84 fEntranceDirection.set(-1, -1, -1); 85 } 86 87 //....oooOO0OOooo........oooOO0OOooo........oo 88 89 G4bool Par04SensitiveDetector::ProcessHits(G4S 90 { 91 G4double edep = aStep->GetTotalEnergyDeposit 92 if (edep == 0.) return true; 93 94 auto hit = RetrieveAndSetupHit(aStep->GetPos 95 if (hit == nullptr) return true; 96 97 // Add energy deposit from G4Step 98 hit->AddEdep(edep); 99 // Increment the counter 100 hit->AddNdep(1); 101 102 // Fill time information from G4Step 103 // If it's already filled, choose hit with e 104 if (hit->GetTime() == -1 || hit->GetTime() > 105 hit->SetTime(aStep->GetTrack()->GetGlobalT 106 107 // Set hit type to full simulation (only if 108 // sim) 109 if (hit->GetType() != 1) hit->SetType(0); 110 111 return true; 112 } 113 114 //....oooOO0OOooo........oooOO0OOooo........oo 115 116 G4bool Par04SensitiveDetector::ProcessHits(con 117 G4T 118 { 119 G4double edep = aHit->GetEnergy(); 120 if (edep == 0.) return true; 121 122 auto hit = RetrieveAndSetupHit(aHit->GetPosi 123 if (hit == nullptr) return true; 124 125 // Add energy deposit from G4FastHit 126 hit->AddEdep(edep); 127 // Increment the counter 128 hit->AddNdep(1); 129 130 // Fill time information from G4FastTrack 131 // If it's already filled, choose hit with e 132 if (hit->GetTime() == -1 || hit->GetTime() > 133 hit->SetTime(aTrack->GetPrimaryTrack()->Ge 134 } 135 136 // Set hit type to fast simulation (even if 137 // sim, overwrite it) 138 hit->SetType(1); 139 140 return true; 141 } 142 143 //....oooOO0OOooo........oooOO0OOooo........oo 144 145 Par04Hit* Par04SensitiveDetector::RetrieveAndS 146 { 147 if (fEntrancePosition.x() == -1) { 148 auto info = dynamic_cast<Par04EventInforma 149 G4EventManager::GetEventManager()->GetCo 150 if (info == nullptr) return nullptr; 151 fEntrancePosition = info->GetPosition(); 152 fEntranceDirection = info->GetDirection(); 153 } 154 155 auto delta = aGlobalPosition - fEntrancePosi 156 157 // Calculate rotation matrix along the parti 158 // It will rotate the shower axes to match t 159 G4RotationMatrix rotMatrix = G4RotationMatri 160 double particleTheta = fEntranceDirection.th 161 double particlePhi = fEntranceDirection.phi( 162 rotMatrix.rotateZ(-particlePhi); 163 rotMatrix.rotateY(-particleTheta); 164 G4RotationMatrix rotMatrixInv = CLHEP::inver 165 166 delta = rotMatrix * delta; 167 168 G4int rhoNo = std::floor(delta.perp() / fMes 169 G4int phiNo = std::floor((CLHEP::pi + delta. 170 G4int zNo = std::floor(delta.z() / fMeshSize 171 172 std::size_t hitID = 173 fMeshNbOfCells.x() * fMeshNbOfCells.z() * 174 175 if (zNo >= fMeshNbOfCells.z() || rhoNo >= fM 176 return nullptr; 177 } 178 179 auto hit = fHitsMap[hitID].get(); 180 if (hit == nullptr) { 181 fHitsMap[hitID] = std::unique_ptr<Par04Hit 182 hit = fHitsMap[hitID].get(); 183 hit->SetPhiId(phiNo); 184 hit->SetRhoId(rhoNo); 185 hit->SetZid(zNo); 186 hit->SetRot(rotMatrixInv); 187 hit->SetPos(fEntrancePosition 188 + rotMatrixInv * G4ThreeVector 189 } 190 return hit; 191 } 192 193 //....oooOO0OOooo........oooOO0OOooo........oo 194 195 void Par04SensitiveDetector::EndOfEvent(G4HCof 196 { 197 for (const auto& hits : fHitsMap) { 198 fHitsCollection->insert(new Par04Hit(*hits 199 } 200 fHitsMap.clear(); 201 } 202