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