Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/iort_therapy/src/Collimator50BeamLine.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 "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