source: trunk/examples/advanced/raredecay_calorimetry/src/PhotInDetectorConstruction.cc @ 1187

Last change on this file since 1187 was 807, checked in by garnier, 16 years ago

update

File size: 15.6 KB
Line 
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// $Id: PhotInDetectorConstruction.cc,v 1.5 2006/06/29 16:25:09 gunter Exp $
28// GEANT4 tag $Name:  $
29//
30// ***************************************************************************
31
32//#define debug
33
34#include "PhotInDetectorConstruction.hh"
35
36// all BODY variables must be initialized in this constructor
37PhotInDetectorConstruction::PhotInDetectorConstruction(G4double x,G4double y,G4double z):
38 numberOfLayers(PhotInNOfLayers),numberOfSlabs(PhotInNOfSlabs),
39 samplingFraction(PhotInSampFract),xHD(x),yHD(y),zHD(z),serial(false),
40 worldMaterial(0),absorberMaterial(0),gapMaterial(0),layerSolid(0),slabSolid(0)
41{
42#ifdef debug
43  G4cout<<"PhotInDetectorConstruction::Constructor is called"<<G4endl;
44#endif
45  layerParam = new PhotInLayerParameterisation;    // should it be deleted in Distructor?MK
46  layerParam->SetNumberOfLayers(numberOfLayers);   // 9 by default (can be changed)
47  layerParam->SetHalfTotalThickness(zHD);          // transfer totalThickness of theSection
48  G4double hlth=zHD/numberOfLayers;                // Calculate thickness of one layer
49  gapParam = new PhotInGapParameterisation;        // should it be deleted in Distructor?MK
50  gapParam->SetNumberOfSlabs(numberOfSlabs);       // 9 by default (can be changed)
51  gapParam->SetHalfTotalWidth(yHD);                // Transfer
52  gapParam->SetHalfTotalLayerThickness(hlth);      // Transfer
53  gapParam->SetSamplingFraction(samplingFraction); // Transfer
54  PhotInCalorimeterSD::SetNumberOfLayers(numberOfLayers);// Construction of sensitiveLayers
55  PhotInCalorimeterSD::SetNumberOfSlabs(numberOfSlabs);  // Construction of sensitiveSlabs
56  DefineMaterials();                               // Material factory
57
58  for(G4int i=0; i<PhotInNumSections ;i++)
59  {
60    calorLogical[i]=0;
61    layerLogical[i]=0;
62    slabLogical[i]=0;
63    calorPhysical[i]=0;
64    layerPhysical[i]=0;
65    slabPhysical[i]=0;
66  }
67}
68
69PhotInDetectorConstruction::~PhotInDetectorConstruction()
70{
71  //delete gapParam;           // Try to open later to be sure that it is not delited by G4
72  //delete layerParam;         // Try to open later to be sure that it is not delited by G4
73}
74
75void PhotInDetectorConstruction::DefineMaterials() // Material factory (@@ can be in Const)
76{ 
77  G4String name, symbol;             // a = mean_atomic_mass, z = mean_number_of_protons
78  G4double a, z, density;            //iz=number of protons  in an isotope;
79  G4int iz, in;                      //in=number of nucleons in an isotope;
80                                   
81  G4int ncomponents, natoms;
82  G4double abundance, fractionmass;
83  G4double temperature, pressure;
84  //
85  // define Elements
86  //
87  G4Element* H  = new G4Element(name="Hydrogen",symbol="H" , z= 1., a=1.01*g/mole);
88  G4Element* C  = new G4Element(name="Carbon"  ,symbol="C" , z= 6., a=12.01*g/mole);
89  G4Element* N  = new G4Element(name="Nitrogen",symbol="N" , z= 7., a=14.01*g/mole);
90  G4Element* O  = new G4Element(name="Oxygen"  ,symbol="O" , z= 8., a=16.00*g/mole);
91  //
92  // define an Element from isotopes, by relative abundance
93  //
94  G4Isotope* U5 = new G4Isotope(name="U235", iz=92, in=235, a=235.01*g/mole); // @@ Corr.
95  G4Isotope* U8 = new G4Isotope(name="U238", iz=92, in=238, a=238.03*g/mole); // @@ Corr.
96
97  G4Element* U  = new G4Element(name="enriched Uranium", symbol="U", ncomponents=2);
98  U->AddIsotope(U5, abundance= 90.*perCent);
99  U->AddIsotope(U8, abundance= 10.*perCent);
100  //
101  // define simple materials
102  //
103  G4Material* Al = new G4Material(name="Aluminium",z=13.,a=26.98*g/mole,density=2.7*g/cm3);
104
105  //density = 1.390*g/cm3;
106  //a = 39.95*g/mole;
107  //G4Material* lAr = new G4Material(name="liquidArgon", z=18., a, density);
108
109  //density = 11.35*g/cm3;
110  //a = 207.19*g/mole;
111  //G4Material* Pb = new G4Material(name="Lead"     , z=82., a, density);
112  //
113  // define complex materials. case 1: chemical molecule
114  //
115  density = 1.000*g/cm3;
116  G4Material* H2O = new G4Material(name="Water", density, ncomponents=2);
117  H2O->AddElement(H, natoms=2);
118  H2O->AddElement(O, natoms=1);
119
120  density = 1.032*g/cm3;
121  G4Material* Sci = new G4Material(name="Scintillator", density, ncomponents=2);
122  Sci->AddElement(C, natoms=9);
123  Sci->AddElement(H, natoms=10);
124  //
125  // define complex material.   case 2: mixture by fractional mass
126  //
127  density = 1.290*mg/cm3;
128  G4Material* Air = new G4Material(name="Air"  , density, ncomponents=2);
129  Air->AddElement(N, fractionmass=0.7);
130  Air->AddElement(O, fractionmass=0.3);
131  //
132  // examples of vacuum
133  //
134  density     = universe_mean_density;
135  pressure    = 3.e-18*pascal;
136  temperature = 2.73*kelvin;
137  a=1.01*g/mole; // Kosmic
138                z=1.;          // Hydrogrn
139  G4Material* Vacuum=new G4Material(name="Vac",z,a,density,kStateGas,temperature,pressure);
140
141#ifdef debug
142  G4cout<<"PhotInDetectorConstruction::DefineMaterials:"<<*(G4Material::GetMaterialTable())
143        <<G4endl;
144#endif
145
146  //default materials of the calorimeter
147  worldMaterial    = Vacuum;
148  absorberMaterial = Al;
149  gapMaterial      = Sci;
150  layerParam->SetAbsorberMaterial(absorberMaterial);
151  gapParam->SetGapMaterial(gapMaterial);
152}
153
154G4VPhysicalVolume* PhotInDetectorConstruction::Construct()
155{
156  // Definition of Logical and Physical volumes
157  G4LogicalVolume*           worldLogical;     // One logical volume for the World
158  G4VPhysicalVolume*         worldPhysical;    // One Physical volume for the World
159
160  G4double shiftY=yHD+yHD;        // shift perpendicular to slabs
161  G4double shiftZ=zHD+zHD;        // shift perpendicular to layers
162  G4double wxHD=xHD+0.5*m;        // along slabs
163  G4double wyHD=shiftY+yHD+0.5*m; // perpendicular to slabs
164  G4double wzHD=shiftZ+zHD+0.5*m; // perpendicular to layers
165  //     
166  // World volume: Solid=BOX, make Logical, make Physical
167  // ====================================================
168  G4VSolid* worldSolid = new G4Box("World",wxHD,wyHD,wzHD);
169  worldLogical = new G4LogicalVolume(worldSolid,worldMaterial,"World");
170  worldPhysical = new G4PVPlacement(0,G4ThreeVector(),worldLogical,"World",0,false,0);
171  //                               
172  // Calorimeter Section: Solid=BOX, make 3 Logical and 3 serial/parallel Physical
173  // =============================================================================
174  G4VSolid* calorSolid = new G4Box("CalorSect",xHD,yHD,zHD);
175  G4int i; // If i is used many times it is btter to define it as external var. for LOOPs
176  for(i=0; i<PhotInNumSections; i++)
177  {
178    calorLogical[i] = new G4LogicalVolume(calorSolid,absorberMaterial,PhotInCalName[i]);
179    if(serial)                              // if true = one section after another (serial)
180      calorPhysical[i] = new G4PVPlacement(0, G4ThreeVector(0.,0.,(i-1)*shiftZ),
181                                    calorLogical[i],PhotInCalName[i],worldLogical,false,i);
182    else                                    // *DEFAULT* false = side by side (parallel)
183      calorPhysical[i] = new G4PVPlacement(0, G4ThreeVector(0.,G4double(i-1)*shiftY,0.),
184                                    calorLogical[i],PhotInCalName[i],worldLogical,false,i);
185  }
186  //                                 
187  // Layers & Slabs: Solid=BOX. First Active (samplFract thick div in slabs), then Absorber
188  //
189  G4double layerZ=zHD/numberOfLayers;     // Half thickness of one layer
190  G4double slabY=yHD/numberOfSlabs;       // Half width of one active slab
191  layerSolid = new G4Box("Layer",xHD,yHD,layerZ);
192  slabSolid = new G4Box("Gap",xHD,slabY,layerZ*samplingFraction);
193  for(i=0; i<PhotInNumSections; i++)                   // Construct layers for all sections
194  {
195    layerLogical[i] = new G4LogicalVolume(layerSolid,absorberMaterial,"Layer");
196    layerPhysical[i] = new G4PVParameterised("Layer", layerLogical[i], calorLogical[i],
197                                             kZAxis, numberOfLayers, layerParam);
198    slabLogical[i] = new G4LogicalVolume(slabSolid,gapMaterial,"Slab");
199    slabPhysical[i] = new G4PVParameterised("Slab", slabLogical[i], layerLogical[i],
200                                             kYAxis, numberOfSlabs, gapParam);
201  }
202  //
203  // Regions
204  //
205  for(i=0; i<PhotInNumSections; i++)
206  {
207    G4Region* aRegion = new G4Region(PhotInRegName[i]);
208    calorLogical[i]->SetRegion(aRegion);            // Mutual
209    aRegion->AddRootLogicalVolume(calorLogical[i]); // definition
210  }
211  //                               
212  // Sensitive Detectors: Absorber and Gap
213  //
214  G4SDManager* SDman = G4SDManager::GetSDMpointer(); // Manager of sensitive detectors
215  for(i=0; i<PhotInNumSections ;i++)
216  {
217    G4VSensitiveDetector* calorSD = new PhotInCalorimeterSD(PhotInDetName[i]); // Sections
218    SDman->AddNewDetector(calorSD); // all section is a sensitive detector
219    layerLogical[i]->SetSensitiveDetector(calorSD);// Make layers to be sensitive detectors
220    slabLogical[i]->SetSensitiveDetector(calorSD); // Make slabs to be sensitive detectors
221  }
222  //                                       
223  // Visualization attributes
224  //
225  worldLogical->SetVisAttributes(G4VisAttributes::Invisible);
226  G4VisAttributes* simpleBoxVisAtt= new G4VisAttributes(G4Colour(1.,1.,1.));
227  simpleBoxVisAtt->SetVisibility(true);
228  for(i=0;i<PhotInNumSections;i++)
229  { 
230    calorLogical[i]->SetVisAttributes(simpleBoxVisAtt);
231    layerLogical[i]->SetVisAttributes(simpleBoxVisAtt);
232    slabLogical[i]->SetVisAttributes(simpleBoxVisAtt);
233  }
234#ifdef debug
235  G4cout<<"PhotInDetectorConstruction::Construct:"<<G4endl;
236  PrintCalorParameters();
237#endif
238  return worldPhysical;
239}
240
241void PhotInDetectorConstruction::PrintCalorParameters() const
242{
243  G4cout << "----PhotInDetectorConstruction::PrintCalorParameters()-----" << G4endl;
244  if(serial) G4cout << " Calorimeters are placed in serial." << G4endl;
245  else       G4cout << " Calorimeters are placed in parallel." << G4endl;
246  G4cout << " Absorber is made of " << absorberMaterial->GetName() << G4endl;
247  G4cout << " Gap is made of " << gapMaterial->GetName() << G4endl;
248  G4cout << "--------------------------------------------------------" << G4endl;
249}
250
251void PhotInDetectorConstruction::SetAbsorberMaterial(G4String materialChoice)
252{
253#ifdef debug
254  G4cout<<"PhotInDetectorConstruction::SetAbsorberMaterial: "<<materialChoice<<G4endl;
255#endif
256  // search the material by its name   
257  G4Material* pttoMaterial = G4Material::GetMaterial(materialChoice);     
258  if(pttoMaterial)
259  {
260    absorberMaterial = pttoMaterial;
261    layerParam->SetAbsorberMaterial(pttoMaterial);
262    for(G4int i=0; i<PhotInNumSections; i++)
263    {
264      calorLogical[i]->SetMaterial(absorberMaterial);
265      layerLogical[i]->SetMaterial(absorberMaterial);
266    }
267  }
268  else G4cerr<<"PhotInDetectorConst::SetAbsM:"<<materialChoice<<" is not defined."<<G4endl;
269}
270
271void PhotInDetectorConstruction::SetGapMaterial(G4String materialChoice)
272{
273#ifdef debug
274  G4cout<<"PhotInDetectorConstruction::SetGapMaterial: "<<materialChoice<<G4endl;
275#endif
276  // search the material by its name
277  G4Material* pttoMaterial = G4Material::GetMaterial(materialChoice); 
278  if(pttoMaterial)
279  {
280    gapMaterial = pttoMaterial;
281    gapParam->SetGapMaterial(pttoMaterial);
282  }
283  else G4cerr<<"PhotInDetectorConst::SetGapM:"<<materialChoice<<" is not defined."<<G4endl;
284}
285
286void PhotInDetectorConstruction::SetSerialGeometry(G4bool ser)
287{
288#ifdef debug
289  G4cout<<"PhotInDetectorConstruction::SetSerialGeometry: "<<ser<<G4endl;
290#endif
291  if(serial==ser) return;         // Do nothing if serialization is the same
292  serial=ser;
293  G4double shiftZ=zHD+zHD;        // shift perpendicular to layers
294  G4double shiftY=yHD+yHD;        // shift perpendicular to slabs
295  for(G4int i=0; i<PhotInNumSections; i++)
296  {
297    if(serial) calorPhysical[i]->SetTranslation(G4ThreeVector(0.,0.,(i-1)*shiftZ));
298    else calorPhysical[i]->SetTranslation(G4ThreeVector(0.,(i-1)*shiftY,0.));
299  }
300  G4RunManager::GetRunManager()->GeometryHasBeenModified();
301}
302
303void PhotInDetectorConstruction::SetNumberOfLayers(G4int nl)
304{
305#ifdef debug
306  G4cout<<"PhotInDetectorConstruction::SetNumberOfLayers: "<<nl<<G4endl;
307#endif
308  numberOfLayers = nl;
309  layerSolid->SetZHalfLength(zHD/numberOfLayers);
310  layerParam->SetNumberOfLayers(nl);
311  for(G4int i=0; i<PhotInNumSections; i++)
312  { 
313    if(layerPhysical[i])
314    {
315      if(slabPhysical[i])
316      {
317        layerLogical[i]->RemoveDaughter(slabPhysical[i]);
318        delete slabPhysical[i];
319      }
320      calorLogical[i]->RemoveDaughter(layerPhysical[i]);
321      delete layerPhysical[i];
322    }
323    layerPhysical[i] =  new G4PVParameterised("Layer", layerLogical[i], calorLogical[i],
324                                              kZAxis , numberOfLayers , layerParam);
325    slabPhysical[i] =  new G4PVParameterised("Slab", slabLogical[i], layerLogical[i],
326                                              kYAxis , numberOfSlabs , gapParam);
327  }
328  PhotInCalorimeterSD::SetNumberOfLayers(nl);
329  G4RunManager::GetRunManager()->GeometryHasBeenModified();
330}
331
332void PhotInDetectorConstruction::SetNumberOfSlabs(G4int sn)
333{
334#ifdef debug
335  G4cout<<"PhotInDetectorConstruction::SetNumberOfSlabs: "<<sn<<G4endl;
336#endif
337  numberOfSlabs = sn;
338  slabSolid->SetZHalfLength(yHD/sn);
339  gapParam->SetNumberOfSlabs(sn);
340  for(G4int i=0; i<PhotInNumSections; i++)
341  { 
342    if(slabPhysical[i])
343    {
344      layerLogical[i]->RemoveDaughter(slabPhysical[i]);
345      delete slabPhysical[i];
346    }
347    slabPhysical[i] =  new G4PVParameterised("Slab", slabLogical[i], layerLogical[i],
348                                              kYAxis , numberOfSlabs , gapParam);
349  }
350  PhotInCalorimeterSD::SetNumberOfSlabs(sn);
351  G4RunManager::GetRunManager()->GeometryHasBeenModified();
352}
353
354void PhotInDetectorConstruction::CreateMaterial(G4String materialChoice)
355{
356#ifdef debug
357  G4cout<<"PhotInDetectorConstruction::CreateMaterial: "<<materialChoice<<G4endl;
358#endif
359  if(G4Material::GetMaterial(materialChoice) != 0) return;
360   
361  G4double a, z, density; 
362  // List of possible new materials (Material Factory)
363  if (materialChoice == "Silicon")
364    new G4Material("Silicon", z=14., a= 28.09*g/mole, density= 2.33*g/cm3);
365  else if  (materialChoice =="Iron")
366    new G4Material("Iron", z=26., a=55.85*g/mole, density=7.87*g/cm3);
367  else if  (materialChoice =="ArgonGas")
368    new G4Material("ArgonGas",z=18., a= 39.95*g/mole, density=1.782*mg/cm3);
369  else if  (materialChoice =="He")
370    new G4Material("He", z=2., a=4.0*g/mole, density=0.1786e-03*g/cm3);
371  else G4cerr<<"**PhotInDetectorConstruction::CreateMaterial: No "<<materialChoice<<G4endl;
372}
Note: See TracBrowser for help on using the repository browser.