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 // ------------ GammaRayTelTrackerSD ------ 33 // by R.Giannitrapani, F.Longo & G.Santin (13 nov 2000) 34 // 35 // ************************************************************ 36 37 #include "GammaRayTelTrackerSD.hh" 38 #include "GammaRayTelTrackerHit.hh" 39 #include "GammaRayTelDetectorConstruction.hh" 40 41 #include "G4RunManager.hh" 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 GammaRayTelTrackerSD::GammaRayTelTrackerSD(G4String name) : G4VSensitiveDetector(name) { 53 auto *runManager = G4RunManager::GetRunManager(); 54 55 detector = (GammaRayTelDetectorConstruction*) (runManager->GetUserDetectorConstruction()); 56 57 auto numberOfTKRTiles = detector->GetNbOfTKRTiles(); 58 numberOfTKRStrips = detector->GetNbOfTKRStrips(); 59 numberOfTKRLayers = detector->GetNbOfTKRLayers(); 60 numberOfTKRStrips = numberOfTKRStrips * numberOfTKRTiles; 61 numberOfTKRChannels = numberOfTKRStrips * numberOfTKRTiles * numberOfTKRLayers; 62 63 tkrHitXID = new G4int[numberOfTKRChannels]; 64 tkrHitYID = new G4int[numberOfTKRChannels]; 65 66 constexpr auto TRACKER_COLLECTION_NAME = "TrackerCollection"; 67 collectionName.insert(TRACKER_COLLECTION_NAME); 68 } 69 70 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 71 72 GammaRayTelTrackerSD::~GammaRayTelTrackerSD() { 73 delete[] tkrHitXID; 74 delete[] tkrHitYID; 75 } 76 77 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 78 79 void GammaRayTelTrackerSD::Initialize(G4HCofThisEvent*) { 80 trackerCollection = new GammaRayTelTrackerHitsCollection(SensitiveDetectorName, collectionName[0]); 81 82 for (auto i = 0; i < numberOfTKRChannels; i++) { 83 tkrHitXID[i] = -1; 84 tkrHitYID[i] = -1; 85 }; 86 } 87 88 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 89 90 auto GammaRayTelTrackerSD::ProcessHits(G4Step *step, G4TouchableHistory*) -> G4bool { 91 G4double depositedEnergy = 0.; 92 depositedEnergy = step->GetTotalEnergyDeposit(); 93 if (depositedEnergy == 0.) { 94 return false; 95 } 96 97 auto totalNumberOfStrips = detector->GetNbOfTKRStrips(); 98 auto totalnumberOfTiles = detector->GetNbOfTKRTiles(); 99 100 // This TouchableHistory is used to obtain the physical volume of the hit 101 auto *touchable = (G4TouchableHistory*) (step->GetPreStepPoint()->GetTouchable()); 102 auto *plane = touchable->GetVolume(2); 103 104 G4int planeNumber = 0; 105 planeNumber = plane->GetCopyNo(); 106 auto planeName = plane->GetName(); 107 108 // The hits sees now the real strip 109 110 G4int stripNumber = 0; 111 G4VPhysicalVolume *strip{nullptr}; 112 strip = touchable->GetVolume(); 113 114 G4String stripName = strip->GetName(); 115 stripNumber = strip->GetCopyNo(); 116 117 auto *tile = touchable->GetVolume(1); 118 auto tileNumber = tile->GetCopyNo(); 119 auto tileName = tile->GetName(); 120 auto NTile = (tileNumber % totalnumberOfTiles); 121 122 G4int channelNumber = 0; 123 124 for (auto j = 0; j < totalnumberOfTiles; j++) { 125 if (NTile == j) { 126 stripNumber += totalNumberOfStrips * NTile; 127 } 128 } 129 130 channelNumber = planeNumber * totalnumberOfTiles * totalNumberOfStrips + stripNumber; 131 132 /* 133 G4cout << " Channel: " << channelNumber << G4endl; 134 G4cout << " Plane: " << planeNumber << " " << planeName << G4endl; 135 G4cout << " Strip: " << stripNumber << " " << stripName << G4endl; 136 */ 137 138 // The hit is on an X silicon plane 139 if (planeName == "TKRDetectorX") { 140 if (tkrHitXID[channelNumber] == -1) { // This is a new hit 141 auto *trackerHit = new GammaRayTelTrackerHit; 142 trackerHit->SetPlaneType(1); 143 trackerHit->AddDepositedEnergy(depositedEnergy); 144 trackerHit->SetPosition(step->GetPreStepPoint()->GetPosition()); 145 trackerHit->SetSiliconPlaneNumber(planeNumber); 146 trackerHit->SetStripNumber(stripNumber); 147 tkrHitXID[channelNumber] = trackerCollection->insert(trackerHit) - 1; 148 } else { // This is not new 149 (*trackerCollection)[tkrHitXID[channelNumber]]->AddDepositedEnergy(depositedEnergy); 150 // G4cout << "X" << planeNumber << " " << stripNumber << G4endl; 151 } 152 } 153 154 // The hit is on an Y silicon plane 155 if (planeName == "TKRDetectorY") { 156 if (tkrHitYID[channelNumber] == -1) { // This is a new hit 157 auto *trackerHit = new GammaRayTelTrackerHit; 158 trackerHit->SetPlaneType(0); 159 trackerHit->AddDepositedEnergy(depositedEnergy); 160 trackerHit->SetPosition(step->GetPreStepPoint()->GetPosition()); 161 trackerHit->SetSiliconPlaneNumber(planeNumber); 162 trackerHit->SetStripNumber(stripNumber); 163 tkrHitYID[channelNumber] = trackerCollection->insert(trackerHit) - 1; 164 } else { // This is not new 165 (*trackerCollection)[tkrHitYID[channelNumber]]->AddDepositedEnergy(depositedEnergy); 166 // G4cout << "Y" << planeNumber << " " << stripNumber << G4endl; 167 } 168 } 169 170 return true; 171 } 172 173 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 174 175 void GammaRayTelTrackerSD::EndOfEvent(G4HCofThisEvent *collection) { 176 static G4int collectionIdentifier = -1; 177 if (collectionIdentifier < 0) { 178 collectionIdentifier = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]); 179 } 180 collection->AddHitsCollection(collectionIdentifier, trackerCollection); 181 182 for (auto i = 0; i < numberOfTKRChannels; i++) { 183 tkrHitXID[i] = -1; 184 tkrHitYID[i] = -1; 185 } 186 } 187 188 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 189 190 void GammaRayTelTrackerSD::clear() { 191 } 192 193 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 194 195 void GammaRayTelTrackerSD::DrawAll() { 196 } 197 198 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 199 200 void GammaRayTelTrackerSD::PrintAll() { 201 } 202