Create detector geometry.
71 {
72
73 const double unitFactor = Unit::cm / Unit::mm;
74
75 const int N = 2;
76
77 double stepMax = 5.0 * Unit::mm * unitFactor;
78 int flag_limitStep = int(m_config.getParameter("LimitStepLength"));
79
80
81
82 map<string, FarBeamLineElement> elements;
83
84
85
86
87
88
89
90
91 FarBeamLineElement tubeR;
92
93
94 std::string prep = "TubeR.";
95
96 int TubeR_N = int(m_config.getParameter(prep + "N"));
97
98 std::vector<double> TubeR_Z(TubeR_N);
99 std::vector<double> TubeR_R(TubeR_N);
100 std::vector<double> TubeR_r(TubeR_N);
101
102 for (int i = 0; i < TubeR_N; ++i) {
103 ostringstream ossZID;
104 ossZID << "Z" << i;
105
106 ostringstream ossRID;
107 ossRID << "R" << i;
108
109 ostringstream ossrID;
110 ossrID << "r" << i;
111
112 TubeR_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
113 TubeR_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
114 TubeR_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
115 }
116
117 tubeR.transform = G4Translate3D(0.0, 0.0, 0.0);
118
119
120 tubeR.geo = new G4Polycone("geo_TubeR_name", 0.0, 2 * M_PI, TubeR_N, &(TubeR_Z[0]), &(TubeR_r[0]), &(TubeR_R[0]));
121
122 tubeR.logi = NULL;
123
124 elements["TubeR"] = tubeR;
125
126
127
128
129 FarBeamLineElement tubeL;
130
131
132 prep = "TubeL.";
133
134 int TubeL_N = int(m_config.getParameter(prep + "N"));
135
136 std::vector<double> TubeL_Z(TubeL_N);
137 std::vector<double> TubeL_R(TubeL_N);
138 std::vector<double> TubeL_r(TubeL_N);
139
140 for (int i = 0; i < TubeL_N; ++i) {
141 ostringstream ossZID;
142 ossZID << "Z" << i;
143
144 ostringstream ossRID;
145 ossRID << "R" << i;
146
147 ostringstream ossrID;
148 ossrID << "r" << i;
149
150 TubeL_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
151 TubeL_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
152 TubeL_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
153 }
154
155 tubeL.transform = G4Translate3D(0.0, 0.0, 0.0);
156
157
158 tubeL.geo = new G4Polycone("geo_TubeL_name", 0.0, 2 * M_PI, TubeL_N, &(TubeL_Z[0]), &(TubeL_r[0]), &(TubeL_R[0]));
159
160 tubeL.logi = NULL;
161
162 elements["TubeL"] = tubeL;
163
164 std::vector<double> zero_r(N, 0.);
165
166 std::vector<std::string> straightSections;
167 boost::split(straightSections, m_config.getParameterStr("Straight"), boost::is_any_of(" "));
168 for (const auto& name : straightSections) {
169
170
171
172 prep = name + ".";
173 string type = m_config.getParameterStr(prep + "type");
174
175
176 FarBeamLineElement polycone;
177
178 std::vector<double> Polycone_Z(N);
179 std::vector<double> Polycone_R(N);
180 std::vector<double> Polycone_r(N);
181 Polycone_Z[0] = 0;
182 Polycone_Z[1] = m_config.getParameter(prep + "L") * unitFactor;
183 Polycone_R[0] = m_config.getParameter(prep + "R") * unitFactor;
184 Polycone_R[1] = m_config.getParameter(prep + "R") * unitFactor;
185 Polycone_r[0] = m_config.getParameter(prep + "r") * unitFactor;
186 Polycone_r[1] = m_config.getParameter(prep + "r") * unitFactor;
187
188 double Polycone_X0 = m_config.getParameter(prep + "X0") * unitFactor;
189 double Polycone_Y0 = m_config.getParameter(prep + "Y0", 0) * unitFactor;
190 double Polycone_Z0 = m_config.getParameter(prep + "Z0") * unitFactor;
191 double Polycone_PHI = m_config.getParameter(prep + "PHI");
192 double Polycone_PHIYZ = m_config.getParameter(prep + "PHIYZ", 0);
193
194 polycone.transform = G4Translate3D(Polycone_X0, Polycone_Y0, Polycone_Z0);
195 polycone.transform = polycone.transform * G4RotateY3D(Polycone_PHI / Unit::rad);
196 if (Polycone_PHIYZ != 0)
197 polycone.transform = polycone.transform * G4RotateX3D(Polycone_PHIYZ / Unit::rad);
198
199
200 string subtract = m_config.getParameterStr(prep + "Subtract", "");
201 string intersect = m_config.getParameterStr(prep +
"Intersect",
"");
202
203 string geo_polyconexx_name = "geo_" + name + "xx_name";
204 string geo_polyconex_name = "geo_" + name + "x_name";
205 string geo_polycone_name = "geo_" + name + "_name";
206
207 G4VSolid* geo_polyconexx(NULL), *geo_polycone(NULL);
208
209 if (subtract != "" || intersect != "")
210 if (type == "pipe")
211 geo_polyconexx = new G4Polycone(geo_polyconexx_name, 0.0, 2 * M_PI, N, &(Polycone_Z[0]), &(zero_r[0]), &(Polycone_R[0]));
212 else
213 geo_polyconexx = new G4Polycone(geo_polyconexx_name, 0.0, 2 * M_PI, N, &(Polycone_Z[0]), &(Polycone_r[0]), &(Polycone_R[0]));
214 else if (type == "pipe")
215 geo_polycone = new G4Polycone(geo_polycone_name, 0.0, 2 * M_PI, N, &(Polycone_Z[0]), &(zero_r[0]), &(Polycone_R[0]));
216 else
217 geo_polycone = new G4Polycone(geo_polycone_name, 0.0, 2 * M_PI, N, &(Polycone_Z[0]), &(Polycone_r[0]), &(Polycone_R[0]));
218
219
220 if (subtract != "" && intersect != "") {
221 G4VSolid* geo_polyconex = new G4SubtractionSolid(geo_polyconex_name, geo_polyconexx, elements[subtract].geo,
222 polycone.transform.inverse()*elements[subtract].transform);
223 geo_polycone = new G4IntersectionSolid(geo_polycone_name, geo_polyconex, elements[intersect].geo,
224 polycone.transform.inverse()*elements[intersect].transform);
225 } else if (subtract != "")
226 geo_polycone = new G4SubtractionSolid(geo_polycone_name, geo_polyconexx, elements[subtract].geo,
227 polycone.transform.inverse()*elements[subtract].transform);
228 else if (intersect != "")
229 geo_polycone = new G4IntersectionSolid(geo_polycone_name, geo_polyconexx, elements[intersect].geo,
230 polycone.transform.inverse()*elements[intersect].transform);
231
232 polycone.geo = geo_polycone;
233
234
235 string strMat_polycone = m_config.getParameterStr(prep + "Material");
236 G4Material* mat_polycone = Materials::get(strMat_polycone);
237 string logi_polycone_name = "logi_" + name + "_name";
238 G4LogicalVolume* logi_polycone = new G4LogicalVolume(polycone.geo, mat_polycone, logi_polycone_name);
239 setColor(*logi_polycone,
"#CC0000");
241
242 polycone.logi = logi_polycone;
243
244
245 string phys_polycone_name = "phys_" + name + "_name";
246 new G4PVPlacement(polycone.transform, logi_polycone, phys_polycone_name, &topVolume, false, 0);
247
248 elements[name] = polycone;
249
250 double sum = 0.0;
251 for (int i = 0; i < N; ++i)
252 sum += Polycone_r[i];
253 if (type == "pipe" && sum != 0) {
254
255 FarBeamLineElement vacuum;
256
257 string nameVac = name + "Vac";
258
259
260 string geo_vacuumxx_name = "geo_" + nameVac + "xx_name";
261 string geo_vacuum_name = "geo_" + nameVac + "_name";
262
263 G4VSolid* geo_vacuumxx, *geo_vacuum;
264
265 geo_vacuumxx = new G4Polycone(geo_vacuumxx_name, 0.0, 2 * M_PI, N, &(Polycone_Z[0]), &(zero_r[0]), &(Polycone_r[0]));
266 geo_vacuum = new G4IntersectionSolid(geo_vacuumxx_name, geo_vacuumxx, geo_polycone);
267
268 vacuum.geo = geo_vacuum;
269 vacuum.transform = polycone.transform;
270
271
272 G4Material* mat_vacuum = Materials::get("Vacuum");
273 string logi_vacuum_name = "logi_" + nameVac + "_name";
274 G4LogicalVolume* logi_vacuum = new G4LogicalVolume(vacuum.geo, mat_vacuum, logi_vacuum_name);
275 if (flag_limitStep) logi_vacuum->SetUserLimits(new G4UserLimits(stepMax));
278
279 vacuum.logi = logi_vacuum;
280
281
282 string phys_vacuum_name = "phys_" + nameVac + "_name";
283
284 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_vacuum, phys_vacuum_name, logi_polycone, false, 0);
285
286 elements[nameVac] = vacuum;
287 }
288 }
289
290
291 std::vector<std::string> bendingSections;
292 boost::split(bendingSections, m_config.getParameterStr("Bending"), boost::is_any_of(" "));
293 for (const auto& name : bendingSections) {
294
295
296
297 prep = name + ".";
298 string type = m_config.getParameterStr(prep + "type");
299
300 FarBeamLineElement torus;
301
302 double torus_r = m_config.getParameter(prep + "r") * unitFactor;
303 double torus_R = m_config.getParameter(prep + "R") * unitFactor;
304 double torus_RT = m_config.getParameter(prep + "RT") * unitFactor;
305 double torus_X0 = m_config.getParameter(prep + "X0") * unitFactor;
306 double torus_Z0 = m_config.getParameter(prep + "Z0") * unitFactor;
307 double torus_SPHI = m_config.getParameter(prep + "SPHI");
308 double torus_DPHI = m_config.getParameter(prep + "DPHI");
309
310 torus.transform = G4Translate3D(torus_X0, 0.0, torus_Z0);
311 torus.transform = torus.transform * G4RotateX3D(M_PI / 2 / Unit::rad);
312
313
314 string subtract = m_config.getParameterStr(prep + "Subtract", "");
315 string intersect = m_config.getParameterStr(prep +
"Intersect",
"");
316
317 string geo_torusxx_name = "geo_" + name + "xx_name";
318 string geo_torusx_name = "geo_" + name + "x_name";
319 string geo_torus_name = "geo_" + name + "_name";
320
321 G4VSolid* geo_torus(NULL);
322
323 if (subtract != "" || intersect != "") {
324 G4VSolid* geo_torusxx(NULL);
325 if (type == "pipe")
326 geo_torusxx = new G4Torus(geo_torusxx_name, 0, torus_R, torus_RT, torus_SPHI, torus_DPHI);
327 else
328 geo_torusxx = new G4Torus(geo_torusxx_name, torus_r, torus_R, torus_RT, torus_SPHI, torus_DPHI);
329 if (subtract != "" && intersect != "") {
330 G4VSolid* geo_torusx = new G4SubtractionSolid(geo_torusx_name, geo_torusxx, elements[subtract].geo,
331 torus.transform.inverse()*elements[subtract].transform);
332 geo_torus = new G4IntersectionSolid(geo_torus_name, geo_torusx, elements[intersect].geo,
333 torus.transform.inverse()*elements[intersect].transform);
334 } else if (subtract != "")
335 geo_torus = new G4SubtractionSolid(geo_torus_name, geo_torusxx, elements[subtract].geo,
336 torus.transform.inverse()*elements[subtract].transform);
337 else
338 geo_torus = new G4IntersectionSolid(geo_torus_name, geo_torusxx, elements[intersect].geo,
339 torus.transform.inverse()*elements[intersect].transform);
340 } else if (type == "pipe")
341 geo_torus = new G4Torus(geo_torus_name, 0, torus_R, torus_RT, torus_SPHI, torus_DPHI);
342 else
343 geo_torus = new G4Torus(geo_torus_name, torus_r, torus_R, torus_RT, torus_SPHI, torus_DPHI);
344
345 torus.geo = geo_torus;
346
347
348 string strMat_torus = m_config.getParameterStr(prep + "Material");
349 G4Material* mat_torus = Materials::get(strMat_torus);
350 string logi_torus_name = "logi_" + name + "_name";
351 G4LogicalVolume* logi_torus = new G4LogicalVolume(torus.geo, mat_torus, logi_torus_name);
354
355 torus.logi = logi_torus;
356
357
358 string phys_torus_name = "phys_" + name + "_name";
359 new G4PVPlacement(torus.transform, logi_torus, phys_torus_name, &topVolume, false, 0);
360
361 elements[name] = torus;
362
363 if (type == "pipe" && torus_r != 0) {
364
365 FarBeamLineElement vacuum;
366
367 string nameVac = name + "Vac";
368
369
370 string geo_vacuumxx_name = "geo_" + nameVac + "xx_name";
371 string geo_vacuum_name = "geo_" + nameVac + "_name";
372
373 G4VSolid* geo_vacuumxx, *geo_vacuum;
374
375 geo_vacuumxx = new G4Torus(geo_vacuumxx_name, 0.0, torus_r, torus_RT, torus_SPHI, torus_DPHI);
376 geo_vacuum = new G4IntersectionSolid(geo_vacuum_name, geo_vacuumxx, geo_torus);
377
378 vacuum.geo = geo_vacuum;
379 vacuum.transform = torus.transform;
380
381
382 G4Material* mat_vacuum = Materials::get("Vacuum");
383 string logi_vacuum_name = "logi_" + nameVac + "_name";
384 G4LogicalVolume* logi_vacuum = new G4LogicalVolume(vacuum.geo, mat_vacuum, logi_vacuum_name);
385 if (flag_limitStep) logi_vacuum->SetUserLimits(new G4UserLimits(stepMax));
388
389 vacuum.logi = logi_vacuum;
390
391
392 string phys_vacuum_name = "phys_" + nameVac + "_name";
393
394 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_vacuum, phys_vacuum_name, logi_torus, false, 0);
395
396 elements[nameVac] = vacuum;
397 }
398 }
399
400
401
402
403
404 std::vector<std::string> shields;
405 boost::split(shields, m_config.getParameterStr("Shield"), boost::is_any_of(" "));
406 for (const auto& name : shields) {
407 prep = name + ".";
408
409
410
411 double shield_W = m_config.getParameter(prep + "W") * unitFactor;
412 double shield_H = m_config.getParameter(prep + "H") * unitFactor;
413 double shield_L = m_config.getParameter(prep + "L") * unitFactor;
414 double shield_X0 = m_config.getParameter(prep + "X0") * unitFactor;
415 double shield_Y0 = m_config.getParameter(prep + "Y0") * unitFactor;
416 double shield_Z0 = m_config.getParameter(prep + "Z0") * unitFactor;
417
418 double shield_hole_W = m_config.getParameter(prep + "holeW", 0) * unitFactor;
419 double shield_hole_H = m_config.getParameter(prep + "holeH", 0) * unitFactor;
420 double shield_hole_L = m_config.getParameter(prep + "holeL", 0) * unitFactor;
421 double shield_hole_dX = m_config.getParameter(prep + "holeDX", 0) * unitFactor;
422 double shield_hole_dY = m_config.getParameter(prep + "holeDY", 0) * unitFactor;
423 double shield_hole_dZ = m_config.getParameter(prep + "holeDZ", 0) * unitFactor;
424
425 double shield_PHI = m_config.getParameter(prep + "PHI");
426
427
428 FarBeamLineElement shield;
429
430 shield.transform = G4Translate3D(shield_X0, shield_Y0, shield_Z0);
431 shield.transform = shield.transform * G4RotateY3D(shield_PHI / Unit::rad);
432
433 G4Transform3D transform_shield_hole = G4Translate3D(shield_hole_dX, shield_hole_dY, shield_hole_dZ);
434
435
436 string geo_shieldx_name = "geo_" + name + "x_name";
437 string geo_shield_hole_name = "geo_" + name + "_hole_name";
438 string geo_shield_name = "geo_" + name + "_name";
439
440 if (shield_hole_W == 0 || shield_hole_H == 0 || shield_hole_L == 0) {
441 G4Box* geo_shield = new G4Box(geo_shield_name, shield_W / 2.0, shield_H / 2.0, shield_L / 2.0);
442
443 shield.geo = geo_shield;
444 } else {
445 G4Box* geo_shieldx = new G4Box(geo_shieldx_name, shield_W / 2.0, shield_H / 2.0, shield_L / 2.0);
446 G4Box* geo_shield_hole = new G4Box(geo_shield_hole_name, shield_hole_W / 2.0, shield_hole_H / 2.0, shield_hole_L / 2.0);
447 G4SubtractionSolid* geo_shield = new G4SubtractionSolid(geo_shield_name, geo_shieldx, geo_shield_hole,
448 transform_shield_hole);
449
450 shield.geo = geo_shield;
451 }
452
453 string strMat_shield = m_config.getParameterStr(prep + "Material");
454 G4Material* mat_shield = Materials::get(strMat_shield);
455
456 string logi_shield_name = "logi_" + name + "_name";
457 G4LogicalVolume* logi_shield = new G4LogicalVolume(shield.geo, mat_shield, logi_shield_name);
458
459 shield.logi = logi_shield;
460
461
463
464 string phys_shield_name = "phys_" + name + "_name";
465 new G4PVPlacement(shield.transform, shield.logi, phys_shield_name, &topVolume, false, 0);
466
467 elements[name] = shield;
468 }
469
470
471
472
473
474
475 G4Tubs* geo_Tube = new G4Tubs("geo_Tube_name", 3995 * CLHEP::mm, 4000 * CLHEP::mm, 29 * CLHEP::m, 0. * CLHEP::deg, 360.*CLHEP::deg);
476 G4Material* mat_Tube = Materials::get("G4_Si");
477 G4LogicalVolume* logi_Tube = new G4LogicalVolume(geo_Tube, mat_Tube, "logi_Tube_name");
478
479
482 bool radiation_study = false;
483
484 if (radiation_study && elements.count("GateShieldL")) {
485 new G4PVPlacement(elements["GateShieldL"].transform, logi_Tube, "phys_Tube_name", &topVolume, false, 0);
486 }
487
488
489
490
491
492
493
494 if (radiation_study) {
495
496 if (elements.count("PolyShieldL"))
497 elements["PolyShieldL"].logi->SetSensitiveDetector(new BkgSensitiveDetector("IR", 1001));
498 if (elements.count("PolyShieldR"))
499 elements["PolyShieldR"].logi->SetSensitiveDetector(new BkgSensitiveDetector("IR", 1002));
500
501
502 if (elements.count("ConcreteShieldL"))
503 elements["ConcreteShieldL"].logi->SetSensitiveDetector(new BkgSensitiveDetector("IR", 1003));
504 if (elements.count("ConcreteShieldR"))
505 elements["ConcreteShieldR"].logi->SetSensitiveDetector(new BkgSensitiveDetector("IR", 1004));
506
507
508 if (elements.count("GateShieldL"))
509 elements["GateShieldL"].logi->SetSensitiveDetector(new BkgSensitiveDetector("IR", 1005));
510 if (elements.count("GateShieldR"))
511 elements["GateShieldR"].logi->SetSensitiveDetector(new BkgSensitiveDetector("IR", 1006));
512
513
514 logi_Tube->SetSensitiveDetector(new BkgSensitiveDetector("IR", 1007));
515 }
516
517
518
519
520
521 std::vector<std::string> collimators;
522 boost::split(collimators, m_config.getParameterStr("Collimator"), boost::is_any_of(" "));
523 for (const auto& name : collimators) {
524
525
526
527 prep = name + ".";
528
529 string type = m_config.getParameterStr(prep + "type");
530 string motherVolume = m_config.getParameterStr(prep + "MotherVolume");
531 string motherVolumeVacuum = motherVolume + "Vac";
532
533
534 G4Scale3D scale;
535 G4Rotate3D rotation;
536 G4Translate3D translation;
537 elements[motherVolumeVacuum].transform.getDecomposition(scale, rotation, translation);
538 double zz = rotation.zz();
539
540
541
542 double collimator_d1 = m_config.getParameter(prep + "d1") * unitFactor;
543 double collimator_d2 = m_config.getParameter(prep + "d2") * unitFactor;
544 double collimator_fullH = m_config.getParameter(prep + "fullH") * unitFactor;
545 double collimator_headH = m_config.getParameter(prep + "headH") * unitFactor;
546 double collimator_minW = m_config.getParameter(prep + "minW") * unitFactor;
547 double collimator_maxW = m_config.getParameter(prep + "maxW") * unitFactor;
548 double collimator_th = m_config.getParameter(prep + "th") * unitFactor;
549 double collimator_Z = m_config.getParameter(prep + "Z") * unitFactor;
550
551 B2WARNING("Collimator " << name << " displacement d1 is set to " << collimator_d1 << "mm (must be negative)");
552 B2WARNING("Collimator " << name << " displacement d2 is set to " << collimator_d2 << "mm (must be positive)");
553
554
555
556
557
558 double head_dx1;
559 double head_dx2;
560 double head_dy1;
561 double head_dy2;
562 double head_dz = collimator_headH / 2.0;
563 if (type == "vertical") {
564 head_dx1 = collimator_th / 2.0;
565 head_dx2 = collimator_th / 2.0;
566 head_dy1 = ((collimator_maxW - collimator_minW) * collimator_headH / collimator_fullH + collimator_minW) / 2.0;
567 head_dy2 = collimator_minW / 2.0;
568 } else {
569 head_dx1 = ((collimator_maxW - collimator_minW) * collimator_headH / collimator_fullH + collimator_minW) / 2.0;
570 head_dx2 = collimator_minW / 2.0;
571 head_dy1 = collimator_th / 2.0;
572 head_dy2 = collimator_th / 2.0;
573 }
574
575
576 FarBeamLineElement collimator_head1;
577 FarBeamLineElement collimator_head2;
578
579
580 G4Transform3D transform_head1 = G4Translate3D(0.0, 0.0, collimator_Z);
581 G4Transform3D transform_head2 = G4Translate3D(0.0, 0.0, collimator_Z);
582
583
584 if (type == "vertical") {
585 transform_head1 = transform_head1 * G4Translate3D(0.0, -head_dz + collimator_d1, 0.0);
586 transform_head1 = transform_head1 * G4RotateX3D(-M_PI / 2 / Unit::rad);
587
588 transform_head2 = transform_head2 * G4Translate3D(0.0, head_dz + collimator_d2, 0.0);
589 transform_head2 = transform_head2 * G4RotateX3D(M_PI / 2 / Unit::rad);
590 } else {
591 if (zz > 0) {
592 transform_head1 = transform_head1 * G4Translate3D(-head_dz + collimator_d1, 0.0, 0.0);
593 transform_head1 = transform_head1 * G4RotateY3D(M_PI / 2 / Unit::rad);
594
595 transform_head2 = transform_head2 * G4Translate3D(head_dz + collimator_d2, 0.0, 0.0);
596 transform_head2 = transform_head2 * G4RotateY3D(-M_PI / 2 / Unit::rad);
597 } else {
598 transform_head1 = transform_head1 * G4Translate3D(head_dz - collimator_d1, 0.0, 0.0);
599 transform_head1 = transform_head1 * G4RotateY3D(-M_PI / 2 / Unit::rad);
600
601 transform_head2 = transform_head2 * G4Translate3D(-head_dz - collimator_d2, 0.0, 0.0);
602 transform_head2 = transform_head2 * G4RotateY3D(M_PI / 2 / Unit::rad);
603 }
604 }
605
606 collimator_head1.transform = transform_head1;
607 collimator_head2.transform = transform_head2;
608
609
610 string geo_headx_name = "geo_" + name + "_headx_name";
611
612 string geo_head1_name = "geo_" + name + "_head1_name";
613 string geo_head2_name = "geo_" + name + "_head2_name";
614
615 G4VSolid* geo_headx = new G4Trd(geo_headx_name, head_dx1, head_dx2, head_dy1, head_dy2, head_dz);
616
617 G4VSolid* geo_head1 = new G4IntersectionSolid(geo_head1_name, geo_headx, elements[motherVolumeVacuum].geo,
618 collimator_head1.transform.inverse());
619 G4VSolid* geo_head2 = new G4IntersectionSolid(geo_head2_name, geo_headx, elements[motherVolumeVacuum].geo,
620 collimator_head2.transform.inverse());
621
622 collimator_head1.geo = geo_head1;
623 collimator_head2.geo = geo_head2;
624
625
626 string strMat_head = m_config.getParameterStr(prep + "HeadMaterial");
627 G4Material* mat_head = Materials::get(strMat_head);
628 string logi_head1_name = "logi_" + name + "_head1_name";
629 string logi_head2_name = "logi_" + name + "_head2_name";
630 G4LogicalVolume* logi_head1 = new G4LogicalVolume(geo_head1, mat_head, logi_head1_name);
631 G4LogicalVolume* logi_head2 = new G4LogicalVolume(geo_head2, mat_head, logi_head2_name);
636
637
638 double volume_head1 = logi_head1->GetSolid()->GetCubicVolume();
639 double volume_head2 = logi_head2->GetSolid()->GetCubicVolume();
640
641 collimator_head1.logi = logi_head1;
642 collimator_head2.logi = logi_head2;
643
644
645 string phys_head1_name = "phys_" + name + "_head1" + "_name";
646 string phys_head2_name = "phys_" + name + "_head2" + "_name";
647 if (volume_head1 != 0)
648 new G4PVPlacement(collimator_head1.transform, logi_head1, phys_head1_name, elements[motherVolumeVacuum].logi, false, 0);
649 if (volume_head2 != 0)
650 new G4PVPlacement(collimator_head2.transform, logi_head2, phys_head2_name, elements[motherVolumeVacuum].logi, false, 0);
651
652
653 collimator_head1.transform = collimator_head1.transform * elements[motherVolumeVacuum].transform;
654 collimator_head2.transform = collimator_head2.transform * elements[motherVolumeVacuum].transform;
655
656 string name_head1 = name + "_head1";
657 string name_head2 = name + "_head2";
658 elements[name_head1] = collimator_head1;
659 elements[name_head2] = collimator_head2;
660
661
662
663
664
665 double body_dx1;
666 double body_dx2;
667 double body_dy1;
668 double body_dy2;
669 double body_dz = (collimator_fullH - collimator_headH) / 2.0;
670 if (type == "vertical") {
671 body_dx1 = collimator_th / 2.0;
672 body_dx2 = collimator_th / 2.0;
673 body_dy1 = collimator_maxW / 2.0;
674 body_dy2 = ((collimator_maxW - collimator_minW) * collimator_headH / collimator_fullH + collimator_minW) / 2.0;
675 } else {
676 body_dx1 = collimator_maxW / 2.0;
677 body_dx2 = ((collimator_maxW - collimator_minW) * collimator_headH / collimator_fullH + collimator_minW) / 2.0;
678 body_dy1 = collimator_th / 2.0;
679 body_dy2 = collimator_th / 2.0;
680 }
681
682
683 FarBeamLineElement collimator_body1;
684 FarBeamLineElement collimator_body2;
685
686
687 if (type == "vertical") {
688 collimator_body1.transform = G4Translate3D(0.0, -head_dz - body_dz, 0.0) * transform_head1;
689 collimator_body2.transform = G4Translate3D(0.0, head_dz + body_dz, 0.0) * transform_head2;
690 } else {
691 if (zz > 0) {
692 collimator_body1.transform = G4Translate3D(-head_dz - body_dz, 0.0, 0.0) * transform_head1;
693 collimator_body2.transform = G4Translate3D(head_dz + body_dz, 0.0, 0.0) * transform_head2;
694 } else {
695 collimator_body1.transform = G4Translate3D(head_dz + body_dz, 0.0, 0.0) * transform_head1;
696 collimator_body2.transform = G4Translate3D(-head_dz - body_dz, 0.0, 0.0) * transform_head2;
697 }
698 }
699
700
701 string geo_bodyx_name = "geo_" + name + "_bodyx_name";
702
703 string geo_body1_name = "geo_" + name + "_body1_name";
704 string geo_body2_name = "geo_" + name + "_body2_name";
705
706 G4VSolid* geo_bodyx = new G4Trd(geo_bodyx_name, body_dx1, body_dx2, body_dy1, body_dy2, body_dz);
707
708 G4VSolid* geo_body1 = new G4IntersectionSolid(geo_body1_name, geo_bodyx, elements[motherVolumeVacuum].geo,
709 collimator_body1.transform.inverse());
710 G4VSolid* geo_body2 = new G4IntersectionSolid(geo_body2_name, geo_bodyx, elements[motherVolumeVacuum].geo,
711 collimator_body2.transform.inverse());
712
713 collimator_body1.geo = geo_body1;
714 collimator_body2.geo = geo_body2;
715
716
717 string strMat_body = m_config.getParameterStr(prep + "Material");
718 G4Material* mat_body = Materials::get(strMat_body);
719 string logi_body1_name = "logi_" + name + "_body1_name";
720 string logi_body2_name = "logi_" + name + "_body2_name";
721 G4LogicalVolume* logi_body1 = new G4LogicalVolume(geo_body1, mat_body, logi_body1_name);
722 G4LogicalVolume* logi_body2 = new G4LogicalVolume(geo_body2, mat_body, logi_body2_name);
727
728
729 double volume_body1 = logi_body1->GetSolid()->GetCubicVolume();
730 double volume_body2 = logi_body2->GetSolid()->GetCubicVolume();
731
732 collimator_body1.logi = logi_body1;
733 collimator_body2.logi = logi_body2;
734
735
736 string phys_body1_name = "phys_" + name + "_body1" + "_name";
737 string phys_body2_name = "phys_" + name + "_body2" + "_name";
738 if (volume_body1 != 0)
739 new G4PVPlacement(collimator_body1.transform, logi_body1, phys_body1_name, elements[motherVolumeVacuum].logi, false, 0);
740 if (volume_body2 != 0)
741 new G4PVPlacement(collimator_body2.transform, logi_body2, phys_body2_name, elements[motherVolumeVacuum].logi, false, 0);
742
743
744 collimator_body1.transform = collimator_body1.transform * elements[motherVolumeVacuum].transform;
745 collimator_body2.transform = collimator_body2.transform * elements[motherVolumeVacuum].transform;
746
747 string name_body1 = name + "_body1";
748 string name_body2 = name + "_body2";
749 elements[name_body1] = collimator_body1;
750 elements[name_body2] = collimator_body2;
751 }
752
753
754
755
756
757
758
759
760
761 if (m_config.getParameter("ACSL.box1_W", -1) > 0) {
762 FarBeamLineElement ACSL;
763
764
765 std::string name = "ACSL";
766 prep = name + ".";
767
768 double acsl_X0 = m_config.getParameter(prep + "X0") * unitFactor;
769 double acsl_Y0 = m_config.getParameter(prep + "Y0") * unitFactor;
770 double acsl_Z0 = m_config.getParameter(prep + "Z0") * unitFactor;
771 double acsl_PHI = m_config.getParameter(prep + "PHI");
772
773 double acsl_box1_W = m_config.getParameter(prep + "box1_W") * unitFactor;
774 double acsl_box1_H = m_config.getParameter(prep + "box1_H") * unitFactor;
775 double acsl_box1_L = m_config.getParameter(prep + "box1_L") * unitFactor;
776
777 double acsl_box2_W = m_config.getParameter(prep + "box2_W") * unitFactor;
778 double acsl_box2_H = m_config.getParameter(prep + "box2_H") * unitFactor;
779 double acsl_box2_L = m_config.getParameter(prep + "box2_L") * unitFactor;
780 double acsl_box2_dX = m_config.getParameter(prep + "box2_dX") * unitFactor;
781 double acsl_box2_dY = m_config.getParameter(prep + "box2_dY") * unitFactor;
782 double acsl_box2_dZ = m_config.getParameter(prep + "box2_dZ") * unitFactor;
783
784 double acsl_trd1_X1 = m_config.getParameter(prep + "trd1_X1") * unitFactor;
785 double acsl_trd1_X2 = m_config.getParameter(prep + "trd1_X2") * unitFactor;
786 double acsl_trd1_Y1 = m_config.getParameter(prep + "trd1_Y1") * unitFactor;
787 double acsl_trd1_Y2 = m_config.getParameter(prep + "trd1_Y2") * unitFactor;
788 double acsl_trd1_Z = m_config.getParameter(prep + "trd1_Z") * unitFactor;
789 double acsl_trd1_dX = m_config.getParameter(prep + "trd1_dX") * unitFactor;
790 double acsl_trd1_dY = m_config.getParameter(prep + "trd1_dY") * unitFactor;
791 double acsl_trd1_dZ = m_config.getParameter(prep + "trd1_dZ") * unitFactor;
792 double acsl_trd1_PHI = m_config.getParameter(prep + "trd1_PHI");
793
794 double acsl_trd2_X1 = m_config.getParameter(prep + "trd2_X1") * unitFactor;
795 double acsl_trd2_X2 = m_config.getParameter(prep + "trd2_X2") * unitFactor;
796 double acsl_trd2_Y1 = m_config.getParameter(prep + "trd2_Y1") * unitFactor;
797 double acsl_trd2_Y2 = m_config.getParameter(prep + "trd2_Y2") * unitFactor;
798 double acsl_trd2_Z = m_config.getParameter(prep + "trd2_Z") * unitFactor;
799 double acsl_trd2_dX = m_config.getParameter(prep + "trd2_dX") * unitFactor;
800 double acsl_trd2_dY = m_config.getParameter(prep + "trd2_dY") * unitFactor;
801 double acsl_trd2_dZ = m_config.getParameter(prep + "trd2_dZ") * unitFactor;
802 double acsl_trd2_PHI = m_config.getParameter(prep + "trd2_PHI");
803
804
805 string geo_box1_name = "geo_" + name + "_box1_name";
806 string geo_box2_name = "geo_" + name + "_box2_name";
807 string geo_trd1_name = "geo_" + name + "_trd1_name";
808 string geo_trd2_name = "geo_" + name + "_trd2_name";
809 string geo_acsl_name = "geo_" + name + "_name";
810
811 G4Box* geo_box1 = new G4Box(geo_box1_name, acsl_box1_W / 2.0, acsl_box1_H / 2.0, acsl_box1_L / 2.0);
812 G4Box* geo_box2 = new G4Box(geo_box2_name, acsl_box2_W / 2.0, acsl_box2_H / 2.0, acsl_box2_L / 2.0);
813 G4Trd* geo_trd1 = new G4Trd(geo_trd1_name, acsl_trd1_X1, acsl_trd1_X2, acsl_trd1_Y1, acsl_trd1_Y2, acsl_trd1_Z);
814 G4Trd* geo_trd2 = new G4Trd(geo_trd2_name, acsl_trd2_X1, acsl_trd2_X2, acsl_trd2_Y1, acsl_trd2_Y2, acsl_trd2_Z);
815
816
817
818
819 G4Transform3D box2_trans = G4Translate3D(acsl_box2_dX, acsl_box2_dY, acsl_box2_dZ);
820
821 G4Transform3D trd1_trans = G4Translate3D(acsl_trd1_dX, acsl_trd1_dY, acsl_trd1_dZ);
822 trd1_trans = trd1_trans * G4RotateY3D(acsl_trd1_PHI / Unit::rad);
823
824 G4Transform3D trd2_trans = G4Translate3D(acsl_trd2_dX, acsl_trd2_dY, acsl_trd2_dZ);
825 trd2_trans = trd2_trans * G4RotateY3D(acsl_trd2_PHI / Unit::rad);
826
827 ACSL.transform = G4Translate3D(acsl_X0, acsl_Y0, acsl_Z0);
828 ACSL.transform = ACSL.transform * G4RotateY3D(acsl_PHI / Unit::rad);;
829
830
831
832
833
834
835
836
837
838
839
840
841
842 string geo_interm1_name = "geo_" + name + "_interm1_name";
843 string geo_interm2_name = "geo_" + name + "_interm2_name";
844 G4UnionSolid* geo_interm1 = new G4UnionSolid(geo_interm1_name, geo_box1, geo_box2, box2_trans);
845 G4UnionSolid* geo_interm2 = new G4UnionSolid(geo_interm2_name, geo_interm1, geo_trd1, trd1_trans);
846 G4UnionSolid* geo_acsl = new G4UnionSolid(geo_acsl_name, geo_interm2, geo_trd2, trd2_trans);
847
848 ACSL.geo = geo_acsl;
849
850
851 string strMat_acsl = m_config.getParameterStr(prep + "Material");
852 G4Material* mat_acsl = Materials::get(strMat_acsl);
853 string logi_acsl_name = "logi_" + name + "_name";
854 G4LogicalVolume* logi_acsl = new G4LogicalVolume(geo_acsl, mat_acsl, logi_acsl_name);
857
858 ACSL.logi = logi_acsl;
859
860
861 string phys_acsl_name = "phys_" + name + "_name";
862 new G4PVPlacement(ACSL.transform, ACSL.logi, phys_acsl_name, &topVolume, false, 0);
863
864
865
866
867
868
869
870
871
872
873
874 FarBeamLineElement ACSR1;
875
876
877 name = "ACSR1";
878 prep = name + ".";
879
880 double acsr1_X0 = m_config.getParameter(prep + "X0") * unitFactor;
881 double acsr1_Y0 = m_config.getParameter(prep + "Y0") * unitFactor;
882 double acsr1_Z0 = m_config.getParameter(prep + "Z0") * unitFactor;
883 double acsr1_PHI0 = m_config.getParameter(prep + "PHI0");
884
885 double acsr1_X1 = m_config.getParameter(prep + "X1") * unitFactor;
886 double acsr1_X2 = m_config.getParameter(prep + "X2") * unitFactor;
887 double acsr1_Y1 = m_config.getParameter(prep + "Y1") * unitFactor;
888 double acsr1_Y2 = m_config.getParameter(prep + "Y2") * unitFactor;
889 double acsr1_Z = m_config.getParameter(prep + "Z") * unitFactor;
890 double acsr1_THETA = m_config.getParameter(prep + "THETA");
891 double acsr1_PHI = m_config.getParameter(prep + "PHI");
892 double acsr1_ANG = m_config.getParameter(prep + "ANG");
893
894 double acsr1_dx = (acsr1_X1 - acsr1_X2) / 2.0;
895 double acsr1_dy = (acsr1_Y2 - acsr1_Y1) / 2.0;
896
897
898
899
900
901
902
903
904
905
906
907
908 string geo_acsr1_name = "geo_" + name + "_name";
909 G4Trap* geo_acsr1 = new G4Trap(geo_acsr1_name, acsr1_Z, acsr1_THETA, acsr1_PHI, acsr1_Y1, acsr1_X1, acsr1_X1, acsr1_ANG, acsr1_Y2,
910 acsr1_X2, acsr1_X2, acsr1_ANG);
911
912
913 ACSR1.geo = geo_acsr1;
914
915
916 ACSR1.transform = G4Translate3D(acsr1_X0, acsr1_Y0 - acsr1_dy, acsr1_Z0 - acsr1_dx);
917 ACSR1.transform = ACSR1.transform * G4RotateY3D(acsr1_PHI0 / Unit::rad);;
918
919
920 string strMat_acsr1 = m_config.getParameterStr(prep + "Material");
921 G4Material* mat_acsr1 = Materials::get(strMat_acsr1);
922 string logi_acsr1_name = "logi_" + name + "_name";
923 G4LogicalVolume* logi_acsr1 = new G4LogicalVolume(geo_acsr1, mat_acsr1, logi_acsr1_name);
926
927 ACSR1.logi = logi_acsr1;
928
929
930 string phys_acsr1_name = "phys_" + name + "_name";
931 new G4PVPlacement(ACSR1.transform, ACSR1.logi, phys_acsr1_name, &topVolume, false, 0);
932
933
934
935
936
937
938 FarBeamLineElement ACSR2;
939
940
941 name = "ACSR2";
942 prep = name + ".";
943
944 double acsr2_X0 = m_config.getParameter(prep + "X0") * unitFactor;
945 double acsr2_Y0 = m_config.getParameter(prep + "Y0") * unitFactor;
946 double acsr2_Z0 = m_config.getParameter(prep + "Z0") * unitFactor;
947 double acsr2_PHI0 = m_config.getParameter(prep + "PHI0");
948
949 double acsr2_X1 = m_config.getParameter(prep + "X1") * unitFactor;
950 double acsr2_X2 = m_config.getParameter(prep + "X2") * unitFactor;
951 double acsr2_Y1 = m_config.getParameter(prep + "Y1") * unitFactor;
952 double acsr2_Y2 = m_config.getParameter(prep + "Y2") * unitFactor;
953 double acsr2_Z = m_config.getParameter(prep + "Z") * unitFactor;
954 double acsr2_THETA = m_config.getParameter(prep + "THETA");
955 double acsr2_PHI = m_config.getParameter(prep + "PHI");
956 double acsr2_ANG = m_config.getParameter(prep + "ANG");
957
958 double acsr2_dx = (acsr2_X1 - acsr2_X2) / 2.0;
959 double acsr2_dy = (acsr2_Y2 - acsr2_Y1) / 2.0;
960
961
962
963
964
965
966
967
968
969
970
971
972 string geo_acsr2_name = "geo_" + name + "_name";
973 G4Trap* geo_acsr2 = new G4Trap(geo_acsr2_name, acsr2_Z, acsr2_THETA, acsr2_PHI, acsr2_Y1, acsr2_X1, acsr2_X1, acsr2_ANG, acsr2_Y2,
974 acsr2_X2, acsr2_X2, acsr2_ANG);
975
976
977 ACSR2.geo = geo_acsr2;
978
979
980 ACSR2.transform = G4Translate3D(acsr2_X0, acsr2_Y0 - acsr2_dy, acsr2_Z0 - acsr2_dx);
981 ACSR2.transform = ACSR2.transform * G4RotateY3D(acsr2_PHI0 / Unit::rad);;
982
983
984 string strMat_acsr2 = m_config.getParameterStr(prep + "Material");
985 G4Material* mat_acsr2 = Materials::get(strMat_acsr2);
986 string logi_acsr2_name = "logi_" + name + "_name";
987 G4LogicalVolume* logi_acsr2 = new G4LogicalVolume(geo_acsr2, mat_acsr2, logi_acsr2_name);
990
991 ACSR2.logi = logi_acsr2;
992
993
994 string phys_acsr2_name = "phys_" + name + "_name";
995 new G4PVPlacement(ACSR2.transform, ACSR2.logi, phys_acsr2_name, &topVolume, false, 0);
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007 FarBeamLineElement APSL1;
1008
1009
1010 name = "APSL1";
1011 prep = name + ".";
1012
1013 double apsl1_W = m_config.getParameter(prep + "W") * unitFactor;
1014 double apsl1_H = m_config.getParameter(prep + "H") * unitFactor;
1015 double apsl1_L = m_config.getParameter(prep + "L") * unitFactor;
1016 double apsl1_X0 = m_config.getParameter(prep + "X0") * unitFactor;
1017 double apsl1_Y0 = m_config.getParameter(prep + "Y0") * unitFactor;
1018 double apsl1_Z0 = m_config.getParameter(prep + "Z0") * unitFactor;
1019 double apsl1_hole_R = m_config.getParameter(prep + "holeR") * unitFactor;
1020 double apsl1_hole_D = m_config.getParameter(prep + "holeD") * unitFactor;
1021 double apsl1_hole_dX = m_config.getParameter(prep + "holeDX") * unitFactor;
1022 double apsl1_hole_dY = m_config.getParameter(prep + "holeDY") * unitFactor;
1023 double apsl1_hole_dZ = m_config.getParameter(prep + "holeDZ") * unitFactor;
1024 double apsl1_PHI = m_config.getParameter(prep + "PHI");
1025
1026
1027 APSL1.transform = G4Translate3D(apsl1_X0, apsl1_Y0, apsl1_Z0);
1028 APSL1.transform = APSL1.transform * G4RotateY3D(apsl1_PHI / Unit::rad);;
1029
1030 G4Transform3D transform_apsl1_hole = G4Translate3D(apsl1_hole_dX, apsl1_hole_dY, apsl1_hole_dZ);
1031
1032
1033 string geo_apsl1_box_name = "geo_" + name + "_box_name";
1034 string geo_apsl1_hole_name = "geo_" + name + "_hole_name";
1035 string geo_apsl1_name = "geo_" + name + "_name";
1036
1037 G4Box* geo_apsl1_box = new G4Box(geo_apsl1_box_name, apsl1_W / 2.0, apsl1_H / 2.0, apsl1_L / 2.0);
1038 G4Tubs* geo_apsl1_hole = new G4Tubs(geo_apsl1_hole_name, 0.0, apsl1_hole_R, apsl1_hole_D / 2.0, 0.0, 2.0 * M_PI);
1039 G4SubtractionSolid* geo_apsl1 = new G4SubtractionSolid(geo_apsl1_name, geo_apsl1_box, geo_apsl1_hole, transform_apsl1_hole);
1040
1041 APSL1.geo = geo_apsl1;
1042
1043
1044 string strMat_apsl1 = m_config.getParameterStr(prep + "Material");
1045 G4Material* mat_apsl1 = Materials::get(strMat_apsl1);
1046 string logi_apsl1_name = "logi_" + name + "_name";
1047 G4LogicalVolume* logi_apsl1 = new G4LogicalVolume(geo_apsl1, mat_apsl1, logi_apsl1_name);
1050
1051 APSL1.logi = logi_apsl1;
1052
1053
1054 string phys_apsl1_name = "phys_" + name + "_name";
1055 new G4PVPlacement(APSL1.transform, APSL1.logi, phys_apsl1_name, &topVolume, false, 0);
1056
1057
1058
1059
1060
1061
1062 FarBeamLineElement APSL2;
1063
1064
1065 name = "APSL2";
1066 prep = name + ".";
1067
1068 double apsl2_W = m_config.getParameter(prep + "W") * unitFactor;
1069 double apsl2_H = m_config.getParameter(prep + "H") * unitFactor;
1070 double apsl2_L = m_config.getParameter(prep + "L") * unitFactor;
1071 double apsl2_X0 = m_config.getParameter(prep + "X0") * unitFactor;
1072 double apsl2_Y0 = m_config.getParameter(prep + "Y0") * unitFactor;
1073 double apsl2_Z0 = m_config.getParameter(prep + "Z0") * unitFactor;
1074 double apsl2_hole_R = m_config.getParameter(prep + "holeR") * unitFactor;
1075 double apsl2_hole_D = m_config.getParameter(prep + "holeD") * unitFactor;
1076 double apsl2_hole_dX = m_config.getParameter(prep + "holeDX") * unitFactor;
1077 double apsl2_hole_dY = m_config.getParameter(prep + "holeDY") * unitFactor;
1078 double apsl2_hole_dZ = m_config.getParameter(prep + "holeDZ") * unitFactor;
1079 double apsl2_PHI = m_config.getParameter(prep + "PHI");
1080
1081
1082 APSL2.transform = G4Translate3D(apsl2_X0, apsl2_Y0, apsl2_Z0);
1083 APSL2.transform = APSL2.transform * G4RotateY3D(apsl2_PHI / Unit::rad);;
1084
1085 G4Transform3D transform_apsl2_hole = G4Translate3D(apsl2_hole_dX, apsl2_hole_dY, apsl2_hole_dZ);
1086
1087
1088 string geo_apsl2_box_name = "geo_" + name + "_box_name";
1089 string geo_apsl2_hole_name = "geo_" + name + "_hole_name";
1090 string geo_apsl2_name = "geo_" + name + "_name";
1091
1092 G4Box* geo_apsl2_box = new G4Box(geo_apsl2_box_name, apsl2_W / 2.0, apsl2_H / 2.0, apsl2_L / 2.0);
1093 G4Tubs* geo_apsl2_hole = new G4Tubs(geo_apsl2_hole_name, 0.0, apsl2_hole_R, apsl2_hole_D / 2.0, 0.0, 2.0 * M_PI);
1094 G4SubtractionSolid* geo_apsl2 = new G4SubtractionSolid(geo_apsl2_name, geo_apsl2_box, geo_apsl2_hole, transform_apsl2_hole);
1095
1096 APSL2.geo = geo_apsl2;
1097
1098
1099 string strMat_apsl2 = m_config.getParameterStr(prep + "Material");
1100 G4Material* mat_apsl2 = Materials::get(strMat_apsl2);
1101 string logi_apsl2_name = "logi_" + name + "_name";
1102 G4LogicalVolume* logi_apsl2 = new G4LogicalVolume(geo_apsl2, mat_apsl2, logi_apsl2_name);
1105
1106 APSL2.logi = logi_apsl2;
1107
1108
1109 string phys_apsl2_name = "phys_" + name + "_name";
1110 new G4PVPlacement(APSL2.transform, APSL2.logi, phys_apsl2_name, &topVolume, false, 0);
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122 FarBeamLineElement APSR1;
1123
1124
1125 name = "APSR1";
1126 prep = name + ".";
1127
1128 double apsr1_W = m_config.getParameter(prep + "W") * unitFactor;
1129 double apsr1_H = m_config.getParameter(prep + "H") * unitFactor;
1130 double apsr1_L = m_config.getParameter(prep + "L") * unitFactor;
1131 double apsr1_X0 = m_config.getParameter(prep + "X0") * unitFactor;
1132 double apsr1_Y0 = m_config.getParameter(prep + "Y0") * unitFactor;
1133 double apsr1_Z0 = m_config.getParameter(prep + "Z0") * unitFactor;
1134 double apsr1_hole_R = m_config.getParameter(prep + "holeR") * unitFactor;
1135 double apsr1_hole_D = m_config.getParameter(prep + "holeD") * unitFactor;
1136 double apsr1_hole_dX = m_config.getParameter(prep + "holeDX") * unitFactor;
1137 double apsr1_hole_dY = m_config.getParameter(prep + "holeDY") * unitFactor;
1138 double apsr1_hole_dZ = m_config.getParameter(prep + "holeDZ") * unitFactor;
1139 double apsr1_PHI = m_config.getParameter(prep + "PHI");
1140
1141
1142 APSR1.transform = G4Translate3D(apsr1_X0, apsr1_Y0, apsr1_Z0);
1143 APSR1.transform = APSR1.transform * G4RotateY3D(apsr1_PHI / Unit::rad);;
1144
1145 G4Transform3D transform_apsr1_hole = G4Translate3D(apsr1_hole_dX, apsr1_hole_dY, apsr1_hole_dZ);
1146
1147
1148 string geo_apsr1_box_name = "geo_" + name + "_box_name";
1149 string geo_apsr1_hole_name = "geo_" + name + "_hole_name";
1150 string geo_apsr1_name = "geo_" + name + "_name";
1151
1152 G4Box* geo_apsr1_box = new G4Box(geo_apsr1_box_name, apsr1_W / 2.0, apsr1_H / 2.0, apsr1_L / 2.0);
1153 G4Tubs* geo_apsr1_hole = new G4Tubs(geo_apsr1_hole_name, 0.0, apsr1_hole_R, apsr1_hole_D / 2.0, 0.0, 2.0 * M_PI);
1154 G4SubtractionSolid* geo_apsr1 = new G4SubtractionSolid(geo_apsr1_name, geo_apsr1_box, geo_apsr1_hole, transform_apsr1_hole);
1155
1156 APSR1.geo = geo_apsr1;
1157
1158
1159 string strMat_apsr1 = m_config.getParameterStr(prep + "Material");
1160 G4Material* mat_apsr1 = Materials::get(strMat_apsr1);
1161 string logi_apsr1_name = "logi_" + name + "_name";
1162 G4LogicalVolume* logi_apsr1 = new G4LogicalVolume(geo_apsr1, mat_apsr1, logi_apsr1_name);
1165
1166 APSR1.logi = logi_apsr1;
1167
1168
1169 string phys_apsr1_name = "phys_" + name + "_name";
1170 new G4PVPlacement(APSR1.transform, APSR1.logi, phys_apsr1_name, &topVolume, false, 0);
1171
1172
1173
1174
1175
1176
1177 FarBeamLineElement APSR2;
1178
1179
1180 name = "APSR2";
1181 prep = name + ".";
1182
1183 double apsr2_W = m_config.getParameter(prep + "W") * unitFactor;
1184 double apsr2_H = m_config.getParameter(prep + "H") * unitFactor;
1185 double apsr2_L = m_config.getParameter(prep + "L") * unitFactor;
1186 double apsr2_X0 = m_config.getParameter(prep + "X0") * unitFactor;
1187 double apsr2_Y0 = m_config.getParameter(prep + "Y0") * unitFactor;
1188 double apsr2_Z0 = m_config.getParameter(prep + "Z0") * unitFactor;
1189 double apsr2_hole_R = m_config.getParameter(prep + "holeR") * unitFactor;
1190 double apsr2_hole_D = m_config.getParameter(prep + "holeD") * unitFactor;
1191 double apsr2_hole_dX = m_config.getParameter(prep + "holeDX") * unitFactor;
1192 double apsr2_hole_dY = m_config.getParameter(prep + "holeDY") * unitFactor;
1193 double apsr2_hole_dZ = m_config.getParameter(prep + "holeDZ") * unitFactor;
1194 double apsr2_PHI = m_config.getParameter(prep + "PHI");
1195
1196
1197 APSR2.transform = G4Translate3D(apsr2_X0, apsr2_Y0, apsr2_Z0);
1198 APSR2.transform = APSR2.transform * G4RotateY3D(apsr2_PHI / Unit::rad);;
1199
1200 G4Transform3D transform_apsr2_hole = G4Translate3D(apsr2_hole_dX, apsr2_hole_dY, apsr2_hole_dZ);
1201
1202
1203 string geo_apsr2_box_name = "geo_" + name + "_box_name";
1204 string geo_apsr2_hole_name = "geo_" + name + "_hole_name";
1205 string geo_apsr2_name = "geo_" + name + "_name";
1206
1207 G4Box* geo_apsr2_box = new G4Box(geo_apsr2_box_name, apsr2_W / 2.0, apsr2_H / 2.0, apsr2_L / 2.0);
1208 G4Tubs* geo_apsr2_hole = new G4Tubs(geo_apsr2_hole_name, 0.0, apsr2_hole_R, apsr2_hole_D / 2.0, 0.0, 2.0 * M_PI);
1209 G4SubtractionSolid* geo_apsr2 = new G4SubtractionSolid(geo_apsr2_name, geo_apsr2_box, geo_apsr2_hole, transform_apsr2_hole);
1210
1211 APSR2.geo = geo_apsr2;
1212
1213
1214 string strMat_apsr2 = m_config.getParameterStr(prep + "Material");
1215 G4Material* mat_apsr2 = Materials::get(strMat_apsr2);
1216 string logi_apsr2_name = "logi_" + name + "_name";
1217 G4LogicalVolume* logi_apsr2 = new G4LogicalVolume(geo_apsr2, mat_apsr2, logi_apsr2_name);
1220
1221 APSR2.logi = logi_apsr2;
1222
1223
1224 string phys_apsr2_name = "phys_" + name + "_name";
1225 new G4PVPlacement(APSR2.transform, APSR2.logi, phys_apsr2_name, &topVolume, false, 0);
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240 }
1241 }
int intersect(const TRGCDCLpar &lp1, const TRGCDCLpar &lp2, CLHEP::HepVector &v1, CLHEP::HepVector &v2)
intersection
void setVisibility(G4LogicalVolume &volume, bool visible)
Helper function to quickly set the visibility of a given volume.
void setColor(G4LogicalVolume &volume, const std::string &color)
Set the color of a logical volume.