Analysis Software
Documentation for sPHENIX simulation software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
PHG4SectorConstructor.h
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file PHG4SectorConstructor.h
1 // Tell emacs that this is a C++ source
2 // -*- C++ -*-.
3 
12 #ifndef G4DETECTORS_PHG4SECTORCONSTRUCTOR_H
13 #define G4DETECTORS_PHG4SECTORCONSTRUCTOR_H
14 
15 #include <Geant4/G4PhysicalConstants.hh>
16 #include <Geant4/G4String.hh> // for G4String
17 #include <Geant4/G4SystemOfUnits.hh>
18 #include <Geant4/G4Types.hh> // for G4int
19 
20 class G4LogicalVolume;
21 class G4PVPlacement;
22 class G4VSolid;
24 class PHG4Subsystem;
25 
26 #include <map>
27 #include <utility>
28 
29 #include <cassert>
30 #include <cmath>
31 #include <string>
32 #include <vector>
33 
34 namespace PHG4Sector
35 {
38  class Layer
39  {
40  public:
42  const std::string &_name,
43 
45  const std::string &_material,
46 
48  double _depth,
49 
51  double _percentage_filled,
52 
54  bool _active)
55  : name(_name)
56  , material(_material)
57  , depth(_depth)
59  _percentage_filled)
60  , active(_active)
61  {
62  }
63 
64  public:
67 
70 
72  double depth;
73 
76 
78  bool active;
79  };
80 
84  {
85  public:
87  {
88  SetDefault();
89  }
90 
91  void
92  SetDefault();
93 
94  int get_N_Sector() const
95  {
96  return N_Sector;
97  }
98 
99  std::vector<Layer> &
101  {
102  return layer_list;
103  }
104 
106  get_material() const
107  {
108  return material;
109  }
110 
111  double
113  {
114  return max_polar_angle;
115  }
116 
117  double
119  {
120  return min_polar_angle;
121  }
122 
123  double
125  {
126  return normal_polar_angle;
127  }
128 
129  double
131  {
132  return normal_start;
133  }
134 
135  void
136  set_N_Sector(int sector)
137  {
138  assert(sector >= 1);
139 
140  N_Sector = sector;
141  }
142 
143  void
144  set_layer_list(const std::vector<Layer> &layerList)
145  {
146  layer_list = layerList;
147  }
148 
149  void
150  set_material(const std::string &_material)
151  {
152  material = _material;
153  }
154 
155  void
156  set_max_polar_angle(double maxPolarAngle)
157  {
158  assert(maxPolarAngle >= 0);
159  assert(maxPolarAngle <= pi);
160 
161  max_polar_angle = maxPolarAngle;
162  }
163 
164  void
165  set_min_polar_angle(double minPolarAngle)
166  {
167  assert(minPolarAngle >= 0);
168  assert(minPolarAngle <= pi);
169 
170  min_polar_angle = minPolarAngle;
171  }
172 
173  void
174  set_normal_polar_angle(double normalPolarAngle)
175  {
176  assert(normalPolarAngle >= 0);
177  assert(normalPolarAngle <= pi);
178 
179  normal_polar_angle = normalPolarAngle;
180  }
181 
182  void
183  set_normal_start(double normalZStart)
184  {
185  normal_start = normalZStart;
186  }
187 
188  // derivative constants
189 
190  // ! max radius from IP
191  double
192  get_max_R() const;
193 
194  double
195  get_total_thickness() const;
196 
198  static double
200  {
201  return cm;
202  }
203 
205  void
206  set_normal_start(const double z_intercept, const double angle_intercept)
207  {
209  z_intercept / cos(angle_intercept) * cos(normal_polar_angle - angle_intercept));
210  }
211 
213  static double
214  eta_to_polar_angle(const double eta)
215  {
216  return 2. * atan(exp(-eta));
217  }
218 
219  // layer descriptions
220  public:
221  typedef std::vector<Layer> t_layer_list;
223 
224  int GetNumActiveLayers() const
225  {
226  int n = 0;
227  for (t_layer_list::const_iterator it = layer_list.begin();
228  it != layer_list.end(); ++it)
229  if ((*it).active)
230  n++;
231  return n;
232  }
233 
234  void
236  const std::string &_name,
237  const std::string &_material,
238  double _depth,
239  bool _active = false,
240  double _percentage_filled = 100
241  )
242  {
243  layer_list.push_back(
244  Layer(_name, _material, _depth, _percentage_filled, _active));
245  }
246 
250  void
251  AddLayers_DriftVol_COMPASS(const double drift_vol_thickness = 3 * mm);
252 
257  void
258  AddLayers_HBD_GEM(const int n_GEM_layers = 3);
259 
264  void
266 
271  void
272  AddLayers_AeroGel_ePHENIX(const double radiator_length = 2 * cm,
273  const double expansion_length = 18 * cm, std::string radiator = "Default");
274 
275  public:
276  typedef enum
277  {
278 
281 
284 
285  } e_edge_typ;
286 
287  static e_edge_typ
289  {
290  return kConeEdge;
291  }
292 
293  static e_edge_typ
295  {
296  return kFlatEdge;
297  }
298 
299  e_edge_typ
301  {
302  return max_polar_edge;
303  }
304 
305  e_edge_typ
307  {
308  return min_polar_edge;
309  }
310 
311  void
313  {
314  max_polar_edge = maxPolarEdge;
315  }
316 
317  void
319  {
320  min_polar_edge = minPolarEdge;
321  }
322 
323  private:
325  int N_Sector;
326 
329 
332 
335 
338 
341 
343  double normal_start;
344 
347  };
348 
351  {
352  public:
355 
356  void
357  Construct_Sectors(G4LogicalVolume *WorldLog);
358 
359  void
361  {
363  }
364 
365  void Verbosity(int v) { m_Verbosity = v; }
366  int Verbosity() const { return m_Verbosity; }
367 
368  protected:
370 
371  G4VSolid *
373  const std::string &name, //
374  const double start_z, //
375  const double thickness, //
376  G4VSolid *SecConeBoundary_Det //
377  );
378 
379  public:
380  // properties
381 
383 
385 
386  private:
389 
390  protected:
391  G4LogicalVolume *
392  RegisterLogicalVolume(G4LogicalVolume *);
393 
394  typedef std::map<G4String, G4LogicalVolume *> map_log_vol_t;
396 
397  G4PVPlacement *
398  RegisterPhysicalVolume(G4PVPlacement *v, const bool active = false);
399 
400  typedef std::pair<G4String, G4int> phy_vol_idx_t;
401  typedef std::map<phy_vol_idx_t, G4PVPlacement *> map_phy_vol_t;
404  };
405 
406 } // namespace PHG4Sector
407 #endif /* PHG4SectorConstructor_H_ */