Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/hadrontherapy/src/HadrontherapyDetectorROGeometry.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/HadrontherapyDetectorROGeometry.cc (Version 11.3.0) and /examples/advanced/hadrontherapy/src/HadrontherapyDetectorROGeometry.cc (Version 10.4)


  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 // Hadrontherapy advanced example for Geant4
 27 // See more at: https://twiki.cern.ch/twiki/bi     27 // See more at: https://twiki.cern.ch/twiki/bin/view/Geant4/AdvancedExamplesHadrontherapy
 28                                                    28 
 29 #include "G4UnitsTable.hh"                         29 #include "G4UnitsTable.hh"
 30 #include "G4SystemOfUnits.hh"                      30 #include "G4SystemOfUnits.hh"
 31 #include "G4LogicalVolume.hh"                      31 #include "G4LogicalVolume.hh"
 32 #include "G4VPhysicalVolume.hh"                    32 #include "G4VPhysicalVolume.hh"
 33 #include "G4PVPlacement.hh"                        33 #include "G4PVPlacement.hh"
 34 #include "G4PVReplica.hh"                          34 #include "G4PVReplica.hh"
 35 #include "G4Box.hh"                                35 #include "G4Box.hh"
 36 #include "G4ThreeVector.hh"                        36 #include "G4ThreeVector.hh"
 37 #include "G4Material.hh"                           37 #include "G4Material.hh"
 38 #include "G4NistManager.hh"                        38 #include "G4NistManager.hh"
 39 #include "G4GeometryManager.hh"                    39 #include "G4GeometryManager.hh"
 40 #include "G4SolidStore.hh"                         40 #include "G4SolidStore.hh"
 41 #include "G4LogicalVolumeStore.hh"                 41 #include "G4LogicalVolumeStore.hh"
 42                                                    42 
 43                                                    43 
 44                                                    44 
 45 #include "G4SDManager.hh"                          45 #include "G4SDManager.hh"
 46 #include "G4RunManager.hh"                         46 #include "G4RunManager.hh"
 47                                                    47 
 48 #include "G4PhysicalVolumeStore.hh"                48 #include "G4PhysicalVolumeStore.hh"
 49                                                    49 
 50 #include "G4ThreeVector.hh"                        50 #include "G4ThreeVector.hh"
 51                                                    51 
 52 #include "globals.hh"                              52 #include "globals.hh"
 53 #include "G4Transform3D.hh"                        53 #include "G4Transform3D.hh"
 54 #include "G4RotationMatrix.hh"                     54 #include "G4RotationMatrix.hh"
 55 #include "G4Colour.hh"                             55 #include "G4Colour.hh"
 56 #include "G4UserLimits.hh"                         56 #include "G4UserLimits.hh"
 57                                                    57 
 58 #include "G4VisAttributes.hh"                      58 #include "G4VisAttributes.hh"
 59                                                    59 
 60 #include "HadrontherapyDetectorROGeometry.hh"      60 #include "HadrontherapyDetectorROGeometry.hh"
 61 #include "HadrontherapyDummySD.hh"                 61 #include "HadrontherapyDummySD.hh"
 62 #include "HadrontherapyDetectorSD.hh"              62 #include "HadrontherapyDetectorSD.hh"
 63                                                    63 
 64 //////////////////////////////////////////////     64 /////////////////////////////////////////////////////////////////////////////
 65 HadrontherapyDetectorROGeometry::Hadrontherapy     65 HadrontherapyDetectorROGeometry::HadrontherapyDetectorROGeometry(G4String aString)
 66   : G4VUserParallelWorld(aString),RODetector(0     66   : G4VUserParallelWorld(aString),RODetector(0),RODetectorXDivision(0),
 67     RODetectorYDivision(0),RODetectorZDivision     67     RODetectorYDivision(0),RODetectorZDivision(0),worldLogical(0),RODetectorLog(0),
 68     RODetectorXDivisionLog(0),RODetectorYDivis     68     RODetectorXDivisionLog(0),RODetectorYDivisionLog(0),RODetectorZDivisionLog(0),
 69     sensitiveLogicalVolume(0)                      69     sensitiveLogicalVolume(0)
 70 {                                                  70 {
 71   isBuilt = false;                                 71   isBuilt = false;
 72   isInitialized = false;                           72   isInitialized = false;
 73 }                                                  73 }
 74                                                    74 
 75 //////////////////////////////////////////////     75 /////////////////////////////////////////////////////////////////////////////
 76                                                    76 
 77 void HadrontherapyDetectorROGeometry::Initiali     77 void HadrontherapyDetectorROGeometry::Initialize(G4ThreeVector pos,
 78              G4double detectorDimX,                78              G4double detectorDimX,
 79              G4double detectorDimY,                79              G4double detectorDimY,
 80              G4double detectorDimZ,                80              G4double detectorDimZ,
 81              G4int numberOfVoxelsX,                81              G4int numberOfVoxelsX,
 82              G4int numberOfVoxelsY,                82              G4int numberOfVoxelsY,
 83              G4int numberOfVoxelsZ)                83              G4int numberOfVoxelsZ)
 84 {                                                  84 {  
 85   detectorToWorldPosition = pos;                   85   detectorToWorldPosition = pos;
 86   detectorSizeX = detectorDimX;                    86   detectorSizeX = detectorDimX;
 87   detectorSizeY= detectorDimY;                     87   detectorSizeY= detectorDimY;
 88   detectorSizeZ=detectorDimZ;                      88   detectorSizeZ=detectorDimZ;
 89   numberOfVoxelsAlongX=numberOfVoxelsX;            89   numberOfVoxelsAlongX=numberOfVoxelsX;
 90   numberOfVoxelsAlongY=numberOfVoxelsY;            90   numberOfVoxelsAlongY=numberOfVoxelsY;
 91   numberOfVoxelsAlongZ=numberOfVoxelsZ;            91   numberOfVoxelsAlongZ=numberOfVoxelsZ;
 92                                                    92 
 93   isInitialized = true;                            93   isInitialized = true;
 94                                                    94 
 95                                                    95 
 96                                                    96   
 97 }                                                  97 }
 98                                                    98 
 99 void HadrontherapyDetectorROGeometry::UpdateRO     99 void HadrontherapyDetectorROGeometry::UpdateROGeometry()
100 {                                                 100 {
101   //Nothing happens if the RO geometry is not     101   //Nothing happens if the RO geometry is not built. But parameters are properly set.
102   if (!isBuilt)                                   102   if (!isBuilt)
103     {                                             103     {
104       //G4Exception("HadrontherapyDetectorROGe    104       //G4Exception("HadrontherapyDetectorROGeometry::UpdateROGeometry","had001",
105       //      JustWarning,"Cannot update geome    105       //      JustWarning,"Cannot update geometry before it is built");
106       return;                                     106       return;
107     }                                             107     }
108                                                   108  
109   //1) Update the dimensions of the G4Boxes       109   //1) Update the dimensions of the G4Boxes
110   G4double halfDetectorSizeX = detectorSizeX;     110   G4double halfDetectorSizeX = detectorSizeX;
111   G4double halfDetectorSizeY = detectorSizeY;     111   G4double halfDetectorSizeY = detectorSizeY;
112   G4double halfDetectorSizeZ = detectorSizeZ;     112   G4double halfDetectorSizeZ = detectorSizeZ;
113                                                   113 
114   RODetector->SetXHalfLength(halfDetectorSizeX    114   RODetector->SetXHalfLength(halfDetectorSizeX);
115   RODetector->SetYHalfLength(halfDetectorSizeY    115   RODetector->SetYHalfLength(halfDetectorSizeY);
116   RODetector->SetZHalfLength(halfDetectorSizeZ    116   RODetector->SetZHalfLength(halfDetectorSizeZ);
117                                                   117 
118   G4double halfXVoxelSizeX = halfDetectorSizeX    118   G4double halfXVoxelSizeX = halfDetectorSizeX/numberOfVoxelsAlongX;
119   G4double halfXVoxelSizeY = halfDetectorSizeY    119   G4double halfXVoxelSizeY = halfDetectorSizeY;
120   G4double halfXVoxelSizeZ = halfDetectorSizeZ    120   G4double halfXVoxelSizeZ = halfDetectorSizeZ;
121   G4double voxelXThickness = 2*halfXVoxelSizeX    121   G4double voxelXThickness = 2*halfXVoxelSizeX;
122                                                   122   
123   RODetectorXDivision->SetXHalfLength(halfXVox    123   RODetectorXDivision->SetXHalfLength(halfXVoxelSizeX);
124   RODetectorXDivision->SetYHalfLength(halfXVox    124   RODetectorXDivision->SetYHalfLength(halfXVoxelSizeY);
125   RODetectorXDivision->SetZHalfLength(halfXVox    125   RODetectorXDivision->SetZHalfLength(halfXVoxelSizeZ);
126                                                   126 
127   G4double halfYVoxelSizeX = halfXVoxelSizeX;     127   G4double halfYVoxelSizeX = halfXVoxelSizeX;
128   G4double halfYVoxelSizeY = halfDetectorSizeY    128   G4double halfYVoxelSizeY = halfDetectorSizeY/numberOfVoxelsAlongY;
129   G4double halfYVoxelSizeZ = halfDetectorSizeZ    129   G4double halfYVoxelSizeZ = halfDetectorSizeZ;
130   G4double voxelYThickness = 2*halfYVoxelSizeY    130   G4double voxelYThickness = 2*halfYVoxelSizeY;
131                                                   131 
132   RODetectorYDivision->SetXHalfLength(halfYVox    132   RODetectorYDivision->SetXHalfLength(halfYVoxelSizeX);
133   RODetectorYDivision->SetYHalfLength(halfYVox    133   RODetectorYDivision->SetYHalfLength(halfYVoxelSizeY);
134   RODetectorYDivision->SetZHalfLength(halfYVox    134   RODetectorYDivision->SetZHalfLength(halfYVoxelSizeZ);
135                                                   135 
136   G4double halfZVoxelSizeX = halfXVoxelSizeX;     136   G4double halfZVoxelSizeX = halfXVoxelSizeX;
137   G4double halfZVoxelSizeY = halfYVoxelSizeY;     137   G4double halfZVoxelSizeY = halfYVoxelSizeY;
138   G4double halfZVoxelSizeZ = halfDetectorSizeZ    138   G4double halfZVoxelSizeZ = halfDetectorSizeZ/numberOfVoxelsAlongZ;
139   G4double voxelZThickness = 2*halfZVoxelSizeZ    139   G4double voxelZThickness = 2*halfZVoxelSizeZ;
140                                                   140 
141   RODetectorZDivision->SetXHalfLength(halfZVox    141   RODetectorZDivision->SetXHalfLength(halfZVoxelSizeX);
142   RODetectorZDivision->SetYHalfLength(halfZVox    142   RODetectorZDivision->SetYHalfLength(halfZVoxelSizeY);
143   RODetectorZDivision->SetZHalfLength(halfZVox    143   RODetectorZDivision->SetZHalfLength(halfZVoxelSizeZ);
144                                                   144 
145   //Delete and re-build the relevant physical     145   //Delete and re-build the relevant physical volumes
146   G4PhysicalVolumeStore* store =                  146   G4PhysicalVolumeStore* store =
147     G4PhysicalVolumeStore::GetInstance();         147     G4PhysicalVolumeStore::GetInstance();
148                                                   148 
149   //Delete...                                     149   //Delete...
150   G4VPhysicalVolume* myVol = store->GetVolume(    150   G4VPhysicalVolume* myVol = store->GetVolume("RODetectorPhys");
151   store->DeRegister(myVol);                       151   store->DeRegister(myVol);
152   //..and rebuild                                 152   //..and rebuild
153   G4VPhysicalVolume *RODetectorPhys = new G4PV    153   G4VPhysicalVolume *RODetectorPhys = new G4PVPlacement(0,
154               detectorToWorldPosition,            154               detectorToWorldPosition,
155               RODetectorLog,                      155               RODetectorLog,
156               "RODetectorPhys",                   156               "RODetectorPhys",
157               worldLogical,                       157               worldLogical,             
158               false,0);                           158               false,0);
159                                                   159 
160   myVol = store->GetVolume("RODetectorXDivisio    160   myVol = store->GetVolume("RODetectorXDivisionPhys");
161   store->DeRegister(myVol);                       161   store->DeRegister(myVol);
162   G4VPhysicalVolume *RODetectorXDivisionPhys =    162   G4VPhysicalVolume *RODetectorXDivisionPhys = new G4PVReplica("RODetectorXDivisionPhys",
163                      RODetectorXDivisionLog,      163                      RODetectorXDivisionLog,
164                      RODetectorPhys,              164                      RODetectorPhys,
165                      kXAxis,                      165                      kXAxis,
166                      numberOfVoxelsAlongX,        166                      numberOfVoxelsAlongX,
167                      voxelXThickness);            167                      voxelXThickness);
168   myVol = store->GetVolume("RODetectorYDivisio    168   myVol = store->GetVolume("RODetectorYDivisionPhys");
169   store->DeRegister(myVol);                       169   store->DeRegister(myVol);
170   G4VPhysicalVolume *RODetectorYDivisionPhys =    170   G4VPhysicalVolume *RODetectorYDivisionPhys = new G4PVReplica("RODetectorYDivisionPhys",
171                      RODetectorYDivisionLog,      171                      RODetectorYDivisionLog,
172                      RODetectorXDivisionPhys,     172                      RODetectorXDivisionPhys,
173                      kYAxis,                      173                      kYAxis,
174                      numberOfVoxelsAlongY,        174                      numberOfVoxelsAlongY,
175                      voxelYThickness);            175                      voxelYThickness);
176                                                   176   
177   myVol = store->GetVolume("RODetectorZDivisio    177   myVol = store->GetVolume("RODetectorZDivisionPhys");
178   store->DeRegister(myVol);                       178   store->DeRegister(myVol);
179   new G4PVReplica("RODetectorZDivisionPhys",      179   new G4PVReplica("RODetectorZDivisionPhys",
180       RODetectorZDivisionLog,                     180       RODetectorZDivisionLog,
181       RODetectorYDivisionPhys,                    181       RODetectorYDivisionPhys,
182       kZAxis,                                     182       kZAxis,
183       numberOfVoxelsAlongZ,                       183       numberOfVoxelsAlongZ,
184       voxelZThickness);                           184       voxelZThickness);
185                                                   185 
186   return;                                         186   return;
187                                                   187 
188 }                                                 188 }
189                                                   189 
190 //////////////////////////////////////////////    190 /////////////////////////////////////////////////////////////////////////////
191 HadrontherapyDetectorROGeometry::~Hadrontherap    191 HadrontherapyDetectorROGeometry::~HadrontherapyDetectorROGeometry()
192 {;}                                               192 {;}
193                                                   193 
194 //////////////////////////////////////////////    194 /////////////////////////////////////////////////////////////////////////////
195 void HadrontherapyDetectorROGeometry::Construc    195 void HadrontherapyDetectorROGeometry::Construct()
196 {                                                 196 {
197   // A dummy material is used to fill the volu    197   // A dummy material is used to fill the volumes of the readout geometry.
198   // (It will be allowed to set a NULL pointer    198   // (It will be allowed to set a NULL pointer in volumes of such virtual
199   // division in future, since this material i    199   // division in future, since this material is irrelevant for tracking.)
200                                                   200   
201                                                   201 
202   //                                              202   //
203   // World                                        203   // World
204   //                                              204   //
205   G4VPhysicalVolume* ghostWorld = GetWorld();     205   G4VPhysicalVolume* ghostWorld = GetWorld();
206   worldLogical = ghostWorld->GetLogicalVolume(    206   worldLogical = ghostWorld->GetLogicalVolume();
207                                                   207   
208   if (!isInitialized)                             208   if (!isInitialized)
209     {                                             209     {
210       G4Exception("HadrontherapyDetectorROGeom    210       G4Exception("HadrontherapyDetectorROGeometry::Construct","had001",
211       FatalException,"Parameters of the RO geo    211       FatalException,"Parameters of the RO geometry are not initialized");
212       return;                                     212       return;
213     }                                             213     }
214                                                   214 
215                                                   215   
216   G4double halfDetectorSizeX = detectorSizeX;     216   G4double halfDetectorSizeX = detectorSizeX;
217   G4double halfDetectorSizeY = detectorSizeY;     217   G4double halfDetectorSizeY = detectorSizeY;
218   G4double halfDetectorSizeZ = detectorSizeZ;     218   G4double halfDetectorSizeZ = detectorSizeZ;
219                                                   219     
220     // World volume of ROGeometry ... SERVE SO    220     // World volume of ROGeometry ... SERVE SOLO PER LA ROG
221                                                   221 
222   // Detector ROGeometry                          222   // Detector ROGeometry 
223   RODetector = new G4Box("RODetector",            223   RODetector = new G4Box("RODetector", 
224        halfDetectorSizeX,                         224        halfDetectorSizeX, 
225        halfDetectorSizeY,                         225        halfDetectorSizeY, 
226        halfDetectorSizeZ);                        226        halfDetectorSizeZ);
227                                                   227   
228   RODetectorLog = new G4LogicalVolume(RODetect    228   RODetectorLog = new G4LogicalVolume(RODetector,
229               0,                                  229               0,
230               "RODetectorLog",                    230               "RODetectorLog",
231               0,0,0);                             231               0,0,0);
232                                                   232   
233                                                   233   
234                                                   234   
235   G4VPhysicalVolume *RODetectorPhys = new G4PV    235   G4VPhysicalVolume *RODetectorPhys = new G4PVPlacement(0,
236               detectorToWorldPosition,RODetect    236               detectorToWorldPosition,RODetectorLog,
237               "RODetectorPhys",                   237               "RODetectorPhys",
238               worldLogical,                       238               worldLogical,             
239               false,0);                           239               false,0);
240                                                   240 
241                                                   241 
242                                                   242 
243                                                   243   
244   // Division along X axis: the detector is di    244   // Division along X axis: the detector is divided in slices along the X axis
245                                                   245   
246   G4double halfXVoxelSizeX = halfDetectorSizeX    246   G4double halfXVoxelSizeX = halfDetectorSizeX/numberOfVoxelsAlongX;
247   G4double halfXVoxelSizeY = halfDetectorSizeY    247   G4double halfXVoxelSizeY = halfDetectorSizeY;
248   G4double halfXVoxelSizeZ = halfDetectorSizeZ    248   G4double halfXVoxelSizeZ = halfDetectorSizeZ;
249   G4double voxelXThickness = 2*halfXVoxelSizeX    249   G4double voxelXThickness = 2*halfXVoxelSizeX;
250                                                   250   
251                                                   251 
252   RODetectorXDivision = new G4Box("RODetectorX    252   RODetectorXDivision = new G4Box("RODetectorXDivision",
253           halfXVoxelSizeX,                        253           halfXVoxelSizeX,
254           halfXVoxelSizeY,                        254           halfXVoxelSizeY,
255           halfXVoxelSizeZ);                       255           halfXVoxelSizeZ);
256                                                   256   
257   RODetectorXDivisionLog = new G4LogicalVolume    257   RODetectorXDivisionLog = new G4LogicalVolume(RODetectorXDivision,
258                  0,                               258                  0,
259                  "RODetectorXDivisionLog",        259                  "RODetectorXDivisionLog",
260                  0,0,0);                          260                  0,0,0);
261                                                   261 
262   G4VPhysicalVolume *RODetectorXDivisionPhys =    262   G4VPhysicalVolume *RODetectorXDivisionPhys = new G4PVReplica("RODetectorXDivisionPhys",
263                                                   263                                                               RODetectorXDivisionLog,
264                                                   264                                                               RODetectorPhys,
265                                                   265                                                               kXAxis,
266                                                   266                                                               numberOfVoxelsAlongX,
267                                                   267                                                               voxelXThickness);
268                                                   268 
269   // Division along Y axis: the slices along t    269   // Division along Y axis: the slices along the X axis are divided along the Y axis
270                                                   270 
271   G4double halfYVoxelSizeX = halfXVoxelSizeX;     271   G4double halfYVoxelSizeX = halfXVoxelSizeX;
272   G4double halfYVoxelSizeY = halfDetectorSizeY    272   G4double halfYVoxelSizeY = halfDetectorSizeY/numberOfVoxelsAlongY;
273   G4double halfYVoxelSizeZ = halfDetectorSizeZ    273   G4double halfYVoxelSizeZ = halfDetectorSizeZ;
274   G4double voxelYThickness = 2*halfYVoxelSizeY    274   G4double voxelYThickness = 2*halfYVoxelSizeY;
275                                                   275 
276   RODetectorYDivision = new G4Box("RODetectorY    276   RODetectorYDivision = new G4Box("RODetectorYDivision",
277           halfYVoxelSizeX,                        277           halfYVoxelSizeX, 
278           halfYVoxelSizeY,                        278           halfYVoxelSizeY,
279           halfYVoxelSizeZ);                       279           halfYVoxelSizeZ);
280                                                   280 
281   RODetectorYDivisionLog = new G4LogicalVolume    281   RODetectorYDivisionLog = new G4LogicalVolume(RODetectorYDivision,
282                  0,                               282                  0,
283                  "RODetectorYDivisionLog",        283                  "RODetectorYDivisionLog",
284                  0,0,0);                          284                  0,0,0);
285                                                   285  
286   G4VPhysicalVolume *RODetectorYDivisionPhys =    286   G4VPhysicalVolume *RODetectorYDivisionPhys = new G4PVReplica("RODetectorYDivisionPhys",
287                     RODetectorYDivisionLog,       287                     RODetectorYDivisionLog,
288                     RODetectorXDivisionPhys,      288                     RODetectorXDivisionPhys,
289                     kYAxis,                       289                     kYAxis,
290                     numberOfVoxelsAlongY,         290                     numberOfVoxelsAlongY,
291                     voxelYThickness);             291                     voxelYThickness);
292                                                   292   
293   // Division along Z axis: the slices along t    293   // Division along Z axis: the slices along the Y axis are divided along the Z axis
294                                                   294 
295   G4double halfZVoxelSizeX = halfXVoxelSizeX;     295   G4double halfZVoxelSizeX = halfXVoxelSizeX;
296   G4double halfZVoxelSizeY = halfYVoxelSizeY;     296   G4double halfZVoxelSizeY = halfYVoxelSizeY;
297   G4double halfZVoxelSizeZ = halfDetectorSizeZ    297   G4double halfZVoxelSizeZ = halfDetectorSizeZ/numberOfVoxelsAlongZ;
298   G4double voxelZThickness = 2*halfZVoxelSizeZ    298   G4double voxelZThickness = 2*halfZVoxelSizeZ;
299                                                   299  
300   RODetectorZDivision = new G4Box("RODetectorZ    300   RODetectorZDivision = new G4Box("RODetectorZDivision",
301           halfZVoxelSizeX,                        301           halfZVoxelSizeX,
302           halfZVoxelSizeY,                        302           halfZVoxelSizeY, 
303           halfZVoxelSizeZ);                       303           halfZVoxelSizeZ);
304                                                   304  
305   RODetectorZDivisionLog = new G4LogicalVolume    305   RODetectorZDivisionLog = new G4LogicalVolume(RODetectorZDivision,
306                  0,                               306                  0,
307                  "RODetectorZDivisionLog",        307                  "RODetectorZDivisionLog",
308                  0,0,0);                          308                  0,0,0);
309                                                   309  
310   new G4PVReplica("RODetectorZDivisionPhys",      310   new G4PVReplica("RODetectorZDivisionPhys",
311       RODetectorZDivisionLog,                     311       RODetectorZDivisionLog,
312       RODetectorYDivisionPhys,                    312       RODetectorYDivisionPhys,
313       kZAxis,                                     313       kZAxis,
314       numberOfVoxelsAlongZ,                       314       numberOfVoxelsAlongZ,
315       voxelZThickness);                           315       voxelZThickness);
316                                                   316 
317   sensitiveLogicalVolume = RODetectorZDivision    317   sensitiveLogicalVolume = RODetectorZDivisionLog;
318   isBuilt = true;                                 318   isBuilt = true;
319 }                                                 319 }
320                                                   320 
321 void HadrontherapyDetectorROGeometry::Construc    321 void HadrontherapyDetectorROGeometry::ConstructSD()
322 {                                                 322 {
                                                   >> 323  
323  G4String sensitiveDetectorName = "RODetector"    324  G4String sensitiveDetectorName = "RODetector";
324                                                   325  
325  HadrontherapyDetectorSD* detectorSD = new Had    326  HadrontherapyDetectorSD* detectorSD = new HadrontherapyDetectorSD(sensitiveDetectorName);
326  G4SDManager::GetSDMpointer()->AddNewDetector( << 
327  sensitiveLogicalVolume->SetSensitiveDetector( << 
328                                                   327 
329  // SetSensitiveDetector(sensitiveLogicalVolum << 328  SetSensitiveDetector(sensitiveLogicalVolume,detectorSD);
330                                                   329 
331                                                   330 
332 }                                                 331 }
333                                                   332 
334                                                   333