Create detector geometry.
68 {
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
148
150
153
154 G4Transform3D transform_HER = G4Translate3D(0., 0., 0.);
155 transform_HER = transform_HER * G4RotateY3D(crossingAngleHER);
156
157 G4Transform3D transform_LER = G4Translate3D(0., 0., 0.);
158 transform_LER = transform_LER * G4RotateY3D(crossingAngleLER);
159
160 map<string, CryostatElement> elements;
161
162
163
164
165
166 CryostatElement tubeR;
167 std::string prep = "TubeR.";
168
170
171 std::vector<double> TubeR_Z(TubeR_N);
172 std::vector<double> TubeR_R(TubeR_N);
173 std::vector<double> TubeR_r(TubeR_N);
174
175 for (int i = 0; i < TubeR_N; ++i) {
176 ostringstream ossZID;
177 ossZID << "Z" << i;
178
179 ostringstream ossRID;
180 ossRID << "R" << i;
181
182 ostringstream ossrID;
183 ossrID << "r" << i;
184
188 }
189
190 tubeR.transform = G4Translate3D(0., 0., 0.);
191 tubeR.geo = new G4Polycone("geo_TubeR_name", 0, 2 * M_PI, TubeR_N, &(TubeR_Z[0]), &(TubeR_r[0]), &(TubeR_R[0]));
192 tubeR.logi = NULL;
193 elements["TubeR"] = tubeR;
194
195
196 CryostatElement tubeR2;
197 prep = "TubeR2.";
199
200 std::vector<double> TubeR2_Z(TubeR2_N);
201 std::vector<double> TubeR2_R(TubeR2_N);
202 std::vector<double> TubeR2_r(TubeR2_N);
203
204 for (int i = 0; i < TubeR2_N; ++i) {
205 ostringstream ossZID;
206 ossZID << "Z" << i;
207
208 ostringstream ossRID;
209 ossRID << "R" << i;
210
211 ostringstream ossrID;
212 ossrID << "r" << i;
213
217 }
218
219 tubeR2.transform = G4Translate3D(0., 0., 0.);
220 tubeR2.geo = new G4Polycone("geo_TubeR2_name", 0, 2 * M_PI, TubeR2_N, &(TubeR2_Z[0]), &(TubeR2_r[0]), &(TubeR2_R[0]));
221 tubeR2.logi = NULL;
222 elements["TubeR2"] = tubeR2;
223
224
225 CryostatElement tubeL;
226 prep = "TubeL.";
228
229 std::vector<double> TubeL_Z(TubeL_N);
230 std::vector<double> TubeL_R(TubeL_N);
231 std::vector<double> TubeL_r(TubeL_N);
232
233 for (int i = 0; i < TubeL_N; ++i) {
234 ostringstream ossZID;
235 ossZID << "Z" << i;
236
237 ostringstream ossRID;
238 ossRID << "R" << i;
239
240 ostringstream ossrID;
241 ossrID << "r" << i;
242
246 }
247
248 tubeL.transform = G4Translate3D(0., 0., 0.);
249 tubeL.geo = new G4Polycone("geo_TubeL_name", 0, 2 * M_PI, TubeL_N, &(TubeL_Z[0]), &(TubeL_r[0]), &(TubeL_R[0]));
250 tubeL.logi = NULL;
251 elements["TubeL"] = tubeL;
252
253
254
255
256
257
258
259
260 CryostatElement A1spc1;
261 prep = "A1spc1.";
263
264 std::vector<double> A1spc1_Z(A1spc1_N);
265 std::vector<double> A1spc1_r(A1spc1_N);
266 std::vector<double> A1spc1_R(A1spc1_N);
267
268 for (int i = 0; i < A1spc1_N; ++i) {
269 ostringstream ossZID;
270 ossZID << "Z" << i;
271
272 ostringstream ossRID;
273 ossRID << "R" << i;
274
275 ostringstream ossrID;
276 ossrID << "r" << i;
277
281 }
282
283 A1spc1.transform = transform_HER;
284 G4Polycone* geo_A1spc1xx = new G4Polycone("geo_A1spc1xx_name", 0, 2 * M_PI, A1spc1_N, &(A1spc1_Z[0]), &(A1spc1_r[0]),
285 &(A1spc1_R[0]));
286
287
288 CryostatElement A1spc2;
289 prep = "A1spc2.";
291
292 std::vector<double> A1spc2_Z(A1spc2_N);
293 std::vector<double> A1spc2_R(A1spc2_N);
294 std::vector<double> A1spc2_r(A1spc2_N);
295
296 for (int i = 0; i < A1spc2_N; ++i) {
297 ostringstream ossZID;
298 ossZID << "Z" << i;
299
300 ostringstream ossRID;
301 ossRID << "R" << i;
302
303 ostringstream ossrID;
304 ossrID << "r" << i;
305
309 }
310
311 A1spc2.transform = transform_HER;
312 G4Polycone* geo_A1spc2xx = new G4Polycone("geo_A1spc2xx_name", 0, 2 * M_PI, A1spc2_N, &(A1spc2_Z[0]), &(A1spc2_r[0]),
313 &(A1spc2_R[0]));
314
315
316 CryostatElement B1spc1;
317 prep = "B1spc1.";
319
320 std::vector<double> B1spc1_Z(B1spc1_N);
321 std::vector<double> B1spc1_R(B1spc1_N);
322 std::vector<double> B1spc1_r(B1spc1_N);
323
324 for (int i = 0; i < B1spc1_N; ++i) {
325 ostringstream ossZID;
326 ossZID << "Z" << i;
327
328 ostringstream ossRID;
329 ossRID << "R" << i;
330
331 ostringstream ossrID;
332 ossrID << "r" << i;
333
337 }
338
339 B1spc1.transform = transform_LER;
340 G4Polycone* geo_B1spc1xx = new G4Polycone("geo_B1spc1xx_name", 0, 2 * M_PI, B1spc1_N, &(B1spc1_Z[0]), &(B1spc1_r[0]),
341 &(B1spc1_R[0]));
342
343
344 CryostatElement B1spc2;
345 prep = "B1spc2.";
347
348 std::vector<double> B1spc2_Z(B1spc2_N);
349 std::vector<double> B1spc2_R(B1spc2_N);
350 std::vector<double> B1spc2_r(B1spc2_N);
351
352 for (int i = 0; i < B1spc2_N; ++i) {
353 ostringstream ossZID;
354 ossZID << "Z" << i;
355
356 ostringstream ossRID;
357 ossRID << "R" << i;
358
359 ostringstream ossrID;
360 ossrID << "r" << i;
361
365 }
366
367 B1spc2.transform = transform_LER;
368 G4Polycone* geo_B1spc2xx = new G4Polycone("geo_B1spc2xx_name", 0, 2 * M_PI, B1spc2_N, &(B1spc2_Z[0]), &(B1spc2_r[0]),
369 &(B1spc2_R[0]));
370
371
372 B1spc2.geo = new G4IntersectionSolid("geo_B1spc2_name", geo_B1spc2xx, elements["TubeR2"].geo, B1spc2.transform.inverse());
373 B1spc2.logi = NULL;
374
375 G4IntersectionSolid* geo_B1spc1x = new G4IntersectionSolid("geo_B1spc1x_name", geo_B1spc1xx, elements["TubeR"].geo,
376 B1spc1.transform.inverse());
377 B1spc1.geo = new G4UnionSolid("geo_B1spc1_name", geo_B1spc1x, B1spc2.geo);
378
379 A1spc2.geo = new G4IntersectionSolid("geo_A1spc2_name", geo_A1spc2xx, elements["TubeR2"].geo, A1spc2.transform.inverse());
380 A1spc2.logi = NULL;
381
382 G4IntersectionSolid* geo_A1spc1xy = new G4IntersectionSolid("geo_A1spc1xy_name", geo_A1spc1xx, elements["TubeR"].geo,
383 A1spc1.transform.inverse());
384 G4UnionSolid* geo_A1spc1x = new G4UnionSolid("geo_A1spc1x_name", geo_A1spc1xy, A1spc2.geo);
385 A1spc1.geo = new G4SubtractionSolid("geo_A1spc1_name", geo_A1spc1x, B1spc1.geo, A1spc1.transform.inverse()*B1spc1.transform);
386
389 A1spc1.logi = new G4LogicalVolume(A1spc1.geo, mat_A1spc1, "logi_A1spc1_name");
390 if (flag_limitStep)
391 A1spc1.logi->SetUserLimits(new G4UserLimits(stepMax));
392
393
395
396 new G4PVPlacement(A1spc1.transform, A1spc1.logi, "phys_A1spc1_name", &topVolume, false, 0);
397
400 B1spc1.logi = new G4LogicalVolume(B1spc1.geo, mat_B1spc1, "logi_B1spc1_name");
401 if (flag_limitStep)
402 B1spc1.logi->SetUserLimits(new G4UserLimits(stepMax));
403
404
406
407 new G4PVPlacement(B1spc1.transform, B1spc1.logi, "phys_B1spc1_name", &topVolume, false, 0);
408
409 elements["A1spc1"] = A1spc1;
410 elements["A1spc2"] = A1spc2;
411 elements["B1spc1"] = B1spc1;
412 elements["B1spc2"] = B1spc2;
413
414
415
416
417
418 CryostatElement C1wal1;
419 prep = "C1wal1.";
421
422 std::vector<double> C1wal1_Z(C1wal1_N);
423 std::vector<double> C1wal1_R(C1wal1_N);
424 std::vector<double> C1wal1_r(C1wal1_N);
425
426 for (int i = 0; i < C1wal1_N; ++i) {
427 ostringstream ossZID;
428 ossZID << "Z" << i;
429
430 ostringstream ossRID;
431 ossRID << "R" << i;
432
433 ostringstream ossrID;
434 ossrID << "r" << i;
435
439 }
440
441 C1wal1.transform = G4Translate3D(0., 0., 0.);
442
443
444 G4Polycone* geo_C1wal1xxx = new G4Polycone("geo_C1wal1xxx_name", 0, 2 * M_PI, C1wal1_N, &(C1wal1_Z[0]), &(C1wal1_r[0]),
445 &(C1wal1_R[0]));
446 G4IntersectionSolid* geo_C1wal1xx = new G4IntersectionSolid("geo_C1wal1xx_name", geo_C1wal1xxx, elements["TubeR"].geo,
447 elements["TubeR"].transform);
448 G4SubtractionSolid* geo_C1wal1x = new G4SubtractionSolid("geo_C1wal1x_name", geo_C1wal1xx, elements["A1spc1"].geo,
449 elements["A1spc1"].transform);
450 C1wal1.geo = new G4SubtractionSolid("geo_C1wal1_name", geo_C1wal1x, elements["B1spc1"].geo, elements["B1spc1"].transform);
451
454 C1wal1.logi = new G4LogicalVolume(C1wal1.geo, mat_C1wal1, "logi_C1wal1_name");
455
456
459 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), C1wal1.logi, "phys_C1wal1_name", &topVolume, false, 0);
460
461 elements["C1wal1"] = C1wal1;
462
463
464
465
466
467 CryostatElement D1spc1;
468 prep = "D1spc1.";
470
471 std::vector<double> D1spc1_Z(D1spc1_N);
472 std::vector<double> D1spc1_r(D1spc1_N);
473 std::vector<double> D1spc1_R(D1spc1_N);
474
475 for (int i = 0; i < D1spc1_N; ++i) {
476 ostringstream ossZID;
477 ossZID << "Z" << i;
478
479 ostringstream ossRID;
480 ossRID << "R" << i;
481
482 ostringstream ossrID;
483 ossrID << "r" << i;
484
488 }
489
490 D1spc1.transform = transform_HER;
491 G4Polycone* geo_D1spc1xx = new G4Polycone("geo_D1spc1xx_name", 0, 2 * M_PI, D1spc1_N, &(D1spc1_Z[0]), &(D1spc1_r[0]),
492 &(D1spc1_R[0]));
493
494
495 CryostatElement E1spc1;
496 prep = "E1spc1.";
498
499 std::vector<double> E1spc1_Z(E1spc1_N);
500 std::vector<double> E1spc1_R(E1spc1_N);
501 std::vector<double> E1spc1_r(E1spc1_N);
502
503 for (int i = 0; i < E1spc1_N; ++i) {
504 ostringstream ossZID;
505 ossZID << "Z" << i;
506
507 ostringstream ossRID;
508 ossRID << "R" << i;
509
510 ostringstream ossrID;
511 ossrID << "r" << i;
512
516 }
517
518 E1spc1.transform = transform_LER;
519 G4Polycone* geo_E1spc1xx = new G4Polycone("geo_E1spc1xx_name", 0, 2 * M_PI, E1spc1_N, &(E1spc1_Z[0]), &(E1spc1_r[0]),
520 &(E1spc1_R[0]));
521
522
523 G4IntersectionSolid* geo_D1spc1x = new G4IntersectionSolid("geo_D1spc1x_name", geo_D1spc1xx, elements["TubeL"].geo,
524 D1spc1.transform.inverse());
525 E1spc1.geo = new G4IntersectionSolid("geo_E1spc1_name", geo_E1spc1xx, elements["TubeL"].geo, E1spc1.transform.inverse());
526 D1spc1.geo = new G4SubtractionSolid("geo_D1spc1_name", geo_D1spc1x, E1spc1.geo, D1spc1.transform.inverse()*E1spc1.transform);
527
530 D1spc1.logi = new G4LogicalVolume(D1spc1.geo, mat_D1spc1, "logi_D1spc1_name");
531 if (flag_limitStep)
532 D1spc1.logi->SetUserLimits(new G4UserLimits(stepMax));
533
534
536
537 new G4PVPlacement(D1spc1.transform, D1spc1.logi, "phys_D1spc1_name", &topVolume, false, 0);
538
541 E1spc1.logi = new G4LogicalVolume(E1spc1.geo, mat_E1spc1, "logi_E1spc1_name");
542 if (flag_limitStep)
543 E1spc1.logi->SetUserLimits(new G4UserLimits(stepMax));
544
545
547
548 new G4PVPlacement(E1spc1.transform, E1spc1.logi, "phys_E1spc1_name", &topVolume, false, 0);
549
550 elements["E1spc1"] = E1spc1;
551 elements["D1spc1"] = D1spc1;
552
553
554
555
556
557
558 CryostatElement F1wal1;
559 prep = "F1wal1.";
561
562 std::vector<double> F1wal1_Z(F1wal1_N);
563 std::vector<double> F1wal1_R(F1wal1_N);
564 std::vector<double> F1wal1_r(F1wal1_N);
565
566 for (int i = 0; i < F1wal1_N; ++i) {
567 ostringstream ossZID;
568 ossZID << "Z" << i;
569
570 ostringstream ossRID;
571 ossRID << "R" << i;
572
573 ostringstream ossrID;
574 ossrID << "r" << i;
575
579 }
580
581 F1wal1.transform = G4Translate3D(0., 0., 0.);
582
583
584 G4Polycone* geo_F1wal1xxx = new G4Polycone("geo_F1wal1xxx_name", 0, 2 * M_PI, F1wal1_N, &(F1wal1_Z[0]), &(F1wal1_r[0]),
585 &(F1wal1_R[0]));
586 G4IntersectionSolid* geo_F1wal1xx = new G4IntersectionSolid("geo_F1wal1xx_name", geo_F1wal1xxx, elements["TubeL"].geo,
587 elements["TubeL"].transform);
588 G4SubtractionSolid* geo_F1wal1x = new G4SubtractionSolid("geo_F1wal1x_name", geo_F1wal1xx, elements["D1spc1"].geo,
589 elements["D1spc1"].transform);
590 F1wal1.geo = new G4SubtractionSolid("geo_F1wal1_name", geo_F1wal1x, elements["E1spc1"].geo, elements["E1spc1"].transform);
591
594 F1wal1.logi = new G4LogicalVolume(F1wal1.geo, mat_F1wal1, "logi_F1wal1_name");
595
596
599 new G4PVPlacement(F1wal1.transform, F1wal1.logi, "phys_F1wal1_name", &topVolume, false, 0);
600
601 elements["F1wal1"] = F1wal1;
602
603
604
605
606
607 std::vector<std::string> supports;
609 for (const auto& name : supports) {
610
611 CryostatElement sup;
612 prep = name + ".";
613
620
628
630
632
633
634 G4Transform3D transform_box = G4Translate3D(box_X0, box_Y0, box_Z0);
635 transform_box = transform_box * G4RotateY3D(sup_PHI /
Unit::rad);
636
637 G4Transform3D transform_trd = G4Translate3D(trd_X0, trd_Y0, trd_Z0);
638 transform_trd = transform_trd * G4RotateY3D(sup_PHI /
Unit::rad) * G4RotateX3D(M_PI / 2.0 /
Unit::rad);
639
640
641 string geo_box_name = "geo_" + name + "_box_name";
642 string geo_trd_name = "geo_" + name + "_trd_name";
643
644 string geo_sup_name;
645 if (sup_cut_N == 0) {
646 geo_sup_name = "geo_" + name + "_name";
647 } else {
648 geo_sup_name = "geo_" + name + "_x_name";
649 }
650
651 G4Box* geo_box = new G4Box(geo_box_name, box_W / 2.0, box_H / 2.0, box_L / 2.0);
652 G4Trd* geo_trd = new G4Trd(geo_trd_name, trd_W1 / 2.0, trd_W2 / 2.0, trd_L / 2.0, trd_L / 2.0, trd_H / 2.0);
653
654 G4VSolid* geo_sup = new G4UnionSolid(geo_sup_name, geo_box, geo_trd, transform_box.inverse() * transform_trd);
655
656
657 for (int i = 0; i < sup_cut_N; ++i) {
658 ostringstream oss_block_num;
659 oss_block_num << i;
660
662 string geo_supx_name;
663 if (i == sup_cut_N - 1) {
664 geo_supx_name = "geo_" + name + "_name";
665 } else {
666 geo_sup_name = "geo_" + name + "_x" + oss_block_num.str() + "_name";
667 }
668 string geo_cut_name = "geo_" + name + "_cut" + oss_block_num.str() + "_name";
669
670 G4VSolid* geo_cut;
671
672 if (cut_type == 0.0) {
676
677 geo_cut = new G4Box(geo_cut_name, cut_W / 2.0, cut_H / 2.0, cut_L / 2.0);
678
679 } else {
682
683 geo_cut = new G4Tubs(geo_cut_name, 0.0, cut_R, cut_L / 2.0, 0.0, 2.0 * M_PI);
684 }
685
686
687
693
694 G4Transform3D cut_transform = G4Translate3D(cut_X0, cut_Y0, cut_Z0);
695 cut_transform = cut_transform * G4RotateX3D(cut_PHI /
Unit::rad);
696 cut_transform = cut_transform * G4RotateZ3D(cut_TH /
Unit::rad);
697
698 geo_sup = new G4SubtractionSolid(geo_sup_name, geo_sup, geo_cut, cut_transform);
699 }
700
701 sup.geo = geo_sup;
702 sup.transform = transform_box;
703
706
707 string logi_sup_name = "logi_" + name + "_name";
708 G4LogicalVolume* logi_sup = new G4LogicalVolume(sup.geo, mat_sup, logi_sup_name);
709
710 sup.logi = logi_sup;
711
712
714
715 string phys_sup_name = "phys_" + name + "_name";
716 new G4PVPlacement(sup.transform, sup.logi, phys_sup_name, &topVolume, false, 0);
717
718 elements[name] = sup;
719 }
720
721
722
723
724
725 std::vector<std::string> straightSections;
727 for (const auto& name : straightSections) {
728 prep = name + ".";
729
730 CryostatElement polycone;
731
733
734 std::vector<double> Z(N);
735 std::vector<double>
R(N);
736 std::vector<double> r(N);
737
738 for (int i = 0; i < N; ++i) {
739 ostringstream ossZID;
740 ossZID << "Z" << i;
741
742 ostringstream ossRID;
743 ossRID << "R" << i;
744
745 ostringstream ossrID;
746 ossrID << "r" << i;
747
751 }
752
753 polycone.transform = G4Translate3D(0.0, 0.0, 0.0);
754
755
759
760 string geo_polyconexx_name = "geo_" + name + "xx_name";
761 string geo_polyconex_name = "geo_" + name + "x_name";
762 string geo_polycone_name = "geo_" + name + "_name";
763
764 G4VSolid* geo_polyconexx, *geo_polycone;
765
767 geo_polyconexx =
new G4Polycone(geo_polyconexx_name, 0.0, 2 * M_PI, N, &(Z[0]), &(r[0]), &(
R[0]));
768 G4VSolid* geo_polyconex = new G4SubtractionSolid(geo_polyconex_name, geo_polyconexx, elements[subtract].geo,
769 elements[motherVolume].transform.inverse()*polycone.transform.inverse()*elements[subtract].transform);
770 geo_polycone =
new G4IntersectionSolid(geo_polycone_name, geo_polyconex, elements[
intersect].geo,
771 elements[motherVolume].transform.inverse()*polycone.transform.inverse()*elements[
intersect].transform);
772 } else if (subtract != "") {
773 geo_polyconexx =
new G4Polycone(geo_polyconexx_name, 0.0, 2 * M_PI, N, &(Z[0]), &(r[0]), &(
R[0]));
774 geo_polycone = new G4SubtractionSolid(geo_polycone_name, geo_polyconexx, elements[subtract].geo,
775 elements[motherVolume].transform.inverse()*polycone.transform.inverse()*elements[subtract].transform);
777 geo_polyconexx =
new G4Polycone(geo_polyconexx_name, 0.0, 2 * M_PI, N, &(Z[0]), &(r[0]), &(
R[0]));
778 geo_polycone =
new G4IntersectionSolid(geo_polycone_name, geo_polyconexx, elements[
intersect].geo,
779 elements[motherVolume].transform.inverse()*polycone.transform.inverse()*elements[
intersect].transform);
780 } else
781 geo_polycone =
new G4Polycone(geo_polycone_name, 0.0, 2 * M_PI, N, &(Z[0]), &(r[0]), &(
R[0]));
782
783 polycone.geo = geo_polycone;
784
785
788 string logi_polycone_name = "logi_" + name + "_name";
789 polycone.logi = new G4LogicalVolume(polycone.geo, mat_polycone, logi_polycone_name);
790 setColor(*polycone.logi,
"#CC0000");
792
793
794 string phys_polycone_name = "phys_" + name + "_name";
795 new G4PVPlacement(polycone.transform, polycone.logi, phys_polycone_name, elements[motherVolume].logi, false, 0);
796
797
798 polycone.transform = polycone.transform * elements[motherVolume].transform;
799
800 elements[name] = polycone;
801 }
802
803
804
805
806
807 std::vector<std::string> shields;
809 for (const auto& name : shields) {
810 prep = name + ".";
811
812
813
820
827
829
830
831 CryostatElement shield;
832
833 shield.transform = G4Translate3D(shield_X0, shield_Y0, shield_Z0);
834 shield.transform = shield.transform * G4RotateY3D(shield_PHI /
Unit::rad);
835
836 G4Transform3D transform_shield_hole = G4Translate3D(shield_hole_dX, shield_hole_dY, shield_hole_dZ);
837
838
839 string geo_shieldx_name = "geo_" + name + "x_name";
840 string geo_shield_hole_name = "geo_" + name + "_hole_name";
841 string geo_shield_name = "geo_" + name + "_name";
842
843 if (shield_hole_W == 0 || shield_hole_H == 0 || shield_hole_L == 0) {
844 G4Box* geo_shield = new G4Box(geo_shield_name, shield_W / 2.0, shield_H / 2.0, shield_L / 2.0);
845
846 shield.geo = geo_shield;
847 } else {
848 G4Box* geo_shieldx = new G4Box(geo_shieldx_name, shield_W / 2.0, shield_H / 2.0, shield_L / 2.0);
849 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);
850 G4SubtractionSolid* geo_shield = new G4SubtractionSolid(geo_shield_name, geo_shieldx, geo_shield_hole,
851 transform_shield_hole);
852
853 shield.geo = geo_shield;
854 }
855
858
859 string logi_shield_name = "logi_" + name + "_name";
860 G4LogicalVolume* logi_shield = new G4LogicalVolume(shield.geo, mat_shield, logi_shield_name);
861
862 shield.logi = logi_shield;
863
864
866
867 string phys_shield_name = "phys_" + name + "_name";
868 new G4PVPlacement(shield.transform, shield.logi, phys_shield_name, &topVolume, false, 0);
869
870 elements[name] = shield;
871 }
872
873
874
875 G4Tubs* geo_rvcR = new G4Tubs("geo_rvcR", 60, 60 + 60, (620 - 560) / 2., 0, 2 * M_PI);
876 G4LogicalVolume* logi_rvcR =
new G4LogicalVolume(geo_rvcR,
Materials::get(
"SUS316L"),
"logi_rvcR_name");
877 new G4PVPlacement(0, G4ThreeVector(0, 0, (620 + 560) / 2.), logi_rvcR, "phys_rvcR_name", &topVolume, false, 0);
878
879 G4Tubs* geo_rvcL = new G4Tubs("geo_rvcL", 60, 60 + 60, (-560 - (-620)) / 2., 0, 2 * M_PI);
880 G4LogicalVolume* logi_rvcL =
new G4LogicalVolume(geo_rvcL,
Materials::get(
"SUS316L"),
"logi_rvcL_name");
881 new G4PVPlacement(0, G4ThreeVector(0, 0, (-620 - 560) / 2.), logi_rvcL, "phys_rvcL_name", &topVolume, false, 0);
882
883
884
885 G4EllipticalTube* geo_elp_QC1LEx = new G4EllipticalTube("geo_elp_QC1LEx", 10.5, 13.5, (-675 - (-1225)) / 2.);
886 G4IntersectionSolid* geo_elp_QC1LE = new G4IntersectionSolid("geo_elp_QC1LE", elements["D2wal1"].geo, geo_elp_QC1LEx,
887 G4Translate3D(0, 0, (-675 - 1225) / 2.));
888 G4LogicalVolume* logi_elp_QC1LE =
new G4LogicalVolume(geo_elp_QC1LE,
Materials::get(
"Vacuum"),
"logi_elp_QC1LE_name");
889 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_elp_QC1LE, "phys_elp_QC1LE_name", elements["D2wal1"].logi, false, 0);
890
891 G4EllipticalTube* geo_elp_QC1LPx = new G4EllipticalTube("geo_elp_QC1LPx", 10.5, 13.5, (-675 - (-1225)) / 2.);
892 G4IntersectionSolid* geo_elp_QC1LP = new G4IntersectionSolid("geo_elp_QC1LP", elements["E2wal1"].geo, geo_elp_QC1LPx,
893 G4Translate3D(0, 0, (-675 - 1225) / 2.));
894 G4LogicalVolume* logi_elp_QC1LP =
new G4LogicalVolume(geo_elp_QC1LP,
Materials::get(
"Vacuum"),
"logi_elp_QC1LP_name");
895 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_elp_QC1LP, "phys_elp_QC1LP_name", elements["E2wal1"].logi, false, 0);
896
897 G4EllipticalTube* geo_elp_QC1REx = new G4EllipticalTube("geo_elp_QC1REx", 10.5, 13.5, (1225 - 675) / 2.);
898 G4IntersectionSolid* geo_elp_QC1RE = new G4IntersectionSolid("geo_elp_QC1RE", elements["A2wal1"].geo, geo_elp_QC1REx,
899 G4Translate3D(0, 0, (1225 + 675) / 2.));
900 G4LogicalVolume* logi_elp_QC1RE =
new G4LogicalVolume(geo_elp_QC1RE,
Materials::get(
"Vacuum"),
"logi_elp_QC1RE_name");
901 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_elp_QC1RE, "phys_elp_QC1RE_name", elements["A2wal1"].logi, false, 0);
902
903 G4EllipticalTube* geo_elp_QC1RPx = new G4EllipticalTube("geo_elp_QC1RPx", 10.5, 13.5, (1225 - 675) / 2.);
904 G4IntersectionSolid* geo_elp_QC1RP = new G4IntersectionSolid("geo_elp_QC1RP", elements["B2wal1"].geo, geo_elp_QC1RPx,
905 G4Translate3D(0, 0, (1225 + 675) / 2.));
906 G4LogicalVolume* logi_elp_QC1RP =
new G4LogicalVolume(geo_elp_QC1RP,
Materials::get(
"Vacuum"),
"logi_elp_QC1RP_name");
907 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_elp_QC1RP, "phys_elp_QC1RP_name", elements["B2wal1"].logi, false, 0);
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020 }
const std::string & getParameterStr(const std::string &name) const
Get string parameter.
double getParameter(const std::string &name) const
Get parameter value.
static const double mm
[millimeters]
static const double rad
Standard of [angle].
static const double cm
Standard units with the value = 1.
static G4Material * get(const std::string &name)
Find given material.
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.