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