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
16
17#ifndef ALICEO2_ITS_GEOMETRYTGEO_H_
18#define ALICEO2_ITS_GEOMETRYTGEO_H_
19
20#include <TGeoMatrix.h> // for TGeoHMatrix
21#include <TObject.h> // for TObject
22#include <array>
23#include <string>
24#include <vector>
28#include "Rtypes.h" // for Int_t, Double_t, Bool_t, UInt_t, etc
29
30#ifdef ENABLE_UPGRADES
31#include "ITS3Base/SpecsV2.h"
32#endif
33
34class TGeoPNEntry;
35
36namespace o2::its
37{
43
45{
46 public:
48 using DetMatrixCache::getMatrixL2G;
49 using DetMatrixCache::getMatrixT2GRot;
50 using DetMatrixCache::getMatrixT2L;
51 // this method is not advised for ITS: for barrel detectors whose tracking frame is just a rotation
52 // it is cheaper to use T2GRot
53 using DetMatrixCache::getMatrixT2G;
54
56 {
57 // get (create if needed) a unique instance of the object
58#ifdef GPUCA_STANDALONE
59 return nullptr; // TODO: DR: Obviously wrong, but to make it compile for now
60#else
61 if (!sInstance) {
62 sInstance = std::make_unique<GeometryTGeo>(true, 0);
63 }
64 return sInstance.get();
65#endif
66 }
67
68 static bool instanceExist()
69 {
70#ifdef GPUCA_STANDALONE
71 return false;
72#else
73 return sInstance.get() != nullptr;
74#endif
75 }
76
77 // Adopt the unique instance from external raw pointer (to be used only to read saved instance from file)
78 // When adopting an object owned by the CCDB cache we should not delete it
79 static void adopt(GeometryTGeo* raw, bool canDelete = false);
80 // constructor
81 // ATTENTION: this class is supposed to behave as a singleton, but to make it root-persistent
82 // we must define public default constructor.
83 // NEVER use it, it will throw exception if the class instance was already created
84 // Use GeometryTGeo::Instance() instead
85 GeometryTGeo(bool build = kFALSE, int loadTrans = 0);
86
88 ~GeometryTGeo() override;
89 void destroy()
90 {
91#ifndef GPUCA_STANDALONE
92 sInstance.reset(); // TODO: DR: See above
93#endif
94 }
95
96 GeometryTGeo(const GeometryTGeo& src) = delete;
97 GeometryTGeo& operator=(const GeometryTGeo& geom) = delete;
98
99 // implement filling of the matrix cache
101 void fillMatrixCache(int mask) override;
102
103 // cache parameters of sensors tracking frames
105
107 void Build(int loadTrans = 0) override;
108
111 {
112#ifdef ENABLE_UPGRADES
113 if (mIsLayerITS3[lay]) {
115 }
116#endif
118 }
119
120 int getNumberOfChipsPerModule(int lay) const { return mNumberOfChipsPerModule[lay]; }
122 int getNumberOfChipsPerStave(int lay) const { return mNumberOfChipsPerStave[lay]; }
124 int getNumberOfChipsPerLayer(int lay) const { return mNumberOfChipsPerLayer[lay]; }
125 int getNumberOfModules(int lay) const { return mNumberOfModules[lay]; }
126 int getNumberOfHalfStaves(int lay) const { return mNumberOfHalfStaves[lay]; }
127 int getNumberOfStaves(int lay) const { return mNumberOfStaves[lay]; }
129 int getNumberOfLayers() const { return mNumberOfLayers; }
130 int getChipIndex(int lay, int detInLay) const { return getFirstChipIndex(lay) + detInLay; }
136 int getChipIndex(int lay, int hba, int sta, int detInSta) const;
137
145 int getChipIndex(int lay, int hba, int sta, int subSta, int detInSubSta) const;
146
155 int getChipIndex(int lay, int hba, int sta, int subSta, int md, int detInMod) const;
156
165 bool getChipId(int index, int& lay, int& sta, int& ssta, int& mod, int& chip) const;
166
176 bool getChipId(int index, int& lay, int& hba, int& sta, int& ssta, int& mod, int& chip) const;
177
179 int getLayer(int index) const;
180
182 int getHalfBarrel(int index) const;
183
185 int getStave(int index) const;
186
188 int getHalfStave(int index) const;
189
191 int getModule(int index) const;
192
194 int getChipIdInLayer(int index) const;
195
197 int getChipIdInStave(int index) const;
198
200 int getChipIdInHalfStave(int index) const;
201
203 int getChipIdInModule(int index) const;
204
205 int getLastChipIndex(int lay) const { return mLastChipIndex[lay]; }
206 int getFirstChipIndex(int lay) const { return (lay == 0) ? 0 : mLastChipIndex[lay - 1] + 1; }
207 const char* getSymbolicName(int index) const
208 {
211 }
212
213 const char* getSymbolicName(int lay, int hba, int sta, int det) const
214 {
216 return getSymbolicName(getChipIndex(lay, hba, sta, det));
217 }
218
220 TGeoHMatrix* getMatrix(int index) const { return o2::base::GeometryManager::getMatrix(getDetID(), index); }
221 TGeoHMatrix* getMatrix(int lay, int hba, int sta, int sens) const { return getMatrix(getChipIndex(lay, hba, sta, sens)); }
222 bool getOriginalMatrix(int index, TGeoHMatrix& m) const
223 {
227 }
228
229 bool getOriginalMatrix(int lay, int hba, int sta, int det, TGeoHMatrix& m) const
230 {
233 return getOriginalMatrix(getChipIndex(lay, hba, sta, det), m);
234 }
235
236 const Mat3D& getMatrixT2L(int lay, int hba, int sta, int det) const { return getMatrixT2L(getChipIndex(lay, hba, sta, det)); }
237 const Mat3D& getMatrixSensor(int index) const { return getMatrixL2G(index); }
238 const Mat3D& getMatrixSensor(int lay, int hba, int sta, int det) const
239 {
240 // get positioning matrix of the sensor, alias to getMatrixL2G
241 return getMatrixSensor(getChipIndex(lay, hba, sta, det));
242 }
243
244 const Rot2D& getMatrixT2GRot(int lay, int hba, int sta, int sens)
245 {
247 return getMatrixT2GRot(getChipIndex(lay, hba, sta, sens));
248 }
249
250 bool isTrackingFrameCached() const { return !mCacheRefX.empty(); }
251 void getSensorXAlphaRefPlane(int index, float& x, float& alpha) const
252 {
255 }
256
257 float getSensorRefX(int isn) const { return mCacheRefX[isn]; }
258 float getSensorRefAlpha(int isn) const { return mCacheRefAlpha[isn]; }
259 // Attention: these are transformations wrt sensitive volume!
260 void localToGlobal(int index, const double* loc, double* glob);
261
262 void localToGlobal(int lay, int sta, int det, const double* loc, double* glob);
263
264 void globalToLocal(int index, const double* glob, double* loc);
265
266 void globalToLocal(int lay, int sta, int det, const double* glob, double* loc);
267
268 void localToGlobalVector(int index, const double* loc, double* glob);
269
270 void globalToLocalVector(int index, const double* glob, double* loc);
271
272 void Print(Option_t* opt = "") const;
273
274 static const char* getITSVolPattern() { return sVolumeName.c_str(); }
275 static const char* getITSLayerPattern() { return sLayerName.c_str(); }
276 static const char* getITSHalfBarrelPattern() { return sHalfBarrelName.c_str(); }
277 static const char* getITSWrapVolPattern() { return sWrapperVolumeName.c_str(); }
278 static const char* getITSStavePattern() { return sStaveName.c_str(); }
279 static const char* getITSHalfStavePattern() { return sHalfStaveName.c_str(); }
280 static const char* getITSModulePattern() { return sModuleName.c_str(); }
281 static const char* getITSChipPattern() { return sChipName.c_str(); }
282 static const char* getITSSensorPattern() { return sSensorName.c_str(); }
283 static void setITSVolPattern(const char* nm) { sVolumeName = nm; }
284 static void setITSLayerPattern(const char* nm) { sLayerName = nm; }
285 static void setITSHalfBarrelPattern(const char* nm) { sHalfBarrelName = nm; }
286 static void setITSWrapVolPattern(const char* nm) { sWrapperVolumeName = nm; }
287 static void setITSStavePattern(const char* nm) { sStaveName = nm; }
288 static void setITSHalfStavePattern(const char* nm) { sHalfStaveName = nm; }
289 static void setITSModulePattern(const char* nm) { sModuleName = nm; }
290 static void setITSChipPattern(const char* nm) { sChipName = nm; }
291 static void setITSSensorPattern(const char* nm) { sSensorName = nm; }
292
293 static const char* getITS3LayerPattern() { return sLayerNameITS3.c_str(); }
294 static const char* getITS3HalfBarrelPattern() { return sHalfBarrelNameITS3.c_str(); }
295 static const char* getITS3StavePattern() { return sStaveNameITS3.c_str(); }
296 static const char* getITS3HalfStavePattern() { return sHalfStaveNameITS3.c_str(); }
297 static const char* getITS3ModulePattern() { return sModuleNameITS3.c_str(); }
298 static const char* getITS3ChipPattern() { return sChipNameITS3.c_str(); }
299 static const char* getITS3SensorPattern() { return sSensorNameITS3.c_str(); }
300
301 static const char* getITS3LayerPatternRaw() { return sLayerNameITS3.c_str(); };
302 static const char* getITS3LayerPattern(int layer) { return Form("%s%d", getITS3LayerPatternRaw(), layer); };
303 static const char* getITS3CarbonFormPatternRaw() { return sHalfBarrelNameITS3.c_str(); };
304 static const char* getITS3CarbonFormPattern(int layer) { return Form("%s%d", getITS3CarbonFormPatternRaw(), layer); };
305 static const char* getITS3ChipPatternRaw() { return sStaveNameITS3.c_str(); };
306 static const char* getITS3ChipPattern(int layer) { return Form("%s%d", getITS3ChipPatternRaw(), layer); };
307 static const char* getITS3SegmentPatternRaw() { return sHalfStaveNameITS3.c_str(); };
308 static const char* getITS3SegmentPattern(int layer) { return Form("%s%d", getITS3SegmentPatternRaw(), layer); };
309 static const char* getITS3RSUPatternRaw() { return sModuleNameITS3.c_str(); };
310 static const char* getITS3RSUPattern(int layer) { return Form("%s%d", getITS3RSUPatternRaw(), layer); };
311 static const char* getITS3TilePatternRaw() { return sChipNameITS3.c_str(); };
312 static const char* getITS3TilePattern(int layer) { return Form("%s%d", getITS3TilePatternRaw(), layer); };
313 static const char* getITS3PixelArrayPatternRaw() { return sSensorNameITS3.c_str(); };
314 static const char* getITS3PixelArrayPattern(int layer) { return Form("%s%d", getITS3PixelArrayPatternRaw(), layer); };
315
317 static const char* composeSymNameITS(bool isITS3 = false);
319 static const char* composeSymNameLayer(int lr, bool isITS3 = false);
320
322 static const char* composeSymNameHalfBarrel(int lr, int hba, bool isITS3 = false);
323
325 static const char* composeSymNameStave(int lr, int hba, int sta, bool isITS3 = false);
326
328 static const char* composeSymNameHalfStave(int lr, int hba, int sta, int ssta, bool isITS3 = false);
329
331 static const char* composeSymNameModule(int lr, int hba, int sta, int ssta, int mod, bool isITS3 = false);
332
334 static const char* composeSymNameChip(int lr, int hba, int sta, int ssta, int mod, int chip, bool isITS3 = false);
335
336 // create matrix for transformation from tracking frame to local one for ITS3
337 const Mat3D getT2LMatrixITS3(int isn, float alpha);
338
339 TString getMatrixPath(int index) const;
340
343 TGeoHMatrix* extractMatrixSensor(int index) const;
344
345 // create matrix for transformation from sensor local frame to global one
346 TGeoHMatrix& createT2LMatrix(int isn);
347
348 // get sensor tracking frame alpha and x
349 void extractSensorXAlpha(int isn, float& x, float& alp);
350
351 protected:
356 bool getLayer(int index, int& lay, int& index2) const;
357
361 int extractNumberOfChipsPerModule(int lay, int& nrow) const;
362
365 int extractNumberOfHalfBarrels() const;
366
369 int extractNumberOfStaves(int lay) const;
370
373 int extractNumberOfHalfStaves(int lay) const;
374
379 int extractNumberOfModules(int lay) const;
380
384 int extractLayerChipType(int lay) const;
385
388
390 int extractVolumeCopy(const char* name, const char* prefix) const;
391
392 TGeoPNEntry* getPNEntry(int index) const
393 {
397 }
398
399 protected:
400 static constexpr int MAXLAYERS = 15;
401
404 std::vector<int> mNumberOfStaves;
405 std::vector<int> mNumberOfHalfStaves;
406 std::vector<int> mNumberOfModules;
407 std::vector<int> mNumberOfChipsPerModule;
408 std::vector<int> mNumberOfChipRowsPerModule;
409 std::vector<int> mNumberOfChipsPerHalfStave;
410 std::vector<int> mNumberOfChipsPerStave;
412 std::vector<int> mNumberOfChipsPerLayer;
413 std::vector<int> mLastChipIndex;
414 std::array<bool, MAXLAYERS> mIsLayerITS3;
415 std::array<char, MAXLAYERS> mLayerToWrapper;
416
417 std::vector<float> mCacheRefX;
418 std::vector<float> mCacheRefAlpha;
419
420 static std::string sVolumeName;
421 static std::string sLayerName;
422 static std::string sHalfBarrelName;
423 static std::string sStaveName;
424 static std::string sHalfStaveName;
425 static std::string sModuleName;
426 static std::string sChipName;
427 static std::string sSensorName;
428 static std::string sWrapperVolumeName;
429
430 static const std::string sLayerNameITS3;
431 static const std::string sHalfBarrelNameITS3;
432 static const std::string sStaveNameITS3;
433 static const std::string sHalfStaveNameITS3;
434 static const std::string sModuleNameITS3;
435 static const std::string sChipNameITS3;
436 static const std::string sSensorNameITS3;
437
438 private:
439#ifndef GPUCA_STANDALONE
440 static std::unique_ptr<o2::its::GeometryTGeo> sInstance;
441#endif
442
443 ClassDefOverride(GeometryTGeo, 2); // ITS geometry based on TGeo
444};
445} // namespace o2::its
446
447#endif
Definition of the GeometryManager class.
Definition of the GeometryTGeo class : common part for ITS and MFT.
static const char * getSymbolicName(o2::detectors::DetID detid, int sensid)
static Bool_t getOriginalMatrix(o2::detectors::DetID detid, int sensid, TGeoHMatrix &m)
static TGeoHMatrix * getMatrix(const char *symname)
static TGeoPNEntry * getPNEntry(o2::detectors::DetID detid, Int_t sensid)
virtual void fillMatrixCache(int mask)=0
const o2::detectors::DetID & getDetID() const
const Mat3D & getMatrixL2G(int sensID) const
int extractNumberOfLayers()
Determines the number of layers in the Geometry.
TGeoHMatrix & createT2LMatrix(int isn)
static const char * getITS3ModulePattern()
std::vector< int > mNumberOfChipsPerHalfStave
number of chips per substave
o2::math_utils::Transform3D Mat3D
static const char * getITSLayerPattern()
void getSensorXAlphaRefPlane(int index, float &x, float &alpha) const
const char * getSymbolicName(int index) const
static const std::string sLayerNameITS3
Layer name for ITS3.
static constexpr int MAXLAYERS
max number of active layers
void localToGlobal(int index, const double *loc, double *glob)
static const char * composeSymNameLayer(int lr, bool isITS3=false)
sym name of the layer
static const std::string sStaveNameITS3
Stave name for ITS3.
int getNumberOfModules(int lay) const
void localToGlobal(int lay, int sta, int det, const double *loc, double *glob)
GeometryTGeo & operator=(const GeometryTGeo &geom)=delete
int getChipIdInHalfStave(int index) const
Get chip number within stave, from 0.
void globalToLocalVector(int index, const double *glob, double *loc)
static const std::string sSensorNameITS3
Sensor name for ITS3.
static const char * composeSymNameITS(bool isITS3=false)
sym name of the layer
std::vector< int > mNumberOfHalfStaves
the number of substaves/stave(layer)
static std::string sHalfBarrelName
HalfBarrel name.
static std::string sHalfStaveName
HalfStave name.
const Rot2D & getMatrixT2GRot(int lay, int hba, int sta, int sens)
static const char * getITS3SegmentPattern(int layer)
TGeoHMatrix * getMatrix(int lay, int hba, int sta, int sens) const
int getNumberOfHalfStaves(int lay) const
static const char * getITS3SensorPattern()
static const char * getITS3LayerPattern(int layer)
static const char * getITS3ChipPattern()
static const char * getITS3TilePattern(int layer)
static const char * getITSSensorPattern()
const Mat3D & getMatrixT2L(int lay, int hba, int sta, int det) const
bool getChipId(int index, int &lay, int &sta, int &ssta, int &mod, int &chip) const
int extractNumberOfChipsPerModule(int lay, int &nrow) const
int getNumberOfChipsPerModule(int lay) const
TGeoHMatrix * getMatrix(int index) const
Get the transformation matrix for a given chip (NOT A SENSOR!!!) 'index' by quering the TGeoManager.
static std::string sLayerName
Layer name.
static const char * getITS3CarbonFormPatternRaw()
int getHalfBarrel(int index) const
Get chip half barrel, from 0.
static const char * getITS3ChipPatternRaw()
std::vector< int > mNumberOfStaves
number of staves/layer(layer)
static void setITSSensorPattern(const char *nm)
static const char * getITSHalfBarrelPattern()
std::vector< int > mNumberOfModules
number of modules/substave(layer)
TGeoHMatrix * extractMatrixSensor(int index) const
bool getOriginalMatrix(int lay, int hba, int sta, int det, TGeoHMatrix &m) const
static bool instanceExist()
static const char * getITS3RSUPattern(int layer)
int getLayer(int index) const
Get chip layer, from 0.
static const char * composeSymNameHalfBarrel(int lr, int hba, bool isITS3=false)
Sym name of the half barrel at given layer.
std::array< char, MAXLAYERS > mLayerToWrapper
Layer to wrapper correspondence.
int getNumberOfStaves(int lay) const
std::array< bool, MAXLAYERS > mIsLayerITS3
flag with the information of the ITS version (ITS2 or ITS3)
static const char * getITS3HalfStavePattern()
static const char * getITS3PixelArrayPatternRaw()
static void setITSLayerPattern(const char *nm)
float getSensorRefAlpha(int isn) const
static const char * getITS3TilePatternRaw()
static const std::string sModuleNameITS3
Module name for ITS3.
int getChipIdInStave(int index) const
Get chip number within stave, from 0.
static std::string sModuleName
Module name.
static const std::string sHalfStaveNameITS3
HalfStave name for ITS3.
TString getMatrixPath(int index) const
int extractNumberOfModules(int lay) const
int getNumberOfChipsPerLayer(int lay) const
static const char * composeSymNameHalfStave(int lr, int hba, int sta, int ssta, bool isITS3=false)
Sym name of the stave at given layer/halfbarrel.
static GeometryTGeo * Instance()
void globalToLocal(int index, const double *glob, double *loc)
~GeometryTGeo() override
Default destructor, don't use.
int getNumberOfChipsPerStave(int lay) const
static void setITSVolPattern(const char *nm)
static const char * getITS3CarbonFormPattern(int layer)
static void setITSStavePattern(const char *nm)
int extractVolumeCopy(const char *name, const char *prefix) const
Extract number following the prefix in the name string.
const Mat3D getT2LMatrixITS3(int isn, float alpha)
static const char * composeSymNameChip(int lr, int hba, int sta, int ssta, int mod, int chip, bool isITS3=false)
Sym name of the chip in the given layer/halfbarrel/stave/substave/module.
static const char * getITS3PixelArrayPattern(int layer)
static const char * getITSChipPattern()
static const char * composeSymNameModule(int lr, int hba, int sta, int ssta, int mod, bool isITS3=false)
Sym name of the substave at given layer/halfbarrel/stave.
int extractLayerChipType(int lay) const
GeometryTGeo(const GeometryTGeo &src)=delete
std::vector< float > mCacheRefX
sensors tracking plane reference X
std::vector< int > mNumberOfChipsPerModule
number of chips per module (group of chips on substaves)
static std::string sWrapperVolumeName
Wrapper volume name.
int getNumberOfChipColsPerModule(int lay) const
static const char * getITSVolPattern()
TGeoPNEntry * getPNEntry(int index) const
int getNumberOfChipRowsPerModule(int lay) const
static const char * getITS3HalfBarrelPattern()
std::vector< int > mNumberOfChipsPerStave
number of chips per stave
bool isTrackingFrameCached() const
static const std::string sHalfBarrelNameITS3
HalfBarrel name for ITS3.
void Build(int loadTrans=0) override
Exract ITS parameters from TGeo.
int getNumberOfHalfBarrels() const
static const char * getITS3SegmentPatternRaw()
void extractSensorXAlpha(int isn, float &x, float &alp)
std::vector< int > mNumberOfChipsPerLayer
number of chips per stave
int extractNumberOfStaves(int lay) const
int getHalfStave(int index) const
Get chip substave id in stave, from 0.
const Mat3D & getMatrixSensor(int lay, int hba, int sta, int det) const
int getFirstChipIndex(int lay) const
static const char * getITSModulePattern()
static void setITSHalfBarrelPattern(const char *nm)
int getChipIdInLayer(int index) const
Get chip number within layer, from 0.
static const std::string sChipNameITS3
Chip name for ITS3.
static std::string sStaveName
Stave name.
int extractNumberOfHalfStaves(int lay) const
static void setITSChipPattern(const char *nm)
Int_t mNumberOfHalfBarrels
number of halfbarrels
static const char * getITS3RSUPatternRaw()
void fillMatrixCache(int mask) override
void Print(Option_t *opt="") const
float getSensorRefX(int isn) const
static void adopt(GeometryTGeo *raw, bool canDelete=false)
int getChipIndex(int lay, int detInLay) const
std::vector< float > mCacheRefAlpha
sensors tracking plane reference alpha
static const char * getITS3ChipPattern(int layer)
const char * getSymbolicName(int lay, int hba, int sta, int det) const
Int_t mNumberOfLayers
number of layers
static void setITSModulePattern(const char *nm)
static const char * composeSymNameStave(int lr, int hba, int sta, bool isITS3=false)
Sym name of the stave at given layer.
void localToGlobalVector(int index, const double *loc, double *glob)
int getNumberOfLayers() const
int getStave(int index) const
Get chip stave, from 0.
static const char * getITS3LayerPattern()
int getModule(int index) const
Get chip module id in substave, from 0.
static const char * getITS3StavePattern()
static std::string sSensorName
Sensor name.
static std::string sChipName
Chip name.
std::vector< int > mNumberOfChipRowsPerModule
number of chips rows per module (relevant for OB modules)
int getNumberOfChipsPerHalfStave(int lay) const
void globalToLocal(int lay, int sta, int det, const double *glob, double *loc)
bool getOriginalMatrix(int index, TGeoHMatrix &m) const
int getChipIdInModule(int index) const
Get chip number within module, from 0.
std::vector< int > mLastChipIndex
max ID of the detctor in the layer
static void setITSWrapVolPattern(const char *nm)
const Mat3D & getMatrixSensor(int index) const
static const char * getITSHalfStavePattern()
int extractNumberOfHalfBarrels() const
std::vector< int > mNumberOfChipsPerHalfBarrel
number of chips per halfbarrel
static std::string sVolumeName
Mother volume name.
static const char * getITS3LayerPatternRaw()
static const char * getITSStavePattern()
int getNumberOfChipsPerHalfBarrel(int lay) const
static void setITSHalfStavePattern(const char *nm)
int getLastChipIndex(int lay) const
static const char * getITSWrapVolPattern()
transformation types
Definition Cartesian.h:62
GLfloat GLfloat GLfloat alpha
Definition glcorearb.h:279
GLint GLenum GLint x
Definition glcorearb.h:403
const GLfloat * m
Definition glcorearb.h:4066
GLenum src
Definition glcorearb.h:1767
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