Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/hadrontherapy/include/HadrontherapyDetectorConstruction.hh

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/include/HadrontherapyDetectorConstruction.hh (Version 11.3.0) and /examples/advanced/hadrontherapy/include/HadrontherapyDetectorConstruction.hh (Version 9.3.p1)


  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 // HadrontherapyDetectorConstruction.hh; 
 27 // See more at: https://twiki.cern.ch/twiki/bi <<  27 // See more at: http://g4advancedexamples.lngs.infn.it/Examples/hadrontherapy//
 28                                                    28 
 29 #ifndef HadrontherapyDetectorConstruction_H        29 #ifndef HadrontherapyDetectorConstruction_H
 30 #define HadrontherapyDetectorConstruction_H 1      30 #define HadrontherapyDetectorConstruction_H 1
 31                                                    31 
 32 #include "G4Box.hh"                                32 #include "G4Box.hh"
 33 #include "globals.hh"                              33 #include "globals.hh"
 34 #include "G4VisAttributes.hh"                      34 #include "G4VisAttributes.hh"
 35 #include "G4LogicalVolume.hh"                      35 #include "G4LogicalVolume.hh"
 36 #include "G4UnitsTable.hh"                         36 #include "G4UnitsTable.hh"
 37 #include "HadrontherapyDetectorROGeometry.hh"  << 
 38                                                    37 
 39 class G4VPhysicalVolume;                           38 class G4VPhysicalVolume;
 40 class G4LogicalVolume;                             39 class G4LogicalVolume;
 41 class G4PVPlacement;                           << 
 42 class HadrontherapyDetectorROGeometry;             40 class HadrontherapyDetectorROGeometry;
 43 class HadrontherapyDetectorMessenger;              41 class HadrontherapyDetectorMessenger;
 44 class HadrontherapyDetectorSD;                     42 class HadrontherapyDetectorSD;
 45 class HadrontherapyMatrix;                         43 class HadrontherapyMatrix;
 46 class HadrontherapyLet;                        << 
 47                                                    44 
 48 class HadrontherapyDetectorConstruction        <<  45 class HadrontherapyDetectorConstruction 
 49 {                                                  46 {
 50 public:                                            47 public:
 51                                                <<  48 
 52     HadrontherapyDetectorConstruction(G4VPhysi <<  49   HadrontherapyDetectorConstruction(G4VPhysicalVolume*);
 53                                                <<  50 
 54     ~HadrontherapyDetectorConstruction();      <<  51   ~HadrontherapyDetectorConstruction();
 55                                                <<  52 
 56 public:                                        <<  53 
 57     static HadrontherapyDetectorConstruction*  <<  54 private: 
 58     void InitializeDetectorROGeometry(Hadronth <<  55 
 59                                       G4ThreeV <<  56   void ConstructPhantom();
 60     G4VPhysicalVolume* motherPhys;             <<  57   void ConstructDetector();
 61     HadrontherapyDetectorSD*         detectorS <<  58   void ConstructSensitiveDetector(G4ThreeVector position_respect_to_WORLD);
 62                                                <<  59   
 63     //////////////////////////                 <<  60 public: 
 64     void VirtualLayer(G4bool Varbool);         <<  61 // Get detector position relative to WORLD
 65     G4bool NewSource;                          <<  62 inline G4ThreeVector GetDetectorToWorldPosition()
 66     void SetVirtualLayerPosition(G4ThreeVector <<  63   {
 67     G4ThreeVector VirtualLayerPosition;        <<  64     return phantomPosition + detectorPosition;
 68                                                <<  65   }
 69     //////////////////////////                 <<  66 /////////////////////////////////////////////////////////////////////////////
 70 private:                                       <<  67 // Get displacement between phantom and detector by detector position, phantom and detector sizes
 71                                                <<  68 inline G4ThreeVector GetDetectorToPhantomPosition()
 72     void ConstructPhantom();                   <<  69 {
 73     void ConstructDetector();                  <<  70     return G4ThreeVector(phantomSizeX - detectorSizeX + detectorPosition.getX(),
 74     void ParametersCheck();                    <<  71                          phantomSizeY - detectorSizeY + detectorPosition.getY(),
 75     void CheckOverlaps();                      <<  72                          phantomSizeZ - detectorSizeZ + detectorPosition.getZ()
 76                                                <<  73               );
 77 public:                                        <<  74 }
 78     // Get detector position relative to WORLD <<  75 
 79     inline G4ThreeVector GetDetectorToWorldPos <<  76 /////////////////////////////////////////////////////////////////////////////
 80     {                                          <<  77 // Calculate (and set) detector position by displacement, phantom and detector sizes
 81         return phantomPosition + detectorPosit <<  78 inline void SetDetectorPosition()
 82     }                                          <<  79   {
 83     ////////////////////////////////////////// <<  80     // Adjust detector position
 84     // Get displacement between phantom and de <<  81     detectorPosition.setX(detectorToPhantomPosition.getX() - phantomSizeX + detectorSizeX);
 85     inline G4ThreeVector GetDetectorToPhantomP <<  82     detectorPosition.setY(detectorToPhantomPosition.getY() - phantomSizeY + detectorSizeY);
 86     {                                          <<  83     detectorPosition.setZ(detectorToPhantomPosition.getZ() - phantomSizeZ + detectorSizeZ);
 87         return G4ThreeVector(phantomSizeX/2 -  <<  84      
 88                              phantomSizeY/2 -  <<  85       if (detectorPhysicalVolume) detectorPhysicalVolume -> SetTranslation(detectorPosition); 
 89                              phantomSizeZ/2 -  <<  86   }
 90                              );                <<  87 /////////////////////////////////////////////////////////////////////////////
 91     }                                          <<  88 // Check whether detector is inside phantom
 92                                                <<  89 inline bool IsInside(G4double detectorHalfX,
 93     ////////////////////////////////////////// <<  90          G4double detectorHalfY,
 94     // Calculate (and set) detector position b <<  91          G4double detectorHalfZ,
 95     inline void SetDetectorPosition()          <<  92          G4double phantomHalfX,
 96     {                                          <<  93          G4double phantomHalfY,
 97         // Adjust detector position            <<  94          G4double phantomHalfZ,
 98         detectorPosition.setX(detectorToPhanto <<  95          G4ThreeVector detectorToPhantomPosition)
 99         detectorPosition.setY(detectorToPhanto <<  96 {
100         detectorPosition.setZ(detectorToPhanto <<  97 // Dimensions check... X Y and Z
101                                                <<  98 // Firstly check what dimension we are modifying
102                                                <<  99   if (detectorHalfX > 0. && phantomHalfX > 0. && detectorToPhantomPosition.getX() >=0.)
103     }                                          << 100   {
104     ////////////////////////////////////////// << 101       if (detectorHalfX > phantomHalfX) 
105     // Check whether detector is inside phanto << 102      {
106     inline bool IsInside(G4double detectorX,   << 103         G4cout << "Error: Detector X dimension must be smaller or equal to the corrispondent of the phantom" << G4endl;
107                          G4double detectorY,   << 104         return false;
108                          G4double detectorZ,   << 105      }
109                          G4double phantomX,    << 106       if ( 2*(phantomHalfX - detectorHalfX) < detectorToPhantomPosition.getX()) 
110                          G4double phantomY,    << 107            {
111                          G4double phantomZ,    << 108         G4cout << "Error: X dimension doesn't fit with detector to phantom relative position" << G4endl;
112                          G4ThreeVector pos)    << 109         return false;
113     {                                          << 110            }
114         // Dimensions check... X Y and Z       << 111   }
115         // Firstly check what dimension we are << 112 
116         {                                      << 113   if (detectorHalfY > 0. && phantomHalfY > 0.&& detectorToPhantomPosition.getY() >=0.)
117             if (detectorX > phantomX)          << 114   {
118             {                                  << 115       if (detectorHalfY > phantomHalfY) 
119                 G4cout << "Error: Detector X d << 116      {
120                 return false;                  << 117         G4cout << "Error: Detector Y dimension must be smaller or equal to the corrispondent of the phantom" << G4endl;
121             }                                  << 118         return false;
122             if ( (phantomX - detectorX) < pos. << 119      }
123             {                                  << 120       if ( 2*(phantomHalfY - detectorHalfY) < detectorToPhantomPosition.getY()) 
124                 G4cout << "Error: X dimension  << 121        {
125                 return false;                  << 122        G4cout << "Error: Y dimension doesn't fit with detector to phantom relative position" << G4endl;
126             }                                  << 123        return false;
127         }                                      << 124        }
128                                                << 125   }      
129         {                                      << 126 
130             if (detectorY > phantomY)          << 127   if (detectorHalfZ > 0. && phantomHalfZ > 0.&& detectorToPhantomPosition.getZ() >=0.)
131             {                                  << 128   {
132                 G4cout << "Error: Detector Y d << 129       if (detectorHalfZ > phantomHalfZ) 
133                 return false;                  << 130      {
134             }                                  << 131         G4cout << "Error: Detector Z dimension must be smaller or equal to the corrispondent of the phantom" << G4endl;
135             if ( (phantomY - detectorY) < pos. << 132         return false;
136             {                                  << 133      }
137                 G4cout << "Error: Y dimension  << 134       if ( 2*(phantomHalfZ - detectorHalfZ) < detectorToPhantomPosition.getZ()) 
138                 return false;                  << 135        {
139             }                                  << 136        G4cout << "Error: Z dimension doesn't fit with detector to phantom relative position" << G4endl;
140         }                                      << 137        return false;
141                                                << 138        }
142         {                                      << 139   }
143             if (detectorZ > phantomZ)          << 140 /*
144             {                                  << 141     G4cout << "Displacement between Phantom and Detector is: "; 
145                 G4cout << "Error: Detector Z d << 142     G4cout << "DX= "<< G4BestUnit(detectorToPhantomPosition.getX(),"Length") << 
146                 return false;                  << 143               "DY= "<< G4BestUnit(detectorToPhantomPosition.getY(),"Length") << 
147             }                                  << 144               "DZ= "<< G4BestUnit(detectorToPhantomPosition.getZ(),"Length") << G4endl;
148             if ( (phantomZ - detectorZ) < pos. << 145 */
149             {                                  << 146   return true;
150                 G4cout << "Error: Z dimension  << 147 }
151                 return false;                  << 148 /////////////////////////////////////////////////////////////////////////////
152             }                                  << 149 
153         }                                      << 150   G4bool SetNumberOfVoxelBySize(G4double sizeX, G4double sizeY, G4double sizeZ);
154                                                << 151   G4bool SetDetectorSize(G4double sizeX, G4double sizeY, G4double sizeZ);
155         return true;                           << 152   G4bool SetPhantomSize(G4double sizeX, G4double sizeY, G4double sizeZ);
156     }                                          << 153   G4bool SetPhantomPosition(G4ThreeVector);
157     ////////////////////////////////////////// << 154   G4bool SetDetectorToPhantomPosition(G4ThreeVector DetectorToPhantomPosition);
158                                                << 155   G4LogicalVolume* GetDetectorLogicalVolume(){ return detectorLogicalVolume;}
159     G4bool  SetPhantomMaterial(G4String materi << 156 
160     void SetVoxelSize(G4double sizeX, G4double << 157 
161     void SetDetectorSize(G4double sizeX, G4dou << 
162     void SetPhantomSize(G4double sizeX, G4doub << 
163     void SetPhantomPosition(G4ThreeVector);    << 
164     void SetDetectorToPhantomPosition(G4ThreeV << 
165     void UpdateGeometry();                     << 
166     void PrintParameters();                    << 
167     G4LogicalVolume* GetDetectorLogicalVolume( << 
168                                                << 
169 private:                                          158 private:
170     static HadrontherapyDetectorConstruction*  << 159 
171     HadrontherapyDetectorMessenger* detectorMe << 160   HadrontherapyDetectorMessenger* detectorMessenger; 
172                                                << 161 
173     G4VisAttributes* skyBlue;                  << 162   G4VisAttributes* skyBlue;
174     G4VisAttributes* red;                      << 163   G4VisAttributes* red;
175                                                << 164 
176     HadrontherapyDetectorROGeometry* detectorR << 165   G4VPhysicalVolume* motherPhys;
177     HadrontherapyMatrix*             matrix;   << 166 
178     HadrontherapyLet*                let;      << 167   HadrontherapyDetectorSD*         detectorSD; // Pointer to sensitive detector
179                                                << 168   HadrontherapyDetectorROGeometry* detectorROGeometry; // Pointer to ROGeometry 
180     G4Box *phantom , *detector;                << 169   HadrontherapyMatrix*             matrix;
181     G4LogicalVolume *phantomLogicalVolume, *de << 170 
182     G4VPhysicalVolume *phantomPhysicalVolume,  << 171   G4VPhysicalVolume* phantomPhysicalVolume;
183                                                << 172   G4LogicalVolume*   phantomLogicalVolume; 
184     G4Box* solidVirtualLayer;                  << 173   G4LogicalVolume*   detectorLogicalVolume;
185     G4LogicalVolume* logicVirtualLayer;        << 174   G4VPhysicalVolume* detectorPhysicalVolume;
186     G4VPhysicalVolume*  physVirtualLayer;      << 175   
187                                                << 176   G4double phantomSizeX; 
188     G4double phantomSizeX;                     << 177   G4double phantomSizeY; 
189     G4double phantomSizeY;                     << 178   G4double phantomSizeZ;
190     G4double phantomSizeZ;                     << 179 
191                                                << 180   G4double detectorSizeX; 
192     G4double detectorSizeX;                    << 181   G4double detectorSizeY; 
193     G4double detectorSizeY;                    << 182   G4double detectorSizeZ;
194     G4double detectorSizeZ;                    << 183 
195                                                << 184   G4ThreeVector phantomPosition, detectorPosition, detectorToPhantomPosition; //  phantom center, detector center, detector to phantom relative position
196     G4ThreeVector phantomPosition, detectorPos << 185 
197                                                << 186   G4double sizeOfVoxelAlongX; 
198     G4double sizeOfVoxelAlongX;                << 187   G4double sizeOfVoxelAlongY; 
199     G4double sizeOfVoxelAlongY;                << 188   G4double sizeOfVoxelAlongZ; 
200     G4double sizeOfVoxelAlongZ;                << 189 
201                                                << 190   G4int numberOfVoxelsAlongX; 
202     G4int numberOfVoxelsAlongX;                << 191   G4int numberOfVoxelsAlongY;
203     G4int numberOfVoxelsAlongY;                << 192   G4int numberOfVoxelsAlongZ;  
204     G4int numberOfVoxelsAlongZ;                << 193 
205                                                << 194   G4Box* phantom;
206     G4double volumeOfVoxel, massOfVoxel;       << 195   G4Box* detector;
207                                                << 196 
208     G4Material *phantomMaterial, *detectorMate << 
209     G4Region* aRegion;                         << 
210 };                                                197 };
211 #endif                                            198 #endif
212                                                   199