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