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