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: XrayFluoPlaneDetectorConstruction.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 // 29 aug 2003 Alfonso Mantero Created 34 // 29 aug 2003 Alfonso Mantero Created 33 // ------------------------------------------- 35 // ------------------------------------------------------------------- 34 36 35 #include "XrayFluoPlaneDetectorConstruction.hh 37 #include "XrayFluoPlaneDetectorConstruction.hh" 36 #include "XrayFluoPlaneDetectorMessenger.hh" 38 #include "XrayFluoPlaneDetectorMessenger.hh" 37 #include "XrayFluoSD.hh" 39 #include "XrayFluoSD.hh" 38 #include "XrayFluoNistMaterials.hh" 40 #include "XrayFluoNistMaterials.hh" 39 #include "G4PhysicalConstants.hh" 41 #include "G4PhysicalConstants.hh" 40 #include "G4SystemOfUnits.hh" 42 #include "G4SystemOfUnits.hh" 41 #include "G4Material.hh" 43 #include "G4Material.hh" 42 #include "G4ThreeVector.hh" 44 #include "G4ThreeVector.hh" 43 #include "G4Box.hh" 45 #include "G4Box.hh" 44 #include "G4Sphere.hh" 46 #include "G4Sphere.hh" 45 #include "G4LogicalVolume.hh" 47 #include "G4LogicalVolume.hh" 46 #include "G4PVPlacement.hh" 48 #include "G4PVPlacement.hh" 47 #include "G4TransportationManager.hh" 49 #include "G4TransportationManager.hh" 48 #include "G4SDManager.hh" 50 #include "G4SDManager.hh" 49 #include "G4RunManager.hh" 51 #include "G4RunManager.hh" 50 #include "G4VisAttributes.hh" 52 #include "G4VisAttributes.hh" 51 #include "G4Colour.hh" 53 #include "G4Colour.hh" >> 54 #include "G4ios.hh" 52 #include "G4PVReplica.hh" 55 #include "G4PVReplica.hh" 53 #include "G4UserLimits.hh" 56 #include "G4UserLimits.hh" 54 #include "G4GeometryManager.hh" << 55 #include "G4PhysicalVolumeStore.hh" << 56 #include "G4LogicalVolumeStore.hh" << 57 #include "G4SolidStore.hh" << 58 #include "G4SDManager.hh" << 59 57 60 //....oooOO0OOooo........oooOO0OOooo........oo 58 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 61 59 62 60 63 XrayFluoPlaneDetectorConstruction::XrayFluoPla 61 XrayFluoPlaneDetectorConstruction::XrayFluoPlaneDetectorConstruction() 64 : detectorType(0),planeGranularity(false), D 62 : detectorType(0),planeGranularity(false), DeviceSizeX(0), 65 DeviceSizeY(0),DeviceThickness(0), 63 DeviceSizeY(0),DeviceThickness(0), 66 solidWorld(0),logicWorld(0),physiWorld(0), 64 solidWorld(0),logicWorld(0),physiWorld(0), 67 solidHPGe(0),logicHPGe(0),physiHPGe(0), 65 solidHPGe(0),logicHPGe(0),physiHPGe(0), 68 solidScreen(0),logicScreen(0),physiScreen( 66 solidScreen(0),logicScreen(0),physiScreen(0), 69 solidPlane (0),logicPlane(0),physiPlane (0 67 solidPlane (0),logicPlane(0),physiPlane (0), 70 solidOhmicPos(0),logicOhmicPos(0), physiOh 68 solidOhmicPos(0),logicOhmicPos(0), physiOhmicPos(0), 71 solidOhmicNeg(0),logicOhmicNeg(0), physiOh 69 solidOhmicNeg(0),logicOhmicNeg(0), physiOhmicNeg(0), 72 solidPixel(0),logicPixel(0), physiPixel(0) 70 solidPixel(0),logicPixel(0), physiPixel(0), 73 screenMaterial(0),OhmicPosMaterial(0), Ohm 71 screenMaterial(0),OhmicPosMaterial(0), OhmicNegMaterial(0), 74 pixelMaterial(0),planeMaterial(0), 72 pixelMaterial(0),planeMaterial(0), 75 defaultMaterial(0),HPGeSD(0) 73 defaultMaterial(0),HPGeSD(0) 76 74 77 { 75 { 78 materials = XrayFluoNistMaterials::GetInstan 76 materials = XrayFluoNistMaterials::GetInstance(); 79 77 80 DefineDefaultMaterials(); 78 DefineDefaultMaterials(); 81 79 82 NbOfPixelRows = 1; // should be 1 80 NbOfPixelRows = 1; // should be 1 83 NbOfPixelColumns = 1; // should be 1 81 NbOfPixelColumns = 1; // should be 1 84 NbOfPixels = NbOfPixelRows*NbOfPixel 82 NbOfPixels = NbOfPixelRows*NbOfPixelColumns; 85 PixelSizeXY = 5 * cm; // should be 5 83 PixelSizeXY = 5 * cm; // should be 5 86 PixelThickness = 3.5 * mm; //changed should 84 PixelThickness = 3.5 * mm; //changed should be 3.5 mm 87 85 88 G4cout << "PixelThickness(mm): "<< PixelThic 86 G4cout << "PixelThickness(mm): "<< PixelThickness/mm << G4endl; 89 G4cout << "PixelSizeXY(cm): "<< PixelSizeXY/ 87 G4cout << "PixelSizeXY(cm): "<< PixelSizeXY/cm << G4endl; 90 88 91 ContactSizeXY = 5 * cm; //should be the sam 89 ContactSizeXY = 5 * cm; //should be the same as pixelSizeXY 92 planeThickness = 5 * cm; 90 planeThickness = 5 * cm; 93 planeSizeXY = 5. * m; 91 planeSizeXY = 5. * m; 94 92 95 OhmicNegThickness = 0.005*mm; 93 OhmicNegThickness = 0.005*mm; 96 OhmicPosThickness = 0.005*mm; 94 OhmicPosThickness = 0.005*mm; 97 95 98 screenThickness = 5 * mm; 96 screenThickness = 5 * mm; 99 97 100 ThetaHPGe = 0. * deg; 98 ThetaHPGe = 0. * deg; 101 PhiHPGe = 0. * deg; 99 PhiHPGe = 0. * deg; 102 100 103 101 104 DistDe = 0.5 * m; 102 DistDe = 0.5 * m; 105 103 106 distScreen = DistDe + (screenThickness+Pixel 104 distScreen = DistDe + (screenThickness+PixelThickness)/2+OhmicPosThickness ; 107 105 108 grainDia = 1 * mm; 106 grainDia = 1 * mm; 109 107 110 108 111 PixelCopyNb=0; 109 PixelCopyNb=0; 112 grainCopyNb=0; 110 grainCopyNb=0; 113 G4String defaultDetectorType = "sili"; 111 G4String defaultDetectorType = "sili"; 114 ComputeApparateParameters(); 112 ComputeApparateParameters(); 115 SetDetectorType(defaultDetectorType); 113 SetDetectorType(defaultDetectorType); 116 114 117 // create commands for interactive definitio 115 // create commands for interactive definition of the apparate 118 116 119 detectorMessenger = new XrayFluoPlaneDetecto 117 detectorMessenger = new XrayFluoPlaneDetectorMessenger(this); 120 G4cout << "XrayFluoPlaneDetectorConstruction 118 G4cout << "XrayFluoPlaneDetectorConstruction created" << G4endl; 121 } 119 } 122 //....oooOO0OOooo........oooOO0OOooo........oo 120 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 123 121 124 122 125 XrayFluoPlaneDetectorConstruction* XrayFluoPla 123 XrayFluoPlaneDetectorConstruction* XrayFluoPlaneDetectorConstruction::instance = 0; 126 124 127 XrayFluoPlaneDetectorConstruction* XrayFluoPla 125 XrayFluoPlaneDetectorConstruction* XrayFluoPlaneDetectorConstruction::GetInstance() 128 { 126 { 129 if (instance == 0) 127 if (instance == 0) 130 { 128 { 131 instance = new XrayFluoPlaneDetectorCons 129 instance = new XrayFluoPlaneDetectorConstruction; 132 130 133 } 131 } 134 return instance; 132 return instance; 135 } 133 } 136 134 137 void XrayFluoPlaneDetectorConstruction::SetDet 135 void XrayFluoPlaneDetectorConstruction::SetDetectorType(G4String type) 138 { 136 { 139 137 140 if (type=="sili") 138 if (type=="sili") 141 { 139 { 142 detectorType = XrayFluoSiLiDetectorType: 140 detectorType = XrayFluoSiLiDetectorType::GetInstance(); 143 } 141 } 144 else if (type=="hpge") 142 else if (type=="hpge") 145 { 143 { 146 detectorType = XrayFluoHPGeDetectorType 144 detectorType = XrayFluoHPGeDetectorType::GetInstance(); 147 } 145 } 148 else 146 else 149 { 147 { 150 G4ExceptionDescription execp; 148 G4ExceptionDescription execp; 151 execp << type + "detector type unknown"; 149 execp << type + "detector type unknown"; 152 G4Exception("XrayFluoPlaneDetectorConstr 150 G4Exception("XrayFluoPlaneDetectorConstruction::SetDetectorType()","example-xray_fluorescence03", 153 FatalException, execp); 151 FatalException, execp); 154 } 152 } 155 } 153 } 156 154 157 //....oooOO0OOooo........oooOO0OOooo........oo << 155 XrayFluoVDetectorType* XrayFluoPlaneDetectorConstruction::GetDetectorType() 158 << 159 XrayFluoVDetectorType* XrayFluoPlaneDetectorCo << 160 { 156 { 161 return detectorType; 157 return detectorType; 162 } 158 } 163 159 164 //....oooOO0OOooo........oooOO0OOooo........oo 160 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 165 161 166 XrayFluoPlaneDetectorConstruction::~XrayFluoPl 162 XrayFluoPlaneDetectorConstruction::~XrayFluoPlaneDetectorConstruction() 167 163 168 { 164 { 169 delete detectorMessenger; 165 delete detectorMessenger; 170 delete detectorType; 166 delete detectorType; 171 G4cout << "XrayFluoPlaneDetectorConstruction 167 G4cout << "XrayFluoPlaneDetectorConstruction deleted" << G4endl; 172 } 168 } 173 169 174 //....oooOO0OOooo........oooOO0OOooo........oo 170 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 175 171 176 G4VPhysicalVolume* XrayFluoPlaneDetectorConstr 172 G4VPhysicalVolume* XrayFluoPlaneDetectorConstruction::Construct() 177 { 173 { 178 return ConstructApparate(); 174 return ConstructApparate(); 179 } 175 } 180 //....oooOO0OOooo........oooOO0OOooo........oo 176 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 181 177 182 void XrayFluoPlaneDetectorConstruction::Define 178 void XrayFluoPlaneDetectorConstruction::DefineDefaultMaterials() 183 { 179 { 184 180 185 181 186 //define materials of the apparate 182 //define materials of the apparate 187 183 188 planeMaterial = materials->GetMaterial("Anor 184 planeMaterial = materials->GetMaterial("Anorthosite"); 189 screenMaterial = materials->GetMaterial("G4_ 185 screenMaterial = materials->GetMaterial("G4_Pb"); 190 pixelMaterial = materials->GetMaterial("G4_S 186 pixelMaterial = materials->GetMaterial("G4_Si"); 191 OhmicPosMaterial = materials->GetMaterial("G 187 OhmicPosMaterial = materials->GetMaterial("G4_Cu"); 192 OhmicNegMaterial = materials->GetMaterial("G 188 OhmicNegMaterial = materials->GetMaterial("G4_Pb"); 193 defaultMaterial = materials->GetMaterial("G4 189 defaultMaterial = materials->GetMaterial("G4_Galactic"); 194 } 190 } 195 191 196 //....oooOO0OOooo........oooOO0OOooo........oo 192 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 197 193 198 G4VPhysicalVolume* XrayFluoPlaneDetectorConstr 194 G4VPhysicalVolume* XrayFluoPlaneDetectorConstruction::ConstructApparate() 199 { 195 { 200 // complete the apparate parameters definiti 196 // complete the apparate parameters definition 201 197 202 //ComputeApparateParameters(); 198 //ComputeApparateParameters(); 203 199 204 //world 200 //world 205 201 206 solidWorld = new G4Box("World", 202 solidWorld = new G4Box("World", //its name 207 WorldSizeXY/2,WorldSizeXY/2,WorldSizeZ/ 203 WorldSizeXY/2,WorldSizeXY/2,WorldSizeZ/2); //its size 208 204 209 logicWorld = new G4LogicalVolume(solidWorld, 205 logicWorld = new G4LogicalVolume(solidWorld, //its solid 210 defaultMate 206 defaultMaterial, //its material 211 "World"); 207 "World"); //its name 212 physiWorld = new G4PVPlacement(0, //no r 208 physiWorld = new G4PVPlacement(0, //no rotation 213 G4ThreeVector(), //at (0,0,0) 209 G4ThreeVector(), //at (0,0,0) 214 "World", //its name 210 "World", //its name 215 logicWorld, //its logical volume 211 logicWorld, //its logical volume 216 0, //its mother volume 212 0, //its mother volume 217 false, //no boolean operation 213 false, //no boolean operation 218 0); //copy number 214 0); //copy number 219 215 220 //detector 216 //detector 221 217 222 solidHPGe = 0; physiHPGe = 0; logicHPGe=0; 218 solidHPGe = 0; physiHPGe = 0; logicHPGe=0; 223 solidPixel=0; logicPixel=0; physiPixel=0; 219 solidPixel=0; logicPixel=0; physiPixel=0; 224 220 225 if (DeviceThickness > 0.) 221 if (DeviceThickness > 0.) 226 { 222 { 227 solidHPGe = new G4Box("HPGeDetector", 223 solidHPGe = new G4Box("HPGeDetector", //its name 228 DeviceSizeX/2,DeviceSizeY/2,DeviceTh 224 DeviceSizeX/2,DeviceSizeY/2,DeviceThickness/2);//size 229 225 230 226 231 logicHPGe = new G4LogicalVolume(solidHPG 227 logicHPGe = new G4LogicalVolume(solidHPGe, //its solid 232 defaultMaterial, //its material 228 defaultMaterial, //its material 233 "HPGeDetector"); //its name 229 "HPGeDetector"); //its name 234 230 235 zRotPhiHPGe.rotateX(PhiHPGe); 231 zRotPhiHPGe.rotateX(PhiHPGe); 236 G4double x,y,z; 232 G4double x,y,z; 237 233 238 z = -1. * DistDe; //* std::cos(ThetaHPGe 234 z = -1. * DistDe; //* std::cos(ThetaHPGe); 239 y = 0.*cm; //distScreen * std::sin(Theta 235 y = 0.*cm; //distScreen * std::sin(ThetaHPGe); 240 x = 0.*cm; 236 x = 0.*cm; 241 237 242 physiHPGe = new G4PVPlacement(G4Transfor 238 physiHPGe = new G4PVPlacement(G4Transform3D(zRotPhiHPGe,G4ThreeVector(x,y,z)), 243 "HPGeDetector", //its name 239 "HPGeDetector", //its name 244 logicHPGe, //its logical volume 240 logicHPGe, //its logical volume 245 physiWorld, //its mother volume 241 physiWorld, //its mother volume 246 false, //no boolean operation 242 false, //no boolean operation 247 0); //copy number 243 0); //copy number 248 } 244 } 249 // Pixel 245 // Pixel 250 246 251 247 252 248 253 249 254 for ( G4int j=0; j < NbOfPixelColumns ; j++ 250 for ( G4int j=0; j < NbOfPixelColumns ; j++ ) 255 { for ( G4int i=0; i < NbOfPixelRows ; i++ 251 { for ( G4int i=0; i < NbOfPixelRows ; i++ ) 256 { 252 { 257 solidPixel=0; logicPixel=0; physiPixel=0; 253 solidPixel=0; logicPixel=0; physiPixel=0; 258 if (PixelThickness > 0.) 254 if (PixelThickness > 0.) 259 solidPixel = new G4Box("Pixel", 255 solidPixel = new G4Box("Pixel", 260 PixelSizeXY/2,PixelSizeXY/2, PixelThi 256 PixelSizeXY/2,PixelSizeXY/2, PixelThickness/2); 261 257 262 logicPixel = new G4LogicalVolume(solidPixel, 258 logicPixel = new G4LogicalVolume(solidPixel, 263 pixelMaterial, //its material 259 pixelMaterial, //its material 264 "Pixel"); //its name 260 "Pixel"); //its name 265 261 266 /* 262 /* 267 zRotPhiHPGe.rotateX(PhiHPGe); 263 zRotPhiHPGe.rotateX(PhiHPGe); 268 G4double x,y,z; 264 G4double x,y,z; 269 z = DistDe * std::cos(ThetaHPGe); 265 z = DistDe * std::cos(ThetaHPGe); 270 y =DistDe * std::sin(ThetaHPGe); 266 y =DistDe * std::sin(ThetaHPGe); 271 x = 0.*cm;*/ 267 x = 0.*cm;*/ 272 physiPixel = new G4PVPlacement(0, 268 physiPixel = new G4PVPlacement(0, 273 G4ThreeVector(0, 269 G4ThreeVector(0, 274 i*PixelSizeXY, 270 i*PixelSizeXY, 275 j*PixelSizeXY ), 271 j*PixelSizeXY ), 276 "Pixel", 272 "Pixel", 277 logicPixel, //its logical vol 273 logicPixel, //its logical volume 278 physiHPGe, //its mother volume 274 physiHPGe, //its mother volume 279 false, //no boolean operation 275 false, //no boolean operation 280 PixelCopyNb);//copy number 276 PixelCopyNb);//copy number 281 277 282 278 283 279 284 280 285 281 286 282 287 // OhmicNeg 283 // OhmicNeg 288 284 289 solidOhmicNeg=0; logicOhmicNeg=0; physiOhmic 285 solidOhmicNeg=0; logicOhmicNeg=0; physiOhmicNeg=0; 290 286 291 if (OhmicNegThickness > 0.) 287 if (OhmicNegThickness > 0.) 292 { solidOhmicNeg = new G4Box("OhmicNeg", 288 { solidOhmicNeg = new G4Box("OhmicNeg", //its name 293 PixelSizeXY/2,PixelSizeXY/2,Ohmi 289 PixelSizeXY/2,PixelSizeXY/2,OhmicNegThickness/2); 294 290 295 logicOhmicNeg = new G4LogicalVolume(solidO 291 logicOhmicNeg = new G4LogicalVolume(solidOhmicNeg, //its solid 296 OhmicNegMaterial, //its materi 292 OhmicNegMaterial, //its material 297 "OhmicNeg"); //its name 293 "OhmicNeg"); //its name 298 294 299 physiOhmicNeg = new G4PVPlacement(0, 295 physiOhmicNeg = new G4PVPlacement(0, 300 G4ThreeVector 296 G4ThreeVector 301 (0., 297 (0., 302 0., 298 0., 303 (PixelThickness+OhmicNegThickn 299 (PixelThickness+OhmicNegThickness)/2), 304 "OhmicNeg", //its name 300 "OhmicNeg", //its name 305 logicOhmicNeg, //its logical 301 logicOhmicNeg, //its logical volume 306 physiHPGe, //its mother 302 physiHPGe, //its mother 307 false, //no boulean 303 false, //no boulean operat 308 PixelCopyNb); //c 304 PixelCopyNb); //copy number 309 305 310 } 306 } 311 // OhmicPos 307 // OhmicPos 312 solidOhmicPos=0; logicOhmicPos=0; physiOhmic 308 solidOhmicPos=0; logicOhmicPos=0; physiOhmicPos=0; 313 309 314 if (OhmicPosThickness > 0.) 310 if (OhmicPosThickness > 0.) 315 { solidOhmicPos = new G4Box("OhmicPos", 311 { solidOhmicPos = new G4Box("OhmicPos", //its name 316 PixelSizeXY/2,PixelSizeXY/2,Ohmi 312 PixelSizeXY/2,PixelSizeXY/2,OhmicPosThickness/2); 317 313 318 logicOhmicPos = new G4LogicalVolume(solidO 314 logicOhmicPos = new G4LogicalVolume(solidOhmicPos, //its solid 319 OhmicPosMaterial, //its materi 315 OhmicPosMaterial, //its material 320 "OhmicPos"); //its name 316 "OhmicPos"); //its name 321 317 322 physiOhmicPos = new G4PVPlacement(0, 318 physiOhmicPos = new G4PVPlacement(0, 323 G4ThreeVector(0., 319 G4ThreeVector(0., 324 0., 320 0., 325 (-PixelThickness-OhmicPosThick 321 (-PixelThickness-OhmicPosThickness)/2), 326 "OhmicPos", 322 "OhmicPos", 327 logicOhmicPos, 323 logicOhmicPos, 328 physiHPGe, 324 physiHPGe, 329 false, 325 false, 330 PixelCopyNb); 326 PixelCopyNb); 331 327 332 } 328 } 333 329 334 PixelCopyNb += PixelCopyNb; 330 PixelCopyNb += PixelCopyNb; 335 G4cout << "PixelCopyNb: " << PixelCopyNb << 331 G4cout << "PixelCopyNb: " << PixelCopyNb << G4endl; 336 } 332 } 337 333 338 } 334 } 339 335 340 // Screen 336 // Screen 341 337 342 if (DeviceThickness > 0.) 338 if (DeviceThickness > 0.) 343 { 339 { 344 solidScreen = new G4Box("DetectorScreen" 340 solidScreen = new G4Box("DetectorScreen", //its name 345 screenSizeXY/2,screenSizeXY/2,screen 341 screenSizeXY/2,screenSizeXY/2,screenThickness/2);//size 346 342 347 343 348 logicScreen = new G4LogicalVolume(solidS 344 logicScreen = new G4LogicalVolume(solidScreen, //its solid 349 defaultMaterial, //its material 345 defaultMaterial, //its material 350 "DetectorScreen"); //its name 346 "DetectorScreen"); //its name 351 347 352 //zRotPhiHPGe.rotateX(PhiHPGe); 348 //zRotPhiHPGe.rotateX(PhiHPGe); 353 G4double x,y,z; 349 G4double x,y,z; 354 G4cout << "distScreen: "<< distScreen/m 350 G4cout << "distScreen: "<< distScreen/m <<G4endl; 355 z = -1 * distScreen; //* std::cos(ThetaH 351 z = -1 * distScreen; //* std::cos(ThetaHPGe); 356 y = 0.*cm; //distScreen * std::sin(Theta 352 y = 0.*cm; //distScreen * std::sin(ThetaHPGe); 357 x = 0.*cm; 353 x = 0.*cm; 358 physiScreen = new G4PVPlacement(G4Transf 354 physiScreen = new G4PVPlacement(G4Transform3D(zRotPhiHPGe,G4ThreeVector(x,y,z)), 359 "DetectorScreen", //its name 355 "DetectorScreen", //its name 360 logicScreen, //its logical volume 356 logicScreen, //its logical volume 361 physiWorld, //its mother volume 357 physiWorld, //its mother volume 362 false, //no boolean operation 358 false, //no boolean operation 363 0); //copy number 359 0); //copy number 364 } 360 } 365 361 366 //Plane 362 //Plane 367 363 368 if (planeGranularity) { 364 if (planeGranularity) { 369 365 370 solidPlane=0; logicPlane=0; physiPlane=0 366 solidPlane=0; logicPlane=0; physiPlane=0; 371 if (planeThickness > 0.) 367 if (planeThickness > 0.) 372 { 368 { 373 solidPlane = new G4Box("Plane", //its name 369 solidPlane = new G4Box("Plane", //its name 374 planeSizeXY/2,planeSizeXY/2,planeThick 370 planeSizeXY/2,planeSizeXY/2,planeThickness/2);//size 375 371 376 logicPlane= new G4LogicalVolume(solidPlane, 372 logicPlane= new G4LogicalVolume(solidPlane, //its solid 377 defaultMaterial, //its material 373 defaultMaterial, //its material 378 "Plane"); //its name 374 "Plane"); //its name 379 375 380 physiPlane = new G4PVPlacement(0, //no r 376 physiPlane = new G4PVPlacement(0, //no rotation 381 G4ThreeVector(), //at (0,0,0) 377 G4ThreeVector(), //at (0,0,0) 382 "Plane", //its name 378 "Plane", //its name 383 logicPlane, //its logical volume 379 logicPlane, //its logical volume 384 physiWorld, //its mother volume 380 physiWorld, //its mother volume 385 false, //no boolean operation 381 false, //no boolean operation 386 0); //copy number 382 0); //copy number 387 383 388 } 384 } 389 385 390 386 391 387 392 388 393 G4int nbOfGrainsX = ((G4int)(planeSizeXY/g 389 G4int nbOfGrainsX = ((G4int)(planeSizeXY/grainDia)) -1 ; 394 390 395 // y dim of a max density plane is 2rn-(n- 391 // y dim of a max density plane is 2rn-(n-1)ar, wehere a = (1-(std::sqrt(3)/2)), n is 396 // number of rows and r the radius of the 392 // number of rows and r the radius of the grain. so the Y-dim of the plane must 397 // be greater or equal to this. It results 393 // be greater or equal to this. It results that nmust be <= (PlaneY-a)/(1-a). 398 // Max Y shift of the planes superimposing 394 // Max Y shift of the planes superimposing along Z axis is minor (2/std::sqrt(3)r) 399 395 400 G4double a = (1.-(std::sqrt(3.)/2.)); 396 G4double a = (1.-(std::sqrt(3.)/2.)); 401 G4int nbOfGrainsY = (G4int) ( ((planeSize 397 G4int nbOfGrainsY = (G4int) ( ((planeSizeXY/(grainDia/2.)) -a)/(2.-a) ) -1; 402 398 403 // same for the z axis, but a = 2 * (std:: 399 // same for the z axis, but a = 2 * (std::sqrt(3) - std::sqrt(2))/std::sqrt(3) 404 400 405 G4double b = 2. * (std::sqrt(3.) - std::sq 401 G4double b = 2. * (std::sqrt(3.) - std::sqrt(2.))/std::sqrt(3.); 406 G4int nbOfGrainsZ = (G4int) ( ((planeThic 402 G4int nbOfGrainsZ = (G4int) ( ((planeThickness/(grainDia/2.)) -b)/(2.-b) )-1; 407 403 408 if (planeThickness > 0.){ 404 if (planeThickness > 0.){ 409 405 410 solidGrain=0; logicGrain=0; physiGrain=0 406 solidGrain=0; logicGrain=0; physiGrain=0; 411 solidGrain = new G4Sphere("Grain",0., 407 solidGrain = new G4Sphere("Grain",0., 412 grainDia/2,0., twopi, 0., pi); 408 grainDia/2,0., twopi, 0., pi); 413 409 414 logicGrain = new G4LogicalVolume(solidGr 410 logicGrain = new G4LogicalVolume(solidGrain, 415 planeMaterial, //its material 411 planeMaterial, //its material 416 "Grain"); //its name 412 "Grain"); //its name 417 G4ThreeVector grainPosition; 413 G4ThreeVector grainPosition; 418 G4double grainInitPositionX = 0; 414 G4double grainInitPositionX = 0; 419 G4double grainInitPositionY = 0; 415 G4double grainInitPositionY = 0; 420 G4double grainInitPositionZ = (-1.*plane 416 G4double grainInitPositionZ = (-1.*planeThickness/2.+grainDia/2.); 421 G4double grainStepX = grainDia = 0; 417 G4double grainStepX = grainDia = 0; 422 G4double grainStepY = grainDia*(1.-(0.5- 418 G4double grainStepY = grainDia*(1.-(0.5-(std::sqrt(3.)/4.))); 423 G4double grainStepZ = grainDia*std::sqrt 419 G4double grainStepZ = grainDia*std::sqrt(2./3.); 424 420 425 for ( G4int k=0; k < nbOfGrainsZ ; k++ ) 421 for ( G4int k=0; k < nbOfGrainsZ ; k++ ) { 426 for ( G4int j=0; j < nbOfGrainsY ; j++ ) { 422 for ( G4int j=0; j < nbOfGrainsY ; j++ ) { 427 for ( G4int i=0; i < nbOfGrainsX ; i++ ) { 423 for ( G4int i=0; i < nbOfGrainsX ; i++ ) { 428 424 429 // Now we identify the layer and the row 425 // Now we identify the layer and the row where the grain is , to place it in the right position 430 426 431 427 432 428 433 if (k%3 == 0) { // first or (4-multiple) 429 if (k%3 == 0) { // first or (4-multiple)th layer: structure is ABCABC 434 grainInitPositionY = (-1.*planeSizeXY/ 430 grainInitPositionY = (-1.*planeSizeXY/2.+grainDia/2.); 435 if (j%2 ==0) { //first or (3-multiple) 431 if (j%2 ==0) { //first or (3-multiple)th row 436 grainInitPositionX = (-1.*planeSizeXY/2.+g 432 grainInitPositionX = (-1.*planeSizeXY/2.+grainDia/2.); 437 } 433 } 438 434 439 else if ( ((j+1) % 2) == 0 ) { 435 else if ( ((j+1) % 2) == 0 ) { 440 grainInitPositionX = (-1.*planeSizeXY/2.+ 436 grainInitPositionX = (-1.*planeSizeXY/2.+ grainDia); 441 } 437 } 442 438 443 } 439 } 444 else if ( ((k+2) % 3) == 0 ) { // B-laye 440 else if ( ((k+2) % 3) == 0 ) { // B-layer 445 441 446 grainInitPositionY = ( (-1.*planeSizeX 442 grainInitPositionY = ( (-1.*planeSizeXY/2.) + (grainDia/2.)*(1. + (1./std::sqrt(3.)) ) ); 447 443 448 if (j%2 ==0) { //first or (3-multiple) 444 if (j%2 ==0) { //first or (3-multiple)th row 449 grainInitPositionX = (-1.*planeSizeXY/2.+g 445 grainInitPositionX = (-1.*planeSizeXY/2.+grainDia); 450 } 446 } 451 447 452 else if ( (j+1)%2 == 0 ) { 448 else if ( (j+1)%2 == 0 ) { 453 grainInitPositionX = (-1.*planeSizeXY/2.+g 449 grainInitPositionX = (-1.*planeSizeXY/2.+grainDia/2); 454 } 450 } 455 451 456 } 452 } 457 453 458 else if ( (k+1)%3 == 0 ) { // B-layer 454 else if ( (k+1)%3 == 0 ) { // B-layer 459 455 460 grainInitPositionY = (-1.*planeSizeXY/ 456 grainInitPositionY = (-1.*planeSizeXY/2.+(grainDia/2.)*(1.+2./std::sqrt(3.)) ); 461 457 462 if (j%2 ==0) { //first or (3-multiple) 458 if (j%2 ==0) { //first or (3-multiple)th row 463 grainInitPositionX = (-1.*planeSizeXY/2.+g 459 grainInitPositionX = (-1.*planeSizeXY/2.+grainDia/2.); 464 } 460 } 465 461 466 else if ( (j+1)%2 == 0 ) { 462 else if ( (j+1)%2 == 0 ) { 467 grainInitPositionX = (-1.*planeSizeXY/2.+g 463 grainInitPositionX = (-1.*planeSizeXY/2.+grainDia); 468 } 464 } 469 465 470 } 466 } 471 467 472 physiGrain = new G4PVPlacement(0, 468 physiGrain = new G4PVPlacement(0, 473 G4ThreeVector( grainInitPositionX 469 G4ThreeVector( grainInitPositionX + i*grainStepX, 474 grainInitPositionY + j*grainSt 470 grainInitPositionY + j*grainStepY, 475 grainInitPositionZ + k*grainSt 471 grainInitPositionZ + k*grainStepZ), 476 "Grain", 472 "Grain", 477 logicGrain, //its logical volum 473 logicGrain, //its logical volume 478 physiPlane, //its mother volume 474 physiPlane, //its mother volume 479 false, //no boolean operation 475 false, //no boolean operation 480 grainCopyNb);//copy number 476 grainCopyNb);//copy number 481 477 482 grainCopyNb = grainCopyNb +1; 478 grainCopyNb = grainCopyNb +1; 483 } 479 } 484 } 480 } 485 } 481 } 486 } 482 } 487 } 483 } 488 else { 484 else { 489 485 490 solidPlane=0; logicPlane=0; physiPlane=0 486 solidPlane=0; logicPlane=0; physiPlane=0; 491 if (planeThickness > 0.) 487 if (planeThickness > 0.) 492 { 488 { 493 solidPlane = new G4Box("Plane", //its name 489 solidPlane = new G4Box("Plane", //its name 494 planeSizeXY/2,planeSizeXY/2,planeThick 490 planeSizeXY/2,planeSizeXY/2,planeThickness/2);//size 495 491 496 logicPlane= new G4LogicalVolume(solidPlane, 492 logicPlane= new G4LogicalVolume(solidPlane, //its solid 497 planeMaterial, //its material 493 planeMaterial, //its material 498 "Plane"); //its name 494 "Plane"); //its name 499 495 500 physiPlane = new G4PVPlacement(0, //no r 496 physiPlane = new G4PVPlacement(0, //no rotation 501 G4ThreeVector(), //at (0,0,0) 497 G4ThreeVector(), //at (0,0,0) 502 "Plane", //its name 498 "Plane", //its name 503 logicPlane, //its logical volume 499 logicPlane, //its logical volume 504 physiWorld, //its mother volume 500 physiWorld, //its mother volume 505 false, //no boolean operation 501 false, //no boolean operation 506 0); //copy number 502 0); //copy number 507 503 508 } 504 } 509 } 505 } 510 506 >> 507 G4SDManager* SDman = G4SDManager::GetSDMpointer(); >> 508 >> 509 if(!HPGeSD) >> 510 { >> 511 HPGeSD = new XrayFluoSD ("HPGeSD",this); >> 512 SDman->AddNewDetector(HPGeSD); >> 513 } >> 514 >> 515 >> 516 if (logicPixel) >> 517 { >> 518 logicPixel->SetSensitiveDetector(HPGeSD); >> 519 } >> 520 511 // Visualization attributes 521 // Visualization attributes 512 522 513 logicWorld->SetVisAttributes (G4VisAttribute << 523 logicWorld->SetVisAttributes (G4VisAttributes::Invisible); 514 G4VisAttributes* simpleBoxVisAtt= new G4Vis 524 G4VisAttributes* simpleBoxVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0)); 515 G4VisAttributes * yellow= new G4VisAttribut 525 G4VisAttributes * yellow= new G4VisAttributes( G4Colour(255/255. ,255/255. ,51/255. )); 516 G4VisAttributes * red= new G4VisAttributes( 526 G4VisAttributes * red= new G4VisAttributes( G4Colour(255/255. , 0/255. , 0/255. )); 517 G4VisAttributes * blue= new G4VisAttributes 527 G4VisAttributes * blue= new G4VisAttributes( G4Colour(0/255. , 0/255. , 255/255. )); 518 G4VisAttributes * grayc= new G4VisAttribute 528 G4VisAttributes * grayc= new G4VisAttributes( G4Colour(128/255. , 128/255. , 128/255. )); 519 G4VisAttributes * lightGray= new G4VisAttri 529 G4VisAttributes * lightGray= new G4VisAttributes( G4Colour(178/255. , 178/255. , 178/255. )); 520 yellow->SetVisibility(true); 530 yellow->SetVisibility(true); 521 yellow->SetForceSolid(true); 531 yellow->SetForceSolid(true); 522 red->SetVisibility(true); 532 red->SetVisibility(true); 523 red->SetForceSolid(true); 533 red->SetForceSolid(true); 524 blue->SetVisibility(true); 534 blue->SetVisibility(true); 525 grayc->SetVisibility(true); 535 grayc->SetVisibility(true); 526 grayc->SetForceSolid(true); 536 grayc->SetForceSolid(true); 527 lightGray->SetVisibility(true); 537 lightGray->SetVisibility(true); 528 lightGray->SetForceSolid(true); 538 lightGray->SetForceSolid(true); 529 simpleBoxVisAtt->SetVisibility(true); 539 simpleBoxVisAtt->SetVisibility(true); 530 540 531 logicPixel->SetVisAttributes(red); //modifie 541 logicPixel->SetVisAttributes(red); //modified!!! 532 logicHPGe->SetVisAttributes(blue); 542 logicHPGe->SetVisAttributes(blue); 533 543 534 logicPlane->SetVisAttributes(lightGray); 544 logicPlane->SetVisAttributes(lightGray); 535 545 536 546 537 logicScreen->SetVisAttributes(grayc); 547 logicScreen->SetVisAttributes(grayc); 538 logicOhmicNeg->SetVisAttributes(yellow); 548 logicOhmicNeg->SetVisAttributes(yellow); 539 logicOhmicPos->SetVisAttributes(yellow); 549 logicOhmicPos->SetVisAttributes(yellow); 540 550 541 551 542 552 543 if (planeGranularity) logicGrain->SetVisAtt 553 if (planeGranularity) logicGrain->SetVisAttributes(grayc); 544 554 545 //always return the physical World 555 //always return the physical World 546 556 547 PrintApparateParameters(); 557 PrintApparateParameters(); 548 558 549 return physiWorld; 559 return physiWorld; 550 } 560 } 551 561 552 //....oooOO0OOooo........oooOO0OOooo........oo << 553 << 554 void XrayFluoPlaneDetectorConstruction::Constr << 555 { << 556 // << 557 // Sensitive Detectors << 558 // << 559 if (HPGeSD.Get() == 0) << 560 { << 561 XrayFluoSD* SD = new XrayFluoSD ("HPGeSD << 562 HPGeSD.Put( SD ); << 563 } << 564 G4SDManager::GetSDMpointer()->AddNewDetector << 565 if (logicPixel) << 566 SetSensitiveDetector(logicPixel,HPGeSD.Get << 567 } << 568 << 569 //....oooOO0OOooo........oooOO0OOooo........oo 562 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 570 563 571 void XrayFluoPlaneDetectorConstruction::PrintA 564 void XrayFluoPlaneDetectorConstruction::PrintApparateParameters() 572 { 565 { 573 G4cout << "--------------------------------- 566 G4cout << "-----------------------------------------------------------------------" 574 << G4endl 567 << G4endl 575 << "The plane is a box whose size is: " 568 << "The plane is a box whose size is: " 576 << G4endl 569 << G4endl 577 << planeThickness/cm 570 << planeThickness/cm 578 << " cm * " 571 << " cm * " 579 << planeSizeXY/cm 572 << planeSizeXY/cm 580 << " cm * " 573 << " cm * " 581 << planeSizeXY/cm 574 << planeSizeXY/cm 582 << " cm" 575 << " cm" 583 << G4endl 576 << G4endl 584 <<" Material: " << logicPlane->GetMaterial( 577 <<" Material: " << logicPlane->GetMaterial()->GetName() 585 <<G4endl 578 <<G4endl 586 <<"The Detector is a slice " << DeviceThi 579 <<"The Detector is a slice " << DeviceThickness/(1.e-6*m) << " micron thick of " << pixelMaterial->GetName() 587 <<G4endl 580 <<G4endl 588 581 589 582 590 <<"------------------------------------------- 583 <<"-------------------------------------------------------------------------" 591 << G4endl; 584 << G4endl; 592 } 585 } 593 //....oooOO0OOooo........oooOO0OOooo........oo 586 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 594 587 595 void XrayFluoPlaneDetectorConstruction::Update 588 void XrayFluoPlaneDetectorConstruction::UpdateGeometry() 596 { 589 { 597 G4GeometryManager::GetInstance()->OpenGeomet << 590 598 G4PhysicalVolumeStore::Clean(); << 591 delete solidHPGe; 599 G4LogicalVolumeStore::Clean(); << 592 delete logicHPGe; 600 G4SolidStore::Clean(); << 593 delete physiHPGe; 601 << 594 delete solidPixel; >> 595 delete logicPixel; >> 596 delete physiPixel; >> 597 delete solidOhmicNeg; >> 598 delete logicOhmicNeg; >> 599 delete physiOhmicNeg; >> 600 delete solidOhmicPos; >> 601 delete logicOhmicPos; >> 602 delete physiOhmicPos; >> 603 delete solidPlane; >> 604 delete logicPlane; >> 605 delete physiPlane; >> 606 delete solidScreen; >> 607 delete logicScreen; >> 608 delete physiScreen; >> 609 delete solidWorld; >> 610 delete logicWorld; >> 611 delete physiWorld; >> 612 602 zRotPhiHPGe.rotateX(-1.*PhiHPGe); 613 zRotPhiHPGe.rotateX(-1.*PhiHPGe); 603 //Triggers a new call of Construct() and of << 614 G4RunManager::GetRunManager()->DefineWorldVolume(ConstructApparate()); 604 G4RunManager::GetRunManager()->ReinitializeG << 605 } 615 } 606 616 607 //....oooOO0OOooo........oooOO0OOooo........oo << 608 617 609 void XrayFluoPlaneDetectorConstruction::Delete 618 void XrayFluoPlaneDetectorConstruction::DeleteGrainObjects() 610 { 619 { 611 if (planeGranularity) { 620 if (planeGranularity) { 612 delete solidGrain; 621 delete solidGrain; 613 delete logicGrain; 622 delete logicGrain; 614 delete physiGrain; 623 delete physiGrain; 615 } 624 } 616 625 617 } 626 } 618 << 619 //....oooOO0OOooo........oooOO0OOooo........oo << 620 << 621 void XrayFluoPlaneDetectorConstruction::SetPla 627 void XrayFluoPlaneDetectorConstruction::SetPlaneMaterial(G4String newMaterial) 622 { 628 { 623 //G4cout << "Material!!!!" << newMaterial << << 629 624 logicPlane->SetMaterial(materials->GetMateri << 630 625 PrintApparateParameters(); << 631 G4cout << "Material!!!!" << newMaterial << G4cout; 626 //GeometryHasBeenModified is called by the m << 632 logicPlane->SetMaterial(materials->GetMaterial(newMaterial)); 627 << 633 PrintApparateParameters(); >> 634 628 } 635 } 629 636 630 //....oooOO0OOooo........oooOO0OOooo........oo 637 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 631 << 632 638 633 639 634 640 635 641 636 642 637 643 638 644 639 645 640 646 641 647 642 648 643 649