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 // Author: Elena Guardincerri (Elena.Guardince 28 // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) 29 // 29 // 30 // History: 30 // History: 31 // ----------- 31 // ----------- 32 // 28 Nov 2001 Elena Guardincerri Created 32 // 28 Nov 2001 Elena Guardincerri Created 33 // 29 Nov 2002 Energy deposition bug fixed (Al 33 // 29 Nov 2002 Energy deposition bug fixed (Alfonso.mantero@ge.infn.it) 34 // 17 Jul 2003 Name changed to XrayFluoSD 34 // 17 Jul 2003 Name changed to XrayFluoSD 35 // 01 Sep 2003 Constructor overload for differ 35 // 01 Sep 2003 Constructor overload for different geometries handling 36 // ------------------------------------------- 36 // ------------------------------------------------------------------- 37 37 38 #include "XrayFluoSD.hh" 38 #include "XrayFluoSD.hh" 39 #include "XrayFluoSensorHit.hh" 39 #include "XrayFluoSensorHit.hh" 40 #include "XrayFluoDetectorConstruction.hh" 40 #include "XrayFluoDetectorConstruction.hh" 41 #include "XrayFluoPlaneDetectorConstruction.hh 41 #include "XrayFluoPlaneDetectorConstruction.hh" 42 #include "XrayFluoMercuryDetectorConstruction. 42 #include "XrayFluoMercuryDetectorConstruction.hh" 43 #include "G4VPhysicalVolume.hh" 43 #include "G4VPhysicalVolume.hh" 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 #include "G4ios.hh" 48 #include "G4ios.hh" 49 #include "G4VProcess.hh" 49 #include "G4VProcess.hh" 50 50 51 //....oooOO0OOooo........oooOO0OOooo........oo 51 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 52 52 53 XrayFluoSD::XrayFluoSD(G4String name, 53 XrayFluoSD::XrayFluoSD(G4String name, 54 XrayFluoDet 54 XrayFluoDetectorConstruction* det) 55 :G4VSensitiveDetector(name),Detector(0),plan 55 :G4VSensitiveDetector(name),Detector(0),planeDetector(0),mercuryDetector(0) 56 { 56 { 57 57 58 Detector = det; 58 Detector = det; 59 collectionName.insert("HPGeCollection"); 59 collectionName.insert("HPGeCollection"); 60 HitHPGeID = new G4int[500]; 60 HitHPGeID = new G4int[500]; 61 G4cout << "XrayFluoSD created" << G4endl; 61 G4cout << "XrayFluoSD created" << G4endl; 62 62 63 } 63 } 64 64 65 //....oooOO0OOooo........oooOO0OOooo........oo 65 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 66 66 67 XrayFluoSD::XrayFluoSD(G4String name, 67 XrayFluoSD::XrayFluoSD(G4String name, 68 XrayFluoPlaneDetectorConstruction* 68 XrayFluoPlaneDetectorConstruction* det) 69 :G4VSensitiveDetector(name),Detector(0),plan 69 :G4VSensitiveDetector(name),Detector(0),planeDetector(0),mercuryDetector(0) 70 { 70 { 71 planeDetector = det; 71 planeDetector = det; 72 collectionName.insert("HPGeCollection"); 72 collectionName.insert("HPGeCollection"); 73 HitHPGeID = new G4int[500]; 73 HitHPGeID = new G4int[500]; 74 G4cout << "XrayFluoSD created" << G4endl; 74 G4cout << "XrayFluoSD created" << G4endl; 75 75 76 } 76 } 77 77 78 //....oooOO0OOooo........oooOO0OOooo........oo 78 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 79 79 80 XrayFluoSD::XrayFluoSD(G4String name, 80 XrayFluoSD::XrayFluoSD(G4String name, 81 XrayFluoMercuryDetectorConstruction 81 XrayFluoMercuryDetectorConstruction* det) 82 :G4VSensitiveDetector(name),Detector(0),plan 82 :G4VSensitiveDetector(name),Detector(0),planeDetector(0),mercuryDetector(0) 83 { 83 { 84 mercuryDetector = det; 84 mercuryDetector = det; 85 collectionName.insert("HPGeCollection"); 85 collectionName.insert("HPGeCollection"); 86 HitHPGeID = new G4int[500]; 86 HitHPGeID = new G4int[500]; 87 G4cout << "XrayFluoSD created" << G4endl; 87 G4cout << "XrayFluoSD created" << G4endl; 88 } 88 } 89 89 90 // //....oooOO0OOooo........oooOO0OOooo....... 90 // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 91 91 92 92 93 93 94 94 95 XrayFluoSD::~XrayFluoSD() 95 XrayFluoSD::~XrayFluoSD() 96 { 96 { 97 97 98 delete [] HitHPGeID; 98 delete [] HitHPGeID; 99 99 100 // delete HPGeCollection; 100 // delete HPGeCollection; 101 101 102 G4cout << "XrayFluoSD deleted" << G4endl; 102 G4cout << "XrayFluoSD deleted" << G4endl; 103 } 103 } 104 104 105 //....oooOO0OOooo........oooOO0OOooo........oo 105 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 106 106 107 void XrayFluoSD::Initialize(G4HCofThisEvent*) 107 void XrayFluoSD::Initialize(G4HCofThisEvent*) 108 108 109 //initializes HCE with the hits collection(s) 109 //initializes HCE with the hits collection(s) created by this 110 //sensitive detector 110 //sensitive detector 111 { 111 { 112 HPGeCollection = new XrayFluoSensorHitsColle 112 HPGeCollection = new XrayFluoSensorHitsCollection 113 (SensitiveDetectorName,collectionName[0]); 113 (SensitiveDetectorName,collectionName[0]); 114 114 115 G4int nPixel = 0; 115 G4int nPixel = 0; 116 116 117 if (Detector) {nPixel = Detector->GetNbOfPix 117 if (Detector) {nPixel = Detector->GetNbOfPixels();} 118 else if (planeDetector) {nPixel = planeDetec 118 else if (planeDetector) {nPixel = planeDetector->GetNbOfPixels();} 119 else if (mercuryDetector) {nPixel = mercuryD 119 else if (mercuryDetector) {nPixel = mercuryDetector->GetNbOfPixels();} 120 120 121 for (G4int j=0;j<nPixel;j++) 121 for (G4int j=0;j<nPixel;j++) 122 {HitHPGeID [j]= -1;}; 122 {HitHPGeID [j]= -1;}; 123 } 123 } 124 124 125 //....oooOO0OOooo........oooOO0OOooo........oo 125 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 126 126 127 G4bool XrayFluoSD::ProcessHits(G4Step* aStep,G 127 G4bool XrayFluoSD::ProcessHits(G4Step* aStep,G4TouchableHistory*) 128 { 128 { 129 129 130 130 131 131 132 G4double edep = aStep->GetTotalEnergyDeposit 132 G4double edep = aStep->GetTotalEnergyDeposit(); 133 133 134 /* 134 /* 135 G4String particleName = aStep->GetTrack()- 135 G4String particleName = aStep->GetTrack()->GetDynamicParticle()->GetDefinition()->GetParticleName(); 136 136 137 G4Track* track = aStep->GetTrack(); 137 G4Track* track = aStep->GetTrack(); 138 G4int trackId = track->GetTrackID(); 138 G4int trackId = track->GetTrackID(); 139 //G4String processName = aStep->GetTrack() 139 //G4String processName = aStep->GetTrack()->GetCreatorProcess()->GetProcessName(); 140 140 141 G4double partEnergy = aStep->GetPreStepPoi 141 G4double partEnergy = aStep->GetPreStepPoint()->GetKineticEnergy(); 142 G4double secondEnergy = aStep->GetPostStep 142 G4double secondEnergy = aStep->GetPostStepPoint()->GetKineticEnergy(); 143 G4cout << " la particella che deposita e': 143 G4cout << " la particella che deposita e': " << particleName << " ha una energia di keV " 144 << partEnergy << " e deposita "<< edep < 144 << partEnergy << " e deposita "<< edep << G4endl; 145 G4cout << " la particella creata ha energi 145 G4cout << " la particella creata ha energia cinetica: " << secondEnergy << G4endl; 146 */ 146 */ 147 147 148 if (edep==0.) return false; 148 if (edep==0.) return false; 149 149 150 //G4cout << " edep = " << edep << G4endl; 150 //G4cout << " edep = " << edep << G4endl; 151 151 152 G4TouchableHistory* theTouchable 152 G4TouchableHistory* theTouchable 153 = (G4TouchableHistory*)(aStep->GetPreStepP 153 = (G4TouchableHistory*)(aStep->GetPreStepPoint()->GetTouchable()); 154 154 155 155 156 156 157 G4VPhysicalVolume* physVol = theTouchable->G 157 G4VPhysicalVolume* physVol = theTouchable->GetVolume(); 158 G4int PixelNumber = 0; 158 G4int PixelNumber = 0; 159 159 160 if (Detector && Detector->GetNbOfPixels()>1) 160 if (Detector && Detector->GetNbOfPixels()>1) {PixelNumber= physVol->GetCopyNo();} 161 else if (planeDetector && planeDetector->Get 161 else if (planeDetector && planeDetector->GetNbOfPixels()>1) {PixelNumber= physVol->GetCopyNo();} 162 else if (mercuryDetector && mercuryDetector- 162 else if (mercuryDetector && mercuryDetector->GetNbOfPixels()>1) {PixelNumber= physVol->GetCopyNo();} 163 163 164 164 165 165 166 if ( HitHPGeID[PixelNumber]==-1) 166 if ( HitHPGeID[PixelNumber]==-1) 167 { 167 { 168 XrayFluoSensorHit* HPGeHit = new XrayFlu 168 XrayFluoSensorHit* HPGeHit = new XrayFluoSensorHit(); 169 HPGeHit->AddEnergy(edep); 169 HPGeHit->AddEnergy(edep); 170 HitHPGeID[PixelNumber] = HPGeCollection- 170 HitHPGeID[PixelNumber] = HPGeCollection->insert(HPGeHit) - 1; 171 if (verboseLevel>0){ 171 if (verboseLevel>0){ 172 G4cout << " New Hit on pixel: " << PixelNumb 172 G4cout << " New Hit on pixel: " << PixelNumber << G4endl; 173 } 173 } 174 } 174 } 175 else 175 else 176 { 176 { 177 (*HPGeCollection)[HitHPGeID[PixelNumber] 177 (*HPGeCollection)[HitHPGeID[PixelNumber]]->AddEnergy(edep); 178 //G4double ED =(*HPGeCollection)[HitHPGe 178 //G4double ED =(*HPGeCollection)[HitHPGeID[PixelNumber]]->GetEdepTot(); 179 if (verboseLevel>0) 179 if (verboseLevel>0) 180 G4cout << " Energy added to Pixel: " << Pixe 180 G4cout << " Energy added to Pixel: " << PixelNumber << G4endl; 181 } 181 } 182 182 183 return true; 183 return true; 184 } 184 } 185 185 186 186 187 //....oooOO0OOooo........oooOO0OOooo........oo 187 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 188 188 189 void XrayFluoSD::EndOfEvent(G4HCofThisEvent* H 189 void XrayFluoSD::EndOfEvent(G4HCofThisEvent* HCE) 190 { 190 { 191 static G4int HCID = -1; 191 static G4int HCID = -1; 192 if(HCID<0) 192 if(HCID<0) 193 { HCID = G4SDManager::GetSDMpointer()->GetCo 193 { HCID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]); } 194 HCE->AddHitsCollection(HCID,HPGeCollection); 194 HCE->AddHitsCollection(HCID,HPGeCollection); 195 } 195 } 196 196 197 //....oooOO0OOooo........oooOO0OOooo........oo 197 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 198 198 199 void XrayFluoSD::clear() 199 void XrayFluoSD::clear() 200 {} 200 {} 201 201 202 //....oooOO0OOooo........oooOO0OOooo........oo 202 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 203 203 204 void XrayFluoSD::DrawAll() 204 void XrayFluoSD::DrawAll() 205 {} 205 {} 206 206 207 //....oooOO0OOooo........oooOO0OOooo........oo 207 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 208 208 209 void XrayFluoSD::PrintAll() 209 void XrayFluoSD::PrintAll() 210 {} 210 {} 211 211 212 //....oooOO0OOooo........oooOO0OOooo........oo 212 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 213 213 214 214 215 215 216 216 217 217 218 218 219 219 220 220 221 221 222 222 223 223 224 224 225 225 226 226 227 227 228 228