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* getTRKServiceVolPattern() { return sServiceVolName.c_str(); }
47 static const char* getTRKLayerPattern() { return sLayerName.c_str(); }
48 static const char* getTRKPetalAssemblyPattern() { return sPetalAssemblyName.c_str(); }
49 static const char* getTRKPetalPattern() { return sPetalName.c_str(); }
50 static const char* getTRKPetalDiskPattern() { return sPetalDiskName.c_str(); }
51 static const char* getTRKPetalLayerPattern() { return sPetalLayerName.c_str(); }
52 static const char* getTRKStavePattern() { return sStaveName.c_str(); }
53 static const char* getTRKHalfStavePattern() { return sHalfStaveName.c_str(); }
54 static const char* getTRKModulePattern() { return sModuleName.c_str(); }
55 static const char* getTRKChipPattern() { return sChipName.c_str(); }
56 static const char* getTRKSensorPattern() { return sSensorName.c_str(); }
57 static const char* getTRKDeadzonePattern() { return sDeadzoneName.c_str(); }
58 static const char* getTRKMetalStackPattern() { return sMetalStackName.c_str(); }
59
60 static const char* getTRKWrapVolPattern() { return sWrapperVolumeName.c_str(); }
61
62 int getNumberOfChips() const { return mSize; }
63
66 int extractNumberOfLayersVD() const;
67 int extractNumberOfPetalsVD() const;
69 int extractNumberOfDisksVD() const;
71 int extractNumberOfStavesMLOT(int lay) const;
72 int extractNumberOfHalfStavesMLOT(int lay) const;
73 int extractNumberOfModulesMLOT(int lay) const;
74 int extractNumberOfChipsMLOT(int lay) const;
75
77 int extractVolumeCopy(const char* name, const char* prefix) const;
78
81 int getNumberOfHalfStaves(int lay) const { return mNumberOfHalfStaves[lay]; }
82
83 bool isOwner() const { return mOwner; }
84 void setOwner(bool v) { mOwner = v; }
85
86 void Print(Option_t* opt = "") const;
87 void PrintChipID(int index, int subDetID, int petalcase, int disk, int lay, int stave, int halfstave, int mod, int chip) const;
88
89 int getSubDetID(int index) const;
90 int getPetalCase(int index) const;
91 int getDisk(int index) const;
92 int getLayer(int index) const;
93 int getStave(int index) const;
94 int getHalfStave(int index) const;
95 int getModule(int index) const;
96 int getChip(int index) const;
97
98 void defineMLOTSensors();
99 int getBarrelLayer(int) const;
100
101 // sensor ref X and alpha for ML & OT
102 void extractSensorXAlphaMLOT(int, float&, float&);
103
104 // cache for tracking frames (ML & OT)
105 bool isTrackingFrameCachedMLOT() const { return !mCacheRefXMLOT.empty(); }
107
108 float getSensorRefAlphaMLOT(int chipId) const
109 {
110 if (getSubDetID(chipId) == 0) {
111 LOG(error) << "getSensorRefAlphaMLOT(): VD layers are not supported yet! chipID = " << chipId
112 << "please provide chipId for ML/OT! ";
113 return std::numeric_limits<float>::quiet_NaN();
114 }
115 const int local = chipId - getNumberOfActivePartsVD();
116 return mCacheRefAlphaMLOT[local];
117 }
118
119 float getSensorXMLOT(int chipId) const
120 {
121 if (getSubDetID(chipId) == 0) {
122 LOG(error) << "getSensorXMLOT(): VD layers are not supported yet! chipID = " << chipId
123 << "please provide chipId for ML/OT! ";
124 return std::numeric_limits<float>::quiet_NaN();
125 }
126 const int local = chipId - getNumberOfActivePartsVD();
127 return mCacheRefXMLOT[local];
128 }
129
130 // create matrix for tracking to local frame for MLOT
131 TGeoHMatrix& createT2LMatrixMLOT(int);
132
143 unsigned short getChipIndex(int subDetID, int petalcase, int disk, int lay, int stave, int halfstave, int mod, int chip) const;
144
153 unsigned short getChipIndex(int subDetID, int volume, int lay, int stave, int halfstave, int mod, int chip) const;
154
165 bool getChipID(int index, int& subDetID, int& petalcase, int& disk, int& lay, int& stave, int& halfstave, int& mod, int& chip) const;
166
167 unsigned short getLastChipIndex(int lay) const { return mLastChipIndex[lay]; }
168 unsigned short getFirstChipIndex(int lay, int petalcase, int subDetID) const
169 {
171 if (subDetID == 0) { // VD
172 return (petalcase == 0) ? 0 : mLastChipIndexVD[petalcase - 1] + 1;
173 } else if (subDetID == 1) { // MLOT
174 return mLastChipIndex[lay + mNumberOfPetalsVD - 1] + 1;
175 }
176 return -1; // not found
177 }
178
181 TGeoHMatrix* extractMatrixSensor(int index) const;
182
183 TString getMatrixPath(int index) const;
184
185#ifdef ENABLE_UPGRADES
186 static const char* composeSymNameTRK(int d)
187 {
188 return Form("%s_%d", o2::detectors::DetID(o2::detectors::DetID::TRK).getName(), d);
189 }
190#endif
191
192 static const char* composeSymNameLayer(int d, int layer);
193 static const char* composeSymNameStave(int d, int layer);
194 static const char* composeSymNameModule(int d, int layer);
195 static const char* composeSymNameChip(int d, int layer);
196 static const char* composeSymNameSensor(int d, int layer);
197
198 protected:
199 static constexpr int MAXLAYERS = 20;
200
201 static std::string sVolumeName;
202 static std::string sServiceVolName;
203 static std::string sLayerName;
204 static std::string sPetalAssemblyName;
205 static std::string sPetalName;
206 static std::string sPetalDiskName;
207 static std::string sPetalLayerName;
208 static std::string sStaveName;
209 static std::string sHalfStaveName;
210 static std::string sModuleName;
211 static std::string sChipName;
212 static std::string sSensorName;
213 static std::string sDeadzoneName;
214 static std::string sMetalStackName;
215
216 static std::string sWrapperVolumeName;
217
223 std::vector<int> mNumberOfStaves;
224 std::vector<int> mNumberOfHalfStaves;
225 std::vector<int> mNumberOfModules;
226 std::vector<int> mNumberOfChips;
227 std::vector<int> mNumberOfChipsPerLayerVD;
228 std::vector<int> mNumberOfChipsPerLayerMLOT;
229 std::vector<int> mNumbersOfChipPerDiskVD;
230 std::vector<int> mNumberOfChipsPerPetalVD;
231 // std::vector<int> mNumberOfChipsPerStave; ///< number of chips per stave in ML/OT
232 // std::vector<int> mNumberOfChipsPerHalfStave; ///< number of chips per half stave in ML/OT
233 // std::vector<int> mNumberOfChipsPerModule; ///< number of chips per module in ML/OT
234 std::vector<unsigned short> mLastChipIndex;
235 std::vector<unsigned short> mLastChipIndexVD;
236 std::vector<unsigned short> mLastChipIndexMLOT;
237
238 std::array<char, MAXLAYERS> mLayerToWrapper;
239
240 bool mOwner = true;
241
242 std::vector<int> sensorsMLOT;
243 std::vector<float> mCacheRefXMLOT;
244 std::vector<float> mCacheRefAlphaMLOT;
245
246 eMLOTLayout mLayoutMLOT; // ML and OT detector layout design
247
248 private:
249 static std::unique_ptr<o2::trk::GeometryTGeo> sInstance;
250};
251
252} // namespace trk
253} // namespace o2
254#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
static const char * getTRKServiceVolPattern()
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.
static std::string sServiceVolName
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 ...
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"