Belle II Software  release-08-01-10
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 #include <simulation/background/BkgSensitiveDetector.h>
17 
18 #include <cmath>
19 #include <boost/format.hpp>
20 #include <boost/foreach.hpp>
21 #include <boost/algorithm/string.hpp>
22 
23 #include <G4LogicalVolume.hh>
24 #include <G4PVPlacement.hh>
25 
26 //Shapes
27 #include <G4Trd.hh>
28 #include <G4Box.hh>
29 #include <G4Tubs.hh>
30 #include <G4Polycone.hh>
31 #include <G4UnionSolid.hh>
32 #include <G4IntersectionSolid.hh>
33 #include <G4SubtractionSolid.hh>
34 #include <G4UserLimits.hh>
35 
36 using namespace std;
37 using namespace boost;
38 
39 namespace Belle2 {
45  using namespace geometry;
46 
47  namespace ir {
48 
49  //-----------------------------------------------------------------
50  // Register the Creator
51  //-----------------------------------------------------------------
52 
53  geometry::CreatorFactory<GeoBeamPipeCreator> GeoBeamPipeFactory("BeamPipeCreator");
54 
55  //-----------------------------------------------------------------
56  // Implementation
57  //-----------------------------------------------------------------
58 
59  GeoBeamPipeCreator::GeoBeamPipeCreator()
60  {
61  }
62 
63  GeoBeamPipeCreator::~GeoBeamPipeCreator()
64  {
65  //Delete all sensitive detectors
66  BOOST_FOREACH(SensitiveDetector * sensitive, m_sensitive) {
67  delete sensitive;
68  }
69  m_sensitive.clear();
70  }
71 
72  void GeoBeamPipeCreator::createGeometry(G4LogicalVolume& topVolume, GeometryTypes)
73  {
74 
75  //########## Index ##########
76  //
77  // "IP pipe" -9.0 cm to 13.85 cm
78  // Lv1SUS
79  // Lv2OutBe
80  // Lv2InBe
81  // Lv2Paraf
82  // Lv2Vacuum
83  // Lv3AuCoat
84  // "crotch pipe Forward " 13.85 cm to 40.0 cm
85  // Lv1TaFwd
86  // Lv2VacFwd
87  // "crotch pipe Backward " -9.0 cm to -40.0 cm
88  // Lv1TaBwd
89  // Lv2VacBwd
90  // "beam pipe more Forward " 40.0 cm to 63.35 cm
91  // Lv1TaLERUp
92  // Lv2VacLERUp
93  // Lv1TaHERDwn
94  // Lv2VacHERDwn
95  // "beam pipe more Backward " -40.0 cm to -62.725 cm
96  // Lv1TaHERUp
97  // Lv2VacHERUp
98  // Lv1TaLERDwn
99  // Lv2VacLERDwn
100  // Tangusten End Mounts
101  // PXDMountFwd
102  // PXDMountFixtureFwd
103  // PXDMountBwd
104  // PXDMountFixtureBwd
105  //
106  //###########################
107 
108  double SafetyLength = m_config.getParameter("Safety.L1") * Unit::cm / Unit::mm;
109 
110  double stepMax = 5.0 * Unit::mm;
111  int flag_limitStep = int(m_config.getParameter("LimitStepLength"));
112 
113  double A11 = 0.03918;
114 
117 
118  //----------
119  //- Lv1SUS
120 
121  //get parameters from .xml file
122  std::string prep = "Lv1SUS.";
123  //
124  const int Lv1SUS_num = 21;
125  //
126  double Lv1SUS_Z[Lv1SUS_num];
127  Lv1SUS_Z[0] = 0.0;
128  for (int tmpn = 0; tmpn < 8; tmpn++) {
129  Lv1SUS_Z[0] -= m_config.getParameter(prep + (format("L%1%") % (tmpn + 1)).str().c_str()) * Unit::cm / Unit::mm;
130  }
131  Lv1SUS_Z[1] = Lv1SUS_Z[0] + m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
132  Lv1SUS_Z[2] = Lv1SUS_Z[1];
133  Lv1SUS_Z[3] = Lv1SUS_Z[2] + m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
134  Lv1SUS_Z[4] = Lv1SUS_Z[3] + m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
135  Lv1SUS_Z[5] = Lv1SUS_Z[4];
136  Lv1SUS_Z[6] = Lv1SUS_Z[5] + m_config.getParameter(prep + "L4") * Unit::cm / Unit::mm;
137  Lv1SUS_Z[7] = Lv1SUS_Z[6] + m_config.getParameter(prep + "L5") * Unit::cm / Unit::mm;
138  Lv1SUS_Z[8] = Lv1SUS_Z[7] + m_config.getParameter(prep + "L6") * Unit::cm / Unit::mm;
139  Lv1SUS_Z[9] = Lv1SUS_Z[8] + m_config.getParameter(prep + "L7") * Unit::cm / Unit::mm;
140  Lv1SUS_Z[10] = Lv1SUS_Z[9] + m_config.getParameter(prep + "L8") * Unit::cm / Unit::mm;
141  Lv1SUS_Z[11] = Lv1SUS_Z[10] + m_config.getParameter(prep + "L9") * Unit::cm / Unit::mm;
142  Lv1SUS_Z[12] = Lv1SUS_Z[11] + m_config.getParameter(prep + "L10") * Unit::cm / Unit::mm;
143  Lv1SUS_Z[13] = Lv1SUS_Z[12] + m_config.getParameter(prep + "L11") * Unit::cm / Unit::mm;
144  Lv1SUS_Z[14] = Lv1SUS_Z[13] + m_config.getParameter(prep + "L12") * Unit::cm / Unit::mm;
145  Lv1SUS_Z[15] = Lv1SUS_Z[14] + m_config.getParameter(prep + "L13") * Unit::cm / Unit::mm;
146  Lv1SUS_Z[16] = Lv1SUS_Z[15];
147  Lv1SUS_Z[17] = Lv1SUS_Z[16] + m_config.getParameter(prep + "L14") * Unit::cm / Unit::mm;
148  Lv1SUS_Z[18] = Lv1SUS_Z[17] + m_config.getParameter(prep + "L15") * Unit::cm / Unit::mm;
149  Lv1SUS_Z[19] = Lv1SUS_Z[18];
150  Lv1SUS_Z[20] = Lv1SUS_Z[19] + m_config.getParameter(prep + "L16") * Unit::cm / Unit::mm;
151  //
152  double Lv1SUS_rI[Lv1SUS_num];
153  for (int tmpn = 0; tmpn < Lv1SUS_num; tmpn++)
154  { Lv1SUS_rI[tmpn] = 0.0; }
155  //m_config.getParameter(prep+"L1")
156  double Lv1SUS_rO[Lv1SUS_num];
157  Lv1SUS_rO[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
158  Lv1SUS_rO[1] = Lv1SUS_rO[0];
159  Lv1SUS_rO[2] = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
160  Lv1SUS_rO[3] = Lv1SUS_rO[2];
161  Lv1SUS_rO[4] = m_config.getParameter(prep + "R3") * Unit::cm / Unit::mm;
162  Lv1SUS_rO[5] = m_config.getParameter(prep + "R4") * Unit::cm / Unit::mm;
163  Lv1SUS_rO[6] = Lv1SUS_rO[5];
164  Lv1SUS_rO[7] = m_config.getParameter(prep + "R5") * Unit::cm / Unit::mm;
165  Lv1SUS_rO[8] = Lv1SUS_rO[7];
166  Lv1SUS_rO[9] = m_config.getParameter(prep + "R6") * Unit::cm / Unit::mm;
167  Lv1SUS_rO[10] = Lv1SUS_rO[9];
168  Lv1SUS_rO[11] = Lv1SUS_rO[10];
169  Lv1SUS_rO[12] = m_config.getParameter(prep + "R7") * Unit::cm / Unit::mm;
170  Lv1SUS_rO[13] = Lv1SUS_rO[12];
171  Lv1SUS_rO[14] = m_config.getParameter(prep + "R8") * Unit::cm / Unit::mm;
172  Lv1SUS_rO[15] = Lv1SUS_rO[14];
173  Lv1SUS_rO[16] = m_config.getParameter(prep + "R9") * Unit::cm / Unit::mm;
174  Lv1SUS_rO[17] = m_config.getParameter(prep + "R10") * Unit::cm / Unit::mm;
175  Lv1SUS_rO[18] = Lv1SUS_rO[17];
176  Lv1SUS_rO[19] = m_config.getParameter(prep + "R11") * Unit::cm / Unit::mm;
177  Lv1SUS_rO[20] = Lv1SUS_rO[19];
178  //
179  string strMat_Lv1SUS = m_config.getParameterStr(prep + "Material");
180  G4Material* mat_Lv1SUS = Materials::get(strMat_Lv1SUS);
181 
182  //define geometry
183  G4Polycone* geo_Lv1SUS = new G4Polycone("geo_Lv1SUS_name", 0, 2 * M_PI, Lv1SUS_num, Lv1SUS_Z, Lv1SUS_rI, Lv1SUS_rO);
184  G4LogicalVolume* logi_Lv1SUS = new G4LogicalVolume(geo_Lv1SUS, mat_Lv1SUS, "logi_Lv1SUS_name");
185 
186  //for (int i=0;i<Lv1SUS_num;i++)printf("%f %f\n",Lv1SUS_Z[i],Lv1SUS_rO[i]);
187 
188  //- put volume
189  setColor(*logi_Lv1SUS, "#666666");
190  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv1SUS, "phys_Lv1SUS_name", &topVolume, false, 0);
191 
192 
193  //----------
194  //- Lv2OutTi added for Phase 3.
195  //-
196  //----------
197  //get parameters from .xml file
198  if (m_config.getParameter("Lv2OutTi.L1", -1) > 0) {
199  prep = "Lv2OutTi.";
200  //
201  const int Lv2OutTi_num = 2;
202  //
203  double Lv2OutTi_Z[Lv2OutTi_num];
204  Lv2OutTi_Z[0] = -m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
205  Lv2OutTi_Z[1] = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
206  //
207  double Lv2OutTi_rI[Lv2OutTi_num];
208  Lv2OutTi_rI[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
209  Lv2OutTi_rI[1] = Lv2OutTi_rI[0];
210  //
211  double Lv2OutTi_rO[Lv2OutTi_num];
212  Lv2OutTi_rO[0] = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
213  Lv2OutTi_rO[1] = Lv2OutTi_rO[0];
214  //
215  string strMat_Lv2OutTi = m_config.getParameterStr(prep + "Material");
216  G4Material* mat_Lv2OutTi = Materials::get(strMat_Lv2OutTi);
217 
218  //define geometry
219  G4Polycone* geo_Lv2OutTi = new G4Polycone("geo_Lv2OutTi_name", 0, 2 * M_PI, Lv2OutTi_num, Lv2OutTi_Z, Lv2OutTi_rI, Lv2OutTi_rO);
220  G4LogicalVolume* logi_Lv2OutTi = new G4LogicalVolume(geo_Lv2OutTi, mat_Lv2OutTi, "logi_Lv2OutTi_name");
221 
222  //- put volume
223  setColor(*logi_Lv2OutTi, "#333300");
224  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2OutTi, "phys_Lv2OutTi_name", logi_Lv1SUS, false, 0);
225  }
226 
227 
228  //----------
229  //- Lv2OutBe
230  //-
231  //----------
232 
233  //get parameters from .xml file
234  prep = "Lv2OutBe.";
235  //
236  const int Lv2OutBe_num = 2;
237  //
238  double Lv2OutBe_Z[Lv2OutBe_num];
239  Lv2OutBe_Z[0] = -m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
240  Lv2OutBe_Z[1] = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
241  //
242  double Lv2OutBe_rI[Lv2OutBe_num];
243  Lv2OutBe_rI[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
244  Lv2OutBe_rI[1] = Lv2OutBe_rI[0];
245  //
246  double Lv2OutBe_rO[Lv2OutBe_num];
247  Lv2OutBe_rO[0] = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
248  Lv2OutBe_rO[1] = Lv2OutBe_rO[0];
249  //
250  string strMat_Lv2OutBe = m_config.getParameterStr(prep + "Material");
251  G4Material* mat_Lv2OutBe = Materials::get(strMat_Lv2OutBe);
252 
253  //define geometry
254  G4Polycone* geo_Lv2OutBe = new G4Polycone("geo_Lv2OutBe_name", 0, 2 * M_PI, Lv2OutBe_num, Lv2OutBe_Z, Lv2OutBe_rI, Lv2OutBe_rO);
255  G4LogicalVolume* logi_Lv2OutBe = new G4LogicalVolume(geo_Lv2OutBe, mat_Lv2OutBe, "logi_Lv2OutBe_name");
256 
257  //- put volume
258  setColor(*logi_Lv2OutBe, "#333300");
259  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2OutBe, "phys_Lv2OutBe_name", logi_Lv1SUS, false, 0);
260 
261 
262  //----------
263  //- Lv2InBe
264  //-
265  //----------
266 
267  //get parameters from .xml file
268  prep = "Lv2InBe.";
269  //
270  const int Lv2InBe_num = 2;
271  //
272  double Lv2InBe_Z[Lv2InBe_num];
273  Lv2InBe_Z[0] = -m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
274  Lv2InBe_Z[1] = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
275  //
276  double Lv2InBe_rI[Lv2InBe_num];
277  Lv2InBe_rI[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
278  Lv2InBe_rI[1] = Lv2InBe_rI[0];
279  //
280  double Lv2InBe_rO[Lv2InBe_num];
281  Lv2InBe_rO[0] = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
282  Lv2InBe_rO[1] = Lv2InBe_rO[0];
283  //
284  string strMat_Lv2InBe = m_config.getParameterStr(prep + "Material");
285  G4Material* mat_Lv2InBe = Materials::get(strMat_Lv2InBe);
286 
287  //define geometry
288  G4Polycone* geo_Lv2InBe = new G4Polycone("geo_Lv2InBe_name", 0, 2 * M_PI, Lv2InBe_num, Lv2InBe_Z, Lv2InBe_rI, Lv2InBe_rO);
289  G4LogicalVolume* logi_Lv2InBe = new G4LogicalVolume(geo_Lv2InBe, mat_Lv2InBe, "logi_Lv2InBe_name");
290 
291  //- put volume
292  setColor(*logi_Lv2InBe, "#333300");
293  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2InBe, "phys_Lv2InBe_name", logi_Lv1SUS, false, 0);
294 
295  //----------
296  //- Lv2Vacuum
297 
298  //get parameters from .xml file
299  prep = "Lv2Vacuum.";
300  //
301  double Lv2Vacuum_L1 = m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
302  double Lv2Vacuum_L2 = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
303  double Lv2Vacuum_L3 = m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
304  double Lv2Vacuum_L4 = m_config.getParameter(prep + "L4") * Unit::cm / Unit::mm;
305  double Lv2Vacuum_R1 = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
306  double Lv2Vacuum_R2 = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
307  double Lv2Vacuum_R3 = m_config.getParameter(prep + "R3") * Unit::cm / Unit::mm;
308  //double Lv2Vacuum_A1 = cLv2Vacuum.getAngle("A1");
309  double Lv2Vacuum_A2 = m_config.getParameter(prep + "A2");
310  //
311  string strMat_Lv2Vacuum = m_config.getParameterStr(prep + "Material");
312  G4Material* mat_Lv2Vacuum = Materials::get(strMat_Lv2Vacuum);
313  //
314  // Part 1
315  const int Lv2Vacuum1_num = 2;
316  //
317  double Lv2Vacuum1_Z[Lv2Vacuum1_num];
318  Lv2Vacuum1_Z[0] = -Lv2Vacuum_L1;
319  Lv2Vacuum1_Z[1] = Lv2Vacuum_L2;
320  double Lv2Vacuum1_rI[Lv2Vacuum1_num];
321  for (int tmpn = 0; tmpn < Lv2Vacuum1_num; tmpn++)
322  { Lv2Vacuum1_rI[tmpn] = 0.0; }
323  double Lv2Vacuum1_rO[Lv2Vacuum1_num];
324  Lv2Vacuum1_rO[0] = Lv2Vacuum_R1;
325  Lv2Vacuum1_rO[1] = Lv2Vacuum_R1;
326  // Part 2
327  double Lv2Vacuum2_Z1 = 2. * Lv2Vacuum_L3;
328  double Lv2Vacuum2_rI1 = 0.0;
329  double Lv2Vacuum2_rO1 = Lv2Vacuum_R2;
330  //
331  double Lv2Vacuum2_Z2 = (Lv2Vacuum_L3 * cos(Lv2Vacuum_A2)) + SafetyLength;
332  double Lv2Vacuum2_rI2 = 0.0;
333  double Lv2Vacuum2_rO2 = 2 * Lv2Vacuum_R2;
334  // Part 3
335  const int Lv2Vacuum3_num = 2;
336  //
337  double Lv2Vacuum3_Z[Lv2Vacuum3_num];
338  Lv2Vacuum3_Z[0] = 0.0;
339  Lv2Vacuum3_Z[1] = Lv2Vacuum_L4;
340  double Lv2Vacuum3_rI[Lv2Vacuum3_num];
341  for (int tmpn = 0; tmpn < Lv2Vacuum3_num; tmpn++)
342  { Lv2Vacuum3_rI[tmpn] = 0.0; }
343  double Lv2Vacuum3_rO[Lv2Vacuum3_num];
344  Lv2Vacuum3_rO[0] = Lv2Vacuum_R3;
345  Lv2Vacuum3_rO[1] = Lv2Vacuum_R3;
346 
347  //define geometry
348  // Part 1
349  G4Polycone* geo_Lv2VacuumPart1 = new G4Polycone("geo_Lv2VacuumPart1_name", 0, 2 * M_PI, Lv2Vacuum1_num, Lv2Vacuum1_Z, Lv2Vacuum1_rI,
350  Lv2Vacuum1_rO);
351  // Part 2
352  G4Tubs* geo_Lv2VacuumPart2_1 = new G4Tubs("geo_Lv2VacuumPart2_1_name", Lv2Vacuum2_rI1, Lv2Vacuum2_rO1, Lv2Vacuum2_Z1, 0, 2 * M_PI);
353  G4Tubs* geo_Lv2VacuumPart2_2 = new G4Tubs("geo_Lv2VacuumPart2_2_name", Lv2Vacuum2_rI2, Lv2Vacuum2_rO2, Lv2Vacuum2_Z2, 0, 2 * M_PI);
354  G4Transform3D transform_Lv2VacuumPart2_2 = G4Translate3D(0., 0., 0.);
355  transform_Lv2VacuumPart2_2 = transform_Lv2VacuumPart2_2 * G4RotateY3D(-Lv2Vacuum_A2);
356  G4IntersectionSolid* geo_Lv2VacuumPart2 = new G4IntersectionSolid("geo_Lv2VacuumPart2_name", geo_Lv2VacuumPart2_1,
357  geo_Lv2VacuumPart2_2, transform_Lv2VacuumPart2_2);
358  // Part 3
359  G4Polycone* geo_Lv2VacuumPart3 = new G4Polycone("geo_Lv2VacuumPart3_name", 0, 2 * M_PI, Lv2Vacuum3_num, Lv2Vacuum3_Z, Lv2Vacuum3_rI,
360  Lv2Vacuum3_rO);
361  // Part1+2+3
362 // G4Transform3D transform_Lv2VacuumPart3 = G4Translate3D(0., 0., 0.);
363  G4Transform3D transform_Lv2VacuumPart3 = G4Translate3D(-0.5, 0., 0.);
364  // A11 instead of A1
365  transform_Lv2VacuumPart3 = transform_Lv2VacuumPart3 * G4RotateY3D(-A11);
366  G4UnionSolid* geo_Lv2Vacuumxx = new G4UnionSolid("geo_Lv2Vacuumxx_name", geo_Lv2VacuumPart1, geo_Lv2VacuumPart3,
367  transform_Lv2VacuumPart3);
368  G4Transform3D transform_Lv2VacuumPart2 = G4Translate3D(Lv2Vacuum_L3 * sin(Lv2Vacuum_A2), 0.,
369  Lv2Vacuum_L2 + Lv2Vacuum_L3 * cos(Lv2Vacuum_A2));
370  transform_Lv2VacuumPart2 = transform_Lv2VacuumPart2 * G4RotateY3D(Lv2Vacuum_A2);
371  G4UnionSolid* geo_Lv2Vacuumx = new G4UnionSolid("geo_Lv2Vacuumx_name", geo_Lv2Vacuumxx, geo_Lv2VacuumPart2,
372  transform_Lv2VacuumPart2);
373  // Intersection with mother
374  G4IntersectionSolid* geo_Lv2Vacuum = new G4IntersectionSolid("geo_Lv2Vacuum_name", geo_Lv2Vacuumx, geo_Lv1SUS);
375  G4LogicalVolume* logi_Lv2Vacuum = new G4LogicalVolume(geo_Lv2Vacuum, mat_Lv2Vacuum, "logi_Lv2Vacuum_name");
376  if (flag_limitStep) logi_Lv2Vacuum->SetUserLimits(new G4UserLimits(stepMax));
377 
378  //- put volume
379  setColor(*logi_Lv2Vacuum, "#CCCCCC");
380  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2Vacuum, "phys_Lv2Vacuum_name", logi_Lv1SUS, false, 0);
381 
382  //-
383  //----------
384 
385  //----------
386  //- Lv2Paraf
387 
388  //get parameters from .xml file
389  prep = "Lv2Paraf.";
390  //
391  const int Lv2Paraf1_num = 20;
392  const int Lv2Paraf2_num = 3;
393  //
394  double Lv2Paraf1_Z[Lv2Paraf1_num];
395  Lv2Paraf1_Z[0] = 0.0;
396  for (int tmpn = 0; tmpn < 9; tmpn++) {
397  Lv2Paraf1_Z[0] -= m_config.getParameter(prep + (format("L%1%") % (tmpn + 1)).str().c_str()) * Unit::cm / Unit::mm;
398  }
399  Lv2Paraf1_Z[1] = Lv2Paraf1_Z[0] + m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
400  Lv2Paraf1_Z[2] = Lv2Paraf1_Z[1];
401  Lv2Paraf1_Z[3] = Lv2Paraf1_Z[2] + m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
402  Lv2Paraf1_Z[4] = Lv2Paraf1_Z[3] + m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
403  Lv2Paraf1_Z[5] = Lv2Paraf1_Z[4] + m_config.getParameter(prep + "L4") * Unit::cm / Unit::mm;
404  Lv2Paraf1_Z[6] = Lv2Paraf1_Z[5] + m_config.getParameter(prep + "L5") * Unit::cm / Unit::mm;
405  Lv2Paraf1_Z[7] = Lv2Paraf1_Z[6] + m_config.getParameter(prep + "L6") * Unit::cm / Unit::mm;
406  Lv2Paraf1_Z[8] = Lv2Paraf1_Z[7] + m_config.getParameter(prep + "L7") * Unit::cm / Unit::mm;
407  Lv2Paraf1_Z[9] = Lv2Paraf1_Z[8] + m_config.getParameter(prep + "L8") * Unit::cm / Unit::mm;
408  Lv2Paraf1_Z[10] = Lv2Paraf1_Z[9] + m_config.getParameter(prep + "L9") * Unit::cm / Unit::mm + m_config.getParameter(
409  prep + "L10") * Unit::cm / Unit::mm;
410  Lv2Paraf1_Z[11] = Lv2Paraf1_Z[10] + m_config.getParameter(prep + "L11") * Unit::cm / Unit::mm;
411  Lv2Paraf1_Z[12] = Lv2Paraf1_Z[11] + m_config.getParameter(prep + "L12") * Unit::cm / Unit::mm;
412  Lv2Paraf1_Z[13] = Lv2Paraf1_Z[12] + m_config.getParameter(prep + "L13") * Unit::cm / Unit::mm;
413  Lv2Paraf1_Z[14] = Lv2Paraf1_Z[13] + m_config.getParameter(prep + "L14") * Unit::cm / Unit::mm;
414  Lv2Paraf1_Z[15] = Lv2Paraf1_Z[14] + m_config.getParameter(prep + "L15") * Unit::cm / Unit::mm + m_config.getParameter(
415  prep + "L16") * Unit::cm / Unit::mm;
416  Lv2Paraf1_Z[16] = Lv2Paraf1_Z[15] + m_config.getParameter(prep + "L17") * Unit::cm / Unit::mm + m_config.getParameter(
417  prep + "L18") * Unit::cm / Unit::mm;
418  Lv2Paraf1_Z[17] = Lv2Paraf1_Z[16] + m_config.getParameter(prep + "L19") * Unit::cm / Unit::mm;
419  Lv2Paraf1_Z[18] = Lv2Paraf1_Z[17];
420  Lv2Paraf1_Z[19] = Lv2Paraf1_Z[18] + m_config.getParameter(prep + "L20") * Unit::cm / Unit::mm;
421  //
422  double Lv2Paraf1_rI[Lv2Paraf1_num];
423  Lv2Paraf1_rI[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
424  Lv2Paraf1_rI[1] = Lv2Paraf1_rI[0];
425  Lv2Paraf1_rI[2] = Lv2Paraf1_rI[1];
426  Lv2Paraf1_rI[3] = Lv2Paraf1_rI[2];
427  Lv2Paraf1_rI[4] = Lv2Paraf1_rI[3];
428  Lv2Paraf1_rI[5] = Lv2Paraf1_rI[4];
429  Lv2Paraf1_rI[6] = Lv2Paraf1_rI[5];
430  Lv2Paraf1_rI[7] = m_config.getParameter(prep + "R6") * Unit::cm / Unit::mm;
431  Lv2Paraf1_rI[8] = Lv2Paraf1_rI[7];
432  Lv2Paraf1_rI[9] = Lv2Paraf1_rI[8];
433  Lv2Paraf1_rI[10] = Lv2Paraf1_rI[9];
434  Lv2Paraf1_rI[11] = Lv2Paraf1_rI[10];
435  Lv2Paraf1_rI[12] = Lv2Paraf1_rI[11];
436  Lv2Paraf1_rI[13] = m_config.getParameter(prep + "R9") * Unit::cm / Unit::mm;
437  Lv2Paraf1_rI[14] = Lv2Paraf1_rI[13];
438  Lv2Paraf1_rI[15] = Lv2Paraf1_rI[14];
439  Lv2Paraf1_rI[16] = Lv2Paraf1_rI[15];
440  Lv2Paraf1_rI[17] = Lv2Paraf1_rI[16];
441  Lv2Paraf1_rI[18] = Lv2Paraf1_rI[17];
442  Lv2Paraf1_rI[19] = Lv2Paraf1_rI[18];
443  //
444  double Lv2Paraf1_rO[Lv2Paraf1_num];
445  Lv2Paraf1_rO[0] = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
446  Lv2Paraf1_rO[1] = Lv2Paraf1_rO[0];
447  Lv2Paraf1_rO[2] = m_config.getParameter(prep + "R3") * Unit::cm / Unit::mm;
448  Lv2Paraf1_rO[3] = m_config.getParameter(prep + "R4") * Unit::cm / Unit::mm;
449  Lv2Paraf1_rO[4] = Lv2Paraf1_rO[3];
450  Lv2Paraf1_rO[5] = m_config.getParameter(prep + "R5") * Unit::cm / Unit::mm;
451  Lv2Paraf1_rO[6] = Lv2Paraf1_rO[5];
452  Lv2Paraf1_rO[7] = Lv2Paraf1_rO[6];
453  Lv2Paraf1_rO[8] = Lv2Paraf1_rO[7];
454  Lv2Paraf1_rO[9] = m_config.getParameter(prep + "R7") * Unit::cm / Unit::mm;
455  Lv2Paraf1_rO[10] = Lv2Paraf1_rO[9];
456  Lv2Paraf1_rO[11] = m_config.getParameter(prep + "R8") * Unit::cm / Unit::mm;
457  Lv2Paraf1_rO[12] = Lv2Paraf1_rO[11];
458  Lv2Paraf1_rO[13] = Lv2Paraf1_rO[12];
459  Lv2Paraf1_rO[14] = Lv2Paraf1_rO[13];
460  Lv2Paraf1_rO[15] = m_config.getParameter(prep + "R10") * Unit::cm / Unit::mm;
461  Lv2Paraf1_rO[16] = Lv2Paraf1_rO[15];
462  Lv2Paraf1_rO[17] = m_config.getParameter(prep + "R12") * Unit::cm / Unit::mm;
463  Lv2Paraf1_rO[18] = m_config.getParameter(prep + "R13") * Unit::cm / Unit::mm;
464  Lv2Paraf1_rO[19] = Lv2Paraf1_rO[18];
465  //
466  //
467  double Lv2Paraf2_Z[Lv2Paraf2_num];
468  Lv2Paraf2_Z[0] = 0.0;
469  for (int tmpn = 10; tmpn <= 15; tmpn++) {
470  Lv2Paraf2_Z[0] += m_config.getParameter(prep + (format("L%1%") % tmpn).str().c_str()) * Unit::cm / Unit::mm;
471  }
472  Lv2Paraf2_Z[1] = Lv2Paraf2_Z[0] + m_config.getParameter(prep + "L16") * Unit::cm / Unit::mm + m_config.getParameter(
473  prep + "L17") * Unit::cm / Unit::mm;
474  Lv2Paraf2_Z[2] = Lv2Paraf2_Z[1] + m_config.getParameter(prep + "L18") * Unit::cm / Unit::mm + m_config.getParameter(
475  prep + "L19") * Unit::cm / Unit::mm +
476  m_config.getParameter(prep + "L20") * Unit::cm / Unit::mm + 1.0;
477  //
478  double Lv2Paraf2_rI[Lv2Paraf2_num];
479  for (int tmpn = 0; tmpn < Lv2Paraf2_num; tmpn++)
480  { Lv2Paraf2_rI[tmpn] = 0.0; }
481  //
482  double Lv2Paraf2_rO[Lv2Paraf2_num];
483  Lv2Paraf2_rO[0] = m_config.getParameter(prep + "R9") * Unit::cm / Unit::mm;
484  Lv2Paraf2_rO[1] = m_config.getParameter(prep + "R11") * Unit::cm / Unit::mm;
485  Lv2Paraf2_rO[2] = Lv2Paraf2_rO[1];
486  //
487  string strMat_Lv2Paraf = m_config.getParameterStr(prep + "Material");
488  G4Material* mat_Lv2Paraf = Materials::get(strMat_Lv2Paraf);
489 
490  //define geometry
491  G4Polycone* geo_Lv2Parafpcon1 = new G4Polycone("geo_Lv2Parafpcon1_name", 0, 2 * M_PI, Lv2Paraf1_num, Lv2Paraf1_Z, Lv2Paraf1_rI,
492  Lv2Paraf1_rO);
493  G4Polycone* geo_Lv2Parafpcon2 = new G4Polycone("geo_Lv2Parafpcon2_name", 0, 2 * M_PI, Lv2Paraf2_num, Lv2Paraf2_Z, Lv2Paraf2_rI,
494  Lv2Paraf2_rO);
495  G4SubtractionSolid* geo_Lv2Paraf = new G4SubtractionSolid("geo_Lv2Paraf_name", geo_Lv2Parafpcon1, geo_Lv2Parafpcon2);
496  G4LogicalVolume* logi_Lv2Paraf = new G4LogicalVolume(geo_Lv2Paraf, mat_Lv2Paraf, "logi_Lv2Paraf_name");
497 
498  //- put volume
499  setColor(*logi_Lv2Paraf, "#00CCCC");
500  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2Paraf, "phys_Lv2Paraf_name", logi_Lv1SUS, false, 0);
501 
502  //-
503  //----------
504 
505  //----------
506  //- Lv3AuCoat
507 
508  //get parameters from .xml file
509  prep = "Lv3AuCoat.";
510  //
511  const int Lv3AuCoat_num = 2;
512  //
513  double Lv3AuCoat_Z[Lv3AuCoat_num];
514  Lv3AuCoat_Z[0] = -m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
515  Lv3AuCoat_Z[1] = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
516  //
517  double Lv3AuCoat_rI[Lv3AuCoat_num];
518  Lv3AuCoat_rI[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
519  Lv3AuCoat_rI[1] = Lv3AuCoat_rI[0];
520  //
521  double Lv3AuCoat_rO[Lv3AuCoat_num];
522  Lv3AuCoat_rO[0] = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
523  Lv3AuCoat_rO[1] = Lv3AuCoat_rO[0];
524  //
525  string strMat_Lv3AuCoat = m_config.getParameterStr(prep + "Material");
526  G4Material* mat_Lv3AuCoat = Materials::get(strMat_Lv3AuCoat);
527 
528  //define geometry
529  G4Polycone* geo_Lv3AuCoat = new G4Polycone("geo_Lv3AuCoat_name", 0, 2 * M_PI, Lv3AuCoat_num, Lv3AuCoat_Z, Lv3AuCoat_rI,
530  Lv3AuCoat_rO);
531  G4LogicalVolume* logi_Lv3AuCoat = new G4LogicalVolume(geo_Lv3AuCoat, mat_Lv3AuCoat, "logi_Lv3AuCoat_name");
532 
533  //- put volume
534  setColor(*logi_Lv3AuCoat, "#CCCC00");
535  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv3AuCoat, "phys_Lv3AuCoat_name", logi_Lv2Vacuum, false, 0);
536 
537  //-
538  //----------
539 
542 
543  //get parameters from .xml file
544  prep = "Flange.";
545  //
546  double Flange_R = m_config.getParameter(prep + "R") * Unit::cm / Unit::mm;
547  double Flange_L1 = m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
548  //double Flange_L2 = m_config.getParameter(prep+"L2") * Unit::cm / Unit::mm;// Not used (2015/April/16. masked by T.Hara)
549  double Flange_D = m_config.getParameter(prep + "D") * Unit::cm / Unit::mm;
550  double Flange_T = m_config.getParameter(prep + "T") * Unit::cm / Unit::mm;
551 
552  //define geometry
553  //G4Box* geo_Flange0 = new G4Box("geo_Flange0_name", Flange_L2, Flange_R, Flange_T);
554  G4Tubs* geo_Flange0 = new G4Tubs("geo_Flange0_name", 0, 424 * Unit::mm, Flange_T, 0, 2 * M_PI);
555  G4Tubs* geo_Flange1 = new G4Tubs("geo_Flange1_name", 0, Flange_R, Flange_T, 0, 2 * M_PI);
556  G4Tubs* geo_Flange2 = new G4Tubs("geo_Flange2_name", 0, Flange_R, Flange_T, 0, 2 * M_PI);
557 
558  G4UnionSolid* geo_Flange_x = new G4UnionSolid("geo_Flange_x_name", geo_Flange1, geo_Flange2, G4Translate3D(-Flange_L1 * 2, 0, 0));
559  G4IntersectionSolid* geo_Flange = new G4IntersectionSolid("geo_Flange_name", geo_Flange0, geo_Flange_x, G4Translate3D(Flange_L1, 0,
560  0));
561 
562 
565 
568 
569 
570  //----------
571  //- Lv1TaFwd
572 
573  //get parameters from .xml file
574  prep = "Lv1TaFwd.";
575  //
576  double Lv1TaFwd_D1 = m_config.getParameter(prep + "D1") * Unit::cm / Unit::mm;
577  double Lv1TaFwd_L1 = m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
578  //double Lv1TaFwd_L2 = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
579  //double Lv1TaFwd_L3 = m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
580  double Lv1TaFwd_T1 = m_config.getParameter(prep + "T1") * Unit::cm / Unit::mm;
581  double Lv1TaFwd_aR1 = m_config.getParameter(prep + "aR1") * Unit::cm / Unit::mm;
582  double Lv1TaFwd_aR2 = m_config.getParameter(prep + "aR2") * Unit::cm / Unit::mm;
583  double Lv1TaFwd_aL1 = m_config.getParameter(prep + "aL1") * Unit::cm / Unit::mm;
584  double Lv1TaFwd_aL2 = m_config.getParameter(prep + "aL2") * Unit::cm / Unit::mm;
585  double Lv1TaFwd_aL3 = m_config.getParameter(prep + "aL3") * Unit::cm / Unit::mm;
586  double Lv1TaFwd_bL1 = Lv1TaFwd_L1 - Lv1TaFwd_aL1 - Lv1TaFwd_aL2 - Lv1TaFwd_aL3;
587  double Lv1TaFwd_bL2 = m_config.getParameter(prep + "bL2") * Unit::cm / Unit::mm;
588  double Lv1TaFwd_bL3 = m_config.getParameter(prep + "bL3") * Unit::cm / Unit::mm;
589  //
590  string strMat_Lv1TaFwd = m_config.getParameterStr(prep + "Material");
591  G4Material* mat_Lv1TaFwd = Materials::get(strMat_Lv1TaFwd);
592 
593  //define geometry
594  //G4Trd* geo_Lv1TaFwd_xx = new G4Trd("geo_Lv1TaFwd_xx_name", Lv1TaFwd_L2, Lv1TaFwd_L3, Lv1TaFwd_T1, Lv1TaFwd_T1, Lv1TaFwd_L1 / 2.0);
595  double Lv1TaFwd_aR[4] = {Lv1TaFwd_aR1, Lv1TaFwd_aR1, Lv1TaFwd_aR2, Lv1TaFwd_aR2};
596  double Lv1TaFwd_ar[4] = {0, 0, 0, 0};
597  double Lv1TaFwd_aL[4] = { -Lv1TaFwd_L1 / 2.0 + 0,
598  -Lv1TaFwd_L1 / 2.0 + Lv1TaFwd_aL1,
599  -Lv1TaFwd_L1 / 2.0 + Lv1TaFwd_aL1 + Lv1TaFwd_aL2,
600  -Lv1TaFwd_L1 / 2.0 + Lv1TaFwd_aL1 + Lv1TaFwd_aL2 + Lv1TaFwd_aL3
601  };
602  G4VSolid* geo_Lv1TaFwd_a = new G4Polycone("geo_Lv1TaFwd_a_name", 0, 2 * M_PI, 4, Lv1TaFwd_aL, Lv1TaFwd_ar, Lv1TaFwd_aR);
603  G4VSolid* geo_Lv1TaFwd_b = new G4Trd("geo_Lv1TaFwd_b_name", Lv1TaFwd_bL2, Lv1TaFwd_bL3, Lv1TaFwd_T1, Lv1TaFwd_T1,
604  Lv1TaFwd_bL1 / 2.0);
605  G4VSolid* geo_Lv1TaFwd_c = new G4Box("geo_Lv1TaFwd_c_name", 200, Lv1TaFwd_T1, (Lv1TaFwd_aL1 + Lv1TaFwd_aL2 + Lv1TaFwd_aL3) / 2.0);
606  G4VSolid* geo_Lv1TaFwd_d = new G4IntersectionSolid("geo_Lv1TaFwd_d_name", geo_Lv1TaFwd_a, geo_Lv1TaFwd_c, G4Translate3D(0, 0,
607  -Lv1TaFwd_L1 / 2.0 + (Lv1TaFwd_aL1 + Lv1TaFwd_aL2 + Lv1TaFwd_aL3) / 2.0));
608  G4VSolid* geo_Lv1TaFwd_xx = new G4UnionSolid("geo_Lv1TaFwd_xx_name", geo_Lv1TaFwd_d, geo_Lv1TaFwd_b, G4Translate3D(0, 0,
609  Lv1TaFwd_L1 / 2.0 - Lv1TaFwd_bL1 / 2.0));
610  G4UnionSolid* geo_Lv1TaFwd_x
611  = new G4UnionSolid("geo_Lv1TaFwd_x_name", geo_Lv1TaFwd_xx, geo_Flange,
612  G4Translate3D(0, 0, Flange_D - (Lv1TaFwd_D1 + Lv1TaFwd_L1 / 2.0)));
613 
614  //===MODIFY ME!!===
615  //avoid overlap with HeavyMetalShield
616  double HMS_Z[4] = {350, 410, 450, 482};
617  double HMS_rI[4] = {35.5, 35.5, 42.5, 42.5};
618  double HMS_rO[4] = {100, 100, 100, 100};
619  G4Polycone* geo_HMS = new G4Polycone("geo_HMS_name", 0, 2 * M_PI, 4, HMS_Z, HMS_rI, HMS_rO);
620  G4SubtractionSolid* geo_Lv1TaFwd = new G4SubtractionSolid("geo_Lv1TaFwd_name", geo_Lv1TaFwd_x, geo_HMS,
621  G4Translate3D(0, 0, -(Lv1TaFwd_D1 + Lv1TaFwd_L1 / 2.0)));
622 
623  G4LogicalVolume* logi_Lv1TaFwd = new G4LogicalVolume(geo_Lv1TaFwd, mat_Lv1TaFwd, "logi_Lv1TaFwd_name");
624 
625  //- put volume at (0.,0.,D1 + L1/2)
626  setColor(*logi_Lv1TaFwd, "#333333");
627  new G4PVPlacement(0, G4ThreeVector(0, 0, Lv1TaFwd_D1 + Lv1TaFwd_L1 / 2.0), logi_Lv1TaFwd, "phys_Lv1TaFwd_name", &topVolume, false,
628  0);
629 
630 
631  //----------
632  //- Lv2VacFwd
633 
634  //get parameters from .xml file
635  prep = "Lv2VacFwd.";
636  //
637  double Lv2VacFwd_D1 = m_config.getParameter(prep + "D1") * Unit::cm / Unit::mm;
638  double Lv2VacFwd_D2 = m_config.getParameter(prep + "D2") * Unit::cm / Unit::mm;
639  double Lv2VacFwd_D3 = m_config.getParameter(prep + "D3") * Unit::cm / Unit::mm;
640  double Lv2VacFwd_L1 = m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
641  double Lv2VacFwd_L2 = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
642  double Lv2VacFwd_L3 = m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
643  double Lv2VacFwd_R1 = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
644  double Lv2VacFwd_R2 = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
645  double Lv2VacFwd_R3 = m_config.getParameter(prep + "R3") * Unit::cm / Unit::mm;
646  double Lv2VacFwd_R4 = m_config.getParameter(prep + "R4") * Unit::cm / Unit::mm;
647  double Lv2VacFwd_A1 = m_config.getParameter(prep + "A1");
648  double Lv2VacFwd_A2 = m_config.getParameter(prep + "A2");
649  //
650  string strMat_Lv2VacFwd = m_config.getParameterStr(prep + "Material");
651  G4Material* mat_Lv2VacFwd = Materials::get(strMat_Lv2VacFwd);
652  //
653  // Part 1
654  double Lv2VacFwd1_Z1 = sqrt(Lv2VacFwd_D1 * Lv2VacFwd_D1 + Lv2VacFwd_D2 * Lv2VacFwd_D2 - 2.*Lv2VacFwd_D1 * Lv2VacFwd_D2 * cos(
655  Lv2VacFwd_A1));
656  double Lv2VacFwd1_rI1 = 0.0;
657  double Lv2VacFwd1_rO1 = Lv2VacFwd_R1;
658  //
659  double Lv2VacFwd1_Z2 = (Lv2VacFwd1_Z1 / 2. * cos(Lv2VacFwd_A2)) + SafetyLength;
660  double Lv2VacFwd1_rI2 = 0.0;
661  double Lv2VacFwd1_rO2 = 2 * Lv2VacFwd_R1;
662  // Part 2
663  double Lv2VacFwd2_Z1 = Lv2VacFwd_L1;
664  double Lv2VacFwd2_rI1 = 0.0;
665  double Lv2VacFwd2_rO1 = Lv2VacFwd_R2;
666  //
667  double Lv2VacFwd2_Z2 = (Lv2VacFwd_L1 / 2. * cos(Lv2VacFwd_A2)) + SafetyLength;
668  double Lv2VacFwd2_rI2 = 0.0;
669  double Lv2VacFwd2_rO2 = 2 * Lv2VacFwd_R2;
670  // Part 3
671  const int Lv2VacFwd3_num1 = 2; // Cylindrical part
672  const int Lv2VacFwd3_num2 = 3; // Policone part
673  //-----------> Cylindrical part
674  double Lv2VacFwd_Z1[Lv2VacFwd3_num1];
675  Lv2VacFwd_Z1[0] = 0.0;
676 // Lv2VacFwd_Z1[1] = Lv2VacFwd_D3 - Lv2VacFwd_L2;
677  Lv2VacFwd_Z1[1] = Lv2VacFwd_D3 - Lv2VacFwd_L2 + 0.03 * SafetyLength;
678  double Lv2VacFwd_rI1[Lv2VacFwd3_num1];
679  for (int tmpn = 0; tmpn < Lv2VacFwd3_num1; tmpn++)
680  { Lv2VacFwd_rI1[tmpn] = 0.0; }
681  double Lv2VacFwd_rO1[Lv2VacFwd3_num1];
682  Lv2VacFwd_rO1[0] = Lv2VacFwd_R3;
683  Lv2VacFwd_rO1[1] = Lv2VacFwd_R3;
684  //<---------------
685  //----------->Policone part
686  double Lv2VacFwd_Z2[Lv2VacFwd3_num2];
687  Lv2VacFwd_Z2[0] = Lv2VacFwd_D3 - Lv2VacFwd_L2;
688  Lv2VacFwd_Z2[1] = Lv2VacFwd_D3;
689  Lv2VacFwd_Z2[2] = Lv2VacFwd_D3 + Lv2VacFwd_L3;
690  double Lv2VacFwd_rI2[Lv2VacFwd3_num2];
691  for (int tmpn = 0; tmpn < Lv2VacFwd3_num2; tmpn++)
692  { Lv2VacFwd_rI2[tmpn] = 0.0; }
693  double Lv2VacFwd_rO2[Lv2VacFwd3_num2];
694  Lv2VacFwd_rO2[0] = Lv2VacFwd_R3;
695  Lv2VacFwd_rO2[1] = Lv2VacFwd_R4;
696  Lv2VacFwd_rO2[2] = Lv2VacFwd_R4;
697  //<-------------------
698  //
699 
700  //define geometry
701  // Part 1
702  G4Tubs* geo_Lv2VacFwdPart1_1 = new G4Tubs("geo_Lv2VacFwdPart1_1_name", Lv2VacFwd1_rI1, Lv2VacFwd1_rO1, Lv2VacFwd1_Z1, 0, 2 * M_PI);
703  G4Tubs* geo_Lv2VacFwdPart1_2 = new G4Tubs("geo_Lv2VacFwdPart1_2_name", Lv2VacFwd1_rI2, Lv2VacFwd1_rO2, Lv2VacFwd1_Z2, 0, 2 * M_PI);
704  //Slanted tube of Part 1
705  G4Transform3D transform_Lv2VacFwdPart1_2 = G4Translate3D(0., 0., 0.);
706  transform_Lv2VacFwdPart1_2 = transform_Lv2VacFwdPart1_2 * G4RotateY3D(-Lv2VacFwd_A2 / 2.);
707  G4IntersectionSolid* geo_Lv2VacFwdPart1 = new G4IntersectionSolid("geo_Lv2VacFwdPart1_name", geo_Lv2VacFwdPart1_1,
708  geo_Lv2VacFwdPart1_2, transform_Lv2VacFwdPart1_2);
709  // Part 2
710  G4Tubs* geo_Lv2VacFwdPart2_1 = new G4Tubs("geo_Lv2VacFwdPart2_1_name", Lv2VacFwd2_rI1, Lv2VacFwd2_rO1, Lv2VacFwd2_Z1, 0, 2 * M_PI);
711  G4Tubs* geo_Lv2VacFwdPart2_2 = new G4Tubs("geo_Lv2VacFwdPart2_2_name", Lv2VacFwd2_rI2, Lv2VacFwd2_rO2, Lv2VacFwd2_Z2, 0, 2 * M_PI);
712  //Slanted tube of Part 2
713  G4Transform3D transform_Lv2VacFwdPart2_2 = G4Translate3D(0., 0., 0.);
714  transform_Lv2VacFwdPart2_2 = transform_Lv2VacFwdPart2_2 * G4RotateY3D(Lv2VacFwd_A2 / 2.);
715  G4IntersectionSolid* geo_Lv2VacFwdPart2 = new G4IntersectionSolid("geo_Lv2VacFwdPart2_name", geo_Lv2VacFwdPart2_1,
716  geo_Lv2VacFwdPart2_2, transform_Lv2VacFwdPart2_2);
717  // Part 3
718 // G4Polycone* geo_Lv2VacFwdPart3 = new G4Polycone("geo_Lv2VacFwdPart3", 0, 2 * M_PI, Lv2VacFwd3_num, Lv2VacFwd_Z, Lv2VacFwd_rI, Lv2VacFwd_rO);
719  G4Polycone* geo_Lv2VacFwdPart3_1 = new G4Polycone("geo_Lv2VacFwdPart3_1", 0, 2 * M_PI, Lv2VacFwd3_num1, Lv2VacFwd_Z1, Lv2VacFwd_rI1,
720  Lv2VacFwd_rO1);
721  G4Polycone* geo_Lv2VacFwdPart3_2 = new G4Polycone("geo_Lv2VacFwdPart3_2", 0, 2 * M_PI, Lv2VacFwd3_num2, Lv2VacFwd_Z2, Lv2VacFwd_rI2,
722  Lv2VacFwd_rO2);
723  G4Transform3D transform_Lv2VacFwdPart3_1 = G4Translate3D(-0.5, 0., 0.);
724  transform_Lv2VacFwdPart3_1 = transform_Lv2VacFwdPart3_1 * G4RotateY3D(Lv2VacFwd_A1 - A11);
725  G4UnionSolid* geo_Lv2VacFwdPart3 = new G4UnionSolid("geo_Lv2VacFwdPart3_name", geo_Lv2VacFwdPart3_2, geo_Lv2VacFwdPart3_1,
726  transform_Lv2VacFwdPart3_1);
727  // Part1+2+3
728  //tmp begin
729  G4Transform3D transform_Lv2VacFwdPart1 = G4Translate3D((Lv2VacFwd_D1 * sin(Lv2VacFwd_A1) + Lv2VacFwd_D2 * sin(
730  2.*Lv2VacFwd_A1)) / 2.,
731  0.,
732  (Lv2VacFwd_D1 * cos(Lv2VacFwd_A1) + Lv2VacFwd_D2 * cos(2.*Lv2VacFwd_A1)) / 2.);
733  //G4Transform3D transform_Lv2VacFwdPart1 = G4Translate3D((Lv2VacFwd_D1 * sin(Lv2VacFwd_A1) + Lv2VacFwd_D2 * sin(2.*Lv2VacFwd_A1)) / 1.9 ,
734  // 0.,
735  // (Lv2VacFwd_D1 * cos(Lv2VacFwd_A1) + Lv2VacFwd_D2 * cos(2.*Lv2VacFwd_A1)) / 1.9);
736  transform_Lv2VacFwdPart1 = transform_Lv2VacFwdPart1 * G4RotateY3D(Lv2VacFwd_A1 + Lv2VacFwd_A2);
737  //
738  G4Transform3D transform_Lv2VacFwdPart2 = G4Translate3D(Lv2VacFwd_D2 * sin(2.*Lv2VacFwd_A1) + Lv2VacFwd_L1 * sin(
739  2.*Lv2VacFwd_A1) / 2.0,
740  0.,
741  Lv2VacFwd_D2 * cos(2.*Lv2VacFwd_A1) + Lv2VacFwd_L1 * cos(2.*Lv2VacFwd_A1) / 2.0);
742  //G4Transform3D transform_Lv2VacFwdPart2 = G4Translate3D(Lv2VacFwd_D2 * sin(2.*Lv2VacFwd_A1) + Lv2VacFwd_L1 * sin(2.*Lv2VacFwd_A1) / 2.05,
743  // 0.,
744  // Lv2VacFwd_D2 * cos(2.*Lv2VacFwd_A1) + Lv2VacFwd_L1 * cos(2.*Lv2VacFwd_A1) / 2.05);
745  //tmp end
746  transform_Lv2VacFwdPart2 = transform_Lv2VacFwdPart2 * G4RotateY3D(2.*Lv2VacFwd_A1);
747  //
748  G4UnionSolid* geo_Lv2VacFwdxx = new G4UnionSolid("geo_Lv2VacFwdxx_name", geo_Lv2VacFwdPart3, geo_Lv2VacFwdPart1,
749  transform_Lv2VacFwdPart1);
750  G4UnionSolid* geo_Lv2VacFwdx = new G4UnionSolid("geo_Lv2VacFwdx_name", geo_Lv2VacFwdxx, geo_Lv2VacFwdPart2,
751  transform_Lv2VacFwdPart2);
752  // Intersection
753  G4Transform3D transform_Lv2VacFwd = G4Translate3D(0., 0., -Lv1TaFwd_D1 - Lv1TaFwd_L1 / 2.);
754  transform_Lv2VacFwd = transform_Lv2VacFwd * G4RotateY3D(-Lv2VacFwd_A1);
755  //
756  G4IntersectionSolid* geo_Lv2VacFwd = new G4IntersectionSolid("geo_Lv2VacFwd_name", geo_Lv1TaFwd, geo_Lv2VacFwdx,
757  transform_Lv2VacFwd);
758  G4LogicalVolume* logi_Lv2VacFwd = new G4LogicalVolume(geo_Lv2VacFwd, mat_Lv2VacFwd, "logi_Lv2VacFwd_name");
759  if (flag_limitStep) logi_Lv2VacFwd->SetUserLimits(new G4UserLimits(stepMax));
760 
761  //- put volume
762  setColor(*logi_Lv2VacFwd, "#CCCCCC");
763  //you must set this invisible, otherwise encounter segV.
764  setVisibility(*logi_Lv2VacFwd, false);
765  new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), logi_Lv2VacFwd, "phys_Lv2VacFwd_name", logi_Lv1TaFwd, false, 0);
766 
767  //-
768  //----------
769 
772 
773 
776 
777  //----------
778  //- Lv1TaBwd
779 
780  //get parameters from .xml file
781  prep = "Lv1TaBwd.";
782  //
783  double Lv1TaBwd_D1 = m_config.getParameter(prep + "D1") * Unit::cm / Unit::mm;
784  double Lv1TaBwd_L1 = m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
785  //double Lv1TaBwd_L2 = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
786  //double Lv1TaBwd_L3 = m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
787  double Lv1TaBwd_T1 = m_config.getParameter(prep + "T1") * Unit::cm / Unit::mm;
788  double Lv1TaBwd_aR1 = m_config.getParameter(prep + "aR1") * Unit::cm / Unit::mm;
789  double Lv1TaBwd_aR2 = m_config.getParameter(prep + "aR2") * Unit::cm / Unit::mm;
790  double Lv1TaBwd_aL1 = m_config.getParameter(prep + "aL1") * Unit::cm / Unit::mm;
791  double Lv1TaBwd_aL2 = m_config.getParameter(prep + "aL2") * Unit::cm / Unit::mm;
792  double Lv1TaBwd_aL3 = m_config.getParameter(prep + "aL3") * Unit::cm / Unit::mm;
793  double Lv1TaBwd_bL1 = Lv1TaBwd_L1 - Lv1TaBwd_aL1 - Lv1TaBwd_aL2 - Lv1TaBwd_aL3;
794  double Lv1TaBwd_bL2 = m_config.getParameter(prep + "bL2") * Unit::cm / Unit::mm;
795  double Lv1TaBwd_bL3 = m_config.getParameter(prep + "bL3") * Unit::cm / Unit::mm;
796  //
797  string strMat_Lv1TaBwd = m_config.getParameterStr(prep + "Material");
798  G4Material* mat_Lv1TaBwd = Materials::get(strMat_Lv1TaBwd);
799 
800  //define geometry
801  //G4Trd* geo_Lv1TaBwd_x = new G4Trd("geo_Lv1TaBwd_x_name", Lv1TaBwd_L2, Lv1TaBwd_L3, Lv1TaBwd_T1, Lv1TaBwd_T1, Lv1TaBwd_L1 / 2.0);
802  double Lv1TaBwd_aR[4] = {Lv1TaBwd_aR2, Lv1TaBwd_aR2, Lv1TaBwd_aR1, Lv1TaBwd_aR1};
803  double Lv1TaBwd_ar[4] = {0, 0, 0, 0};
804  double Lv1TaBwd_aL[4] = { +Lv1TaBwd_L1 / 2.0 - (Lv1TaBwd_aL1 + Lv1TaBwd_aL2 + Lv1TaBwd_aL3),
805  +Lv1TaBwd_L1 / 2.0 - (Lv1TaBwd_aL1 + Lv1TaBwd_aL2),
806  +Lv1TaBwd_L1 / 2.0 - (Lv1TaBwd_aL1),
807  +Lv1TaBwd_L1 / 2.0 - 0
808  };
809  G4VSolid* geo_Lv1TaBwd_a = new G4Polycone("geo_Lv1TaBwd_a_name", 0, 2 * M_PI, 4, Lv1TaBwd_aL, Lv1TaBwd_ar, Lv1TaBwd_aR);
810  G4VSolid* geo_Lv1TaBwd_b = new G4Trd("geo_Lv1TaBwd_b_name", Lv1TaBwd_bL2, Lv1TaBwd_bL3, Lv1TaBwd_T1, Lv1TaBwd_T1,
811  Lv1TaBwd_bL1 / 2.0);
812  G4VSolid* geo_Lv1TaBwd_c = new G4Box("geo_Lv1TaBwd_c_name", 200, Lv1TaBwd_T1, (Lv1TaBwd_aL1 + Lv1TaBwd_aL2 + Lv1TaBwd_aL3) / 2.0);
813  G4VSolid* geo_Lv1TaBwd_d = new G4IntersectionSolid("geo_Lv1TaBwd_d_name", geo_Lv1TaBwd_a, geo_Lv1TaBwd_c, G4Translate3D(0, 0,
814  +Lv1TaBwd_L1 / 2.0 - (Lv1TaBwd_aL1 + Lv1TaBwd_aL2 + Lv1TaBwd_aL3) / 2.0));
815  G4VSolid* geo_Lv1TaBwd_x = new G4UnionSolid("geo_Lv1TaBwd_x_name", geo_Lv1TaBwd_d, geo_Lv1TaBwd_b, G4Translate3D(0, 0,
816  -Lv1TaBwd_L1 / 2.0 + Lv1TaBwd_bL1 / 2.0));
817  G4UnionSolid* geo_Lv1TaBwd = new G4UnionSolid("geo_Lv1TaBwd_name", geo_Lv1TaBwd_x, geo_Flange,
818  G4Translate3D(0, 0, -Flange_D - (-Lv1TaBwd_D1 - Lv1TaBwd_L1 / 2.0)));
819  G4LogicalVolume* logi_Lv1TaBwd = new G4LogicalVolume(geo_Lv1TaBwd, mat_Lv1TaBwd, "logi_Lv1TaBwd_name");
820 
821  //- put volume
822  setColor(*logi_Lv1TaBwd, "#333333");
823  new G4PVPlacement(0, G4ThreeVector(0, 0, -Lv1TaBwd_D1 - Lv1TaBwd_L1 / 2.0), logi_Lv1TaBwd, "phys_Lv1TaBwd_name", &topVolume, false,
824  0);
825 
826  //-
827  //----------
828 
829  //----------
830  //- Lv2VacBwd
831 
832  //get parameters from .xml file
833  prep = "Lv2VacBwd.";
834  //
835  double Lv2VacBwd_D1 = m_config.getParameter(prep + "D1") * Unit::cm / Unit::mm;
836  double Lv2VacBwd_D2 = m_config.getParameter(prep + "D2") * Unit::cm / Unit::mm;
837  double Lv2VacBwd_D3 = m_config.getParameter(prep + "D3") * Unit::cm / Unit::mm;
838  double Lv2VacBwd_L1 = m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
839  double Lv2VacBwd_L2 = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
840  double Lv2VacBwd_L3 = m_config.getParameter(prep + "L3") * Unit::cm / Unit::mm;
841  double Lv2VacBwd_R1 = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
842  double Lv2VacBwd_R2 = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
843  double Lv2VacBwd_R3 = m_config.getParameter(prep + "R3") * Unit::cm / Unit::mm;
844  double Lv2VacBwd_R4 = m_config.getParameter(prep + "R4") * Unit::cm / Unit::mm;
845  double Lv2VacBwd_A1 = m_config.getParameter(prep + "A1");
846  double Lv2VacBwd_A2 = m_config.getParameter(prep + "A2");
847  //
848  string strMat_Lv2VacBwd = m_config.getParameterStr(prep + "Material");
849  G4Material* mat_Lv2VacBwd = Materials::get(strMat_Lv2VacBwd);
850  //
851  // Part 1
852  double Lv2VacBwd1_Z1 = sqrt(Lv2VacBwd_D1 * Lv2VacBwd_D1 + Lv2VacBwd_D2 * Lv2VacBwd_D2 - 2.*Lv2VacBwd_D1 * Lv2VacBwd_D2 * cos(
853  Lv2VacBwd_A1));
854  double Lv2VacBwd1_rI1 = 0.0;
855  double Lv2VacBwd1_rO1 = Lv2VacBwd_R1;
856  //
857  double Lv2VacBwd1_Z2 = (Lv2VacBwd1_Z1 / 2. * cos(Lv2VacBwd_A2)) + SafetyLength;
858  double Lv2VacBwd1_rI2 = 0.0;
859  double Lv2VacBwd1_rO2 = 2 * Lv2VacBwd_R1;
860  // Part 2
861  double Lv2VacBwd2_Z1 = Lv2VacBwd_L1;
862  double Lv2VacBwd2_rI1 = 0.0;
863  double Lv2VacBwd2_rO1 = Lv2VacBwd_R2;
864  //
865  double Lv2VacBwd2_Z2 = (Lv2VacBwd_L1 / 2. * cos(Lv2VacBwd_A2)) + SafetyLength;
866  double Lv2VacBwd2_rI2 = 0.0;
867  double Lv2VacBwd2_rO2 = 2 * Lv2VacBwd_R2;
868  // Part 3
869  const int Lv2VacBwd3_num1 = 2; // cylindrical part
870  const int Lv2VacBwd3_num2 = 3; // policone part
871  // ----------->Cylindrical part
872  double Lv2VacBwd_Z1[Lv2VacBwd3_num1];
873  Lv2VacBwd_Z1[0] = 0.0;
874  Lv2VacBwd_Z1[1] = -Lv2VacBwd_D3 + Lv2VacBwd_L2 - 0.03 * SafetyLength;
875  double Lv2VacBwd_rI1[Lv2VacBwd3_num1];
876  for (int tmpn = 0; tmpn < Lv2VacBwd3_num1; tmpn++)
877  { Lv2VacBwd_rI1[tmpn] = 0.0; }
878  double Lv2VacBwd_rO1[Lv2VacBwd3_num1];
879  Lv2VacBwd_rO1[0] = Lv2VacBwd_R3;
880  Lv2VacBwd_rO1[1] = Lv2VacBwd_R3;
881  //<----------------
882  //------------> Policone part
883  double Lv2VacBwd_Z2[Lv2VacBwd3_num2];
884  Lv2VacBwd_Z2[0] = -Lv2VacBwd_D3 + Lv2VacBwd_L2;
885  Lv2VacBwd_Z2[1] = -Lv2VacBwd_D3;
886  Lv2VacBwd_Z2[2] = -Lv2VacBwd_D3 - Lv2VacBwd_L3;
887  double Lv2VacBwd_rI2[Lv2VacBwd3_num2];
888  for (int tmpn = 0; tmpn < Lv2VacBwd3_num2; tmpn++)
889  { Lv2VacBwd_rI2[tmpn] = 0.0; }
890  double Lv2VacBwd_rO2[Lv2VacBwd3_num2];
891  Lv2VacBwd_rO2[0] = Lv2VacBwd_R3;
892  Lv2VacBwd_rO2[1] = Lv2VacBwd_R4;
893  Lv2VacBwd_rO2[2] = Lv2VacBwd_R4;
894  //<--------------
895  //
896 
897  //define geometry
898  // Part 1
899  G4Tubs* geo_Lv2VacBwdPart1_1 = new G4Tubs("geo_Lv2VacBwdPart1_1_name", Lv2VacBwd1_rI1, Lv2VacBwd1_rO1, Lv2VacBwd1_Z1, 0, 2 * M_PI);
900  G4Tubs* geo_Lv2VacBwdPart1_2 = new G4Tubs("geo_Lv2VacBwdPart1_2_name", Lv2VacBwd1_rI2, Lv2VacBwd1_rO2, Lv2VacBwd1_Z2, 0, 2 * M_PI);
901  G4Transform3D transform_Lv2VacBwdPart1_2 = G4Translate3D(0., 0., 0.);
902  transform_Lv2VacBwdPart1_2 = transform_Lv2VacBwdPart1_2 * G4RotateY3D(Lv2VacBwd_A2 / 2.);
903  G4IntersectionSolid* geo_Lv2VacBwdPart1 = new G4IntersectionSolid("geo_Lv2VacBwdPart1_name", geo_Lv2VacBwdPart1_1,
904  geo_Lv2VacBwdPart1_2, transform_Lv2VacBwdPart1_2);
905  // Part 2
906  G4Tubs* geo_Lv2VacBwdPart2_1 = new G4Tubs("geo_Lv2VacBwdPart2_1_name", Lv2VacBwd2_rI1, Lv2VacBwd2_rO1, Lv2VacBwd2_Z1, 0, 2 * M_PI);
907  G4Tubs* geo_Lv2VacBwdPart2_2 = new G4Tubs("geo_Lv2VacBwdPart2_2_name", Lv2VacBwd2_rI2, Lv2VacBwd2_rO2, Lv2VacBwd2_Z2, 0, 2 * M_PI);
908  G4Transform3D transform_Lv2VacBwdPart2_2 = G4Translate3D(0., 0., 0.);
909  transform_Lv2VacBwdPart2_2 = transform_Lv2VacBwdPart2_2 * G4RotateY3D(-Lv2VacBwd_A2 / 2.);
910  G4IntersectionSolid* geo_Lv2VacBwdPart2 = new G4IntersectionSolid("geo_Lv2VacBwdPart2_name", geo_Lv2VacBwdPart2_1,
911  geo_Lv2VacBwdPart2_2, transform_Lv2VacBwdPart2_2);
912  // Part 3
913 // G4Polycone* geo_Lv2VacBwdPart3 = new G4Polycone("geo_Lv2VacBwdPart3", 0, 2 * M_PI, Lv2VacBwd3_num, Lv2VacBwd_Z, Lv2VacBwd_rI, Lv2VacBwd_rO);
914  G4Polycone* geo_Lv2VacBwdPart3_1 = new G4Polycone("geo_Lv2VacBwdPart3_1", 0, 2 * M_PI, Lv2VacBwd3_num1, Lv2VacBwd_Z1, Lv2VacBwd_rI1,
915  Lv2VacBwd_rO1);
916  G4Polycone* geo_Lv2VacBwdPart3_2 = new G4Polycone("geo_Lv2VacBwdPart3_2", 0, 2 * M_PI, Lv2VacBwd3_num2, Lv2VacBwd_Z2, Lv2VacBwd_rI2,
917  Lv2VacBwd_rO2);
918  G4Transform3D transform_Lv2VacBwdPart3_1 = G4Translate3D(-0.5, 0., 0.);
919  transform_Lv2VacBwdPart3_1 = transform_Lv2VacBwdPart3_1 * G4RotateY3D(-Lv2VacBwd_A1 + A11);
920  G4UnionSolid* geo_Lv2VacBwdPart3 = new G4UnionSolid("geo_Lv2VacBwdPart3_name", geo_Lv2VacBwdPart3_2, geo_Lv2VacBwdPart3_1,
921  transform_Lv2VacBwdPart3_1);
922  // Part1+2+3
923  //tmp begin
924  G4Transform3D transform_Lv2VacBwdPart1 = G4Translate3D((Lv2VacBwd_D1 * sin(Lv2VacBwd_A1) + Lv2VacBwd_D2 * sin(
925  2.*Lv2VacBwd_A1)) / 2.,
926  0.,
927  -(Lv2VacBwd_D1 * cos(Lv2VacBwd_A1) + Lv2VacBwd_D2 * cos(2.*Lv2VacBwd_A1)) / 2.);
928  //G4Transform3D transform_Lv2VacBwdPart1 = G4Translate3D((Lv2VacBwd_D1 * sin(Lv2VacBwd_A1) + Lv2VacBwd_D2 * sin(2.*Lv2VacBwd_A1)) / 2.05,
929  // 0.,
930  // -(Lv2VacBwd_D1 * cos(Lv2VacBwd_A1) + Lv2VacBwd_D2 * cos(2.*Lv2VacBwd_A1)) / 2.05);
931  transform_Lv2VacBwdPart1 = transform_Lv2VacBwdPart1 * G4RotateY3D(-Lv2VacBwd_A1 - Lv2VacBwd_A2);
932  //tmp end
933  //
934  G4Transform3D transform_Lv2VacBwdPart2 = G4Translate3D((Lv2VacBwd_D2 + Lv2VacBwd_L1 / 2.0) * sin(2.*Lv2VacBwd_A1),
935  0.,
936  -(Lv2VacBwd_D2 + Lv2VacBwd_L1 / 2.0) * cos(2.*Lv2VacBwd_A1));
937  transform_Lv2VacBwdPart2 = transform_Lv2VacBwdPart2 * G4RotateY3D(-2.*Lv2VacBwd_A1);
938  //
939  G4UnionSolid* geo_Lv2VacBwdxx = new G4UnionSolid("geo_Lv2VacBwdxx_name", geo_Lv2VacBwdPart3, geo_Lv2VacBwdPart1,
940  transform_Lv2VacBwdPart1);
941  G4UnionSolid* geo_Lv2VacBwdx = new G4UnionSolid("geo_Lv2VacBwdx_name", geo_Lv2VacBwdxx, geo_Lv2VacBwdPart2,
942  transform_Lv2VacBwdPart2);
943  // Intersection
944  G4Transform3D transform_Lv2VacBwd = G4Translate3D(0., 0., +Lv1TaBwd_D1 + Lv1TaBwd_L1 / 2.);
945  transform_Lv2VacBwd = transform_Lv2VacBwd * G4RotateY3D(+Lv2VacBwd_A1);
946  //
947  G4IntersectionSolid* geo_Lv2VacBwd = new G4IntersectionSolid("geo_Lv2VacBwd_name", geo_Lv1TaBwd, geo_Lv2VacBwdx,
948  transform_Lv2VacBwd);
949  G4LogicalVolume* logi_Lv2VacBwd = new G4LogicalVolume(geo_Lv2VacBwd, mat_Lv2VacBwd, "logi_Lv2VacBwd_name");
950  if (flag_limitStep) logi_Lv2VacBwd->SetUserLimits(new G4UserLimits(stepMax));
951 
952  //- put volume
953  setColor(*logi_Lv2VacBwd, "#CCCCCC");
954  //you must set this invisible, otherwise encounter segV.
955  setVisibility(*logi_Lv2VacBwd, false);
956  new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), logi_Lv2VacBwd, "phys_Lv2VacBwd_name", logi_Lv1TaBwd, false, 0);
957 
958  //-
959 
962 
963  //get parameters from .xml file
964  prep = "AreaTubeFwd.";
965  //
966  const int AreaTubeFwd_num = 2;
967  //
968  double AreaTubeFwd_Z[AreaTubeFwd_num];
969  AreaTubeFwd_Z[0] = m_config.getParameter(prep + "D1") * Unit::cm / Unit::mm;
970  AreaTubeFwd_Z[1] = m_config.getParameter(prep + "D2") * Unit::cm / Unit::mm;
971  //
972  double AreaTubeFwd_rI[AreaTubeFwd_num];
973  for (int i = 0; i < AreaTubeFwd_num; i++)
974  { AreaTubeFwd_rI[i] = 0.0; }
975  //
976  double AreaTubeFwd_rO[AreaTubeFwd_num];
977  AreaTubeFwd_rO[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
978  AreaTubeFwd_rO[1] = AreaTubeFwd_rO[0];
979 
980  //define geometry
981  G4Polycone* geo_AreaTubeFwdpcon = new G4Polycone("geo_AreaTubeFwdpcon_name", 0, 2 * M_PI, AreaTubeFwd_num, AreaTubeFwd_Z,
982  AreaTubeFwd_rI, AreaTubeFwd_rO);
983 
984  //----------
985  //- Lv1TaLERUp
986 
987  //get parameters from .xml file
988  prep = "Lv1TaLERUp.";
989  //
990  double Lv1TaLERUp_A1 = m_config.getParameter(prep + "A1");
991  //
992  const int Lv1TaLERUp_num = 12;
993  //
994  double Lv1TaLERUp_Z[Lv1TaLERUp_num];
995  double Lv1TaLERUp_rO[Lv1TaLERUp_num];
996  for (int i = 0; i < Lv1TaLERUp_num; i++) {
997  ostringstream ossZ_Lv1TaLERUp;
998  ossZ_Lv1TaLERUp << "L" << i + 1;
999 
1000  ostringstream ossR_Lv1TaLERUp;
1001  ossR_Lv1TaLERUp << "R" << i + 1;
1002 
1003  Lv1TaLERUp_Z[i] = m_config.getParameter(prep + ossZ_Lv1TaLERUp.str()) * Unit::cm / Unit::mm;
1004  Lv1TaLERUp_rO[i] = m_config.getParameter(prep + ossR_Lv1TaLERUp.str()) * Unit::cm / Unit::mm;
1005  }
1006  //
1007  double Lv1TaLERUp_rI[Lv1TaLERUp_num];
1008  for (int i = 0; i < Lv1TaLERUp_num; i++)
1009  { Lv1TaLERUp_rI[i] = 0.0; }
1010  //
1011  string strMat_Lv1TaLERUp = m_config.getParameterStr(prep + "Material");
1012  G4Material* mat_Lv1TaLERUp = Materials::get(strMat_Lv1TaLERUp);
1013 
1014  //define geometry
1015  G4Polycone* geo_Lv1TaLERUppcon = new G4Polycone("geo_Lv1TaLERUppcon_name", 0, 2 * M_PI, Lv1TaLERUp_num, Lv1TaLERUp_Z, Lv1TaLERUp_rI,
1016  Lv1TaLERUp_rO);
1017  G4Transform3D transform_AreaTubeFwdForLER = G4Translate3D(0., 0., 0.);
1018  transform_AreaTubeFwdForLER = transform_AreaTubeFwdForLER * G4RotateY3D(-Lv1TaLERUp_A1);
1019  G4IntersectionSolid* geo_Lv1TaLERUp = new G4IntersectionSolid("geo_Lv1TaLERUp_name", geo_Lv1TaLERUppcon, geo_AreaTubeFwdpcon,
1020  transform_AreaTubeFwdForLER);
1021  G4LogicalVolume* logi_Lv1TaLERUp = new G4LogicalVolume(geo_Lv1TaLERUp, mat_Lv1TaLERUp, "logi_Lv1TaLERUp_name");
1022 
1023  //- put volume
1024  setColor(*logi_Lv1TaLERUp, "#0000CC");
1025  G4Transform3D transform_Lv1TaLERUp = G4Translate3D(0., 0., 0.);
1026  transform_Lv1TaLERUp = transform_Lv1TaLERUp * G4RotateY3D(Lv1TaLERUp_A1);
1027  new G4PVPlacement(transform_Lv1TaLERUp, logi_Lv1TaLERUp, "phys_Lv1TaLERUp_name", &topVolume, false, 0);
1028 
1029  //----------
1030  //-Lv1SUSLERUp
1031  prep = "Lv1SUSLERUp.";
1032  const int Lv1SUSLERUp_num = 6;
1033  double Lv1SUSLERUp_Z[Lv1SUSLERUp_num];
1034  double Lv1SUSLERUp_rO[Lv1SUSLERUp_num];
1035  double Lv1SUSLERUp_rI[Lv1SUSLERUp_num];
1036 
1037  for (int i = 0; i < Lv1SUSLERUp_num; i++) {
1038  ostringstream ossZ_Lv1SUSLERUp;
1039  ossZ_Lv1SUSLERUp << "Z" << i + 1;
1040  ostringstream ossRI_Lv1SUSLERUp;
1041  ossRI_Lv1SUSLERUp << "RI" << i + 1;
1042  ostringstream ossRO_Lv1SUSLERUp;
1043  ossRO_Lv1SUSLERUp << "RO" << i + 1;
1044 
1045  Lv1SUSLERUp_Z[i] = m_config.getParameter(prep + ossZ_Lv1SUSLERUp.str()) * Unit::cm / Unit::mm;
1046  Lv1SUSLERUp_rI[i] = m_config.getParameter(prep + ossRI_Lv1SUSLERUp.str()) * Unit::cm / Unit::mm;
1047  Lv1SUSLERUp_rO[i] = m_config.getParameter(prep + ossRO_Lv1SUSLERUp.str()) * Unit::cm / Unit::mm;
1048  }
1049 
1050  string strMat_Lv1SUSLERUp = m_config.getParameterStr(prep + "Material");
1051  G4Material* mat_Lv1SUSLERUp = Materials::get(strMat_Lv1SUSLERUp);
1052 
1053  G4Polycone* geo_Lv1SUSLERUppcon = new G4Polycone("geo_Lv1SUSLERUppcon_name", 0, 2 * M_PI, Lv1SUSLERUp_num, Lv1SUSLERUp_Z,
1054  Lv1SUSLERUp_rI, Lv1SUSLERUp_rO);
1055  G4IntersectionSolid* geo_Lv1SUSLERUp = new G4IntersectionSolid("", geo_Lv1SUSLERUppcon, geo_AreaTubeFwdpcon,
1056  transform_AreaTubeFwdForLER);
1057  G4LogicalVolume* logi_Lv1SUSLERUp = new G4LogicalVolume(geo_Lv1SUSLERUp, mat_Lv1SUSLERUp, "logi_Lv1SUSLERUp_name");
1058 
1059  //-put volumn
1060  setColor(*logi_Lv1SUSLERUp, "#666666");
1061  new G4PVPlacement(transform_Lv1TaLERUp, logi_Lv1SUSLERUp, "phys_Lv1SUSLERUp_name", &topVolume, false, 0);
1062 
1063  //----------
1064  //- Lv2VacLERUp
1065 
1066  //get parameters from .xml file
1067  prep = "Lv2VacLERUp.";
1068  //
1069  double Lv2VacLERUp_rO[Lv1TaLERUp_num];
1070  for (int i = 0; i < Lv1TaLERUp_num; i++) {
1071  Lv2VacLERUp_rO[i] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
1072  }
1073  //
1074  string strMat_Lv2VacLERUp = m_config.getParameterStr(prep + "Material");
1075  G4Material* mat_Lv2VacLERUp = Materials::get(strMat_Lv2VacLERUp);
1076 
1077  //define geometry
1078  G4Polycone* geo_Lv2VacLERUppcon = new G4Polycone("geo_Lv2VacLERUppcon_name", 0, 2 * M_PI, Lv1TaLERUp_num, Lv1TaLERUp_Z,
1079  Lv1TaLERUp_rI, Lv2VacLERUp_rO);
1080  G4IntersectionSolid* geo_Lv2VacLERUp = new G4IntersectionSolid("geo_Lv2VacLERUp_name", geo_Lv2VacLERUppcon, geo_AreaTubeFwdpcon,
1081  transform_AreaTubeFwdForLER);
1082  G4LogicalVolume* logi_Lv2VacLERUp = new G4LogicalVolume(geo_Lv2VacLERUp, mat_Lv2VacLERUp, "logi_Lv2VacLERUp_name");
1083  if (flag_limitStep) logi_Lv2VacLERUp->SetUserLimits(new G4UserLimits(stepMax));
1084 
1085 
1086  //- put volume
1087  setColor(*logi_Lv2VacLERUp, "#CCCCCC");
1088  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2VacLERUp, "phys_Lv2VacLERUp_name", logi_Lv1TaLERUp, false, 0);
1089  //-
1090  //----------
1091 
1092  //----------
1093  //- Lv1TaHERDwn
1094 
1095  //get parameters from .xml file
1096  prep = "Lv1TaHERDwn.";
1097  //
1098  double Lv1TaHERDwn_A1 = m_config.getParameter(prep + "A1");
1099  //
1100  const int Lv1TaHERDwn_num = 12;
1101  //
1102  double Lv1TaHERDwn_Z[Lv1TaHERDwn_num];
1103  double Lv1TaHERDwn_rO[Lv1TaHERDwn_num];
1104  for (int i = 0; i < Lv1TaHERDwn_num; i++) {
1105  ostringstream ossZ_Lv1TaHERDwn;
1106  ossZ_Lv1TaHERDwn << "L" << i + 1;
1107 
1108  ostringstream ossR_Lv1TaHERDwn;
1109  ossR_Lv1TaHERDwn << "R" << i + 1;
1110 
1111  Lv1TaHERDwn_Z[i] = m_config.getParameter(prep + ossZ_Lv1TaHERDwn.str()) * Unit::cm / Unit::mm;
1112  Lv1TaHERDwn_rO[i] = m_config.getParameter(prep + ossR_Lv1TaHERDwn.str()) * Unit::cm / Unit::mm;
1113  }
1114  //
1115  double Lv1TaHERDwn_rI[Lv1TaHERDwn_num];
1116  for (int i = 0; i < Lv1TaHERDwn_num; i++)
1117  { Lv1TaHERDwn_rI[i] = 0.0; }
1118  //
1119  string strMat_Lv1TaHERDwn = m_config.getParameterStr(prep + "Material");
1120  G4Material* mat_Lv1TaHERDwn = Materials::get(strMat_Lv1TaHERDwn);
1121 
1122  //define geometry
1123  G4Polycone* geo_Lv1TaHERDwnpcon = new G4Polycone("geo_Lv1TaHERDwnpcon_name", 0, 2 * M_PI, Lv1TaHERDwn_num, Lv1TaHERDwn_Z,
1124  Lv1TaHERDwn_rI, Lv1TaHERDwn_rO);
1125  G4Transform3D transform_AreaTubeFwdForHER = G4Translate3D(0., 0., 0.);
1126  transform_AreaTubeFwdForHER = transform_AreaTubeFwdForHER * G4RotateY3D(-Lv1TaHERDwn_A1);
1127  G4IntersectionSolid* geo_Lv1TaHERDwn = new G4IntersectionSolid("", geo_Lv1TaHERDwnpcon, geo_AreaTubeFwdpcon,
1128  transform_AreaTubeFwdForHER);
1129  G4LogicalVolume* logi_Lv1TaHERDwn = new G4LogicalVolume(geo_Lv1TaHERDwn, mat_Lv1TaHERDwn, "logi_Lv1TaHERDwn_name");
1130 
1131  //- put volume
1132  setColor(*logi_Lv1TaHERDwn, "#00CC00");
1133  G4Transform3D transform_Lv1TaHERDwn = G4Translate3D(0., 0., 0.);
1134  transform_Lv1TaHERDwn = transform_Lv1TaHERDwn * G4RotateY3D(Lv1TaHERDwn_A1);
1135  new G4PVPlacement(transform_Lv1TaHERDwn, logi_Lv1TaHERDwn, "phys_Lv1TaHERDwn_name", &topVolume, false, 0);
1136 
1137  //----------
1138  //-Lv1SUSHERDwn
1139  prep = "Lv1SUSHERDwn.";
1140  const int Lv1SUSHERDwn_num = 6;
1141  double Lv1SUSHERDwn_Z[Lv1SUSHERDwn_num];
1142  double Lv1SUSHERDwn_rO[Lv1SUSHERDwn_num];
1143  double Lv1SUSHERDwn_rI[Lv1SUSHERDwn_num];
1144 
1145  for (int i = 0; i < Lv1SUSHERDwn_num; i++) {
1146  ostringstream ossZ_Lv1SUSHERDwn;
1147  ossZ_Lv1SUSHERDwn << "Z" << i + 1;
1148  ostringstream ossRI_Lv1SUSHERDwn;
1149  ossRI_Lv1SUSHERDwn << "RI" << i + 1;
1150  ostringstream ossRO_Lv1SUSHERDwn;
1151  ossRO_Lv1SUSHERDwn << "RO" << i + 1;
1152 
1153  Lv1SUSHERDwn_Z[i] = m_config.getParameter(prep + ossZ_Lv1SUSHERDwn.str()) * Unit::cm / Unit::mm;
1154  Lv1SUSHERDwn_rI[i] = m_config.getParameter(prep + ossRI_Lv1SUSHERDwn.str()) * Unit::cm / Unit::mm;
1155  Lv1SUSHERDwn_rO[i] = m_config.getParameter(prep + ossRO_Lv1SUSHERDwn.str()) * Unit::cm / Unit::mm;
1156  }
1157 
1158  string strMat_Lv1SUSHERDwn = m_config.getParameterStr(prep + "Material");
1159  G4Material* mat_Lv1SUSHERDwn = Materials::get(strMat_Lv1SUSHERDwn);
1160  //G4Material* mat_Lv1SUSHERDwn = mat_Lv1SUS;
1161 
1162  G4Polycone* geo_Lv1SUSHERDwnpcon = new G4Polycone("geo_Lv1SUSHERDwnpcon_name", 0, 2 * M_PI, Lv1SUSHERDwn_num, Lv1SUSHERDwn_Z,
1163  Lv1SUSHERDwn_rI, Lv1SUSHERDwn_rO);
1164  G4IntersectionSolid* geo_Lv1SUSHERDwn = new G4IntersectionSolid("", geo_Lv1SUSHERDwnpcon, geo_AreaTubeFwdpcon,
1165  transform_AreaTubeFwdForHER);
1166  G4LogicalVolume* logi_Lv1SUSHERDwn = new G4LogicalVolume(geo_Lv1SUSHERDwn, mat_Lv1SUSHERDwn, "logi_Lv1SUSHERDwn_name");
1167 
1168  //-put volumn
1169  setColor(*logi_Lv1SUSHERDwn, "#666666");
1170  new G4PVPlacement(transform_Lv1TaHERDwn, logi_Lv1SUSHERDwn, "phys_Lv1SUSHERDwn_name", &topVolume, false, 0);
1171 
1172  //----------
1173  //- Lv2VacHERDwn
1174 
1175  //get parameters from .xml file
1176  prep = "Lv2VacHERDwn.";
1177  //
1178  double Lv2VacHERDwn_rO[Lv1TaHERDwn_num];
1179  for (int i = 0; i < Lv1TaHERDwn_num; i++) {
1180  Lv2VacHERDwn_rO[i] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
1181  }
1182  //
1183  string strMat_Lv2VacHERDwn = m_config.getParameterStr(prep + "Material");
1184  G4Material* mat_Lv2VacHERDwn = Materials::get(strMat_Lv2VacHERDwn);
1185 
1186  //define geometry
1187  G4Polycone* geo_Lv2VacHERDwnpcon = new G4Polycone("geo_Lv2VacHERDwnpcon_name", 0, 2 * M_PI, Lv1TaHERDwn_num, Lv1TaHERDwn_Z,
1188  Lv1TaHERDwn_rI, Lv2VacHERDwn_rO);
1189  G4IntersectionSolid* geo_Lv2VacHERDwn = new G4IntersectionSolid("", geo_Lv2VacHERDwnpcon, geo_AreaTubeFwdpcon,
1190  transform_AreaTubeFwdForHER);
1191  G4LogicalVolume* logi_Lv2VacHERDwn = new G4LogicalVolume(geo_Lv2VacHERDwn, mat_Lv2VacHERDwn, "logi_Lv2VacHERDwn_name");
1192  if (flag_limitStep) logi_Lv2VacHERDwn->SetUserLimits(new G4UserLimits(stepMax));
1193 
1194  //- put volume
1195  setColor(*logi_Lv2VacHERDwn, "#CCCCCC");
1196  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2VacHERDwn, "phys_Lv2VacHERDwn_name", logi_Lv1TaHERDwn, false, 0);
1197 
1198  //-
1199  //----------
1200 
1203 
1206 
1207  //get parameters from .xml file
1208  prep = "AreaTubeBwd.";
1209  //
1210  const int AreaTubeBwd_num = 2;
1211  //
1212  double AreaTubeBwd_Z[AreaTubeBwd_num];
1213  AreaTubeBwd_Z[0] = -m_config.getParameter(prep + "D1") * Unit::cm / Unit::mm;
1214  AreaTubeBwd_Z[1] = -m_config.getParameter(prep + "D2") * Unit::cm / Unit::mm;
1215  //
1216  double AreaTubeBwd_rI[AreaTubeBwd_num];
1217  for (int i = 0; i < AreaTubeBwd_num; i++)
1218  { AreaTubeBwd_rI[i] = 0.0; }
1219  //
1220  double AreaTubeBwd_rO[AreaTubeBwd_num];
1221  AreaTubeBwd_rO[0] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
1222  AreaTubeBwd_rO[1] = AreaTubeBwd_rO[0];
1223 
1224  //define geometry
1225  G4Polycone* geo_AreaTubeBwdpcon = new G4Polycone("geo_AreaTubeBwdpcon_name", 0, 2 * M_PI, AreaTubeBwd_num, AreaTubeBwd_Z,
1226  AreaTubeBwd_rI, AreaTubeBwd_rO);
1227 
1228  //----------
1229  //- Lv1TaHERUp
1230 
1231  //get parameters from .xml file
1232  prep = "Lv1TaHERUp.";
1233  //
1234  double Lv1TaHERUp_A1 = m_config.getParameter(prep + "A1");
1235  //
1236  const int Lv1TaHERUp_num = 12;
1237  double Lv1TaHERUp_Z[Lv1TaHERUp_num];
1238  double Lv1TaHERUp_rO[Lv1TaHERUp_num];
1239  for (int i = 0; i < Lv1TaHERUp_num; i++) {
1240  ostringstream ossZ_Lv1TaHERUp;
1241  ossZ_Lv1TaHERUp << "L" << i + 1;
1242 
1243  ostringstream ossR_Lv1TaHERUp;
1244  ossR_Lv1TaHERUp << "R" << i + 1;
1245 
1246  Lv1TaHERUp_Z[i] = -m_config.getParameter(prep + ossZ_Lv1TaHERUp.str()) * Unit::cm / Unit::mm;
1247  Lv1TaHERUp_rO[i] = m_config.getParameter(prep + ossR_Lv1TaHERUp.str()) * Unit::cm / Unit::mm;
1248  }
1249  //
1250  double Lv1TaHERUp_rI[Lv1TaHERUp_num];
1251  for (int i = 0; i < Lv1TaHERUp_num; i++)
1252  { Lv1TaHERUp_rI[i] = 0.0; }
1253  //
1254  string strMat_Lv1TaHERUp = m_config.getParameterStr(prep + "Material");
1255  G4Material* mat_Lv1TaHERUp = Materials::get(strMat_Lv1TaHERUp);
1256 
1257  //define geometry
1258  G4Polycone* geo_Lv1TaHERUppcon = new G4Polycone("geo_Lv1TaHERUppcon_name", 0, 2 * M_PI, Lv1TaHERUp_num, Lv1TaHERUp_Z, Lv1TaHERUp_rI,
1259  Lv1TaHERUp_rO);
1260  G4Transform3D transform_AreaTubeBwdForHER = G4Translate3D(0., 0., 0.);
1261  transform_AreaTubeBwdForHER = transform_AreaTubeBwdForHER * G4RotateY3D(-Lv1TaHERUp_A1);
1262  G4IntersectionSolid* geo_Lv1TaHERUp = new G4IntersectionSolid("", geo_Lv1TaHERUppcon, geo_AreaTubeBwdpcon,
1263  transform_AreaTubeBwdForHER);
1264  G4LogicalVolume* logi_Lv1TaHERUp = new G4LogicalVolume(geo_Lv1TaHERUp, mat_Lv1TaHERUp, "logi_Lv1TaHERUp_name");
1265 
1266  //- put volume
1267  setColor(*logi_Lv1TaHERUp, "#00CC00");
1268  G4Transform3D transform_Lv1TaHERUp = G4Translate3D(0., 0., 0.);
1269  transform_Lv1TaHERUp = transform_Lv1TaHERUp * G4RotateY3D(Lv1TaHERUp_A1);
1270  new G4PVPlacement(transform_Lv1TaHERUp, logi_Lv1TaHERUp, "phys_Lv1TaHERUp_name", &topVolume, false, 0);
1271 
1272  //----------
1273  //-Lv1SUSHERUp
1274  prep = "Lv1SUSHERUp.";
1275  const int Lv1SUSHERUp_num = 6;
1276  double Lv1SUSHERUp_Z[Lv1SUSHERUp_num];
1277  double Lv1SUSHERUp_rO[Lv1SUSHERUp_num];
1278  double Lv1SUSHERUp_rI[Lv1SUSHERUp_num];
1279 
1280  for (int i = 0; i < Lv1SUSHERUp_num; i++) {
1281  ostringstream ossZ_Lv1SUSHERUp;
1282  ossZ_Lv1SUSHERUp << "Z" << i + 1;
1283  ostringstream ossRI_Lv1SUSHERUp;
1284  ossRI_Lv1SUSHERUp << "RI" << i + 1;
1285  ostringstream ossRO_Lv1SUSHERUp;
1286  ossRO_Lv1SUSHERUp << "RO" << i + 1;
1287 
1288  Lv1SUSHERUp_Z[i] = -m_config.getParameter(prep + ossZ_Lv1SUSHERUp.str()) * Unit::cm / Unit::mm;
1289  Lv1SUSHERUp_rI[i] = m_config.getParameter(prep + ossRI_Lv1SUSHERUp.str()) * Unit::cm / Unit::mm;
1290  Lv1SUSHERUp_rO[i] = m_config.getParameter(prep + ossRO_Lv1SUSHERUp.str()) * Unit::cm / Unit::mm;
1291  }
1292 
1293  string strMat_Lv1SUSHERUp = m_config.getParameterStr(prep + "Material");
1294  G4Material* mat_Lv1SUSHERUp = Materials::get(strMat_Lv1SUSHERUp);
1295 
1296  G4Polycone* geo_Lv1SUSHERUppcon = new G4Polycone("geo_Lv1SUSHERUppcon_name", 0, 2 * M_PI, Lv1SUSHERUp_num, Lv1SUSHERUp_Z,
1297  Lv1SUSHERUp_rI, Lv1SUSHERUp_rO);
1298  G4IntersectionSolid* geo_Lv1SUSHERUp = new G4IntersectionSolid("", geo_Lv1SUSHERUppcon, geo_AreaTubeBwdpcon,
1299  transform_AreaTubeFwdForHER);
1300  G4LogicalVolume* logi_Lv1SUSHERUp = new G4LogicalVolume(geo_Lv1SUSHERUp, mat_Lv1SUSHERUp, "logi_Lv1SUSHERUp_name");
1301 
1302  //-put volumn
1303  setColor(*logi_Lv1SUSHERUp, "#666666");
1304  new G4PVPlacement(transform_Lv1TaHERUp, logi_Lv1SUSHERUp, "phys_Lv1SUSHERUp_name", &topVolume, false, 0);
1305 
1306  //----------
1307  //- Lv2VacHERUp
1308 
1309  //get parameters from .xml file
1310  prep = "Lv2VacHERUp.";
1311  //
1312  double Lv2VacHERUp_rO[Lv1TaHERUp_num];
1313  for (int i = 0; i < Lv1TaHERUp_num; i++) {
1314  Lv2VacHERUp_rO[i] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
1315  }
1316  //
1317  string strMat_Lv2VacHERUp = m_config.getParameterStr(prep + "Material");
1318  G4Material* mat_Lv2VacHERUp = Materials::get(strMat_Lv2VacHERUp);
1319 
1320  //define geometry
1321  G4Polycone* geo_Lv2VacHERUppcon = new G4Polycone("geo_Lv2VacHERUppcon_name", 0, 2 * M_PI, Lv1TaHERUp_num, Lv1TaHERUp_Z,
1322  Lv1TaHERUp_rI, Lv2VacHERUp_rO);
1323  G4IntersectionSolid* geo_Lv2VacHERUp = new G4IntersectionSolid("", geo_Lv2VacHERUppcon, geo_AreaTubeBwdpcon,
1324  transform_AreaTubeFwdForHER);
1325  G4LogicalVolume* logi_Lv2VacHERUp = new G4LogicalVolume(geo_Lv2VacHERUp, mat_Lv2VacHERUp, "logi_Lv2VacHERUp_name");
1326  if (flag_limitStep) logi_Lv2VacHERUp->SetUserLimits(new G4UserLimits(stepMax));
1327 
1328  //- put volume
1329  setColor(*logi_Lv2VacHERUp, "#CCCCCC");
1330  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2VacHERUp, "phys_Lv2VacHERUp_name", logi_Lv1TaHERUp, false, 0);
1331 
1332  //-
1333  //----------
1334 
1335  //----------
1336  //- Lv1TaLERDwn
1337 
1338  //get parameters from .xml file
1339  prep = "Lv1TaLERDwn.";
1340  //
1341  double Lv1TaLERDwn_A1 = m_config.getParameter(prep + "A1");
1342  //
1343  const int Lv1TaLERDwn_num = 12;
1344  //
1345  double Lv1TaLERDwn_Z[Lv1TaLERDwn_num];
1346  double Lv1TaLERDwn_rO[Lv1TaLERDwn_num];
1347  for (int i = 0; i < Lv1TaLERDwn_num; i++) {
1348  ostringstream ossZ_Lv1TaLERDwn;
1349  ossZ_Lv1TaLERDwn << "L" << i + 1;
1350 
1351  ostringstream ossR_Lv1TaLERDwn;
1352  ossR_Lv1TaLERDwn << "R" << i + 1;
1353 
1354  Lv1TaLERDwn_Z[i] = -m_config.getParameter(prep + ossZ_Lv1TaLERDwn.str()) * Unit::cm / Unit::mm;
1355  Lv1TaLERDwn_rO[i] = m_config.getParameter(prep + ossR_Lv1TaLERDwn.str()) * Unit::cm / Unit::mm;
1356  }
1357  //
1358  double Lv1TaLERDwn_rI[Lv1TaLERDwn_num];
1359  for (int i = 0; i < Lv1TaLERDwn_num; i++)
1360  { Lv1TaLERDwn_rI[i] = 0.0; }
1361  //
1362  string strMat_Lv1TaLERDwn = m_config.getParameterStr(prep + "Material");
1363  G4Material* mat_Lv1TaLERDwn = Materials::get(strMat_Lv1TaLERDwn);
1364 
1365  //define geometry
1366  G4Polycone* geo_Lv1TaLERDwnpcon = new G4Polycone("geo_Lv1TaLERDwnpcon_name", 0, 2 * M_PI, Lv1TaLERDwn_num, Lv1TaLERDwn_Z,
1367  Lv1TaLERDwn_rI, Lv1TaLERDwn_rO);
1368  G4Transform3D transform_AreaTubeBwdForLER = G4Translate3D(0., 0., 0.);
1369  transform_AreaTubeBwdForLER = transform_AreaTubeBwdForLER * G4RotateY3D(-Lv1TaLERDwn_A1);
1370  G4IntersectionSolid* geo_Lv1TaLERDwn = new G4IntersectionSolid("", geo_Lv1TaLERDwnpcon, geo_AreaTubeBwdpcon,
1371  transform_AreaTubeBwdForLER);
1372  G4LogicalVolume* logi_Lv1TaLERDwn = new G4LogicalVolume(geo_Lv1TaLERDwn, mat_Lv1TaLERDwn, "logi_Lv1TaLERDwn_name");
1373 
1374  //- put volume
1375  setColor(*logi_Lv1TaLERDwn, "#0000CC");
1376  G4Transform3D transform_Lv1TaLERDwn = G4Translate3D(0., 0., 0.);
1377  transform_Lv1TaLERDwn = transform_Lv1TaLERDwn * G4RotateY3D(Lv1TaLERDwn_A1);
1378  new G4PVPlacement(transform_Lv1TaLERDwn, logi_Lv1TaLERDwn, "phys_Lv1TaLERDwn_name", &topVolume, false, 0);
1379 
1380  //----------
1381  //-Lv1SUSLERDwn
1382  prep = "Lv1SUSLERDwn.";
1383  const int Lv1SUSLERDwn_num = 6;
1384  double Lv1SUSLERDwn_Z[Lv1SUSLERDwn_num];
1385  double Lv1SUSLERDwn_rO[Lv1SUSLERDwn_num];
1386  double Lv1SUSLERDwn_rI[Lv1SUSLERDwn_num];
1387 
1388  for (int i = 0; i < Lv1SUSLERDwn_num; i++) {
1389  ostringstream ossZ_Lv1SUSLERDwn;
1390  ossZ_Lv1SUSLERDwn << "Z" << i + 1;
1391  ostringstream ossRI_Lv1SUSLERDwn;
1392  ossRI_Lv1SUSLERDwn << "RI" << i + 1;
1393  ostringstream ossRO_Lv1SUSLERDwn;
1394  ossRO_Lv1SUSLERDwn << "RO" << i + 1;
1395 
1396  Lv1SUSLERDwn_Z[i] = -m_config.getParameter(prep + ossZ_Lv1SUSLERDwn.str()) * Unit::cm / Unit::mm;
1397  Lv1SUSLERDwn_rI[i] = m_config.getParameter(prep + ossRI_Lv1SUSLERDwn.str()) * Unit::cm / Unit::mm;
1398  Lv1SUSLERDwn_rO[i] = m_config.getParameter(prep + ossRO_Lv1SUSLERDwn.str()) * Unit::cm / Unit::mm;
1399  }
1400 
1401  string strMat_Lv1SUSLERDwn = m_config.getParameterStr(prep + "Material");
1402  G4Material* mat_Lv1SUSLERDwn = Materials::get(strMat_Lv1SUSLERDwn);
1403 
1404  G4Polycone* geo_Lv1SUSLERDwnpcon = new G4Polycone("geo_Lv1SUSLERDwnpcon_name", 0, 2 * M_PI, Lv1SUSLERDwn_num, Lv1SUSLERDwn_Z,
1405  Lv1SUSLERDwn_rI, Lv1SUSLERDwn_rO);
1406  G4IntersectionSolid* geo_Lv1SUSLERDwn = new G4IntersectionSolid("", geo_Lv1SUSLERDwnpcon, geo_AreaTubeBwdpcon,
1407  transform_AreaTubeFwdForHER);
1408  G4LogicalVolume* logi_Lv1SUSLERDwn = new G4LogicalVolume(geo_Lv1SUSLERDwn, mat_Lv1SUSLERDwn, "logi_Lv1SUSLERDwn_name");
1409 
1410  //-put volumn
1411  setColor(*logi_Lv1SUSLERDwn, "#666666");
1412  new G4PVPlacement(transform_Lv1TaLERDwn, logi_Lv1SUSLERDwn, "phys_Lv1SUSLERDwn_name", &topVolume, false, 0);
1413 
1414  //----------
1415  //- Lv2VacLERDwn
1416 
1417  //get parameters from .xml file
1418  prep = "Lv2VacLERDwn.";
1419  //
1420  double Lv2VacLERDwn_rO[Lv1TaLERDwn_num];
1421  for (int i = 0; i < Lv1TaLERDwn_num; i++) {
1422  Lv2VacLERDwn_rO[i] = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
1423  }
1424  //
1425  string strMat_Lv2VacLERDwn = m_config.getParameterStr(prep + "Material");
1426  G4Material* mat_Lv2VacLERDwn = Materials::get(strMat_Lv2VacLERDwn);
1427 
1428  //define geometry
1429  G4Polycone* geo_Lv2VacLERDwnpcon = new G4Polycone("geo_Lv2VacLERDwnpcon_name", 0, 2 * M_PI, Lv1TaLERDwn_num, Lv1TaLERDwn_Z,
1430  Lv1TaLERDwn_rI, Lv2VacLERDwn_rO);
1431  G4IntersectionSolid* geo_Lv2VacLERDwn = new G4IntersectionSolid("", geo_Lv2VacLERDwnpcon, geo_AreaTubeBwdpcon,
1432  transform_AreaTubeBwdForLER);
1433  G4LogicalVolume* logi_Lv2VacLERDwn = new G4LogicalVolume(geo_Lv2VacLERDwn, mat_Lv2VacLERDwn, "logi_Lv2VacLERDwn_name");
1434  if (flag_limitStep) logi_Lv2VacLERDwn->SetUserLimits(new G4UserLimits(stepMax));
1435 
1436  //- put volume
1437  setColor(*logi_Lv2VacLERDwn, "#CCCCCC");
1438  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_Lv2VacLERDwn, "phys_Lv2VacLERDwn_name", logi_Lv1TaLERDwn, false, 0);
1439 
1440 
1441  //----------
1442  // Cu flange
1443 
1444  G4IntersectionSolid* geo_CuFlangeFwd_x2 = new G4IntersectionSolid("geo_CuFlangeFwd_x2_name", geo_AreaTubeFwdpcon, geo_Flange,
1445  G4Translate3D(0, 0, Flange_D + Flange_T * 2));
1446  G4SubtractionSolid* geo_CuFlangeFwd_x = new G4SubtractionSolid("geo_CuFlangeFwd_x_name", geo_CuFlangeFwd_x2, geo_Lv1TaLERUp,
1447  transform_Lv1TaLERUp);
1448  G4SubtractionSolid* geo_CuFlangeFwd = new G4SubtractionSolid("geo_CuFlangeFwd_name", geo_CuFlangeFwd_x, geo_Lv1TaHERDwn,
1449  transform_Lv1TaHERDwn);
1450 
1451  G4LogicalVolume* logi_CuFlangeFwd = new G4LogicalVolume(geo_CuFlangeFwd, mat_Lv1TaLERUp, "logi_CuFlangeFwd_name");
1452 
1453  //- put volume
1454  setColor(*logi_CuFlangeFwd, "#CCCCCC");
1455  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_CuFlangeFwd, "phys_CuFlangeFwd_name", &topVolume, false, 0);
1456 
1457 
1458 
1459 
1460  G4IntersectionSolid* geo_CuFlangeBwd_x2 = new G4IntersectionSolid("geo_CuFlangeBwd_x2_name", geo_AreaTubeBwdpcon, geo_Flange,
1461  G4Translate3D(0, 0, -Flange_D - Flange_T * 2));
1462  G4SubtractionSolid* geo_CuFlangeBwd_x = new G4SubtractionSolid("geo_CuFlangeBwd_x_name", geo_CuFlangeBwd_x2, geo_Lv1TaHERUp,
1463  transform_Lv1TaHERUp);
1464  G4SubtractionSolid* geo_CuFlangeBwd = new G4SubtractionSolid("geo_CuFlangeBwd_name", geo_CuFlangeBwd_x, geo_Lv1TaLERDwn,
1465  transform_Lv1TaLERDwn);
1466 
1467  G4LogicalVolume* logi_CuFlangeBwd = new G4LogicalVolume(geo_CuFlangeBwd, mat_Lv1TaLERUp, "logi_CuFlangeBwd_name");
1468 
1469  //- put volume
1470  setColor(*logi_CuFlangeBwd, "#CCCCCC");
1471  new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_CuFlangeBwd, "phys_CuFlangeBwd_name", &topVolume, false, 0);
1472 
1475 
1476  //----------
1477  //- PXDMountFwd
1478 
1479  //get parameters from .xml file
1480  prep = "PXDMountFwd.";
1481  //
1482  double PXDMountFwd_Z1 = m_config.getParameter(prep + "Z1") * Unit::cm / Unit::mm;
1483  double PXDMountFwd_R1 = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
1484  double PXDMountFwd_D1 = m_config.getParameter(prep + "D1") * Unit::cm / Unit::mm;
1485  double PXDMountFwd_R2 = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
1486  double PXDMountFwd_L1 = m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
1487  double PXDMountFwd_L2 = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
1488  //
1489  string strMat_PXDMountFwd = m_config.getParameterStr(prep + "Material");
1490  G4Material* mat_PXDMountFwd = Materials::get(strMat_PXDMountFwd);
1491 
1492  //define geometry
1493  G4VSolid* geo_PXDMountFwd_a = new G4Tubs("geo_PXDMountFwd_a", 0, PXDMountFwd_R1, PXDMountFwd_D1 / 2, 0, 2 * M_PI);
1494  G4VSolid* geo_PXDMountFwd_b = new G4SubtractionSolid("geo_PXDMountFwd_b", geo_PXDMountFwd_a, geo_Lv1TaFwd_d, G4Translate3D(0., 0.,
1495  -(-Lv1TaFwd_L1 / 2.0 + Lv1TaFwd_aL1 + Lv1TaFwd_aL2 + Lv1TaFwd_aL3) + PXDMountFwd_D1 / 2));
1496  G4VSolid* geo_PXDMountFwd_c = new G4Tubs("geo_PXDMountFwd_c", 0, PXDMountFwd_R2, 100, 0, 2 * M_PI);
1497  G4VSolid* geo_PXDMountFwd_d = new G4Box("geo_PXDMountFwd_d", PXDMountFwd_R1 - PXDMountFwd_L1, 100, PXDMountFwd_R2);
1498 
1499  G4VSolid* geo_PXDMountFwd_p1 = new G4SubtractionSolid("geo_PXDMountFwd_p1", geo_PXDMountFwd_b, geo_PXDMountFwd_c,
1500  G4Translate3D(+PXDMountFwd_L1, 0., +(PXDMountFwd_D1 / 2 - PXDMountFwd_L2))*G4RotateX3D(M_PI / 2));
1501  G4VSolid* geo_PXDMountFwd_p2 = new G4SubtractionSolid("geo_PXDMountFwd_p2", geo_PXDMountFwd_p1, geo_PXDMountFwd_c,
1502  G4Translate3D(+PXDMountFwd_L1, 0., -(PXDMountFwd_D1 / 2 - PXDMountFwd_L2))*G4RotateX3D(M_PI / 2));
1503  G4VSolid* geo_PXDMountFwd_p3 = new G4SubtractionSolid("geo_PXDMountFwd_p3", geo_PXDMountFwd_p2, geo_PXDMountFwd_c,
1504  G4Translate3D(-PXDMountFwd_L1, 0., +(PXDMountFwd_D1 / 2 - PXDMountFwd_L2))*G4RotateX3D(M_PI / 2));
1505  G4VSolid* geo_PXDMountFwd_p4 = new G4SubtractionSolid("geo_PXDMountFwd_p4", geo_PXDMountFwd_p3, geo_PXDMountFwd_c,
1506  G4Translate3D(-PXDMountFwd_L1, 0., -(PXDMountFwd_D1 / 2 - PXDMountFwd_L2))*G4RotateX3D(M_PI / 2));
1507 
1508  G4VSolid* geo_PXDMountFwd_q1 = new G4SubtractionSolid("geo_PXDMountFwd_q1", geo_PXDMountFwd_p4, geo_PXDMountFwd_d,
1509  G4Translate3D(+PXDMountFwd_R1, 0., +(PXDMountFwd_D1 / 2 - PXDMountFwd_L2)));
1510  G4VSolid* geo_PXDMountFwd_q2 = new G4SubtractionSolid("geo_PXDMountFwd_q2", geo_PXDMountFwd_q1, geo_PXDMountFwd_d,
1511  G4Translate3D(+PXDMountFwd_R1, 0., -(PXDMountFwd_D1 / 2 - PXDMountFwd_L2)));
1512  G4VSolid* geo_PXDMountFwd_q3 = new G4SubtractionSolid("geo_PXDMountFwd_q3", geo_PXDMountFwd_q2, geo_PXDMountFwd_d,
1513  G4Translate3D(-PXDMountFwd_R1, 0., +(PXDMountFwd_D1 / 2 - PXDMountFwd_L2)));
1514  G4VSolid* geo_PXDMountFwd_q4 = new G4SubtractionSolid("geo_PXDMountFwd_q4", geo_PXDMountFwd_q3, geo_PXDMountFwd_d,
1515  G4Translate3D(-PXDMountFwd_R1, 0., -(PXDMountFwd_D1 / 2 - PXDMountFwd_L2)));
1516 
1517  G4VSolid* geo_PXDMountFwd = geo_PXDMountFwd_q4;
1518 
1519  G4LogicalVolume* logi_PXDMountFwd = new G4LogicalVolume(geo_PXDMountFwd, mat_PXDMountFwd, "logi_PXDMountFwd_name");
1520  setColor(*logi_PXDMountFwd, "#333333");
1521 
1522  new G4PVPlacement(0, G4ThreeVector(0, 0, +PXDMountFwd_D1 / 2 + PXDMountFwd_Z1), logi_PXDMountFwd, "phys_PXDMountFwd_name",
1523  &topVolume, false, 0);
1524 
1525 
1526  //adding the screws
1527  double PXDMountFixture_screw_radius = 0.2 * Unit::cm / Unit::mm;
1528  double PXDMountFixture_screw_length = 0.5 * Unit::cm / Unit::mm; //half z
1529  G4VSolid* geo_PXDMountFwd_s1 = new G4Tubs("geo_PXDMountFwd_s1", 0, PXDMountFixture_screw_radius, PXDMountFixture_screw_length, 0,
1530  2 * M_PI);
1531  G4VSolid* geo_PXDMountFwd_s2 = new G4Tubs("geo_PXDMountFwd_s2", 0, PXDMountFixture_screw_radius, PXDMountFixture_screw_length, 0,
1532  2 * M_PI);
1533  G4VSolid* geo_PXDMountFwd_s3 = new G4Tubs("geo_PXDMountFwd_s3", 0, PXDMountFixture_screw_radius, PXDMountFixture_screw_length, 0,
1534  2 * M_PI);
1535  G4VSolid* geo_PXDMountFwd_s4 = new G4Tubs("geo_PXDMountFwd_s4", 0, PXDMountFixture_screw_radius, PXDMountFixture_screw_length, 0,
1536  2 * M_PI);
1537 
1538  G4Material* mat_PXDMountFwd_s = Materials::get("Cu");
1539 
1540  G4Rotate3D rotate_PXDMountFwd = G4RotateX3D(-M_PI / 2.0 / Unit::rad);
1541  G4Transform3D transform_PXDMountFwd_s1 = G4Translate3D(+PXDMountFwd_L1, 0,
1542  PXDMountFwd_Z1 + PXDMountFwd_D1 - PXDMountFwd_L2) * rotate_PXDMountFwd;
1543  G4Transform3D transform_PXDMountFwd_s2 = G4Translate3D(+PXDMountFwd_L1, 0, PXDMountFwd_Z1 + PXDMountFwd_L2) * rotate_PXDMountFwd;
1544  G4Transform3D transform_PXDMountFwd_s3 = G4Translate3D(-PXDMountFwd_L1, 0,
1545  PXDMountFwd_Z1 + PXDMountFwd_D1 - PXDMountFwd_L2) * rotate_PXDMountFwd;
1546  G4Transform3D transform_PXDMountFwd_s4 = G4Translate3D(-PXDMountFwd_L1, 0, PXDMountFwd_Z1 + PXDMountFwd_L2) * rotate_PXDMountFwd;
1547 
1548  G4LogicalVolume* logi_PXDMountFwd_s1 = new G4LogicalVolume(geo_PXDMountFwd_s1, mat_PXDMountFwd_s, "logi_PXDMountFwd_name_s1");
1549  G4LogicalVolume* logi_PXDMountFwd_s2 = new G4LogicalVolume(geo_PXDMountFwd_s2, mat_PXDMountFwd_s, "logi_PXDMountFwd_name_s2");
1550  G4LogicalVolume* logi_PXDMountFwd_s3 = new G4LogicalVolume(geo_PXDMountFwd_s3, mat_PXDMountFwd_s, "logi_PXDMountFwd_name_s3");
1551  G4LogicalVolume* logi_PXDMountFwd_s4 = new G4LogicalVolume(geo_PXDMountFwd_s4, mat_PXDMountFwd_s, "logi_PXDMountFwd_name_s4");
1552 
1553  new G4PVPlacement(transform_PXDMountFwd_s1, logi_PXDMountFwd_s1, "phys_PXDMountFwd_name_s1", &topVolume, false, 0);
1554  new G4PVPlacement(transform_PXDMountFwd_s2, logi_PXDMountFwd_s2, "phys_PXDMountFwd_name_s2", &topVolume, false, 0);
1555  new G4PVPlacement(transform_PXDMountFwd_s3, logi_PXDMountFwd_s3, "phys_PXDMountFwd_name_s3", &topVolume, false, 0);
1556  new G4PVPlacement(transform_PXDMountFwd_s4, logi_PXDMountFwd_s4, "phys_PXDMountFwd_name_s4", &topVolume, false, 0);
1557 
1558  //----------
1559  //- PXDMountFixtureFwd
1560  prep = "PXDMountFixtureFwd.";
1561  //
1562  double PXDMountFixtureFwd_Z1 = m_config.getParameter(prep + "Z1") * Unit::cm / Unit::mm;
1563  double PXDMountFixtureFwd_R1 = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
1564  double PXDMountFixtureFwd_D1 = m_config.getParameter(prep + "D1") * Unit::cm / Unit::mm;
1565  double PXDMountFixtureFwd_T1 = m_config.getParameter(prep + "T1") * Unit::cm / Unit::mm;
1566  double PXDMountFixtureFwd_T2 = m_config.getParameter(prep + "T2") * Unit::cm / Unit::mm;
1567  double PXDMountFixtureFwd_FL = m_config.getParameter(prep + "I1") * Unit::cm / Unit::mm;
1568  double PXDMountFixtureFwd_inner_cut_phi = PXDMountFixtureFwd_FL / (PXDMountFwd_R1 + PXDMountFixtureFwd_T1);
1569  double PXDMountFixtureFwd_outter_uni_phi = (1 / 6.0) * M_PI - PXDMountFixtureFwd_FL / PXDMountFixtureFwd_R1;
1570 
1571  string strMat_PXDMountFixtureFwd = m_config.getParameterStr(prep + "Material");
1572  G4Material* mat_PXDMountFixtureFwd = Materials::get(strMat_PXDMountFixtureFwd);
1573 
1574  //define geometry
1575  G4VSolid* geo_PXDMountFixtureFwd_a = new G4Tubs("geo_PXDMountFixtureFwd_a", 0, PXDMountFixtureFwd_R1 - PXDMountFixtureFwd_T2,
1576  PXDMountFixtureFwd_D1 / 2, 0,
1577  2 * M_PI);
1578  G4VSolid* geo_PXDMountFixtureFwd_b = new G4Box("geo_PXDMountFixtureFwd_b", PXDMountFixtureFwd_R1 * 0.5, 0.1 * Unit::cm / Unit::mm,
1579  100);
1580 
1581  G4VSolid* geo_PXDMountFixtureFwd_b1 = new G4Box("geo_PXDMountFixtureFwd_b1", PXDMountFwd_R1 + PXDMountFixtureFwd_T1,
1582  PXDMountFixtureFwd_FL * 0.5, 100);
1583  G4VSolid* geo_PXDMountFixtureFwd_b2 = new G4Tubs("geo_PXDMountFixtureFwd_b2", PXDMountFwd_R1 + PXDMountFixtureFwd_T1,
1584  PXDMountFixtureFwd_R1, PXDMountFixtureFwd_D1 / 2,
1585  0, PXDMountFixtureFwd_outter_uni_phi);
1586  G4VSolid* geo_PXDMountFixtureFwd_b3 = new G4Box("geo_PXDMountFixtureFwd_b3", 0.2 * Unit::cm / Unit::mm, 0.35 * Unit::cm / Unit::mm,
1587  100 * Unit::cm / Unit::mm);
1588 
1589  G4VSolid* geo_PXDMountFixtureFwd_a1 = new G4Tubs("geo_PXDMountFixtureFwd_a1", 0, PXDMountFwd_R1, 100, 0, 2 * M_PI);
1590 
1591  G4VSolid* geo_PXDMountFixtureFwd_c1 = new G4SubtractionSolid("geo_PXDMountFixtureFwd_c1", geo_PXDMountFixtureFwd_a,
1592  geo_PXDMountFixtureFwd_a1);
1593 
1594 
1595  G4VSolid* geo_PXDMountFixtureFwd_d1 = geo_PXDMountFixtureFwd_c1;
1596  for (int i = 0; i < 4; ++i) {
1597 
1598  geo_PXDMountFixtureFwd_d1 = new G4SubtractionSolid("geo_PXDMountFixtureFwd_d1", geo_PXDMountFixtureFwd_d1,
1599  geo_PXDMountFixtureFwd_b1, G4RotateZ3D(i * 0.25 * M_PI));
1600  }
1601  geo_PXDMountFixtureFwd_d1 = new G4SubtractionSolid("geo_PXDMountFixtureFwd_d1", geo_PXDMountFixtureFwd_d1,
1602  geo_PXDMountFixtureFwd_b, G4Translate3D(PXDMountFixtureFwd_R1, - PXDMountFixtureFwd_FL * 0.5, 0));
1603  geo_PXDMountFixtureFwd_d1 = new G4SubtractionSolid("geo_PXDMountFixtureFwd_d1", geo_PXDMountFixtureFwd_d1,
1604  geo_PXDMountFixtureFwd_b, G4Translate3D(-PXDMountFixtureFwd_R1, PXDMountFixtureFwd_FL * 0.5, 0));
1605 
1606 
1607  double PXDMountFixtureFwd_R1_temp = PXDMountFixtureFwd_R1 - PXDMountFixtureFwd_T2;
1608  for (int i = 2; i < 7; i += 4) {
1609 
1610  geo_PXDMountFixtureFwd_d1 = new G4SubtractionSolid("geo_PXDMountFixtureFwd_d1", geo_PXDMountFixtureFwd_d1,
1611  geo_PXDMountFixtureFwd_b3,
1612  G4Translate3D(PXDMountFixtureFwd_R1_temp * cos(i * 0.25 * M_PI - 0.5 * PXDMountFixtureFwd_inner_cut_phi),
1613  PXDMountFixtureFwd_R1_temp * sin(i * 0.25 * M_PI - 0.5 * PXDMountFixtureFwd_inner_cut_phi),
1614  0)*G4RotateZ3D(i * 0.25 * M_PI - 0.5 * PXDMountFixtureFwd_inner_cut_phi));
1615 
1616  geo_PXDMountFixtureFwd_d1 = new G4SubtractionSolid("geo_PXDMountFixtureFwd_d1", geo_PXDMountFixtureFwd_d1,
1617  geo_PXDMountFixtureFwd_b3,
1618  G4Translate3D(PXDMountFixtureFwd_R1_temp * cos(i * 0.25 * M_PI + 0.5 * PXDMountFixtureFwd_inner_cut_phi),
1619  PXDMountFixtureFwd_R1_temp * sin(i * 0.25 * M_PI + 0.5 * PXDMountFixtureFwd_inner_cut_phi),
1620  0)*G4RotateZ3D(i * 0.25 * M_PI + 0.5 * PXDMountFixtureFwd_inner_cut_phi));
1621 
1622  }
1623  G4VSolid* geo_PXDMountFixtureFwd_d2 = geo_PXDMountFixtureFwd_d1;
1624  for (int i = 0; i < 12; ++i) {
1625  if (i == 2 || i == 3 || i == 8 || i == 9) continue;
1626  geo_PXDMountFixtureFwd_d2 = new G4UnionSolid("geo_PXDMountFixtureFwd_d1", geo_PXDMountFixtureFwd_d2,
1627  geo_PXDMountFixtureFwd_b2, G4RotateZ3D(i * (1 / 6.0) * M_PI + ((1 / 12.0)*M_PI - 0.5 * PXDMountFixtureFwd_outter_uni_phi)));
1628 
1629  }
1630 
1631  G4VSolid* geo_PXDMountFixtureFwd = geo_PXDMountFixtureFwd_d2;
1632  G4LogicalVolume* logi_PXDMountFixtureFwd = new G4LogicalVolume(geo_PXDMountFixtureFwd, mat_PXDMountFixtureFwd,
1633  "logi_PXDMountFixtureFwd_name");
1634  setColor(*logi_PXDMountFixtureFwd, "#333333");
1635 
1636  new G4PVPlacement(0, G4ThreeVector(0, 0, +PXDMountFixtureFwd_D1 / 2 + PXDMountFixtureFwd_Z1), logi_PXDMountFixtureFwd,
1637  "phys_PXDMountFixtureFwd_name",
1638  &topVolume, false, 0);
1639  //----------
1640  //- PXDMountBwd
1641 
1642  //get parameters from .xml file
1643  prep = "PXDMountBwd.";
1644  //
1645  double PXDMountBwd_Z1 = m_config.getParameter(prep + "Z1") * Unit::cm / Unit::mm;
1646  double PXDMountBwd_R1 = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
1647  double PXDMountBwd_D1 = m_config.getParameter(prep + "D1") * Unit::cm / Unit::mm;
1648  double PXDMountBwd_R2 = m_config.getParameter(prep + "R2") * Unit::cm / Unit::mm;
1649  double PXDMountBwd_L1 = m_config.getParameter(prep + "L1") * Unit::cm / Unit::mm;
1650  double PXDMountBwd_L2 = m_config.getParameter(prep + "L2") * Unit::cm / Unit::mm;
1651  //
1652  string strMat_PXDMountBwd = m_config.getParameterStr(prep + "Material");
1653  G4Material* mat_PXDMountBwd = Materials::get(strMat_PXDMountBwd);
1654 
1655  //define geometry
1656  G4VSolid* geo_PXDMountBwd_a = new G4Tubs("geo_PXDMountBwd_a", 0, PXDMountBwd_R1, PXDMountBwd_D1 / 2, 0, 2 * M_PI);
1657  G4VSolid* geo_PXDMountBwd_b = new G4SubtractionSolid("geo_PXDMountBwd_b", geo_PXDMountBwd_a, geo_Lv1TaBwd_d, G4Translate3D(0., 0.,
1658  -(+Lv1TaBwd_L1 / 2.0 - (Lv1TaBwd_aL1 + Lv1TaBwd_aL2 + Lv1TaBwd_aL3)) - PXDMountBwd_D1 / 2));
1659  G4VSolid* geo_PXDMountBwd_c = new G4Tubs("geo_PXDMountBwd_c", 0, PXDMountBwd_R2, 100, 0, 2 * M_PI);
1660  G4VSolid* geo_PXDMountBwd_d = new G4Box("geo_PXDMountBwd_d", PXDMountBwd_R1 - PXDMountBwd_L1, 100, PXDMountBwd_R2);
1661 
1662  G4VSolid* geo_PXDMountBwd_p1 = new G4SubtractionSolid("geo_PXDMountBwd_p1", geo_PXDMountBwd_b, geo_PXDMountBwd_c,
1663  G4Translate3D(+PXDMountBwd_L1, 0., +(PXDMountBwd_D1 / 2 - PXDMountBwd_L2))*G4RotateX3D(M_PI / 2));
1664  G4VSolid* geo_PXDMountBwd_p2 = new G4SubtractionSolid("geo_PXDMountBwd_p2", geo_PXDMountBwd_p1, geo_PXDMountBwd_c,
1665  G4Translate3D(+PXDMountBwd_L1, 0., -(PXDMountBwd_D1 / 2 - PXDMountBwd_L2))*G4RotateX3D(M_PI / 2));
1666  G4VSolid* geo_PXDMountBwd_p3 = new G4SubtractionSolid("geo_PXDMountBwd_p3", geo_PXDMountBwd_p2, geo_PXDMountBwd_c,
1667  G4Translate3D(-PXDMountBwd_L1, 0., +(PXDMountBwd_D1 / 2 - PXDMountBwd_L2))*G4RotateX3D(M_PI / 2));
1668  G4VSolid* geo_PXDMountBwd_p4 = new G4SubtractionSolid("geo_PXDMountBwd_p4", geo_PXDMountBwd_p3, geo_PXDMountBwd_c,
1669  G4Translate3D(-PXDMountBwd_L1, 0., -(PXDMountBwd_D1 / 2 - PXDMountBwd_L2))*G4RotateX3D(M_PI / 2));
1670 
1671  G4VSolid* geo_PXDMountBwd_q1 = new G4SubtractionSolid("geo_PXDMountBwd_q1", geo_PXDMountBwd_p4, geo_PXDMountBwd_d,
1672  G4Translate3D(+PXDMountBwd_R1, 0., +(PXDMountBwd_D1 / 2 - PXDMountBwd_L2)));
1673  G4VSolid* geo_PXDMountBwd_q2 = new G4SubtractionSolid("geo_PXDMountBwd_q2", geo_PXDMountBwd_q1, geo_PXDMountBwd_d,
1674  G4Translate3D(+PXDMountBwd_R1, 0., -(PXDMountBwd_D1 / 2 - PXDMountBwd_L2)));
1675  G4VSolid* geo_PXDMountBwd_q3 = new G4SubtractionSolid("geo_PXDMountBwd_q3", geo_PXDMountBwd_q2, geo_PXDMountBwd_d,
1676  G4Translate3D(-PXDMountBwd_R1, 0., +(PXDMountBwd_D1 / 2 - PXDMountBwd_L2)));
1677  G4VSolid* geo_PXDMountBwd_q4 = new G4SubtractionSolid("geo_PXDMountBwd_q4", geo_PXDMountBwd_q3, geo_PXDMountBwd_d,
1678  G4Translate3D(-PXDMountBwd_R1, 0., -(PXDMountBwd_D1 / 2 - PXDMountBwd_L2)));
1679 
1680  G4VSolid* geo_PXDMountBwd = geo_PXDMountBwd_q4;
1681 
1682  G4LogicalVolume* logi_PXDMountBwd = new G4LogicalVolume(geo_PXDMountBwd, mat_PXDMountBwd, "logi_PXDMountBwd_name");
1683  setColor(*logi_PXDMountBwd, "#333333");
1684 
1685  new G4PVPlacement(0, G4ThreeVector(0, 0, -PXDMountBwd_D1 / 2 - PXDMountBwd_Z1), logi_PXDMountBwd, "phys_PXDMountBwd_name",
1686  &topVolume, false, 0);
1687 
1688  // adding screws
1689  //
1690  G4VSolid* geo_PXDMountBwd_s1 = new G4Tubs("geo_PXDMountBwd_s1", 0, PXDMountFixture_screw_radius, PXDMountFixture_screw_length, 0,
1691  2 * M_PI);
1692  G4VSolid* geo_PXDMountBwd_s2 = new G4Tubs("geo_PXDMountBwd_s2", 0, PXDMountFixture_screw_radius, PXDMountFixture_screw_length, 0,
1693  2 * M_PI);
1694  G4VSolid* geo_PXDMountBwd_s3 = new G4Tubs("geo_PXDMountBwd_s3", 0, PXDMountFixture_screw_radius, PXDMountFixture_screw_length, 0,
1695  2 * M_PI);
1696  G4VSolid* geo_PXDMountBwd_s4 = new G4Tubs("geo_PXDMountBwd_s4", 0, PXDMountFixture_screw_radius, PXDMountFixture_screw_length, 0,
1697  2 * M_PI);
1698 
1699  G4Material* mat_PXDMountBwd_s = Materials::get("Cu");
1700 
1701  G4Rotate3D rotate_PXDMountBwd = G4RotateX3D(-M_PI / 2.0 / Unit::rad);
1702  G4Transform3D transform_PXDMountBwd_s1 = G4Translate3D(+PXDMountBwd_L1, 0,
1703  -PXDMountBwd_Z1 - PXDMountBwd_D1 + PXDMountBwd_L2) * rotate_PXDMountBwd;
1704  G4Transform3D transform_PXDMountBwd_s2 = G4Translate3D(+PXDMountBwd_L1, 0, -PXDMountBwd_Z1 - PXDMountBwd_L2) * rotate_PXDMountBwd;
1705  G4Transform3D transform_PXDMountBwd_s3 = G4Translate3D(-PXDMountBwd_L1, 0,
1706  -PXDMountBwd_Z1 - PXDMountBwd_D1 + PXDMountBwd_L2) * rotate_PXDMountBwd;
1707  G4Transform3D transform_PXDMountBwd_s4 = G4Translate3D(-PXDMountBwd_L1, 0, -PXDMountBwd_Z1 - PXDMountBwd_L2) * rotate_PXDMountBwd;
1708 
1709  G4LogicalVolume* logi_PXDMountBwd_s1 = new G4LogicalVolume(geo_PXDMountBwd_s1, mat_PXDMountBwd_s, "logi_PXDMountBwd_name_s1");
1710  G4LogicalVolume* logi_PXDMountBwd_s2 = new G4LogicalVolume(geo_PXDMountBwd_s2, mat_PXDMountBwd_s, "logi_PXDMountBwd_name_s2");
1711  G4LogicalVolume* logi_PXDMountBwd_s3 = new G4LogicalVolume(geo_PXDMountBwd_s3, mat_PXDMountBwd_s, "logi_PXDMountBwd_name_s3");
1712  G4LogicalVolume* logi_PXDMountBwd_s4 = new G4LogicalVolume(geo_PXDMountBwd_s4, mat_PXDMountBwd_s, "logi_PXDMountBwd_name_s4");
1713 
1714  new G4PVPlacement(transform_PXDMountBwd_s1, logi_PXDMountBwd_s1, "phys_PXDMountBwd_name_s1", &topVolume, false, 0);
1715  new G4PVPlacement(transform_PXDMountBwd_s2, logi_PXDMountBwd_s2, "phys_PXDMountBwd_name_s2", &topVolume, false, 0);
1716  new G4PVPlacement(transform_PXDMountBwd_s3, logi_PXDMountBwd_s3, "phys_PXDMountBwd_name_s3", &topVolume, false, 0);
1717  new G4PVPlacement(transform_PXDMountBwd_s4, logi_PXDMountBwd_s4, "phys_PXDMountBwd_name_s4", &topVolume, false, 0);
1718 
1719  //----------
1720  //- PXDMountFixtureBwd
1721  prep = "PXDMountFixtureBwd.";
1722  //
1723  double PXDMountFixtureBwd_Z1 = m_config.getParameter(prep + "Z1") * Unit::cm / Unit::mm;
1724  double PXDMountFixtureBwd_R1 = m_config.getParameter(prep + "R1") * Unit::cm / Unit::mm;
1725  double PXDMountFixtureBwd_D1 = m_config.getParameter(prep + "D1") * Unit::cm / Unit::mm;
1726  double PXDMountFixtureBwd_T1 = m_config.getParameter(prep + "T1") * Unit::cm / Unit::mm;
1727  double PXDMountFixtureBwd_T2 = m_config.getParameter(prep + "T2") * Unit::cm / Unit::mm;
1728  double PXDMountFixtureBwd_FL = m_config.getParameter(prep + "I1") * Unit::cm / Unit::mm;
1729  double PXDMountFixtureBwd_inner_cut_phi = PXDMountFixtureBwd_FL / (PXDMountBwd_R1 + PXDMountFixtureBwd_T1);
1730  double PXDMountFixtureBwd_outter_uni_phi = (1 / 6.0) * M_PI - PXDMountFixtureBwd_FL / PXDMountFixtureBwd_R1;
1731 
1732  string strMat_PXDMountFixtureBwd = m_config.getParameterStr(prep + "Material");
1733  G4Material* mat_PXDMountFixtureBwd = Materials::get(strMat_PXDMountFixtureBwd);
1734 
1735  //define geometry
1736  G4VSolid* geo_PXDMountFixtureBwd_a = new G4Tubs("geo_PXDMountFixtureBwd_a", 0, PXDMountFixtureBwd_R1 - PXDMountFixtureBwd_T2,
1737  PXDMountFixtureBwd_D1 / 2, 0,
1738  2 * M_PI);
1739  G4VSolid* geo_PXDMountFixtureBwd_b = new G4Box("geo_PXDMountFixtureBwd_b", PXDMountFixtureBwd_R1 * 0.5, 0.1 * Unit::cm / Unit::mm,
1740  100);
1741 
1742  G4VSolid* geo_PXDMountFixtureBwd_b1 = new G4Box("geo_PXDMountFixtureBwd_b1", PXDMountBwd_R1 + PXDMountFixtureBwd_T1,
1743  PXDMountFixtureBwd_FL * 0.5, 100);
1744  G4VSolid* geo_PXDMountFixtureBwd_b2 = new G4Tubs("geo_PXDMountFixtureBwd_b2", PXDMountBwd_R1 + PXDMountFixtureBwd_T1,
1745  PXDMountFixtureBwd_R1, PXDMountFixtureBwd_D1 / 2,
1746  0, PXDMountFixtureBwd_outter_uni_phi);
1747  G4VSolid* geo_PXDMountFixtureBwd_b3 = new G4Box("geo_PXDMountFixtureBwd_b3", 0.2 * Unit::cm / Unit::mm, 0.35 * Unit::cm / Unit::mm,
1748  100 * Unit::cm / Unit::mm);
1749 
1750  G4VSolid* geo_PXDMountFixtureBwd_a1 = new G4Tubs("geo_PXDMountFixtureBwd_a1", 0, PXDMountBwd_R1, 100, 0, 2 * M_PI);
1751 
1752  G4VSolid* geo_PXDMountFixtureBwd_c1 = new G4SubtractionSolid("geo_PXDMountFixtureBwd_c1", geo_PXDMountFixtureBwd_a,
1753  geo_PXDMountFixtureBwd_a1);
1754 
1755 
1756  G4VSolid* geo_PXDMountFixtureBwd_d1 = geo_PXDMountFixtureBwd_c1;
1757  for (int i = 0; i < 4; ++i) {
1758 
1759  geo_PXDMountFixtureBwd_d1 = new G4SubtractionSolid("geo_PXDMountFixtureBwd_d1", geo_PXDMountFixtureBwd_d1,
1760  geo_PXDMountFixtureBwd_b1, G4RotateZ3D(i * 0.25 * M_PI));
1761  }
1762  geo_PXDMountFixtureBwd_d1 = new G4SubtractionSolid("geo_PXDMountFixtureBwd_d1", geo_PXDMountFixtureBwd_d1,
1763  geo_PXDMountFixtureBwd_b, G4Translate3D(PXDMountFixtureBwd_R1, - PXDMountFixtureBwd_FL * 0.5, 0));
1764  geo_PXDMountFixtureBwd_d1 = new G4SubtractionSolid("geo_PXDMountFixtureBwd_d1", geo_PXDMountFixtureBwd_d1,
1765  geo_PXDMountFixtureBwd_b, G4Translate3D(-PXDMountFixtureBwd_R1, PXDMountFixtureBwd_FL * 0.5, 0));
1766 
1767 
1768  double PXDMountFixtureBwd_R1_temp = PXDMountFixtureBwd_R1 - PXDMountFixtureBwd_T2;
1769  for (int i = 2; i < 7; i += 4) {
1770 
1771  geo_PXDMountFixtureBwd_d1 = new G4SubtractionSolid("geo_PXDMountFixtureBwd_d1", geo_PXDMountFixtureBwd_d1,
1772  geo_PXDMountFixtureBwd_b3,
1773  G4Translate3D(PXDMountFixtureBwd_R1_temp * cos(i * 0.25 * M_PI - 0.5 * PXDMountFixtureBwd_inner_cut_phi),
1774  PXDMountFixtureBwd_R1_temp * sin(i * 0.25 * M_PI - 0.5 * PXDMountFixtureBwd_inner_cut_phi),
1775  0)*G4RotateZ3D(i * 0.25 * M_PI - 0.5 * PXDMountFixtureBwd_inner_cut_phi));
1776 
1777  geo_PXDMountFixtureBwd_d1 = new G4SubtractionSolid("geo_PXDMountFixtureBwd_d1", geo_PXDMountFixtureBwd_d1,
1778  geo_PXDMountFixtureBwd_b3,
1779  G4Translate3D(PXDMountFixtureBwd_R1_temp * cos(i * 0.25 * M_PI + 0.5 * PXDMountFixtureBwd_inner_cut_phi),
1780  PXDMountFixtureBwd_R1_temp * sin(i * 0.25 * M_PI + 0.5 * PXDMountFixtureBwd_inner_cut_phi),
1781  0)*G4RotateZ3D(i * 0.25 * M_PI + 0.5 * PXDMountFixtureBwd_inner_cut_phi));
1782 
1783  }
1784  G4VSolid* geo_PXDMountFixtureBwd_d2 = geo_PXDMountFixtureBwd_d1;
1785  for (int i = 0; i < 12; ++i) {
1786  if (i == 2 || i == 3 || i == 8 || i == 9) continue;
1787  geo_PXDMountFixtureBwd_d2 = new G4UnionSolid("geo_PXDMountFixtureBwd_d1", geo_PXDMountFixtureBwd_d2,
1788  geo_PXDMountFixtureBwd_b2, G4RotateZ3D(i * (1 / 6.0) * M_PI + ((1 / 12.0)*M_PI - 0.5 * PXDMountFixtureBwd_outter_uni_phi)));
1789 
1790  }
1791 
1792  G4VSolid* geo_PXDMountFixtureBwd = geo_PXDMountFixtureBwd_d2;
1793  G4LogicalVolume* logi_PXDMountFixtureBwd = new G4LogicalVolume(geo_PXDMountFixtureBwd, mat_PXDMountFixtureBwd,
1794  "logi_PXDMountFixtureBwd_name");
1795  setColor(*logi_PXDMountFixtureBwd, "#333333");
1796 
1797  new G4PVPlacement(0, G4ThreeVector(0, 0, -PXDMountFixtureBwd_D1 / 2 - PXDMountFixtureBwd_Z1), logi_PXDMountFixtureBwd,
1798  "phys_PXDMountFixtureBwd_name",
1799  &topVolume, false, 0);
1800 
1801 
1802  //---------------------------
1803  // for dose simulation
1804  //---------------------------
1805 
1806  int Index_sensi = 11;
1807  m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", Index_sensi++)));
1808  logi_Lv3AuCoat->SetSensitiveDetector(m_sensitive.back());
1809 
1810  m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", Index_sensi++)));
1811  logi_Lv1TaFwd->SetSensitiveDetector(m_sensitive.back());
1812 
1813  m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", Index_sensi++)));
1814  logi_Lv1TaBwd->SetSensitiveDetector(m_sensitive.back());
1815 
1816  m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", Index_sensi++)));
1817  logi_Lv1TaLERUp->SetSensitiveDetector(m_sensitive.back());
1818 
1819  m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", Index_sensi++)));
1820  logi_Lv1SUSLERUp->SetSensitiveDetector(m_sensitive.back());
1821 
1822  m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", Index_sensi++)));
1823  logi_Lv1TaHERDwn->SetSensitiveDetector(m_sensitive.back());
1824 
1825  m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", Index_sensi++)));
1826  logi_Lv1SUSHERDwn->SetSensitiveDetector(m_sensitive.back());
1827 
1828  m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", Index_sensi++)));
1829  logi_Lv1TaHERUp->SetSensitiveDetector(m_sensitive.back());
1830 
1831  m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", Index_sensi++)));
1832  logi_Lv1SUSHERUp->SetSensitiveDetector(m_sensitive.back());
1833 
1834  m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", Index_sensi++)));
1835  logi_Lv1TaLERDwn->SetSensitiveDetector(m_sensitive.back());
1836 
1837  m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", Index_sensi++)));
1838  logi_Lv1SUSLERDwn->SetSensitiveDetector(m_sensitive.back());
1839 
1840  m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", Index_sensi++)));
1841  logi_CuFlangeFwd->SetSensitiveDetector(m_sensitive.back());
1842 
1843  m_sensitive.push_back((SensitiveDetector*)(new BkgSensitiveDetector("IR", Index_sensi++)));
1844  logi_CuFlangeBwd->SetSensitiveDetector(m_sensitive.back());
1845 
1846  //-
1847  //----------
1848 
1851  }
1852  }
1854 }
The Class for BeamBackground Sensitive Detector.
The IR Sensitive Detector class.
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28
void setVisibility(G4LogicalVolume &volume, bool visible)
Helper function to quickly set the visibility of a given volume.
Definition: utilities.cc:108
void setColor(G4LogicalVolume &volume, const std::string &color)
Set the color of a logical volume.
Definition: utilities.cc:100
GeometryTypes
Flag indiciating the type of geometry to be used.
Abstract base class for different kinds of events.