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