Project
Loading...
Searching...
No Matches
GeometryTGeo.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#ifndef ALICEO2_TRK_GEOMETRYTGEO_H
13#define ALICEO2_TRK_GEOMETRYTGEO_H
14
15#include <memory>
19
20namespace o2
21{
22namespace trk
23{
25{
26 public:
28 using DetMatrixCache::getMatrixL2G;
29 using DetMatrixCache::getMatrixT2GRot;
30 using DetMatrixCache::getMatrixT2L;
31 // this method is not advised for ITS: for barrel detectors whose tracking frame is just a rotation
32 // it is cheaper to use T2GRot
33 using DetMatrixCache::getMatrixT2G;
34 GeometryTGeo(bool build = false, int loadTrans = 0);
36 void Build(int loadTrans);
37 void fillMatrixCache(int mask);
39 {
40 if (!sInstance) {
41 sInstance = std::make_unique<GeometryTGeo>(true, 0);
42 }
43 return sInstance.get();
44 };
45 static const char* getTRKVolPattern() { return sVolumeName.c_str(); }
46 static const char* getTRKLayerPattern() { return sLayerName.c_str(); }
47 static const char* getTRKPetalAssemblyPattern() { return sPetalAssemblyName.c_str(); }
48 static const char* getTRKPetalPattern() { return sPetalName.c_str(); }
49 static const char* getTRKPetalDiskPattern() { return sPetalDiskName.c_str(); }
50 static const char* getTRKPetalLayerPattern() { return sPetalLayerName.c_str(); }
51 static const char* getTRKStavePattern() { return sStaveName.c_str(); }
52 static const char* getTRKHalfStavePattern() { return sHalfStaveName.c_str(); }
53 static const char* getTRKModulePattern() { return sModuleName.c_str(); }
54 static const char* getTRKChipPattern() { return sChipName.c_str(); }
55 static const char* getTRKSensorPattern() { return sSensorName.c_str(); }
56 static const char* getTRKDeadzonePattern() { return sDeadzoneName.c_str(); }
57 static const char* getTRKMetalStackPattern() { return sMetalStackName.c_str(); }
58
59 static const char* getTRKWrapVolPattern() { return sWrapperVolumeName.c_str(); }
60
61 int getNumberOfChips() const { return mSize; }
62
65 int extractNumberOfLayersVD() const;
66 int extractNumberOfPetalsVD() const;
68 int extractNumberOfDisksVD() const;
70 int extractNumberOfStavesMLOT(int lay) const;
71 int extractNumberOfHalfStavesMLOT(int lay) const;
72 int extractNumberOfModulesMLOT(int lay) const;
73 int extractNumberOfChipsMLOT(int lay) const;
74
76 int extractVolumeCopy(const char* name, const char* prefix) const;
77
80 int getNumberOfHalfStaves(int lay) const { return mNumberOfHalfStaves[lay]; }
81
82 bool isOwner() const { return mOwner; }
83 void setOwner(bool v) { mOwner = v; }
84
85 void Print(Option_t* opt = "") const;
86 void PrintChipID(int index, int subDetID, int petalcase, int disk, int lay, int stave, int halfstave, int mod, int chip) const;
87
88 int getSubDetID(int index) const;
89 int getPetalCase(int index) const;
90 int getDisk(int index) const;
91 int getLayer(int index) const;
92 int getStave(int index) const;
93 int getHalfStave(int index) const;
94 int getModule(int index) const;
95 int getChip(int index) const;
96
97 void defineMLOTSensors();
98 int getBarrelLayer(int) const;
99
100 // sensor ref X and alpha for ML & OT
101 void extractSensorXAlphaMLOT(int, float&, float&);
102
103 // cache for tracking frames (ML & OT)
104 bool isTrackingFrameCachedMLOT() const { return !mCacheRefXMLOT.empty(); }
106
107 float getSensorRefAlphaMLOT(int chipId) const
108 {
109 assert(getSubDetID(chipId) != 0 && "Called MLOT getter with VD chipId");
110 const int local = chipId - getNumberOfActivePartsVD();
111 assert(local >= 0 && local < (int)mCacheRefAlphaMLOT.size());
112 return mCacheRefAlphaMLOT[local];
113 }
114
115 float getSensorXMLOT(int chipId) const
116 {
117 assert(getSubDetID(chipId) != 0 && "Called MLOT getter with VD chipId");
118 const int local = chipId - getNumberOfActivePartsVD();
119 assert(local >= 0 && local < (int)mCacheRefXMLOT.size());
120 return mCacheRefXMLOT[local];
121 }
122
123 // create matrix for tracking to local frame for MLOT
124 TGeoHMatrix& createT2LMatrixMLOT(int);
125
136 unsigned short getChipIndex(int subDetID, int petalcase, int disk, int lay, int stave, int halfstave, int mod, int chip) const;
137
146 unsigned short getChipIndex(int subDetID, int volume, int lay, int stave, int halfstave, int mod, int chip) const;
147
158 bool getChipID(int index, int& subDetID, int& petalcase, int& disk, int& lay, int& stave, int& halfstave, int& mod, int& chip) const;
159
160 unsigned short getLastChipIndex(int lay) const { return mLastChipIndex[lay]; }
161 unsigned short getFirstChipIndex(int lay, int petalcase, int subDetID) const
162 {
164 if (subDetID == 0) { // VD
165 return (petalcase == 0) ? 0 : mLastChipIndexVD[petalcase - 1] + 1;
166 } else if (subDetID == 1) { // MLOT
167 return mLastChipIndex[lay + mNumberOfPetalsVD - 1] + 1;
168 }
169 return -1; // not found
170 }
171
174 TGeoHMatrix* extractMatrixSensor(int index) const;
175
176 TString getMatrixPath(int index) const;
177
178#ifdef ENABLE_UPGRADES
179 static const char* composeSymNameTRK(int d)
180 {
181 return Form("%s_%d", o2::detectors::DetID(o2::detectors::DetID::TRK).getName(), d);
182 }
183#endif
184
185 static const char* composeSymNameLayer(int d, int layer);
186 static const char* composeSymNameStave(int d, int layer);
187 static const char* composeSymNameModule(int d, int layer);
188 static const char* composeSymNameChip(int d, int layer);
189 static const char* composeSymNameSensor(int d, int layer);
190
191 protected:
192 static constexpr int MAXLAYERS = 20;
193
194 static std::string sVolumeName;
195 static std::string sLayerName;
196 static std::string sPetalAssemblyName;
197 static std::string sPetalName;
198 static std::string sPetalDiskName;
199 static std::string sPetalLayerName;
200 static std::string sStaveName;
201 static std::string sHalfStaveName;
202 static std::string sModuleName;
203 static std::string sChipName;
204 static std::string sSensorName;
205 static std::string sDeadzoneName;
206 static std::string sMetalStackName;
207
208 static std::string sWrapperVolumeName;
209
215 std::vector<int> mNumberOfStaves;
216 std::vector<int> mNumberOfHalfStaves;
217 std::vector<int> mNumberOfModules;
218 std::vector<int> mNumberOfChips;
219 std::vector<int> mNumberOfChipsPerLayerVD;
220 std::vector<int> mNumberOfChipsPerLayerMLOT;
221 std::vector<int> mNumbersOfChipPerDiskVD;
222 std::vector<int> mNumberOfChipsPerPetalVD;
223 // std::vector<int> mNumberOfChipsPerStave; ///< number of chips per stave in ML/OT
224 // std::vector<int> mNumberOfChipsPerHalfStave; ///< number of chips per half stave in ML/OT
225 // std::vector<int> mNumberOfChipsPerModule; ///< number of chips per module in ML/OT
226 std::vector<unsigned short> mLastChipIndex;
227 std::vector<unsigned short> mLastChipIndexVD;
228 std::vector<unsigned short> mLastChipIndexMLOT;
229
230 std::array<char, MAXLAYERS> mLayerToWrapper;
231
232 bool mOwner = true;
233
234 std::vector<int> sensorsMLOT;
235 std::vector<float> mCacheRefXMLOT;
236 std::vector<float> mCacheRefAlphaMLOT;
237
238 eMLOTLayout mLayoutMLOT; // ML and OT detector layout design
239
240 private:
241 static std::unique_ptr<o2::trk::GeometryTGeo> sInstance;
242};
243
244} // namespace trk
245} // namespace o2
246#endif
Static class with identifiers, bitmasks and names for ALICE detectors.
Definition DetID.h:58
const char * getName() const
int mSize
prebooked number of sensors
static const char * composeSymNameModule(int d, int layer)
static const char * getTRKPetalDiskPattern()
int getModule(int index) const
static std::string sPetalAssemblyName
static const char * getTRKStavePattern()
int getPetalCase(int index) const
static const char * getTRKChipPattern()
std::vector< int > mNumberOfChipsPerLayerVD
number of chips per layer VD ( = number of petals)
static std::string sVolumeName
int getSubDetID(int index) const
std::array< char, MAXLAYERS > mLayerToWrapper
Layer to wrapper correspondence, not implemented yet.
static const char * composeSymNameChip(int d, int layer)
static std::string sPetalLayerName
static const char * getTRKSensorPattern()
static std::string sStaveName
static constexpr int MAXLAYERS
max number of active layers
bool getChipID(int index, int &subDetID, int &petalcase, int &disk, int &lay, int &stave, int &halfstave, int &mod, int &chip) const
std::vector< int > mNumberOfHalfStaves
Number Of Half staves in each stave of the layer in ML/OT.
int extractNumberOfChipsPerPetalVD() const
bool isTrackingFrameCachedMLOT() const
int extractNumberOfHalfStavesMLOT(int lay) const
static const char * getTRKPetalLayerPattern()
int getChip(int index) const
int extractNumberOfLayersMLOT()
Determines the number of active parts in the Geometry.
int extractNumberOfChipsMLOT(int lay) const
std::vector< int > mNumbersOfChipPerDiskVD
numbersOfChipPerDiskVD
std::vector< int > mNumberOfStaves
Number Of Staves per layer in ML/OT.
Int_t mNumberOfPetalsVD
number of Petals = chip in each VD layer
std::vector< int > mNumberOfModules
Number Of Modules per stave (half stave) in ML/OT.
static std::string sPetalName
int extractNumberOfStavesMLOT(int lay) const
static std::string sPetalDiskName
void Print(Option_t *opt="") const
float getSensorRefAlphaMLOT(int chipId) const
int getLayer(int index) const
std::vector< unsigned short > mLastChipIndexVD
max ID of the detctor in the layer for the VD
static const char * getTRKWrapVolPattern()
std::vector< float > mCacheRefXMLOT
TString getMatrixPath(int index) const
static const char * getTRKDeadzonePattern()
static const char * getTRKPetalAssemblyPattern()
int getNumberOfChips() const
static const char * getTRKLayerPattern()
static std::string sHalfStaveName
unsigned short getFirstChipIndex(int lay, int petalcase, int subDetID) const
std::vector< int > mNumberOfChips
number of chips per module in ML/OT
static std::string sWrapperVolumeName
Wrapper volume name, not implemented at the moment.
TGeoHMatrix & createT2LMatrixMLOT(int)
std::vector< float > mCacheRefAlphaMLOT
cache for X of ML and OT
static const char * getTRKHalfStavePattern()
int extractNumberOfLayersVD() const
std::vector< int > mNumberOfChipsPerPetalVD
numbersOfChipPerPetalVD
static std::string sMetalStackName
static std::string sChipName
static std::string sSensorName
void fillMatrixCache(int mask)
std::vector< int > sensorsMLOT
is it owned by the singleton?
static std::string sDeadzoneName
static std::string sLayerName
unsigned short getChipIndex(int subDetID, int petalcase, int disk, int lay, int stave, int halfstave, int mod, int chip) const
int extractNumberOfActivePartsVD() const
void PrintChipID(int index, int subDetID, int petalcase, int disk, int lay, int stave, int halfstave, int mod, int chip) const
static const char * composeSymNameSensor(int d, int layer)
void setOwner(bool v)
int extractNumberOfModulesMLOT(int lay) const
int extractNumberOfDisksVD() const
int getNumberOfHalfStaves(int lay) const
static const char * getTRKPetalPattern()
int getNumberOfLayersMLOT() const
Int_t mNumberOfActivePartsVD
number of layers
int getNumberOfActivePartsVD() const
std::vector< int > mNumberOfChipsPerLayerMLOT
number of chips per layer MLOT
static const char * getTRKMetalStackPattern()
Int_t mNumberOfDisksVD
number of Disks = 6
std::vector< unsigned short > mLastChipIndexMLOT
max ID of the detctor in the layer for the MLOT
Int_t mNumberOfLayersMLOT
number of layers
static const char * composeSymNameLayer(int d, int layer)
int getStave(int index) const
int getBarrelLayer(int) const
static const char * getTRKVolPattern()
static const char * getTRKModulePattern()
float getSensorXMLOT(int chipId) const
static const char * composeSymNameStave(int d, int layer)
int getDisk(int index) const
int extractNumberOfPetalsVD() const
int extractVolumeCopy(const char *name, const char *prefix) const
Extract number following the prefix in the name string.
std::vector< unsigned short > mLastChipIndex
max ID of the detctor in the petal(VD) or layer(MLOT)
void extractSensorXAlphaMLOT(int, float &, float &)
void Build(int loadTrans)
eMLOTLayout mLayoutMLOT
cache for sensor ref alpha ML and OT
Int_t mNumberOfLayersVD
number of layers
static GeometryTGeo * Instance()
int getHalfStave(int index) const
TGeoHMatrix * extractMatrixSensor(int index) const
static std::string sModuleName
unsigned short getLastChipIndex(int lay) const
const GLdouble * v
Definition glcorearb.h:832
GLuint index
Definition glcorearb.h:781
GLuint const GLchar * name
Definition glcorearb.h:781
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
GLint GLuint mask
Definition glcorearb.h:291
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...