source: trunk/examples/novice/N06/src/ExN06DetectorConstruction.cc@ 1036

Last change on this file since 1036 was 807, checked in by garnier, 17 years ago

update

File size: 10.0 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: ExN06DetectorConstruction.cc,v 1.15 2006/06/29 17:54:17 gunter Exp $
28// GEANT4 tag $Name: $
29//
30//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
31//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
32
33#include "ExN06DetectorConstruction.hh"
34
35#include "G4Material.hh"
36#include "G4MaterialTable.hh"
37#include "G4Element.hh"
38#include "G4ElementTable.hh"
39#include "G4LogicalBorderSurface.hh"
40#include "G4LogicalSkinSurface.hh"
41#include "G4Box.hh"
42#include "G4LogicalVolume.hh"
43#include "G4RotationMatrix.hh"
44#include "G4ThreeVector.hh"
45#include "G4Transform3D.hh"
46#include "G4PVPlacement.hh"
47#include "G4OpBoundaryProcess.hh"
48
49//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
50
51ExN06DetectorConstruction::ExN06DetectorConstruction()
52{
53 expHall_x = expHall_y = expHall_z = 10*m;
54 tank_x = tank_y = tank_z = 5*m;
55 bubble_x = bubble_y = bubble_z = 0.5*m;
56}
57
58//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
59
60ExN06DetectorConstruction::~ExN06DetectorConstruction(){;}
61
62//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
63
64G4VPhysicalVolume* ExN06DetectorConstruction::Construct()
65{
66
67// ------------- Materials -------------
68
69 G4double a, z, density;
70 G4int nelements;
71
72// Air
73//
74 G4Element* N = new G4Element("Nitrogen", "N", z=7 , a=14.01*g/mole);
75 G4Element* O = new G4Element("Oxygen" , "O", z=8 , a=16.00*g/mole);
76
77 G4Material* Air = new G4Material("Air", density=1.29*mg/cm3, nelements=2);
78 Air->AddElement(N, 70.*perCent);
79 Air->AddElement(O, 30.*perCent);
80
81// Water
82//
83 G4Element* H = new G4Element("Hydrogen", "H", z=1 , a=1.01*g/mole);
84
85 G4Material* Water = new G4Material("Water", density= 1.0*g/cm3, nelements=2);
86 Water->AddElement(H, 2);
87 Water->AddElement(O, 1);
88
89//
90// ------------ Generate & Add Material Properties Table ------------
91//
92 const G4int nEntries = 32;
93
94 G4double PhotonEnergy[nEntries] =
95 { 2.034*eV, 2.068*eV, 2.103*eV, 2.139*eV,
96 2.177*eV, 2.216*eV, 2.256*eV, 2.298*eV,
97 2.341*eV, 2.386*eV, 2.433*eV, 2.481*eV,
98 2.532*eV, 2.585*eV, 2.640*eV, 2.697*eV,
99 2.757*eV, 2.820*eV, 2.885*eV, 2.954*eV,
100 3.026*eV, 3.102*eV, 3.181*eV, 3.265*eV,
101 3.353*eV, 3.446*eV, 3.545*eV, 3.649*eV,
102 3.760*eV, 3.877*eV, 4.002*eV, 4.136*eV };
103//
104// Water
105//
106 G4double RefractiveIndex1[nEntries] =
107 { 1.3435, 1.344, 1.3445, 1.345, 1.3455,
108 1.346, 1.3465, 1.347, 1.3475, 1.348,
109 1.3485, 1.3492, 1.35, 1.3505, 1.351,
110 1.3518, 1.3522, 1.3530, 1.3535, 1.354,
111 1.3545, 1.355, 1.3555, 1.356, 1.3568,
112 1.3572, 1.358, 1.3585, 1.359, 1.3595,
113 1.36, 1.3608};
114
115 G4double Absorption1[nEntries] =
116 {3.448*m, 4.082*m, 6.329*m, 9.174*m, 12.346*m, 13.889*m,
117 15.152*m, 17.241*m, 18.868*m, 20.000*m, 26.316*m, 35.714*m,
118 45.455*m, 47.619*m, 52.632*m, 52.632*m, 55.556*m, 52.632*m,
119 52.632*m, 47.619*m, 45.455*m, 41.667*m, 37.037*m, 33.333*m,
120 30.000*m, 28.500*m, 27.000*m, 24.500*m, 22.000*m, 19.500*m,
121 17.500*m, 14.500*m };
122
123 G4double ScintilFast[nEntries] =
124 { 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
125 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
126 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
127 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
128 1.00, 1.00, 1.00, 1.00 };
129 G4double ScintilSlow[nEntries] =
130 { 0.01, 1.00, 2.00, 3.00, 4.00, 5.00, 6.00,
131 7.00, 8.00, 9.00, 8.00, 7.00, 6.00, 4.00,
132 3.00, 2.00, 1.00, 0.01, 1.00, 2.00, 3.00,
133 4.00, 5.00, 6.00, 7.00, 8.00, 9.00, 8.00,
134 7.00, 6.00, 5.00, 4.00 };
135
136 G4MaterialPropertiesTable* myMPT1 = new G4MaterialPropertiesTable();
137 myMPT1->AddProperty("RINDEX", PhotonEnergy, RefractiveIndex1,nEntries);
138 myMPT1->AddProperty("ABSLENGTH", PhotonEnergy, Absorption1, nEntries);
139 myMPT1->AddProperty("FASTCOMPONENT",PhotonEnergy, ScintilFast, nEntries);
140 myMPT1->AddProperty("SLOWCOMPONENT",PhotonEnergy, ScintilSlow, nEntries);
141
142 myMPT1->AddConstProperty("SCINTILLATIONYIELD",50./MeV);
143 myMPT1->AddConstProperty("RESOLUTIONSCALE",1.0);
144 myMPT1->AddConstProperty("FASTTIMECONSTANT", 1.*ns);
145 myMPT1->AddConstProperty("SLOWTIMECONSTANT",10.*ns);
146 myMPT1->AddConstProperty("YIELDRATIO",0.8);
147
148 Water->SetMaterialPropertiesTable(myMPT1);
149
150//
151// Air
152//
153 G4double RefractiveIndex2[nEntries] =
154 { 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
155 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
156 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
157 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
158 1.00, 1.00, 1.00, 1.00 };
159
160 G4MaterialPropertiesTable* myMPT2 = new G4MaterialPropertiesTable();
161 myMPT2->AddProperty("RINDEX", PhotonEnergy, RefractiveIndex2, nEntries);
162
163 Air->SetMaterialPropertiesTable(myMPT2);
164
165//
166// ------------- Volumes --------------
167
168// The experimental Hall
169//
170 G4Box* expHall_box = new G4Box("World",expHall_x,expHall_y,expHall_z);
171
172 G4LogicalVolume* expHall_log
173 = new G4LogicalVolume(expHall_box,Air,"World",0,0,0);
174
175 G4VPhysicalVolume* expHall_phys
176 = new G4PVPlacement(0,G4ThreeVector(),expHall_log,"World",0,false,0);
177
178// The Water Tank
179//
180 G4Box* waterTank_box = new G4Box("Tank",tank_x,tank_y,tank_z);
181
182 G4LogicalVolume* waterTank_log
183 = new G4LogicalVolume(waterTank_box,Water,"Tank",0,0,0);
184
185 G4VPhysicalVolume* waterTank_phys
186 = new G4PVPlacement(0,G4ThreeVector(),waterTank_log,"Tank",
187 expHall_log,false,0);
188
189// The Air Bubble
190//
191 G4Box* bubbleAir_box = new G4Box("Bubble",bubble_x,bubble_y,bubble_z);
192
193 G4LogicalVolume* bubbleAir_log
194 = new G4LogicalVolume(bubbleAir_box,Air,"Bubble",0,0,0);
195
196//G4VPhysicalVolume* bubbleAir_phys =
197 new G4PVPlacement(0,G4ThreeVector(0,2.5*m,0),bubbleAir_log,"Bubble",
198 waterTank_log,false,0);
199
200// ------------- Surfaces --------------
201//
202// Water Tank
203//
204 G4OpticalSurface* OpWaterSurface = new G4OpticalSurface("WaterSurface");
205 OpWaterSurface->SetType(dielectric_dielectric);
206 OpWaterSurface->SetFinish(ground);
207 OpWaterSurface->SetModel(unified);
208
209 G4LogicalBorderSurface* WaterSurface =
210 new G4LogicalBorderSurface("WaterSurface",
211 waterTank_phys,expHall_phys,OpWaterSurface);
212
213 if(WaterSurface->GetVolume1() == waterTank_phys) G4cout << "Equal" << G4endl;
214 if(WaterSurface->GetVolume2() == expHall_phys ) G4cout << "Equal" << G4endl;
215
216// Air Bubble
217//
218 G4OpticalSurface* OpAirSurface = new G4OpticalSurface("AirSurface");
219 OpAirSurface->SetType(dielectric_dielectric);
220 OpAirSurface->SetFinish(polished);
221 OpAirSurface->SetModel(glisur);
222
223 G4LogicalSkinSurface* AirSurface =
224 new G4LogicalSkinSurface("AirSurface", bubbleAir_log, OpAirSurface);
225
226 if(AirSurface->GetLogicalVolume() == bubbleAir_log) G4cout << "Equal" << G4endl;
227 ((G4OpticalSurface*)
228 (AirSurface->GetSurface(bubbleAir_log)->GetSurfaceProperty()))->DumpInfo();
229
230//
231// Generate & Add Material Properties Table attached to the optical surfaces
232//
233 const G4int num = 2;
234 G4double Ephoton[num] = {2.038*eV, 4.144*eV};
235
236 //OpticalWaterSurface
237 G4double RefractiveIndex[num] = {1.35, 1.40};
238 G4double SpecularLobe[num] = {0.3, 0.3};
239 G4double SpecularSpike[num] = {0.2, 0.2};
240 G4double Backscatter[num] = {0.2, 0.2};
241
242 G4MaterialPropertiesTable* myST1 = new G4MaterialPropertiesTable();
243
244 myST1->AddProperty("RINDEX", Ephoton, RefractiveIndex, num);
245 myST1->AddProperty("SPECULARLOBECONSTANT", Ephoton, SpecularLobe, num);
246 myST1->AddProperty("SPECULARSPIKECONSTANT", Ephoton, SpecularSpike, num);
247 myST1->AddProperty("BACKSCATTERCONSTANT", Ephoton, Backscatter, num);
248
249 OpWaterSurface->SetMaterialPropertiesTable(myST1);
250
251 //OpticalAirSurface
252 G4double Reflectivity[num] = {0.3, 0.5};
253 G4double Efficiency[num] = {0.8, 1.0};
254
255 G4MaterialPropertiesTable *myST2 = new G4MaterialPropertiesTable();
256
257 myST2->AddProperty("REFLECTIVITY", Ephoton, Reflectivity, num);
258 myST2->AddProperty("EFFICIENCY", Ephoton, Efficiency, num);
259
260 OpAirSurface->SetMaterialPropertiesTable(myST2);
261
262//always return the physical World
263 return expHall_phys;
264}
265
266//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
Note: See TracBrowser for help on using the repository browser.