Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 #include "SiPMSD.hh" 26 #include "SiPMSD.hh" 27 27 28 SiPMSD::SiPMSD(G4String name) : G4VSensitiveDe 28 SiPMSD::SiPMSD(G4String name) : G4VSensitiveDetector("SiPMHitCollection") { 29 G4cout << "creating a sensitive detector wit 29 G4cout << "creating a sensitive detector with name: " << name << G4endl; 30 collectionName.insert("SiPMHitCollection"); 30 collectionName.insert("SiPMHitCollection"); 31 } 31 } 32 32 33 SiPMSD::~SiPMSD() {} 33 SiPMSD::~SiPMSD() {} 34 34 35 void SiPMSD::Initialize(G4HCofThisEvent *HCE) 35 void SiPMSD::Initialize(G4HCofThisEvent *HCE) { 36 fHitCollection = new SiPMHitCollection(GetNa 36 fHitCollection = new SiPMHitCollection(GetName(), collectionName[0]); 37 37 38 if (fHCID < 0) 38 if (fHCID < 0) 39 fHCID = GetCollectionID(0); 39 fHCID = GetCollectionID(0); 40 HCE->AddHitsCollection(fHCID, fHitCollection 40 HCE->AddHitsCollection(fHCID, fHitCollection); 41 41 42 fTmpHits.clear(); 42 fTmpHits.clear(); 43 } 43 } 44 void SiPMSD::EndOfEvent(G4HCofThisEvent *) { 44 void SiPMSD::EndOfEvent(G4HCofThisEvent *) { 45 for (auto it = fTmpHits.begin(); it != fTmpH 45 for (auto it = fTmpHits.begin(); it != fTmpHits.end(); ++it) 46 fHitCollection->insert(it->second); 46 fHitCollection->insert(it->second); 47 } 47 } 48 48 49 G4bool SiPMSD::ProcessHits(G4Step *step, G4Tou 49 G4bool SiPMSD::ProcessHits(G4Step *step, G4TouchableHistory *) { 50 G4TouchableHandle touchable = step->GetPreSt 50 G4TouchableHandle touchable = step->GetPreStepPoint()->GetTouchableHandle(); 51 51 52 G4int copyNumCell = touchable->GetVolume(0)- 52 G4int copyNumCell = touchable->GetVolume(0)->GetCopyNo(); 53 G4int copyNumSensor = touchable->GetVolume(1 53 G4int copyNumSensor = touchable->GetVolume(1)->GetCopyNo(); 54 int tmp_ID = 1000 * copyNumSensor + copyNumC 54 int tmp_ID = 1000 * copyNumSensor + copyNumCell; 55 if (fTmpHits.find(tmp_ID) == fTmpHits.end()) 55 if (fTmpHits.find(tmp_ID) == fTmpHits.end()) { // make new hit 56 G4String vol_name = touchable->GetVolume(0 56 G4String vol_name = touchable->GetVolume(0)->GetName(); 57 fTmpHits[tmp_ID] = new SiPMHit(vol_name, c 57 fTmpHits[tmp_ID] = new SiPMHit(vol_name, copyNumSensor, copyNumCell); 58 G4double hitX = (touchable->GetVolume(1)-> 58 G4double hitX = (touchable->GetVolume(1)->GetTranslation().x() + 59 touchable->GetVolume(0)-> 59 touchable->GetVolume(0)->GetTranslation().x()) / 60 CLHEP::cm; 60 CLHEP::cm; 61 G4double hitY = (touchable->GetVolume(1)-> 61 G4double hitY = (touchable->GetVolume(1)->GetTranslation().x() + 62 touchable->GetVolume(0)-> 62 touchable->GetVolume(0)->GetTranslation().y()) / 63 CLHEP::cm; 63 CLHEP::cm; 64 G4double hitZ = touchable->GetVolume(1)->G 64 G4double hitZ = touchable->GetVolume(1)->GetTranslation().z() / CLHEP::cm; 65 fTmpHits[tmp_ID]->SetPosition(hitX, hitY, 65 fTmpHits[tmp_ID]->SetPosition(hitX, hitY, hitZ); // in cm 66 } 66 } 67 67 68 G4double edep = step->GetTotalEnergyDeposit( 68 G4double edep = step->GetTotalEnergyDeposit() / CLHEP::keV; // in keV 69 G4double edepNonIonizing = step->GetNonIoniz 69 G4double edepNonIonizing = step->GetNonIonizingEnergyDeposit() / CLHEP::keV; 70 70 71 G4double timedep = step->GetPostStepPoint()- 71 G4double timedep = step->GetPostStepPoint()->GetGlobalTime() / CLHEP::ns; 72 72 73 fTmpHits[tmp_ID]->AddEdep(edep, timedep); 73 fTmpHits[tmp_ID]->AddEdep(edep, timedep); 74 fTmpHits[tmp_ID]->AddEdepNonIonizing(edepNon 74 fTmpHits[tmp_ID]->AddEdepNonIonizing(edepNonIonizing, timedep); 75 75 76 return true; 76 return true; 77 } 77 } 78 78