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: Alfonso Mantero (Alfonso.Mantero@ge 28 // Author: Alfonso Mantero (Alfonso.Mantero@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 // Nov 2002 Alfonso Mantero materials added 33 // Nov 2002 Alfonso Mantero materials added, 34 // Material selection implementati 34 // Material selection implementation 35 // 16 Jul 2003 Alfonso Mantero Detector type s 35 // 16 Jul 2003 Alfonso Mantero Detector type selection added + minor fixes 36 // ------------------------------------------- 36 // ------------------------------------------------------------------- 37 37 38 #include "XrayFluoDetectorConstruction.hh" 38 #include "XrayFluoDetectorConstruction.hh" 39 #include "XrayFluoDetectorMessenger.hh" 39 #include "XrayFluoDetectorMessenger.hh" 40 #include "XrayFluoSD.hh" 40 #include "XrayFluoSD.hh" 41 #include "G4PhysicalConstants.hh" 41 #include "G4PhysicalConstants.hh" 42 #include "G4SystemOfUnits.hh" 42 #include "G4SystemOfUnits.hh" 43 #include "G4Material.hh" 43 #include "G4Material.hh" 44 #include "G4ThreeVector.hh" 44 #include "G4ThreeVector.hh" 45 #include "G4Box.hh" 45 #include "G4Box.hh" 46 #include "G4Sphere.hh" 46 #include "G4Sphere.hh" 47 #include "G4Tubs.hh" 47 #include "G4Tubs.hh" 48 #include "G4LogicalVolume.hh" 48 #include "G4LogicalVolume.hh" 49 #include "G4PVPlacement.hh" 49 #include "G4PVPlacement.hh" 50 #include "G4TransportationManager.hh" 50 #include "G4TransportationManager.hh" 51 #include "G4SDManager.hh" 51 #include "G4SDManager.hh" 52 #include "G4RunManager.hh" 52 #include "G4RunManager.hh" 53 #include "G4VisAttributes.hh" 53 #include "G4VisAttributes.hh" 54 #include "G4Colour.hh" 54 #include "G4Colour.hh" 55 #include "G4ios.hh" 55 #include "G4ios.hh" 56 #include "G4PVReplica.hh" 56 #include "G4PVReplica.hh" 57 #include "G4UserLimits.hh" 57 #include "G4UserLimits.hh" 58 #include "G4GeometryManager.hh" 58 #include "G4GeometryManager.hh" 59 #include "G4PhysicalVolumeStore.hh" 59 #include "G4PhysicalVolumeStore.hh" 60 #include "G4LogicalVolumeStore.hh" 60 #include "G4LogicalVolumeStore.hh" 61 #include "G4SolidStore.hh" 61 #include "G4SolidStore.hh" 62 #include "XrayFluoNistMaterials.hh" 62 #include "XrayFluoNistMaterials.hh" 63 #include "G4SDManager.hh" 63 #include "G4SDManager.hh" 64 64 65 // #include "G4Region.hh" 65 // #include "G4Region.hh" 66 // #include "G4RegionStore.hh" 66 // #include "G4RegionStore.hh" 67 67 68 //....oooOO0OOooo........oooOO0OOooo........oo 68 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 69 69 70 70 71 XrayFluoDetectorConstruction::XrayFluoDetector 71 XrayFluoDetectorConstruction::XrayFluoDetectorConstruction() 72 : aNavigator(0), detectorType(0),sampleGranu 72 : aNavigator(0), detectorType(0),sampleGranularity(false), phaseSpaceFlag(false), 73 DeviceSizeX(0), DeviceSizeY(0),DeviceThick 73 DeviceSizeX(0), DeviceSizeY(0),DeviceThickness(0), 74 solidWorld(0),logicWorld(0),physiWorld(0), 74 solidWorld(0),logicWorld(0),physiWorld(0), 75 solidHPGe(0),logicHPGe(0),physiHPGe(0), 75 solidHPGe(0),logicHPGe(0),physiHPGe(0), 76 solidSample (0),logicSample(0),physiSample 76 solidSample (0),logicSample(0),physiSample (0), 77 solidDia1(0),logicDia1(0),physiDia1(0), 77 solidDia1(0),logicDia1(0),physiDia1(0), 78 solidDia3(0),logicDia3(0),physiDia3(0), 78 solidDia3(0),logicDia3(0),physiDia3(0), 79 solidOhmicPos(0),logicOhmicPos(0), physiOh 79 solidOhmicPos(0),logicOhmicPos(0), physiOhmicPos(0), 80 solidWindow(0), logicWindow(0), physiWindo 80 solidWindow(0), logicWindow(0), physiWindow(0), 81 solidOhmicNeg(0),logicOhmicNeg(0), physiOh 81 solidOhmicNeg(0),logicOhmicNeg(0), physiOhmicNeg(0), 82 solidPixel(0),logicPixel(0), physiPixel(0) 82 solidPixel(0),logicPixel(0), physiPixel(0), 83 OhmicPosMaterial(0), OhmicNegMaterial(0), 83 OhmicPosMaterial(0), OhmicNegMaterial(0), 84 pixelMaterial(0),sampleMaterial(0), 84 pixelMaterial(0),sampleMaterial(0), 85 Dia1Material(0),Dia3Material(0), 85 Dia1Material(0),Dia3Material(0), 86 defaultMaterial(0), windowMaterial (0) 86 defaultMaterial(0), windowMaterial (0) 87 { 87 { 88 materials = XrayFluoNistMaterials::GetInstan 88 materials = XrayFluoNistMaterials::GetInstance(); 89 89 90 HPGeSD.Put(0); 90 HPGeSD.Put(0); 91 91 92 aNavigator = new G4Navigator(); 92 aNavigator = new G4Navigator(); 93 93 94 DefineDefaultMaterials(); 94 DefineDefaultMaterials(); 95 95 96 NbOfPixelRows = 1; // should be 1 96 NbOfPixelRows = 1; // should be 1 97 NbOfPixelColumns = 1; // should be 1 97 NbOfPixelColumns = 1; // should be 1 98 NbOfPixels = NbOfPixelRows*NbOfPixel 98 NbOfPixels = NbOfPixelRows*NbOfPixelColumns; 99 PixelSizeXY = std::sqrt(40.) * mm; 99 PixelSizeXY = std::sqrt(40.) * mm; 100 PixelThickness = 2.7 * mm; //should be 3.5 m 100 PixelThickness = 2.7 * mm; //should be 3.5 mm 101 101 102 G4cout << "PixelThickness(mm): "<< PixelThic 102 G4cout << "PixelThickness(mm): "<< PixelThickness/mm << G4endl; 103 G4cout << "PixelSizeXY(cm): "<< PixelSizeXY/ 103 G4cout << "PixelSizeXY(cm): "<< PixelSizeXY/cm << G4endl; 104 104 105 ContactSizeXY = PixelSizeXY; //std::sqrt 105 ContactSizeXY = PixelSizeXY; //std::sqrt(40) * mm; //should be the same as PixelSizeXY 106 SampleThickness = 4 * mm; 106 SampleThickness = 4 * mm; 107 SampleSizeXY = 3. * cm; 107 SampleSizeXY = 3. * cm; 108 Dia1Thickness = 1. *mm; 108 Dia1Thickness = 1. *mm; 109 Dia3Thickness = 1. *mm; 109 Dia3Thickness = 1. *mm; 110 Dia1SizeXY = 3. *cm; 110 Dia1SizeXY = 3. *cm; 111 Dia3SizeXY = 3. *cm; 111 Dia3SizeXY = 3. *cm; 112 112 113 113 114 DiaInnerSize = 2.9 * cm; //(Hole in the dete 114 DiaInnerSize = 2.9 * cm; //(Hole in the detector's diaphragm) it was 1 mm 115 115 116 116 117 OhmicNegThickness = 1e-6*cm;// 0.005 117 OhmicNegThickness = 1e-6*cm;// 0.005 118 OhmicPosThickness = 1e-6*cm;// 0.005 118 OhmicPosThickness = 1e-6*cm;// 0.005 119 windowThickness = 0.008 * cm; //value for ai 119 windowThickness = 0.008 * cm; //value for aif detector 120 ThetaHPGe = 135. * deg; 120 ThetaHPGe = 135. * deg; 121 PhiHPGe = 225. * deg; 121 PhiHPGe = 225. * deg; 122 122 123 ThetaDia1 = 135. * deg; 123 ThetaDia1 = 135. * deg; 124 PhiDia1 = 90. * deg; 124 PhiDia1 = 90. * deg; 125 AlphaDia1 = 225. * deg; 125 AlphaDia1 = 225. * deg; 126 126 127 AlphaDia3 = 180. * deg; 127 AlphaDia3 = 180. * deg; 128 Dia3Dist = 66.5 * mm; 128 Dia3Dist = 66.5 * mm; 129 Dia3InnerSize = 1. * mm; 129 Dia3InnerSize = 1. * mm; 130 ThetaDia3 = 180. * deg; 130 ThetaDia3 = 180. * deg; 131 PhiDia3 = 90. * deg; 131 PhiDia3 = 90. * deg; 132 132 133 DistDia = 66.5 * mm; 133 DistDia = 66.5 * mm; 134 DistDe =DistDia+ (Dia1Thickness 134 DistDe =DistDia+ (Dia1Thickness 135 +PixelThickness)/2+OhmicPosThickness+w 135 +PixelThickness)/2+OhmicPosThickness+windowThickness ; 136 136 137 grainDia = 1 * mm; 137 grainDia = 1 * mm; 138 PixelCopyNb=0; 138 PixelCopyNb=0; 139 grainCopyNb=0; 139 grainCopyNb=0; 140 G4String defaultDetectorType = "sili"; 140 G4String defaultDetectorType = "sili"; 141 ComputeApparateParameters(); 141 ComputeApparateParameters(); 142 142 143 // G4String regName = "SampleRegion"; 143 // G4String regName = "SampleRegion"; 144 // sampleRegion = new G4Region(regName); 144 // sampleRegion = new G4Region(regName); 145 145 146 if (!phaseSpaceFlag) SetDetectorType(default 146 if (!phaseSpaceFlag) SetDetectorType(defaultDetectorType); 147 147 148 // create commands for interactive definitio 148 // create commands for interactive definition of the apparate 149 149 150 detectorMessenger = new XrayFluoDetectorMess 150 detectorMessenger = new XrayFluoDetectorMessenger(this); 151 151 152 G4cout << "XrayFluoDetectorConstruction crea 152 G4cout << "XrayFluoDetectorConstruction created" << G4endl; 153 } 153 } 154 //....oooOO0OOooo........oooOO0OOooo........oo 154 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 155 155 156 156 157 XrayFluoDetectorConstruction* XrayFluoDetector 157 XrayFluoDetectorConstruction* XrayFluoDetectorConstruction::instance = 0; 158 158 159 XrayFluoDetectorConstruction* XrayFluoDetector 159 XrayFluoDetectorConstruction* XrayFluoDetectorConstruction::GetInstance() 160 { 160 { 161 if (instance == 0) 161 if (instance == 0) 162 { 162 { 163 instance = new XrayFluoDetectorConstruct 163 instance = new XrayFluoDetectorConstruction; 164 164 165 } 165 } 166 return instance; 166 return instance; 167 } 167 } 168 168 169 //....oooOO0OOooo........oooOO0OOooo........oo 169 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 170 170 171 void XrayFluoDetectorConstruction::SetDetector 171 void XrayFluoDetectorConstruction::SetDetectorType(G4String type) 172 { 172 { 173 if (type=="sili") 173 if (type=="sili") 174 { 174 { 175 detectorType = XrayFluoSiLiDetectorType: 175 detectorType = XrayFluoSiLiDetectorType::GetInstance(); 176 } 176 } 177 else if (type=="hpge") 177 else if (type=="hpge") 178 { 178 { 179 detectorType = XrayFluoHPGeDetectorType 179 detectorType = XrayFluoHPGeDetectorType::GetInstance(); 180 }/* 180 }/* 181 else if (type=="aifira") 181 else if (type=="aifira") 182 { 182 { 183 detectorType = XrayFluoAifSiLi::GetInst 183 detectorType = XrayFluoAifSiLi::GetInstance(); 184 }*/ 184 }*/ 185 else 185 else 186 { 186 { 187 G4ExceptionDescription execp; 187 G4ExceptionDescription execp; 188 execp << type + "detector type unknown"; 188 execp << type + "detector type unknown"; 189 G4Exception("XrayFluoDataSet::LoadData() 189 G4Exception("XrayFluoDataSet::LoadData()","example-xray_fluorescence06", 190 FatalException, execp); 190 FatalException, execp); 191 } 191 } 192 //GeometryHasBeenModified invoked by the mes 192 //GeometryHasBeenModified invoked by the messenger 193 193 194 } 194 } 195 195 196 XrayFluoVDetectorType* XrayFluoDetectorConstru 196 XrayFluoVDetectorType* XrayFluoDetectorConstruction::GetDetectorType() const 197 { 197 { 198 return detectorType; 198 return detectorType; 199 } 199 } 200 200 201 //....oooOO0OOooo........oooOO0OOooo........oo 201 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 202 202 203 XrayFluoDetectorConstruction::~XrayFluoDetecto 203 XrayFluoDetectorConstruction::~XrayFluoDetectorConstruction() 204 204 205 { 205 { 206 delete detectorMessenger; 206 delete detectorMessenger; 207 delete detectorType; 207 delete detectorType; 208 G4cout << "XrayFluoDetectorConstruction dele 208 G4cout << "XrayFluoDetectorConstruction deleted" << G4endl; 209 } 209 } 210 210 211 //....oooOO0OOooo........oooOO0OOooo........oo 211 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 212 212 213 G4VPhysicalVolume* XrayFluoDetectorConstructio 213 G4VPhysicalVolume* XrayFluoDetectorConstruction::Construct() 214 { 214 { 215 return ConstructApparate(); 215 return ConstructApparate(); 216 } 216 } 217 217 218 //....oooOO0OOooo........oooOO0OOooo........oo 218 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 219 219 220 void XrayFluoDetectorConstruction::DefineDefau 220 void XrayFluoDetectorConstruction::DefineDefaultMaterials() 221 { 221 { 222 222 223 223 224 //define materials of the apparate 224 //define materials of the apparate 225 225 226 sampleMaterial = materials->GetMaterial("Dol 226 sampleMaterial = materials->GetMaterial("Dolorite"); 227 Dia1Material = materials->GetMaterial("G4_Pb 227 Dia1Material = materials->GetMaterial("G4_Pb"); 228 Dia3Material = materials->GetMaterial("G4_Ga 228 Dia3Material = materials->GetMaterial("G4_Galactic"); 229 pixelMaterial = materials->GetMaterial("SiLi 229 pixelMaterial = materials->GetMaterial("SiLi"); 230 //OhmicPosMaterial = materials->GetMaterial( 230 //OhmicPosMaterial = materials->GetMaterial("G4_Cu"); 231 OhmicPosMaterial = materials->GetMaterial("G 231 OhmicPosMaterial = materials->GetMaterial("G4_Ni"); 232 OhmicNegMaterial = materials->GetMaterial("G 232 OhmicNegMaterial = materials->GetMaterial("G4_Pb"); 233 defaultMaterial = materials->GetMaterial("G4 233 defaultMaterial = materials->GetMaterial("G4_Galactic"); 234 windowMaterial = materials->GetMaterial("G4_ 234 windowMaterial = materials->GetMaterial("G4_Be"); 235 } 235 } 236 236 237 void XrayFluoDetectorConstruction::SetOhmicPos 237 void XrayFluoDetectorConstruction::SetOhmicPosThickness(G4double val) 238 { 238 { 239 239 240 if (!phaseSpaceFlag) { 240 if (!phaseSpaceFlag) { 241 241 242 242 243 if (val == 0.0) { 243 if (val == 0.0) { 244 OhmicPosMaterial = materials->GetMateria 244 OhmicPosMaterial = materials->GetMaterial("G4_Galactic"); 245 } 245 } 246 else { 246 else { 247 OhmicPosThickness = val; 247 OhmicPosThickness = val; 248 //OhmicPosMaterial = materials->GetMater 248 //OhmicPosMaterial = materials->GetMaterial("G4_Cu"); 249 OhmicPosMaterial = materials->GetMateria 249 OhmicPosMaterial = materials->GetMaterial("G4_Ni"); 250 } 250 } 251 251 252 } 252 } 253 else{ 253 else{ 254 G4cout << "Not available in this configura 254 G4cout << "Not available in this configuration" << G4endl; 255 } 255 } 256 256 257 } 257 } 258 258 259 259 260 //....oooOO0OOooo........oooOO0OOooo........oo 260 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 261 261 262 G4VPhysicalVolume* XrayFluoDetectorConstructio 262 G4VPhysicalVolume* XrayFluoDetectorConstruction::ConstructApparate() 263 { 263 { 264 // complete the apparate parameters definiti 264 // complete the apparate parameters definition 265 265 266 //ComputeApparateParameters(); 266 //ComputeApparateParameters(); 267 267 268 //world and associated navigator 268 //world and associated navigator 269 269 270 solidWorld = new G4Box("World", 270 solidWorld = new G4Box("World", //its name 271 WorldSizeXY/2,WorldSizeXY/2,WorldSizeZ/ 271 WorldSizeXY/2,WorldSizeXY/2,WorldSizeZ/2); //its size 272 272 273 logicWorld = new G4LogicalVolume(solidWorld, 273 logicWorld = new G4LogicalVolume(solidWorld, //its solid 274 defaultMate 274 defaultMaterial, //its material 275 "World"); 275 "World"); //its name 276 physiWorld = new G4PVPlacement(0, //no r 276 physiWorld = new G4PVPlacement(0, //no rotation 277 G4ThreeVector(), //at (0,0,0) 277 G4ThreeVector(), //at (0,0,0) 278 "World", //its name 278 "World", //its name 279 logicWorld, //its logical volume 279 logicWorld, //its logical volume 280 0, //its mother volume 280 0, //its mother volume 281 false, //no boolean operation 281 false, //no boolean operation 282 0); //copy number 282 0); //copy number 283 283 284 aNavigator->SetWorldVolume(physiWorld); 284 aNavigator->SetWorldVolume(physiWorld); 285 285 286 286 287 //HPGeDetector 287 //HPGeDetector 288 288 289 if (!phaseSpaceFlag) { 289 if (!phaseSpaceFlag) { 290 290 291 solidHPGe = 0; physiHPGe = 0; logicHPGe= 291 solidHPGe = 0; physiHPGe = 0; logicHPGe=0; 292 solidPixel=0; logicPixel=0; physiPixel=0; 292 solidPixel=0; logicPixel=0; physiPixel=0; 293 293 294 if (DeviceThickness > 0.) 294 if (DeviceThickness > 0.) 295 { 295 { 296 solidHPGe = new G4Box("HPGeDetector", //it 296 solidHPGe = new G4Box("HPGeDetector", //its name 297 DeviceSizeX/2,DeviceSizeY/2,Device 297 DeviceSizeX/2,DeviceSizeY/2,DeviceThickness/2);//size 298 298 299 299 300 logicHPGe = new G4LogicalVolume(solidHPGe, 300 logicHPGe = new G4LogicalVolume(solidHPGe, //its solid 301 defaultMaterial, //its material 301 defaultMaterial, //its material 302 "HPGeDetector"); //its name 302 "HPGeDetector"); //its name 303 303 304 zRotPhiHPGe.rotateX(PhiHPGe); 304 zRotPhiHPGe.rotateX(PhiHPGe); 305 G4double x,y,z; 305 G4double x,y,z; 306 z = DistDe * std::cos(ThetaHPGe); 306 z = DistDe * std::cos(ThetaHPGe); 307 y =DistDe * std::sin(ThetaHPGe); 307 y =DistDe * std::sin(ThetaHPGe); 308 x = 0.*cm; 308 x = 0.*cm; 309 physiHPGe = new G4PVPlacement(G4Transform3D( 309 physiHPGe = new G4PVPlacement(G4Transform3D(zRotPhiHPGe,G4ThreeVector(x,y,z)), 310 "HPGeDetector", //its name 310 "HPGeDetector", //its name 311 logicHPGe, //its logical volume 311 logicHPGe, //its logical volume 312 physiWorld, //its mother volume 312 physiWorld, //its mother volume 313 false, //no boolean operation 313 false, //no boolean operation 314 0); //copy number 314 0); //copy number 315 } 315 } 316 // Pixel 316 // Pixel 317 317 318 318 319 319 320 320 321 for ( G4int j=0; j < NbOfPixelColumns ; j+ 321 for ( G4int j=0; j < NbOfPixelColumns ; j++ ) 322 { for ( G4int i=0; i < NbOfPixelRows ; i 322 { for ( G4int i=0; i < NbOfPixelRows ; i++ ) 323 { 323 { 324 solidPixel=0; logicPixel=0; physiPixel=0 324 solidPixel=0; logicPixel=0; physiPixel=0; 325 if (PixelThickness > 0.) 325 if (PixelThickness > 0.) 326 solidPixel = new G4Box("Pixel", 326 solidPixel = new G4Box("Pixel", 327 PixelSizeXY/2,PixelSizeXY/2, PixelT 327 PixelSizeXY/2,PixelSizeXY/2, PixelThickness/2); 328 328 329 logicPixel = new G4LogicalVolume(solidPixe 329 logicPixel = new G4LogicalVolume(solidPixel, 330 pixelMaterial, //its material 330 pixelMaterial, //its material 331 "Pixel"); //its name 331 "Pixel"); //its name 332 332 333 /* 333 /* 334 zRotPhiHPGe.rotateX(PhiHPGe); 334 zRotPhiHPGe.rotateX(PhiHPGe); 335 G4double x,y,z; 335 G4double x,y,z; 336 z = DistDe * std::cos(ThetaHPGe); 336 z = DistDe * std::cos(ThetaHPGe); 337 y =DistDe * std::sin(ThetaHPGe); 337 y =DistDe * std::sin(ThetaHPGe); 338 x = 0.*cm;*/ 338 x = 0.*cm;*/ 339 physiPixel = new G4PVPlacement(0, 339 physiPixel = new G4PVPlacement(0, 340 G4ThreeVector(0, 340 G4ThreeVector(0, 341 i*PixelSizeXY, 341 i*PixelSizeXY, 342 j*PixelSizeXY ), 342 j*PixelSizeXY ), 343 "Pixel", 343 "Pixel", 344 logicPixel, //its logical volume 344 logicPixel, //its logical volume 345 physiHPGe, //its mother volume 345 physiHPGe, //its mother volume 346 false, //no boolean operation 346 false, //no boolean operation 347 PixelCopyNb);//copy number 347 PixelCopyNb);//copy number 348 348 349 349 350 350 351 351 352 352 353 353 354 // OhmicNeg 354 // OhmicNeg 355 355 356 solidOhmicNeg=0; logicOhmicNeg=0; physiOhm 356 solidOhmicNeg=0; logicOhmicNeg=0; physiOhmicNeg=0; 357 357 358 if (OhmicNegThickness > 0.) 358 if (OhmicNegThickness > 0.) 359 { solidOhmicNeg = new G4Box("OhmicNeg", 359 { solidOhmicNeg = new G4Box("OhmicNeg", //its name 360 PixelSizeXY/2,PixelSizeXY/2,OhmicNeg 360 PixelSizeXY/2,PixelSizeXY/2,OhmicNegThickness/2); 361 361 362 logicOhmicNeg = new G4LogicalVolume(soli 362 logicOhmicNeg = new G4LogicalVolume(solidOhmicNeg, //its solid 363 OhmicNegMaterial, //its material 363 OhmicNegMaterial, //its material 364 "OhmicNeg"); //its name 364 "OhmicNeg"); //its name 365 365 366 physiOhmicNeg = new G4PVPlacement(0, 366 physiOhmicNeg = new G4PVPlacement(0, 367 G4ThreeVector 367 G4ThreeVector 368 (0., 368 (0., 369 0., 369 0., 370 (PixelThickness+OhmicNegThick 370 (PixelThickness+OhmicNegThickness)/2), 371 "OhmicNeg", //its name 371 "OhmicNeg", //its name 372 logicOhmicNeg, //its logic 372 logicOhmicNeg, //its logical volume 373 physiHPGe, //its mother 373 physiHPGe, //its mother 374 false, //no boulea 374 false, //no boulean operat 375 PixelCopyNb); / 375 PixelCopyNb); //copy number 376 376 377 } 377 } 378 // OhmicPos 378 // OhmicPos 379 solidOhmicPos=0; logicOhmicPos=0; physiOhm 379 solidOhmicPos=0; logicOhmicPos=0; physiOhmicPos=0; 380 380 381 if (OhmicPosThickness > 0.) 381 if (OhmicPosThickness > 0.) 382 { solidOhmicPos = new G4Box("OhmicPos", 382 { solidOhmicPos = new G4Box("OhmicPos", //its name 383 PixelSizeXY/2,PixelSizeXY/2,OhmicPos 383 PixelSizeXY/2,PixelSizeXY/2,OhmicPosThickness/2); 384 384 385 logicOhmicPos = new G4LogicalVolume(soli 385 logicOhmicPos = new G4LogicalVolume(solidOhmicPos, //its solid 386 OhmicPosMaterial, //its material 386 OhmicPosMaterial, //its material 387 "OhmicPos"); //its name 387 "OhmicPos"); //its name 388 388 389 physiOhmicPos = new G4PVPlacement(0, 389 physiOhmicPos = new G4PVPlacement(0, 390 G4ThreeVector(0., 390 G4ThreeVector(0., 391 0., 391 0., 392 (-PixelThickness-OhmicPosThi 392 (-PixelThickness-OhmicPosThickness)/2), 393 "OhmicPos", 393 "OhmicPos", 394 logicOhmicPos, 394 logicOhmicPos, 395 physiHPGe, 395 physiHPGe, 396 false, 396 false, 397 PixelCopyNb); 397 PixelCopyNb); 398 398 399 } 399 } 400 400 401 /////////// widow place here! //////////// 401 /////////// widow place here! //////////////// 402 // OhmicPos 402 // OhmicPos 403 solidWindow=0; logicWindow=0; physiWindow= 403 solidWindow=0; logicWindow=0; physiWindow=0; 404 404 405 if (windowThickness > 0.) 405 if (windowThickness > 0.) 406 { solidWindow = new G4Box("Window", // 406 { solidWindow = new G4Box("Window", //its name 407 PixelSizeXY/2,PixelSizeXY/2,windowTh 407 PixelSizeXY/2,PixelSizeXY/2,windowThickness/2); 408 408 409 logicWindow = new G4LogicalVolume(solidW 409 logicWindow = new G4LogicalVolume(solidWindow, //its solid 410 windowMaterial, //its material 410 windowMaterial, //its material 411 "Window"); //its name 411 "Window"); //its name 412 412 413 physiWindow = new G4PVPlacement(0, 413 physiWindow = new G4PVPlacement(0, 414 G4ThreeVector(0., 414 G4ThreeVector(0., 415 0., 415 0., 416 ((-PixelThickness-windowThic 416 ((-PixelThickness-windowThickness)/2) 417 -OhmicPosThickness), 417 -OhmicPosThickness), 418 "OhmicWindow", 418 "OhmicWindow", 419 logicWindow, 419 logicWindow, 420 physiHPGe, 420 physiHPGe, 421 false, 421 false, 422 PixelCopyNb); 422 PixelCopyNb); 423 423 424 } 424 } 425 425 426 426 427 427 428 PixelCopyNb += PixelCopyNb; 428 PixelCopyNb += PixelCopyNb; 429 G4cout << "PixelCopyNb: " << PixelCopyNb < 429 G4cout << "PixelCopyNb: " << PixelCopyNb << G4endl; 430 } 430 } 431 431 432 } 432 } 433 433 434 } 434 } 435 435 436 //Sample 436 //Sample 437 437 438 if (sampleGranularity) { 438 if (sampleGranularity) { 439 439 440 solidSample=0; logicSample=0; physiSampl 440 solidSample=0; logicSample=0; physiSample=0; 441 if (SampleThickness > 0.) 441 if (SampleThickness > 0.) 442 { 442 { 443 solidSample = new G4Box("Sample", //its na 443 solidSample = new G4Box("Sample", //its name 444 SampleSizeXY/2,SampleSizeXY/2,SampleTh 444 SampleSizeXY/2,SampleSizeXY/2,SampleThickness/2);//size 445 445 446 logicSample= new G4LogicalVolume(solidSample 446 logicSample= new G4LogicalVolume(solidSample, //its solid 447 defaultMaterial, //its material 447 defaultMaterial, //its material 448 "Sample"); //its name 448 "Sample"); //its name 449 449 450 physiSample = new G4PVPlacement(0, //no 450 physiSample = new G4PVPlacement(0, //no rotation 451 G4ThreeVector(), //at (0,0,0) 451 G4ThreeVector(), //at (0,0,0) 452 "Sample", //its name 452 "Sample", //its name 453 logicSample, //its logical volume 453 logicSample, //its logical volume 454 physiWorld, //its mother volume 454 physiWorld, //its mother volume 455 false, //no boolean operation 455 false, //no boolean operation 456 0); //copy number 456 0); //copy number 457 457 458 } 458 } 459 459 460 460 461 461 462 462 463 G4int nbOfGrainsX = ((G4int)(SampleSizeXY/ 463 G4int nbOfGrainsX = ((G4int)(SampleSizeXY/grainDia)) -1 ; 464 464 465 // y dim of a max density plane is 2rn-(n- 465 // y dim of a max density plane is 2rn-(n-1)ar, wehere a = (1-(std::sqrt(3)/2)), n is 466 // number of rows and r the radius of the 466 // number of rows and r the radius of the grain. so the Y-dim of the sample must 467 // be greater or equal to this. It results 467 // be greater or equal to this. It results that nmust be <= (SampleY-a)/(1-a). 468 // Max Y shift of the planes superimposing 468 // Max Y shift of the planes superimposing along Z axis is minor (2/std::sqrt(3)r) 469 469 470 G4double a = (1.-(std::sqrt(3.)/2.)); 470 G4double a = (1.-(std::sqrt(3.)/2.)); 471 G4int nbOfGrainsY = (G4int) ( ((SampleSiz 471 G4int nbOfGrainsY = (G4int) ( ((SampleSizeXY/(grainDia/2.)) -a)/(2.-a) ) -1; 472 472 473 // same for the z axis, but a = 2 * (std:: 473 // same for the z axis, but a = 2 * (std::sqrt(3) - std::sqrt(2))/std::sqrt(3) 474 474 475 G4double b = 2. * (std::sqrt(3.) - std::sq 475 G4double b = 2. * (std::sqrt(3.) - std::sqrt(2.))/std::sqrt(3.); 476 G4int nbOfGrainsZ = (G4int) ( ((SampleThi 476 G4int nbOfGrainsZ = (G4int) ( ((SampleThickness/(grainDia/2.)) -b)/(2.-b) )-1; 477 477 478 if (SampleThickness > 0.){ 478 if (SampleThickness > 0.){ 479 479 480 solidGrain=0; logicGrain=0; physiGrain=0 480 solidGrain=0; logicGrain=0; physiGrain=0; 481 solidGrain = new G4Sphere("Grain",0., 481 solidGrain = new G4Sphere("Grain",0., 482 grainDia/2,0., twopi, 0., pi); 482 grainDia/2,0., twopi, 0., pi); 483 483 484 logicGrain = new G4LogicalVolume(solidGr 484 logicGrain = new G4LogicalVolume(solidGrain, 485 sampleMaterial, //its material 485 sampleMaterial, //its material 486 "Grain"); //its name 486 "Grain"); //its name 487 G4ThreeVector grainPosition; 487 G4ThreeVector grainPosition; 488 G4double grainInitPositionX = 0; 488 G4double grainInitPositionX = 0; 489 G4double grainInitPositionY = 0; 489 G4double grainInitPositionY = 0; 490 G4double grainInitPositionZ = (-1.*Sampl 490 G4double grainInitPositionZ = (-1.*SampleThickness/2.+grainDia/2.); 491 G4double grainStepX = grainDia = 0; 491 G4double grainStepX = grainDia = 0; 492 G4double grainStepY = grainDia*(1.-(0.5- 492 G4double grainStepY = grainDia*(1.-(0.5-(std::sqrt(3.)/4.))); 493 G4double grainStepZ = grainDia*std::sqrt 493 G4double grainStepZ = grainDia*std::sqrt(2./3.); 494 494 495 for ( G4int k=0; k < nbOfGrainsZ ; k++ ) 495 for ( G4int k=0; k < nbOfGrainsZ ; k++ ) { 496 for ( G4int j=0; j < nbOfGrainsY ; j++ ) { 496 for ( G4int j=0; j < nbOfGrainsY ; j++ ) { 497 for ( G4int i=0; i < nbOfGrainsX ; i++ ) { 497 for ( G4int i=0; i < nbOfGrainsX ; i++ ) { 498 498 499 // Now we identify the layer and the row 499 // Now we identify the layer and the row where the grain is , to place it in the right position 500 500 501 501 502 502 503 if (k%3 == 0) { // first or (4-multiple) 503 if (k%3 == 0) { // first or (4-multiple)th layer: structure is ABCABC 504 grainInitPositionY = (-1.*SampleSizeXY 504 grainInitPositionY = (-1.*SampleSizeXY/2.+grainDia/2.); 505 if (j%2 ==0) { //first or (3-multiple) 505 if (j%2 ==0) { //first or (3-multiple)th row 506 grainInitPositionX = (-1.*SampleSizeXY/2.+ 506 grainInitPositionX = (-1.*SampleSizeXY/2.+grainDia/2.); 507 } 507 } 508 508 509 else if ( ((j+1) % 2) == 0 ) { 509 else if ( ((j+1) % 2) == 0 ) { 510 grainInitPositionX = (-1.*SampleSizeXY/2.+ 510 grainInitPositionX = (-1.*SampleSizeXY/2.+ grainDia); 511 } 511 } 512 512 513 } 513 } 514 else if ( ((k+2) % 3) == 0 ) { // B-laye 514 else if ( ((k+2) % 3) == 0 ) { // B-layer 515 515 516 grainInitPositionY = ( (-1.*SampleSize 516 grainInitPositionY = ( (-1.*SampleSizeXY/2.) + (grainDia/2.)*(1. + (1./std::sqrt(3.)) ) ); 517 517 518 if (j%2 ==0) { //first or (3-multiple) 518 if (j%2 ==0) { //first or (3-multiple)th row 519 grainInitPositionX = (-1.*SampleSizeXY/2.+ 519 grainInitPositionX = (-1.*SampleSizeXY/2.+grainDia); 520 } 520 } 521 521 522 else if ( (j+1)%2 == 0 ) { 522 else if ( (j+1)%2 == 0 ) { 523 grainInitPositionX = (-1.*SampleSizeXY/2.+ 523 grainInitPositionX = (-1.*SampleSizeXY/2.+grainDia/2); 524 } 524 } 525 525 526 } 526 } 527 527 528 else if ( (k+1)%3 == 0 ) { // B-layer 528 else if ( (k+1)%3 == 0 ) { // B-layer 529 529 530 grainInitPositionY = (-1.*SampleSizeXY 530 grainInitPositionY = (-1.*SampleSizeXY/2.+(grainDia/2.)*(1.+2./std::sqrt(3.)) ); 531 531 532 if (j%2 ==0) { //first or (3-multiple) 532 if (j%2 ==0) { //first or (3-multiple)th row 533 grainInitPositionX = (-1.*SampleSizeXY/2.+ 533 grainInitPositionX = (-1.*SampleSizeXY/2.+grainDia/2.); 534 } 534 } 535 535 536 else if ( (j+1)%2 == 0 ) { 536 else if ( (j+1)%2 == 0 ) { 537 grainInitPositionX = (-1.*SampleSizeXY/2.+ 537 grainInitPositionX = (-1.*SampleSizeXY/2.+grainDia); 538 } 538 } 539 539 540 } 540 } 541 541 542 physiGrain = new G4PVPlacement(0, 542 physiGrain = new G4PVPlacement(0, 543 G4ThreeVector( grainInitPositionX 543 G4ThreeVector( grainInitPositionX + i*grainStepX, 544 grainInitPositionY + j*grainSt 544 grainInitPositionY + j*grainStepY, 545 grainInitPositionZ + k*grainSt 545 grainInitPositionZ + k*grainStepZ), 546 "Grain", 546 "Grain", 547 logicGrain, //its logical volum 547 logicGrain, //its logical volume 548 physiSample, //its mother volume 548 physiSample, //its mother volume 549 false, //no boolean operation 549 false, //no boolean operation 550 grainCopyNb);//copy number 550 grainCopyNb);//copy number 551 551 552 grainCopyNb = grainCopyNb +1; 552 grainCopyNb = grainCopyNb +1; 553 } 553 } 554 } 554 } 555 } 555 } 556 } 556 } 557 } 557 } 558 else { 558 else { 559 559 560 solidSample=0; logicSample=0; physiSampl 560 solidSample=0; logicSample=0; physiSample=0; 561 if (SampleThickness > 0.) 561 if (SampleThickness > 0.) 562 { 562 { 563 solidSample = new G4Box("Sample", //its na 563 solidSample = new G4Box("Sample", //its name 564 SampleSizeXY/2,SampleSizeXY/2,SampleTh 564 SampleSizeXY/2,SampleSizeXY/2,SampleThickness/2);//size 565 565 566 logicSample= new G4LogicalVolume(solidSample 566 logicSample= new G4LogicalVolume(solidSample, //its solid 567 sampleMaterial, //its material 567 sampleMaterial, //its material 568 "Sample"); //its name 568 "Sample"); //its name 569 569 570 physiSample = new G4PVPlacement(0, //no 570 physiSample = new G4PVPlacement(0, //no rotation 571 G4ThreeVector(), //at (0,0,0) 571 G4ThreeVector(), //at (0,0,0) 572 "Sample", //its name 572 "Sample", //its name 573 logicSample, //its logical volume 573 logicSample, //its logical volume 574 physiWorld, //its mother volume 574 physiWorld, //its mother volume 575 false, //no boolean operation 575 false, //no boolean operation 576 0); //copy number 576 0); //copy number 577 577 578 } 578 } 579 } 579 } 580 580 581 if (!phaseSpaceFlag) { 581 if (!phaseSpaceFlag) { 582 //Diaphragm1 582 //Diaphragm1 583 583 584 solidDia1 = 0; physiDia1 = 0; logicDia1= 584 solidDia1 = 0; physiDia1 = 0; logicDia1=0; 585 585 586 if (Dia1Thickness > 0.) 586 if (Dia1Thickness > 0.) 587 { 587 { 588 solidDia1 = new G4Tubs("Diaphragm1", //it 588 solidDia1 = new G4Tubs("Diaphragm1", //its name 589 DiaInnerSize/2, 589 DiaInnerSize/2, 590 Dia1SizeXY/2, 590 Dia1SizeXY/2, 591 Dia1Thickness/2, 591 Dia1Thickness/2, 592 0, 592 0, 593 360*deg);//size 593 360*deg);//size 594 594 595 595 596 logicDia1 = new G4LogicalVolume(solidDia1, 596 logicDia1 = new G4LogicalVolume(solidDia1, //its solid 597 Dia1Material, //its material 597 Dia1Material, //its material 598 "Diaphragm1"); //its name 598 "Diaphragm1"); //its name 599 599 600 zRotPhiDia1.rotateX(AlphaDia1); 600 zRotPhiDia1.rotateX(AlphaDia1); 601 G4double x,y,z; 601 G4double x,y,z; 602 z = DistDia * std::cos(ThetaDia1); 602 z = DistDia * std::cos(ThetaDia1); 603 y =DistDia * std::sin(ThetaDia1); 603 y =DistDia * std::sin(ThetaDia1); 604 x = 0.*cm; 604 x = 0.*cm; 605 physiDia1 = new G4PVPlacement(G4Transform3D( 605 physiDia1 = new G4PVPlacement(G4Transform3D(zRotPhiDia1,G4ThreeVector(x,y,z)), 606 "Diaphragm1", //its name 606 "Diaphragm1", //its name 607 logicDia1, //its logical volume 607 logicDia1, //its logical volume 608 physiWorld, //its mother volume 608 physiWorld, //its mother volume 609 false, //no boolean operation 609 false, //no boolean operation 610 0); //copy number 610 0); //copy number 611 } 611 } 612 612 613 //Diaphragm3 613 //Diaphragm3 614 614 615 solidDia3 = 0; physiDia3 = 0; logicDia3 615 solidDia3 = 0; physiDia3 = 0; logicDia3 =0; 616 616 617 if (Dia3Thickness > 0.) 617 if (Dia3Thickness > 0.) 618 { 618 { 619 solidDia3 = new G4Tubs("Diaphragm3", 619 solidDia3 = new G4Tubs("Diaphragm3", 620 Dia3InnerSize/2, 620 Dia3InnerSize/2, 621 Dia3SizeXY/2, 621 Dia3SizeXY/2, 622 Dia3Thickness/2, 622 Dia3Thickness/2, 623 0, 623 0, 624 360*deg); 624 360*deg); 625 625 626 626 627 logicDia3 = new G4LogicalVolume(solidDia 627 logicDia3 = new G4LogicalVolume(solidDia3, //its solid 628 Dia3Material, //its material 628 Dia3Material, //its material 629 "Diaphragm3"); //its name 629 "Diaphragm3"); //its name 630 630 631 zRotPhiDia3.rotateX(AlphaDia3); 631 zRotPhiDia3.rotateX(AlphaDia3); 632 G4double x,y,z; 632 G4double x,y,z; 633 z = Dia3Dist * std::cos(ThetaDia3); 633 z = Dia3Dist * std::cos(ThetaDia3); 634 y =Dia3Dist * std::sin(ThetaDia3); 634 y =Dia3Dist * std::sin(ThetaDia3); 635 x = 0.*cm; 635 x = 0.*cm; 636 physiDia3 = new G4PVPlacement(G4Transfor 636 physiDia3 = new G4PVPlacement(G4Transform3D(zRotPhiDia3,G4ThreeVector(x,y,z)), "Diaphragm3", //its name 637 logicDia3, //its logical volume 637 logicDia3, //its logical volume 638 physiWorld, //its mother volume 638 physiWorld, //its mother volume 639 false, //no boolean operation 639 false, //no boolean operation 640 0); //copy number 640 0); //copy number 641 } 641 } 642 } 642 } 643 643 644 644 645 645 646 // Visualization attributes 646 // Visualization attributes 647 647 648 logicWorld->SetVisAttributes (G4VisAttribute 648 logicWorld->SetVisAttributes (G4VisAttributes::GetInvisible()); 649 G4VisAttributes* simpleBoxVisAtt= new G4VisA 649 G4VisAttributes* simpleBoxVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0)); 650 G4VisAttributes * yellow= new G4VisAttribute 650 G4VisAttributes * yellow= new G4VisAttributes( G4Colour(255/255. ,255/255. ,51/255. )); 651 G4VisAttributes * red= new G4VisAttributes( 651 G4VisAttributes * red= new G4VisAttributes( G4Colour(255/255. , 0/255. , 0/255. )); 652 G4VisAttributes * blue= new G4VisAttributes( 652 G4VisAttributes * blue= new G4VisAttributes( G4Colour(0/255. , 0/255. , 255/255. )); 653 G4VisAttributes * grayc= new G4VisAttributes 653 G4VisAttributes * grayc= new G4VisAttributes( G4Colour(128/255. , 128/255. , 128/255. )); 654 G4VisAttributes * lightGray= new G4VisAttrib 654 G4VisAttributes * lightGray= new G4VisAttributes( G4Colour(178/255. , 178/255. , 178/255. )); 655 G4VisAttributes * green= new G4VisAttributes 655 G4VisAttributes * green= new G4VisAttributes( G4Colour(0/255. , 255/255. , 0/255. )); 656 656 657 yellow->SetVisibility(true); 657 yellow->SetVisibility(true); 658 yellow->SetForceSolid(true); 658 yellow->SetForceSolid(true); 659 red->SetVisibility(true); 659 red->SetVisibility(true); 660 red->SetForceSolid(true); 660 red->SetForceSolid(true); 661 blue->SetVisibility(true); 661 blue->SetVisibility(true); 662 green->SetVisibility(true); 662 green->SetVisibility(true); 663 green->SetForceSolid(true); 663 green->SetForceSolid(true); 664 grayc->SetVisibility(true); 664 grayc->SetVisibility(true); 665 grayc->SetForceSolid(true); 665 grayc->SetForceSolid(true); 666 lightGray->SetVisibility(true); 666 lightGray->SetVisibility(true); 667 lightGray->SetForceSolid(true); 667 lightGray->SetForceSolid(true); 668 simpleBoxVisAtt->SetVisibility(true); 668 simpleBoxVisAtt->SetVisibility(true); 669 if (!phaseSpaceFlag) { 669 if (!phaseSpaceFlag) { 670 logicPixel->SetVisAttributes(red); //modif 670 logicPixel->SetVisAttributes(red); //modified!!! 671 logicHPGe->SetVisAttributes(blue); 671 logicHPGe->SetVisAttributes(blue); 672 672 673 logicDia1->SetVisAttributes(lightGray); 673 logicDia1->SetVisAttributes(lightGray); 674 logicDia3->SetVisAttributes(lightGray); 674 logicDia3->SetVisAttributes(lightGray); 675 675 676 logicOhmicNeg->SetVisAttributes(yellow); 676 logicOhmicNeg->SetVisAttributes(yellow); 677 logicOhmicPos->SetVisAttributes(yellow); 677 logicOhmicPos->SetVisAttributes(yellow); 678 678 679 logicWindow->SetVisAttributes(green); 679 logicWindow->SetVisAttributes(green); 680 680 681 } 681 } 682 logicSample->SetVisAttributes(simpleBoxVisAt 682 logicSample->SetVisAttributes(simpleBoxVisAtt); 683 683 684 if (sampleGranularity) logicSample->SetVisAt 684 if (sampleGranularity) logicSample->SetVisAttributes(simpleBoxVisAtt); // mandatory 685 685 686 686 687 687 688 if (sampleGranularity) logicGrain->SetVisAt 688 if (sampleGranularity) logicGrain->SetVisAttributes(grayc); 689 689 690 //always return the physical World 690 //always return the physical World 691 691 692 PrintApparateParameters(); 692 PrintApparateParameters(); 693 693 694 return physiWorld; 694 return physiWorld; 695 } 695 } 696 696 697 //....oooOO0OOooo........oooOO0OOooo........oo 697 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 698 698 699 void XrayFluoDetectorConstruction::ConstructSD 699 void XrayFluoDetectorConstruction::ConstructSDandField() 700 { 700 { 701 if (!phaseSpaceFlag) 701 if (!phaseSpaceFlag) 702 { 702 { 703 703 704 // 704 // 705 // Sensitive Detectors 705 // Sensitive Detectors 706 // 706 // 707 if (HPGeSD.Get() == 0) 707 if (HPGeSD.Get() == 0) 708 { 708 { 709 XrayFluoSD* SD = new XrayFluoSD ("HPGeSD", 709 XrayFluoSD* SD = new XrayFluoSD ("HPGeSD",this); 710 HPGeSD.Put( SD ); 710 HPGeSD.Put( SD ); 711 } 711 } 712 G4SDManager::GetSDMpointer()->AddNewDete 712 G4SDManager::GetSDMpointer()->AddNewDetector(HPGeSD.Get()); 713 if (logicPixel) 713 if (logicPixel) 714 SetSensitiveDetector(logicPixel,HPGeSD.Get() 714 SetSensitiveDetector(logicPixel,HPGeSD.Get()); 715 } 715 } 716 return; 716 return; 717 } 717 } 718 718 719 //....oooOO0OOooo........oooOO0OOooo........oo 719 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 720 720 721 void XrayFluoDetectorConstruction::PrintAppara 721 void XrayFluoDetectorConstruction::PrintApparateParameters() 722 { 722 { 723 G4cout << "--------------------------------- 723 G4cout << "-----------------------------------------------------------------------" 724 << G4endl 724 << G4endl 725 << "The sample is a box whose size is: " 725 << "The sample is a box whose size is: " 726 << G4endl 726 << G4endl 727 << SampleThickness/cm 727 << SampleThickness/cm 728 << " cm * " 728 << " cm * " 729 << SampleSizeXY/cm 729 << SampleSizeXY/cm 730 << " cm * " 730 << " cm * " 731 << SampleSizeXY/cm 731 << SampleSizeXY/cm 732 << " cm" 732 << " cm" 733 << G4endl 733 << G4endl 734 <<" Material: " << logicSample->GetMaterial 734 <<" Material: " << logicSample->GetMaterial()->GetName() 735 <<G4endl; 735 <<G4endl; 736 if (!phaseSpaceFlag) { 736 if (!phaseSpaceFlag) { 737 G4cout <<"The Detector is a slice " << De 737 G4cout <<"The Detector is a slice " << DeviceThickness/(1.e-6*m) << " micron thick of " << pixelMaterial->GetName() 738 <<G4endl 738 <<G4endl 739 << "The Anode is a slice " << OhmicPosThi 739 << "The Anode is a slice " << OhmicPosThickness/mm << "mm thick of "<< OhmicPosMaterial->GetName() 740 <<G4endl; 740 <<G4endl; 741 } 741 } 742 G4cout <<"---------------------------------- 742 G4cout <<"-------------------------------------------------------------------------" 743 << G4endl; 743 << G4endl; 744 } 744 } 745 //....oooOO0OOooo........oooOO0OOooo........oo 745 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 746 746 747 void XrayFluoDetectorConstruction::UpdateGeome 747 void XrayFluoDetectorConstruction::UpdateGeometry() 748 { 748 { 749 G4GeometryManager::GetInstance()->OpenGeomet 749 G4GeometryManager::GetInstance()->OpenGeometry(); 750 G4PhysicalVolumeStore::Clean(); 750 G4PhysicalVolumeStore::Clean(); 751 G4LogicalVolumeStore::Clean(); 751 G4LogicalVolumeStore::Clean(); 752 G4SolidStore::Clean(); 752 G4SolidStore::Clean(); 753 753 754 if (sampleRegion) 754 if (sampleRegion) 755 sampleRegion->RemoveRootLogicalVolume(logi 755 sampleRegion->RemoveRootLogicalVolume(logicSample); 756 756 757 zRotPhiHPGe.rotateX(-1.*PhiHPGe); 757 zRotPhiHPGe.rotateX(-1.*PhiHPGe); 758 zRotPhiDia1.rotateX(-1.*AlphaDia1); 758 zRotPhiDia1.rotateX(-1.*AlphaDia1); 759 zRotPhiDia3.rotateX(-1.*AlphaDia3); 759 zRotPhiDia3.rotateX(-1.*AlphaDia3); 760 760 761 //Triggers a new call of Construct() and of 761 //Triggers a new call of Construct() and of all the geometry resets. 762 G4RunManager::GetRunManager()->ReinitializeG 762 G4RunManager::GetRunManager()->ReinitializeGeometry(); 763 } 763 } 764 764 765 //....oooOO0OOooo........oooOO0OOooo........oo 765 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 766 766 767 void XrayFluoDetectorConstruction::DeleteGrain 767 void XrayFluoDetectorConstruction::DeleteGrainObjects() 768 { 768 { 769 if (sampleGranularity) { 769 if (sampleGranularity) { 770 delete solidGrain; 770 delete solidGrain; 771 delete logicGrain; 771 delete logicGrain; 772 delete physiGrain; 772 delete physiGrain; 773 } 773 } 774 774 775 } 775 } 776 776 777 //....oooOO0OOooo........oooOO0OOooo........oo 777 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 778 778 779 G4ThreeVector XrayFluoDetectorConstruction::Ge 779 G4ThreeVector XrayFluoDetectorConstruction::GetDetectorPosition() const 780 { 780 { 781 G4double z = DistDe * std::cos(ThetaHPGe); 781 G4double z = DistDe * std::cos(ThetaHPGe); 782 G4double y = DistDe * std::sin(ThetaHPGe); 782 G4double y = DistDe * std::sin(ThetaHPGe); 783 G4double x = 0.*cm; 783 G4double x = 0.*cm; 784 784 785 G4ThreeVector position(x,y,z); 785 G4ThreeVector position(x,y,z); 786 786 787 return position; 787 return position; 788 788 789 } 789 } 790 790 791 //....oooOO0OOooo........oooOO0OOooo........oo 791 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 792 792 793 void XrayFluoDetectorConstruction::SetSampleMa 793 void XrayFluoDetectorConstruction::SetSampleMaterial(G4String newMaterial) 794 { 794 { 795 G4cout << "Material Change in Progress " < 795 G4cout << "Material Change in Progress " << newMaterial << G4endl; 796 sampleMaterial = materials->GetMaterial(ne 796 sampleMaterial = materials->GetMaterial(newMaterial); 797 logicSample->SetMaterial(sampleMaterial); 797 logicSample->SetMaterial(sampleMaterial); 798 PrintApparateParameters(); 798 PrintApparateParameters(); 799 //GeometryHasBeenModified is called by the 799 //GeometryHasBeenModified is called by the messenger 800 } 800 } 801 801 802 //....oooOO0OOooo........oooOO0OOooo........oo 802 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 803 803 804 804 805 805 806 806 807 807 808 808 809 809 810 810 811 811 812 812 813 813 814 814