Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/iort_therapy/src/Collimator40BeamLine.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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