62{
63 G4bool checkOverlaps = true;
64
65 G4double
a, z, density;
66 G4int nelements;
67
68
69 auto N =
new G4Element(
"Nitrogen",
"N", z = 7,
a = 14.01 * g / mole);
70 auto O =
new G4Element(
"Oxygen",
"O", z = 8,
a = 16.00 * g / mole);
71 auto air =
new G4Material(
"Air", density = 1.29 * mg / cm3, nelements = 2);
72 air->AddElement(N, 70. * perCent);
73 air->AddElement(O, 30. * perCent);
74
75
76 auto H =
new G4Element(
"Hydrogen",
"H", z = 1,
a = 1.01 * g / mole);
77 auto water =
new G4Material(
"Water", density = 1.0 * g / cm3, nelements = 2);
78 water->AddElement(H, 2);
79 water->AddElement(O, 1);
80
81
82
83 std::vector<G4double> photonEnergy = {
84 2.034 * eV, 2.068 * eV, 2.103 * eV, 2.139 * eV, 2.177 * eV, 2.216 * eV,
85 2.256 * eV, 2.298 * eV, 2.341 * eV, 2.386 * eV, 2.433 * eV, 2.481 * eV,
86 2.532 * eV, 2.585 * eV, 2.640 * eV, 2.697 * eV, 2.757 * eV, 2.820 * eV,
87 2.885 * eV, 2.954 * eV, 3.026 * eV, 3.102 * eV, 3.181 * eV, 3.265 * eV,
88 3.353 * eV, 3.446 * eV, 3.545 * eV, 3.649 * eV, 3.760 * eV, 3.877 * eV,
89 4.002 * eV, 4.136 * eV
90 };
91
92
93 std::vector<G4double> refractiveIndex1 = {
94 1.3435, 1.344, 1.3445, 1.345, 1.3455, 1.346, 1.3465, 1.347,
95 1.3475, 1.348, 1.3485, 1.3492, 1.35, 1.3505, 1.351, 1.3518,
96 1.3522, 1.3530, 1.3535, 1.354, 1.3545, 1.355, 1.3555, 1.356,
97 1.3568, 1.3572, 1.358, 1.3585, 1.359, 1.3595, 1.36, 1.3608
98 };
99 std::vector<G4double> absorption = {
100 3.448 * m, 4.082 * m, 6.329 * m, 9.174 * m, 12.346 * m, 13.889 * m,
101 15.152 * m, 17.241 * m, 18.868 * m, 20.000 * m, 26.316 * m, 35.714 * m,
102 45.455 * m, 47.619 * m, 52.632 * m, 52.632 * m, 55.556 * m, 52.632 * m,
103 52.632 * m, 47.619 * m, 45.455 * m, 41.667 * m, 37.037 * m, 33.333 * m,
104 30.000 * m, 28.500 * m, 27.000 * m, 24.500 * m, 22.000 * m, 19.500 * m,
105 17.500 * m, 14.500 * m
106 };
107
108
109
110 G4double scintilFastArray[]{ 1.0, 1.0 };
111 G4double energyArray[]{ 2.034 * eV, 4.136 * eV };
112 G4int lenArray = 2;
113
114 std::vector<G4double> scintilSlow = {
115 0.01, 1.00, 2.00, 3.00, 4.00, 5.00, 6.00, 7.00, 8.00, 9.00, 8.00,
116 7.00, 6.00, 4.00, 3.00, 2.00, 1.00, 0.01, 1.00, 2.00, 3.00, 4.00,
117 5.00, 6.00, 7.00, 8.00, 9.00, 8.00, 7.00, 6.00, 5.00, 4.00
118 };
119
121
122
123
124
125
126
127 G4int numEntries = 1;
128 myMPT1->AddProperty("RINDEX", &photonEnergy[0], &refractiveIndex1[0],
129 numEntries);
130
131 for(size_t i = 1; i < photonEnergy.size(); ++i)
132 {
133 myMPT1->AddEntry("RINDEX", photonEnergy[i], refractiveIndex1[i]);
134 }
135
136
137 if(myMPT1->GetProperty("RINDEX")->GetVectorLength() !=
138 myMPT1->GetProperty("GROUPVEL")->GetVectorLength())
139 {
140 G4ExceptionDescription ed;
141 ed << "Error calculating group velocities. Incorrect number of entries "
142 "in group velocity material property vector.";
143 G4Exception("OpNovice::OpNoviceDetectorConstruction", "OpNovice001",
144 FatalException, ed);
145 }
146
147
148
149 myMPT1->AddProperty("ABSLENGTH", photonEnergy, absorption, false, true);
150
151
152
153
154 myMPT1->AddProperty("SCINTILLATIONCOMPONENT1", energyArray, scintilFastArray,
155 lenArray);
156
157 myMPT1->AddProperty("SCINTILLATIONCOMPONENT2", photonEnergy, scintilSlow,
158 false, true);
159 myMPT1->AddConstProperty("SCINTILLATIONYIELD", 50. / MeV);
160 myMPT1->AddConstProperty("RESOLUTIONSCALE", 1.0);
161 myMPT1->AddConstProperty("SCINTILLATIONTIMECONSTANT1", 1. * ns);
162 myMPT1->AddConstProperty("SCINTILLATIONTIMECONSTANT2", 10. * ns);
163 myMPT1->AddConstProperty("SCINTILLATIONYIELD1", 0.8);
164 myMPT1->AddConstProperty("SCINTILLATIONYIELD2", 0.2);
165 std::vector<G4double> energy_water = {
166 1.56962 * eV, 1.58974 * eV, 1.61039 * eV, 1.63157 * eV, 1.65333 * eV,
167 1.67567 * eV, 1.69863 * eV, 1.72222 * eV, 1.74647 * eV, 1.77142 * eV,
168 1.7971 * eV, 1.82352 * eV, 1.85074 * eV, 1.87878 * eV, 1.90769 * eV,
169 1.93749 * eV, 1.96825 * eV, 1.99999 * eV, 2.03278 * eV, 2.06666 * eV,
170 2.10169 * eV, 2.13793 * eV, 2.17543 * eV, 2.21428 * eV, 2.25454 * eV,
171 2.29629 * eV, 2.33962 * eV, 2.38461 * eV, 2.43137 * eV, 2.47999 * eV,
172 2.53061 * eV, 2.58333 * eV, 2.63829 * eV, 2.69565 * eV, 2.75555 * eV,
173 2.81817 * eV, 2.88371 * eV, 2.95237 * eV, 3.02438 * eV, 3.09999 * eV,
174 3.17948 * eV, 3.26315 * eV, 3.35134 * eV, 3.44444 * eV, 3.54285 * eV,
175 3.64705 * eV, 3.75757 * eV, 3.87499 * eV, 3.99999 * eV, 4.13332 * eV,
176 4.27585 * eV, 4.42856 * eV, 4.59258 * eV, 4.76922 * eV, 4.95999 * eV,
177 5.16665 * eV, 5.39129 * eV, 5.63635 * eV, 5.90475 * eV, 6.19998 * eV
178 };
179
180
181
182
183 std::vector<G4double> mie_water = {
184 167024.4 * m, 158726.7 * m, 150742 * m, 143062.5 * m, 135680.2 * m,
185 128587.4 * m, 121776.3 * m, 115239.5 * m, 108969.5 * m, 102958.8 * m,
186 97200.35 * m, 91686.86 * m, 86411.33 * m, 81366.79 * m, 76546.42 * m,
187 71943.46 * m, 67551.29 * m, 63363.36 * m, 59373.25 * m, 55574.61 * m,
188 51961.24 * m, 48527.00 * m, 45265.87 * m, 42171.94 * m, 39239.39 * m,
189 36462.50 * m, 33835.68 * m, 31353.41 * m, 29010.30 * m, 26801.03 * m,
190 24720.42 * m, 22763.36 * m, 20924.88 * m, 19200.07 * m, 17584.16 * m,
191 16072.45 * m, 14660.38 * m, 13343.46 * m, 12117.33 * m, 10977.70 * m,
192 9920.416 * m, 8941.407 * m, 8036.711 * m, 7202.470 * m, 6434.927 * m,
193 5730.429 * m, 5085.425 * m, 4496.467 * m, 3960.210 * m, 3473.413 * m,
194 3032.937 * m, 2635.746 * m, 2278.907 * m, 1959.588 * m, 1675.064 * m,
195 1422.710 * m, 1200.004 * m, 1004.528 * m, 833.9666 * m, 686.1063 * m
196 };
197
198
199 G4double mie_water_const[3] = { 0.99, 0.99, 0.8 };
200
201 myMPT1->AddProperty("MIEHG", energy_water, mie_water, false, true);
202 myMPT1->AddConstProperty("MIEHG_FORWARD", mie_water_const[0]);
203 myMPT1->AddConstProperty("MIEHG_BACKWARD", mie_water_const[1]);
204 myMPT1->AddConstProperty("MIEHG_FORWARD_RATIO", mie_water_const[2]);
205
206 G4cout << "Water G4MaterialPropertiesTable:" << G4endl;
207 myMPT1->DumpTable();
208
209 water->SetMaterialPropertiesTable(myMPT1);
210
211
212 water->GetIonisation()->SetBirksConstant(0.126 * mm / MeV);
213
214
215 std::vector<G4double> refractiveIndex2 = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
216 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
217 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
218 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
219 1.0, 1.0, 1.0, 1.0 };
220
222 myMPT2->AddProperty("RINDEX", photonEnergy, refractiveIndex2);
223
224 G4cout << "Air G4MaterialPropertiesTable:" << G4endl;
225 myMPT2->DumpTable();
226
227 air->SetMaterialPropertiesTable(myMPT2);
228
229
230
231
235 nullptr, G4ThreeVector(), world_log, "world", nullptr, false, 0,
236 checkOverlaps);
237
238
242 nullptr, G4ThreeVector(), expHall_log, "expHall", world_log, false, 0);
243
244
246 auto waterTank_log =
new G4LogicalVolume(waterTank_box, water,
"Tank");
248 nullptr, G4ThreeVector(), waterTank_log, "Tank", expHall_log, false, 0);
249
250
252 auto bubbleAir_log =
new G4LogicalVolume(bubbleAir_box, air,
"Bubble");
253 new G4PVPlacement(
nullptr, G4ThreeVector(0, 2.5 * m, 0), bubbleAir_log,
254 "Bubble", waterTank_log, false, 0);
255
256
257
258
260 opWaterSurface->SetType(dielectric_LUTDAVIS);
261 opWaterSurface->SetFinish(Rough_LUT);
262 opWaterSurface->SetModel(DAVIS);
263
265 "WaterSurface", waterTank_phys, expHall_phys, opWaterSurface);
266
268 waterSurface->GetSurface(waterTank_phys, expHall_phys)
269 ->GetSurfaceProperty());
270 if(opticalSurface)
271 opticalSurface->DumpInfo();
272
273
275 opAirSurface->SetType(dielectric_dielectric);
276 opAirSurface->SetFinish(polished);
277 opAirSurface->SetModel(glisur);
278
279 auto airSurface =
281
283 airSurface->GetSurface(bubbleAir_log)->GetSurfaceProperty());
284 if(opticalSurface)
285 opticalSurface->DumpInfo();
286
287
288
289 std::vector<G4double> ephoton = { 2.034 * eV, 4.136 * eV };
290
291
292 std::vector<G4double> reflectivity = { 0.3, 0.5 };
293 std::vector<G4double> efficiency = { 0.8, 1.0 };
294
296
297 myST2->AddProperty("REFLECTIVITY", ephoton, reflectivity);
298 myST2->AddProperty("EFFICIENCY", ephoton, efficiency);
300 {
301 G4cout << "Air Surface G4MaterialPropertiesTable:" << G4endl;
302 myST2->DumpTable();
303 }
304 opAirSurface->SetMaterialPropertiesTable(myST2);
305
307 {
310 }
311
312
313
315 if(myMPT1->GetProperty("USERDEFINED") != nullptr)
316 {
317 ed = "USERDEFINED != nullptr";
319 }
320 myMPT1->AddProperty("USERDEFINED", energy_water, mie_water, true, true);
321 if(myMPT1->GetProperty("USERDEFINED") == nullptr)
322 {
323 ed = "USERDEFINED == nullptr";
325 }
326 [[maybe_unused]] G4int index_userdefined = -1;
327 if(myMPT1->GetProperty("USERDEFINED") != nullptr)
328 {
329 index_userdefined = myMPT1->GetPropertyIndex("USERDEFINED");
330 }
331 if(!(index_userdefined >= 0 &&
332 index_userdefined <
333 (G4int) myMPT1->GetMaterialPropertyNames().size()))
334 {
335 ed = "USERDEFINED index out of range";
337 }
338 myMPT1->RemoveProperty("USERDEFINED");
339 if(myMPT1->GetProperty("USERDEFINED") != nullptr)
340 {
341 ed = "USERDEFINED != nullptr at end";
343 }
344
345 if(myMPT1->ConstPropertyExists("USERDEFINEDCONST") == true)
346 {
347 ed = "ConstProperty USERDEFINEDCONST already exists.";
349 }
350 myMPT1->AddConstProperty("USERDEFINEDCONST", 3.14, true);
351 if(myMPT1->ConstPropertyExists("USERDEFINEDCONST") == false)
352 {
353 ed = "ConstProperty USERDEFINEDCONST doesn't exist.";
355 }
356 [[maybe_unused]] G4int index_pi = -1;
357 if(myMPT1->ConstPropertyExists("USERDEFINEDCONST") == true)
358 {
359 index_pi = myMPT1->GetConstPropertyIndex("USERDEFINEDCONST");
360 }
361 if (!(index_pi >= 0 &&
362 index_pi < (G4int) myMPT1->GetMaterialConstPropertyNames().size()))
363 {
364 ed = "ConstProperty USERDEFINEDCONST index out of range.";
366 }
367 myMPT1->RemoveConstProperty("USERDEFINEDCONST");
368 if (myMPT1->ConstPropertyExists("USERDEFINEDCONST") == true)
369 {
370 ed = "ConstProperty USERDEFINEDCONST still exists.";
372 }
373
374
375
376 return world_phys;
377}
std::vector< ExP01TrackerHit * > a
G4String fDumpGdmlFileName
void PrintError(G4String)