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 // 26 // 27 // ------------------------------------------- 27 // ------------------------------------------------------------ 28 // GEANT 4 class implementation file 28 // GEANT 4 class implementation file 29 // CERN Geneva Switzerland 29 // CERN Geneva Switzerland 30 // 30 // 31 // 31 // 32 // ------------ GammaRayTelTrackerSD --- 32 // ------------ GammaRayTelTrackerSD ------ 33 // by R.Giannitrapani, F.Longo & G. 33 // by R.Giannitrapani, F.Longo & G.Santin (13 nov 2000) 34 // 34 // 35 // ******************************************* 35 // ************************************************************ 36 << 36 #include "G4RunManager.hh" 37 #include "GammaRayTelTrackerSD.hh" 37 #include "GammaRayTelTrackerSD.hh" >> 38 38 #include "GammaRayTelTrackerHit.hh" 39 #include "GammaRayTelTrackerHit.hh" 39 #include "GammaRayTelDetectorConstruction.hh" 40 #include "GammaRayTelDetectorConstruction.hh" 40 41 41 #include "G4RunManager.hh" << 42 #include "G4SystemOfUnits.hh" 42 #include "G4SystemOfUnits.hh" 43 #include "G4VPhysicalVolume.hh" 43 #include "G4VPhysicalVolume.hh" >> 44 44 #include "G4Step.hh" 45 #include "G4Step.hh" 45 #include "G4VTouchable.hh" 46 #include "G4VTouchable.hh" 46 #include "G4TouchableHistory.hh" 47 #include "G4TouchableHistory.hh" 47 #include "G4SDManager.hh" 48 #include "G4SDManager.hh" >> 49 48 #include "G4ios.hh" 50 #include "G4ios.hh" 49 51 50 //....oooOO0OOooo........oooOO0OOooo........oo 52 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 51 53 52 GammaRayTelTrackerSD::GammaRayTelTrackerSD(G4S << 54 GammaRayTelTrackerSD::GammaRayTelTrackerSD(G4String name):G4VSensitiveDetector(name) 53 auto *runManager = G4RunManager::GetRunMan << 55 { 54 << 56 G4RunManager* runManager = G4RunManager::GetRunManager(); 55 detector = (GammaRayTelDetectorConstructio << 57 Detector = 56 << 58 (GammaRayTelDetectorConstruction*)(runManager->GetUserDetectorConstruction()); 57 auto numberOfTKRTiles = detector->GetNbOfT << 59 58 numberOfTKRStrips = detector->GetNbOfTKRSt << 60 G4int NbOfTKRTiles = Detector->GetNbOfTKRTiles(); 59 numberOfTKRLayers = detector->GetNbOfTKRLa << 61 NbOfTKRStrips = Detector->GetNbOfTKRStrips(); 60 numberOfTKRStrips = numberOfTKRStrips * nu << 62 NbOfTKRLayers = Detector->GetNbOfTKRLayers(); 61 numberOfTKRChannels = numberOfTKRStrips * << 63 NbOfTKRStrips = NbOfTKRStrips*NbOfTKRTiles; 62 << 64 63 tkrHitXID = new G4int[numberOfTKRChannels] << 65 NbOfTKRChannels = NbOfTKRStrips* NbOfTKRTiles * NbOfTKRLayers; 64 tkrHitYID = new G4int[numberOfTKRChannels] << 66 65 << 67 ThitXID = new G4int[NbOfTKRChannels]; 66 constexpr auto TRACKER_COLLECTION_NAME = " << 68 ThitYID = new G4int[NbOfTKRChannels]; 67 collectionName.insert(TRACKER_COLLECTION_N << 69 collectionName.insert("TrackerCollection"); >> 70 } >> 71 >> 72 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 73 >> 74 GammaRayTelTrackerSD::~GammaRayTelTrackerSD() >> 75 { >> 76 delete [] ThitXID; >> 77 delete [] ThitYID; >> 78 } >> 79 >> 80 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 81 >> 82 void GammaRayTelTrackerSD::Initialize(G4HCofThisEvent*) >> 83 { >> 84 TrackerCollection = new GammaRayTelTrackerHitsCollection >> 85 (SensitiveDetectorName,collectionName[0]); >> 86 >> 87 for (G4int i=0;i<NbOfTKRChannels;i++) >> 88 { >> 89 ThitXID[i] = -1; >> 90 ThitYID[i] = -1; >> 91 }; >> 92 } >> 93 >> 94 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 95 >> 96 G4bool GammaRayTelTrackerSD::ProcessHits(G4Step* aStep,G4TouchableHistory* ) >> 97 { >> 98 >> 99 G4double edep = aStep->GetTotalEnergyDeposit(); >> 100 if ((edep/keV == 0.)) return false; >> 101 >> 102 G4int StripTotal = Detector->GetNbOfTKRStrips(); >> 103 G4int TileTotal = Detector->GetNbOfTKRTiles(); >> 104 >> 105 // This TouchableHistory is used to obtain the physical volume >> 106 // of the hit >> 107 G4TouchableHistory* theTouchable >> 108 = (G4TouchableHistory*)(aStep->GetPreStepPoint()->GetTouchable()); >> 109 >> 110 //G4VPhysicalVolume* phys_tile = theTouchable->GetVolume(); >> 111 >> 112 G4VPhysicalVolume* plane = theTouchable->GetVolume(2); >> 113 >> 114 G4int PlaneNumber = 0; >> 115 PlaneNumber=plane->GetCopyNo(); >> 116 G4String PlaneName = plane->GetName(); >> 117 >> 118 // The hits sees now the real strip >> 119 >> 120 G4int StripNumber = 0; >> 121 G4VPhysicalVolume* strip = 0; >> 122 strip = theTouchable->GetVolume(); >> 123 >> 124 G4String StripName = strip->GetName(); >> 125 StripNumber= strip->GetCopyNo(); >> 126 >> 127 G4VPhysicalVolume* tile = theTouchable->GetVolume(1); >> 128 G4int TileNumber = tile->GetCopyNo(); >> 129 G4String TileName = tile->GetName(); >> 130 >> 131 G4int NTile = (TileNumber%TileTotal); >> 132 G4int j=0; >> 133 >> 134 G4int NChannel = 0; >> 135 >> 136 for (j=0;j<TileTotal;j++) >> 137 { >> 138 if(NTile==j) StripNumber += StripTotal*NTile; >> 139 } >> 140 >> 141 NChannel = PlaneNumber*TileTotal*StripTotal + StripNumber; >> 142 >> 143 /* G4cout << NChannel << " Channel Number" << G4endl; >> 144 G4cout << " Plane Number = " << PlaneNumber << " " << PlaneName >> 145 << G4endl; >> 146 G4cout << StripName << " " << StripNumber << G4endl; */ >> 147 >> 148 if (PlaneName == "TKRDetectorX" ) >> 149 // The hit is on an X silicon plane >> 150 { >> 151 // This is a new hit >> 152 if (ThitXID[NChannel]==-1) >> 153 { >> 154 GammaRayTelTrackerHit* TrackerHit = new GammaRayTelTrackerHit; >> 155 TrackerHit->SetPlaneType(1); >> 156 TrackerHit->AddSil(edep); >> 157 TrackerHit->SetPos(aStep->GetPreStepPoint()->GetPosition()); >> 158 TrackerHit->SetNSilPlane(PlaneNumber); >> 159 TrackerHit->SetNStrip(StripNumber); >> 160 ThitXID[NChannel] = >> 161 TrackerCollection->insert(TrackerHit) -1; >> 162 } >> 163 else // This is not new >> 164 { >> 165 (*TrackerCollection)[ThitXID[NChannel]]->AddSil(edep); >> 166 // G4cout << "X" << PlaneNumber << " " << StripNumber << G4endl; >> 167 } >> 168 } >> 169 >> 170 if (PlaneName == "TKRDetectorY") >> 171 // The hit is on an Y silicon plane >> 172 { >> 173 // This is a new hit >> 174 if (ThitYID[NChannel]==-1) >> 175 { >> 176 GammaRayTelTrackerHit* TrackerHit = new GammaRayTelTrackerHit; >> 177 TrackerHit->SetPlaneType(0); >> 178 TrackerHit->AddSil(edep); >> 179 TrackerHit->SetPos(aStep->GetPreStepPoint()->GetPosition()); >> 180 TrackerHit->SetNSilPlane(PlaneNumber); >> 181 TrackerHit->SetNStrip(StripNumber); >> 182 ThitYID[NChannel] = >> 183 TrackerCollection->insert(TrackerHit)-1; >> 184 } >> 185 else // This is not new >> 186 { >> 187 (*TrackerCollection)[ThitYID[NChannel]]->AddSil(edep); >> 188 // G4cout << "Y" << PlaneNumber << " " << StripNumber << G4endl; >> 189 } >> 190 } >> 191 >> 192 return true; 68 } 193 } 69 194 70 //....oooOO0OOooo........oooOO0OOooo........oo 195 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 71 196 72 GammaRayTelTrackerSD::~GammaRayTelTrackerSD() << 197 void GammaRayTelTrackerSD::EndOfEvent(G4HCofThisEvent* HCE) 73 delete[] tkrHitXID; << 198 { 74 delete[] tkrHitYID; << 199 static G4int HCID = -1; >> 200 if(HCID<0) >> 201 { >> 202 HCID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]); >> 203 } >> 204 HCE->AddHitsCollection(HCID,TrackerCollection); >> 205 >> 206 >> 207 for (G4int i=0;i<NbOfTKRChannels;i++) >> 208 { >> 209 ThitXID[i] = -1; >> 210 ThitYID[i] = -1; >> 211 }; 75 } 212 } 76 213 77 //....oooOO0OOooo........oooOO0OOooo........oo 214 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 78 215 79 void GammaRayTelTrackerSD::Initialize(G4HCofTh << 216 void GammaRayTelTrackerSD::clear() 80 trackerCollection = new GammaRayTelTracker << 217 {} 81 << 82 for (auto i = 0; i < numberOfTKRChannels; << 83 tkrHitXID[i] = -1; << 84 tkrHitYID[i] = -1; << 85 }; << 86 } << 87 218 88 //....oooOO0OOooo........oooOO0OOooo........oo 219 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 89 220 90 auto GammaRayTelTrackerSD::ProcessHits(G4Step << 221 void GammaRayTelTrackerSD::DrawAll() 91 G4double depositedEnergy = 0.; << 222 {} 92 depositedEnergy = step->GetTotalEnergyDepo << 93 if (depositedEnergy == 0.) { << 94 return false; << 95 } << 96 223 97 auto totalNumberOfStrips = detector->GetNb << 224 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 98 auto totalnumberOfTiles = detector->GetNbO << 99 225 100 // This TouchableHistory is used to obtain << 226 void GammaRayTelTrackerSD::PrintAll() 101 auto *touchable = (G4TouchableHistory*) (s << 227 {} 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 % totalnumberOfTi << 121 << 122 G4int channelNumber = 0; << 123 << 124 for (auto j = 0; j < totalnumberOfTiles; j << 125 if (NTile == j) { << 126 stripNumber += totalNumberOfStrips << 127 } << 128 } << 129 228 130 channelNumber = planeNumber * totalnumberO << 229 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 131 230 132 /* << 133 G4cout << " Channel: " << channelNumber << << 134 G4cout << " Plane: " << planeNumber << " " << 135 G4cout << " Strip: " << stripNumber << " " << 136 */ << 137 231 138 // The hit is on an X silicon plane << 139 if (planeName == "TKRDetectorX") { << 140 if (tkrHitXID[channelNumber] == -1) { << 141 auto *trackerHit = new GammaRayTel << 142 trackerHit->SetPlaneType(1); << 143 trackerHit->AddDepositedEnergy(dep << 144 trackerHit->SetPosition(step->GetP << 145 trackerHit->SetSiliconPlaneNumber( << 146 trackerHit->SetStripNumber(stripNu << 147 tkrHitXID[channelNumber] = tracker << 148 } else { // This is not new << 149 (*trackerCollection)[tkrHitXID[cha << 150 // G4cout << "X" << planeNumber << << 151 } << 152 } << 153 232 154 // The hit is on an Y silicon plane << 155 if (planeName == "TKRDetectorY") { << 156 if (tkrHitYID[channelNumber] == -1) { << 157 auto *trackerHit = new GammaRayTel << 158 trackerHit->SetPlaneType(0); << 159 trackerHit->AddDepositedEnergy(dep << 160 trackerHit->SetPosition(step->GetP << 161 trackerHit->SetSiliconPlaneNumber( << 162 trackerHit->SetStripNumber(stripNu << 163 tkrHitYID[channelNumber] = tracker << 164 } else { // This is not new << 165 (*trackerCollection)[tkrHitYID[cha << 166 // G4cout << "Y" << planeNumber << << 167 } << 168 } << 169 233 170 return true; << 171 } << 172 234 173 //....oooOO0OOooo........oooOO0OOooo........oo << 174 235 175 void GammaRayTelTrackerSD::EndOfEvent(G4HCofTh << 176 static G4int collectionIdentifier = -1; << 177 if (collectionIdentifier < 0) { << 178 collectionIdentifier = G4SDManager::Ge << 179 } << 180 collection->AddHitsCollection(collectionId << 181 236 182 for (auto i = 0; i < numberOfTKRChannels; << 183 tkrHitXID[i] = -1; << 184 tkrHitYID[i] = -1; << 185 } << 186 } << 187 237 188 //....oooOO0OOooo........oooOO0OOooo........oo << 189 238 190 void GammaRayTelTrackerSD::clear() { << 191 } << 192 239 193 //....oooOO0OOooo........oooOO0OOooo........oo << 194 240 195 void GammaRayTelTrackerSD::DrawAll() { << 196 } << 197 241 198 //....oooOO0OOooo........oooOO0OOooo........oo << 199 242 200 void GammaRayTelTrackerSD::PrintAll() { << 201 } << 202 243