Geant4 Cross Reference

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

  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 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 28 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 29 
 30 #include "DetectorConstruction.hh"
 31 
 32 #include "G4SystemOfUnits.hh"
 33 #include "G4PhysicalConstants.hh"
 34 #include "G4Material.hh"
 35 #include "G4Tubs.hh"
 36 #include "G4Box.hh"
 37 #include "G4LogicalVolume.hh"
 38 #include "G4PVPlacement.hh"
 39 #include "G4PVReplica.hh"
 40 #include "G4Transform3D.hh"
 41 #include "G4RotationMatrix.hh"
 42 
 43 #include "G4GeometryManager.hh"
 44 #include "G4PhysicalVolumeStore.hh"
 45 #include "G4LogicalVolumeStore.hh"
 46 #include "G4SolidStore.hh"
 47 
 48 #include "G4VisAttributes.hh"
 49 
 50 
 51 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 52 
 53 DetectorConstruction::DetectorConstruction()
 54 :fiberMat(0),lvol_fiber(0), absorberMat(0),lvol_layer(0),
 55  moduleMat(0),lvol_module(0), calorimeterMat(0),lvol_calorimeter(0),
 56  worldMat(0),pvol_world(0), defaultMat(0)
 57 {
 58   // materials
 59   DefineMaterials();
 60   
 61   // default parameter values of calorimeter
 62   //
 63   fiberDiameter       = 1.13*mm;  //1.08*mm
 64   nbOfFibers          = 490;    //490
 65   distanceInterFibers = 1.35*mm;  //1.35*mm
 66   layerThickness      = 1.73*mm;  //1.68*mm  
 67   milledLayer         = 1.00*mm;    //1.40*mm ?
 68   nbOfLayers          = 10;       //10
 69   nbOfModules         = 9;        //9
 70      
 71   fiberLength         = (nbOfFibers+0.5)*distanceInterFibers; //662.175*mm
 72 }
 73 
 74 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 75 
 76 DetectorConstruction::~DetectorConstruction()
 77 { }
 78 
 79 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 80 
 81 G4VPhysicalVolume* DetectorConstruction::Construct()
 82 {
 83   return ConstructCalorimeter();
 84 }
 85 
 86 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 87 
 88 void DetectorConstruction::DefineMaterials()
 89 {
 90   // define Elements
 91   //
 92   G4Element* H  = new G4Element("Hydrogen","H", 1,  1.01*g/mole);
 93   G4Element* C  = new G4Element("Carbon",  "C", 6, 12.01*g/mole);
 94   G4Element* N  = new G4Element("Nitrogen","N", 7, 14.01*g/mole);
 95   G4Element* O  = new G4Element("Oxygen",  "O", 8, 16.00*g/mole);
 96 
 97   G4int natoms, ncomponents;
 98   G4double density, massfraction;            
 99 
100   // Lead
101   //
102   G4Material* Pb =   
103   new G4Material("Lead", 82., 207.20*g/mole, density= 0.98*11.20*g/cm3);
104 
105   // Scintillator
106   //
107   G4Material* Sci = 
108   new G4Material("Scintillator", density= 1.032*g/cm3, ncomponents=2);
109   Sci->AddElement(C, natoms=8);
110   Sci->AddElement(H, natoms=8);
111   
112   Sci->GetIonisation()->SetBirksConstant(0.126*mm/MeV);
113 
114   // Air
115   //
116   G4Material* Air = 
117   new G4Material("Air", density= 1.290*mg/cm3, ncomponents=2);
118   Air->AddElement(N, massfraction=70*perCent);
119   Air->AddElement(O, massfraction=30.*perCent);
120 
121   // example of vacuum
122   //
123   density     = universe_mean_density;    //from PhysicalConstants.h
124   G4double pressure    = 3.e-18*pascal;
125   G4double temperature = 2.73*kelvin;
126   G4Material* Vacuum =   
127   new G4Material("Galactic", 1., 1.008*g/mole, density,
128                              kStateGas,temperature,pressure);
129 
130   //attribute materials
131   //
132   defaultMat     = Vacuum;  
133   fiberMat       = Sci;
134   absorberMat    = Pb;
135   moduleMat      = defaultMat;
136   calorimeterMat = defaultMat;
137   worldMat       = defaultMat;
138 
139   // print table
140   //      
141   G4cout << *(G4Material::GetMaterialTable()) << G4endl;
142 }
143 
144 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
145 
146 G4VPhysicalVolume* DetectorConstruction::ConstructCalorimeter()
147 {
148   // Cleanup old geometry
149   //
150   G4GeometryManager::GetInstance()->OpenGeometry();
151   G4PhysicalVolumeStore::GetInstance()->Clean();
152   G4LogicalVolumeStore::GetInstance()->Clean();
153   G4SolidStore::GetInstance()->Clean();
154   
155   // fibers
156   //
157   G4Tubs*
158   svol_fiber = new G4Tubs("fiber",      //name
159                          0*mm, 0.5*fiberDiameter, //r1, r2
160        0.5*fiberLength,   //half-length 
161        0., twopi);      //theta1, theta2
162        
163   lvol_fiber = new G4LogicalVolume(svol_fiber,    //solid
164                                    fiberMat,    //material
165                                    "fiber");    //name
166            
167   // layer
168   //
169   G4double sizeX = layerThickness;
170   G4double sizeY = distanceInterFibers*nbOfFibers;
171   G4double sizeZ = fiberLength;
172   
173   G4Box*      
174   svol_layer = new G4Box("layer",     //name
175                   0.5*sizeX, 0.5*sizeY, 0.5*sizeZ); //size
176 
177 
178   lvol_layer = new G4LogicalVolume(svol_layer,    //solid
179                                    absorberMat,   //material
180                                    "layer");    //name
181 
182   // put fibers within layer
183   //
184   G4double Xcenter = 0.;
185   G4double Ycenter = -0.5*(sizeY + distanceInterFibers);
186   
187   for (G4int k=0; k<nbOfFibers; k++) {
188     Ycenter += distanceInterFibers;
189     new G4PVPlacement(0,          //no rotation
190             G4ThreeVector(Xcenter,Ycenter,0.),    //position
191                       lvol_fiber,             //logical volume  
192                       "fiber",          //name
193                       lvol_layer,           //mother
194                       false,                //no boulean operat
195                       k+1);                   //copy number
196 
197   }
198            
199   // modules
200   //
201   moduleThickness = layerThickness*nbOfLayers + milledLayer;       
202   sizeX = moduleThickness;
203   sizeY = fiberLength;
204   sizeZ = fiberLength;
205   
206   G4Box*      
207   svol_module = new G4Box("module",     //name
208                   0.5*sizeX, 0.5*sizeY, 0.5*sizeZ); //size
209 
210   lvol_module = new G4LogicalVolume(svol_module,  //solid
211                                    absorberMat,   //material
212                                    "module");   //name
213 
214   // put layers within module
215   //
216   Xcenter = -0.5*(nbOfLayers+1)*layerThickness;
217   Ycenter =  0.25*distanceInterFibers;
218   
219   for (G4int k=0; k<nbOfLayers; k++) {
220     Xcenter += layerThickness;
221     Ycenter  = - Ycenter;
222     new G4PVPlacement(0,          //no rotation
223             G4ThreeVector(Xcenter,Ycenter,0.),    //position
224                       lvol_layer,             //logical volume  
225                       "layer",          //name
226                       lvol_module,            //mother
227                       false,                //no boulean operat
228                       k+1);                   //copy number
229 
230   }                    
231 
232   // calorimeter
233   //
234   calorThickness = moduleThickness*nbOfModules;
235   sizeX = calorThickness;
236   sizeY = fiberLength;
237   sizeZ = fiberLength;
238   
239   G4Box*      
240   svol_calorimeter = new G4Box("calorimeter",   //name
241                   0.5*sizeX, 0.5*sizeY, 0.5*sizeZ); //size
242 
243 
244   lvol_calorimeter = new G4LogicalVolume(svol_calorimeter,  //solid
245                                    calorimeterMat,    //material
246                                    "calorimeter");    //name  
247 
248   // put modules inside calorimeter
249   //  
250   Xcenter = -0.5*(calorThickness + moduleThickness);
251   
252 
253   for (G4int k=0; k<nbOfModules; k++) {
254     Xcenter += moduleThickness;     
255     G4RotationMatrix rotm;                    //rotation matrix to place modules    
256     if ((k+1)%2 == 0) rotm.rotateX(90*deg);
257   G4Transform3D transform(rotm, G4ThreeVector(Xcenter,0.,0.));    
258     new G4PVPlacement(transform,          //rotation+position
259                       lvol_module,          //logical volume  
260                       "module",             //name
261                       lvol_calorimeter,         //mother
262                       false,                //no boulean operat
263                       k+1);                   //copy number
264   }
265 
266   // world
267   //
268   sizeX = 1.2*calorThickness;
269   sizeY = 1.2*fiberLength;
270   sizeZ = 1.2*fiberLength;
271   
272   worldSizeX = sizeX;
273   
274   G4Box*      
275   svol_world = new G4Box("world",     //name
276                   0.5*sizeX, 0.5*sizeY, 0.5*sizeZ); //size
277 
278   lvol_world = new G4LogicalVolume(svol_world,    //solid
279                                    worldMat,    //material
280                                    "world");    //name 
281             
282   pvol_world = new G4PVPlacement(0,     //no rotation
283            G4ThreeVector(), //at (0,0,0)
284                                  lvol_world,    //logical volume
285                                  "world",   //name
286                                  0,     //mother  volume
287                                  false,     //no boolean operation
288                                  0);      //copy number
289 
290   //put calorimeter in world
291   //  
292   new G4PVPlacement(0,        //no rotation
293                     G4ThreeVector(),    //at (0,0,0)
294                     lvol_calorimeter,   //logical volume
295                     "calorimeter",    //name
296                     lvol_world,     //mother  volume
297                     false,      //no boolean operation
298                     0);       //copy number
299                  
300   PrintCalorParameters();
301   
302   // Visualization attributes
303   //
304   lvol_fiber->SetVisAttributes (G4VisAttributes::GetInvisible());  
305   lvol_layer->SetVisAttributes (G4VisAttributes::GetInvisible());
306   lvol_world->SetVisAttributes (G4VisAttributes::GetInvisible());
307     
308   //always return the physical World
309   //
310   return pvol_world;
311 }
312 
313 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
314 
315 #include "G4UnitsTable.hh"
316 
317 void DetectorConstruction::PrintCalorParameters()
318 {
319   G4cout << "\n-------------------------------------------------------------"
320      << "\n ---> The calorimeter is " << nbOfModules << " Modules"
321      << "\n ---> A Module is " << nbOfLayers << " Layers + 1 milled Layer";
322      
323   G4cout  
324      << "\n ---> A Layer is " << G4BestUnit(layerThickness,"Length")  
325      << " thickness of " << absorberMat->GetName();    
326      
327   G4cout 
328      << "\n ---> A Layer includes " << nbOfFibers << " fibers of " 
329      << fiberMat->GetName();
330      
331   G4cout 
332      << "\n      ---> diameter : " << G4BestUnit(fiberDiameter,"Length")
333      << "\n      ---> length   : " << G4BestUnit(fiberLength,"Length")
334      << "\n      ---> distance : " << G4BestUnit(distanceInterFibers,"Length");
335      
336   G4cout  
337      << "\n ---> The milled Layer is " << G4BestUnit(milledLayer,"Length")  
338      << " thickness of " << absorberMat->GetName();
339      
340   G4cout 
341    << "\n\n ---> Module thickness " << G4BestUnit(moduleThickness,"Length");
342   
343   G4cout 
344    << "\n\n ---> Total calor thickness " << G4BestUnit(calorThickness,"Length")
345    <<   "\n      Tranverse size        " << G4BestUnit(fiberLength,"Length");
346 
347   G4cout << "\n-------------------------------------------------------------\n";
348   G4cout << G4endl;
349 }
350 
351 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
352 
353 #include "G4GlobalMagFieldMessenger.hh"
354 #include "G4AutoDelete.hh"
355 
356 void DetectorConstruction::ConstructSDandField()
357 {
358     if ( fFieldMessenger.Get() == 0 ) {
359         // Create global magnetic field messenger.
360         // Uniform magnetic field is then created automatically if
361         // the field value is not zero.
362         G4ThreeVector fieldValue = G4ThreeVector();
363         G4GlobalMagFieldMessenger* msg =
364         new G4GlobalMagFieldMessenger(fieldValue);
365         //msg->SetVerboseLevel(1);
366         G4AutoDelete::Register(msg);
367         fFieldMessenger.Put( msg );
368         
369     }
370 }
371 
372 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
373