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