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 9.1.p3)


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