Belle II Software  release-06-01-15
GeoBeamPipeCreator.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include <ir/geometry/GeoBeamPipeCreator.h>
10 
11 #include <geometry/Materials.h>
12 #include <geometry/CreatorFactory.h>
13 #include <geometry/utilities.h>
14 #include <framework/gearbox/Unit.h>
15 #include <ir/simulation/SensitiveDetector.h>
16 
17 #include <cmath>
18 #include <boost/format.hpp>
19 #include <boost/foreach.hpp>
20 #include <boost/algorithm/string.hpp>
21 
22 #include <G4LogicalVolume.hh>
23 #include <G4PVPlacement.hh>
24 
25 //Shapes
26 #include <G4Trd.hh>
27 #include <G4Tubs.hh>
28 #include <G4Polycone.hh>
29 #include <G4UnionSolid.hh>
30 #include <G4IntersectionSolid.hh>
31 #include <G4SubtractionSolid.hh>
32 #include <G4UserLimits.hh>
33 
34 using namespace std;
35 using namespace boost;
36 
37 namespace Belle2 {
43  using namespace geometry;
44 
45  namespace ir {
46 
47  //-----------------------------------------------------------------
48  // Register the Creator
49  //-----------------------------------------------------------------
50 
51  geometry::CreatorFactory<GeoBeamPipeCreator> GeoBeamPipeFactory("BeamPipeCreator");
52 
53  //-----------------------------------------------------------------
54  // Implementation
55  //-----------------------------------------------------------------
56 
57  GeoBeamPipeCreator::GeoBeamPipeCreator()
58  {
59  }
60 
61  GeoBeamPipeCreator::~GeoBeamPipeCreator()
62  {
63  //Delete all sensitive detectors
64  BOOST_FOREACH(SensitiveDetector * sensitive, m_sensitive) {
65  delete sensitive;
66  }
67  m_sensitive.clear();
68  }
69 
70  void GeoBeamPipeCreator::createGeometry(G4LogicalVolume& topVolume, GeometryTypes)
71  {
72 
73  //########## Index ##########
74  //
75  // "IP pipe" -9.0 cm to 13.85 cm
76  // Lv1SUS
77  // Lv2OutBe
78  // Lv2InBe
79  // Lv2Paraf
80  // Lv2Vacuum
81  // Lv3AuCoat
82  // "crotch pipe Forward " 13.85 cm to 40.0 cm
83  // Lv1TaFwd
84  // Lv2VacFwd
85  // "crotch pipe Backward " -9.0 cm to -40.0 cm
86  // Lv1TaBwd
87  // Lv2VacBwd
88  // "beam pipe more Forward " 40.0 cm to 63.35 cm
89  // Lv1TaLERUp
90  // Lv2VacLERUp
91  // Lv1TaHERDwn
92  // Lv2VacHERDwn
93  // "beam pipe more Backward " -40.0 cm to -62.725 cm
94  // Lv1TaHERUp
95  // Lv2VacHERUp
96  // Lv1TaLERDwn
97  // Lv2VacLERDwn
98  //
99  //###########################
100 
101  double SafetyLength = m_config.getParameter("Safety.L1") * Unit::cm / Unit::mm;
102 
103  double stepMax = 5.0 * Unit::mm;
104  int flag_limitStep = int(m_config.getParameter("LimitStepLength"));
105 
106  double A11 = 0.03918;
107 
110 
111  //----------
112  //- Lv1SUS
113 
114  //get parameters from .xml file
115  std::string prep = "Lv1SUS.";
116  //
117  const int Lv1SUS_num = 21;
118  //
119  double Lv1SUS_Z[Lv1SUS_num];
120  Lv1SUS_Z[0] = 0.0;
121  for (int tmpn = 0; tmpn < 8; tmpn++) {
122  Lv1SUS_Z[0] -= m_config.getParameter(prep + (format("L%1%") % (tmpn + 1)).str().c_str()) * Unit::cm / Unit::mm;
123  }
124  Lv1SUS_Z[1] = Lv1SUS_Z[0] + m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
125  Lv1SUS_Z[2] = Lv1SUS_Z[1];
126  Lv1SUS_Z[3] = Lv1SUS_Z[2] + m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
127  Lv1SUS_Z[4] = Lv1SUS_Z[3] + m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
128  Lv1SUS_Z[5] = Lv1SUS_Z[4];
129  Lv1SUS_Z[6] = Lv1SUS_Z[5] + m_config.getParameter(prep + "L4") * Unit::cm / Unit::mm;
130  Lv1SUS_Z[7] = Lv1SUS_Z[6] + m_config.getParameter(prep + "L5") * Unit::cm / Unit::mm;
131  Lv1SUS_Z[8] = Lv1SUS_Z[7] + m_config.getParameter(prep + "L6") * Unit::cm / Unit::mm;
132  Lv1SUS_Z[9] = Lv1SUS_Z[8] + m_config.getParameter(prep + "L7") * Unit::cm / Unit::mm;
133  Lv1SUS_Z[10] = Lv1SUS_Z[9] + m_config.getParameter(prep + "L8") * Unit::cm / Unit::mm;
134  Lv1SUS_Z[11] = Lv1SUS_Z[10] + m_config.getParameter(prep + "L9") * Unit::cm / Unit::mm;
135  Lv1SUS_Z[12] = Lv1SUS_Z[11] + m_config.getParameter(prep + "L10") * Unit::cm / Unit::mm;
136  Lv1SUS_Z[13] = Lv1SUS_Z[12] + m_config.getParameter(prep + "L11") * Unit::cm / Unit::mm;
137  Lv1SUS_Z[14] = Lv1SUS_Z[13] + m_config.getParameter(prep + "L12") * Unit::cm / Unit::mm;
138  Lv1SUS_Z[15] = Lv1SUS_Z[14] + m_config.getParameter(prep + "L13") * Unit::cm / Unit::mm;
139  Lv1SUS_Z[16] = Lv1SUS_Z[15];
140  Lv1SUS_Z[17] = Lv1SUS_Z[16] + m_config.getParameter(prep + "L14") * Unit::cm / Unit::mm;
141  Lv1SUS_Z[18] = Lv1SUS_Z[17] + m_config.getParameter(prep + "L15") * Unit::cm / Unit::mm;
142  Lv1SUS_Z[19] = Lv1SUS_Z[18];
143  Lv1SUS_Z[20] = Lv1SUS_Z[19] + m_config.getParameter(prep + "L16") * Unit::cm / Unit::mm;
144  //
145  double Lv1SUS_rI[Lv1SUS_num];
146  for (int tmpn = 0; tmpn < Lv1SUS_num; tmpn++)
147  { Lv1SUS_rI[tmpn] = 0.0; }
148  //m_config.getParameter(prep+"L1")
149  double Lv1SUS_rO[Lv1SUS_num];
150  Lv1SUS_rO[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
151  Lv1SUS_rO[1] = Lv1SUS_rO[0];
152  Lv1SUS_rO[2] = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
153  Lv1SUS_rO[3] = Lv1SUS_rO[2];
154  Lv1SUS_rO[4] = m_config.getParameter(prep + "R3") * Unit::cm / Unit::mm;
155  Lv1SUS_rO[5] = m_config.getParameter(prep + "R4") * Unit::cm / Unit::mm;
156  Lv1SUS_rO[6] = Lv1SUS_rO[5];
157  Lv1SUS_rO[7] = m_config.getParameter(prep + "R5") * Unit::cm / Unit::mm;
158  Lv1SUS_rO[8] = Lv1SUS_rO[7];
159  Lv1SUS_rO[9] = m_config.getParameter(prep + "R6") * Unit::cm / Unit::mm;
160  Lv1SUS_rO[10] = Lv1SUS_rO[9];
161  Lv1SUS_rO[11] = Lv1SUS_rO[10];
162  Lv1SUS_rO[12] = m_config.getParameter(prep + "R7") * Unit::cm / Unit::mm;
163  Lv1SUS_rO[13] = Lv1SUS_rO[12];
164  Lv1SUS_rO[14] = m_config.getParameter(prep + "R8") * Unit::cm / Unit::mm;
165  Lv1SUS_rO[15] = Lv1SUS_rO[14];
166  Lv1SUS_rO[16] = m_config.getParameter(prep + "R9") * Unit::cm / Unit::mm;
167  Lv1SUS_rO[17] = m_config.getParameter(prep + "R10") * Unit::cm / Unit::mm;
168  Lv1SUS_rO[18] = Lv1SUS_rO[17];
169  Lv1SUS_rO[19] = m_config.getParameter(prep + "R11") * Unit::cm / Unit::mm;
170  Lv1SUS_rO[20] = Lv1SUS_rO[19];
171  //
172  string strMat_Lv1SUS = m_config.getParameterStr(prep + "Material");
173  G4Material* mat_Lv1SUS = Materials::get(strMat_Lv1SUS);
174 
175  //define geometry
176  G4Polycone* geo_Lv1SUS = new G4Polycone("geo_Lv1SUS_name", 0, 2 * M_PI, Lv1SUS_num, Lv1SUS_Z, Lv1SUS_rI, Lv1SUS_rO);
177  G4LogicalVolume* logi_Lv1SUS = new G4LogicalVolume(geo_Lv1SUS, mat_Lv1SUS, "logi_Lv1SUS_name");
178 
179  //for (int i=0;i<Lv1SUS_num;i++)printf("%f %f\n",Lv1SUS_Z[i],Lv1SUS_rO[i]);
180 
181  //- put volume
182  setColor(*logi_Lv1SUS, "#666666");
183  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv1SUS, "phys_Lv1SUS_name", &topVolume, false, 0);
184 
185 
186  //----------
187  //- Lv2OutTi added for Phase 3.
188  //-
189  //----------
190  //get parameters from .xml file
191  if (m_config.getParameter("Lv2OutTi.L1", -1) > 0) {
192  prep = "Lv2OutTi.";
193  //
194  const int Lv2OutTi_num = 2;
195  //
196  double Lv2OutTi_Z[Lv2OutTi_num];
197  Lv2OutTi_Z[0] = -m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
198  Lv2OutTi_Z[1] = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
199  //
200  double Lv2OutTi_rI[Lv2OutTi_num];
201  Lv2OutTi_rI[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
202  Lv2OutTi_rI[1] = Lv2OutTi_rI[0];
203  //
204  double Lv2OutTi_rO[Lv2OutTi_num];
205  Lv2OutTi_rO[0] = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
206  Lv2OutTi_rO[1] = Lv2OutTi_rO[0];
207  //
208  string strMat_Lv2OutTi = m_config.getParameterStr(prep + "Material");
209  G4Material* mat_Lv2OutTi = Materials::get(strMat_Lv2OutTi);
210 
211  //define geometry
212  G4Polycone* geo_Lv2OutTi = new G4Polycone("geo_Lv2OutTi_name", 0, 2 * M_PI, Lv2OutTi_num, Lv2OutTi_Z, Lv2OutTi_rI, Lv2OutTi_rO);
213  G4LogicalVolume* logi_Lv2OutTi = new G4LogicalVolume(geo_Lv2OutTi, mat_Lv2OutTi, "logi_Lv2OutTi_name");
214 
215  //- put volume
216  setColor(*logi_Lv2OutTi, "#333300");
217  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2OutTi, "phys_Lv2OutTi_name", logi_Lv1SUS, false, 0);
218  }
219 
220 
221  //----------
222  //- Lv2OutBe
223  //-
224  //----------
225 
226  //get parameters from .xml file
227  prep = "Lv2OutBe.";
228  //
229  const int Lv2OutBe_num = 2;
230  //
231  double Lv2OutBe_Z[Lv2OutBe_num];
232  Lv2OutBe_Z[0] = -m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
233  Lv2OutBe_Z[1] = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
234  //
235  double Lv2OutBe_rI[Lv2OutBe_num];
236  Lv2OutBe_rI[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
237  Lv2OutBe_rI[1] = Lv2OutBe_rI[0];
238  //
239  double Lv2OutBe_rO[Lv2OutBe_num];
240  Lv2OutBe_rO[0] = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
241  Lv2OutBe_rO[1] = Lv2OutBe_rO[0];
242  //
243  string strMat_Lv2OutBe = m_config.getParameterStr(prep + "Material");
244  G4Material* mat_Lv2OutBe = Materials::get(strMat_Lv2OutBe);
245 
246  //define geometry
247  G4Polycone* geo_Lv2OutBe = new G4Polycone("geo_Lv2OutBe_name", 0, 2 * M_PI, Lv2OutBe_num, Lv2OutBe_Z, Lv2OutBe_rI, Lv2OutBe_rO);
248  G4LogicalVolume* logi_Lv2OutBe = new G4LogicalVolume(geo_Lv2OutBe, mat_Lv2OutBe, "logi_Lv2OutBe_name");
249 
250  //- put volume
251  setColor(*logi_Lv2OutBe, "#333300");
252  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2OutBe, "phys_Lv2OutBe_name", logi_Lv1SUS, false, 0);
253 
254 
255  //----------
256  //- Lv2InBe
257  //-
258  //----------
259 
260  //get parameters from .xml file
261  prep = "Lv2InBe.";
262  //
263  const int Lv2InBe_num = 2;
264  //
265  double Lv2InBe_Z[Lv2InBe_num];
266  Lv2InBe_Z[0] = -m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
267  Lv2InBe_Z[1] = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
268  //
269  double Lv2InBe_rI[Lv2InBe_num];
270  Lv2InBe_rI[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
271  Lv2InBe_rI[1] = Lv2InBe_rI[0];
272  //
273  double Lv2InBe_rO[Lv2InBe_num];
274  Lv2InBe_rO[0] = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
275  Lv2InBe_rO[1] = Lv2InBe_rO[0];
276  //
277  string strMat_Lv2InBe = m_config.getParameterStr(prep + "Material");
278  G4Material* mat_Lv2InBe = Materials::get(strMat_Lv2InBe);
279 
280  //define geometry
281  G4Polycone* geo_Lv2InBe = new G4Polycone("geo_Lv2InBe_name", 0, 2 * M_PI, Lv2InBe_num, Lv2InBe_Z, Lv2InBe_rI, Lv2InBe_rO);
282  G4LogicalVolume* logi_Lv2InBe = new G4LogicalVolume(geo_Lv2InBe, mat_Lv2InBe, "logi_Lv2InBe_name");
283 
284  //- put volume
285  setColor(*logi_Lv2InBe, "#333300");
286  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2InBe, "phys_Lv2InBe_name", logi_Lv1SUS, false, 0);
287 
288  //----------
289  //- Lv2Vacuum
290 
291  //get parameters from .xml file
292  prep = "Lv2Vacuum.";
293  //
294  double Lv2Vacuum_L1 = m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
295  double Lv2Vacuum_L2 = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
296  double Lv2Vacuum_L3 = m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
297  double Lv2Vacuum_L4 = m_config.getParameter(prep + "L4") * Unit::cm / Unit::mm;
298  double Lv2Vacuum_R1 = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
299  double Lv2Vacuum_R2 = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
300  double Lv2Vacuum_R3 = m_config.getParameter(prep + "R3") * Unit::cm / Unit::mm;
301  //double Lv2Vacuum_A1 = cLv2Vacuum.getAngle("A1");
302  double Lv2Vacuum_A2 = m_config.getParameter(prep + "A2");
303  //
304  string strMat_Lv2Vacuum = m_config.getParameterStr(prep + "Material");
305  G4Material* mat_Lv2Vacuum = Materials::get(strMat_Lv2Vacuum);
306  //
307  // Part 1
308  const int Lv2Vacuum1_num = 2;
309  //
310  double Lv2Vacuum1_Z[Lv2Vacuum1_num];
311  Lv2Vacuum1_Z[0] = -Lv2Vacuum_L1;
312  Lv2Vacuum1_Z[1] = Lv2Vacuum_L2;
313  double Lv2Vacuum1_rI[Lv2Vacuum1_num];
314  for (int tmpn = 0; tmpn < Lv2Vacuum1_num; tmpn++)
315  { Lv2Vacuum1_rI[tmpn] = 0.0; }
316  double Lv2Vacuum1_rO[Lv2Vacuum1_num];
317  Lv2Vacuum1_rO[0] = Lv2Vacuum_R1;
318  Lv2Vacuum1_rO[1] = Lv2Vacuum_R1;
319  // Part 2
320  double Lv2Vacuum2_Z1 = 2. * Lv2Vacuum_L3;
321  double Lv2Vacuum2_rI1 = 0.0;
322  double Lv2Vacuum2_rO1 = Lv2Vacuum_R2;
323  //
324  double Lv2Vacuum2_Z2 = (Lv2Vacuum_L3 * cos(Lv2Vacuum_A2)) + SafetyLength;
325  double Lv2Vacuum2_rI2 = 0.0;
326  double Lv2Vacuum2_rO2 = 2 * Lv2Vacuum_R2;
327  // Part 3
328  const int Lv2Vacuum3_num = 2;
329  //
330  double Lv2Vacuum3_Z[Lv2Vacuum3_num];
331  Lv2Vacuum3_Z[0] = 0.0;
332  Lv2Vacuum3_Z[1] = Lv2Vacuum_L4;
333  double Lv2Vacuum3_rI[Lv2Vacuum3_num];
334  for (int tmpn = 0; tmpn < Lv2Vacuum3_num; tmpn++)
335  { Lv2Vacuum3_rI[tmpn] = 0.0; }
336  double Lv2Vacuum3_rO[Lv2Vacuum3_num];
337  Lv2Vacuum3_rO[0] = Lv2Vacuum_R3;
338  Lv2Vacuum3_rO[1] = Lv2Vacuum_R3;
339 
340  //define geometry
341  // Part 1
342  G4Polycone* geo_Lv2VacuumPart1 = new G4Polycone("geo_Lv2VacuumPart1_name", 0, 2 * M_PI, Lv2Vacuum1_num, Lv2Vacuum1_Z, Lv2Vacuum1_rI,
343  Lv2Vacuum1_rO);
344  // Part 2
345  G4Tubs* geo_Lv2VacuumPart2_1 = new G4Tubs("geo_Lv2VacuumPart2_1_name", Lv2Vacuum2_rI1, Lv2Vacuum2_rO1, Lv2Vacuum2_Z1, 0, 2 * M_PI);
346  G4Tubs* geo_Lv2VacuumPart2_2 = new G4Tubs("geo_Lv2VacuumPart2_2_name", Lv2Vacuum2_rI2, Lv2Vacuum2_rO2, Lv2Vacuum2_Z2, 0, 2 * M_PI);
347  G4Transform3D transform_Lv2VacuumPart2_2 = G4Translate3D(0., 0., 0.);
348  transform_Lv2VacuumPart2_2 = transform_Lv2VacuumPart2_2 * G4RotateY3D(-Lv2Vacuum_A2);
349  G4IntersectionSolid* geo_Lv2VacuumPart2 = new G4IntersectionSolid("geo_Lv2VacuumPart2_name", geo_Lv2VacuumPart2_1,
350  geo_Lv2VacuumPart2_2, transform_Lv2VacuumPart2_2);
351  // Part 3
352  G4Polycone* geo_Lv2VacuumPart3 = new G4Polycone("geo_Lv2VacuumPart3_name", 0, 2 * M_PI, Lv2Vacuum3_num, Lv2Vacuum3_Z, Lv2Vacuum3_rI,
353  Lv2Vacuum3_rO);
354  // Part1+2+3
355 // G4Transform3D transform_Lv2VacuumPart3 = G4Translate3D(0., 0., 0.);
356  G4Transform3D transform_Lv2VacuumPart3 = G4Translate3D(-0.5, 0., 0.);
357  // A11 instead of A1
358  transform_Lv2VacuumPart3 = transform_Lv2VacuumPart3 * G4RotateY3D(-A11);
359  G4UnionSolid* geo_Lv2Vacuumxx = new G4UnionSolid("geo_Lv2Vacuumxx_name", geo_Lv2VacuumPart1, geo_Lv2VacuumPart3,
360  transform_Lv2VacuumPart3);
361  G4Transform3D transform_Lv2VacuumPart2 = G4Translate3D(Lv2Vacuum_L3 * sin(Lv2Vacuum_A2), 0.,
362  Lv2Vacuum_L2 + Lv2Vacuum_L3 * cos(Lv2Vacuum_A2));
363  transform_Lv2VacuumPart2 = transform_Lv2VacuumPart2 * G4RotateY3D(Lv2Vacuum_A2);
364  G4UnionSolid* geo_Lv2Vacuumx = new G4UnionSolid("geo_Lv2Vacuumx_name", geo_Lv2Vacuumxx, geo_Lv2VacuumPart2,
365  transform_Lv2VacuumPart2);
366  // Intersection with mother
367  G4IntersectionSolid* geo_Lv2Vacuum = new G4IntersectionSolid("geo_Lv2Vacuum_name", geo_Lv2Vacuumx, geo_Lv1SUS);
368  G4LogicalVolume* logi_Lv2Vacuum = new G4LogicalVolume(geo_Lv2Vacuum, mat_Lv2Vacuum, "logi_Lv2Vacuum_name");
369  if (flag_limitStep) logi_Lv2Vacuum->SetUserLimits(new G4UserLimits(stepMax));
370 
371  //- put volume
372  setColor(*logi_Lv2Vacuum, "#CCCCCC");
373  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2Vacuum, "phys_Lv2Vacuum_name", logi_Lv1SUS, false, 0);
374 
375  //-
376  //----------
377 
378  //----------
379  //- Lv2Paraf
380 
381  //get parameters from .xml file
382  prep = "Lv2Paraf.";
383  //
384  const int Lv2Paraf1_num = 20;
385  const int Lv2Paraf2_num = 3;
386  //
387  double Lv2Paraf1_Z[Lv2Paraf1_num];
388  Lv2Paraf1_Z[0] = 0.0;
389  for (int tmpn = 0; tmpn < 9; tmpn++) {
390  Lv2Paraf1_Z[0] -= m_config.getParameter(prep + (format("L%1%") % (tmpn + 1)).str().c_str()) * Unit::cm / Unit::mm;
391  }
392  Lv2Paraf1_Z[1] = Lv2Paraf1_Z[0] + m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
393  Lv2Paraf1_Z[2] = Lv2Paraf1_Z[1];
394  Lv2Paraf1_Z[3] = Lv2Paraf1_Z[2] + m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
395  Lv2Paraf1_Z[4] = Lv2Paraf1_Z[3] + m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
396  Lv2Paraf1_Z[5] = Lv2Paraf1_Z[4] + m_config.getParameter(prep + "L4") * Unit::cm / Unit::mm;
397  Lv2Paraf1_Z[6] = Lv2Paraf1_Z[5] + m_config.getParameter(prep + "L5") * Unit::cm / Unit::mm;
398  Lv2Paraf1_Z[7] = Lv2Paraf1_Z[6] + m_config.getParameter(prep + "L6") * Unit::cm / Unit::mm;
399  Lv2Paraf1_Z[8] = Lv2Paraf1_Z[7] + m_config.getParameter(prep + "L7") * Unit::cm / Unit::mm;
400  Lv2Paraf1_Z[9] = Lv2Paraf1_Z[8] + m_config.getParameter(prep + "L8") * Unit::cm / Unit::mm;
401  Lv2Paraf1_Z[10] = Lv2Paraf1_Z[9] + m_config.getParameter(prep + "L9") * Unit::cm / Unit::mm + m_config.getParameter(
402  prep + "L10") * Unit::cm / Unit::mm;
403  Lv2Paraf1_Z[11] = Lv2Paraf1_Z[10] + m_config.getParameter(prep + "L11") * Unit::cm / Unit::mm;
404  Lv2Paraf1_Z[12] = Lv2Paraf1_Z[11] + m_config.getParameter(prep + "L12") * Unit::cm / Unit::mm;
405  Lv2Paraf1_Z[13] = Lv2Paraf1_Z[12] + m_config.getParameter(prep + "L13") * Unit::cm / Unit::mm;
406  Lv2Paraf1_Z[14] = Lv2Paraf1_Z[13] + m_config.getParameter(prep + "L14") * Unit::cm / Unit::mm;
407  Lv2Paraf1_Z[15] = Lv2Paraf1_Z[14] + m_config.getParameter(prep + "L15") * Unit::cm / Unit::mm + m_config.getParameter(
408  prep + "L16") * Unit::cm / Unit::mm;
409  Lv2Paraf1_Z[16] = Lv2Paraf1_Z[15] + m_config.getParameter(prep + "L17") * Unit::cm / Unit::mm + m_config.getParameter(
410  prep + "L18") * Unit::cm / Unit::mm;
411  Lv2Paraf1_Z[17] = Lv2Paraf1_Z[16] + m_config.getParameter(prep + "L19") * Unit::cm / Unit::mm;
412  Lv2Paraf1_Z[18] = Lv2Paraf1_Z[17];
413  Lv2Paraf1_Z[19] = Lv2Paraf1_Z[18] + m_config.getParameter(prep + "L20") * Unit::cm / Unit::mm;
414  //
415  double Lv2Paraf1_rI[Lv2Paraf1_num];
416  Lv2Paraf1_rI[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
417  Lv2Paraf1_rI[1] = Lv2Paraf1_rI[0];
418  Lv2Paraf1_rI[2] = Lv2Paraf1_rI[1];
419  Lv2Paraf1_rI[3] = Lv2Paraf1_rI[2];
420  Lv2Paraf1_rI[4] = Lv2Paraf1_rI[3];
421  Lv2Paraf1_rI[5] = Lv2Paraf1_rI[4];
422  Lv2Paraf1_rI[6] = Lv2Paraf1_rI[5];
423  Lv2Paraf1_rI[7] = m_config.getParameter(prep + "R6") * Unit::cm / Unit::mm;
424  Lv2Paraf1_rI[8] = Lv2Paraf1_rI[7];
425  Lv2Paraf1_rI[9] = Lv2Paraf1_rI[8];
426  Lv2Paraf1_rI[10] = Lv2Paraf1_rI[9];
427  Lv2Paraf1_rI[11] = Lv2Paraf1_rI[10];
428  Lv2Paraf1_rI[12] = Lv2Paraf1_rI[11];
429  Lv2Paraf1_rI[13] = m_config.getParameter(prep + "R9") * Unit::cm / Unit::mm;
430  Lv2Paraf1_rI[14] = Lv2Paraf1_rI[13];
431  Lv2Paraf1_rI[15] = Lv2Paraf1_rI[14];
432  Lv2Paraf1_rI[16] = Lv2Paraf1_rI[15];
433  Lv2Paraf1_rI[17] = Lv2Paraf1_rI[16];
434  Lv2Paraf1_rI[18] = Lv2Paraf1_rI[17];
435  Lv2Paraf1_rI[19] = Lv2Paraf1_rI[18];
436  //
437  double Lv2Paraf1_rO[Lv2Paraf1_num];
438  Lv2Paraf1_rO[0] = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
439  Lv2Paraf1_rO[1] = Lv2Paraf1_rO[0];
440  Lv2Paraf1_rO[2] = m_config.getParameter(prep + "R3") * Unit::cm / Unit::mm;
441  Lv2Paraf1_rO[3] = m_config.getParameter(prep + "R4") * Unit::cm / Unit::mm;
442  Lv2Paraf1_rO[4] = Lv2Paraf1_rO[3];
443  Lv2Paraf1_rO[5] = m_config.getParameter(prep + "R5") * Unit::cm / Unit::mm;
444  Lv2Paraf1_rO[6] = Lv2Paraf1_rO[5];
445  Lv2Paraf1_rO[7] = Lv2Paraf1_rO[6];
446  Lv2Paraf1_rO[8] = Lv2Paraf1_rO[7];
447  Lv2Paraf1_rO[9] = m_config.getParameter(prep + "R7") * Unit::cm / Unit::mm;
448  Lv2Paraf1_rO[10] = Lv2Paraf1_rO[9];
449  Lv2Paraf1_rO[11] = m_config.getParameter(prep + "R8") * Unit::cm / Unit::mm;
450  Lv2Paraf1_rO[12] = Lv2Paraf1_rO[11];
451  Lv2Paraf1_rO[13] = Lv2Paraf1_rO[12];
452  Lv2Paraf1_rO[14] = Lv2Paraf1_rO[13];
453  Lv2Paraf1_rO[15] = m_config.getParameter(prep + "R10") * Unit::cm / Unit::mm;
454  Lv2Paraf1_rO[16] = Lv2Paraf1_rO[15];
455  Lv2Paraf1_rO[17] = m_config.getParameter(prep + "R12") * Unit::cm / Unit::mm;
456  Lv2Paraf1_rO[18] = m_config.getParameter(prep + "R13") * Unit::cm / Unit::mm;
457  Lv2Paraf1_rO[19] = Lv2Paraf1_rO[18];
458  //
459  //
460  double Lv2Paraf2_Z[Lv2Paraf2_num];
461  Lv2Paraf2_Z[0] = 0.0;
462  for (int tmpn = 10; tmpn <= 15; tmpn++) {
463  Lv2Paraf2_Z[0] += m_config.getParameter(prep + (format("L%1%") % tmpn).str().c_str()) * Unit::cm / Unit::mm;
464  }
465  Lv2Paraf2_Z[1] = Lv2Paraf2_Z[0] + m_config.getParameter(prep + "L16") * Unit::cm / Unit::mm + m_config.getParameter(
466  prep + "L17") * Unit::cm / Unit::mm;
467  Lv2Paraf2_Z[2] = Lv2Paraf2_Z[1] + m_config.getParameter(prep + "L18") * Unit::cm / Unit::mm + m_config.getParameter(
468  prep + "L19") * Unit::cm / Unit::mm +
469  m_config.getParameter(prep + "L20") * Unit::cm / Unit::mm + 1.0;
470  //
471  double Lv2Paraf2_rI[Lv2Paraf2_num];
472  for (int tmpn = 0; tmpn < Lv2Paraf2_num; tmpn++)
473  { Lv2Paraf2_rI[tmpn] = 0.0; }
474  //
475  double Lv2Paraf2_rO[Lv2Paraf2_num];
476  Lv2Paraf2_rO[0] = m_config.getParameter(prep + "R9") * Unit::cm / Unit::mm;
477  Lv2Paraf2_rO[1] = m_config.getParameter(prep + "R11") * Unit::cm / Unit::mm;
478  Lv2Paraf2_rO[2] = Lv2Paraf2_rO[1];
479  //
480  string strMat_Lv2Paraf = m_config.getParameterStr(prep + "Material");
481  G4Material* mat_Lv2Paraf = Materials::get(strMat_Lv2Paraf);
482 
483  //define geometry
484  G4Polycone* geo_Lv2Parafpcon1 = new G4Polycone("geo_Lv2Parafpcon1_name", 0, 2 * M_PI, Lv2Paraf1_num, Lv2Paraf1_Z, Lv2Paraf1_rI,
485  Lv2Paraf1_rO);
486  G4Polycone* geo_Lv2Parafpcon2 = new G4Polycone("geo_Lv2Parafpcon2_name", 0, 2 * M_PI, Lv2Paraf2_num, Lv2Paraf2_Z, Lv2Paraf2_rI,
487  Lv2Paraf2_rO);
488  G4SubtractionSolid* geo_Lv2Paraf = new G4SubtractionSolid("geo_Lv2Paraf_name", geo_Lv2Parafpcon1, geo_Lv2Parafpcon2);
489  G4LogicalVolume* logi_Lv2Paraf = new G4LogicalVolume(geo_Lv2Paraf, mat_Lv2Paraf, "logi_Lv2Paraf_name");
490 
491  //- put volume
492  setColor(*logi_Lv2Paraf, "#00CCCC");
493  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2Paraf, "phys_Lv2Paraf_name", logi_Lv1SUS, false, 0);
494 
495  //-
496  //----------
497 
498  //----------
499  //- Lv3AuCoat
500 
501  //get parameters from .xml file
502  prep = "Lv3AuCoat.";
503  //
504  const int Lv3AuCoat_num = 2;
505  //
506  double Lv3AuCoat_Z[Lv3AuCoat_num];
507  Lv3AuCoat_Z[0] = -m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
508  Lv3AuCoat_Z[1] = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
509  //
510  double Lv3AuCoat_rI[Lv3AuCoat_num];
511  Lv3AuCoat_rI[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
512  Lv3AuCoat_rI[1] = Lv3AuCoat_rI[0];
513  //
514  double Lv3AuCoat_rO[Lv3AuCoat_num];
515  Lv3AuCoat_rO[0] = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
516  Lv3AuCoat_rO[1] = Lv3AuCoat_rO[0];
517  //
518  string strMat_Lv3AuCoat = m_config.getParameterStr(prep + "Material");
519  G4Material* mat_Lv3AuCoat = Materials::get(strMat_Lv3AuCoat);
520 
521  //define geometry
522  G4Polycone* geo_Lv3AuCoat = new G4Polycone("geo_Lv3AuCoat_name", 0, 2 * M_PI, Lv3AuCoat_num, Lv3AuCoat_Z, Lv3AuCoat_rI,
523  Lv3AuCoat_rO);
524  G4LogicalVolume* logi_Lv3AuCoat = new G4LogicalVolume(geo_Lv3AuCoat, mat_Lv3AuCoat, "logi_Lv3AuCoat_name");
525 
526  //- put volume
527  setColor(*logi_Lv3AuCoat, "#CCCC00");
528  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv3AuCoat, "phys_Lv3AuCoat_name", logi_Lv2Vacuum, false, 0);
529 
530  //-
531  //----------
532 
535 
536  //get parameters from .xml file
537  prep = "Flange.";
538  //
539  double Flange_R = m_config.getParameter(prep + "R") * Unit::cm / Unit::mm;
540  double Flange_L1 = m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
541  //double Flange_L2 = m_config.getParameter(prep+"L2") * Unit::cm / Unit::mm;// Not used (2015/April/16. masked by T.Hara)
542  double Flange_D = m_config.getParameter(prep + "D") * Unit::cm / Unit::mm;
543  double Flange_T = m_config.getParameter(prep + "T") * Unit::cm / Unit::mm;
544 
545  //define geometry
546  //G4Box* geo_Flange0 = new G4Box("geo_Flange0_name", Flange_L2, Flange_R, Flange_T);
547  G4Tubs* geo_Flange0 = new G4Tubs("geo_Flange0_name", 0, 424 * Unit::mm, Flange_T, 0, 2 * M_PI);
548  G4Tubs* geo_Flange1 = new G4Tubs("geo_Flange1_name", 0, Flange_R, Flange_T, 0, 2 * M_PI);
549  G4Tubs* geo_Flange2 = new G4Tubs("geo_Flange2_name", 0, Flange_R, Flange_T, 0, 2 * M_PI);
550 
551  G4UnionSolid* geo_Flange_x = new G4UnionSolid("geo_Flange_x_name", geo_Flange1, geo_Flange2, G4Translate3D(-Flange_L1 * 2, 0, 0));
552  G4IntersectionSolid* geo_Flange = new G4IntersectionSolid("geo_Flange_name", geo_Flange0, geo_Flange_x, G4Translate3D(Flange_L1, 0,
553  0));
554 
555 
558 
561 
562 
563  //----------
564  //- Lv1TaFwd
565 
566  //get parameters from .xml file
567  prep = "Lv1TaFwd.";
568  //
569  double Lv1TaFwd_D1 = m_config.getParameter(prep + "D1") * Unit::cm / Unit::mm;
570  double Lv1TaFwd_L1 = m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
571  double Lv1TaFwd_L2 = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
572  double Lv1TaFwd_L3 = m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
573  double Lv1TaFwd_T1 = m_config.getParameter(prep + "T1") * Unit::cm / Unit::mm;
574  //
575  string strMat_Lv1TaFwd = m_config.getParameterStr(prep + "Material");
576  G4Material* mat_Lv1TaFwd = Materials::get(strMat_Lv1TaFwd);
577 
578  //define geometry
579  G4Trd* geo_Lv1TaFwd_xx = new G4Trd("geo_Lv1TaFwd_xx_name", Lv1TaFwd_L2, Lv1TaFwd_L3, Lv1TaFwd_T1, Lv1TaFwd_T1, Lv1TaFwd_L1 / 2.0);
580  G4UnionSolid* geo_Lv1TaFwd_x
581  = new G4UnionSolid("geo_Lv1TaFwd_x_name", geo_Lv1TaFwd_xx, geo_Flange,
582  G4Translate3D(0, 0, Flange_D - (Lv1TaFwd_D1 + Lv1TaFwd_L1 / 2.0)));
583 
584  //===MODIFY ME!!===
585  //avoid overlap with HeavyMetalShield
586  double HMS_Z[4] = {350, 410, 450, 482};
587  double HMS_rI[4] = {35.5, 35.5, 42.5, 42.5};
588  double HMS_rO[4] = {100, 100, 100, 100};
589  G4Polycone* geo_HMS = new G4Polycone("geo_HMS_name", 0, 2 * M_PI, 4, HMS_Z, HMS_rI, HMS_rO);
590  G4SubtractionSolid* geo_Lv1TaFwd = new G4SubtractionSolid("geo_Lv1TaFwd_name", geo_Lv1TaFwd_x, geo_HMS,
591  G4Translate3D(0, 0, -(Lv1TaFwd_D1 + Lv1TaFwd_L1 / 2.0)));
592 
593  G4LogicalVolume* logi_Lv1TaFwd = new G4LogicalVolume(geo_Lv1TaFwd, mat_Lv1TaFwd, "logi_Lv1TaFwd_name");
594 
595  //- put volume at (0.,0.,D1 + L1/2)
596  setColor(*logi_Lv1TaFwd, "#333333");
597  new G4PVPlacement(0, G4ThreeVector(0, 0, Lv1TaFwd_D1 + Lv1TaFwd_L1 / 2.0), logi_Lv1TaFwd, "phys_Lv1TaFwd_name", &topVolume, false,
598  0);
599 
600 
601  //----------
602  //- Lv2VacFwd
603 
604  //get parameters from .xml file
605  prep = "Lv2VacFwd.";
606  //
607  double Lv2VacFwd_D1 = m_config.getParameter(prep + "D1") * Unit::cm / Unit::mm;
608  double Lv2VacFwd_D2 = m_config.getParameter(prep + "D2") * Unit::cm / Unit::mm;
609  double Lv2VacFwd_D3 = m_config.getParameter(prep + "D3") * Unit::cm / Unit::mm;
610  double Lv2VacFwd_L1 = m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
611  double Lv2VacFwd_L2 = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
612  double Lv2VacFwd_L3 = m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
613  double Lv2VacFwd_R1 = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
614  double Lv2VacFwd_R2 = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
615  double Lv2VacFwd_R3 = m_config.getParameter(prep + "R3") * Unit::cm / Unit::mm;
616  double Lv2VacFwd_R4 = m_config.getParameter(prep + "R4") * Unit::cm / Unit::mm;
617  double Lv2VacFwd_A1 = m_config.getParameter(prep + "A1");
618  double Lv2VacFwd_A2 = m_config.getParameter(prep + "A2");
619  //
620  string strMat_Lv2VacFwd = m_config.getParameterStr(prep + "Material");
621  G4Material* mat_Lv2VacFwd = Materials::get(strMat_Lv2VacFwd);
622  //
623  // Part 1
624  double Lv2VacFwd1_Z1 = sqrt(Lv2VacFwd_D1 * Lv2VacFwd_D1 + Lv2VacFwd_D2 * Lv2VacFwd_D2 - 2.*Lv2VacFwd_D1 * Lv2VacFwd_D2 * cos(
625  Lv2VacFwd_A1));
626  double Lv2VacFwd1_rI1 = 0.0;
627  double Lv2VacFwd1_rO1 = Lv2VacFwd_R1;
628  //
629  double Lv2VacFwd1_Z2 = (Lv2VacFwd1_Z1 / 2. * cos(Lv2VacFwd_A2)) + SafetyLength;
630  double Lv2VacFwd1_rI2 = 0.0;
631  double Lv2VacFwd1_rO2 = 2 * Lv2VacFwd_R1;
632  // Part 2
633  double Lv2VacFwd2_Z1 = Lv2VacFwd_L1;
634  double Lv2VacFwd2_rI1 = 0.0;
635  double Lv2VacFwd2_rO1 = Lv2VacFwd_R2;
636  //
637  double Lv2VacFwd2_Z2 = (Lv2VacFwd_L1 / 2. * cos(Lv2VacFwd_A2)) + SafetyLength;
638  double Lv2VacFwd2_rI2 = 0.0;
639  double Lv2VacFwd2_rO2 = 2 * Lv2VacFwd_R2;
640  // Part 3
641  const int Lv2VacFwd3_num1 = 2; // Cylindrical part
642  const int Lv2VacFwd3_num2 = 3; // Policone part
643  //-----------> Cylindrical part
644  double Lv2VacFwd_Z1[Lv2VacFwd3_num1];
645  Lv2VacFwd_Z1[0] = 0.0;
646 // Lv2VacFwd_Z1[1] = Lv2VacFwd_D3 - Lv2VacFwd_L2;
647  Lv2VacFwd_Z1[1] = Lv2VacFwd_D3 - Lv2VacFwd_L2 + 0.03 * SafetyLength;
648  double Lv2VacFwd_rI1[Lv2VacFwd3_num1];
649  for (int tmpn = 0; tmpn < Lv2VacFwd3_num1; tmpn++)
650  { Lv2VacFwd_rI1[tmpn] = 0.0; }
651  double Lv2VacFwd_rO1[Lv2VacFwd3_num1];
652  Lv2VacFwd_rO1[0] = Lv2VacFwd_R3;
653  Lv2VacFwd_rO1[1] = Lv2VacFwd_R3;
654  //<---------------
655  //----------->Policone part
656  double Lv2VacFwd_Z2[Lv2VacFwd3_num2];
657  Lv2VacFwd_Z2[0] = Lv2VacFwd_D3 - Lv2VacFwd_L2;
658  Lv2VacFwd_Z2[1] = Lv2VacFwd_D3;
659  Lv2VacFwd_Z2[2] = Lv2VacFwd_D3 + Lv2VacFwd_L3;
660  double Lv2VacFwd_rI2[Lv2VacFwd3_num2];
661  for (int tmpn = 0; tmpn < Lv2VacFwd3_num2; tmpn++)
662  { Lv2VacFwd_rI2[tmpn] = 0.0; }
663  double Lv2VacFwd_rO2[Lv2VacFwd3_num2];
664  Lv2VacFwd_rO2[0] = Lv2VacFwd_R3;
665  Lv2VacFwd_rO2[1] = Lv2VacFwd_R4;
666  Lv2VacFwd_rO2[2] = Lv2VacFwd_R4;
667  //<-------------------
668  //
669 
670  //define geometry
671  // Part 1
672  G4Tubs* geo_Lv2VacFwdPart1_1 = new G4Tubs("geo_Lv2VacFwdPart1_1_name", Lv2VacFwd1_rI1, Lv2VacFwd1_rO1, Lv2VacFwd1_Z1, 0, 2 * M_PI);
673  G4Tubs* geo_Lv2VacFwdPart1_2 = new G4Tubs("geo_Lv2VacFwdPart1_2_name", Lv2VacFwd1_rI2, Lv2VacFwd1_rO2, Lv2VacFwd1_Z2, 0, 2 * M_PI);
674  //Slanted tube of Part 1
675  G4Transform3D transform_Lv2VacFwdPart1_2 = G4Translate3D(0., 0., 0.);
676  transform_Lv2VacFwdPart1_2 = transform_Lv2VacFwdPart1_2 * G4RotateY3D(-Lv2VacFwd_A2 / 2.);
677  G4IntersectionSolid* geo_Lv2VacFwdPart1 = new G4IntersectionSolid("geo_Lv2VacFwdPart1_name", geo_Lv2VacFwdPart1_1,
678  geo_Lv2VacFwdPart1_2, transform_Lv2VacFwdPart1_2);
679  // Part 2
680  G4Tubs* geo_Lv2VacFwdPart2_1 = new G4Tubs("geo_Lv2VacFwdPart2_1_name", Lv2VacFwd2_rI1, Lv2VacFwd2_rO1, Lv2VacFwd2_Z1, 0, 2 * M_PI);
681  G4Tubs* geo_Lv2VacFwdPart2_2 = new G4Tubs("geo_Lv2VacFwdPart2_2_name", Lv2VacFwd2_rI2, Lv2VacFwd2_rO2, Lv2VacFwd2_Z2, 0, 2 * M_PI);
682  //Slanted tube of Part 2
683  G4Transform3D transform_Lv2VacFwdPart2_2 = G4Translate3D(0., 0., 0.);
684  transform_Lv2VacFwdPart2_2 = transform_Lv2VacFwdPart2_2 * G4RotateY3D(Lv2VacFwd_A2 / 2.);
685  G4IntersectionSolid* geo_Lv2VacFwdPart2 = new G4IntersectionSolid("geo_Lv2VacFwdPart2_name", geo_Lv2VacFwdPart2_1,
686  geo_Lv2VacFwdPart2_2, transform_Lv2VacFwdPart2_2);
687  // Part 3
688 // G4Polycone* geo_Lv2VacFwdPart3 = new G4Polycone("geo_Lv2VacFwdPart3", 0, 2 * M_PI, Lv2VacFwd3_num, Lv2VacFwd_Z, Lv2VacFwd_rI, Lv2VacFwd_rO);
689  G4Polycone* geo_Lv2VacFwdPart3_1 = new G4Polycone("geo_Lv2VacFwdPart3_1", 0, 2 * M_PI, Lv2VacFwd3_num1, Lv2VacFwd_Z1, Lv2VacFwd_rI1,
690  Lv2VacFwd_rO1);
691  G4Polycone* geo_Lv2VacFwdPart3_2 = new G4Polycone("geo_Lv2VacFwdPart3_2", 0, 2 * M_PI, Lv2VacFwd3_num2, Lv2VacFwd_Z2, Lv2VacFwd_rI2,
692  Lv2VacFwd_rO2);
693  G4Transform3D transform_Lv2VacFwdPart3_1 = G4Translate3D(-0.5, 0., 0.);
694  transform_Lv2VacFwdPart3_1 = transform_Lv2VacFwdPart3_1 * G4RotateY3D(Lv2VacFwd_A1 - A11);
695  G4UnionSolid* geo_Lv2VacFwdPart3 = new G4UnionSolid("geo_Lv2VacFwdPart3_name", geo_Lv2VacFwdPart3_2, geo_Lv2VacFwdPart3_1,
696  transform_Lv2VacFwdPart3_1);
697  // Part1+2+3
698  //tmp begin
699  G4Transform3D transform_Lv2VacFwdPart1 = G4Translate3D((Lv2VacFwd_D1 * sin(Lv2VacFwd_A1) + Lv2VacFwd_D2 * sin(
700  2.*Lv2VacFwd_A1)) / 2. ,
701  0.,
702  (Lv2VacFwd_D1 * cos(Lv2VacFwd_A1) + Lv2VacFwd_D2 * cos(2.*Lv2VacFwd_A1)) / 2.);
703  //G4Transform3D transform_Lv2VacFwdPart1 = G4Translate3D((Lv2VacFwd_D1 * sin(Lv2VacFwd_A1) + Lv2VacFwd_D2 * sin(2.*Lv2VacFwd_A1)) / 1.9 ,
704  // 0.,
705  // (Lv2VacFwd_D1 * cos(Lv2VacFwd_A1) + Lv2VacFwd_D2 * cos(2.*Lv2VacFwd_A1)) / 1.9);
706  transform_Lv2VacFwdPart1 = transform_Lv2VacFwdPart1 * G4RotateY3D(Lv2VacFwd_A1 + Lv2VacFwd_A2);
707  //
708  G4Transform3D transform_Lv2VacFwdPart2 = G4Translate3D(Lv2VacFwd_D2 * sin(2.*Lv2VacFwd_A1) + Lv2VacFwd_L1 * sin(
709  2.*Lv2VacFwd_A1) / 2.0,
710  0.,
711  Lv2VacFwd_D2 * cos(2.*Lv2VacFwd_A1) + Lv2VacFwd_L1 * cos(2.*Lv2VacFwd_A1) / 2.0);
712  //G4Transform3D transform_Lv2VacFwdPart2 = G4Translate3D(Lv2VacFwd_D2 * sin(2.*Lv2VacFwd_A1) + Lv2VacFwd_L1 * sin(2.*Lv2VacFwd_A1) / 2.05,
713  // 0.,
714  // Lv2VacFwd_D2 * cos(2.*Lv2VacFwd_A1) + Lv2VacFwd_L1 * cos(2.*Lv2VacFwd_A1) / 2.05);
715  //tmp end
716  transform_Lv2VacFwdPart2 = transform_Lv2VacFwdPart2 * G4RotateY3D(2.*Lv2VacFwd_A1);
717  //
718  G4UnionSolid* geo_Lv2VacFwdxx = new G4UnionSolid("geo_Lv2VacFwdxx_name", geo_Lv2VacFwdPart3, geo_Lv2VacFwdPart1,
719  transform_Lv2VacFwdPart1);
720  G4UnionSolid* geo_Lv2VacFwdx = new G4UnionSolid("geo_Lv2VacFwdx_name", geo_Lv2VacFwdxx, geo_Lv2VacFwdPart2,
721  transform_Lv2VacFwdPart2);
722  // Intersection
723  G4Transform3D transform_Lv2VacFwd = G4Translate3D(0., 0., -Lv1TaFwd_D1 - Lv1TaFwd_L1 / 2.);
724  transform_Lv2VacFwd = transform_Lv2VacFwd * G4RotateY3D(-Lv2VacFwd_A1);
725  //
726  G4IntersectionSolid* geo_Lv2VacFwd = new G4IntersectionSolid("geo_Lv2VacFwd_name", geo_Lv1TaFwd, geo_Lv2VacFwdx,
727  transform_Lv2VacFwd);
728  G4LogicalVolume* logi_Lv2VacFwd = new G4LogicalVolume(geo_Lv2VacFwd, mat_Lv2VacFwd, "logi_Lv2VacFwd_name");
729  if (flag_limitStep) logi_Lv2VacFwd->SetUserLimits(new G4UserLimits(stepMax));
730 
731  //- put volume
732  setColor(*logi_Lv2VacFwd, "#CCCCCC");
733  //you must set this invisible, otherwise encounter segV.
734  setVisibility(*logi_Lv2VacFwd, false);
735  new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), logi_Lv2VacFwd, "phys_Lv2VacFwd_name", logi_Lv1TaFwd, false, 0);
736 
737  //-
738  //----------
739 
742 
743 
746 
747  //----------
748  //- Lv1TaBwd
749 
750  //get parameters from .xml file
751  prep = "Lv1TaBwd.";
752  //
753  double Lv1TaBwd_D1 = m_config.getParameter(prep + "D1") * Unit::cm / Unit::mm;
754  double Lv1TaBwd_L1 = m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
755  double Lv1TaBwd_L2 = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
756  double Lv1TaBwd_L3 = m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
757  double Lv1TaBwd_T1 = m_config.getParameter(prep + "T1") * Unit::cm / Unit::mm;
758  //
759  string strMat_Lv1TaBwd = m_config.getParameterStr(prep + "Material");
760  G4Material* mat_Lv1TaBwd = Materials::get(strMat_Lv1TaBwd);
761 
762  //define geometry
763  G4Trd* geo_Lv1TaBwd_x = new G4Trd("geo_Lv1TaBwd_x_name", Lv1TaBwd_L2, Lv1TaBwd_L3, Lv1TaBwd_T1, Lv1TaBwd_T1, Lv1TaBwd_L1 / 2.0);
764  G4UnionSolid* geo_Lv1TaBwd = new G4UnionSolid("geo_Lv1TaBwd_name", geo_Lv1TaBwd_x, geo_Flange,
765  G4Translate3D(0, 0, -Flange_D - (-Lv1TaBwd_D1 - Lv1TaBwd_L1 / 2.0)));
766  G4LogicalVolume* logi_Lv1TaBwd = new G4LogicalVolume(geo_Lv1TaBwd, mat_Lv1TaBwd, "logi_Lv1TaBwd_name");
767 
768  //- put volume
769  setColor(*logi_Lv1TaBwd, "#333333");
770  new G4PVPlacement(0, G4ThreeVector(0, 0, -Lv1TaBwd_D1 - Lv1TaBwd_L1 / 2.0), logi_Lv1TaBwd, "phys_Lv1TaBwd_name", &topVolume, false,
771  0);
772 
773  //-
774  //----------
775 
776  //----------
777  //- Lv2VacBwd
778 
779  //get parameters from .xml file
780  prep = "Lv2VacBwd.";
781  //
782  double Lv2VacBwd_D1 = m_config.getParameter(prep + "D1") * Unit::cm / Unit::mm;
783  double Lv2VacBwd_D2 = m_config.getParameter(prep + "D2") * Unit::cm / Unit::mm;
784  double Lv2VacBwd_D3 = m_config.getParameter(prep + "D3") * Unit::cm / Unit::mm;
785  double Lv2VacBwd_L1 = m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
786  double Lv2VacBwd_L2 = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
787  double Lv2VacBwd_L3 = m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
788  double Lv2VacBwd_R1 = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
789  double Lv2VacBwd_R2 = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
790  double Lv2VacBwd_R3 = m_config.getParameter(prep + "R3") * Unit::cm / Unit::mm;
791  double Lv2VacBwd_R4 = m_config.getParameter(prep + "R4") * Unit::cm / Unit::mm;
792  double Lv2VacBwd_A1 = m_config.getParameter(prep + "A1");
793  double Lv2VacBwd_A2 = m_config.getParameter(prep + "A2");
794  //
795  string strMat_Lv2VacBwd = m_config.getParameterStr(prep + "Material");
796  G4Material* mat_Lv2VacBwd = Materials::get(strMat_Lv2VacBwd);
797  //
798  // Part 1
799  double Lv2VacBwd1_Z1 = sqrt(Lv2VacBwd_D1 * Lv2VacBwd_D1 + Lv2VacBwd_D2 * Lv2VacBwd_D2 - 2.*Lv2VacBwd_D1 * Lv2VacBwd_D2 * cos(
800  Lv2VacBwd_A1));
801  double Lv2VacBwd1_rI1 = 0.0;
802  double Lv2VacBwd1_rO1 = Lv2VacBwd_R1;
803  //
804  double Lv2VacBwd1_Z2 = (Lv2VacBwd1_Z1 / 2. * cos(Lv2VacBwd_A2)) + SafetyLength;
805  double Lv2VacBwd1_rI2 = 0.0;
806  double Lv2VacBwd1_rO2 = 2 * Lv2VacBwd_R1;
807  // Part 2
808  double Lv2VacBwd2_Z1 = Lv2VacBwd_L1;
809  double Lv2VacBwd2_rI1 = 0.0;
810  double Lv2VacBwd2_rO1 = Lv2VacBwd_R2;
811  //
812  double Lv2VacBwd2_Z2 = (Lv2VacBwd_L1 / 2. * cos(Lv2VacBwd_A2)) + SafetyLength;
813  double Lv2VacBwd2_rI2 = 0.0;
814  double Lv2VacBwd2_rO2 = 2 * Lv2VacBwd_R2;
815  // Part 3
816  const int Lv2VacBwd3_num1 = 2; // cylindrical part
817  const int Lv2VacBwd3_num2 = 3; // policone part
818  // ----------->Cylindrical part
819  double Lv2VacBwd_Z1[Lv2VacBwd3_num1];
820  Lv2VacBwd_Z1[0] = 0.0;
821  Lv2VacBwd_Z1[1] = -Lv2VacBwd_D3 + Lv2VacBwd_L2 - 0.03 * SafetyLength;
822  double Lv2VacBwd_rI1[Lv2VacBwd3_num1];
823  for (int tmpn = 0; tmpn < Lv2VacBwd3_num1; tmpn++)
824  { Lv2VacBwd_rI1[tmpn] = 0.0; }
825  double Lv2VacBwd_rO1[Lv2VacBwd3_num1];
826  Lv2VacBwd_rO1[0] = Lv2VacBwd_R3;
827  Lv2VacBwd_rO1[1] = Lv2VacBwd_R3;
828  //<----------------
829  //------------> Policone part
830  double Lv2VacBwd_Z2[Lv2VacBwd3_num2];
831  Lv2VacBwd_Z2[0] = -Lv2VacBwd_D3 + Lv2VacBwd_L2;
832  Lv2VacBwd_Z2[1] = -Lv2VacBwd_D3;
833  Lv2VacBwd_Z2[2] = -Lv2VacBwd_D3 - Lv2VacBwd_L3;
834  double Lv2VacBwd_rI2[Lv2VacBwd3_num2];
835  for (int tmpn = 0; tmpn < Lv2VacBwd3_num2; tmpn++)
836  { Lv2VacBwd_rI2[tmpn] = 0.0; }
837  double Lv2VacBwd_rO2[Lv2VacBwd3_num2];
838  Lv2VacBwd_rO2[0] = Lv2VacBwd_R3;
839  Lv2VacBwd_rO2[1] = Lv2VacBwd_R4;
840  Lv2VacBwd_rO2[2] = Lv2VacBwd_R4;
841  //<--------------
842  //
843 
844  //define geometry
845  // Part 1
846  G4Tubs* geo_Lv2VacBwdPart1_1 = new G4Tubs("geo_Lv2VacBwdPart1_1_name", Lv2VacBwd1_rI1, Lv2VacBwd1_rO1, Lv2VacBwd1_Z1, 0, 2 * M_PI);
847  G4Tubs* geo_Lv2VacBwdPart1_2 = new G4Tubs("geo_Lv2VacBwdPart1_2_name", Lv2VacBwd1_rI2, Lv2VacBwd1_rO2, Lv2VacBwd1_Z2, 0, 2 * M_PI);
848  G4Transform3D transform_Lv2VacBwdPart1_2 = G4Translate3D(0., 0., 0.);
849  transform_Lv2VacBwdPart1_2 = transform_Lv2VacBwdPart1_2 * G4RotateY3D(Lv2VacBwd_A2 / 2.);
850  G4IntersectionSolid* geo_Lv2VacBwdPart1 = new G4IntersectionSolid("geo_Lv2VacBwdPart1_name", geo_Lv2VacBwdPart1_1,
851  geo_Lv2VacBwdPart1_2, transform_Lv2VacBwdPart1_2);
852  // Part 2
853  G4Tubs* geo_Lv2VacBwdPart2_1 = new G4Tubs("geo_Lv2VacBwdPart2_1_name", Lv2VacBwd2_rI1, Lv2VacBwd2_rO1, Lv2VacBwd2_Z1, 0, 2 * M_PI);
854  G4Tubs* geo_Lv2VacBwdPart2_2 = new G4Tubs("geo_Lv2VacBwdPart2_2_name", Lv2VacBwd2_rI2, Lv2VacBwd2_rO2, Lv2VacBwd2_Z2, 0, 2 * M_PI);
855  G4Transform3D transform_Lv2VacBwdPart2_2 = G4Translate3D(0., 0., 0.);
856  transform_Lv2VacBwdPart2_2 = transform_Lv2VacBwdPart2_2 * G4RotateY3D(-Lv2VacBwd_A2 / 2.);
857  G4IntersectionSolid* geo_Lv2VacBwdPart2 = new G4IntersectionSolid("geo_Lv2VacBwdPart2_name", geo_Lv2VacBwdPart2_1,
858  geo_Lv2VacBwdPart2_2, transform_Lv2VacBwdPart2_2);
859  // Part 3
860 // G4Polycone* geo_Lv2VacBwdPart3 = new G4Polycone("geo_Lv2VacBwdPart3", 0, 2 * M_PI, Lv2VacBwd3_num, Lv2VacBwd_Z, Lv2VacBwd_rI, Lv2VacBwd_rO);
861  G4Polycone* geo_Lv2VacBwdPart3_1 = new G4Polycone("geo_Lv2VacBwdPart3_1", 0, 2 * M_PI, Lv2VacBwd3_num1, Lv2VacBwd_Z1, Lv2VacBwd_rI1,
862  Lv2VacBwd_rO1);
863  G4Polycone* geo_Lv2VacBwdPart3_2 = new G4Polycone("geo_Lv2VacBwdPart3_2", 0, 2 * M_PI, Lv2VacBwd3_num2, Lv2VacBwd_Z2, Lv2VacBwd_rI2,
864  Lv2VacBwd_rO2);
865  G4Transform3D transform_Lv2VacBwdPart3_1 = G4Translate3D(-0.5, 0., 0.);
866  transform_Lv2VacBwdPart3_1 = transform_Lv2VacBwdPart3_1 * G4RotateY3D(-Lv2VacBwd_A1 + A11);
867  G4UnionSolid* geo_Lv2VacBwdPart3 = new G4UnionSolid("geo_Lv2VacBwdPart3_name", geo_Lv2VacBwdPart3_2, geo_Lv2VacBwdPart3_1,
868  transform_Lv2VacBwdPart3_1);
869  // Part1+2+3
870  //tmp begin
871  G4Transform3D transform_Lv2VacBwdPart1 = G4Translate3D((Lv2VacBwd_D1 * sin(Lv2VacBwd_A1) + Lv2VacBwd_D2 * sin(
872  2.*Lv2VacBwd_A1)) / 2. ,
873  0.,
874  -(Lv2VacBwd_D1 * cos(Lv2VacBwd_A1) + Lv2VacBwd_D2 * cos(2.*Lv2VacBwd_A1)) / 2.);
875  //G4Transform3D transform_Lv2VacBwdPart1 = G4Translate3D((Lv2VacBwd_D1 * sin(Lv2VacBwd_A1) + Lv2VacBwd_D2 * sin(2.*Lv2VacBwd_A1)) / 2.05,
876  // 0.,
877  // -(Lv2VacBwd_D1 * cos(Lv2VacBwd_A1) + Lv2VacBwd_D2 * cos(2.*Lv2VacBwd_A1)) / 2.05);
878  transform_Lv2VacBwdPart1 = transform_Lv2VacBwdPart1 * G4RotateY3D(-Lv2VacBwd_A1 - Lv2VacBwd_A2);
879  //tmp end
880  //
881  G4Transform3D transform_Lv2VacBwdPart2 = G4Translate3D((Lv2VacBwd_D2 + Lv2VacBwd_L1 / 2.0) * sin(2.*Lv2VacBwd_A1) ,
882  0.,
883  -(Lv2VacBwd_D2 + Lv2VacBwd_L1 / 2.0) * cos(2.*Lv2VacBwd_A1));
884  transform_Lv2VacBwdPart2 = transform_Lv2VacBwdPart2 * G4RotateY3D(-2.*Lv2VacBwd_A1);
885  //
886  G4UnionSolid* geo_Lv2VacBwdxx = new G4UnionSolid("geo_Lv2VacBwdxx_name", geo_Lv2VacBwdPart3, geo_Lv2VacBwdPart1,
887  transform_Lv2VacBwdPart1);
888  G4UnionSolid* geo_Lv2VacBwdx = new G4UnionSolid("geo_Lv2VacBwdx_name", geo_Lv2VacBwdxx, geo_Lv2VacBwdPart2,
889  transform_Lv2VacBwdPart2);
890  // Intersection
891  G4Transform3D transform_Lv2VacBwd = G4Translate3D(0., 0., +Lv1TaBwd_D1 + Lv1TaBwd_L1 / 2.);
892  transform_Lv2VacBwd = transform_Lv2VacBwd * G4RotateY3D(+Lv2VacBwd_A1);
893  //
894  G4IntersectionSolid* geo_Lv2VacBwd = new G4IntersectionSolid("geo_Lv2VacBwd_name", geo_Lv1TaBwd, geo_Lv2VacBwdx,
895  transform_Lv2VacBwd);
896  G4LogicalVolume* logi_Lv2VacBwd = new G4LogicalVolume(geo_Lv2VacBwd, mat_Lv2VacBwd, "logi_Lv2VacBwd_name");
897  if (flag_limitStep) logi_Lv2VacBwd->SetUserLimits(new G4UserLimits(stepMax));
898 
899  //- put volume
900  setColor(*logi_Lv2VacBwd, "#CCCCCC");
901  //you must set this invisible, otherwise encounter segV.
902  setVisibility(*logi_Lv2VacBwd, false);
903  new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), logi_Lv2VacBwd, "phys_Lv2VacBwd_name", logi_Lv1TaBwd, false, 0);
904 
905  //-
906 
909 
910  //get parameters from .xml file
911  prep = "AreaTubeFwd.";
912  //
913  const int AreaTubeFwd_num = 2;
914  //
915  double AreaTubeFwd_Z[AreaTubeFwd_num];
916  AreaTubeFwd_Z[0] = m_config.getParameter(prep + "D1") * Unit::cm / Unit::mm;
917  AreaTubeFwd_Z[1] = m_config.getParameter(prep + "D2") * Unit::cm / Unit::mm;
918  //
919  double AreaTubeFwd_rI[AreaTubeFwd_num];
920  for (int i = 0; i < AreaTubeFwd_num; i++)
921  { AreaTubeFwd_rI[i] = 0.0; }
922  //
923  double AreaTubeFwd_rO[AreaTubeFwd_num];
924  AreaTubeFwd_rO[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
925  AreaTubeFwd_rO[1] = AreaTubeFwd_rO[0];
926 
927  //define geometry
928  G4Polycone* geo_AreaTubeFwdpcon = new G4Polycone("geo_AreaTubeFwdpcon_name", 0, 2 * M_PI, AreaTubeFwd_num, AreaTubeFwd_Z,
929  AreaTubeFwd_rI, AreaTubeFwd_rO);
930 
931  //----------
932  //- Lv1TaLERUp
933 
934  //get parameters from .xml file
935  prep = "Lv1TaLERUp.";
936  //
937  double Lv1TaLERUp_A1 = m_config.getParameter(prep + "A1");
938  //
939  const int Lv1TaLERUp_num = 4;
940  //
941  double Lv1TaLERUp_Z[Lv1TaLERUp_num];
942  Lv1TaLERUp_Z[0] = m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
943  Lv1TaLERUp_Z[1] = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
944  Lv1TaLERUp_Z[2] = m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
945  Lv1TaLERUp_Z[3] = m_config.getParameter(prep + "L4") * Unit::cm / Unit::mm;
946  //
947  double Lv1TaLERUp_rI[Lv1TaLERUp_num];
948  for (int i = 0; i < Lv1TaLERUp_num; i++)
949  { Lv1TaLERUp_rI[i] = 0.0; }
950  //
951  double Lv1TaLERUp_rO[Lv1TaLERUp_num];
952  Lv1TaLERUp_rO[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
953  Lv1TaLERUp_rO[1] = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
954  Lv1TaLERUp_rO[2] = m_config.getParameter(prep + "R3") * Unit::cm / Unit::mm;
955  Lv1TaLERUp_rO[3] = m_config.getParameter(prep + "R4") * Unit::cm / Unit::mm;
956  //
957  string strMat_Lv1TaLERUp = m_config.getParameterStr(prep + "Material");
958  G4Material* mat_Lv1TaLERUp = Materials::get(strMat_Lv1TaLERUp);
959 
960  //define geometry
961  G4Polycone* geo_Lv1TaLERUppcon = new G4Polycone("geo_Lv1TaLERUppcon_name", 0, 2 * M_PI, Lv1TaLERUp_num, Lv1TaLERUp_Z, Lv1TaLERUp_rI,
962  Lv1TaLERUp_rO);
963  G4Transform3D transform_AreaTubeFwdForLER = G4Translate3D(0., 0., 0.);
964  transform_AreaTubeFwdForLER = transform_AreaTubeFwdForLER * G4RotateY3D(-Lv1TaLERUp_A1);
965  G4IntersectionSolid* geo_Lv1TaLERUp = new G4IntersectionSolid("geo_Lv1TaLERUp_name", geo_Lv1TaLERUppcon, geo_AreaTubeFwdpcon,
966  transform_AreaTubeFwdForLER);
967  G4LogicalVolume* logi_Lv1TaLERUp = new G4LogicalVolume(geo_Lv1TaLERUp, mat_Lv1TaLERUp, "logi_Lv1TaLERUp_name");
968 
969  //- put volume
970  setColor(*logi_Lv1TaLERUp, "#0000CC");
971  G4Transform3D transform_Lv1TaLERUp = G4Translate3D(0., 0., 0.);
972  transform_Lv1TaLERUp = transform_Lv1TaLERUp * G4RotateY3D(Lv1TaLERUp_A1);
973  new G4PVPlacement(transform_Lv1TaLERUp, logi_Lv1TaLERUp, "phys_Lv1TaLERUp_name", &topVolume, false, 0);
974 
975  //-
976  //----------
977 
978  //----------
979  //- Lv2VacLERUp
980 
981  //get parameters from .xml file
982  prep = "Lv2VacLERUp.";
983  //
984  double Lv2VacLERUp_rO[Lv1TaLERUp_num];
985  Lv2VacLERUp_rO[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
986  Lv2VacLERUp_rO[1] = Lv2VacLERUp_rO[0];
987  Lv2VacLERUp_rO[2] = Lv2VacLERUp_rO[0];
988  Lv2VacLERUp_rO[3] = Lv2VacLERUp_rO[0];
989  //
990  string strMat_Lv2VacLERUp = m_config.getParameterStr(prep + "Material");
991  G4Material* mat_Lv2VacLERUp = Materials::get(strMat_Lv2VacLERUp);
992 
993  //define geometry
994  G4Polycone* geo_Lv2VacLERUppcon = new G4Polycone("geo_Lv2VacLERUppcon_name", 0, 2 * M_PI, Lv1TaLERUp_num, Lv1TaLERUp_Z,
995  Lv1TaLERUp_rI, Lv2VacLERUp_rO);
996  G4IntersectionSolid* geo_Lv2VacLERUp = new G4IntersectionSolid("geo_Lv2VacLERUp_name", geo_Lv2VacLERUppcon, geo_AreaTubeFwdpcon,
997  transform_AreaTubeFwdForLER);
998  G4LogicalVolume* logi_Lv2VacLERUp = new G4LogicalVolume(geo_Lv2VacLERUp, mat_Lv2VacLERUp, "logi_Lv2VacLERUp_name");
999  if (flag_limitStep) logi_Lv2VacLERUp->SetUserLimits(new G4UserLimits(stepMax));
1000 
1001 
1002  //- put volume
1003  setColor(*logi_Lv2VacLERUp, "#CCCCCC");
1004  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2VacLERUp, "phys_Lv2VacLERUp_name", logi_Lv1TaLERUp, false, 0);
1005  //-
1006  //----------
1007 
1008  //----------
1009  //- Lv1TaHERDwn
1010 
1011  //get parameters from .xml file
1012  prep = "Lv1TaHERDwn.";
1013  //
1014  double Lv1TaHERDwn_A1 = m_config.getParameter(prep + "A1");
1015  //
1016  const int Lv1TaHERDwn_num = 4;
1017  //
1018  double Lv1TaHERDwn_Z[Lv1TaHERDwn_num];
1019  Lv1TaHERDwn_Z[0] = m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
1020  Lv1TaHERDwn_Z[1] = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
1021  Lv1TaHERDwn_Z[2] = m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
1022  Lv1TaHERDwn_Z[3] = m_config.getParameter(prep + "L4") * Unit::cm / Unit::mm;
1023  //
1024  double Lv1TaHERDwn_rI[Lv1TaHERDwn_num];
1025  for (int i = 0; i < Lv1TaHERDwn_num; i++)
1026  { Lv1TaHERDwn_rI[i] = 0.0; }
1027  //
1028  double Lv1TaHERDwn_rO[Lv1TaHERDwn_num];
1029  Lv1TaHERDwn_rO[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
1030  Lv1TaHERDwn_rO[1] = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
1031  Lv1TaHERDwn_rO[2] = m_config.getParameter(prep + "R3") * Unit::cm / Unit::mm;
1032  Lv1TaHERDwn_rO[3] = m_config.getParameter(prep + "R4") * Unit::cm / Unit::mm;
1033  //
1034  string strMat_Lv1TaHERDwn = m_config.getParameterStr(prep + "Material");
1035  G4Material* mat_Lv1TaHERDwn = Materials::get(strMat_Lv1TaHERDwn);
1036 
1037  //define geometry
1038  G4Polycone* geo_Lv1TaHERDwnpcon = new G4Polycone("geo_Lv1TaHERDwnpcon_name", 0, 2 * M_PI, Lv1TaHERDwn_num, Lv1TaHERDwn_Z,
1039  Lv1TaHERDwn_rI, Lv1TaHERDwn_rO);
1040  G4Transform3D transform_AreaTubeFwdForHER = G4Translate3D(0., 0., 0.);
1041  transform_AreaTubeFwdForHER = transform_AreaTubeFwdForHER * G4RotateY3D(-Lv1TaHERDwn_A1);
1042  G4IntersectionSolid* geo_Lv1TaHERDwn = new G4IntersectionSolid("", geo_Lv1TaHERDwnpcon, geo_AreaTubeFwdpcon,
1043  transform_AreaTubeFwdForHER);
1044  G4LogicalVolume* logi_Lv1TaHERDwn = new G4LogicalVolume(geo_Lv1TaHERDwn, mat_Lv1TaHERDwn, "logi_Lv1TaHERDwn_name");
1045 
1046  //- put volume
1047  setColor(*logi_Lv1TaHERDwn, "#00CC00");
1048  G4Transform3D transform_Lv1TaHERDwn = G4Translate3D(0., 0., 0.);
1049  transform_Lv1TaHERDwn = transform_Lv1TaHERDwn * G4RotateY3D(Lv1TaHERDwn_A1);
1050  new G4PVPlacement(transform_Lv1TaHERDwn, logi_Lv1TaHERDwn, "phys_Lv1TaHERDwn_name", &topVolume, false, 0);
1051 
1052  //-
1053  //----------
1054 
1055  //----------
1056  //- Lv2VacHERDwn
1057 
1058  //get parameters from .xml file
1059  prep = "Lv2VacHERDwn.";
1060  //
1061  double Lv2VacHERDwn_rO[Lv1TaHERDwn_num];
1062  Lv2VacHERDwn_rO[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
1063  Lv2VacHERDwn_rO[1] = Lv2VacHERDwn_rO[0];
1064  Lv2VacHERDwn_rO[2] = Lv2VacHERDwn_rO[0];
1065  Lv2VacHERDwn_rO[3] = Lv2VacHERDwn_rO[0];
1066  //
1067  string strMat_Lv2VacHERDwn = m_config.getParameterStr(prep + "Material");
1068  G4Material* mat_Lv2VacHERDwn = Materials::get(strMat_Lv2VacHERDwn);
1069 
1070  //define geometry
1071  G4Polycone* geo_Lv2VacHERDwnpcon = new G4Polycone("geo_Lv2VacHERDwnpcon_name", 0, 2 * M_PI, Lv1TaHERDwn_num, Lv1TaHERDwn_Z,
1072  Lv1TaHERDwn_rI, Lv2VacHERDwn_rO);
1073  G4IntersectionSolid* geo_Lv2VacHERDwn = new G4IntersectionSolid("", geo_Lv2VacHERDwnpcon, geo_AreaTubeFwdpcon,
1074  transform_AreaTubeFwdForHER);
1075  G4LogicalVolume* logi_Lv2VacHERDwn = new G4LogicalVolume(geo_Lv2VacHERDwn, mat_Lv2VacHERDwn, "logi_Lv2VacHERDwn_name");
1076  if (flag_limitStep) logi_Lv2VacHERDwn->SetUserLimits(new G4UserLimits(stepMax));
1077 
1078  //- put volume
1079  setColor(*logi_Lv2VacHERDwn, "#CCCCCC");
1080  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2VacHERDwn, "phys_Lv2VacHERDwn_name", logi_Lv1TaHERDwn, false, 0);
1081 
1082  //-
1083  //----------
1084 
1087 
1090 
1091  //get parameters from .xml file
1092  prep = "AreaTubeBwd.";
1093  //
1094  const int AreaTubeBwd_num = 2;
1095  //
1096  double AreaTubeBwd_Z[AreaTubeBwd_num];
1097  AreaTubeBwd_Z[0] = -m_config.getParameter(prep + "D1") * Unit::cm / Unit::mm;
1098  AreaTubeBwd_Z[1] = -m_config.getParameter(prep + "D2") * Unit::cm / Unit::mm;
1099  //
1100  double AreaTubeBwd_rI[AreaTubeBwd_num];
1101  for (int i = 0; i < AreaTubeBwd_num; i++)
1102  { AreaTubeBwd_rI[i] = 0.0; }
1103  //
1104  double AreaTubeBwd_rO[AreaTubeBwd_num];
1105  AreaTubeBwd_rO[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
1106  AreaTubeBwd_rO[1] = AreaTubeBwd_rO[0];
1107 
1108  //define geometry
1109  G4Polycone* geo_AreaTubeBwdpcon = new G4Polycone("geo_AreaTubeBwdpcon_name", 0, 2 * M_PI, AreaTubeBwd_num, AreaTubeBwd_Z,
1110  AreaTubeBwd_rI, AreaTubeBwd_rO);
1111 
1112  //----------
1113  //- Lv1TaHERUp
1114 
1115  //get parameters from .xml file
1116  prep = "Lv1TaHERUp.";
1117  //
1118  double Lv1TaHERUp_A1 = m_config.getParameter(prep + "A1");
1119  //
1120  const int Lv1TaHERUp_num = 4;
1121  //
1122  double Lv1TaHERUp_Z[Lv1TaHERUp_num];
1123  Lv1TaHERUp_Z[0] = -m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
1124  Lv1TaHERUp_Z[1] = -m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
1125  Lv1TaHERUp_Z[2] = -m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
1126  Lv1TaHERUp_Z[3] = -m_config.getParameter(prep + "L4") * Unit::cm / Unit::mm;
1127  //
1128  double Lv1TaHERUp_rI[Lv1TaHERUp_num];
1129  for (int i = 0; i < Lv1TaHERUp_num; i++)
1130  { Lv1TaHERUp_rI[i] = 0.0; }
1131  //
1132  double Lv1TaHERUp_rO[Lv1TaHERUp_num];
1133  Lv1TaHERUp_rO[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
1134  Lv1TaHERUp_rO[1] = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
1135  Lv1TaHERUp_rO[2] = m_config.getParameter(prep + "R3") * Unit::cm / Unit::mm;
1136  Lv1TaHERUp_rO[3] = m_config.getParameter(prep + "R4") * Unit::cm / Unit::mm;
1137  //
1138  string strMat_Lv1TaHERUp = m_config.getParameterStr(prep + "Material");
1139  G4Material* mat_Lv1TaHERUp = Materials::get(strMat_Lv1TaHERUp);
1140 
1141  //define geometry
1142  G4Polycone* geo_Lv1TaHERUppcon = new G4Polycone("geo_Lv1TaHERUppcon_name", 0, 2 * M_PI, Lv1TaHERUp_num, Lv1TaHERUp_Z, Lv1TaHERUp_rI,
1143  Lv1TaHERUp_rO);
1144  G4Transform3D transform_AreaTubeBwdForHER = G4Translate3D(0., 0., 0.);
1145  transform_AreaTubeBwdForHER = transform_AreaTubeBwdForHER * G4RotateY3D(-Lv1TaHERUp_A1);
1146  G4IntersectionSolid* geo_Lv1TaHERUp = new G4IntersectionSolid("", geo_Lv1TaHERUppcon, geo_AreaTubeBwdpcon,
1147  transform_AreaTubeBwdForHER);
1148  G4LogicalVolume* logi_Lv1TaHERUp = new G4LogicalVolume(geo_Lv1TaHERUp, mat_Lv1TaHERUp, "logi_Lv1TaHERUp_name");
1149 
1150  //- put volume
1151  setColor(*logi_Lv1TaHERUp, "#00CC00");
1152  G4Transform3D transform_Lv1TaHERUp = G4Translate3D(0., 0., 0.);
1153  transform_Lv1TaHERUp = transform_Lv1TaHERUp * G4RotateY3D(Lv1TaHERUp_A1);
1154  new G4PVPlacement(transform_Lv1TaHERUp, logi_Lv1TaHERUp, "phys_Lv1TaHERUp_name", &topVolume, false, 0);
1155 
1156  //-
1157  //----------
1158 
1159  //----------
1160  //- Lv2VacHERUp
1161 
1162  //get parameters from .xml file
1163  prep = "Lv2VacHERUp.";
1164  //
1165  double Lv2VacHERUp_rO[Lv1TaHERUp_num];
1166  Lv2VacHERUp_rO[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
1167  Lv2VacHERUp_rO[1] = Lv2VacHERUp_rO[0];
1168  Lv2VacHERUp_rO[2] = Lv2VacHERUp_rO[0];
1169  Lv2VacHERUp_rO[3] = Lv2VacHERUp_rO[0];
1170  //
1171  string strMat_Lv2VacHERUp = m_config.getParameterStr(prep + "Material");
1172  G4Material* mat_Lv2VacHERUp = Materials::get(strMat_Lv2VacHERUp);
1173 
1174  //define geometry
1175  G4Polycone* geo_Lv2VacHERUppcon = new G4Polycone("geo_Lv2VacHERUppcon_name", 0, 2 * M_PI, Lv1TaHERUp_num, Lv1TaHERUp_Z,
1176  Lv1TaHERUp_rI, Lv2VacHERUp_rO);
1177  G4IntersectionSolid* geo_Lv2VacHERUp = new G4IntersectionSolid("", geo_Lv2VacHERUppcon, geo_AreaTubeBwdpcon,
1178  transform_AreaTubeFwdForHER);
1179  G4LogicalVolume* logi_Lv2VacHERUp = new G4LogicalVolume(geo_Lv2VacHERUp, mat_Lv2VacHERUp, "logi_Lv2VacHERUp_name");
1180  if (flag_limitStep) logi_Lv2VacHERUp->SetUserLimits(new G4UserLimits(stepMax));
1181 
1182  //- put volume
1183  setColor(*logi_Lv2VacHERUp, "#CCCCCC");
1184  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2VacHERUp, "phys_Lv2VacHERUp_name", logi_Lv1TaHERUp, false, 0);
1185 
1186  //-
1187  //----------
1188 
1189  //----------
1190  //- Lv1TaLERDwn
1191 
1192  //get parameters from .xml file
1193  prep = "Lv1TaLERDwn.";
1194  //
1195  double Lv1TaLERDwn_A1 = m_config.getParameter(prep + "A1");
1196  //
1197  const int Lv1TaLERDwn_num = 4;
1198  //
1199  double Lv1TaLERDwn_Z[Lv1TaLERDwn_num];
1200  Lv1TaLERDwn_Z[0] = -m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
1201  Lv1TaLERDwn_Z[1] = -m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
1202  Lv1TaLERDwn_Z[2] = -m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
1203  Lv1TaLERDwn_Z[3] = -m_config.getParameter(prep + "L4") * Unit::cm / Unit::mm;
1204  //
1205  double Lv1TaLERDwn_rI[Lv1TaLERDwn_num];
1206  for (int i = 0; i < Lv1TaLERDwn_num; i++)
1207  { Lv1TaLERDwn_rI[i] = 0.0; }
1208  //
1209  double Lv1TaLERDwn_rO[Lv1TaLERDwn_num];
1210  Lv1TaLERDwn_rO[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
1211  Lv1TaLERDwn_rO[1] = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
1212  Lv1TaLERDwn_rO[2] = m_config.getParameter(prep + "R3") * Unit::cm / Unit::mm;
1213  Lv1TaLERDwn_rO[3] = m_config.getParameter(prep + "R4") * Unit::cm / Unit::mm;
1214  //
1215  string strMat_Lv1TaLERDwn = m_config.getParameterStr(prep + "Material");
1216  G4Material* mat_Lv1TaLERDwn = Materials::get(strMat_Lv1TaLERDwn);
1217 
1218  //define geometry
1219  G4Polycone* geo_Lv1TaLERDwnpcon = new G4Polycone("geo_Lv1TaLERDwnpcon_name", 0, 2 * M_PI, Lv1TaLERDwn_num, Lv1TaLERDwn_Z,
1220  Lv1TaLERDwn_rI, Lv1TaLERDwn_rO);
1221  G4Transform3D transform_AreaTubeBwdForLER = G4Translate3D(0., 0., 0.);
1222  transform_AreaTubeBwdForLER = transform_AreaTubeBwdForLER * G4RotateY3D(-Lv1TaLERDwn_A1);
1223  G4IntersectionSolid* geo_Lv1TaLERDwn = new G4IntersectionSolid("", geo_Lv1TaLERDwnpcon, geo_AreaTubeBwdpcon,
1224  transform_AreaTubeBwdForLER);
1225  G4LogicalVolume* logi_Lv1TaLERDwn = new G4LogicalVolume(geo_Lv1TaLERDwn, mat_Lv1TaLERDwn, "logi_Lv1TaLERDwn_name");
1226 
1227  //- put volume
1228  setColor(*logi_Lv1TaLERDwn, "#0000CC");
1229  G4Transform3D transform_Lv1TaLERDwn = G4Translate3D(0., 0., 0.);
1230  transform_Lv1TaLERDwn = transform_Lv1TaLERDwn * G4RotateY3D(Lv1TaLERDwn_A1);
1231  new G4PVPlacement(transform_Lv1TaLERDwn, logi_Lv1TaLERDwn, "phys_Lv1TaLERDwn_name", &topVolume, false, 0);
1232 
1233  //-
1234  //----------
1235 
1236  //----------
1237  //- Lv2VacLERDwn
1238 
1239  //get parameters from .xml file
1240  prep = "Lv2VacLERDwn.";
1241  //
1242  double Lv2VacLERDwn_rO[Lv1TaLERDwn_num];
1243  Lv2VacLERDwn_rO[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
1244  Lv2VacLERDwn_rO[1] = Lv2VacLERDwn_rO[0];
1245  Lv2VacLERDwn_rO[2] = Lv2VacLERDwn_rO[0];
1246  Lv2VacLERDwn_rO[3] = Lv2VacLERDwn_rO[0];
1247  //
1248  string strMat_Lv2VacLERDwn = m_config.getParameterStr(prep + "Material");
1249  G4Material* mat_Lv2VacLERDwn = Materials::get(strMat_Lv2VacLERDwn);
1250 
1251  //define geometry
1252  G4Polycone* geo_Lv2VacLERDwnpcon = new G4Polycone("geo_Lv2VacLERDwnpcon_name", 0, 2 * M_PI, Lv1TaLERDwn_num, Lv1TaLERDwn_Z,
1253  Lv1TaLERDwn_rI, Lv2VacLERDwn_rO);
1254  G4IntersectionSolid* geo_Lv2VacLERDwn = new G4IntersectionSolid("", geo_Lv2VacLERDwnpcon, geo_AreaTubeBwdpcon,
1255  transform_AreaTubeBwdForLER);
1256  G4LogicalVolume* logi_Lv2VacLERDwn = new G4LogicalVolume(geo_Lv2VacLERDwn, mat_Lv2VacLERDwn, "logi_Lv2VacLERDwn_name");
1257  if (flag_limitStep) logi_Lv2VacLERDwn->SetUserLimits(new G4UserLimits(stepMax));
1258 
1259  //- put volume
1260  setColor(*logi_Lv2VacLERDwn, "#CCCCCC");
1261  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2VacLERDwn, "phys_Lv2VacLERDwn_name", logi_Lv1TaLERDwn, false, 0);
1262 
1263 
1264  //----------
1265  // Cu flange
1266 
1267  G4IntersectionSolid* geo_CuFlangeFwd_x2 = new G4IntersectionSolid("geo_CuFlangeFwd_x2_name", geo_AreaTubeFwdpcon, geo_Flange,
1268  G4Translate3D(0, 0, Flange_D + Flange_T * 2));
1269  G4SubtractionSolid* geo_CuFlangeFwd_x = new G4SubtractionSolid("geo_CuFlangeFwd_x_name", geo_CuFlangeFwd_x2, geo_Lv1TaLERUp,
1270  transform_Lv1TaLERUp);
1271  G4SubtractionSolid* geo_CuFlangeFwd = new G4SubtractionSolid("geo_CuFlangeFwd_name", geo_CuFlangeFwd_x, geo_Lv1TaHERDwn,
1272  transform_Lv1TaHERDwn);
1273 
1274  G4LogicalVolume* logi_CuFlangeFwd = new G4LogicalVolume(geo_CuFlangeFwd, mat_Lv1TaLERUp, "logi_CuFlangeFwd_name");
1275 
1276  //- put volume
1277  setColor(*logi_CuFlangeFwd, "#CCCCCC");
1278  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_CuFlangeFwd, "phys_CuFlangeFwd_name", &topVolume, false, 0);
1279 
1280 
1281 
1282 
1283  G4IntersectionSolid* geo_CuFlangeBwd_x2 = new G4IntersectionSolid("geo_CuFlangeBwd_x2_name", geo_AreaTubeBwdpcon, geo_Flange,
1284  G4Translate3D(0, 0, -Flange_D - Flange_T * 2));
1285  G4SubtractionSolid* geo_CuFlangeBwd_x = new G4SubtractionSolid("geo_CuFlangeBwd_x_name", geo_CuFlangeBwd_x2, geo_Lv1TaHERUp,
1286  transform_Lv1TaHERUp);
1287  G4SubtractionSolid* geo_CuFlangeBwd = new G4SubtractionSolid("geo_CuFlangeBwd_name", geo_CuFlangeBwd_x, geo_Lv1TaLERDwn,
1288  transform_Lv1TaLERDwn);
1289 
1290  G4LogicalVolume* logi_CuFlangeBwd = new G4LogicalVolume(geo_CuFlangeBwd, mat_Lv1TaLERUp, "logi_CuFlangeBwd_name");
1291 
1292  //- put volume
1293  setColor(*logi_CuFlangeBwd, "#CCCCCC");
1294  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_CuFlangeBwd, "phys_CuFlangeBwd_name", &topVolume, false, 0);
1295 
1296 
1297 
1298 
1299  //logi_Lv3AuCoat->SetSensitiveDetector(new BkgSensitiveDetector("IR", 11));
1300  //logi_Lv1TaFwd->SetSensitiveDetector(new BkgSensitiveDetector("IR", 12));
1301  //logi_Lv1TaBwd->SetSensitiveDetector(new BkgSensitiveDetector("IR", 13));
1302  //logi_Lv1TaLERUp->SetSensitiveDetector(new BkgSensitiveDetector("IR", 14));
1303  //logi_Lv1TaHERDwn->SetSensitiveDetector(new BkgSensitiveDetector("IR", 15));
1304  //logi_Lv1TaHERUp->SetSensitiveDetector(new BkgSensitiveDetector("IR", 16));
1305  //logi_Lv1TaLERDwn->SetSensitiveDetector(new BkgSensitiveDetector("IR", 17));
1306  //m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", 11)));
1307  //logi_Lv3AuCoat->SetSensitiveDetector(m_sensitive.back());
1308  //m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", 12)));
1309  //logi_Lv1TaFwd->SetSensitiveDetector(m_sensitive.back());
1310  //m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", 13)));
1311  //logi_Lv1TaBwd->SetSensitiveDetector(m_sensitive.back());
1312  //m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", 14)));
1313  //logi_Lv1TaLERUp->SetSensitiveDetector(m_sensitive.back());
1314  //m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", 15)));
1315  //logi_Lv1TaHERDwn->SetSensitiveDetector(m_sensitive.back());
1316  //m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", 16)));
1317  //logi_Lv1TaHERUp->SetSensitiveDetector(m_sensitive.back());
1318  //m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", 17)));
1319  //logi_Lv1TaLERDwn->SetSensitiveDetector(m_sensitive.back());
1320 
1321 
1322 
1323  //-
1324  //----------
1325 
1328  }
1329  }
1331 }
The IR Sensitive Detector class.
void setVisibility(G4LogicalVolume &volume, bool visible)
Helper function to quickly set the visibility of a given volume.
Definition: utilities.cc:105
void setColor(G4LogicalVolume &volume, const std::string &color)
Set the color of a logical volume.
Definition: utilities.cc:97
GeometryTypes
Flag indiciating the type of geometry to be used.
Abstract base class for different kinds of events.