Project
Loading...
Searching...
No Matches
Controller.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
22#ifndef CONTROLLER_H
23#define CONTROLLER_H
24
29#include "Align/AlgTrcDbg.h"
33#include "TPCFastTransformPOD.h"
34
38
39#include <TMatrixDSym.h>
40#include <TVectorD.h>
41#include <TObjArray.h>
42#include <string>
43#include <TArrayF.h>
44#include <TArrayI.h>
45#include <TH1F.h>
46#include "Align/utils.h"
49
50// can be fwd declared if we don't require root dict.
51//class TTree;
52//class TFile;
53
54#include <TTree.h>
55#include <TFile.h>
56#include "Align/Mille.h"
57// #include "GPUO2ExternalUser.h"
58// #include "DataFormatsTPC/WorkflowHelper.h"
59
60namespace o2
61{
62namespace globaltracking
63{
64class RecoContainer;
65}
66namespace trd
67{
68class TrackletTransformer;
69}
70namespace utils
71{
72class TreeStreamRedirector;
73}
74
75namespace gpu
76{
77class GPUParam;
78}
79
80namespace align
81{
82
83//class Mille;
84
85class EventVertex;
86class AlignableVolume;
87class AlignmentPoint;
88class ResidualsControllerFast;
89
90class Controller final : public TObject
91{
92 public:
93 struct ProcStat {
94 enum {
98 };
99 enum {
105 };
106 std::array<std::array<size_t, kMaxStat>, kNStatCl> data{};
107 void print() const;
108 };
109
112
113 enum { kNLrSkip = 4 };
114 enum { kITS,
121 enum { kCosmLow,
124 enum { kInitGeomDone = BIT(14),
125 kInitDOFsDone = BIT(15),
126 kMPAlignDone = BIT(16) };
127
128 Controller() = default;
129 Controller(DetID::mask_t detmask, GTrackID::mask_t trcmask, bool cosmic = false, bool useMC = false, int instID = 0);
130 ~Controller() final;
131
132 void expandGlobalsBy(int n);
133 void process();
134 void processCosmic();
135
136 bool getUseRecoOCDB() const { return mUseRecoOCDB; }
137 void setUseRecoOCDB(bool v = true) { mUseRecoOCDB = v; }
138
139 void initDetectors();
140 void initDOFs();
141 void terminate();
142 //
143 void setInitGeomDone() { SetBit(kInitGeomDone); }
144 bool getInitGeomDone() const { return TestBit(kInitGeomDone); }
145 //
146 void setInitDOFsDone() { SetBit(kInitDOFsDone); }
147 bool getInitDOFsDone() const { return TestBit(kInitDOFsDone); }
148 //
149 void setMPAlignDone() { SetBit(kMPAlignDone); }
150 bool getMPAlignDone() const { return TestBit(kMPAlignDone); }
151
152 void assignDOFs();
153 //
155 //
156 int getNConstraints() const { return mConstraints.size(); }
157 const std::vector<GeometricalConstraint>& getConstraints() const { return mConstraints; }
158 std::vector<GeometricalConstraint>& getConstraints() { return mConstraints; }
159 const GeometricalConstraint& getConstraint(int i) const { return mConstraints[i]; }
160
161 void addAutoConstraints();
162 //
164 bool getFieldOn() const { return mFieldOn; }
165 void setFieldOn(bool v = true) { mFieldOn = v; }
166 int getTracksType() const { return mTracksType; }
168 bool isCosmic() const { return mTracksType == utils::Cosm; }
169 bool isCollision() const { return mTracksType == utils::Coll; }
170 void setCosmic(bool v = true) { mTracksType = v ? utils::Cosm : utils::Coll; }
171 auto getStat(int cls, int tp) const { return mStat.data[cls][tp]; }
172 auto& getStat() const { return mStat; }
173 //
174 bool checkDetectorPattern(DetID::mask_t patt) const;
175 bool checkDetectorPoints(const int* npsel) const;
176 void setObligatoryDetector(DetID id, int tp, bool v = true);
177 //
178 // void SetVertex(const AliESDVertex* v) { fVertex = v; } FIXME(milettri): needs AliESDVertex
179 // const AliESDVertex* GetVertex() const { return fVertex; } FIXME(milettri): needs AliESDVertex
180 //
181 //----------------------------------------
182 bool readParameters(const std::string& parfile = "millepede.res", bool useErrors = true);
183 auto& getGloParVal() { return mGloParVal; }
184 auto& getGloParErr() { return mGloParErr; }
185 auto& getGloParLab() { return mGloParLab; }
186 int getGloParLab(int i) const { return mGloParLab[i]; }
187 int parID2Label(int i) const { return getGloParLab(i); }
188 int label2ParID(int lab) const;
189 AlignableVolume* getVolOfDOFID(int id) const;
191 AlignableDetector* getDetOfDOFID(int id) const;
192 //
193 AlignmentPoint* getRefPoint() const { return mRefPoint.get(); }
194 //
195 const ResidualsController& getContResid() const { return mCResid; }
196 const Millepede2Record& getMPRecord() const { return mMPRecord; }
197 TTree* getMPRecTree() const { return mMPRecTree.get(); }
198 AlignmentTrack* getAlgTrack() const { return mAlgTrack.get(); }
199
202
204 int getNDetectors() const { return mNDet; }
205 AlignableDetector* getDetector(DetID id) const { return mDetectors[id].get(); }
206
207 EventVertex* getVertexSensor() const { return mVtxSens.get(); }
208 //
209 void resetForNextTrack();
210 int getNDOFs() const { return mGloParVal.size(); }
211 //----------------------------------------
212 float getControlFrac() const { return mControlFrac; }
213 void setControlFrac(float v = 1.) { mControlFrac = v; }
214 void writeCalibrationResults() const;
216 //
219 bool fillMilleData();
220
221 void closeMPRecOutput();
222 void closeMilleOutput();
223 void closeResidOutput();
224 void initMPRecOutput();
226 void initResidOutput();
229 void printStatistics() const;
230 //
231 void genPedeSteerFile(const Option_t* opt = "") const;
232 void writeLabeledPedeResults() const;
233 void writePedeConstraints() const;
234 void checkConstraints(const char* params = nullptr);
235 //
236 //----------------------------------------
237 //
238 int getRefRunNumber() const { return mRefRunNumber; }
239 void setRefRunNumber(int r = -1) { mRefRunNumber = r; }
240 //
241 int getRefOCDBLoaded() const { return mRefOCDBLoaded; }
242 //
243 void Print(const Option_t* opt = "") const final;
244 void printLabels() const;
245 Char_t* getDOFLabelTxt(int idf) const;
246 //
247 static Char_t* getDetNameByDetID(int id) { return (Char_t*)sDetectorName[id]; } //RSREM
248 static void MPRec2Mille(const std::string& mprecfile, const std::string& millefile = "mpData.mille", bool bindata = true);
249 static void MPRec2Mille(TTree* mprTree, const std::string& millefile = "mpData.mille", bool bindata = true);
250 //
251 bool testLocalSolution();
252 //
253 // fast check of solution using derivatives
254 void checkSol(TTree* mpRecTree, bool store = true, bool verbose = false, bool loc = true, const char* outName = "resFast");
255 bool checkSol(Millepede2Record* rec, ResidualsControllerFast* rLG = nullptr, ResidualsControllerFast* rL = nullptr, bool verbose = true, bool loc = true);
256 //
257 // RSTMP new code
258 void init();
259
262
265
269
273
278
279 int getInstanceID() const { return mInstanceID; }
280 void setInstanceID(int i) { mInstanceID = i; }
281
286
287 void setTPCParam(const o2::gpu::GPUParam* par) { mTPCParam = par; }
288 const o2::gpu::GPUParam* getTPCParam() const { return mTPCParam; }
289
290 protected:
291 //
292 // --------- dummies -----------
295 //
296 protected:
297 //
300 std::vector<int> mTrackSources;
302 int mInstanceID = 0; // instance in case of pipelining
303 int mRunNumber = 0;
304 int mNDet = 0; // number of deectors participating in the alignment
305 int mNDOFs = 0; // number of degrees of freedom
306 bool mUseMC = false;
307 bool mFieldOn = false; // field on flag
308 int mTracksType = utils::Coll; // collision/cosmic event type
311 std::unique_ptr<AlignmentTrack> mAlgTrack; // current alignment track
312 AlgTrcDbg mAlgTrackDbg; // current alignment track debug version
313 const o2::globaltracking::RecoContainer* mRecoData = nullptr; // externally set RecoContainer
314 const o2::trd::TrackletTransformer* mTRDTransformer = nullptr; // TRD tracket transformer
315 bool mTRDTrigRecFilterActive = false; // select TRD triggers processed with ITS
316 bool mAllowAfterburnerTracks = false; // allow using ITS-TPC afterburner tracks
317
318 const o2::gpu::GPUParam* mTPCParam = nullptr;
319
320 std::array<std::unique_ptr<AlignableDetector>, DetID::nDetectors> mDetectors{}; // detectors participating in the alignment
321
322 std::unique_ptr<EventVertex> mVtxSens; // fake sensor for the vertex
323 std::vector<GeometricalConstraint> mConstraints{}; // array of constraints
324 //
325 // Track selection
326 std::array<DetID::mask_t, utils::NTrackTypes> mObligatoryDetPattern{}; // pattern of obligatory detectors
327 //
328 std::vector<float> mGloParVal; // parameters for DOFs
329 std::vector<float> mGloParErr; // errors for DOFs
330 std::vector<int> mGloParLab; // labels for DOFs
331 std::unordered_map<int, int> mLbl2ID; // Labels mapping to parameter ID
332 //
333 std::unique_ptr<AlignmentPoint> mRefPoint;
334 //
337
338 // statistics
339 ProcStat mStat{}; // processing statistics
340 int mNTF = 0;
341 //
342 // output related
343 float mControlFrac = 1.0; // fraction of tracks to process control residuals
344 std::unique_ptr<Mille> mMille;
349
350 std::unique_ptr<TTree> mMPRecTree;
351 std::unique_ptr<TTree> mResidTree;
352 std::unique_ptr<TFile> mMPRecFile;
353 std::unique_ptr<TFile> mResidFile;
354 std::string mMilleFileName{};
355 //
356 // input related
357 int mRefRunNumber = 0; // optional run number used for reference
358 int mRefOCDBLoaded = 0; // flag/counter for ref.OCDB loading
359 bool mUseRecoOCDB = true; // flag to preload reco-time calib objects
360
363
364 //
365 static const int sSkipLayers[kNLrSkip]; // detector layers for which we don't need module matrices
366 static const Char_t* sDetectorName[kNDetectors]; // names of detectors //RSREM
367 static const Char_t* sMPDataExt; // extension for MP2 binary data
368 static const Char_t* sMPDataTxtExt; // extension for MP2 txt data
369 //
370 ClassDefOverride(Controller, 1)
371};
372
373} // namespace align
374} // namespace o2
375#endif
Base class for detector: wrapper for set of volumes.
Track model for the alignment.
Collection of auxillary methods.
Definition of the GeometryManager class.
int32_t i
Timeframe settings Average distance in cm of events merged into Randomize distance around average distance of merged events Simulate correct bunch interactions instead of placing only the average number of events A value[n] sets TFlen for[n] collisions in Number of bunches per trainsort Number of bunch trains Instantaneous interaction rate Do not simulate border Total number of collisions to be placed in the interior of all time Do not select random but walk over array of events in stride steps h Event generator settings h configStandalone Use CPU for GPU Force usage of the specified GPU device no CPU fallback Continue processing after an error First event to Number of events to Number of iterations to Number of iterations to Number of initial iterations excluded from const char Directory with events to Events directory is and not inside events d
configStandalone Reconstruction rec_tpc multiplier for the combined cluster track error during track following area in cm for the search of for z only used if decrease removal by when above this local occupancy rowx Shift of TPC revert cluster flag edge bit distance to edge exceeds this ZOffset for secondary multiple of radius max P of electron K BB bands crossing max P of electron p BB bands crossing max P of electron d BB bands crossing max P of electron t BB bands crossing min accepted dEdxMaxTPC of the track Additive extra cluster error for Y2 if edge flag set Additive extra cluster error for Y2 if single set Additive extra cluster error for Y2 if or single set Additive extra cluster error for Z2 if or single set Extra errors to add to track when crossing depending on addErrorsCECrossing Inner portion of y range in sector that is not used in searching for extrapolated track candidates factor2YS for track merging factor2K for track merging Margin in cm of Y position when rejecting edge clusters based on uncorrected track Y Max fraction of shared clusters for tracklet Except pad from cluster finding if total number of charges in a fragment is above this Except pad from cluster finding if number of consecutive charges in a fragment is above this Threshold where a timebin is considered disabling the noisy pad check for that pad Treat signal above this minimum as saturated Smoothing factor for the exponential Highly Ionising Particle tail filter Number of timebins to use for the averaging Add additional custom track errors when crossing relative as fraction of Do N fit passes in final fit of< 0:reject at max -n hits") AddOptionRTC(rejectIFCLowRadiusCluster, uint8_t, 1, "", 0, "Reject clusters that get the IFC mask error during refit") AddOptionRTC(dEdxTruncLow, uint8_t, 2, "", 0, "Low truncation threshold, fraction of 128") AddOptionRTC(dEdxTruncHigh, uint8_t, 77, "", 0, "High truncation threshold, fraction of 128") AddOptionRTC(extrapolationTracking, int8_t, 1, "", 0, "Enable Extrapolation Tracking(prolong tracks to adjacent sectors to find short segments)") AddOptionRTC(disableRefitAttachment, uint8_t, 0, "", 0, "Bitmask to disable certain attachment steps during refit(1:attachment, 2:propagation, 4:loop following, 8:mirroring)") AddOptionRTC(rejectionStrategy, uint8_t, o2::gpu::GPUSettings::RejectionStrategyA, "", 0, "Enable rejection of TPC clusters for compression(0=no, 1=strategy A, 2=strategy B)") AddOptionRTC(mergeLoopersAfterburner, uint8_t, 1, "", 0, "Run afterburner for additional looper merging") AddOptionRTC(compressionTypeMask, uint8_t, o2::gpu::GPUSettings::CompressionFull, "", 0, "TPC Compression mode bits(1=truncate charge/width LSB, 2=differences, 4=track-model)") AddOptionRTC(compressionSortOrder, uint8_t, o2::gpu::GPUSettings::SortTime, "", 0, "Sort order of TPC compression(0=time, 1=pad, 2=Z-time-pad, 3=Z-pad-time, 4=no sorting(use incoming order))") AddOptionRTC(sigBitsCharge, uint8_t, 4, "", 0, "Number of significant bits for TPC cluster charge in compression mode 1") AddOptionRTC(sigBitsWidth, uint8_t, 3, "", 0, "Number of significant bits for TPC cluster width in compression mode 1") AddOptionRTC(dropLoopers, uint8_t, 0, "", 0, "Drop looping tracks starting from second loop") AddOptionRTC(mergerInterpolateErrors, uint8_t, 1, "", 0, "Use interpolation instead of extrapolation for chi2 based cluster rejection") AddOptionRTC(mergerInterpolateRejectAlsoOnCurrentPosition, uint8_t, 1, "", 0, "When using mergerInterpolateErrors, reject based on chi2 twice computed with interpolated and current track position starting from NDF > mergerNonInterpolateRejectMinNDF Merge tracks accross the central electrode Enable PID response Add sub threshold clusters in TPC dEdx computation OR mask of TPC flags that will reject the cluster in alternative dEdx Reject edge clusters based on uncorrected track Y during track fit Increase decrease removal by when on this number of pads from the edge h trd
configStandalone rec
Descriptor of geometrical constraint.
Class to write C binary file.
Millepede record in root format (can be converted to proper pede binary format.
Container for control residuals.
POD correction map.
Result of top-bottom cosmic tracks leg matching.
calibration data from laser track calibration
void setDebugStream(o2::utils::TreeStreamRedirector *d)
Definition Controller.h:284
static const int sSkipLayers[kNLrSkip]
Definition Controller.h:365
const ResidualsController & getContResid() const
Definition Controller.h:195
const GeometricalConstraint & getConstraint(int i) const
Definition Controller.h:159
o2::tpc::VDriftCorrFact mTPCDrift
Definition Controller.h:361
const o2::globaltracking::RecoContainer * getRecoContainer() const
Definition Controller.h:200
void writeCalibrationResults() const
bool getUseRecoOCDB() const
Definition Controller.h:136
const o2::gpu::TPCFastTransformPOD * mTPCCorrMaps
Definition Controller.h:362
std::unique_ptr< TTree > mMPRecTree
control residuals
Definition Controller.h:350
bool readParameters(const std::string &parfile="millepede.res", bool useErrors=true)
ResidualsController mCResid
MP record.
Definition Controller.h:347
AlignableDetector * getDetector(DetID id) const
Definition Controller.h:205
bool fillControlData(o2::dataformats::GlobalTrackID tid)
void setObligatoryDetector(DetID id, int tp, bool v=true)
std::vector< GeometricalConstraint > mConstraints
Definition Controller.h:323
AlignableDetector * getDetOfDOFID(int id) const
void setControlFrac(float v=1.)
Definition Controller.h:213
void setTimingInfo(const o2::framework::TimingInfo &ti)
std::string mMilleFileName
file to store control residuals tree
Definition Controller.h:354
int getRefOCDBLoaded() const
Definition Controller.h:241
bool getTRDTrigRecFilterActive() const
Definition Controller.h:271
void setUseRecoOCDB(bool v=true)
Definition Controller.h:137
void setInstanceID(int i)
Definition Controller.h:280
int getDebugOutputLevel() const
Definition Controller.h:282
AlignmentTrack * getAlgTrack() const
Definition Controller.h:198
const o2::gpu::GPUParam * mTPCParam
Definition Controller.h:318
bool checkDetectorPattern(DetID::mask_t patt) const
Char_t * getDOFLabelTxt(int idf) const
const Millepede2Record & getMPRecord() const
Definition Controller.h:196
void expandGlobalsBy(int n)
std::unique_ptr< Mille > mMille
Definition Controller.h:344
int getTracksType() const
Definition Controller.h:166
void checkSol(TTree *mpRecTree, bool store=true, bool verbose=false, bool loc=true, const char *outName="resFast")
void addDetector(AlignableDetector *det)
bool storeProcessedTrack(o2::dataformats::GlobalTrackID tid={})
const std::vector< GeometricalConstraint > & getConstraints() const
Definition Controller.h:157
static const Char_t * sDetectorName[kNDetectors]
Definition Controller.h:366
bool getFieldOn() const
Definition Controller.h:164
std::array< DetID::mask_t, utils::NTrackTypes > mObligatoryDetPattern
Definition Controller.h:326
TTree * getMPRecTree() const
Definition Controller.h:197
float getControlFrac() const
Definition Controller.h:212
int getGloParLab(int i) const
Definition Controller.h:186
void checkConstraints(const char *params=nullptr)
AlignmentPoint * getRefPoint() const
Definition Controller.h:193
int parID2Label(int i) const
Definition Controller.h:187
int getInstanceID() const
Definition Controller.h:279
o2::utils::TreeStreamRedirector * mDBGOut
Definition Controller.h:336
void setRecoContainer(const o2::globaltracking::RecoContainer *cont)
Definition Controller.h:201
std::vector< float > mGloParErr
Definition Controller.h:329
void setDebugOutputLevel(int i)
Definition Controller.h:283
void setTrackSourceMask(GTrackID::mask_t m)
Definition Controller.h:263
bool getInitDOFsDone() const
Definition Controller.h:147
void writeLabeledPedeResults() const
void setFieldOn(bool v=true)
Definition Controller.h:165
o2::utils::TreeStreamRedirector * getDebugStream()
Definition Controller.h:285
const o2::gpu::GPUParam * getTPCParam() const
Definition Controller.h:288
std::unique_ptr< AlignmentPoint > mRefPoint
Definition Controller.h:333
std::vector< int > mTrackSources
Definition Controller.h:300
void setTRDTransformer(const o2::trd::TrackletTransformer *trans)
Definition Controller.h:266
bool isCollision() const
Definition Controller.h:169
int label2ParID(int lab) const
bool getMPAlignDone() const
Definition Controller.h:150
void genPedeSteerFile(const Option_t *opt="") const
void setAllowAfterburnerTracks(bool v)
Definition Controller.h:268
int getNDetectors() const
Definition Controller.h:204
Millepede2Record * mMPRecordPtr
MP record.
Definition Controller.h:346
bool getAllowAfterburnerTracks() const
Definition Controller.h:272
static Char_t * getDetNameByDetID(int id)
Definition Controller.h:247
bool getInitGeomDone() const
Definition Controller.h:144
GTrackID::mask_t mMPsrc
Definition Controller.h:299
GTrackID::mask_t getTrackSourceMask() const
Definition Controller.h:264
void writePedeConstraints() const
const o2::globaltracking::RecoContainer * mRecoData
Definition Controller.h:313
Controller(const Controller &)
std::unique_ptr< AlignmentTrack > mAlgTrack
Definition Controller.h:311
auto getStat(int cls, int tp) const
Definition Controller.h:171
static const Char_t * sMPDataTxtExt
Definition Controller.h:368
const o2::trd::TrackletTransformer * getTRDTransformer() const
Definition Controller.h:270
bool isCosmic() const
Definition Controller.h:168
bool fillMPRecData(o2::dataformats::GlobalTrackID tid)
std::vector< float > mGloParVal
Definition Controller.h:328
ResidualsController * mCResidPtr
control residuals
Definition Controller.h:348
void setTRDTrigRecFilterActive(bool v)
Definition Controller.h:267
static const Char_t * sMPDataExt
Definition Controller.h:367
const o2::trd::TrackletTransformer * mTRDTransformer
Definition Controller.h:314
int mDebugOutputLevel
reference point for track definition
Definition Controller.h:335
void Print(const Option_t *opt="") const final
Controller & operator=(const Controller &)
std::unique_ptr< EventVertex > mVtxSens
Definition Controller.h:322
void setDetectorsMask(DetID::mask_t m)
Definition Controller.h:260
void setCosmic(bool v=true)
Definition Controller.h:170
int getNConstraints() const
Definition Controller.h:156
void setTPCParam(const o2::gpu::GPUParam *par)
Definition Controller.h:287
DetID::mask_t getDetectorsMask() const
Definition Controller.h:261
std::unique_ptr< TFile > mMPRecFile
tree to store control residuals
Definition Controller.h:352
int getRefRunNumber() const
Definition Controller.h:238
AlignableVolume * getVolOfLabel(int label) const
std::unique_ptr< TFile > mResidFile
file to store MP record tree
Definition Controller.h:353
std::array< std::unique_ptr< AlignableDetector >, DetID::nDetectors > mDetectors
Definition Controller.h:320
void setRefRunNumber(int r=-1)
Definition Controller.h:239
const o2::tpc::VDriftCorrFact & getTPCVDrift() const
Definition Controller.h:277
DetID::mask_t mDetMask
Definition Controller.h:298
std::vector< GeometricalConstraint > & getConstraints()
Definition Controller.h:158
void setTracksType(int t=utils::Coll)
Definition Controller.h:167
void printStatistics() const
bool addVertexConstraint(const o2::dataformats::PrimaryVertex &vtx)
static void MPRec2Mille(const std::string &mprecfile, const std::string &millefile="mpData.mille", bool bindata=true)
auto & getStat() const
Definition Controller.h:172
std::unique_ptr< TTree > mResidTree
tree to store MP record
Definition Controller.h:351
void setTPCCorrMaps(const o2::gpu::TPCFastTransformPOD *maph)
std::unordered_map< int, int > mLbl2ID
Definition Controller.h:331
AlignableVolume * getVolOfDOFID(int id) const
Millepede2Record mMPRecord
Mille interface.
Definition Controller.h:345
const o2::gpu::TPCFastTransformPOD * getTPCCorrMaps()
Definition Controller.h:276
o2::framework::TimingInfo mTimingInfo
Definition Controller.h:301
void setTPCVDrift(const o2::tpc::VDriftCorrFact &v)
EventVertex * getVertexSensor() const
Definition Controller.h:207
bool checkDetectorPoints(const int *npsel) const
std::vector< int > mGloParLab
Definition Controller.h:330
Static class with identifiers, bitmasks and names for ALICE detectors.
Definition DetID.h:60
GLdouble n
Definition glcorearb.h:1982
const GLfloat * m
Definition glcorearb.h:4066
const GLdouble * v
Definition glcorearb.h:832
GLenum const GLfloat * params
Definition glcorearb.h:272
GLuint GLsizei const GLchar * label
Definition glcorearb.h:2519
GLboolean r
Definition glcorearb.h:1233
GLuint id
Definition glcorearb.h:650
void align(gsl::span< ElinkEncoder< BareFormat, CHARGESUM > > elinks)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Common utility functions.
std::array< std::array< size_t, kMaxStat >, kNStatCl > data
Definition Controller.h:106