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 // 27 // ------------------------------------------------------------ 28 // GEANT 4 class implementation file 29 // CERN Geneva Switzerland 30 // 31 // 32 // ------------ GammaRayTelCalorimeterSD ------ 33 // by R.Giannitrapani, F.Longo & G.Santin (13 nov 2000) 34 // 35 // ************************************************************ 36 37 #include "G4RunManager.hh" 38 #include "GammaRayTelCalorimeterSD.hh" 39 #include "GammaRayTelCalorimeterHit.hh" 40 #include "GammaRayTelDetectorConstruction.hh" 41 42 #include "G4SystemOfUnits.hh" 43 #include "G4VPhysicalVolume.hh" 44 #include "G4Step.hh" 45 #include "G4VTouchable.hh" 46 #include "G4TouchableHistory.hh" 47 #include "G4SDManager.hh" 48 #include "G4ios.hh" 49 50 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 51 52 GammaRayTelCalorimeterSD::GammaRayTelCalorimeterSD(G4String name) : G4VSensitiveDetector(name) { 53 auto *runManager = G4RunManager::GetRunManager(); 54 detector = (GammaRayTelDetectorConstruction*) (runManager->GetUserDetectorConstruction()); 55 56 numberOfCALBars = detector->GetNbOfCALBars(); 57 numberOfCALLayers = detector->GetNbOfCALLayers(); 58 59 // G4cout << NbOfCALBars << " bars " << G4endl; 60 // G4cout << NbOfCALLayers << " layers " << G4endl; 61 62 numberOfCALChannels = numberOfCALBars * numberOfCALLayers; 63 64 calHitXID = new G4int[numberOfCALChannels]; 65 calHitYID = new G4int[numberOfCALChannels]; 66 collectionName.insert("CalorimeterCollection"); 67 } 68 69 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 70 71 GammaRayTelCalorimeterSD::~GammaRayTelCalorimeterSD() { 72 delete[] calHitXID; 73 delete[] calHitYID; 74 } 75 76 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 77 78 void GammaRayTelCalorimeterSD::Initialize(G4HCofThisEvent*) { 79 calorimeterCollection = new GammaRayTelCalorimeterHitsCollection(SensitiveDetectorName, collectionName[0]); 80 for (auto i = 0; i < numberOfCALChannels; i++) { 81 calHitXID[i] = -1; 82 calHitYID[i] = -1; 83 } 84 } 85 86 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 87 88 auto GammaRayTelCalorimeterSD::ProcessHits(G4Step *step, G4TouchableHistory*) -> G4bool { 89 G4double depositedEnergy = 0.; 90 depositedEnergy = step->GetTotalEnergyDeposit(); 91 if (depositedEnergy == 0.) { 92 return false; 93 } 94 95 // This TouchableHistory is used to obtain the physical volume of the hit 96 auto *theTouchable = (G4TouchableHistory*) (step->GetPreStepPoint()->GetTouchable()); 97 auto *calorimeterBar = theTouchable->GetVolume(); 98 auto *calorimeterPlane = theTouchable->GetVolume(1); 99 auto calorimeterBarNumber = calorimeterBar->GetCopyNo(); 100 auto calorimeterBarName = calorimeterBar->GetName(); 101 102 G4int planeNumber{0}; 103 planeNumber = calorimeterPlane->GetCopyNo(); 104 105 auto planeName = calorimeterPlane->GetName(); 106 107 G4int NChannel = 0; 108 NChannel = planeNumber * numberOfCALBars + calorimeterBarNumber; 109 110 if (planeName == "CALLayerX") { // The hit is on a X CsI (cesium iodide) plane 111 if (calHitXID[NChannel] == -1) { // This is a new hit 112 auto *calorimeterHit = new GammaRayTelCalorimeterHit; 113 calorimeterHit->SetCALType(1); 114 calorimeterHit->AddEnergy(depositedEnergy); 115 calorimeterHit->SetPosition(step->GetPreStepPoint()->GetPosition()); 116 calorimeterHit->SetCALPlaneNumber(planeNumber); 117 calorimeterHit->SetCALBarNumber(calorimeterBarNumber); 118 calHitXID[NChannel] = calorimeterCollection->insert(calorimeterHit) - 1; 119 } else { // This is not new 120 (*calorimeterCollection)[calHitXID[NChannel]]->AddEnergy(depositedEnergy); 121 } 122 } 123 124 if (planeName == "CALLayerY") { // The hit is on an Y CsI (cesium iodide) plane 125 if (calHitYID[NChannel] == -1) { // This is a new hit 126 auto *calorimeterHit = new GammaRayTelCalorimeterHit; 127 calorimeterHit->SetCALType(0); 128 calorimeterHit->AddEnergy(depositedEnergy); 129 calorimeterHit->SetPosition(step->GetPreStepPoint()->GetPosition()); 130 calorimeterHit->SetCALPlaneNumber(planeNumber); 131 calorimeterHit->SetCALBarNumber(calorimeterBarNumber); 132 calHitYID[NChannel] = calorimeterCollection->insert(calorimeterHit) - 1; 133 } else { // This is not new 134 (*calorimeterCollection)[calHitYID[NChannel]]->AddEnergy(depositedEnergy); 135 } 136 } 137 138 return true; 139 } 140 141 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 142 143 void GammaRayTelCalorimeterSD::EndOfEvent(G4HCofThisEvent *HCE) { 144 static G4int collectionIdentifier = -1; 145 if (collectionIdentifier < 0) { 146 collectionIdentifier = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]); 147 } 148 HCE->AddHitsCollection(collectionIdentifier, calorimeterCollection); 149 150 for (auto i = 0; i < numberOfCALChannels; i++) { 151 calHitXID[i] = -1; 152 calHitYID[i] = -1; 153 } 154 } 155 156 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 157 158 void GammaRayTelCalorimeterSD::clear() { 159 } 160 161 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 162 163 void GammaRayTelCalorimeterSD::DrawAll() { 164 } 165 166 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 167 168 void GammaRayTelCalorimeterSD::PrintAll() { 169 } 170