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