Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // This is the *BASIC* version of IORT, a Geant4-based application 27 // 28 // Main Authors: G.Russo(a,b), C.Casarino*(c), G.C. Candiano(c), G.A.P. Cirrone(d), F.Romano(d) 29 // Contributor Authors: S.Guatelli(e) 30 // Past Authors: G.Arnetta(c), S.E.Mazzaglia(d) 31 // 32 // (a) Fondazione Istituto San Raffaele G.Giglio, Cefalù, Italy 33 // (b) IBFM-CNR , Segrate (Milano), Italy 34 // (c) LATO (Laboratorio di Tecnologie Oncologiche), Cefalù, Italy 35 // (d) Laboratori Nazionali del Sud of the INFN, Catania, Italy 36 // (e) University of Wallongong, Australia 37 // 38 // *Corresponding author, email to carlo.casarino@polooncologicocefalu.it 39 ////////////////////////////////////////////////////////////////////////////////////////////// 40 41 #include "globals.hh" 42 #include "G4SystemOfUnits.hh" 43 #include "G4Box.hh" 44 #include "G4Tubs.hh" 45 #include "G4Cons.hh" 46 #include "G4VisAttributes.hh" 47 #include "G4Colour.hh" 48 #include "G4RunManager.hh" 49 #include "G4LogicalVolume.hh" 50 #include "G4PVPlacement.hh" 51 #include "G4RotationMatrix.hh" 52 #include "G4NistManager.hh" 53 #include "G4NistElementBuilder.hh" 54 #include "G4SubtractionSolid.hh" 55 #include "IORTDetectorConstruction.hh" 56 #include "Collimator80BeamLine.hh" 57 #include "Collimator80BeamLineMessenger.hh" 58 59 Collimator80BeamLine::Collimator80BeamLine(): 60 physicalTreatmentRoom(0),iortDetectorConstruction(0), 61 62 63 64 solidFinalCollimatorIORT(0), 65 physiFinalCollimatorIORT(0), 66 67 solidGiunz1FinalCollIORT(0), 68 physiGiunz1FinalCollIORT(0), 69 70 solidGiunz2FinalCollIORT(0), 71 physiGiunz2FinalCollIORT(0), 72 73 solidGiunz3FinalCollIORT(0), 74 physiGiunz3FinalCollIORT(0), 75 76 solidGiunz3FinalCollIntIORT(0), 77 physiGiunz3FinalCollIntIORT(0), 78 79 solidGiunz4FinalCollIORT(0), 80 physiGiunz4FinalCollIORT(0), 81 82 solidGiunz5FinalCollIORT(0), 83 physiGiunz5FinalCollIORT(0), 84 85 solidBlocco1IORT(0), 86 physiBlocco1IORT(0), 87 88 solidBlocco2IORT(0), 89 physiBlocco2IORT(0), 90 91 solidBlocco3IORT(0), 92 physiBlocco3IORT(0), 93 94 solidBlocco20mmIORT(0), 95 physiBlocco20mmIORT(0), 96 97 solidCM1_1_2IORT(0), 98 physiCM1_1_2IORT(0), 99 100 solidCM1_2_2IORT(0), 101 physiCM1_2_2IORT(0), 102 103 solidCM2_1_2IORT(0), 104 physiCM2_1_2IORT(0), 105 106 solidCM2_2_2IORT(0), 107 physiCM2_2_2IORT(0), 108 109 solidCCMIORT(0), 110 physiCCMIORT(0), 111 112 solidPFS1IORT(0), 113 physiPFS1IORT(0), 114 115 solidPFS2IORT(0), 116 physiPFS2IORT(0), 117 118 solidPFS3IORT(0), 119 physiPFS3IORT(0), 120 121 solidFTIORT(0), 122 physiFTIORT(0) 123 124 125 { 126 // Messenger to change parameters of the collimator80BeamLine geometry 127 collimatorMessenger = new Collimator80BeamLineMessenger(this); 128 129 } 130 ///////////////////////////////////////////////////////////////////////////// 131 Collimator80BeamLine::~Collimator80BeamLine() 132 { 133 delete collimatorMessenger; 134 delete iortDetectorConstruction; 135 } 136 137 ///////////////////////////////////////////////////////////////////////////// 138 139 140 G4VPhysicalVolume* Collimator80BeamLine::Construct() 141 { 142 // Sets default geometry and materials 143 SetDefaultDimensions(); 144 145 // Construct the whole Collimator Beam Line 146 ConstructCollimator80BeamLine(); 147 148 149 // IORTDetectorConstruction builds ONLY the phantom and the detector with its associated ROGeometry 150 iortDetectorConstruction = new IORTDetectorConstruction(physicalTreatmentRoom); 151 152 return physicalTreatmentRoom; 153 } 154 155 // In the following method the DEFAULTS used in the geometry of 156 // collimator beam line are provided 157 // HERE THE USER CAN CHANGE THE GEOMETRY CHARACTERISTICS OF BEAM 158 // LINE ELEMENTS, ALTERNATIVELY HE/SHE CAN USE THE MACRO FILE (IF A 159 // MESSENGER IS PROVIDED) 160 // 161 // DEFAULT MATERIAL ARE ALSO PROVIDED 162 // and COLOURS ARE ALSO DEFINED 163 // ---------------------------------------------------------- 164 ///////////////////////////////////////////////////////////////////////////// 165 void Collimator80BeamLine::SetDefaultDimensions() 166 { 167 168 // Set of coulors that can be used 169 white = new G4VisAttributes( G4Colour()); 170 white -> SetVisibility(true); 171 //white -> SetForceSolid(true); 172 173 blue = new G4VisAttributes(G4Colour(0. ,0. ,1.)); 174 blue -> SetVisibility(true); 175 //blue -> SetForceSolid(true); 176 177 gray = new G4VisAttributes( G4Colour(0.5, 0.5, 0.5 )); 178 gray-> SetVisibility(true); 179 //gray-> SetForceSolid(true); 180 181 red = new G4VisAttributes(G4Colour(1. ,0. ,0.)); 182 red-> SetVisibility(true); 183 //red-> SetForceSolid(true); 184 185 yellow = new G4VisAttributes(G4Colour(1., 1., 0. )); 186 yellow-> SetVisibility(true); 187 //yellow-> SetForceSolid(true); 188 189 green = new G4VisAttributes( G4Colour(25/255. , 255/255. , 25/255. )); 190 green -> SetVisibility(true); 191 //green -> SetForceSolid(true); 192 193 darkGreen = new G4VisAttributes( G4Colour(0/255. , 100/255. , 0/255. )); 194 darkGreen -> SetVisibility(true); 195 //darkGreen -> SetForceSolid(true); 196 197 darkOrange3 = new G4VisAttributes( G4Colour(205/255. , 102/255. , 000/255. )); 198 darkOrange3 -> SetVisibility(true); 199 //darkOrange3 -> SetForceSolid(true); 200 201 skyBlue = new G4VisAttributes( G4Colour(135/255. , 206/255. , 235/255. )); 202 skyBlue -> SetVisibility(true); 203 //skyBlue -> SetForceSolid(true); 204 205 206 207 // Geometry FINAL COLLIMATOR DEFAULTS 208 209 G4double defaultOuterRadiusFinalCollimatorIORT = 45. *mm; 210 OuterRadiusFinalCollimatorIORT = defaultOuterRadiusFinalCollimatorIORT; 211 212 G4double defaultinnerRadiusFinalCollimatorIORT = 40. *mm; 213 innerRadiusFinalCollimatorIORT = defaultinnerRadiusFinalCollimatorIORT; 214 215 // DEFAULT DEFINITION OF THE MATERIALS 216 // All elements and compound definition follows the NIST database 217 218 // ELEMENTS 219 G4bool isotopes = false; 220 G4Material* aluminumNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_Al", isotopes); 221 //G4Material* tantalumNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_Ta", isotopes); 222 //G4Material* copperNistAsMaterial = G4NistManager::Instance()->FindOrBuildMaterial("G4_Cu", isotopes); 223 G4Element* zincNist = G4NistManager::Instance()->FindOrBuildElement("Zn"); 224 G4Element* copperNist = G4NistManager::Instance()->FindOrBuildElement("Cu"); 225 226 // COMPOUND 227 G4Material* airNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_AIR", isotopes); 228 //G4Material* kaptonNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_KAPTON", isotopes); 229 G4Material* galacticNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_Galactic", isotopes); 230 G4Material* PMMANist = G4NistManager::Instance()->FindOrBuildMaterial("G4_PLEXIGLASS", isotopes); 231 //G4Material* mylarNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_MYLAR", isotopes); 232 G4Material* titanioNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_Ti", isotopes); 233 234 235 G4double d; // Density 236 G4int nComponents;// Number of components 237 G4double fractionmass; // Fraction in mass of an element in a material 238 239 d = 8.40*g/cm3; // brass 240 nComponents = 2; 241 G4Material* brass = new G4Material("Brass", d, nComponents); 242 brass -> AddElement(zincNist, fractionmass = 30 *perCent); 243 brass -> AddElement(copperNist, fractionmass = 70 *perCent); 244 245 246 // MATERIAL ASSIGNMENT 247 248 249 // Material of the FINAL COLLIMATOR IORT 250 finalCollimatorMaterialIORT = PMMANist; 251 252 // Junction 1 FINAL COLLIMATOR IORT 253 Giunz1FinalCollMaterialIORT = PMMANist; 254 255 // Junction 2 FINAL COLLIMATOR IORT 256 Giunz2FinalCollMaterialIORT = PMMANist; 257 258 // Junction 3 FINAL COLLIMATOR IORT 259 Giunz3FinalCollMaterialIORT = PMMANist; 260 261 // Junction 3 FINAL COLLIMATOR Int IORT 262 Giunz3FinalCollMaterialIntIORT = airNist; 263 264 // Junction 4 FINAL COLLIMATOR IORT 265 Giunz4FinalCollMaterialIORT = PMMANist; 266 267 // Junction 5 FINAL COLLIMATOR IORT 268 Giunz5FinalCollMaterialIORT = PMMANist; 269 270 // Block 1 Diameter 30 mm 271 Blocco1IORTMaterialIORT = PMMANist; 272 273 // Block 2 Diameter 30 mm 274 Blocco2IORTMaterialIORT = PMMANist; 275 276 // Block 3 Diameter 30 mm 277 Blocco3IORTMaterialIORT = PMMANist; 278 279 // Block Diameter 20 mm 280 Blocco20mmIORTMaterialIORT = PMMANist; 281 282 // First Monitor Chamber Lamina Al 1 of 2 283 CM1_1_2IORTMaterialIORT = aluminumNist; 284 285 // First Monitor Chamber Lamina Al 2 of 2 286 CM1_2_2IORTMaterialIORT = aluminumNist; 287 288 // Second Monitor Chamber Lamina Al 1 of 2 289 CM2_1_2IORTMaterialIORT = aluminumNist; 290 291 // Second Monitor Chamber Lamina Al 2 of 2 292 CM2_2_2IORTMaterialIORT = aluminumNist; 293 294 // Monitor Chamber Cylinder 295 CCMIORTMaterialIORT = PMMANist; 296 297 // Superior Final Part Monitor Chambers 298 PFS1IORTMaterialIORT = PMMANist; 299 300 // Superior Final Part Monitor Chambers 301 PFS2IORTMaterialIORT = PMMANist; 302 303 // Superior Final Part Monitor Chambers 304 PFS3IORTMaterialIORT = PMMANist; 305 306 // Superior Final Part Monitor Chambers Material 307 FTIORTMaterialIORT = titanioNist; 308 309 // Vacuum Source 310 VSIORTMaterialIORT = galacticNist; 311 312 } 313 314 ///////////////////////////////////////////////////////////////////////////// 315 void Collimator80BeamLine::ConstructCollimator80BeamLine() 316 { 317 // ----------------------------- 318 // Treatment room - World volume 319 //------------------------------ 320 // Treatment room sizes 321 const G4double worldX = 400.0 *cm; 322 const G4double worldY = 400.0 *cm; 323 const G4double worldZ = 400.0 *cm; 324 G4bool isotopes = false; 325 326 G4Material* airNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_AIR", isotopes); 327 G4Box* treatmentRoom = new G4Box("TreatmentRoom",worldX,worldY,worldZ); 328 G4LogicalVolume* logicTreatmentRoom = new G4LogicalVolume(treatmentRoom, 329 airNist, 330 "logicTreatmentRoom", 331 0,0,0); 332 physicalTreatmentRoom = new G4PVPlacement(0, 333 G4ThreeVector(), 334 "physicalTreatmentRoom", 335 logicTreatmentRoom, 336 0,false,0); 337 338 339 // The treatment room is invisible in the Visualisation 340 logicTreatmentRoom -> SetVisAttributes (G4VisAttributes::GetInvisible()); 341 342 // Components of the Collimator Beam Line 343 344 IortBeamLineVacuumSource(); 345 IortBeamLineTitaniumWindows(); 346 IortBeamLineMonitorChambers(); 347 IortBeamLineBlocks() ; 348 IortBeamLineJunctions(); 349 IortBeamLineFinalCollimator(); 350 351 } 352 353 354 void Collimator80BeamLine::IortBeamLineVacuumSource() 355 { 356 // ---------------------------------------------------------------// 357 // Vacuum Source // 358 // ---------------------------------------------------------------// 359 360 361 G4double phi1 = 90. *deg; 362 363 364 G4RotationMatrix rm1; 365 rm1.rotateY(phi1); 366 367 const G4double outRadiusVSIORT = 44.75 *mm; 368 const G4double innRadiusVSIORT = 0.*mm; 369 const G4double hightVSIORT = 1. *mm; 370 const G4double startAngleVSIORT = 0.*deg; 371 const G4double spanningAngleVSIORT = 360.*deg; 372 const G4double XPositionVSIORT = -862.797 *mm; 373 374 solidVSIORT = new G4Tubs("VSIORT", innRadiusVSIORT, 375 outRadiusVSIORT, 376 hightVSIORT, 377 startAngleVSIORT, 378 spanningAngleVSIORT); 379 380 G4LogicalVolume* logVSIORT = new G4LogicalVolume(solidVSIORT, 381 VSIORTMaterialIORT, "VSIORT", 0, 0, 0); 382 383 physiVSIORT = new G4PVPlacement(G4Transform3D(rm1, G4ThreeVector((XPositionVSIORT),0.,0.)), 384 "VSIORT", logVSIORT, physicalTreatmentRoom, false, 0); 385 386 logVSIORT -> SetVisAttributes(green); 387 } 388 389 void Collimator80BeamLine::IortBeamLineTitaniumWindows() 390 { 391 // ---------------------------------------------------------------// 392 // Titanium Window // 393 // ---------------------------------------------------------------// 394 395 G4double phi2 = 90. *deg; 396 397 398 G4RotationMatrix rm2; 399 rm2.rotateY(phi2); 400 401 402 const G4double outRadiusFTIORT = 44.75 *mm; 403 const G4double innRadiusFTIORT = 8.5 *mm; 404 const G4double hightFTIORT = 0.006 *mm; 405 const G4double startAngleFTIORT = 0.*deg; 406 const G4double spanningAngleFTIORT = 360.*deg; 407 const G4double XPositionFTIORT = -861.791 *mm; 408 409 solidFTIORT = new G4Tubs("FTIORT", innRadiusFTIORT, 410 outRadiusFTIORT, 411 hightFTIORT, 412 startAngleFTIORT, 413 spanningAngleFTIORT); 414 415 G4LogicalVolume* logFTIORT = new G4LogicalVolume(solidFTIORT, 416 FTIORTMaterialIORT, "FTIORT", 0, 0, 0); 417 418 physiFTIORT = new G4PVPlacement(G4Transform3D(rm2, G4ThreeVector((XPositionFTIORT),0.,0.)), 419 "FTIORT", logFTIORT, physicalTreatmentRoom, false, 0); 420 421 logFTIORT -> SetVisAttributes(yellow); 422 } 423 424 void Collimator80BeamLine::IortBeamLineMonitorChambers() 425 { 426 427 G4double phi3 = 90. *deg; 428 429 // Matrix definition for a 90 deg rotation. Also used for other volumes 430 G4RotationMatrix rm3; 431 rm3.rotateY(phi3); 432 /////////////////////////////////////////////////////////////////////////////// 433 434 // Monitor Chambers System 435 436 /////////////////////////////////////////////////////////////////////////////// 437 438 439 // ---------------------------------------------------------------// 440 // Superior Final Part Monitor Chambers 3 // 441 // ---------------------------------------------------------------// 442 443 const G4double outRadiusPFS3IORT = 44.75 *mm; 444 const G4double innRadiusPFS3IORT = 17.5 *mm; 445 const G4double hightPFS3IORT = 3.03 *mm; 446 const G4double startAnglePFS3IORT = 0.*deg; 447 const G4double spanningAnglePFS3IORT = 360.*deg; 448 const G4double XPositionPFS3IORT = -848.755 *mm; 449 450 solidPFS3IORT = new G4Tubs("PFS3IORT", innRadiusPFS3IORT, 451 outRadiusPFS3IORT, 452 hightPFS3IORT, 453 startAnglePFS3IORT, 454 spanningAnglePFS3IORT); 455 456 G4LogicalVolume* logPFS3IORT = new G4LogicalVolume(solidPFS3IORT, 457 PFS3IORTMaterialIORT, "PFS3IORT", 0, 0, 0); 458 459 physiPFS3IORT = new G4PVPlacement(G4Transform3D(rm3, G4ThreeVector((XPositionPFS3IORT),0.,0.)), 460 "PFS3IORT", logPFS3IORT, physicalTreatmentRoom, false, 0); 461 462 logPFS3IORT -> SetVisAttributes(white); 463 464 465 // ---------------------------------------------------------------// 466 // Superior Final Part Monitor Chambers 2 // 467 // ---------------------------------------------------------------// 468 469 const G4double outRadiusPFS2IORT = 44.75 *mm; 470 const G4double innRadiusPFS2IORT = 10. *mm; 471 const G4double hightPFS2IORT = 1.47 *mm; 472 const G4double startAnglePFS2IORT = 0.*deg; 473 const G4double spanningAnglePFS2IORT = 360.*deg; 474 const G4double XPositionPFS2IORT = -844.255 *mm; 475 476 solidPFS2IORT = new G4Tubs("PFS2IORT", innRadiusPFS2IORT, 477 outRadiusPFS2IORT, 478 hightPFS2IORT, 479 startAnglePFS2IORT, 480 spanningAnglePFS2IORT); 481 482 G4LogicalVolume* logPFS2IORT = new G4LogicalVolume(solidPFS2IORT, 483 PFS2IORTMaterialIORT, "PFS2IORT", 0, 0, 0); 484 485 physiPFS2IORT = new G4PVPlacement(G4Transform3D(rm3, G4ThreeVector((XPositionPFS2IORT),0.,0.)), 486 "PFS2IORT", logPFS2IORT, physicalTreatmentRoom, false, 0); 487 488 logPFS2IORT -> SetVisAttributes(green); 489 490 // ---------------------------------------------------------------// 491 // Superior Final Part Monitor Chambers 1 // 492 // ---------------------------------------------------------------// 493 494 const G4double outRadiusPFS1IORT = 35. *mm; 495 const G4double innRadiusPFS1IORT = 10. *mm; 496 const G4double hightPFS1IORT = 0.88 *mm; 497 const G4double startAnglePFS1IORT = 0.*deg; 498 const G4double spanningAnglePFS1IORT = 360.*deg; 499 const G4double XPositionPFS1IORT = -841.905 *mm; 500 501 solidPFS1IORT = new G4Tubs("PFS1IORT", innRadiusPFS1IORT, 502 outRadiusPFS1IORT, 503 hightPFS1IORT, 504 startAnglePFS1IORT, 505 spanningAnglePFS1IORT); 506 507 G4LogicalVolume* logPFS1IORT = new G4LogicalVolume(solidPFS1IORT, 508 PFS1IORTMaterialIORT, "PFS1IORT", 0, 0, 0); 509 510 physiPFS1IORT = new G4PVPlacement(G4Transform3D(rm3, G4ThreeVector((XPositionPFS1IORT),0.,0.)), 511 "PFS1IORT", logPFS1IORT, physicalTreatmentRoom, false, 0); 512 513 logPFS1IORT -> SetVisAttributes(green); 514 515 // ------------------------------------------------// 516 // Monitor Chambers Cylinder // 517 // ------------------------------------------------// 518 519 const G4double outRadiusCCMIORT = 35. *mm; 520 const G4double innRadiusCCMIORT = 10. *mm; 521 const G4double hightCCMIORT = 4.0125 *mm; 522 const G4double startAngleCCMIORT = 0.*deg; 523 const G4double spanningAngleCCMIORT = 360.*deg; 524 const G4double XPositionCCMIORT = -837.0125 *mm; 525 526 solidCCMIORT = new G4Tubs("CCMIORT", innRadiusCCMIORT, 527 outRadiusCCMIORT, 528 hightCCMIORT, 529 startAngleCCMIORT, 530 spanningAngleCCMIORT); 531 532 G4LogicalVolume* logCCMIORT = new G4LogicalVolume(solidCCMIORT, 533 CCMIORTMaterialIORT, "CCMIORT", 0, 0, 0); 534 535 physiCCMIORT = new G4PVPlacement(G4Transform3D(rm3, G4ThreeVector((XPositionCCMIORT),0.,0.)), 536 "CCMIORT", logCCMIORT, physicalTreatmentRoom, false, 0); 537 538 logCCMIORT -> SetVisAttributes(green); 539 540 541 // ------------------------------------------------// 542 // Second Monitor Chamber Lamina Al 2 of 2 // 543 // ------------------------------------------------// 544 545 const G4double outRadiusCM2_2_2IORT = 20. *mm; 546 const G4double innRadiusCM2_2_2IORT = 0. *mm; 547 const G4double hightCM2_2_2IORT = 0.025 *mm; 548 const G4double startAngleCM2_2_2IORT = 0.*deg; 549 const G4double spanningAngleCM2_2_2IORT = 360.*deg; 550 const G4double XPositionCM2_2_2IORT = -841. *mm; 551 552 solidCM2_2_2IORT = new G4Tubs("CM2_2_2IORT", innRadiusCM2_2_2IORT, 553 outRadiusCM2_2_2IORT, 554 hightCM2_2_2IORT, 555 startAngleCM2_2_2IORT, 556 spanningAngleCM2_2_2IORT); 557 558 G4LogicalVolume* logCM2_2_2IORT = new G4LogicalVolume(solidCM2_2_2IORT, 559 CM2_2_2IORTMaterialIORT, "CM2_2_2IORT", 0, 0, 0); 560 561 physiCM2_2_2IORT = new G4PVPlacement(G4Transform3D(rm3, G4ThreeVector((XPositionCM2_2_2IORT),0.,0.)), 562 "CM2_2_2ORT", logCM2_2_2IORT, physicalTreatmentRoom, false, 0); 563 564 logCM2_2_2IORT -> SetVisAttributes(green); 565 566 567 // ------------------------------------------------// 568 // Second Monitor Chamber Lamina Al 1 of 2 // 569 // ------------------------------------------------// 570 571 const G4double outRadiusCM2_1_2IORT = 20. *mm; 572 const G4double innRadiusCM2_1_2IORT = 0. *mm; 573 const G4double hightCM2_1_2IORT = 0.025 *mm; 574 const G4double startAngleCM2_1_2IORT = 0.*deg; 575 const G4double spanningAngleCM2_1_2IORT = 360.*deg; 576 const G4double XPositionCM2_1_2IORT = -839. *mm; 577 578 solidCM2_1_2IORT = new G4Tubs("CM2_1_2IORT", innRadiusCM2_1_2IORT, 579 outRadiusCM2_1_2IORT, 580 hightCM2_1_2IORT, 581 startAngleCM2_1_2IORT, 582 spanningAngleCM2_1_2IORT); 583 584 G4LogicalVolume* logCM2_1_2IORT = new G4LogicalVolume(solidCM2_1_2IORT, 585 CM2_1_2IORTMaterialIORT, "CM2_1_2IORT", 0, 0, 0); 586 587 physiCM2_1_2IORT = new G4PVPlacement(G4Transform3D(rm3, G4ThreeVector((XPositionCM2_1_2IORT),0.,0.)), 588 "CM2_1_2ORT", logCM2_1_2IORT, physicalTreatmentRoom, false, 0); 589 590 logCM2_1_2IORT -> SetVisAttributes(yellow); 591 592 // ------------------------------------------------// 593 // First Monitor Chamber Lamina Al 2 of 2 // 594 // ------------------------------------------------// 595 596 const G4double outRadiusCM1_2_2IORT = 20. *mm; 597 const G4double innRadiusCM1_2_2IORT = 0. *mm; 598 const G4double hightCM1_2_2IORT = 0.025 *mm; 599 const G4double startAngleCM1_2_2IORT = 0.*deg; 600 const G4double spanningAngleCM1_2_2IORT = 360.*deg; 601 const G4double XPositionCM1_2_2IORT = -837. *mm; 602 603 solidCM1_2_2IORT = new G4Tubs("CM1_2_2IORT", innRadiusCM1_2_2IORT, 604 outRadiusCM1_2_2IORT, 605 hightCM1_2_2IORT, 606 startAngleCM1_2_2IORT, 607 spanningAngleCM1_2_2IORT); 608 609 G4LogicalVolume* logCM1_2_2IORT = new G4LogicalVolume(solidCM1_2_2IORT, 610 CM1_2_2IORTMaterialIORT, "CM1_2_2IORT", 0, 0, 0); 611 612 physiCM1_2_2IORT = new G4PVPlacement(G4Transform3D(rm3, G4ThreeVector((XPositionCM1_2_2IORT),0.,0.)), 613 "CM1_2_2ORT", logCM1_2_2IORT, physicalTreatmentRoom, false, 0); 614 615 logCM1_2_2IORT -> SetVisAttributes(yellow); 616 617 // ------------------------------------------------// 618 // First Monitor Chamber Lamina Al 1 of 2 // 619 // ------------------------------------------------// 620 621 const G4double outRadiusCM1_1_2IORT = 20. *mm; 622 const G4double innRadiusCM1_1_2IORT = 0. *mm; 623 const G4double hightCM1_1_2IORT = 0.025 *mm; 624 const G4double startAngleCM1_1_2IORT = 0.*deg; 625 const G4double spanningAngleCM1_1_2IORT = 360.*deg; 626 const G4double XPositionCM1_1_2IORT = -835. *mm; 627 628 solidCM1_1_2IORT = new G4Tubs("CM1_1_2IORT", innRadiusCM1_1_2IORT, 629 outRadiusCM1_1_2IORT, 630 hightCM1_1_2IORT, 631 startAngleCM1_1_2IORT, 632 spanningAngleCM1_1_2IORT); 633 634 G4LogicalVolume* logCM1_1_2IORT = new G4LogicalVolume(solidCM1_1_2IORT, 635 CM1_1_2IORTMaterialIORT, "CM1_1_2IORT", 0, 0, 0); 636 637 physiCM1_1_2IORT = new G4PVPlacement(G4Transform3D(rm3, G4ThreeVector((XPositionCM1_1_2IORT),0.,0.)), 638 "CM1_1_2ORT", logCM1_1_2IORT, physicalTreatmentRoom, false, 0); 639 640 logCM1_1_2IORT -> SetVisAttributes(yellow); 641 } 642 643 void Collimator80BeamLine::IortBeamLineBlocks() 644 { 645 646 G4double phi4 = 90. *deg; 647 648 649 G4RotationMatrix rm4; 650 rm4.rotateY(phi4); 651 652 /////////////////////////////////////////////////////////////////////////////// 653 654 // IORT BEAM LINE BLOCKS 655 656 /////////////////////////////////////////////////////////////////////////////// 657 658 // ------------------------------------------------// 659 // Block 4 // 660 // ------------------------------------------------// 661 662 const G4double outRadiusBlocco20mmIORT = 36.5 *mm; 663 const G4double innRadiusBlocco20mmIORT = 10. *mm; 664 const G4double hightBlocco20mmIORT = 3. *mm; 665 const G4double startAngleBlocco20mmIORT = 0.*deg; 666 const G4double spanningAngleBlocco20mmIORT = 360.*deg; 667 const G4double XPositionBlocco20mmIORT = -830. *mm; 668 669 solidBlocco20mmIORT = new G4Tubs("Blocco20mmIORT", innRadiusBlocco20mmIORT, 670 outRadiusBlocco20mmIORT, 671 hightBlocco20mmIORT, 672 startAngleBlocco20mmIORT, 673 spanningAngleBlocco20mmIORT); 674 675 G4LogicalVolume* logBlocco20mmIORT = new G4LogicalVolume(solidBlocco20mmIORT, 676 Blocco20mmIORTMaterialIORT, "Blocco20mmIORT", 0, 0, 0); 677 678 physiBlocco20mmIORT = new G4PVPlacement(G4Transform3D(rm4, G4ThreeVector((XPositionBlocco20mmIORT),0.,0.)), 679 "Blocco20mmORT", logBlocco20mmIORT, physicalTreatmentRoom, false, 0); 680 681 logBlocco20mmIORT -> SetVisAttributes(green); 682 683 684 // -----------------------// 685 // Block 3 // 686 // -----------------------// 687 688 const G4double outRadiusBlocco3IORT = 36.5 *mm; 689 const G4double innRadiusBlocco3IORT = 15. *mm; 690 const G4double hightBlocco3IORT = 3.5 *mm; 691 const G4double startAngleBlocco3IORT = 0.*deg; 692 const G4double spanningAngleBlocco3IORT = 360.*deg; 693 const G4double XPositionBlocco3IORT = -823.5 *mm; 694 695 solidBlocco3IORT = new G4Tubs("Blocco3IORT", innRadiusBlocco3IORT, 696 outRadiusBlocco3IORT, 697 hightBlocco3IORT, 698 startAngleBlocco3IORT, 699 spanningAngleBlocco3IORT); 700 701 G4LogicalVolume* logBlocco3IORT = new G4LogicalVolume(solidBlocco3IORT, 702 Blocco3IORTMaterialIORT, "Blocco3IORT", 0, 0, 0); 703 704 physiBlocco3IORT = new G4PVPlacement(G4Transform3D(rm4, G4ThreeVector((XPositionBlocco3IORT),0.,0.)), 705 "Blocco3ORT", logBlocco3IORT, physicalTreatmentRoom, false, 0); 706 707 logBlocco3IORT -> SetVisAttributes(yellow); 708 709 // -----------------------// 710 // Block 2 // 711 // -----------------------// 712 713 const G4double outRadiusBlocco2IORT = 41.5 *mm; 714 const G4double innRadiusBlocco2IORT = 15. *mm; 715 const G4double hightBlocco2IORT = 8. *mm; 716 const G4double startAngleBlocco2IORT = 0.*deg; 717 const G4double spanningAngleBlocco2IORT = 360.*deg; 718 const G4double XPositionBlocco2IORT = -812. *mm; 719 720 solidBlocco2IORT = new G4Tubs("Blocco2IORT", innRadiusBlocco2IORT, 721 outRadiusBlocco2IORT, 722 hightBlocco2IORT, 723 startAngleBlocco2IORT, 724 spanningAngleBlocco2IORT); 725 726 G4LogicalVolume* logBlocco2IORT = new G4LogicalVolume(solidBlocco2IORT, 727 Blocco2IORTMaterialIORT, "Blocco2IORT", 0, 0, 0); 728 729 physiBlocco2IORT = new G4PVPlacement(G4Transform3D(rm4, G4ThreeVector((XPositionBlocco2IORT),0.,0.)), 730 "Blocco2IORT", logBlocco2IORT, physicalTreatmentRoom, false, 0); 731 732 logBlocco2IORT -> SetVisAttributes(red); 733 734 // ----------------------- // 735 // Block 1 // 736 // ----------------------- // 737 738 const G4double outRadiusBlocco1IORT = 52.0 *mm; 739 const G4double innRadiusBlocco1IORT = 15. *mm; 740 const G4double hightBlocco1IORT = 8.5 *mm; 741 const G4double startAngleBlocco1IORT = 0.*deg; 742 const G4double spanningAngleBlocco1IORT = 360.*deg; 743 const G4double XPositionBlocco1IORT = -795.5*mm; 744 745 solidBlocco1IORT = new G4Tubs("Blocco1IORT", innRadiusBlocco1IORT, 746 outRadiusBlocco1IORT, 747 hightBlocco1IORT, 748 startAngleBlocco1IORT, 749 spanningAngleBlocco1IORT); 750 751 G4LogicalVolume* logBlocco1IORT = new G4LogicalVolume(solidBlocco1IORT, 752 Blocco1IORTMaterialIORT, "Blocco1IORT", 0, 0, 0); 753 754 physiBlocco1IORT = new G4PVPlacement(G4Transform3D(rm4, G4ThreeVector((XPositionBlocco1IORT),0.,0.)), 755 "Blocco1IORT", logBlocco1IORT, physicalTreatmentRoom, false, 0); 756 757 logBlocco1IORT -> SetVisAttributes(white); 758 } 759 760 void Collimator80BeamLine::IortBeamLineJunctions() 761 { 762 763 764 G4double phi5 = 90. *deg; 765 766 767 G4RotationMatrix rm5; 768 rm5.rotateY(phi5); 769 // --------------------------------- // 770 // Junction 5 FINAL COLLIMATOR IORT // 771 // --------------------------------- // 772 773 const G4double outRadiusGiunz5FinalCollIORT = 48.25 *mm; 774 const G4double innRadiusGiunz5FinalCollIORT = 13.75 *mm; 775 const G4double hightGiunz5FinalCollIORT = 3.5 *mm; 776 const G4double startAngleGiunz5FinalCollIORT = 0.*deg; 777 const G4double spanningAngleGiunz5FinalCollIORT = 360.*deg; 778 const G4double Giunz5FinalCollXPositionIORT = -783.5 *mm; 779 780 solidGiunz5FinalCollIORT = new G4Tubs("Giunz5FinalCollIORT", innRadiusGiunz5FinalCollIORT, 781 outRadiusGiunz5FinalCollIORT, 782 hightGiunz5FinalCollIORT, 783 startAngleGiunz5FinalCollIORT, 784 spanningAngleGiunz5FinalCollIORT); 785 786 G4LogicalVolume* logGiunz5FinalCollIORT = new G4LogicalVolume(solidGiunz5FinalCollIORT, 787 Giunz5FinalCollMaterialIORT, "Giunz5FinalCollIORT", 0, 0, 0); 788 789 physiGiunz5FinalCollIORT = new G4PVPlacement(G4Transform3D(rm5, G4ThreeVector((Giunz5FinalCollXPositionIORT),0.,0.)), 790 "Giunz5FinalCollIORT", logGiunz5FinalCollIORT, physicalTreatmentRoom, false, 0); 791 792 logGiunz5FinalCollIORT -> SetVisAttributes(yellow); 793 794 // --------------------------------- // 795 // Junction 4 FINAL COLLIMATOR IORT // 796 // --------------------------------- // 797 798 const G4double outRadiusGiunz4FinalCollIORT = 42. *mm; 799 const G4double innRadiusGiunz4FinalCollIORT = 13.75 *mm; 800 const G4double hightGiunz4FinalCollIORT = 8.5 *mm; 801 const G4double startAngleGiunz4FinalCollIORT = 0.*deg; 802 const G4double spanningAngleGiunz4FinalCollIORT = 360.*deg; 803 const G4double Giunz4FinalCollXPositionIORT = -771.5 *mm; 804 805 solidGiunz4FinalCollIORT = new G4Tubs("Giunz4FinalCollIORT", innRadiusGiunz4FinalCollIORT, 806 outRadiusGiunz4FinalCollIORT, 807 hightGiunz4FinalCollIORT, 808 startAngleGiunz4FinalCollIORT, 809 spanningAngleGiunz4FinalCollIORT); 810 811 G4LogicalVolume* logGiunz4FinalCollIORT = new G4LogicalVolume(solidGiunz4FinalCollIORT, 812 Giunz4FinalCollMaterialIORT, "Giunz4FinalCollIORT", 0, 0, 0); 813 814 physiGiunz4FinalCollIORT = new G4PVPlacement(G4Transform3D(rm5, G4ThreeVector((Giunz4FinalCollXPositionIORT),0.,0.)), 815 "Giunz4FinalCollIORT", logGiunz4FinalCollIORT, physicalTreatmentRoom, false, 0); 816 817 logGiunz4FinalCollIORT -> SetVisAttributes(blue); 818 819 820 821 // --------------------------------- // 822 // Junction 3 FINAL COLLIMATOR IORT // 823 // --------------------------------- // 824 825 const G4double outRadiusGiunz3FinalCollIORT = 42. *mm; 826 const G4double innRadiusGiunz3FinalCollIORT = 0. *mm; 827 const G4double hightGiunz3FinalCollIORT = 4.25 *mm; 828 const G4double startAngleGiunz3FinalCollIORT = 0.*deg; 829 const G4double spanningAngleGiunz3FinalCollIORT = 360.*deg; 830 const G4double Giunz3FinalCollXPositionIORT = -758.75 *mm; 831 832 solidGiunz3FinalCollIORT = new G4Tubs("Giunz3FinalCollIORT", innRadiusGiunz3FinalCollIORT, 833 outRadiusGiunz3FinalCollIORT, 834 hightGiunz3FinalCollIORT, 835 startAngleGiunz3FinalCollIORT, 836 spanningAngleGiunz3FinalCollIORT); 837 838 G4LogicalVolume* logicsolidGiunz3FinalCollIORT = new G4LogicalVolume(solidGiunz3FinalCollIORT, 839 Giunz3FinalCollMaterialIORT, "Giunz3FinalCollIORT", 0, 0, 0); 840 841 physiGiunz3FinalCollIORT = new G4PVPlacement(G4Transform3D(rm5, G4ThreeVector((Giunz3FinalCollXPositionIORT),0.,0.)), 842 "Giunz3FinalCollIORT", logicsolidGiunz3FinalCollIORT, physicalTreatmentRoom, false, 0); 843 844 logicsolidGiunz3FinalCollIORT -> SetVisAttributes(yellow); 845 // logicsolidGiunz3FinalCollIORT -> SetVisAttributes (G4VisAttributes::GetInvisible()); 846 847 848 849 // --------------------------------- // 850 // Junction 3 FINAL COLLIMATOR IORT internal // 851 // --------------------------------- // 852 853 854 855 solidGiunz3FinalCollIntIORT = new G4Cons("Giunz3FinalCollIntIORT",0.*mm,13.75*mm,0.*mm,22.25*mm,4.25*mm,0.*deg,360.*deg); 856 857 G4LogicalVolume* logicsolidGiunz3FinalCollIntIORT = new G4LogicalVolume(solidGiunz3FinalCollIntIORT, 858 Giunz3FinalCollMaterialIntIORT, "Giunz3FinalCollIntIORT", 0, 0, 0); 859 860 physiGiunz3FinalCollIntIORT = new G4PVPlacement(0, G4ThreeVector(0.,0.,0.),"Giunz3FinalCollIntIORT", logicsolidGiunz3FinalCollIntIORT,physiGiunz3FinalCollIORT, false, 0); 861 862 logicsolidGiunz3FinalCollIntIORT -> SetVisAttributes(yellow); 863 864 865 // --------------------------------- // 866 // Junction 2 FINAL COLLIMATOR IORT // 867 // --------------------------------- // 868 869 const G4double outRadiusGiunz2FinalCollIORT = 42. *mm; 870 const G4double innRadiusGiunz2FinalCollIORT = 22.25 *mm; 871 const G4double hightGiunz2FinalCollIORT = 5.75 *mm; 872 const G4double startAngleGiunz2FinalCollIORT = 0.*deg; 873 const G4double spanningAngleGiunz2FinalCollIORT = 360.*deg; 874 const G4double Giunz2FinalCollXPositionIORT = -748.75 *mm; 875 876 solidGiunz2FinalCollIORT = new G4Tubs("Giunz2FinalCollIORT", innRadiusGiunz2FinalCollIORT, 877 outRadiusGiunz2FinalCollIORT, 878 hightGiunz2FinalCollIORT, 879 startAngleGiunz2FinalCollIORT, 880 spanningAngleGiunz2FinalCollIORT); 881 882 G4LogicalVolume* logGiunz2FinalCollIORT = new G4LogicalVolume(solidGiunz2FinalCollIORT, 883 Giunz2FinalCollMaterialIORT, "Giunz2FinalCollIORT", 0, 0, 0); 884 885 physiGiunz2FinalCollIORT = new G4PVPlacement(G4Transform3D(rm5, G4ThreeVector((Giunz2FinalCollXPositionIORT),0.,0.)), 886 "Giunz2FinalCollIORT", logGiunz2FinalCollIORT, physicalTreatmentRoom, false, 0); 887 888 logGiunz2FinalCollIORT -> SetVisAttributes(red); 889 890 // --------------------------------- // 891 // Junction 1 FINAL COLLIMATOR IORT // 892 // --------------------------------- // 893 894 const G4double outRadiusGiunz1FinalCollIORT = 55. *mm; 895 const G4double innRadiusGiunz1FinalCollIORT = 22.25 *mm; 896 const G4double hightGiunz1FinalCollIORT = 10. *mm; 897 const G4double startAngleGiunz1FinalCollIORT = 0.*deg; 898 const G4double spanningAngleGiunz1FinalCollIORT = 360.*deg; 899 const G4double Giunz1FinalCollXPositionIORT = -733.*mm; 900 901 solidGiunz1FinalCollIORT = new G4Tubs("Giunz1FinalCollIORT", innRadiusGiunz1FinalCollIORT, 902 outRadiusGiunz1FinalCollIORT, 903 hightGiunz1FinalCollIORT, 904 startAngleGiunz1FinalCollIORT, 905 spanningAngleGiunz1FinalCollIORT); 906 907 G4LogicalVolume* logGiunz1FinalCollIORT = new G4LogicalVolume(solidGiunz1FinalCollIORT, 908 Giunz1FinalCollMaterialIORT, "Giunz1FinalCollIORT", 0, 0, 0); 909 910 physiGiunz1FinalCollIORT = new G4PVPlacement(G4Transform3D(rm5, G4ThreeVector((Giunz1FinalCollXPositionIORT),0.,0.)), 911 "Giunz1FinalCollIORT", logGiunz1FinalCollIORT, physicalTreatmentRoom, false, 0); 912 913 logGiunz1FinalCollIORT -> SetVisAttributes(gray); 914 } 915 916 void Collimator80BeamLine::IortBeamLineFinalCollimator() 917 { 918 // -----------------------// 919 // FINAL COLLIMATOR IORT // 920 //------------------------// 921 922 // const G4double outRadiusFinalCollimatorIORT = 45. *mm; 923 // const G4double innRadiusFinalCollimatorIORT = 40. *mm; 924 const G4double hightFinalCollimatorIORT = 334. *mm; 925 const G4double startAngleFinalCollimatorIORT = 0.*deg; 926 const G4double spanningAngleFinalCollimatorIORT = 360.*deg; 927 const G4double finalCollimatorXPositionIORT = -389.*mm; 928 929 930 931 932 G4double phi6 = 90. *deg; 933 934 935 G4RotationMatrix rm6; 936 rm6.rotateY(phi6); 937 938 939 solidFinalCollimatorIORT = new G4Tubs("FinalCollimatorIORT", innerRadiusFinalCollimatorIORT, 940 OuterRadiusFinalCollimatorIORT, 941 hightFinalCollimatorIORT, 942 startAngleFinalCollimatorIORT, 943 spanningAngleFinalCollimatorIORT); 944 945 G4LogicalVolume* logFinalCollimatorIORT = new G4LogicalVolume(solidFinalCollimatorIORT, 946 finalCollimatorMaterialIORT, "FinalCollimatorIORT", 0, 0, 0); 947 948 physiFinalCollimatorIORT = new G4PVPlacement(G4Transform3D(rm6, G4ThreeVector((finalCollimatorXPositionIORT),0.,0.)), 949 "FinalCollimatorIORT", logFinalCollimatorIORT, physicalTreatmentRoom, false, 0); 950 951 // logFinalCollimatorIORT -> SetVisAttributes(G4VisAttributes::GetInvisible()); 952 logFinalCollimatorIORT -> SetVisAttributes(red); 953 } 954 955 ///////////////////////////////////////////////////////////////////////////// 956 /////////////////////////// MESSENGER /////////////////////////////////////// 957 ///////////////////////////////////////////////////////////////////////////// 958 959 960 void Collimator80BeamLine::SetInnerRadiusFinalCollimatorIORT(G4double value) 961 { 962 solidFinalCollimatorIORT -> SetInnerRadius(value); 963 G4RunManager::GetRunManager() -> GeometryHasBeenModified(); 964 G4cout<<"Inner Radius of the final collimator IORT is (mm):" 965 << solidFinalCollimatorIORT -> GetInnerRadius()/mm 966 << G4endl; 967 } 968 969 ///////////////////////////////////////////////////////////////////////// 970 971 void Collimator80BeamLine::SetOuterRadiusFinalCollimatorIORT(G4double value) 972 { 973 solidFinalCollimatorIORT -> SetOuterRadius(value); 974 G4RunManager::GetRunManager() -> GeometryHasBeenModified(); 975 G4cout<<"Outer Radius of the final collimator IORT is (mm):" 976 << solidFinalCollimatorIORT -> GetOuterRadius()/mm 977 << G4endl; 978 } 979 980 ///////////////////////////////////////////////////////////////////////////// 981 982 983 984