Belle II Software  release-05-01-25
GeoCryostatCreator.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2010 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Hiroyuki Nakayama *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #include <ir/geometry/GeoCryostatCreator.h>
12 #include <ir/simulation/SensitiveDetector.h>
13 
14 #include <geometry/Materials.h>
15 #include <geometry/CreatorFactory.h>
16 #include <geometry/utilities.h>
17 #include <framework/gearbox/GearDir.h>
18 #include <framework/gearbox/Unit.h>
19 
20 #include <cmath>
21 #include <boost/format.hpp>
22 #include <boost/foreach.hpp>
23 #include <boost/algorithm/string.hpp>
24 
25 #include <G4LogicalVolume.hh>
26 #include <G4PVPlacement.hh>
27 
28 //Shapes
29 #include <G4Tubs.hh>
30 #include <G4Polycone.hh>
31 #include <G4EllipticalTube.hh>
32 #include <G4UnionSolid.hh>
33 #include <G4IntersectionSolid.hh>
34 #include <G4SubtractionSolid.hh>
35 #include <G4UserLimits.hh>
36 
37 using namespace std;
38 using namespace boost;
39 
40 namespace Belle2 {
47  using namespace geometry;
48 
49  namespace ir {
50 
51  //-----------------------------------------------------------------
52  // Register the Creator
53  //-----------------------------------------------------------------
54 
55  geometry::CreatorFactory<GeoCryostatCreator> GeoCryostatFactory("CryostatCreator");
56 
57  //-----------------------------------------------------------------
58  // Implementation
59  //-----------------------------------------------------------------
60 
61  GeoCryostatCreator::GeoCryostatCreator()
62  {
63  m_sensitive = new SensitiveDetector();
64  }
65 
66  GeoCryostatCreator::~GeoCryostatCreator()
67  {
68  delete m_sensitive;
69  }
70 
71  void GeoCryostatCreator::createGeometry(G4LogicalVolume& topVolume, GeometryTypes)
72  {
73 
74  //###### L side index ######
75  //
76  // +- A1spc1+A1spc2
77  // +- A2wal1
78  // +- A3wal1
79  // +- A3wal2
80  // +- A4mag1
81  // +- A4mag2
82  // +- A4mag3
83  // +- A4mag4
84  //
85  // +- B1spc1+B1spc2
86  // +- B2wal1
87  // +- B3wal1
88  // +- B3wal2
89  // +- B4mag1
90  // +- B4mag2
91  // +- B4mag3
92  // +- B4mag4
93  //
94  // +- C1wal1
95  // +- C2spc1
96  // +- C3wal1
97  // +- C4spc1
98  // +- C5wal1
99  // +- C6spc1
100  // +- C7lyr1
101  // +- C7lyr2
102  // +- C7lyr3
103  // +- C7lyr4
104  // +- C7lyr5
105  // +- C2spc2
106  // +- C3wal2
107  // +- C4spc2
108  // +- C5wal2
109  // +- C6spc2
110  // +- C7wal1
111  // +- C5wal3
112  // +- C5wal4
113  // +- C3wal3
114  // +- C2spc3
115  // +- C1wal2
116  //
117  //###### R side index ######
118  //
119  // +- D1spc1
120  // +- D2wal1
121  // +- D3wal1
122  // +- D3wal2
123  // +- D4mag1
124  // +- D4mag2
125  // +- D4mag3
126  //
127  // +- E1spc1
128  // +- E2wal1
129  // +- E3wal1
130  // +- E4mag1
131  // +- E4mag2
132  // +- E4mag3
133  //
134  // +- F1wal1
135  // +- F2spc1
136  // +- F3wal1
137  // +- F4spc1
138  // +- F5wal1
139  // +- F6spc1
140  // +- F7lyr1
141  // +- F7lyr2
142  // +- F7lyr3
143  // +- F7lyr4
144  // +- F7lyr5
145  // +- F3wal2
146  // +- F3wal3
147  // +- F3wal4
148  // +- F1wal2
149 
150  double stepMax = 5.0 * Unit::mm;
151  int flag_limitStep = int(m_config.getParameter("LimitStepLength"));
152 
153  const double unitFactor = Unit::cm / Unit::mm;
154 
155  map<string, CryostatElement> elements;
156 
157  GearDir her("/Detector/SuperKEKB/HER/");
158  GearDir ler("/Detector/SuperKEKB/LER/");
159  double crossingAngleHER = her.getDouble("angle");
160  double crossingAngleLER = ler.getDouble("angle");
161 
162  G4Transform3D transform_HER = G4Translate3D(0., 0., 0.);
163  transform_HER = transform_HER * G4RotateY3D(crossingAngleHER);
164 
165  G4Transform3D transform_LER = G4Translate3D(0., 0., 0.);
166  transform_LER = transform_LER * G4RotateY3D(crossingAngleLER);
167 
168  //--------------
169  //- Bounding shapes
170 
171  // right bounding shape 1
172  CryostatElement tubeR;
173  std::string prep = "TubeR.";
174 
175  const int TubeR_N = int(m_config.getParameter(prep + "N"));
176 
177  std::vector<double> TubeR_Z(TubeR_N);
178  std::vector<double> TubeR_R(TubeR_N);
179  std::vector<double> TubeR_r(TubeR_N);
180 
181  for (int i = 0; i < TubeR_N; ++i) {
182  ostringstream ossZID;
183  ossZID << "Z" << i;
184 
185  ostringstream ossRID;
186  ossRID << "R" << i;
187 
188  ostringstream ossrID;
189  ossrID << "r" << i;
190 
191  TubeR_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
192  TubeR_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
193  TubeR_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
194  }
195 
196  tubeR.transform = G4Translate3D(0., 0., 0.);
197  tubeR.geo = new G4Polycone("geo_TubeR_name", 0, 2 * M_PI, TubeR_N, &(TubeR_Z[0]), &(TubeR_r[0]), &(TubeR_R[0]));
198  tubeR.logi = NULL;
199  elements["TubeR"] = tubeR;
200 
201  // right bounding shape 2
202  CryostatElement tubeR2;
203  prep = "TubeR2.";
204  const int TubeR2_N = int(m_config.getParameter(prep + "N"));
205 
206  std::vector<double> TubeR2_Z(TubeR2_N);
207  std::vector<double> TubeR2_R(TubeR2_N);
208  std::vector<double> TubeR2_r(TubeR2_N);
209 
210  for (int i = 0; i < TubeR2_N; ++i) {
211  ostringstream ossZID;
212  ossZID << "Z" << i;
213 
214  ostringstream ossRID;
215  ossRID << "R" << i;
216 
217  ostringstream ossrID;
218  ossrID << "r" << i;
219 
220  TubeR2_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
221  TubeR2_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
222  TubeR2_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
223  }
224 
225  tubeR2.transform = G4Translate3D(0., 0., 0.);
226  tubeR2.geo = new G4Polycone("geo_TubeR2_name", 0, 2 * M_PI, TubeR2_N, &(TubeR2_Z[0]), &(TubeR2_r[0]), &(TubeR2_R[0]));
227  tubeR2.logi = NULL;
228  elements["TubeR2"] = tubeR2;
229 
230  // left bounding shape
231  CryostatElement tubeL;
232  prep = "TubeL.";
233  const int TubeL_N = int(m_config.getParameter(prep + "N"));
234 
235  std::vector<double> TubeL_Z(TubeL_N);
236  std::vector<double> TubeL_R(TubeL_N);
237  std::vector<double> TubeL_r(TubeL_N);
238 
239  for (int i = 0; i < TubeL_N; ++i) {
240  ostringstream ossZID;
241  ossZID << "Z" << i;
242 
243  ostringstream ossRID;
244  ossRID << "R" << i;
245 
246  ostringstream ossrID;
247  ossrID << "r" << i;
248 
249  TubeL_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
250  TubeL_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
251  TubeL_r[i] = m_config.getParameter(prep + ossrID.str()) * unitFactor;
252  }
253 
254  tubeL.transform = G4Translate3D(0., 0., 0.);
255  tubeL.geo = new G4Polycone("geo_TubeL_name", 0, 2 * M_PI, TubeL_N, &(TubeL_Z[0]), &(TubeL_r[0]), &(TubeL_R[0]));
256  tubeL.logi = NULL;
257  elements["TubeL"] = tubeL;
258 
259  //--------------
260  // Special cases with complex geometry
261 
262  //--------------
263  //- A1spc1 and B1spc1
264 
265  // space containing all structures around right HER beam pipe, part 1
266  CryostatElement A1spc1;
267  prep = "A1spc1.";
268  const int A1spc1_N = int(m_config.getParameter(prep + "N"));
269 
270  std::vector<double> A1spc1_Z(A1spc1_N);
271  std::vector<double> A1spc1_r(A1spc1_N);
272  std::vector<double> A1spc1_R(A1spc1_N);
273 
274  for (int i = 0; i < A1spc1_N; ++i) {
275  ostringstream ossZID;
276  ossZID << "Z" << i;
277 
278  ostringstream ossRID;
279  ossRID << "R" << i;
280 
281  ostringstream ossrID;
282  ossrID << "r" << i;
283 
284  A1spc1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
285  A1spc1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
286  A1spc1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
287  }
288 
289  A1spc1.transform = transform_HER;
290  G4Polycone* geo_A1spc1xx = new G4Polycone("geo_A1spc1xx_name", 0, 2 * M_PI, A1spc1_N, &(A1spc1_Z[0]), &(A1spc1_r[0]),
291  &(A1spc1_R[0]));
292 
293  // space containing all structures around right HER beam pipe, part 2
294  CryostatElement A1spc2;
295  prep = "A1spc2.";
296  const int A1spc2_N = int(m_config.getParameter(prep + "N"));
297 
298  std::vector<double> A1spc2_Z(A1spc2_N);
299  std::vector<double> A1spc2_R(A1spc2_N);
300  std::vector<double> A1spc2_r(A1spc2_N);
301 
302  for (int i = 0; i < A1spc2_N; ++i) {
303  ostringstream ossZID;
304  ossZID << "Z" << i;
305 
306  ostringstream ossRID;
307  ossRID << "R" << i;
308 
309  ostringstream ossrID;
310  ossrID << "r" << i;
311 
312  A1spc2_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
313  A1spc2_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
314  A1spc2_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
315  }
316 
317  A1spc2.transform = transform_HER;
318  G4Polycone* geo_A1spc2xx = new G4Polycone("geo_A1spc2xx_name", 0, 2 * M_PI, A1spc2_N, &(A1spc2_Z[0]), &(A1spc2_r[0]),
319  &(A1spc2_R[0]));
320 
321  // space containing all structures around right LER beam pipe, part 1
322  CryostatElement B1spc1;
323  prep = "B1spc1.";
324  const int B1spc1_N = int(m_config.getParameter(prep + "N"));
325 
326  std::vector<double> B1spc1_Z(B1spc1_N);
327  std::vector<double> B1spc1_R(B1spc1_N);
328  std::vector<double> B1spc1_r(B1spc1_N);
329 
330  for (int i = 0; i < B1spc1_N; ++i) {
331  ostringstream ossZID;
332  ossZID << "Z" << i;
333 
334  ostringstream ossRID;
335  ossRID << "R" << i;
336 
337  ostringstream ossrID;
338  ossrID << "r" << i;
339 
340  B1spc1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
341  B1spc1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
342  B1spc1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
343  }
344 
345  B1spc1.transform = transform_LER;
346  G4Polycone* geo_B1spc1xx = new G4Polycone("geo_B1spc1xx_name", 0, 2 * M_PI, B1spc1_N, &(B1spc1_Z[0]), &(B1spc1_r[0]),
347  &(B1spc1_R[0]));
348 
349  // space containing all structures around right LER beam pipe, part 2
350  CryostatElement B1spc2;
351  prep = "B1spc2.";
352  const int B1spc2_N = int(m_config.getParameter(prep + "N"));
353 
354  std::vector<double> B1spc2_Z(B1spc2_N);
355  std::vector<double> B1spc2_R(B1spc2_N);
356  std::vector<double> B1spc2_r(B1spc2_N);
357 
358  for (int i = 0; i < B1spc2_N; ++i) {
359  ostringstream ossZID;
360  ossZID << "Z" << i;
361 
362  ostringstream ossRID;
363  ossRID << "R" << i;
364 
365  ostringstream ossrID;
366  ossrID << "r" << i;
367 
368  B1spc2_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
369  B1spc2_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
370  B1spc2_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
371  }
372 
373  B1spc2.transform = transform_LER;
374  G4Polycone* geo_B1spc2xx = new G4Polycone("geo_B1spc2xx_name", 0, 2 * M_PI, B1spc2_N, &(B1spc2_Z[0]), &(B1spc2_r[0]),
375  &(B1spc2_R[0]));
376 
377  // final cut
378  B1spc2.geo = new G4IntersectionSolid("geo_B1spc2_name", geo_B1spc2xx, elements["TubeR2"].geo, B1spc2.transform.inverse());
379  B1spc2.logi = NULL;
380 
381  G4IntersectionSolid* geo_B1spc1x = new G4IntersectionSolid("geo_B1spc1x_name", geo_B1spc1xx, elements["TubeR"].geo,
382  B1spc1.transform.inverse());
383  B1spc1.geo = new G4UnionSolid("geo_B1spc1_name", geo_B1spc1x, B1spc2.geo);
384 
385  A1spc2.geo = new G4IntersectionSolid("geo_A1spc2_name", geo_A1spc2xx, elements["TubeR2"].geo, A1spc2.transform.inverse());
386  A1spc2.logi = NULL;
387 
388  G4IntersectionSolid* geo_A1spc1xy = new G4IntersectionSolid("geo_A1spc1xy_name", geo_A1spc1xx, elements["TubeR"].geo,
389  A1spc1.transform.inverse());
390  G4UnionSolid* geo_A1spc1x = new G4UnionSolid("geo_A1spc1x_name", geo_A1spc1xy, A1spc2.geo);
391  A1spc1.geo = new G4SubtractionSolid("geo_A1spc1_name", geo_A1spc1x, B1spc1.geo, A1spc1.transform.inverse()*B1spc1.transform);
392 
393  string strMat_A1spc1 = m_config.getParameterStr("A1spc1.Material");
394  G4Material* mat_A1spc1 = Materials::get(strMat_A1spc1);
395  A1spc1.logi = new G4LogicalVolume(A1spc1.geo, mat_A1spc1, "logi_A1spc1_name");
396  if (flag_limitStep)
397  A1spc1.logi->SetUserLimits(new G4UserLimits(stepMax));
398 
399  //put volume
400  setColor(*A1spc1.logi, "#CC0000");
401  //setVisibility(*A1spc1.logi, false);
402  new G4PVPlacement(A1spc1.transform, A1spc1.logi, "phys_A1spc1_name", &topVolume, false, 0);
403 
404  string strMat_B1spc1 = m_config.getParameterStr("B1spc1.Material");
405  G4Material* mat_B1spc1 = Materials::get(strMat_B1spc1);
406  B1spc1.logi = new G4LogicalVolume(B1spc1.geo, mat_B1spc1, "logi_B1spc1_name");
407  if (flag_limitStep)
408  B1spc1.logi->SetUserLimits(new G4UserLimits(stepMax));
409 
410  //put volume
411  setColor(*B1spc1.logi, "#CC0000");
412  //setVisibility(*B1spc1.logi, false);
413  new G4PVPlacement(B1spc1.transform, B1spc1.logi, "phys_B1spc1_name", &topVolume, false, 0);
414 
415  elements["A1spc1"] = A1spc1;
416  elements["A1spc2"] = A1spc2;
417  elements["B1spc1"] = B1spc1;
418  elements["B1spc2"] = B1spc2;
419 
420  //--------------
421  //- C1wal1
422 
423  //get parameters from .xml file
424  CryostatElement C1wal1;
425  prep = "C1wal1.";
426  const int C1wal1_N = m_config.getParameter(prep + "N");
427 
428  std::vector<double> C1wal1_Z(C1wal1_N);
429  std::vector<double> C1wal1_R(C1wal1_N);
430  std::vector<double> C1wal1_r(C1wal1_N);
431 
432  for (int i = 0; i < C1wal1_N; ++i) {
433  ostringstream ossZID;
434  ossZID << "Z" << i;
435 
436  ostringstream ossRID;
437  ossRID << "R" << i;
438 
439  ostringstream ossrID;
440  ossrID << "r" << i;
441 
442  C1wal1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
443  C1wal1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
444  C1wal1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
445  }
446 
447  C1wal1.transform = G4Translate3D(0., 0., 0.);
448 
449  //define geometry
450  G4Polycone* geo_C1wal1xxx = new G4Polycone("geo_C1wal1xxx_name", 0, 2 * M_PI, C1wal1_N, &(C1wal1_Z[0]), &(C1wal1_r[0]),
451  &(C1wal1_R[0]));
452  G4IntersectionSolid* geo_C1wal1xx = new G4IntersectionSolid("geo_C1wal1xx_name", geo_C1wal1xxx, elements["TubeR"].geo,
453  elements["TubeR"].transform);
454  G4SubtractionSolid* geo_C1wal1x = new G4SubtractionSolid("geo_C1wal1x_name", geo_C1wal1xx, elements["A1spc1"].geo,
455  elements["A1spc1"].transform);
456  C1wal1.geo = new G4SubtractionSolid("geo_C1wal1_name", geo_C1wal1x, elements["B1spc1"].geo, elements["B1spc1"].transform);
457 
458  string strMat_C1wal1 = m_config.getParameterStr(prep + "Material");
459  G4Material* mat_C1wal1 = Materials::get(strMat_C1wal1);
460  C1wal1.logi = new G4LogicalVolume(C1wal1.geo, mat_C1wal1, "logi_C1wal1_name");
461 
462  //put volume
463  setColor(*C1wal1.logi, "#CC0000");
464  setVisibility(*C1wal1.logi, false);
465  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), C1wal1.logi, "phys_C1wal1_name", &topVolume, false, 0);
466 
467  elements["C1wal1"] = C1wal1;
468 
469  //--------------
470  //- D1spc1 and E1spc1
471 
472  // space containing all structures around left HER beam pipe
473  CryostatElement D1spc1;
474  prep = "D1spc1.";
475  const int D1spc1_N = m_config.getParameter(prep + "N");
476 
477  std::vector<double> D1spc1_Z(D1spc1_N);
478  std::vector<double> D1spc1_r(D1spc1_N);
479  std::vector<double> D1spc1_R(D1spc1_N);
480 
481  for (int i = 0; i < D1spc1_N; ++i) {
482  ostringstream ossZID;
483  ossZID << "Z" << i;
484 
485  ostringstream ossRID;
486  ossRID << "R" << i;
487 
488  ostringstream ossrID;
489  ossrID << "r" << i;
490 
491  D1spc1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
492  D1spc1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
493  D1spc1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
494  }
495 
496  D1spc1.transform = transform_HER;
497  G4Polycone* geo_D1spc1xx = new G4Polycone("geo_D1spc1xx_name", 0, 2 * M_PI, D1spc1_N, &(D1spc1_Z[0]), &(D1spc1_r[0]),
498  &(D1spc1_R[0]));
499 
500  // space containing all structures around left LER beam pipe
501  CryostatElement E1spc1;
502  prep = "E1spc1.";
503  const int E1spc1_N = int(m_config.getParameter(prep + "N"));
504 
505  std::vector<double> E1spc1_Z(E1spc1_N);
506  std::vector<double> E1spc1_R(E1spc1_N);
507  std::vector<double> E1spc1_r(E1spc1_N);
508 
509  for (int i = 0; i < E1spc1_N; ++i) {
510  ostringstream ossZID;
511  ossZID << "Z" << i;
512 
513  ostringstream ossRID;
514  ossRID << "R" << i;
515 
516  ostringstream ossrID;
517  ossrID << "r" << i;
518 
519  E1spc1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
520  E1spc1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
521  E1spc1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
522  }
523 
524  E1spc1.transform = transform_LER;
525  G4Polycone* geo_E1spc1xx = new G4Polycone("geo_E1spc1xx_name", 0, 2 * M_PI, E1spc1_N, &(E1spc1_Z[0]), &(E1spc1_r[0]),
526  &(E1spc1_R[0]));
527 
528  // final cut
529  G4IntersectionSolid* geo_D1spc1x = new G4IntersectionSolid("geo_D1spc1x_name", geo_D1spc1xx, elements["TubeL"].geo,
530  D1spc1.transform.inverse());
531  E1spc1.geo = new G4IntersectionSolid("geo_E1spc1_name", geo_E1spc1xx, elements["TubeL"].geo, E1spc1.transform.inverse());
532  D1spc1.geo = new G4SubtractionSolid("geo_D1spc1_name", geo_D1spc1x, E1spc1.geo, D1spc1.transform.inverse()*E1spc1.transform);
533 
534  string strMat_D1spc1 = m_config.getParameterStr("D1spc1.Material");
535  G4Material* mat_D1spc1 = Materials::get(strMat_D1spc1);
536  D1spc1.logi = new G4LogicalVolume(D1spc1.geo, mat_D1spc1, "logi_D1spc1_name");
537  if (flag_limitStep)
538  D1spc1.logi->SetUserLimits(new G4UserLimits(stepMax));
539 
540  //put volume
541  setColor(*D1spc1.logi, "#CC0000");
542  //setVisibility(*D1spc1.logi, false);
543  new G4PVPlacement(D1spc1.transform, D1spc1.logi, "phys_D1spc1_name", &topVolume, false, 0);
544 
545  string strMat_E1spc1 = m_config.getParameterStr(prep + "Material");
546  G4Material* mat_E1spc1 = Materials::get(strMat_E1spc1);
547  E1spc1.logi = new G4LogicalVolume(E1spc1.geo, mat_E1spc1, "logi_E1spc1_name");
548  if (flag_limitStep)
549  E1spc1.logi->SetUserLimits(new G4UserLimits(stepMax));
550 
551  //put volume
552  setColor(*E1spc1.logi, "#CC0000");
553  //setVisibility(*E1spc1.logi, false);
554  new G4PVPlacement(E1spc1.transform, E1spc1.logi, "phys_E1spc1_name", &topVolume, false, 0);
555 
556  elements["E1spc1"] = E1spc1;
557  elements["D1spc1"] = D1spc1;
558 
559 
560  //--------------
561  //- F1wal1
562 
563  //get parameters from .xml file
564  CryostatElement F1wal1;
565  prep = "F1wal1.";
566  const int F1wal1_N = int(m_config.getParameter(prep + "N"));
567 
568  std::vector<double> F1wal1_Z(F1wal1_N);
569  std::vector<double> F1wal1_R(F1wal1_N);
570  std::vector<double> F1wal1_r(F1wal1_N);
571 
572  for (int i = 0; i < F1wal1_N; ++i) {
573  ostringstream ossZID;
574  ossZID << "Z" << i;
575 
576  ostringstream ossRID;
577  ossRID << "R" << i;
578 
579  ostringstream ossrID;
580  ossrID << "r" << i;
581 
582  F1wal1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
583  F1wal1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
584  F1wal1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
585  }
586 
587  F1wal1.transform = G4Translate3D(0., 0., 0.);
588 
589  //define geometry
590  G4Polycone* geo_F1wal1xxx = new G4Polycone("geo_F1wal1xxx_name", 0, 2 * M_PI, F1wal1_N, &(F1wal1_Z[0]), &(F1wal1_r[0]),
591  &(F1wal1_R[0]));
592  G4IntersectionSolid* geo_F1wal1xx = new G4IntersectionSolid("geo_F1wal1xx_name", geo_F1wal1xxx, elements["TubeL"].geo,
593  elements["TubeL"].transform);
594  G4SubtractionSolid* geo_F1wal1x = new G4SubtractionSolid("geo_F1wal1x_name", geo_F1wal1xx, elements["D1spc1"].geo,
595  elements["D1spc1"].transform);
596  F1wal1.geo = new G4SubtractionSolid("geo_F1wal1_name", geo_F1wal1x, elements["E1spc1"].geo, elements["E1spc1"].transform);
597 
598  string strMat_F1wal1 = m_config.getParameterStr(prep + "Material");
599  G4Material* mat_F1wal1 = Materials::get(strMat_F1wal1);
600  F1wal1.logi = new G4LogicalVolume(F1wal1.geo, mat_F1wal1, "logi_F1wal1_name");
601 
602  //put volume
603  setColor(*F1wal1.logi, "#CC0000");
604  setVisibility(*F1wal1.logi, false);
605  new G4PVPlacement(F1wal1.transform, F1wal1.logi, "phys_F1wal1_name", &topVolume, false, 0);
606 
607  elements["F1wal1"] = F1wal1;
608 
609 
610  //--------------
611  //- Rest of elements with typical geometry
612  std::vector<std::string> straightSections;
613  boost::split(straightSections, m_config.getParameterStr("Straight"), boost::is_any_of(" "));
614  for (const auto& name : straightSections) {
615  prep = name + ".";
616 
617  CryostatElement polycone;
618 
619  int N = int(m_config.getParameter(prep + "N"));
620 
621  std::vector<double> Z(N);
622  std::vector<double> R(N);
623  std::vector<double> r(N);
624 
625  for (int i = 0; i < N; ++i) {
626  ostringstream ossZID;
627  ossZID << "Z" << i;
628 
629  ostringstream ossRID;
630  ossRID << "R" << i;
631 
632  ostringstream ossrID;
633  ossrID << "r" << i;
634 
635  Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
636  R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
637  r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
638  }
639 
640  polycone.transform = G4Translate3D(0.0, 0.0, 0.0);
641 
642  //define geometry
643  string motherVolume = m_config.getParameterStr(prep + "MotherVolume");
644  string subtract = m_config.getParameterStr(prep + "Subtract", "");
645  string intersect = m_config.getParameterStr(prep + "Intersect", "");
646 
647  string geo_polyconexx_name = "geo_" + name + "xx_name";
648  string geo_polyconex_name = "geo_" + name + "x_name";
649  string geo_polycone_name = "geo_" + name + "_name";
650 
651  G4VSolid* geo_polyconexx, *geo_polycone;
652 
653  if (subtract != "" && intersect != "") {
654  geo_polyconexx = new G4Polycone(geo_polyconexx_name, 0.0, 2 * M_PI, N, &(Z[0]), &(r[0]), &(R[0]));
655  G4VSolid* geo_polyconex = new G4SubtractionSolid(geo_polyconex_name, geo_polyconexx, elements[subtract].geo,
656  elements[motherVolume].transform.inverse()*polycone.transform.inverse()*elements[subtract].transform);
657  geo_polycone = new G4IntersectionSolid(geo_polycone_name, geo_polyconex, elements[intersect].geo,
658  elements[motherVolume].transform.inverse()*polycone.transform.inverse()*elements[intersect].transform);
659  } else if (subtract != "") {
660  geo_polyconexx = new G4Polycone(geo_polyconexx_name, 0.0, 2 * M_PI, N, &(Z[0]), &(r[0]), &(R[0]));
661  geo_polycone = new G4SubtractionSolid(geo_polycone_name, geo_polyconexx, elements[subtract].geo,
662  elements[motherVolume].transform.inverse()*polycone.transform.inverse()*elements[subtract].transform);
663  } else if (intersect != "") {
664  geo_polyconexx = new G4Polycone(geo_polyconexx_name, 0.0, 2 * M_PI, N, &(Z[0]), &(r[0]), &(R[0]));
665  geo_polycone = new G4IntersectionSolid(geo_polycone_name, geo_polyconexx, elements[intersect].geo,
666  elements[motherVolume].transform.inverse()*polycone.transform.inverse()*elements[intersect].transform);
667  } else
668  geo_polycone = new G4Polycone(geo_polycone_name, 0.0, 2 * M_PI, N, &(Z[0]), &(r[0]), &(R[0]));
669 
670  polycone.geo = geo_polycone;
671 
672  // define logical volume
673  string strMat_polycone = m_config.getParameterStr(prep + "Material");
674  G4Material* mat_polycone = Materials::get(strMat_polycone);
675  string logi_polycone_name = "logi_" + name + "_name";
676  polycone.logi = new G4LogicalVolume(polycone.geo, mat_polycone, logi_polycone_name);
677  setColor(*polycone.logi, "#CC0000");
678  setVisibility(*polycone.logi, false);
679 
680  //put volume
681  string phys_polycone_name = "phys_" + name + "_name";
682  new G4PVPlacement(polycone.transform, polycone.logi, phys_polycone_name, elements[motherVolume].logi, false, 0);
683 
684  //to use it later in "intersect" and "subtract"
685  polycone.transform = polycone.transform * elements[motherVolume].transform;
686 
687  elements[name] = polycone;
688  }
689 
690  // RVC connection structure (simplified shape)
691  G4Tubs* geo_rvcR = new G4Tubs("geo_rvcR", 60, 60 + 60, (620 - 560) / 2., 0, 2 * M_PI);
692  G4LogicalVolume* logi_rvcR = new G4LogicalVolume(geo_rvcR, Materials::get("SUS316L"), "logi_rvcR_name");
693  new G4PVPlacement(0, G4ThreeVector(0, 0, (620 + 560) / 2.), logi_rvcR, "phys_rvcR_name", &topVolume, false, 0);
694 
695  G4Tubs* geo_rvcL = new G4Tubs("geo_rvcL", 60, 60 + 60, (-560 - (-620)) / 2., 0, 2 * M_PI);
696  G4LogicalVolume* logi_rvcL = new G4LogicalVolume(geo_rvcL, Materials::get("SUS316L"), "logi_rvcL_name");
697  new G4PVPlacement(0, G4ThreeVector(0, 0, (-620 - 560) / 2.), logi_rvcL, "phys_rvcL_name", &topVolume, false, 0);
698 
699  // Added 10 Nov 2018
700  // Elliptical inner surface around QC1LE
701  G4EllipticalTube* geo_elp_QC1LEx = new G4EllipticalTube("geo_elp_QC1LEx", 10.5, 13.5, (-675 - (-1225)) / 2.); //in mm
702  G4IntersectionSolid* geo_elp_QC1LE = new G4IntersectionSolid("geo_elp_QC1LE", elements["D2wal1"].geo, geo_elp_QC1LEx,
703  G4Translate3D(0, 0, (-675 - 1225) / 2.));
704  G4LogicalVolume* logi_elp_QC1LE = new G4LogicalVolume(geo_elp_QC1LE, Materials::get("Vacuum"), "logi_elp_QC1LE_name");
705  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_elp_QC1LE, "phys_elp_QC1LE_name", elements["D2wal1"].logi, false, 0);
706  // Elliptical inner surface around QC1LP
707  G4EllipticalTube* geo_elp_QC1LPx = new G4EllipticalTube("geo_elp_QC1LPx", 10.5, 13.5, (-675 - (-1225)) / 2.); //in mm
708  G4IntersectionSolid* geo_elp_QC1LP = new G4IntersectionSolid("geo_elp_QC1LP", elements["E2wal1"].geo, geo_elp_QC1LPx,
709  G4Translate3D(0, 0, (-675 - 1225) / 2.));
710  G4LogicalVolume* logi_elp_QC1LP = new G4LogicalVolume(geo_elp_QC1LP, Materials::get("Vacuum"), "logi_elp_QC1LP_name");
711  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_elp_QC1LP, "phys_elp_QC1LP_name", elements["E2wal1"].logi, false, 0);
712  // Elliptical inner surface around QC1RE
713  G4EllipticalTube* geo_elp_QC1REx = new G4EllipticalTube("geo_elp_QC1REx", 10.5, 13.5, (1225 - 675) / 2.); //in mm
714  G4IntersectionSolid* geo_elp_QC1RE = new G4IntersectionSolid("geo_elp_QC1RE", elements["A2wal1"].geo, geo_elp_QC1REx,
715  G4Translate3D(0, 0, (1225 + 675) / 2.));
716  G4LogicalVolume* logi_elp_QC1RE = new G4LogicalVolume(geo_elp_QC1RE, Materials::get("Vacuum"), "logi_elp_QC1RE_name");
717  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_elp_QC1RE, "phys_elp_QC1RE_name", elements["A2wal1"].logi, false, 0);
718  // Elliptical inner surface around QC1RP
719  G4EllipticalTube* geo_elp_QC1RPx = new G4EllipticalTube("geo_elp_QC1RPx", 10.5, 13.5, (1225 - 675) / 2.); //in mm
720  G4IntersectionSolid* geo_elp_QC1RP = new G4IntersectionSolid("geo_elp_QC1RP", elements["B2wal1"].geo, geo_elp_QC1RPx,
721  G4Translate3D(0, 0, (1225 + 675) / 2.));
722  G4LogicalVolume* logi_elp_QC1RP = new G4LogicalVolume(geo_elp_QC1RP, Materials::get("Vacuum"), "logi_elp_QC1RP_name");
723  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_elp_QC1RP, "phys_elp_QC1RP_name", elements["B2wal1"].logi, false, 0);
724 
725 
726  //---------------------------
727  // for dose simulation
728  //---------------------------
729 
730  /*
731  logi_A1spc1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 101));
732  logi_A1spc2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 102));
733  logi_A2wal1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 103));
734  logi_A3wal1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 104));
735  logi_A3wal2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 105));
736  logi_A4mag1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 106));
737  logi_A4mag2p1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 107));
738  logi_A4mag2p2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 108));
739  logi_A4mag2p3 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 109));
740  logi_A4mag2p4 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 110));
741  logi_A4mag3p1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 111));
742  logi_A4mag3p2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 112));
743  logi_A4mag4p1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 113));
744  logi_A4mag4p2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 114));
745  logi_A4mag4p3 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 115));
746  logi_A4mag4p4 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 116));
747  logi_A4mag4p5 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 117));
748  logi_A4mag4p6 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 118));
749  logi_A4mag4p7 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 119));
750  logi_A4mag4p8 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 120));
751  logi_A4mag4p9 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 121));
752  logi_B1spc1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 122));
753  logi_B1spc2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 123));
754  logi_B2wal1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 124));
755  logi_B3wal1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 125));
756  logi_B3wal2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 126));
757  logi_B4mag1p1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 127));
758  logi_B4mag1p2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 128));
759  logi_B4mag1p3 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 129));
760  logi_B4mag2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 130));
761  logi_B4mag3p1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 131));
762  logi_B4mag3p2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 132));
763  logi_B4mag3p3 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 133));
764  logi_B4mag3p4 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 134));
765  logi_B4mag3p5 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 135));
766  logi_B4mag3p6 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 136));
767  logi_B4mag4p1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 137));
768  logi_B4mag4p7 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 138));
769  logi_B4mag4p8 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 139));
770  logi_B4mag4p9 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 140));
771  logi_C1wal1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 141));
772  logi_C1wal2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 142));
773  logi_C2spc1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 143));
774  logi_C2spc2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 144));
775  logi_C2spc3 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 145));
776  logi_C3wal1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 146));
777  logi_C3wal2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 147));
778  logi_C4spc1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 148));
779  logi_C4spc2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 149));
780  logi_C5wal1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 150));
781  logi_C5wal2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 151));
782  logi_C5wal3 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 152));
783  logi_C6spc1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 153));
784  logi_C6spc2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 154));
785  logi_C7wal1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 155));
786  logi_C7lyr1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 156));
787  logi_C7lyr2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 157));
788  logi_C7lyr3 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 158));
789  logi_C7lyr4 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 159));
790  logi_C7lyr5 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 160));
791  logi_D1spc1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 161));
792  logi_D2wal1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 162));
793  logi_D3wal1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 163));
794  logi_D3wal2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 164));
795  logi_D4mag1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 165));
796  logi_D4mag2p1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 166));
797  logi_D4mag2p2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 167));
798  logi_D4mag2p3 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 168));
799  logi_D4mag2p4 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 169));
800  logi_D4mag3p1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 170));
801  logi_D4mag3p2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 171));
802  logi_D4mag3p3 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 172));
803  logi_D4mag3p4 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 173));
804  logi_D4mag3p5 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 174));
805  logi_D4mag3p6 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 175));
806  logi_E1spc1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 176));
807  logi_E2wal1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 177));
808  logi_E3wal1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 178));
809  logi_E4mag1p1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 179));
810  logi_E4mag1p2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 180));
811  logi_E4mag1p3 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 181));
812  logi_E4mag2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 182));
813  logi_E4mag3p1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 183));
814  logi_E4mag3p2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 184));
815  logi_E4mag3p3 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 185));
816  logi_E4mag3p4 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 186));
817  logi_E4mag3p5 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 187));
818  logi_F1wal1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 188));
819  logi_F1wal2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 189));
820  logi_F2spc1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 190));
821  logi_F2spc2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 191));
822  logi_F2spc3 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 192));
823  logi_F3wal1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 193));
824  logi_F3wal2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 194));
825  logi_F3wal3 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 195));
826  logi_F4spc1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 196));
827  logi_F5wal1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 197));
828  logi_F6spc1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 198));
829  logi_F7lyr1 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 199));
830  logi_F7lyr2 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 200));
831  logi_F7lyr3 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 201));
832  logi_F7lyr4 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 202));
833  logi_F7lyr5 ->SetSensitiveDetector(new BkgSensitiveDetector("IR", 203));
834  */
835 
836  }
837  }
839 }
Belle2::ir::CryostatElement::transform
G4Transform3D transform
Transformation.
Definition: GeoCryostatCreator.h:36
Belle2::geometry::setColor
void setColor(G4LogicalVolume &volume, const std::string &color)
Set the color of a logical volume.
Definition: utilities.cc:107
Belle2::ir::CryostatElement
The struct for CryostatElement.
Definition: GeoCryostatCreator.h:34
Belle2::ir::CryostatElement::logi
G4LogicalVolume * logi
Logical volume.
Definition: GeoCryostatCreator.h:40
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::geometry::setVisibility
void setVisibility(G4LogicalVolume &volume, bool visible)
Helper function to quickly set the visibility of a given volume.
Definition: utilities.cc:115
Belle2::GearDir
GearDir is the basic class used for accessing the parameter store.
Definition: GearDir.h:41
Belle2::ir::SensitiveDetector
The IR Sensitive Detector class.
Definition: SensitiveDetector.h:54
Belle2::geometry::GeometryTypes
GeometryTypes
Flag indiciating the type of geometry to be used.
Definition: GeometryManager.h:39
Belle2::intersect
int intersect(const TRGCDCLpar &lp1, const TRGCDCLpar &lp2, CLHEP::HepVector &v1, CLHEP::HepVector &v2)
intersection
Definition: Lpar.cc:253
Belle2::ir::CryostatElement::geo
G4VSolid * geo
Solid volume.
Definition: GeoCryostatCreator.h:38