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 "SiliconPixelSD.hh" 27 28 #include "G4String.hh" 29 30 SiliconPixelSD::SiliconPixelSD(G4String name) 31 : G4VSensitiveDetector("SiliconPixelHitCollection") { 32 G4cout << "creating a sensitive detector with name: " << name << G4endl; 33 collectionName.insert("SiliconPixelHitCollection"); 34 } 35 36 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 37 38 SiliconPixelSD::~SiliconPixelSD() {} 39 40 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 41 42 void SiliconPixelSD::Initialize(G4HCofThisEvent *HCE) { 43 fHitCollection = new SiliconPixelHitCollection(GetName(), collectionName[0]); 44 45 if (fHCID < 0) 46 fHCID = GetCollectionID(0); 47 HCE->AddHitsCollection(fHCID, fHitCollection); 48 49 fTmpHits.clear(); 50 } 51 52 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 53 54 void SiliconPixelSD::EndOfEvent(G4HCofThisEvent *) { 55 for (auto it = fTmpHits.begin(); it != fTmpHits.end(); ++it) 56 fHitCollection->insert(it->second); 57 } 58 59 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 60 61 G4bool SiliconPixelSD::ProcessHits(G4Step *step, G4TouchableHistory *) { 62 G4TouchableHandle touchable = step->GetPreStepPoint()->GetTouchableHandle(); 63 64 G4int copyNumCell = touchable->GetVolume(0)->GetCopyNo(); 65 G4int copyNumSensor = touchable->GetVolume(1)->GetCopyNo(); 66 int tmp_ID = 1000 * copyNumSensor + copyNumCell; 67 if (fTmpHits.find(tmp_ID) == fTmpHits.end()) { // make new hit 68 G4String vol_name = touchable->GetVolume(0)->GetName(); 69 fTmpHits[tmp_ID] = 70 new SiliconPixelHit(vol_name, copyNumSensor, copyNumCell); 71 G4double hitX = (touchable->GetVolume(1)->GetTranslation().x() + 72 touchable->GetVolume(0)->GetTranslation().x()) / 73 CLHEP::cm; 74 G4double hitY = (touchable->GetVolume(1)->GetTranslation().y() + 75 touchable->GetVolume(0)->GetTranslation().y()) / 76 CLHEP::cm; 77 G4double hitZ = touchable->GetVolume(1)->GetTranslation().z() / CLHEP::cm; 78 fTmpHits[tmp_ID]->SetPosition(hitX, hitY, hitZ); // in cm 79 } 80 81 G4double edep = step->GetTotalEnergyDeposit() / CLHEP::keV; // in keV 82 G4double edepNonIonizing = step->GetNonIonizingEnergyDeposit() / CLHEP::keV; 83 84 G4double timedep = step->GetPostStepPoint()->GetGlobalTime() / CLHEP::ns; 85 86 fTmpHits[tmp_ID]->AddEdep(edep, timedep); 87 fTmpHits[tmp_ID]->AddEdepNonIonizing(edepNonIonizing, timedep); 88 89 return true; 90 } 91 92 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 93