Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/xray_fluorescence/include/XrayFluoMercuryDetectorConstruction.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 ]

  1 //
  2 // ********************************************************************
  3 // * License and Disclaimer                                           *
  4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.                             *
 10 // *                                                                  *
 11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                                                  *
 18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // ********************************************************************
 25 //
 26 //
 27 //
 28 // Author: Alfonso Mantero (Alfonso.Mantero@ge.infn.it)
 29 //
 30 // History:
 31 // -----------
 32 //
 33 //  08 Sep 2003  Alfonso Mantero created
 34 //
 35 // -------------------------------------------------------------------
 36 
 37 #ifndef XrayFluoMercuryDetectorConstruction_hh
 38 #define XrayFluoMercuryDetectorConstruction_hh 1
 39 
 40 #include "globals.hh"
 41 #include "G4VUserDetectorConstruction.hh"
 42 #include "G4RotationMatrix.hh"
 43 #include "G4Cache.hh"
 44 #include "XrayFluoSiLiDetectorType.hh"
 45 #include "XrayFluoHPGeDetectorType.hh"
 46 #include "XrayFluoSD.hh"
 47 
 48 class G4Box;
 49 class G4Tubs;
 50 class G4Sphere;
 51 class G4LogicalVolume;
 52 class G4VPhysicalVolume;
 53 class G4Material;
 54 class XrayFluoMercuryDetectorMessenger;
 55 class XrayFluoNistMaterials;
 56 
 57 //class XrayFluoSD;
 58 //class XrayFluoVDetectorType;
 59 
 60 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 61 
 62 class XrayFluoMercuryDetectorConstruction : public G4VUserDetectorConstruction
 63 {
 64 public:
 65   
 66 
 67   ~XrayFluoMercuryDetectorConstruction();
 68   
 69 public:
 70   
 71   G4VPhysicalVolume* Construct();
 72  
 73   void ConstructSDandField();
 74   
 75   void UpdateGeometry();
 76 
 77 
 78   void SetMercuryMaterial(G4String newMaterial);
 79 
 80   void SetDetectorType(G4String type);
 81 
 82   static XrayFluoMercuryDetectorConstruction* GetInstance();
 83 
 84   inline void SetOribitHeight(G4double size)
 85   {distDe = size;};
 86   inline void SetLatitude(G4double lat)
 87   {ThetaHPGe = 180.* CLHEP::deg - lat;};
 88 
 89   void PrintApparateParameters(); 
 90 
 91   XrayFluoVDetectorType* GetDetectorType() const;
 92 
 93 
 94   G4double GetWorldSizeZ() const     {return WorldSizeZ;}; 
 95   G4double GetWorldSizeXY() const         {return WorldSizeXY;};
 96   
 97   G4double GetDeviceThickness() const     {return DeviceThickness;}; 
 98   G4double GetDeviceSizeX() const         {return DeviceSizeX;};
 99   G4double GetDeviceSizeY() const         {return DeviceSizeY;};
100   G4double GetPixelSizeXY() const         {return PixelSizeXY;};
101   G4double GetContactSizeXY() const         {return ContactSizeXY;};
102 
103   G4int GetNbOfPixels() const  {return NbOfPixels;}; //mandatory for XrayFluoSD 
104   G4int GetNbOfPixelRows() const    {return NbOfPixelRows;}; 
105   G4int GetNbOfPixelColumns() const        {return NbOfPixelColumns;}; 
106   
107   G4Material* GetOhmicPosMaterial() const  {return OhmicPosMaterial;};
108   G4double    GetOhmicPosThickness() const {return OhmicPosThickness;};      
109   
110   G4Material* GetOhmicNegMaterial() const  {return OhmicNegMaterial;};
111   G4double    GetOhmicNegThickness() const {return OhmicNegThickness;};      
112   
113   const G4VPhysicalVolume* GetphysiWorld() const {return physiWorld;};  
114   const G4VPhysicalVolume* GetHPGe() const        {return physiHPGe;};
115   const G4VPhysicalVolume* GetMercury() const    {return physiMercury;};
116 
117   const G4VPhysicalVolume* GetphysiPixel() const {return physiPixel;};           
118   const G4VPhysicalVolume* GetOhmicPos() const    {return physiOhmicPos;};
119   const G4VPhysicalVolume* GetOhmicNeg() const     {return physiOhmicNeg;};
120 
121   const G4VPhysicalVolume* GetOptic() const    {return physiOptic;};
122   
123 private:
124   
125   XrayFluoMercuryDetectorConstruction();
126 
127   static XrayFluoMercuryDetectorConstruction* instance;
128 
129   XrayFluoVDetectorType* detectorType;
130 
131   G4bool mercuryGranularity;
132 
133   G4double           DeviceSizeX;
134   G4double           DeviceSizeY;
135   G4double           DeviceThickness;
136   
137   G4Box*             solidWorld;    //pointer to the solid    World 
138   G4LogicalVolume*   logicWorld;    //pointer to the logical  World
139   G4VPhysicalVolume* physiWorld;    //pointer to the physical World
140   
141   G4Box*             solidHPGe; //pointer to the solid    Sensor
142   G4LogicalVolume*   logicHPGe; //pointer to the logical  Sensor
143   G4VPhysicalVolume* physiHPGe; //pointer to the physical Sensor
144  
145   G4Box*             solidScreen; //pointer to the solid    Screen
146   G4LogicalVolume*   logicScreen; //pointer to the logical  Screen
147   G4VPhysicalVolume* physiScreen; //pointer to the physical Screen
148  
149   G4Sphere*             solidMercury;    //pointer to the solid    Mercury
150   G4LogicalVolume*   logicMercury;    //pointer to the logical  Mercury
151   G4VPhysicalVolume* physiMercury;    //pointer to the physical Mercury
152   
153   //  G4Tubs*             solidDia1; //pointer to the solid   Diaphragm
154   //  G4LogicalVolume*   logicDia1; //pointer to the logical  Diaphragm
155   //  G4VPhysicalVolume* physiDia1; //pointer to the physical Diaphragm 
156   
157   //  G4Tubs*             solidDia3; //pointer to the solid   Diaphragm
158   //  G4LogicalVolume*   logicDia3; //pointer to the logical  Diaphragm
159   //  G4VPhysicalVolume* physiDia3; //pointer to the physical Diaphragm  
160   
161   G4Box*             solidOhmicPos;
162   G4LogicalVolume*   logicOhmicPos; 
163   G4VPhysicalVolume* physiOhmicPos; 
164   
165   G4Box*             solidOhmicNeg;
166   G4LogicalVolume*   logicOhmicNeg; 
167   G4VPhysicalVolume* physiOhmicNeg;     
168   
169   G4Box*             solidPixel;   
170   G4LogicalVolume*   logicPixel;  
171   G4VPhysicalVolume* physiPixel;    
172  
173   G4Tubs*            solidOptic;
174   G4LogicalVolume*   logicOptic;
175   G4VPhysicalVolume* physiOptic;
176 
177   G4LogicalVolume*   logicGrain;
178 
179   //materials management
180   XrayFluoNistMaterials* materials;
181 
182   G4Material*          screenMaterial;
183   G4Material*        OhmicPosMaterial;
184   G4Material*        OhmicNegMaterial; 
185   G4Material*           pixelMaterial;
186   G4Material*         mercuryMaterial;
187   //  G4Material*        Dia3Material;
188   G4Material*         defaultMaterial;
189 
190   //apparate parameters
191 
192   G4double           OhmicPosThickness;
193   G4double           OhmicNegThickness;
194   
195   G4double           opticDia;
196   G4double           opticThickness;
197 
198   G4double           screenSizeXY;
199   G4double           screenThickness;
200 
201   G4int              PixelCopyNb;
202   G4int              grainCopyNb;
203   G4int              NbOfPixels;
204   G4int              NbOfPixelRows;
205   G4int              NbOfPixelColumns;
206   G4double           PixelThickness;
207   G4double           PixelSizeXY;
208   G4double           ContactSizeXY;
209 
210   G4double           opticAperture;
211 
212   G4double           mercuryDia;
213   G4double           sunDia;
214 
215   G4double           mercurySunDistance;
216 
217   G4double           ThetaHPGe;
218   
219   G4double           distDe;
220   G4double           distScreen;
221   G4double           distOptic;
222 
223 
224   G4double           PhiHPGe;
225   
226   G4RotationMatrix   zRotPhiHPGe;
227 
228   G4double           WorldSizeXY;
229   G4double           WorldSizeZ;
230   
231   
232   XrayFluoMercuryDetectorMessenger* detectorMessenger; //pointer to the Messenger
233 
234   G4Cache<XrayFluoSD*> HPGeSD;  //pointer to the sensitive detector
235  
236 public:
237 
238   G4Material* GetMercuryMaterial() const {return mercuryMaterial;}; 
239   G4Material* GetPixelMaterial() const  {return pixelMaterial;}; 
240   
241   G4double GetMercuryDia()  const       {return mercuryDia;};
242   G4double GetSunDia() const {return sunDia;};
243 
244   //Inclinaton of the orbit respect Mercury respect the equator (latitude)
245 
246   G4double GetOrbitInclination() const  {return 180 * CLHEP::deg - ThetaHPGe;}; 
247   G4double GetOrbitDistance() const     {return distDe;};
248   G4double GetOpticAperture() const {return opticAperture;};  
249 
250 
251   
252 private:
253   
254   void DefineDefaultMaterials();
255   G4VPhysicalVolume* ConstructApparate();
256 
257   //calculates some quantities used to construct geometry
258   void ComputeApparateParameters();
259 
260 };
261 
262 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
263 
264 inline void XrayFluoMercuryDetectorConstruction::ComputeApparateParameters()
265 {     
266   // Compute derived parameters of the apparate
267   
268   DeviceThickness = PixelThickness+OhmicNegThickness+OhmicPosThickness;
269 
270   ///G4cout << "DeviceThickness(cm): "<< DeviceThickness/CLHEP::cm << G4endl;
271 
272   DeviceSizeY =(NbOfPixelRows * std::max(ContactSizeXY,PixelSizeXY));
273   DeviceSizeX =(NbOfPixelColumns * std::max(ContactSizeXY,PixelSizeXY));
274 
275   screenSizeXY = opticDia;
276 
277   G4cout << "DeviceSizeX(cm): "<< DeviceSizeX/CLHEP::cm <<G4endl;
278   G4cout << "DeviceSizeY(cm): "<< DeviceSizeY/CLHEP::cm << G4endl;
279 
280   //*********************************************************************
281   //**  Astronomical distances reduce by a factor 10^-7 due to G4 Bug  **
282   //*********************************************************************
283 
284   WorldSizeZ = 2 * mercurySunDistance ; 
285   WorldSizeXY = (2 * distDe) + 2000 * CLHEP::km ;
286   //WorldSizeZ = WorldSizeXY;
287 }
288 
289 #endif
290