Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/hadrontherapy/src/HadrontherapyDetectorConstruction.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 ]

Diff markup

Differences between /examples/advanced/hadrontherapy/src/HadrontherapyDetectorConstruction.cc (Version 11.3.0) and /examples/advanced/hadrontherapy/src/HadrontherapyDetectorConstruction.cc (Version 9.2)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 // Hadrontherapy advanced example for Geant4   <<  26 //
 27 // See more at: https://twiki.cern.ch/twiki/bi <<  27 // $Id: HadrontherapyDetectorConstruction.cc;
                                                   >>  28 // Last modified: G.A.P.Cirrone, April 2008;
                                                   >>  29 //
                                                   >>  30 // See more at: http://geant4infn.wikispaces.com
                                                   >>  31 //
                                                   >>  32 // ----------------------------------------------------------------------------
                                                   >>  33 //                 GEANT 4 - Hadrontherapy example
                                                   >>  34 // ----------------------------------------------------------------------------
                                                   >>  35 // Code developed by:
                                                   >>  36 //
                                                   >>  37 // G.A.P. Cirrone(a)*, F. Di Rosa(a), S. Guatelli(b), G. Russo(a)
                                                   >>  38 // 
                                                   >>  39 // (a) Laboratori Nazionali del Sud 
                                                   >>  40 //     of the INFN, Catania, Italy
                                                   >>  41 // (b) INFN Section of Genova, Genova, Italy
                                                   >>  42 // 
                                                   >>  43 // * cirrone@lns.infn.it
                                                   >>  44 // ----------------------------------------------------------------------------
 28                                                    45 
 29 #include "G4UnitsTable.hh"                     << 
 30 #include "G4SDManager.hh"                          46 #include "G4SDManager.hh"
 31 #include "G4RunManager.hh"                         47 #include "G4RunManager.hh"
 32 #include "G4GeometryManager.hh"                << 
 33 #include "G4SolidStore.hh"                     << 
 34 #include "G4PhysicalVolumeStore.hh"            << 
 35 #include "G4LogicalVolumeStore.hh"             << 
 36 #include "G4Box.hh"                                48 #include "G4Box.hh"
 37 #include "G4LogicalVolume.hh"                      49 #include "G4LogicalVolume.hh"
 38 #include "G4ThreeVector.hh"                        50 #include "G4ThreeVector.hh"
 39 #include "G4PVPlacement.hh"                        51 #include "G4PVPlacement.hh"
 40 #include "globals.hh"                              52 #include "globals.hh"
 41 #include "G4Transform3D.hh"                        53 #include "G4Transform3D.hh"
 42 #include "G4RotationMatrix.hh"                     54 #include "G4RotationMatrix.hh"
 43 #include "G4Colour.hh"                             55 #include "G4Colour.hh"
 44 #include "G4UserLimits.hh"                         56 #include "G4UserLimits.hh"
 45 #include "G4UnitsTable.hh"                     << 
 46 #include "G4VisAttributes.hh"                      57 #include "G4VisAttributes.hh"
 47 #include "G4NistManager.hh"                    << 
 48 #include "HadrontherapyDetectorConstruction.hh << 
 49 #include "HadrontherapyDetectorROGeometry.hh"      58 #include "HadrontherapyDetectorROGeometry.hh"
 50 #include "HadrontherapyDetectorMessenger.hh"       59 #include "HadrontherapyDetectorMessenger.hh"
 51 #include "HadrontherapyDetectorSD.hh"              60 #include "HadrontherapyDetectorSD.hh"
 52 #include "HadrontherapyMatrix.hh"              <<  61 #include "HadrontherapyDetectorConstruction.hh"
 53 #include "HadrontherapyLet.hh"                 <<  62 #include "HadrontherapyMaterial.hh"
 54 #include "PassiveProtonBeamLine.hh"            <<  63 #include "HadrontherapyBeamLine.hh"
 55 #include "BESTPassiveProtonBeamLine.hh"        <<  64 #include "HadrontherapyModulator.hh"
 56 #include "HadrontherapyMatrix.hh"              <<  65 
 57                                                <<  66 /////////////////////////////////////////////////////////////////////////////
 58 #include "HadrontherapyRBE.hh"                 <<  67 HadrontherapyDetectorConstruction::HadrontherapyDetectorConstruction()
 59 #include "G4SystemOfUnits.hh"                  <<  68   : detectorSD(0), detectorROGeometry(0), beamLine(0), modulator(0),
 60                                                <<  69     physicalTreatmentRoom(0),
 61 #include <cmath>                               <<  70     patientPhysicalVolume(0), 
 62                                                <<  71     detectorLogicalVolume(0), 
 63                                                <<  72     detectorPhysicalVolume(0)
 64                                                <<  73 {
 65 HadrontherapyDetectorConstruction* Hadronthera <<  74   // Messenger to change parameters of the geometry
 66 ////////////////////////////////////////////// <<  75   detectorMessenger = new HadrontherapyDetectorMessenger(this);
 67 HadrontherapyDetectorConstruction::Hadronthera <<  76 
 68 : motherPhys(physicalTreatmentRoom), // pointe <<  77   material = new HadrontherapyMaterial();
 69 detectorSD(0), detectorROGeometry(0), matrix(0 <<  78 
 70 phantom(0), detector(0),                       <<  79   // Detector sizes
 71 phantomLogicalVolume(0), detectorLogicalVolume <<  80   detectorSizeX = 20.*mm;
 72 phantomPhysicalVolume(0), detectorPhysicalVolu <<  81   detectorSizeY = 20.*mm;
 73 aRegion(0)                                     <<  82   detectorSizeZ = 20.*mm;
 74 {                                              <<  83 
 75                                                <<  84   // Number of the detector voxels  
 76                                                <<  85   numberOfVoxelsAlongX = 400;
 77     /* NOTE! that the HadrontherapyDetectorCon <<  86   numberOfVoxelsAlongY = 1;
 78      * does NOT inherit from G4VUserDetectorCo <<  87   numberOfVoxelsAlongZ = 1;
 79      * So the Construct() mandatory virtual me << 
 80      * like the passiveProtonBeamLIne, ...     << 
 81      */                                        << 
 82                                                << 
 83     // Messenger to change parameters of the p << 
 84     detectorMessenger = new HadrontherapyDetec << 
 85                                                << 
 86     // Default detector voxels size            << 
 87     // 200 slabs along the beam direction (X)  << 
 88     sizeOfVoxelAlongX = 200 *um;               << 
 89     sizeOfVoxelAlongY = 4 *cm;                 << 
 90     sizeOfVoxelAlongZ = 4 *cm;                 << 
 91                                                << 
 92     // Define here the material of the water p << 
 93     SetPhantomMaterial("G4_WATER");            << 
 94     // Construct geometry (messenger commands) << 
 95     // SetDetectorSize(4.*cm, 4.*cm, 4.*cm);   << 
 96     SetDetectorSize(4. *cm, 4. *cm, 4. *cm);   << 
 97     SetPhantomSize(40. *cm, 40. *cm, 40. *cm); << 
 98                                                << 
 99     SetPhantomPosition(G4ThreeVector(20. *cm,  << 
100     SetDetectorToPhantomPosition(G4ThreeVector << 
101     SetDetectorPosition();                     << 
102     //GetDetectorToWorldPosition();            << 
103                                                << 
104     // Write virtual parameters to the real on << 
105     UpdateGeometry();                          << 
106                                                << 
107                                                << 
108                                                << 
109 }                                                  88 }
110                                                    89 
111 //////////////////////////////////////////////     90 /////////////////////////////////////////////////////////////////////////////
112 HadrontherapyDetectorConstruction::~Hadronther     91 HadrontherapyDetectorConstruction::~HadrontherapyDetectorConstruction()
113 {                                              <<  92 { 
114     delete detectorROGeometry;                 <<  93   delete material;
115     delete matrix;                             <<  94   if (detectorROGeometry) delete detectorROGeometry;  
116     delete detectorMessenger;                  <<  95   delete detectorMessenger;
                                                   >>  96 }
                                                   >>  97 
                                                   >>  98 G4VPhysicalVolume* HadrontherapyDetectorConstruction::Construct()
                                                   >>  99 {  
                                                   >> 100   // Define the materials of the experimental set-up
                                                   >> 101   material -> DefineMaterials();
                                                   >> 102   
                                                   >> 103   // Define the geometry components
                                                   >> 104   ConstructBeamLine();
                                                   >> 105   ConstructDetector();
                                                   >> 106   
                                                   >> 107   // Set the sensitive detector where the energy deposit is collected
                                                   >> 108   ConstructSensitiveDetector();
                                                   >> 109  
                                                   >> 110   return physicalTreatmentRoom;
                                                   >> 111 }
                                                   >> 112 
                                                   >> 113 /////////////////////////////////////////////////////////////////////////////
                                                   >> 114 void HadrontherapyDetectorConstruction::ConstructBeamLine()
                                                   >> 115 { 
                                                   >> 116   G4Material* air = material -> GetMat("Air") ;
                                                   >> 117   G4Material* water = material -> GetMat("G4_WATER");
                                                   >> 118 
                                                   >> 119   // -----------------------------
                                                   >> 120   // Treatment room - World volume
                                                   >> 121   //------------------------------
                                                   >> 122 
                                                   >> 123   // Treatment room sizes
                                                   >> 124   const G4double worldX = 400.0 *cm;
                                                   >> 125   const G4double worldY = 400.0 *cm;
                                                   >> 126   const G4double worldZ = 400.0 *cm;
                                                   >> 127 
                                                   >> 128   G4Box* treatmentRoom = new G4Box("TreatmentRoom",worldX,worldY,worldZ);
                                                   >> 129 
                                                   >> 130   G4LogicalVolume* logicTreatmentRoom = new G4LogicalVolume(treatmentRoom, 
                                                   >> 131                                                             air, 
                                                   >> 132                                                             "logicTreatmentRoom", 
                                                   >> 133                   0,0,0);
                                                   >> 134   physicalTreatmentRoom = new G4PVPlacement(0,
                                                   >> 135               G4ThreeVector(),
                                                   >> 136               "physicalTreatmentRoom", 
                                                   >> 137               logicTreatmentRoom, 
                                                   >> 138               0,false,0);
                                                   >> 139 
                                                   >> 140   G4double maxStepTreatmentRoom = 0.1 *mm;
                                                   >> 141   logicTreatmentRoom -> SetUserLimits(new G4UserLimits(maxStepTreatmentRoom));
                                                   >> 142 
                                                   >> 143   // The treatment room is invisible in the Visualisation
                                                   >> 144   logicTreatmentRoom -> SetVisAttributes (G4VisAttributes::Invisible);
                                                   >> 145  
                                                   >> 146   beamLine = new HadrontherapyBeamLine(physicalTreatmentRoom);
                                                   >> 147   beamLine -> HadrontherapyBeamLineSupport();
                                                   >> 148   beamLine -> HadrontherapyBeamScatteringFoils();
                                                   >> 149   beamLine -> HadrontherapyRangeShifter();
                                                   >> 150   beamLine -> HadrontherapyBeamCollimators();
                                                   >> 151   beamLine -> HadrontherapyBeamMonitoring();
                                                   >> 152   beamLine -> HadrontherapyMOPIDetector();
                                                   >> 153   beamLine -> HadrontherapyBeamNozzle();
                                                   >> 154   beamLine -> HadrontherapyBeamFinalCollimator();
                                                   >> 155 
                                                   >> 156   modulator = new HadrontherapyModulator();
                                                   >> 157   modulator -> BuildModulator(physicalTreatmentRoom);
                                                   >> 158 
                                                   >> 159   //----------------------------------------
                                                   >> 160   // Patient: 
                                                   >> 161   // a water box used to approximate tissues
                                                   >> 162   //----------------------------------------
                                                   >> 163  
                                                   >> 164   G4Box* patient = new G4Box("patient",20 *cm, 20 *cm, 20 *cm);
                                                   >> 165   
                                                   >> 166   G4LogicalVolume* patientLogicalVolume = new G4LogicalVolume(patient,
                                                   >> 167                     water, 
                                                   >> 168                     "patientLog", 0, 0, 0);
                                                   >> 169   
                                                   >> 170   patientPhysicalVolume = new G4PVPlacement(0,G4ThreeVector(200.*mm, 0.*mm, 0.*mm),
                                                   >> 171               "patientPhys",
                                                   >> 172               patientLogicalVolume,
                                                   >> 173               physicalTreatmentRoom,
                                                   >> 174               false,0);
                                                   >> 175  
                                                   >> 176   // Visualisation attributes of the patient 
                                                   >> 177   G4VisAttributes * redWire = new G4VisAttributes(G4Colour(1. ,0. ,0.));
                                                   >> 178   redWire -> SetVisibility(true);
                                                   >> 179   redWire -> SetForceWireframe(true);
                                                   >> 180   patientLogicalVolume -> SetVisAttributes(redWire); 
117 }                                                 181 }
118                                                   182 
119 //////////////////////////////////////////////    183 /////////////////////////////////////////////////////////////////////////////
120 HadrontherapyDetectorConstruction* Hadronthera << 
121 {                                              << 
122     return instance;                           << 
123 }                                              << 
124                                                << 
125 ////////////////////////////////////////////// << 
126 // ConstructPhantom() is the method that const << 
127 // (or water phantom) in the usual Medical phy << 
128 // A water phantom can be considered a good ap << 
129 void HadrontherapyDetectorConstruction::Constr << 
130 {                                              << 
131     // Definition of the solid volume of the P << 
132     phantom = new G4Box("Phantom",             << 
133                         phantomSizeX/2,        << 
134                         phantomSizeY/2,        << 
135                         phantomSizeZ/2);       << 
136                                                << 
137     // Definition of the logical volume of the << 
138     phantomLogicalVolume = new G4LogicalVolume << 
139                                                << 
140                                                << 
141                                                << 
142     // Definition of the physics volume of the << 
143     phantomPhysicalVolume = new G4PVPlacement( << 
144                                                << 
145                                                << 
146                                                << 
147                                                << 
148                                                << 
149                                                << 
150                                                << 
151     // Visualisation attributes of the phantom << 
152     red = new G4VisAttributes(G4Colour(255/255 << 
153     red -> SetVisibility(true);                << 
154     red -> SetForceSolid(true);                << 
155     red -> SetForceWireframe(true);            << 
156     phantomLogicalVolume -> SetVisAttributes(r << 
157 }                                              << 
158                                                << 
159 ////////////////////////////////////////////// << 
160 // ConstructDetector() is the method the recon << 
161 // inside the water phantom. It is a volume, l << 
162 //                                             << 
163 //           **************************        << 
164 //           *    water phantom       *        << 
165 //           *                        *        << 
166 //           *                        *        << 
167 //           *---------------         *        << 
168 //  Beam     *              -         *        << 
169 //  ----->   * detector     -         *        << 
170 //           *              -         *        << 
171 //           *---------------         *        << 
172 //           *                        *        << 
173 //           *                        *        << 
174 //           *                        *        << 
175 //           **************************        << 
176 //                                             << 
177 // The detector can be dived in slices or voxe << 
178 // and inside it different quantities (dose di << 
179 // can be stored.                              << 
180 void HadrontherapyDetectorConstruction::Constr    184 void HadrontherapyDetectorConstruction::ConstructDetector()
181                                                << 
182 {                                                 185 {
183     // Definition of the solid volume of the D << 186   G4Colour  lightBlue   (0.0, 0.0, .75);
184     detector = new G4Box("Detector",           << 187   G4Material* water = material -> GetMat("G4_WATER");
185                                                << 188   
186                          phantomSizeX/2,       << 189   //-----------
187                                                << 190   // Detector   
188                          phantomSizeY/2,       << 191   //-----------
189                                                << 192   
190                          phantomSizeZ/2);      << 193   G4Box* detector = new G4Box("Detector",detectorSizeX,detectorSizeY,detectorSizeZ);
191                                                << 194   
192     // Definition of the logic volume of the P << 195   detectorLogicalVolume = new G4LogicalVolume(detector,
193     detectorLogicalVolume = new G4LogicalVolum << 196                 water,
194                                                << 197                 "DetectorLog",
195                                                << 198                 0,0,0);
196                                                << 199   
197     // Definition of the physical volume of th << 200   // Fixing the max step allowed in the detector
198     detectorPhysicalVolume = new G4PVPlacement << 201   G4double maxStep = 0.01 *mm;
199                                                << 202   detectorLogicalVolume -> SetUserLimits(new G4UserLimits(maxStep));
200                                                << 203   
201                                                << 204   G4double detectorXtranslation = -180.*mm;
202                                                << 205   detectorPhysicalVolume = new G4PVPlacement(0,
203                                                << 206                G4ThreeVector(detectorXtranslation, 0.0 *mm, 0.0 *mm),
204                                                << 207                "DetectorPhys",
205     // Visualisation attributes of the detecto << 208                detectorLogicalVolume,
206     skyBlue = new G4VisAttributes( G4Colour(13 << 209                patientPhysicalVolume,
207     skyBlue -> SetVisibility(true);            << 210                false,0);
208     skyBlue -> SetForceSolid(true);            << 211   
209     //skyBlue -> SetForceWireframe(true);      << 212   // Visualisation attributes of the phantom
210     detectorLogicalVolume -> SetVisAttributes( << 213   G4VisAttributes* simpleBoxVisAttributes = new G4VisAttributes(lightBlue);
211                                                << 214   simpleBoxVisAttributes -> SetVisibility(true);
212     // **************                          << 215   simpleBoxVisAttributes -> SetForceSolid(true);
213     // **************                          << 216   detectorLogicalVolume -> SetVisAttributes(simpleBoxVisAttributes);
214     // Cut per Region                          << 217   
215     // **************                          << 218   // **************
216     //                                         << 219   // Cut per Region
217     // A smaller cut is fixed in the phantom t << 220   // **************
218     // required accuracy                       << 221   
219     if (!aRegion)                              << 222   // A smaller cut is fixed in the phantom to calculate the energy deposit with the
220     {                                          << 223   // required accuracy 
221         aRegion = new G4Region("DetectorLog"); << 224   G4Region* aRegion = new G4Region("DetectorLog");
222         detectorLogicalVolume -> SetRegion(aRe << 225   detectorLogicalVolume -> SetRegion(aRegion);
223         aRegion->AddRootLogicalVolume( detecto << 226   aRegion -> AddRootLogicalVolume(detectorLogicalVolume);
224     }                                          << 227 }
225 }                                              << 228 
                                                   >> 229 void  HadrontherapyDetectorConstruction::ConstructSensitiveDetector()
                                                   >> 230 {  
                                                   >> 231   // Sensitive Detector and ReadOut geometry definition
                                                   >> 232   G4SDManager* sensitiveDetectorManager = G4SDManager::GetSDMpointer();
226                                                   233 
227 ////////////////////////////////////////////// << 234   G4String sensitiveDetectorName = "Detector"; 
228 void HadrontherapyDetectorConstruction::Initia << 235 
229                                                << 236   if(!detectorSD)
230                                                << 
231                                                << 
232 {                                              << 
233     RO->Initialize(detectorToWorldPosition,    << 
234                    detectorSizeX/2,            << 
235                    detectorSizeY/2,            << 
236                    detectorSizeZ/2,            << 
237                    numberOfVoxelsAlongX,       << 
238                    numberOfVoxelsAlongY,       << 
239                    numberOfVoxelsAlongZ);      << 
240 }                                              << 
241 void HadrontherapyDetectorConstruction::Virtua << 
242 {                                              << 
243                                                << 
244     //Virtual  plane                           << 
245     VirtualLayerPosition = G4ThreeVector(0*cm, << 
246     NewSource= Varbool;                        << 
247     if(NewSource == true)                      << 
248     {                                             237     {
249        // std::cout<<"trr"<<std::endl;         << 238       // The sensitive detector is instantiated
250         G4Material* airNist =  G4NistManager:: << 239       detectorSD = new HadrontherapyDetectorSD(sensitiveDetectorName);
251                                                << 240       
252         solidVirtualLayer = new G4Box("Virtual << 241       // The Read Out Geometry is instantiated
253                                       1.*um,   << 242       G4String ROGeometryName = "DetectorROGeometry";
254                                       20.*cm,  << 243       detectorROGeometry = new HadrontherapyDetectorROGeometry(ROGeometryName,
255                                       40.*cm); << 244                    detectorSizeX,
256                                                << 245                    detectorSizeY,
257         logicVirtualLayer = new G4LogicalVolum << 246                    detectorSizeZ,
258                                                << 247                    numberOfVoxelsAlongX,
259                                                << 248                    numberOfVoxelsAlongY,
260                                                << 249                    numberOfVoxelsAlongZ);
261                                                << 250       detectorROGeometry -> BuildROGeometry();
262         physVirtualLayer= new G4PVPlacement(0, << 251       detectorSD -> SetROgeometry(detectorROGeometry);
263                                             "V << 252       sensitiveDetectorManager -> AddNewDetector(detectorSD);
264                                             lo << 253       detectorLogicalVolume -> SetSensitiveDetector(detectorSD);
265                                             mo << 
266                                             fa << 
267                                             0) << 
268                                                << 
269         logicVirtualLayer -> SetVisAttributes( << 
270     }                                             254     }
271                                                << 
272                                                << 
273                                                << 
274                                                << 
275 }                                                 255 }
276                                                   256 
277                                                << 257 void HadrontherapyDetectorConstruction::SetModulatorAngle(G4double value)
278 ////////////////////////////////////////////// << 258 {  
279 void  HadrontherapyDetectorConstruction::Param << 259   modulator -> SetModulatorAngle(value);
280 {                                              << 260   G4RunManager::GetRunManager() -> GeometryHasBeenModified();
281     // Check phantom/detector sizes & relative << 
282     if (!IsInside(detectorSizeX,               << 
283                   detectorSizeY,               << 
284                   detectorSizeZ,               << 
285                   phantomSizeX,                << 
286                   phantomSizeY,                << 
287                   phantomSizeZ,                << 
288                   detectorToPhantomPosition    << 
289                   ))                           << 
290         G4Exception("HadrontherapyDetectorCons << 
291                                                << 
292     // Check Detector sizes respect to the vox << 
293                                                << 
294     if ( detectorSizeX < sizeOfVoxelAlongX) {  << 
295         G4Exception("HadrontherapyDetectorCons << 
296     }                                          << 
297     if ( detectorSizeY < sizeOfVoxelAlongY) {  << 
298         G4Exception(" HadrontherapyDetectorCon << 
299     }                                          << 
300     if ( detectorSizeZ < sizeOfVoxelAlongZ) {  << 
301         G4Exception(" HadrontherapyDetectorCon << 
302     }                                          << 
303 }                                                 261 }
304                                                   262 
305 ////////////////////////////////////////////// << 263 void HadrontherapyDetectorConstruction::SetRangeShifterXPosition(G4double value)
306 G4bool HadrontherapyDetectorConstruction::SetP << 
307 {                                              << 
308                                                << 
309     if (G4Material* pMat = G4NistManager::Inst << 
310     {                                          << 
311         phantomMaterial  = pMat;               << 
312         detectorMaterial = pMat;               << 
313         if (detectorLogicalVolume && phantomLo << 
314         {                                      << 
315             detectorLogicalVolume -> SetMateri << 
316             phantomLogicalVolume ->  SetMateri << 
317                                                << 
318             G4RunManager::GetRunManager() -> P << 
319             G4RunManager::GetRunManager() -> G << 
320             G4cout << "The material of Phantom << 
321         }                                      << 
322     }                                          << 
323     else                                       << 
324     {                                          << 
325         G4cout << "WARNING: material \"" << ma << 
326         " table [located in $G4INSTALL/source/ << 
327         G4cout << "Use command \"/parameter/ni << 
328         return false;                          << 
329     }                                          << 
330                                                << 
331     return true;                               << 
332 }                                              << 
333 ////////////////////////////////////////////// << 
334 void HadrontherapyDetectorConstruction::SetPha << 
335 {                                                 264 {
336     if (sizeX > 0.) phantomSizeX = sizeX;      << 265   beamLine -> SetRangeShifterXPosition(value);
337     if (sizeY > 0.) phantomSizeY = sizeY;      << 266   G4RunManager::GetRunManager() -> GeometryHasBeenModified();
338     if (sizeZ > 0.) phantomSizeZ = sizeZ;      << 
339 }                                                 267 }
340                                                   268 
341 ////////////////////////////////////////////// << 269 void HadrontherapyDetectorConstruction::SetRangeShifterXSize(G4double value)
342 void HadrontherapyDetectorConstruction::SetDet << 
343 {                                                 270 {
344     if (sizeX > 0.) {detectorSizeX = sizeX;}   << 271   beamLine -> SetRangeShifterXSize(value);
345     if (sizeY > 0.) {detectorSizeY = sizeY;}   << 272   G4RunManager::GetRunManager() -> GeometryHasBeenModified();
346     if (sizeZ > 0.) {detectorSizeZ = sizeZ;}   << 
347     SetVoxelSize(sizeOfVoxelAlongX, sizeOfVoxe << 
348 }                                                 273 }
349                                                   274 
350 ////////////////////////////////////////////// << 275 void HadrontherapyDetectorConstruction::SetFirstScatteringFoilSize(G4double value)
351 void HadrontherapyDetectorConstruction::SetVox << 
352 {                                                 276 {
353     if (sizeX > 0.) {sizeOfVoxelAlongX = sizeX << 277   beamLine -> SetFirstScatteringFoilXSize(value);  
354     if (sizeY > 0.) {sizeOfVoxelAlongY = sizeY << 278   G4RunManager::GetRunManager() -> GeometryHasBeenModified();
355     if (sizeZ > 0.) {sizeOfVoxelAlongZ = sizeZ << 
356 }                                                 279 }
357                                                   280 
358 ////////////////////////////////////////////// << 281 void HadrontherapyDetectorConstruction::SetSecondScatteringFoilSize(G4double value)
359 void HadrontherapyDetectorConstruction::SetPha << 
360 {                                                 282 {
361     phantomPosition = pos;                     << 283   beamLine -> SetSecondScatteringFoilXSize(value);
                                                   >> 284   G4RunManager::GetRunManager() -> GeometryHasBeenModified();
362 }                                                 285 }
363                                                   286 
364 ////////////////////////////////////////////// << 287 void HadrontherapyDetectorConstruction::SetOuterRadiusStopper(G4double value)
365 void HadrontherapyDetectorConstruction::SetDet << 
366 {                                                 288 {
367     detectorToPhantomPosition = displ;         << 289   beamLine -> SetOuterRadiusStopper(value); 
                                                   >> 290   G4RunManager::GetRunManager() -> GeometryHasBeenModified(); 
368 }                                                 291 }
369                                                   292 
370 void HadrontherapyDetectorConstruction::SetVir << 293 void HadrontherapyDetectorConstruction::SetInnerRadiusFinalCollimator(G4double value)
371 {                                                 294 {
372                                                << 295   beamLine -> SetInnerRadiusFinalCollimator(value);
373     VirtualLayerPosition = position;           << 296   G4RunManager::GetRunManager() -> GeometryHasBeenModified();
374     physVirtualLayer->SetTranslation(VirtualLa << 
375                                                << 
376 }                                              << 
377 ////////////////////////////////////////////// << 
378 void HadrontherapyDetectorConstruction::Update << 
379 {                                              << 
380     /*                                         << 
381      * Check parameters consistency            << 
382      */                                        << 
383     ParametersCheck();                         << 
384                                                << 
385     G4GeometryManager::GetInstance() -> OpenGe << 
386     if (phantom)                               << 
387     {                                          << 
388         phantom -> SetXHalfLength(phantomSizeX << 
389         phantom -> SetYHalfLength(phantomSizeY << 
390         phantom -> SetZHalfLength(phantomSizeZ << 
391                                                << 
392         phantomPhysicalVolume -> SetTranslatio << 
393     }                                          << 
394     else   ConstructPhantom();                 << 
395                                                << 
396                                                << 
397     // Get the center of the detector          << 
398     SetDetectorPosition();                     << 
399     if (detector)                              << 
400     {                                          << 
401                                                << 
402         detector -> SetXHalfLength(detectorSiz << 
403         detector -> SetYHalfLength(detectorSiz << 
404         detector -> SetZHalfLength(detectorSiz << 
405                                                << 
406         detectorPhysicalVolume -> SetTranslati << 
407     }                                          << 
408     else    ConstructDetector();               << 
409                                                << 
410     //std::cout<<NewSource<<std::endl;         << 
411     /*if(NewSource)                            << 
412      {                                         << 
413      std::cout<<"via"<<std::endl;              << 
414      }*/                                       << 
415                                                << 
416                                                << 
417     // std::cout<<"i"<<std::endl;              << 
418     // std::cout<<VirtualLayerPosition<<std::e << 
419     // physVirtualLayer->SetTranslation(Virtua << 
420                                                << 
421                                                << 
422                                                << 
423                                                << 
424                                                << 
425     // Round to nearest integer number of voxe << 
426                                                << 
427     numberOfVoxelsAlongX = G4lrint(detectorSiz << 
428     sizeOfVoxelAlongX = ( detectorSizeX / numb << 
429     numberOfVoxelsAlongY = G4lrint(detectorSiz << 
430     sizeOfVoxelAlongY = ( detectorSizeY / numb << 
431     numberOfVoxelsAlongZ = G4lrint(detectorSiz << 
432     sizeOfVoxelAlongZ = ( detectorSizeZ / numb << 
433     PassiveProtonBeamLine *ppbl= (PassiveProto << 
434                                                << 
435     G4RunManager::GetRunManager()->GetUserDete << 
436                                                << 
437     HadrontherapyDetectorROGeometry* RO = (Had << 
438                                                << 
439     //Set parameters, either for the Construct << 
440     RO->Initialize(GetDetectorToWorldPosition( << 
441                    detectorSizeX/2,            << 
442                    detectorSizeY/2,            << 
443                    detectorSizeZ/2,            << 
444                    numberOfVoxelsAlongX,       << 
445                    numberOfVoxelsAlongY,       << 
446                    numberOfVoxelsAlongZ);      << 
447                                                << 
448     //This method below has an effect only if  << 
449     RO->UpdateROGeometry();                    << 
450                                                << 
451                                                << 
452                                                << 
453     volumeOfVoxel = sizeOfVoxelAlongX * sizeOf << 
454     massOfVoxel = detectorMaterial -> GetDensi << 
455     //  This will clear the existing matrix (t << 
456     matrix = HadrontherapyMatrix::GetInstance( << 
457                                                << 
458                                                << 
459                                                << 
460                                                << 
461                                                << 
462     // Initialize RBE                          << 
463     HadrontherapyRBE::CreateInstance(numberOfV << 
464                                                << 
465     // Comment out the line below if let calcu << 
466     // Initialize LET with energy of primaries << 
467     if ( (let = HadrontherapyLet::GetInstance( << 
468     {                                          << 
469         HadrontherapyLet::GetInstance() -> Ini << 
470     }                                          << 
471                                                << 
472                                                << 
473     // Initialize analysis                     << 
474     // Inform the kernel about the new geometr << 
475     G4RunManager::GetRunManager() -> GeometryH << 
476     G4RunManager::GetRunManager() -> PhysicsHa << 
477                                                << 
478     PrintParameters();                         << 
479                                                << 
480     // CheckOverlaps();                        << 
481 }                                                 297 }
482                                                   298 
483 ////////////////////////////////////////////// << 299 void HadrontherapyDetectorConstruction::SetRSMaterial(G4String materialChoice)
484 //Check of the geometry                        << 
485 ////////////////////////////////////////////// << 
486 void HadrontherapyDetectorConstruction::CheckO << 
487 {                                                 300 {
488     G4PhysicalVolumeStore* thePVStore = G4Phys << 301   beamLine -> SetRSMaterial(materialChoice);
489     G4cout << thePVStore->size() << " physical << 
490     G4bool overlapFlag = false;                << 
491     G4int res=1000;                            << 
492     G4double tol=0.; //tolerance               << 
493     for (size_t i=0;i<thePVStore->size();i++)  << 
494     {                                          << 
495         //overlapFlag = (*thePVStore)[i]->Chec << 
496         overlapFlag = (*thePVStore)[i]->CheckO << 
497     if (overlapFlag)                           << 
498         G4cout << "Check: there are overlappin << 
499 }                                                 302 }
500                                                   303 
501 ////////////////////////////////////////////// << 
502 void HadrontherapyDetectorConstruction::PrintP << 
503 {                                              << 
504                                                << 
505     G4cout << "The (X,Y,Z) dimensions of the p << 
506     G4BestUnit( phantom -> GetXHalfLength()*2. << 
507     G4BestUnit( phantom -> GetYHalfLength()*2. << 
508     G4BestUnit( phantom -> GetZHalfLength()*2. << 
509                                                << 
510     G4cout << "The (X,Y,Z) dimensions of the d << 
511     G4BestUnit( detector -> GetXHalfLength()*2 << 
512     G4BestUnit( detector -> GetYHalfLength()*2 << 
513     G4BestUnit( detector -> GetZHalfLength()*2 << 
514                                                << 
515     G4cout << "Displacement between Phantom an << 
516     G4cout << "DX= "<< G4BestUnit(phantomPosit << 
517     "DY= "<< G4BestUnit(phantomPosition.getY() << 
518     "DZ= "<< G4BestUnit(phantomPosition.getZ() << 
519                                                << 
520     G4cout << "The (X,Y,Z) sizes of the Voxels << 
521     G4BestUnit(sizeOfVoxelAlongX, "Length")  < << 
522     G4BestUnit(sizeOfVoxelAlongY, "Length")  < << 
523     G4BestUnit(sizeOfVoxelAlongZ, "Length") << << 
524                                                << 
525     G4cout << "The number of Voxels along (X,Y << 
526     numberOfVoxelsAlongX  << ',' <<            << 
527     numberOfVoxelsAlongY  <<','  <<            << 
528     numberOfVoxelsAlongZ  << ')' << G4endl;    << 
529 }                                              << 
530                                                   304 
531                                                   305 
532                                                   306