Belle II Software development
ARICHGeometryPar.h
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#ifndef ARICHGEOMETRYPAR_H
10#define ARICHGEOMETRYPAR_H
11
12#include <vector>
13#include <string>
14#include <map>
15#include <unordered_set>
16#include <framework/gearbox/GearDir.h>
17#include <Math/Vector3D.h>
18#include <Math/Vector2D.h>
19#include <G4ThreeVector.hh>
20
21#define MAX_N_ALAYERS 5
22#define MAXPTS_QE 100
23
24namespace Belle2 {
30
35
36 public:
37
40
42 virtual ~ARICHGeometryPar();
43
45
48 static ARICHGeometryPar* Instance();
50 void Initialize(const GearDir& content);
52 void Initialize(const GearDir& content, const GearDir& mirrorinfo);
53
55 void clear(void);
56
58 void Print(void) const;
59
61 void read(const GearDir& content);
62
64 void readModuleInfo(const GearDir& content);
65
67 double QE(double e) const;
68
70 double getColEffi() const;
71
73 double getSensitiveSurfaceSize() const;
75 int getNMCopies() const;
77 int getCopyNo(const ROOT::Math::XYZVector& hit);
79 ROOT::Math::XYZVector getOrigin(int copyno);
81 G4ThreeVector getOriginG4(int copyNo);
83 double getModAngle(int copyno);
85 int getChannelID(ROOT::Math::XYVector hit);
87 ROOT::Math::XYVector getChannelCenterLoc(int chID);
89 double getChannelQE(int moduleID, int channelID);
91 ROOT::Math::XYVector getChipLocPos(int chipID);
93 int getChipID(ROOT::Math::XYVector locpos);
95 ROOT::Math::XYZVector getChannelCenterGlob(int modID, int chanID);
97 ROOT::Math::XYZVector getMirrorNormal(int mirID);
99 ROOT::Math::XYZVector getMirrorPoint(int mirID);
101 double getAerogelTransmissionLength(int ilayer);
103 double getAerogelRefIndex(int ilayer);
105 double getAerogelThickness(int ilayer);
107 double getAerogelZPosition(int ilayer);
109 int getNMirrors();
111 double getMirrorsStartAngle();
113 double getMirrorsZPosition();
121 double getDetectorPadSize();
123 double getDetectorZPosition();
127 double getQEScaling();
129 double getWindowAbsorbtion();
133 int getNrTiles();
135 int getNphiTiles(int nRing);
137 double getTileGap();
139 double getAeroTubeRin();
141 double getAeroTubeRout();
143 void setAeroTransLength(int ilayer, double trlen);
145 void setAeroRefIndex(int ilayer, double n);
147 void setAerogelThickness(int ilayer, double thick);
149 void setAerogelZPosition(int ilayer, double zPos);
151 void setWindowRefIndex(double refInd);
153 bool isInit();
155 bool isSimple();
157 void initDetectorMask(int nmodules);
159 void setActive(int module, int channel, bool val);
161 bool isActive(int module, int channel);
162
164 int getMergerFromCooper(int cooperID, int finesse);
166 int getBoardFromMerger(int mergerID, int slot);
168 int getNBoardsOnMerger(int mergerID);
169
171 int getAerogelTileID(ROOT::Math::XYVector locpos);
172
174 const std::unordered_set<unsigned int>& getCopperIDs() const
175 {
176 return m_copperIDs;
177 }
178
179 private:
180
181 std::string m_version;
182 double m_padSize;
183 double m_chipGap;
186 double m_detZpos;
187 double m_modXSize;
188 double m_modZSize;
189 double m_winThick;
190 double m_winRefInd;
197 int m_nRad;
198 bool m_init;
199 bool m_simple;
200 double m_aeroTrLength[MAX_N_ALAYERS];
201 double m_aeroRefIndex[MAX_N_ALAYERS];
202 double m_aeroZPosition[MAX_N_ALAYERS];
203 double m_aeroThickness[MAX_N_ALAYERS];
205 std::vector<uint32_t> m_DetectorMask;
206 std::vector<uint8_t> m_ChannelQE;
208 double m_ColEffi;
212 double m_qeScale;
215 double m_QE[MAXPTS_QE];
218 int m_tileNphi[5];
219 double m_tileGap;
220 double m_aeroRin;
221 double m_aeroRout;
224 void modulesPosition(const GearDir& content);
225
227 void modulesPositionSimple(const GearDir& content);
228
230 void chipLocPosition();
231
233 void padPositions();
235
237 void mirrorPositions(const GearDir& content);
238
240 void readMirrorAlignment(const GearDir& content);
241
243 void mirrorPositionSimple(const GearDir& content);
244
246 void frontEndMapping(const GearDir& content);
247
250 // vectors holding information on HAPDs and chips and pads positions.
251
252 std::vector<int>
254 std::vector<double> m_fDFi;
255 std::vector<double> m_fDR;
256 int m_nrow;
257 std::vector<double> m_fR;
258 std::vector<double> m_fFi;
259 std::vector<double> m_fFiMod;
260 std::vector<ROOT::Math::XYVector> m_chipLocPos;
261 std::map<int, ROOT::Math::XYVector>
263 std::vector<ROOT::Math::XYVector> m_padWorldPositions;
264 std::vector<ROOT::Math::XYZVector> m_mirrornorm;
265 std::vector<ROOT::Math::XYZVector> m_mirrorpoint;
267 std::map<std::pair<unsigned, int>, unsigned> m_copper2merger;
268 std::map<int, std::vector<unsigned>> m_merger2feb;
269 std::unordered_set<unsigned int> m_copperIDs;
270 std::unordered_set<unsigned int> m_mergerIDs;
271 std::unordered_set<unsigned int> m_boardIDs;
273 };
274
275 //-----------------------------------------------------------------------------
276
277 inline double ARICHGeometryPar::getColEffi() const
278 {
279 return m_ColEffi;
280 }
281
283 {
284 return m_nPadX * m_padSize + m_chipGap;
285 }
286
288 {
289 return m_fR.size();
290 }
291
292 inline ROOT::Math::XYVector ARICHGeometryPar::getChipLocPos(int chipID)
293 {
294 return m_chipLocPos.at(chipID);
295 }
296
298 {
299 return m_init;
300 }
301
303 {
304 return m_simple;
305 }
306
307
309 {
310 return m_aeroTrLength[layer];
311 }
312
314 {
315 return m_aeroRefIndex[layer];
316 }
317
319 {
320 return m_aeroThickness[layer];
321 }
322
324 {
325 return m_aeroZPosition[layer];
326 }
327
329 {
330 return m_nMirrors;
331 }
332
334 {
335 return m_winThick;
336 }
337
339 {
340 return m_winRefInd;
341 }
342
344 {
345 return m_nRad;
346 }
347
349 {
350 return m_padSize;
351 }
352
354 {
355 return m_nPadX;
356 }
357
359 {
360 return m_mirrorStartAng;
361 }
362
364 {
365 return m_mirrorZPos;
366 }
367
369 {
370 return m_detZpos;
371 }
372
374 {
375 return m_qeScale;
376 }
377
379 {
380 return m_windowAbsorbtion;
381 }
382
384 {
386 }
387
389 {
390 return m_tileNr;
391 }
392
393 inline int ARICHGeometryPar::getNphiTiles(int nRing)
394 {
395 if (nRing > 4) return 0;
396 return m_tileNphi[nRing];
397 }
398
400 {
401 return m_tileGap;
402 }
403
405 {
406 return m_aeroRin;
407 }
408
410 {
411 return m_aeroRout;
412 }
413
414
415
417} // end of namespace Belle2
418
419#endif
420
The Class for ARICH Geometry Parameters.
double m_modXSize
Detector module length.
double m_tileGap
Gap size between two aerogel tiles.
double m_winThick
Thickness of detector module window.
double m_padSize
Detector pad size.
double m_chipGap
Gap between chips in detector module.
double m_LambdaFirst
wavelength [nm]: first QE data point
std::vector< ROOT::Math::XYZVector > m_mirrornorm
vector holding normal vectors of mirror plates
std::vector< ROOT::Math::XYVector > m_chipLocPos
vector holding chip positions (in detector module local coordinates)
double m_aeroRout
Outer radius of aerogel tube.
double m_detZpos
Z position of detector plane.
double m_detInnerRadius
Inner radius of detector tube.
double m_aeroRin
Inner radius of aerogel tube.
double m_mirrorOuterRad
Radius of circle outscribed to mirrors polygon.
double m_aeroZPosition[MAX_N_ALAYERS]
Array of aerogel Z positions.
double m_qeScale
QE scale factor for photons internally reflected in HAPD window.
double m_detOuterRadius
Outer radius of detector tube.
std::vector< double > m_fDR
minimal distance between detector modules in radial direction
int m_nrow
number of detector rings
double m_modZSize
Detector module height.
std::string m_version
The version of geometry parameters.
double m_aeroTrLength[MAX_N_ALAYERS]
Array of aerogel transmission lenths.
int m_NpointsQE
number of QE data points
std::unordered_set< unsigned int > m_boardIDs
FEB ID's.
std::unordered_set< unsigned int > m_mergerIDs
Merger ID's.
std::vector< double > m_fR
radial coordinate of detector modules
double m_LambdaStep
wavelength [nm]: step
int m_tileNphi[5]
Number of aerogel tiles in phi direction of each "radial" ring.
double m_winRefInd
Detector window refractive index.
std::vector< uint32_t > m_DetectorMask
Detector Mask of inactive channels.
double m_ColEffi
collection efficiency
bool m_simple
True if parametrization initialized with simple geometry (beamtest)
int m_nRad
Number of aerogel layers.
double m_mirrorZPos
Z position of mirror plates (starting z)
std::vector< double > m_fDFi
angle covered by one detector module in ring
double m_chipNegativeCrosstalk
to simulate opposite polarity crosstalk among channels on chip
double m_QE[MAXPTS_QE]
quantum efficiency curve
std::unordered_set< unsigned int > m_copperIDs
COPPER ID's.
double m_aeroRefIndex[MAX_N_ALAYERS]
Array of aerogel refracive indices.
const std::unordered_set< unsigned int > & getCopperIDs() const
Returns a set of copper ID's.
std::vector< double > m_fFi
angular coordinate of detector modules
std::map< int, ROOT::Math::XYVector > m_padLocPositions
map holding channel local positions (in detector module local coordinates)
double m_windowAbsorbtion
absorbtion probability for photons internally reflected in HAPD window
std::map< std::pair< unsigned, int >, unsigned > m_copper2merger
mapping of merger boards to cooper boards
bool m_init
True if parametrization is already initialized.
int m_nPadX
Number of detector module pads in one direction.
int m_nPads
total number of pads in a sensor
std::vector< ROOT::Math::XYZVector > m_mirrorpoint
vector holding one point of each mirror plate
std::vector< ROOT::Math::XYVector > m_padWorldPositions
map holding channel global positions
std::vector< uint8_t > m_ChannelQE
Channel QE at 400nm.
std::vector< double > m_fFiMod
angle of detector module
double m_mirrorStartAng
The angle of first corner of mirror plates polygon.
double m_aeroThickness[MAX_N_ALAYERS]
Array of aerogel thickness.
int m_nMirrors
Number of mirrors segments.
std::map< int, std::vector< unsigned > > m_merger2feb
mapping of front-end boards to mergers
std::vector< int > m_ncol
m_ncol[i] gives number of detector modules in i-th detector ring (first one is the outer most)
int m_tileNr
Number of aerogel tiles in radial direction.
double m_mirrorThickness
Thickness of mirror plates.
GearDir is the basic class used for accessing the parameter store.
Definition: GearDir.h:31
int getNphiTiles(int nRing)
get number of aerogel tiles in each radial ring
ROOT::Math::XYVector getChipLocPos(int chipID)
get center position of chipID-th chip of detector module (in detector module local coordinates)
bool isInit()
returns true if parametrisation is initialized, false otherwise
int getDetectorXPadNumber()
get number of pads of detector module (in one direction)
int getMergerFromCooper(int cooperID, int finesse)
returns merger board ID from cooperID and finesse
void setAeroTransLength(int ilayer, double trlen)
set transmission length of "ilayer" aerogel layer
int getBoardFromMerger(int mergerID, int slot)
returns front-end board ID from merger ID and slot
double getWindowAbsorbtion()
get absorbtion probability for photons internally reflected in HAPD window
int getNMirrors()
get number of mirror plates
ROOT::Math::XYZVector getOrigin(int copyno)
get the position of copyno-th HAPD module origin
double getMirrorsStartAngle()
get the phi angle of first corner of mirror polygon
void mirrorPositions(const GearDir &content)
calculates parameters of all mirror planes (normal vector and point on plane)
int getChannelID(ROOT::Math::XYVector hit)
get ID number of channel containing point "hit" (hit is in detector module local coordinates)
double getAerogelZPosition(int ilayer)
get z position of "ilayer" aerogel layer
int getNrTiles()
get number of aerogel tiles in radial direction (number of rings)
double getDetectorZPosition()
get z position of detector plane (starting z)
void setAerogelThickness(int ilayer, double thick)
set thickness of "ilayer" aerogel layer
double getColEffi() const
get HAPD collection efficiency.
double getSensitiveSurfaceSize() const
get size of detector sensitive surface (size of two chips + gap between)
void modulesPositionSimple(const GearDir &content)
gets modules positions directly from xml file (for simple "beamtest" geometry).
void frontEndMapping(const GearDir &content)
reads front-end board to merger to cooper mapping from an xml file
void padPositions()
calculates the centers of channels in local (detector module) and global coordinates
double getAeroTubeRout()
get the outer size of aerogel tube
double getTileGap()
get size of the gap between aerogel tiles
int getNBoardsOnMerger(int mergerID)
returns number of front-end boards connected to the merger
void Initialize(const GearDir &content)
calculates detector parameters needed for geometry build and reconstruction.
double getDetectorWindowRefIndex()
get refractive index of detector module window
void setAerogelZPosition(int ilayer, double zPos)
set z position of "ilayer" aerogel layer
int getNumberOfAerogelRadiators()
get number of aerogel layers
double getDetectorPadSize()
get detectors module pad size
void read(const GearDir &content)
gets geometry parameters from gearbox.
double getDetectorWindowThickness()
get thickness of detector module window
void Print(void) const
Print some debug information.
void mirrorPositionSimple(const GearDir &content)
Gets mirrors positions directly from xml file (in case of simple "beamtest" geometry).
double getAerogelThickness(int ilayer)
get thickness of "ilayer" aerogel layer
double getMirrorsZPosition()
get the z position of mirror plates (starting z)
static ARICHGeometryPar * Instance()
Static method to get a reference to the ARICHGeometryPar instance.
double getAerogelTransmissionLength(int ilayer)
get transmission length of "ilayer" aerogel layer
void setAeroRefIndex(int ilayer, double n)
set refractive index of "ilayer" aerogel layer
virtual ~ARICHGeometryPar()
Destructor.
double getAerogelRefIndex(int ilayer)
get refractive index of "ilayer" aerogel layer
double getModAngle(int copyno)
get the angle of copyno-th HAPD rotation
static ARICHGeometryPar * p_B4ARICHGeometryParDB
Pointer that saves the instance of this class.
G4ThreeVector getOriginG4(int copyNo)
get the position of copyNo-th HAPD module origin (returns G4ThreeVector)
void readMirrorAlignment(const GearDir &content)
Reads mirror plates alignment parameters.
int getNMCopies() const
get the total number of HAPD modules
ROOT::Math::XYZVector getMirrorNormal(int mirID)
get normal vector of mirID-th mirror plate
void setActive(int module, int channel, bool val)
set the channel on/off
void initDetectorMask(int nmodules)
initialize detector mask
int getChipID(ROOT::Math::XYVector locpos)
get ID number of chip containing point "locpos"
void setWindowRefIndex(double refInd)
set detector module window refractive index
void chipLocPosition()
calculates the centers of chips in detector module local coordinates
void readModuleInfo(const GearDir &content)
read parameters of each module from gearbox.
bool isSimple()
returns true if parametrisation is initialized with simple geometry (beamtest)
double getChipNegativeCrosstalk()
get factor to suppress p.e. detection efficiency due to negative polarity crosstalk among chip channe...
bool isActive(int module, int channel)
check the activity of the channel
double getChannelQE(int moduleID, int channelID)
get channel quantum efficiency
double QE(double e) const
get photocathode quantum efficiency at energy e.
double getAeroTubeRin()
get the inner size of aerogel tube
int getAerogelTileID(ROOT::Math::XYVector locpos)
returns ID number of aerogel tile containing locpos (x-y) point.
int getCopyNo(const ROOT::Math::XYZVector &hit)
get the copy number of HAPD module containing point "hit"
ROOT::Math::XYZVector getChannelCenterGlob(int modID, int chanID)
get center of chanID channel of modID detector module (in global coordinates)
void modulesPosition(const GearDir &content)
calculates the positions of HAPD modules, with the parameters from xml.
ROOT::Math::XYVector getChannelCenterLoc(int chID)
get center position of chID channel (in detector module local coordinates)
ROOT::Math::XYZVector getMirrorPoint(int mirID)
get one point lying on mirID-th mirror plate
double getQEScaling()
get QE scaling factor for photons internally reflected in HAPD window
Abstract base class for different kinds of events.