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 // Hadrontherapy advanced example for Geant4 27 // See more at: https://twiki.cern.ch/twiki/bi 28 // Simulation of the "Zero degree" experimenta 29 30 #include "G4Box.hh" 31 #include "G4Tubs.hh" 32 #include "G4VisAttributes.hh" 33 #include "G4Colour.hh" 34 #include "globals.hh" 35 #include "G4RunManager.hh" 36 #include "G4LogicalVolume.hh" 37 #include "G4PVPlacement.hh" 38 #include "G4RotationMatrix.hh" 39 #include "G4NistManager.hh" 40 #include "G4NistElementBuilder.hh" 41 #include "HadrontherapyDetectorConstruction.hh 42 #include "HadrontherapyModulator.hh" 43 #include "PassiveCarbonBeamLine.hh" 44 #include "G4SystemOfUnits.hh" 45 #include "G4Trd.hh" 46 #include "PassiveCarbonBeamLineMessenger.hh" 47 #include "G4UnionSolid.hh" 48 49 using namespace std; 50 51 //G4bool PassiveCarbonBeamLine::doCalculation 52 ////////////////////////////////////////////// 53 PassiveCarbonBeamLine::PassiveCarbonBeamLine() 54 physicalTreatmentRoom(0),hadrontherapyDetector 55 physiBeamLineSupport(0), physiBeamLineCover(0) 56 physiKaptonWindow(0),PhysiRippleFilter(0),Phys 57 physiFirstMonitorLayer1(0), physiFirstMonitorL 58 physiFirstMonitorLayer3(0), physiFirstMonitorL 59 physiNozzleSupport(0), physiHoleNozzleSupport( 60 { 61 62 // Messenger to change parameters of the p 63 PassiveCarbonMessenger = new PassiveCarbon 64 65 //***************************** PW ******* 66 67 static G4String ROGeometryName = "Detector 68 RO = new HadrontherapyDetectorROGeometry(R 69 70 71 G4cout << "Going to register Parallel worl 72 RegisterParallelWorld(RO); 73 G4cout << "... done" << G4endl; 74 //***************************** PW ******* 75 } 76 77 ////////////////////////////////////////////// 78 PassiveCarbonBeamLine::~PassiveCarbonBeamLine( 79 { 80 delete hadrontherapyDetectorConstruction; 81 delete PassiveCarbonMessenger; 82 } 83 84 ////////////////////////////////////////////// 85 G4VPhysicalVolume* PassiveCarbonBeamLine::Cons 86 { 87 // Sets default geometry and materials 88 SetDefaultDimensions(); 89 90 // Construct the whole CarbonPassive Beam 91 ConstructPassiveCarbonBeamLine(); 92 93 94 //***************************** PW ******* 95 if (!hadrontherapyDetectorConstruction) 96 97 //***************************** PW *** 98 // HadrontherapyDetectorConstruction b 99 hadrontherapyDetectorConstruction = ne 100 101 //***************************** PW ******* 102 103 hadrontherapyDetectorConstruction->Initial 104 105 //***************************** PW ******* 106 return physicalTreatmentRoom; 107 } 108 109 // In the following method the DEFAULTS used i 110 // passive beam line are provided 111 // HERE THE USER CAN CHANGE THE GEOMETRY CHARA 112 // LINE ELEMENTS, ALTERNATIVELY HE/SHE CAN USE 113 // MESSENGER IS PROVIDED) 114 // 115 // DEFAULT MATERIAL ARE ALSO PROVIDED 116 // and COLOURS ARE ALSO DEFINED 117 // ------------------------------------------- 118 ////////////////////////////////////////////// 119 void PassiveCarbonBeamLine::SetDefaultDimensio 120 { 121 // Set of coulors that can be used 122 white = new G4VisAttributes( G4Colour()); 123 white -> SetVisibility(true); 124 white -> SetForceSolid(true); 125 126 black = new G4VisAttributes( G4Colour(1., 127 black -> SetVisibility(true); 128 black -> SetForceSolid(true); 129 130 131 blue = new G4VisAttributes(G4Colour(0. ,0. 132 blue -> SetVisibility(true); 133 blue -> SetForceSolid(true); 134 135 gray = new G4VisAttributes( G4Colour(0.5, 136 gray-> SetVisibility(true); 137 gray-> SetForceSolid(true); 138 139 red = new G4VisAttributes(G4Colour(1. ,0. 140 red-> SetVisibility(true); 141 red-> SetForceSolid(true); 142 143 yellow = new G4VisAttributes(G4Colour(1., 144 yellow-> SetVisibility(true); 145 yellow-> SetForceSolid(true); 146 147 green = new G4VisAttributes( G4Colour(25/2 148 green -> SetVisibility(true); 149 green -> SetForceSolid(true); 150 151 darkGreen = new G4VisAttributes( G4Colour( 152 darkGreen -> SetVisibility(true); 153 darkGreen -> SetForceSolid(true); 154 155 darkOrange3 = new G4VisAttributes( G4Colou 156 darkOrange3 -> SetVisibility(true); 157 darkOrange3 -> SetForceSolid(true); 158 159 skyBlue = new G4VisAttributes( G4Colour(13 160 skyBlue -> SetVisibility(true); 161 skyBlue -> SetForceSolid(true); 162 163 164 // FINAL COLLIMATOR: is the collimator giv 165 // of the beam 166 167 G4double defaultinnerRadiusFinalCollimator 168 innerRadiusFinalCollimator = defaultinnerR 169 170 // DEFAULT DEFINITION OF THE MATERIALS 171 // All elements and compound definition fo 172 173 // ELEMENTS 174 G4bool isotopes = false; 175 aluminumNist = G4NistManager::Instance()-> 176 G4Element* zincNist = G4NistManager::Insta 177 G4Element* copperNist = G4NistManager::Ins 178 179 // MATERIAL (Including compounds) 180 copperNistMaterial = G4NistManager::Instan 181 airNist = G4NistManager::Instance()->Find 182 kaptonNist = G4NistManager::Instance()->Fi 183 galacticNist = G4NistManager::Instance()-> 184 PMMANist = G4NistManager::Instance()->Find 185 tantalumNist = G4NistManager::Instance()-> 186 187 G4double d; // Density 188 G4int nComponents;// Number of components 189 G4double fractionmass; // Fraction in mass 190 191 d = 8.40*g/cm3; 192 nComponents = 2; 193 brass = new G4Material("Brass", d, nCompon 194 brass -> AddElement(zincNist, fractionmass 195 brass -> AddElement(copperNist, fractionma 196 197 //***************************** PW ******* 198 199 // DetectorROGeometry Material 200 new G4Material("dummyMat", 1., 1.*g/mole, 201 202 //***************************** PW ******* 203 204 // MATERIAL ASSIGNMENT 205 // Support of the beam line 206 beamLineSupportMaterial = aluminumNist; 207 208 // Vacuum pipe 209 vacuumZoneMaterial = galacticNist; 210 firstScatteringFoilMaterial = tantalumNist 211 212 // Material of kapton window 213 kaptonWindowMaterial = kaptonNist; 214 215 // Material of ripple filter 216 rippleFilterMaterial = PMMANist; 217 rippleFilterBoxMaterial = airNist; 218 219 // Materials of the monitor chamber 220 layer1MonitorChamberMaterial = kaptonNist; 221 layer2MonitorChamberMaterial = copperNistM 222 layer3MonitorChamberMaterial = airNist; 223 layer4MonitorChamberMaterial = copperNistM 224 225 // Material of the final nozzle 226 nozzleSupportMaterial = PMMANist; 227 holeNozzleSupportMaterial = airNist; 228 seconHoleNozzleSupportMaterial = airNist; 229 230 // Material of the final collimator 231 brassTubeMaterial = brassTube2Material = b 232 233 // Material of the final collimator 234 finalCollimatorMaterial = brass; 235 236 // Material of the PMMA collimator 237 PMMACollimatorMaterial = airNist; 238 239 240 G4Element* hydrogenNist = G4NistManager::I 241 G4Element* oxygenNist = G4NistManager::Ins 242 G4Element* carbonNist = G4NistManager::Ins 243 244 G4Material* plastic = new G4Material("Plas 245 plastic -> AddElement(carbonNist, 21); 246 plastic -> AddElement(oxygenNist, 4); 247 plastic -> AddElement(hydrogenNist, 24); 248 PMMANist = plastic; 249 250 251 252 } 253 254 ////////////////////////////////////////////// 255 void PassiveCarbonBeamLine::ConstructPassiveCa 256 { 257 // ----------------------------- 258 // Treatment room - World volume 259 //------------------------------ 260 // Treatment room sizes 261 262 const G4double worldX = 400.0 *cm; 263 const G4double worldY = 400.0 *cm; 264 const G4double worldZ = 400.0 *cm; 265 G4bool isotopes = false; 266 267 airNist = G4NistManager::Instance()->Find 268 treatmentRoom = new G4Box("TreatmentRoom", 269 logicTreatmentRoom = new G4LogicalVolume(t 270 a 271 " 272 0 273 physicalTreatmentRoom = new G4PVPlacement( 274 275 276 277 278 279 280 // The treatment room is invisible in the 281 logicTreatmentRoom -> SetVisAttributes (G4 282 283 // Components of the Passive Carbon Beam L 284 HadrontherapyBeamLineSupport(); 285 VacuumToAirInterface(); 286 HadrontherapyBeamMonitoring(); 287 HadrontherapyBeamNozzle(); 288 HadrontherapyBeamFinalCollimator(); 289 HadrontherapyPMMACollimator(); 290 // HadrontherapyRippleFilter(); 291 292 293 // StopperCostruction(); 294 295 296 HadrontherapyRidgeFilter(); 297 } 298 299 ////////////////////////////////////////////// 300 void PassiveCarbonBeamLine::HadrontherapyBeamL 301 { 302 // ------------------// 303 // BEAM LINE SUPPORT // 304 //-------------------// 305 306 beamLineSupportXSize = 1.5*m; 307 beamLineSupportYSize = 20.*mm; 308 beamLineSupportZSize = 600.*mm; 309 310 beamLineSupportXPosition = -1745.09 *mm; 311 beamLineSupportYPosition = -230. *mm; 312 beamLineSupportZPosition = 0.*mm; 313 314 beamLineSupport = new G4Box("BeamLineSuppo 315 beamLineSuppor 316 beamLineSuppor 317 beamLineSuppor 318 319 logicBeamLineSupport = new G4LogicalVolume 320 321 322 physiBeamLineSupport = new G4PVPlacement(0 323 324 325 " 326 l 327 p 328 329 // Visualisation attributes of the beam li 330 logicBeamLineSupport -> SetVisAttributes(g 331 332 //---------------------------------// 333 // Beam line cover 1 (left panel) // 334 //---------------------------------// 335 beamLineCoverXSize = 1.5*m; 336 beamLineCoverYSize = 750.*mm; 337 beamLineCoverZSize = 10.*mm; 338 339 beamLineCoverXPosition = -1745.09 *mm; 340 beamLineCoverYPosition = -1000.*mm; 341 beamLineCoverZPosition = 610.*mm; 342 343 beamLineCover = new G4Box("BeamLineCover", 344 beamLineCoverXSi 345 beamLineCoverYSi 346 beamLineCoverZSi 347 348 logicBeamLineCover = new G4LogicalVolume(b 349 b 350 " 351 352 physiBeamLineCover = new G4PVPlacement(0, 353 354 355 "Be 356 log 357 phy 358 fal 359 0); 360 361 // ---------------------------------// 362 // Beam line cover 2 (rigth panel) // 363 // ---------------------------------// 364 // It has the same characteristic of beam 365 physiBeamLineCover2 = new G4PVPlacement(0, 366 367 368 "B 369 lo 370 ph 371 fa 372 0) 373 374 375 logicBeamLineCover -> SetVisAttributes(blu 376 } 377 378 ////////////////////////////////////////////// 379 void PassiveCarbonBeamLine::VacuumToAirInterfa 380 { 381 // ------------// 382 // VACUUM PIPE // 383 //-------------// 384 // 385 // First track of the beam line is inside 386 387 vacuumZoneXSize = 100 *mm; 388 vacuumZoneYSize = 52.5 *mm; 389 vacuumZoneZSize = 52.5 *mm; 390 vacuumPipeXPosition = -1708.0 *mm; 391 392 393 vacuumZone = new G4Box("VacuumZone", 394 vacuumZoneXSize/2, 395 vacuumZoneYSize/2, 396 vacuumZoneZSize/2); 397 398 logicVacuumZone = new G4LogicalVolume(vacu 399 400 physiVacuumZone = new G4PVPlacement(0, G4T 401 "Vacuu 402 logicV 403 physic 404 false, 405 0); 406 407 // --------------------------// 408 // THE FIRST SCATTERING FOIL // 409 // --------------------------// 410 // A thin foil performing a first scatteri 411 // of the original beam 412 413 firstScatteringFoilXSize = 0.015 *mm; 414 firstScatteringFoilYSize = 52.5 *mm; 415 firstScatteringFoilZSize = 52.5 *mm; 416 firstScatteringFoilXPosition = 0.0 *mm; 417 418 firstScatteringFoil = new G4Box("FirstScat 419 firstScatt 420 firstScatt 421 firstScatt 422 423 logicFirstScatteringFoil = new G4LogicalVo 424 425 426 427 physiFirstScatteringFoil = new G4PVPlaceme 428 429 430 431 logicFirstScatteringFoil -> SetVisAttribut 432 433 // -------------------// 434 // THE KAPTON WINDOWS // 435 //--------------------// 436 //It permits the passage of the beam from 437 438 // KAPTON WINDOW: it permits the passage o 439 kaptonWindowXSize = 0.050 *mm; 440 kaptonWindowYSize = 52.5 *mm; 441 kaptonWindowZSize = 52.5 *mm; 442 kaptonWindowXPosition = vacuumZoneXSize/2 443 444 solidKaptonWindow = new G4Box("KaptonWindo 445 kaptonWindow 446 kaptonWindow 447 kaptonWindow 448 449 logicKaptonWindow = new G4LogicalVolume(so 450 ka 451 "K 452 453 physiKaptonWindow = new G4PVPlacement(0, G 454 "Kap 455 phys 456 457 logicKaptonWindow -> SetVisAttributes(dark 458 } 459 ////////////////////////////////////////////// 460 void PassiveCarbonBeamLine::HadrontherapyRippl 461 { 462 463 G4double defaultRippleFilterXPosition = -1 464 G4double ripple_position=(defaultRippleFil 465 G4double RF_x = 200.0 * mm; 466 G4double RF_y = 200.0 * mm; 467 G4double RF_z = 1.4 * mm; 468 G4double RFbase_z = 0.2 * mm; 469 G4double RFtrd_z = RF_z - RFbase_z; 470 G4double RFtrd_top = 1e-4 * mm; 471 G4double RFtrd_bottom = 1.5 * mm; 472 G4double distanceBetweenTrd = 0.1*mm; 473 474 475 476 477 G4double theta = -90. *deg; 478 // Matrix definition for a "theta" deg rot 479 G4RotationMatrix rot; 480 rot.rotateY(theta); 481 482 483 SolidRippleFilter= new G4Box("RippleFilter 484 RF_x/2 + 1*mm 485 RF_y/2 + 1*mm 486 RF_z/2 + 1*mm 487 488 LogicRippleFilter = new G4LogicalVolume(So 489 ri 490 "L 491 0, 492 493 PhysiRippleFilter = new G4PVPlacement(G4Tr 494 "Phy 495 Logi 496 phys 497 fals 498 1, 499 true 500 501 PhysiRippleFilter = new G4PVPlacement(G4Tr 502 "Phy 503 Logi 504 phys 505 fals 506 2, 507 true 508 509 LogicRippleFilter -> SetVisAttributes(G4Vi 510 511 SolidRippleFilterBase = new G4Box("RippleF 512 RF_x/2, 513 RF_y/2, 514 RFbase_z 515 516 LogicRippleFilterBase = new G4LogicalVolum 517 518 519 520 521 LogicRippleFilterBase -> SetVisAttributes( 522 523 PhysiRippleFilterBase = new G4PVPlacement( 524 525 526 527 528 529 530 531 532 SolidRippleFilterTrd = new G4Trd("SolidRip 533 RF_x/2, 534 RF_x/2, 535 RFtrd_bot 536 RFtrd_top 537 RFtrd_z/2 538 539 LogicRippleFilterTrd = new G4LogicalVolume 540 541 542 543 544 LogicRippleFilterTrd -> SetVisAttributes(g 545 546 G4int numberOfTrd = static_cast<int>(std:: 547 548 G4int N = static_cast<int>( std::floor(num 549 550 G4int copyNumber = 0; 551 552 for( int i = -N; i <= N; i++ ) 553 { 554 PhysiRippleFilterTrd = new G4PVPlaceme 555 556 557 558 559 560 561 562 563 564 565 copyNumber++; 566 } 567 568 } 569 ////////////////////////////////////////////// 570 571 void PassiveCarbonBeamLine::StopperCostruction 572 573 supportFoil= new G4Box("supportFoil",25/2* 574 LogicSupportFoil = new G4LogicalVolume(sup 575 PhysiSupportFoil = new G4PVPlacement(0,G4T 576 LogicSupportFoil -> SetVisAttributes(skyBl 577 578 579 580 stopper = new G4Tubs("Stopper",0*mm,3*mm,3 581 LogicStopper= new G4LogicalVolume(stopper, 582 583 G4double ti = -270. *deg; 584 G4RotationMatrix rt; 585 rt.rotateY(ti); 586 587 PhysicStopper= new G4PVPlacement(G4Transfo 588 589 LogicStopper -> SetVisAttributes(red); 590 591 592 } 593 594 void PassiveCarbonBeamLine::HadrontherapyRidge 595 596 597 G4double defaultRidgeXPosition= -1270.0*mm 598 const G4double XBase = 0.5 *mm; 599 const G4double YBase =6.03*cm; 600 const G4double ZBase =6.03*cm; 601 602 603 604 SolidRidgeBase = new G4Box("BaseRidgeFilte 605 XBase, 606 YBase/2, 607 ZBase/2); 608 609 LogicRidgeBase = new G4LogicalVolume(Solid 610 PMMAN 611 "Base 612 613 PhysiRidgeFilterBase = new G4PVPlacement(0 614 G 615 616 617 618 " 619 L 620 p 621 f 622 0 623 624 LogicRidgeBase->SetVisAttributes(red); 625 626 627 SolidRidgeMother = new G4Box("MotherRidgeS 628 LogicRidgeMother = new G4LogicalVolume(Sol 629 630 G4Trd* trapp1=new G4Trd("Trapp1SOL",1.7*mm 631 G4LogicalVolume* LogicTrapp1=new G4Logical 632 PhysiTrapp1=new G4PVPlacement(0,G4ThreeVector 633 634 G4Trd* trapp2=new G4Trd("Trapp2SOL",1.68*m 635 G4LogicalVolume* LogicTrapp2=new G4Logical 636 PhysiTrapp2=new G4PVPlacement(0,G4ThreeVecto 637 638 G4Trd* trapp3=new G4Trd("Trapp3SOL",1.64*m 639 G4LogicalVolume* LogicTrapp3=new G4Logical 640 PhysiTrapp3=new G4PVPlacement(0,G4ThreeVector 641 642 G4Trd* trapp4=new G4Trd("Trapp4SOL",1.58*m 643 G4LogicalVolume* LogicTrapp4=new G4Logical 644 PhysiTrapp4=new G4PVPlacement(0,G4ThreeVec 645 646 G4Trd* trapp5=new G4Trd("Trapp5SOL",1.50*m 647 G4LogicalVolume* LogicTrapp5=new G4Logical 648 PhysiTrapp5=new G4PVPlacement(0,G4ThreeVect 649 650 G4Trd* trapp6=new G4Trd("Trapp6SOL",1.40*m 651 G4LogicalVolume* LogicTrapp6=new G4Logical 652 PhysiTrapp6=new G4PVPlacement(0,G4ThreeVect 653 654 G4Trd* trapp7=new G4Trd("Trapp7SOL",1.26*m 655 G4LogicalVolume* LogicTrapp7=new G4Logical 656 PhysiTrapp7=new G4PVPlacement(0,G4ThreeVector( 657 658 G4Trd* trapp8=new G4Trd("Trapp8SOL",0.94*m 659 G4LogicalVolume* LogicTrapp8=new G4Logical 660 PhysiTrapp8=new G4PVPlacement(0,G4ThreeVec 661 662 G4Trd* trapp9=new G4Trd("Trapp9SOL",0.78*m 663 G4LogicalVolume* LogicTrapp9=new G4Logical 664 PhysiTrapp9=new G4PVPlacement(0,G4ThreeVecto 665 666 G4Trd* trapp10=new G4Trd("Trapp10SOL",0.66 667 G4LogicalVolume* LogicTrapp10=new G4Logica 668 PhysiTrapp10=new G4PVPlacement(0,G4ThreeVecto 669 670 G4Trd* trapp11=new G4Trd("Trapp11SOL",0.56 671 G4LogicalVolume* LogicTrapp11=new G4Logica 672 PhysiTrapp11=new G4PVPlacement(0,G4ThreeVector 673 674 G4Trd* trapp12=new G4Trd("Trapp12SOL",0.46 675 G4LogicalVolume* LogicTrapp12=new G4Logica 676 PhysiTrapp12=new G4PVPlacement(0,G4ThreeVec 677 678 G4Trd* trapp13=new G4Trd("Trapp13SOL",0.38 679 G4LogicalVolume* LogicTrapp13=new G4Logica 680 PhysiTrapp13=new G4PVPlacement(0,G4ThreeVec 681 682 G4Trd* trapp14=new G4Trd("Trapp14SOL",0.30 683 G4LogicalVolume* LogicTrapp14=new G4Logica 684 PhysiTrapp14=new G4PVPlacement(0,G4ThreeVector 685 686 G4Trd* trapp15=new G4Trd("Trapp14SOL",0.24 687 G4LogicalVolume* LogicTrapp15=new G4Logica 688 PhysiTrapp15=new G4PVPlacement(0,G4ThreeVe 689 690 G4Trd* trapp16=new G4Trd("Trapp16SOL",0.18 691 G4LogicalVolume* LogicTrapp16=new G4Logica 692 PhysiTrapp16=new G4PVPlacement(0,G4ThreeVect 693 694 LogicTrapp1->SetVisAttributes(green); 695 LogicTrapp2->SetVisAttributes(green); 696 LogicTrapp3->SetVisAttributes(green); 697 LogicTrapp4->SetVisAttributes(green); 698 LogicTrapp5->SetVisAttributes(green); 699 LogicTrapp6->SetVisAttributes(green); 700 LogicTrapp7->SetVisAttributes(green); 701 LogicTrapp8->SetVisAttributes(green); 702 LogicTrapp9->SetVisAttributes(green); 703 LogicTrapp10->SetVisAttributes(green); 704 LogicTrapp11->SetVisAttributes(green); 705 LogicTrapp12->SetVisAttributes(green); 706 LogicTrapp13->SetVisAttributes(green); 707 LogicTrapp14->SetVisAttributes(green); 708 LogicTrapp15->SetVisAttributes(green); 709 LogicTrapp16->SetVisAttributes(green); 710 G4VisAttributes* visAttr = new G4VisAttrib 711 visAttr->SetVisibility(false); 712 LogicRidgeMother->SetVisAttributes(visAttr 713 714 715 716 717 718 719 G4int numberOfLayers = 30; 720 G4double minZ = 30.15*mm-0.3*mm-1.70/2*mm; 721 G4double minY = 30.15*mm-0.3*mm-1.70/2*mm; 722 G4double sum_space = 0.3*mm+1.70*mm; 723 724 725 std::vector<G4ThreeVector> singleTrapPosit 726 727 for (int i = 0; i < numberOfLayers; i++) 728 { 729 for (int j = 0; j < numberOfLayers; j+ 730 { 731 singleTrapPositions.push_back({def 732 minY - i*sum_space, 733 minZ - j*sum_space, 734 735 }); 736 } 737 } 738 739 G4double ti = - 90. *deg; 740 G4RotationMatrix rt; 741 rt.rotateY(ti); 742 743 744 G4int peaks = numberOfLayers*numberOfLayer 745 for (int i = 0; i < peaks; i++) 746 { 747 748 std::ostringstream tName;tName << "sin 749 new G4PVPlacement(G4Transform3D(rt, 750 single 751 LogicRidgeMother, 752 "tName.str()", 753 logicTreatmentRoom, 754 0, 755 i); 756 757 } 758 759 } 760 761 762 763 764 765 766 ////////////////////////////////////////////// 767 void PassiveCarbonBeamLine::HadrontherapyPMMAC 768 { 769 770 // ----------------------// 771 // PMMA COLLIMATOR // 772 // ----------------------// 773 PMMACollimatorSupportXSize = 25.0 *mm; 774 PMMACollimatorSupportYSize = 200. *mm; 775 PMMACollimatorSupportZSize = 200. *mm; 776 777 778 PMMACollimatorXPosition = -1257.0 *mm; 779 780 G4double phi = 90. *deg; 781 G4RotationMatrix rm; 782 rm.rotateY(phi); 783 784 solidPMMACollimatorSupport = new G4Box("PM 785 PMM 786 PMM 787 PMM 788 789 logicPMMACollimatorSupport = new G4Logical 790 791 792 793 physiPMMACollimatorSupport = new G4PVPlace 794 795 796 797 798 799 800 801 yellow = new G4VisAttributes(G4Colour(1., 802 yellow-> SetVisibility(true); 803 yellow-> SetForceWireframe(true); 804 805 logicPMMACollimatorSupport -> SetVisAttrib 806 807 // ----------------------// 808 // PMMA COLLIMATOR // 809 //-----------------------// 810 innerRadiusPMMACollimator= 4.5 *cm; 811 outerRadiusPMMACollimator = 4.6 *cm; 812 hightPMMACollimator = PMMACollimatorSuppor 813 startAnglePMMACollimator = 0.*deg; 814 spanningAnglePMMACollimator = 360.*deg; 815 816 817 solidPMMACollimator = new G4Tubs("PMMAColl 818 innerRadi 819 outerRadi 820 hightPMMA 821 startAngl 822 spanningA 823 824 logicPMMACollimator = new G4LogicalVolume( 825 826 827 828 829 830 831 physiPMMACollimator = new G4PVPlacement(G4 832 833 "P 834 lo 835 ph 836 fa 837 0) 838 839 logicPMMACollimator -> SetVisAttributes(ye 840 841 842 843 844 } 845 ////////////////////////////////////////////// 846 void PassiveCarbonBeamLine::HadrontherapyBeamM 847 { 848 // ---------------------------- 849 // MONITOR CHAMBER 850 // ---------------------------- 851 // A monitor chamber is a free-air ionisa 852 // able to measure do carbon fluence durin 853 // Here its responce is not simulated in t 854 // charge but only the energy losses are t 855 // Each chamber consist of 9 mm of air in 856 // that has two layers one of kapton and o 857 // of copper 858 859 monitor1XSize = 4.525022*mm; 860 monitor2XSize = 0.000011*mm; 861 monitor3XSize = 4.5*mm; 862 monitorYSize = 10.*cm; 863 monitorZSize = 10.*cm; 864 monitor1XPosition = -1239.974978 *mm; 865 monitor2XPosition = -4.500011*mm; 866 monitor4XPosition = 4.500011*mm; 867 868 solidFirstMonitorLayer1 = new G4Box("First 869 monito 870 monito 871 monito 872 873 logicFirstMonitorLayer1 = new G4LogicalVol 874 875 876 877 physiFirstMonitorLayer1 = new G4PVPlacemen 878 879 880 881 882 883 884 885 solidFirstMonitorLayer2 = new G4Box("First 886 monito 887 monito 888 monito 889 890 logicFirstMonitorLayer2 = new G4LogicalVol 891 892 893 894 physiFirstMonitorLayer2 = new G4PVPlacemen 895 896 897 898 899 900 901 solidFirstMonitorLayer3 = new G4Box("First 902 monito 903 monito 904 monito 905 906 logicFirstMonitorLayer3 = new G4LogicalVol 907 908 909 910 physiFirstMonitorLayer3 = new G4PVPlacemen 911 912 913 914 915 916 917 918 solidFirstMonitorLayer4 = new G4Box("First 919 monito 920 monito 921 monito 922 923 logicFirstMonitorLayer4 = new G4LogicalVol 924 925 926 927 physiFirstMonitorLayer4 = new G4PVPlacemen 928 929 930 931 932 logicFirstMonitorLayer3 -> SetVisAttribute 933 934 } 935 936 ////////////////////////////////////////////// 937 ////////////////////////////////////////////// 938 void PassiveCarbonBeamLine::HadrontherapyBeamN 939 { 940 // ------------------------------// 941 // THE FINAL TUBE AND COLLIMATOR // 942 //-------------------------------// 943 // The last part of the transport beam lin 944 // a 59 mm thick PMMA slab (to stop all th 945 // (to well collimate the proton beam) and 946 // aperture (that provide the final trasve 947 948 // -------------------// 949 // PMMA SUPPORT // 950 // -------------------// 951 952 nozzleSupportXSize = 50 *mm; 953 nozzleSupportYSize = 360. *mm; 954 nozzleSupportZSize = 360. *mm; 955 nozzleSupportXPosition = -423.0 *mm; 956 957 G4double phi = 90. *deg; 958 // Matrix definition for a 90 deg rotation 959 G4RotationMatrix rm; 960 rm.rotateY(phi); 961 962 solidNozzleSupport = new G4Box("NozzleSupp 963 nozzleSuppo 964 nozzleSuppo 965 nozzleSuppo 966 967 logicNozzleSupport = new G4LogicalVolume(s 968 n 969 " 970 971 physiNozzleSupport = new G4PVPlacement(0, 972 "No 973 log 974 phy 975 fal 976 0); 977 978 yellow = new G4VisAttributes(G4Colour(1., 979 yellow-> SetVisibility(true); 980 yellow-> SetForceWireframe(true); 981 982 //------------------------------------// 983 // HOLE IN THE SUPPORT // 984 //------------------------------------// 985 innerRadiusHoleNozzleSupport = 0.*mm; 986 outerRadiusHoleNozzleSupport = 22.0*mm; 987 hightHoleNozzleSupport = nozzleSupportXSiz 988 startAngleHoleNozzleSupport = 0.*deg; 989 spanningAngleHoleNozzleSupport = 360.*deg; 990 991 solidHoleNozzleSupport = new G4Tubs("HoleN 992 innerR 993 outerR 994 hightH 995 startA 996 spanni 997 998 logicHoleNozzleSupport = new G4LogicalVolu 999 1000 1001 1002 1003 1004 1005 physiHoleNozzleSupport = new G4PVPlacemen 1006 1007 1008 1009 1010 1011 1012 // -------------------------------------- 1013 // BRASS TUBE 3 (beam line side) / 1014 // -------------------------------------/ 1015 innerRadiusBrassTube3 = 13.5 *mm; 1016 outerRadiusBrassTube3 = 21.5 *mm; 1017 hightBrassTube3 = 20.0 *mm; 1018 startAngleBrassTube3 = 0.*deg; 1019 spanningAngleBrassTube3 = 360.*deg; 1020 brassTube3XPosition = -458.0 *mm; 1021 1022 solidBrassTube3 = new G4Tubs("BrassTube3" 1023 innerRadiusB 1024 outerRadiusB 1025 hightBrassTu 1026 startAngleBr 1027 spanningAngl 1028 1029 logicBrassTube3 = new G4LogicalVolume(sol 1030 bra 1031 "Br 1032 0, 1033 1034 physiBrassTube3 = new G4PVPlacement(G4Tra 1035 1036 1037 1038 "Bras 1039 logic 1040 physi 1041 false 1042 0); 1043 1044 logicBrassTube3 -> SetVisAttributes(darkO 1045 1046 // -------------------------------------- 1047 // BRASS TUBE 2 (inside the PMMA supp 1048 // -------------------------------------- 1049 1050 innerRadiusBrassTube2 = 13.5 *mm; 1051 outerRadiusBrassTube2 = 21.5 *mm; 1052 hightBrassTube2 = nozzleSupportXSize; 1053 startAngleBrassTube2 = 0.*deg; 1054 spanningAngleBrassTube2 = 360.*deg; 1055 1056 1057 solidBrassTube2 = new G4Tubs("BrassTube2" 1058 innerRadiusB 1059 outerRadiusB 1060 hightBrassTu 1061 startAngleBr 1062 spanningAngl 1063 1064 logicBrassTube2 = new G4LogicalVolume(sol 1065 bra 1066 "Br 1067 0, 1068 physiBrassTube2 = new G4PVPlacement(0, 1069 G4Thr 1070 logic 1071 "Bras 1072 logic 1073 false 1074 0); 1075 1076 logicBrassTube2 -> SetVisAttributes(darkO 1077 1078 // ---------------------------------// 1079 // BRASS TUBE 1 (phantom side) // 1080 // ---------------------------------// 1081 innerRadiusBrassTube= 18.*mm; 1082 outerRadiusBrassTube = 21.5 *mm; 1083 hightBrassTube = 208.0 *mm; 1084 startAngleBrassTube = 0.*deg; 1085 spanningAngleBrassTube = 360.*deg; 1086 brassTubeXPosition = -294 *mm; 1087 solidBrassTube = new G4Tubs("BrassTube", 1088 innerRadiusBr 1089 outerRadiusBr 1090 hightBrassTub 1091 startAngleBra 1092 spanningAngle 1093 1094 logicBrassTube = new G4LogicalVolume(soli 1095 bras 1096 "Bra 1097 0, 0 1098 1099 physiBrassTube = new G4PVPlacement(G4Tran 1100 1101 1102 1103 "Brass 1104 logicB 1105 physic 1106 false, 1107 0); 1108 1109 logicBrassTube -> SetVisAttributes(darkOr 1110 } 1111 1112 ///////////////////////////////////////////// 1113 void PassiveCarbonBeamLine::HadrontherapyBeam 1114 { 1115 // -----------------------// 1116 // FINAL COLLIMATOR // 1117 //------------------------// 1118 outerRadiusFinalCollimator = 21.5*mm; 1119 hightFinalCollimator = 7.0 *mm; 1120 startAngleFinalCollimator = 0.*deg; 1121 spanningAngleFinalCollimator = 360.*deg; 1122 finalCollimatorXPosition = -186.5 *mm; 1123 1124 G4double phi = 90. *deg; 1125 1126 // Matrix definition for a 90 deg rotatio 1127 G4RotationMatrix rm; 1128 rm.rotateY(phi); 1129 1130 solidFinalCollimator = new G4Tubs("FinalC 1131 innerRa 1132 outerRa 1133 hightFi 1134 startAn 1135 spannin 1136 1137 logicFinalCollimator = new G4LogicalVolum 1138 1139 1140 1141 1142 1143 1144 physiFinalCollimator = new G4PVPlacement( 1145 1146 1147 1148 1149 1150 1151 1152 logicFinalCollimator -> SetVisAttributes( 1153 } 1154 1155 1156 ///////////////////////////////////////////// 1157 /////////////////////////// MESSENGER /////// 1158 ///////////////////////////////////////////// 1159 1160 void PassiveCarbonBeamLine::SetRippleFilterXP 1161 { 1162 PhysiRippleFilter -> SetTranslation(G4Thr 1163 G4RunManager::GetRunManager() -> Geometry 1164 G4cout << "The Ripple Filter is translate 1165 } 1166 1167 1168 ///////////////////////////////////////////// 1169 void PassiveCarbonBeamLine::SetInnerRadiusFin 1170 { 1171 solidFinalCollimator -> SetInnerRadius(va 1172 G4RunManager::GetRunManager() -> Geometry 1173 G4cout<<"Inner Radius of the final collim 1174 << solidFinalCollimator -> GetInnerRadius 1175 << G4endl; 1176 } 1177 1178 ///////////////////////////////////////////// 1179 void PassiveCarbonBeamLine::SetRippleFilterMa 1180 { 1181 if (G4Material* RFMaterial = G4NistManage 1182 { 1183 if (RFMaterial) 1184 { 1185 rippleFilterMaterial = RFMateria 1186 LogicRippleFilter -> SetMaterial( 1187 LogicRippleFilterBase -> SetMater 1188 LogicRippleFilterTrd -> SetMateri 1189 G4cout << "The material of the Ri 1190 } 1191 } 1192 else 1193 { 1194 G4cout << "WARNING: material \"" << m 1195 " table [located in $G4INSTALL/source 1196 G4cout << "Use command \"/parameter/n 1197 } 1198 } 1199 1200 1201 1202