Project
Loading...
Searching...
No Matches
AlignableDetector.cxx
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#include "Align/Controller.h"
20#include "Align/Controller.h"
25#include "Framework/Logger.h"
26#include <TString.h>
27#include <TH1.h>
28#include <TTree.h>
29#include <TFile.h>
30#include <cstdio>
31#include <regex>
32
34
35using namespace o2::align::utils;
37
38namespace o2
39{
40namespace align
41{
42//____________________________________________
44{
45 mVolumes.SetOwner(true);
46 mSensors.SetOwner(false); // sensors are just pointers on particular volumes
47}
48
49//____________________________________________
51{
52 // d-tor
53 mSensors.Clear(); // sensors are also attached as volumes, don't delete them here
54 mVolumes.Delete(); // here all is deleted
55}
56
57//____________________________________________
58int AlignableDetector::processPoints(GIndex gid, int npntCut, bool inv)
59{
60 // Create alignment points corresponding to this detector, recalibrate/realign them to the
61 // level of the "starting point" for the alignment/calibration session.
62 // If inv==true, the track propagates in direction of decreasing tracking X
63 // (i.e. upper leg of cosmic track)
64 /*
65 auto algTrack = mController->getAlgTrack();
66 for (clus: clusters_of_track_gid) {
67 auto& pnt = mPoints.emplace_back();
68 // realign as needed the cluster data
69 auto* sensor = getSensor(clus.getSensorID());
70 pnt.setXYZTracking(clus.getX(), clus.getY(), clus.getZ());
71 pnt.setAlphaSens(sensor->getAlpTracking());
72 pnt.setXSens(sensor->getXTracking());
73 pnt.setDetID(mDetID);
74 pnt.setSID(sensor->getSID());
75 //
76 pnt.setContainsMeasurement();
77 pnt.init();
78 algTrack->AddPoint(&pnt);
79 }
80 */
81 LOGP(error, "Detector {} must implement its own ProcessPoints method", getName());
82 return 0;
83}
84
85//_________________________________________________________
87{
88 // update parameters needed to process this run
89
90 // detector should be able to undo alignment/calibration used during the reco
92}
93
94//_________________________________________________________
96{
97 LOG(fatal) << __PRETTY_FUNCTION__ << " is disabled";
98 //FIXME(milettri): needs OCDB
99 // // Update L2G matrices used for data reconstruction
100 // //
101 // AliCDBManager* man = AliCDBManager::Instance();
102 // AliCDBEntry* ent = man->Get(Form("%s/Align/Data", mDetID.getName()));
103 // const TClonesArray* algArr = (const TClonesArray*)ent->GetObject();
104 // //
105 // int nvol = getNVolumes();
106 // for (int iv = 0; iv < nvol; iv++) {
107 // AlignableVolume* vol = getVolume(iv);
108 // // call init for root level volumes, they will take care of their children
109 // if (!vol->getParent()){
110 // vol->updateL2GRecoMatrices(algArr, 0);}
111 // }
112 // //
113}
114
115//_________________________________________________________
117{
118 // prepare for the next track processing
119 mNPoints = 0;
120}
121
122//_________________________________________________________
124{
125 // apply alignment from millepede solution array to reference alignment level
126 LOG(info) << "Applying alignment from Millepede solution";
127 for (int isn = getNSensors(); isn--;) {
129 }
130}
131
132//_________________________________________________________
134{
135 LOGP(info, "caching reference CCDB for {}", getName());
136 const auto& ggHelper = o2::base::GRPGeomHelper::instance();
137 const auto* algVec = ggHelper.getAlignment(mDetID);
138 for (const auto& alg : *algVec) {
139 AlignableVolume* vol = getVolume(alg.getSymName().c_str());
140 if (!vol) {
141 LOGP(fatal, "Volume {} not found", alg.getSymName());
142 }
143 auto mat = alg.createMatrix();
144 vol->setGlobalDeltaRef(mat);
145 }
146}
147
148//_________________________________________________________
150{
151 // add volume
152 if (getVolume(vol->getSymName())) {
153 LOG(fatal) << "Volume " << vol->GetName() << " was already added to " << mDetID.getName();
154 }
155 mVolumes.AddLast(vol);
156 if (vol->isSensor()) {
157 mSensors.AddLast(vol);
158 ((AlignableSensor*)vol)->setDetector(this);
159 int vid = ((AlignableSensor*)vol)->getVolID();
160 if (mVolIDMin < 0 || vid < mVolIDMin) {
161 mVolIDMin = vid;
162 }
163 if (mVolIDMax < 0 || vid > mVolIDMax) {
164 mVolIDMax = vid;
165 }
166 }
167 //
168}
169
170//_________________________________________________________
172{
173 // define transformation matrices. Detectors may override this method
174 //
175 TGeoHMatrix mtmp;
176 //
177 TIter next(&mVolumes);
178 AlignableVolume* vol(nullptr);
179 while ((vol = (AlignableVolume*)next())) {
180 if (vol->isDummy() || vol->isDummyEnvelope()) {
181 continue;
182 }
183 vol->prepareMatrixL2G(); // modified global-local matrix
184 vol->prepareMatrixL2GIdeal(); // ideal global-local matrix
185 }
186 // Now set tracking-local matrix (MUST be done after ALL L2G matrices are done!)
187 // Attention: for sensor it is a real tracking matrix extracted from
188 // the geometry but for container alignable volumes the tracking frame
189 // is used for as the reference for the alignment parameters only,
190 // see its definition in the AlignableVolume::PrepateMatrixT2L
191 next.Reset();
192 while ((vol = (AlignableVolume*)next())) {
193 if (vol->isDummy()) {
194 continue;
195 }
196 vol->prepareMatrixT2L();
197 if (vol->isSensor()) {
198 ((AlignableSensor*)vol)->prepareMatrixClAlg();
199 } // alignment matrix
200 }
201 //
202}
203
204//_________________________________________________________
206{
207 // build local tables for internal numbering
208 mNSensors = mSensors.GetEntriesFast();
209 if (!mNSensors) {
210 LOG(warning) << "No sensors defined";
211 return;
212 }
213 mSensors.Sort();
214 mSID2VolID = new int[mNSensors]; // cash id's for fast binary search RS FIXME DO WE NEED THIS?
215 for (int i = 0; i < mNSensors; i++) {
217 getSensor(i)->setSID(i);
218 }
219 //
220}
221
222//_________________________________________________________
224{
225 // define hiearchy, initialize matrices, return number of global parameters
226 if (getInitGeomDone()) {
227 return 0;
228 }
229 //
231 sortSensors(); // VolID's must be in increasing order
233 //
234 // calculate number of global parameters
235 int nvol = getNVolumes();
236 mNDOFs = 0;
237 for (int iv = 0; iv < nvol; iv++) {
238 AlignableVolume* vol = getVolume(iv);
239 mNDOFs += vol->getNDOFs();
240 }
241 //
244 return mNDOFs;
245}
246
247//_________________________________________________________
249{
250 // assign DOFs IDs, parameters
251 //
253 if (mFirstParGloID == (int)mController->getGloParVal().size() && mNCalibDOFs) { // new detector is being added
255 }
256 for (int icl = 0; icl < mNCalibDOFs; icl++) {
257 setParLab(icl, icl); // TODO RS FIXME
258 }
259 //
260 int nvol = getNVolumes();
261 for (int iv = 0; iv < nvol; iv++) {
262 AlignableVolume* vol = getVolume(iv);
263 if (!vol->getParent()) { // call init for root level volumes, they will take care of their children
264 vol->assignDOFs();
265 }
266 }
267 return mNDOFs;
268}
269
270//_________________________________________________________
272{
273 // initialize free parameters
274 if (getInitDOFsDone()) {
275 LOG(fatal) << "DOFs are already initialized for " << mDetID.getName();
276 }
277 //
278 auto pars = getParVals();
279 auto errs = getParErrs();
280 // process calibration DOFs
281 for (int i = 0; i < mNCalibDOFs; i++) {
282 if (errs[i] < -9999 && isZeroAbs(pars[i])) {
283 fixDOF(i);
284 }
285 }
286 //
287 int nvol = getNVolumes();
288 for (int iv = 0; iv < nvol; iv++) {
289 getVolume(iv)->initDOFs();
290 }
291 //
292 calcFree(true);
293 //
295 return;
296}
297
298//_________________________________________________________
300{
301 // find SID corresponding to VolID
302 int mn(0), mx(mNSensors - 1);
303 while (mx >= mn) {
304 int md((mx + mn) >> 1), vids(getSensor(md)->getVolID());
305 if (vid < vids) {
306 mx = md - 1;
307 } else if (vid > vids) {
308 mn = md + 1;
309 } else {
310 return md;
311 }
312 }
313 return -1;
314}
315
316//____________________________________________
317void AlignableDetector::Print(const Option_t* opt) const
318{
319 // print info
320 TString opts = opt;
321 opts.ToLower();
322 printf("\nDetector:%5s %5d volumes %5d sensors {VolID: %5d-%5d} Def.Sys.Err: %.4e %.4e | Stat:%d\n",
325 //
326 printf("Errors assignment: ");
327 if (mUseErrorParam) {
328 printf("param %d\n", mUseErrorParam);
329 } else {
330 printf("from TrackPoints\n");
331 }
332 //
333 printf("Allowed in Collisions: %7s | Cosmic: %7s\n",
334 isDisabled(Coll) ? " NO " : " YES ", isDisabled(Cosm) ? " NO " : " YES ");
335 //
336 printf("Obligatory in Collisions: %7s | Cosmic: %7s\n",
337 isObligatory(Coll) ? " YES " : " NO ", isObligatory(Cosm) ? " YES " : " NO ");
338 //
339 printf("Min.points in Collisions: %7d | Cosmic: %7d\n", mNPointsSel[Coll], mNPointsSel[Cosm]);
340 //
341 if (!(IsDisabledColl() && IsDisabledCosm()) && opts.Contains("long")) {
342 for (int iv = 0; iv < getNVolumes(); iv++) {
343 getVolume(iv)->Print(opt);
344 }
345 }
346 //
347 for (int i = 0; i < getNCalibDOFs(); i++) {
348 printf("CalibDOF%2d: %-20s\t%e\n", i, getCalibDOFName(i), getCalibDOFValWithCal(i));
349 }
350}
351
352//____________________________________________
353void AlignableDetector::setAddError(double sigy, double sigz)
354{
355 // add syst error to all sensors
356 LOG(info) << "Adding sys.error " << std::fixed << std::setprecision(4) << sigy << " " << sigz << " to all sensors";
357 mAddError[0] = sigy;
358 mAddError[1] = sigz;
359 for (int isn = getNSensors(); isn--;) {
360 getSensor(isn)->setAddError(sigy, sigz);
361 }
362 //
363}
364
365//____________________________________________
367{
368 // set type of points error parameterization
369 LOG(fatal) << "setUseErrorParam is not implemented for this detector";
370 //
371}
372
373//____________________________________________
375{
376 // update point using specific error parameterization
377 LOG(fatal) << "If needed, this method has to be implemented for specific detector";
378}
379
380//____________________________________________
382{
383 // define alignment volumes
384 LOG(fatal) << "defineVolumes method has to be implemented for specific detector";
385}
386
387//____________________________________________
389{
390 // mark detector presence obligatory in the track
391 mObligatory[tp] = v;
393}
394
395//______________________________________________________
396void AlignableDetector::writePedeInfo(FILE* parOut, const Option_t* opt) const
397{
398 // contribute to params and constraints template files for PEDE
399 fprintf(parOut, "\n!!\t\tDetector:\t%s\tNDOFs: %d\n", mDetID.getName(), getNDOFs());
400 //
401 // parameters
402 int nvol = getNVolumes();
403 for (int iv = 0; iv < nvol; iv++) { // call for root level volumes, they will take care of their children
404 AlignableVolume* vol = getVolume(iv);
405 if (!vol->getParent()) {
406 vol->writePedeInfo(parOut, opt);
407 }
408 }
409 //
410}
411
412//______________________________________________________
414{
415 // contribute to params and constraints template files for PEDE
416 fprintf(parOut, "\n!!\t\tDetector:\t%s\tNDOFs: %d\n", mDetID.getName(), getNDOFs());
417 //
418 // parameters
419 int nvol = getNVolumes();
420 for (int iv = 0; iv < nvol; iv++) { // call for root level volumes, they will take care of their children
421 AlignableVolume* vol = getVolume(iv);
422 if (!vol->getParent()) {
423 vol->writeLabeledPedeResults(parOut);
424 }
425 }
426 //
427}
428
429//______________________________________________________
431{
432 // store calibration results
434 //
435 // eventually we may write other calibrations
436}
437
438//______________________________________________________
440{
441 std::vector<o2::detectors::AlignParam> arr;
442 int nvol = getNVolumes();
443 for (int iv = 0; iv < nvol; iv++) {
444 AlignableVolume* vol = getVolume(iv);
445 // call only for top level objects, they will take care of children
446 if (!vol->getParent()) {
447 vol->createAlignmentObjects(arr);
448 }
449 }
450 TFile outalg(fmt::format("alignment{}.root", getName()).c_str(), "recreate");
451 outalg.WriteObjectAny(&arr, "std::vector<o2::detectors::AlignParam>", o2::base::NameConf::CCDBOBJECT.data());
452 outalg.Close();
453 LOGP(info, "storing {} alignment in {}", getName(), outalg.GetName());
454}
455
456//______________________________________________________
458{
459 // check if DOF ID belongs to this detector
460 for (int iv = getNVolumes(); iv--;) {
461 AlignableVolume* vol = getVolume(iv); // check only top level volumes
462 if (!vol->getParent() && vol->ownsDOFID(id)) {
463 return true;
464 }
465 }
466 // calibration DOF?
467 if (id >= mFirstParGloID && id < mFirstParGloID + mNCalibDOFs) {
468 return true;
469 }
470 //
471 return false;
472}
473
474//______________________________________________________
476{
477 // gets volume owning this DOF ID
478 for (int iv = getNVolumes(); iv--;) {
479 AlignableVolume* vol = getVolume(iv);
480 if (vol->getParent()) {
481 continue;
482 } // check only top level volumes
483 if ((vol = vol->getVolOfDOFID(id))) {
484 return vol;
485 }
486 }
487 return nullptr;
488}
489
490//______________________________________________________
492{
493 // called at the end of processing
494 // if (isDisabled()) return;
495 int nvol = getNVolumes();
496 mNProcPoints = 0;
497 for (int iv = 0; iv < nvol; iv++) {
498 AlignableVolume* vol = getVolume(iv);
499 // call init for root level volumes, they will take care of their children
500 if (!vol->getParent()) {
501 mNProcPoints += vol->finalizeStat();
502 }
503 }
504}
505
506//________________________________________
508{
509 // adds automatic constraints
510 int nvol = getNVolumes();
511 for (int iv = 0; iv < nvol; iv++) { // call for root level volumes, they will take care of their children
512 AlignableVolume* vol = getVolume(iv);
513 if (!vol->getParent()) {
514 vol->addAutoConstraints();
515 }
516 }
517}
518
519//________________________________________
521{
522 // fix all non-sensor volumes
523 for (int i = getNVolumes(); i--;) {
525 if (vol->isSensor()) {
526 continue;
527 }
528 vol->setFreeDOFPattern(0);
530 }
531}
532
533//________________________________________
534int AlignableDetector::selectVolumes(std::vector<AlignableVolume*> cont, int lev, const std::string& regexStr)
535{
536 // select volumes matching to pattern and/or hierarchy level
537 //
538 std::regex selRegEx(regexStr);
539 int nadd = 0;
540 for (int i = getNVolumes(); i--;) {
542 if (lev >= 0 && vol->countParents() != lev) {
543 continue;
544 } // wrong level
545 if (!regexStr.empty() && !std::regex_match(vol->getSymName(), selRegEx)) {
546 continue;
547 }
548 cont.push_back(vol);
549 nadd++;
550 }
551 //
552 return nadd;
553}
554
555//________________________________________
556void AlignableDetector::setFreeDOFPattern(uint32_t pat, int lev, const std::string& regexStr)
557{
558 // set free DOFs to volumes matching either to hierarchy level or whose name contains match
559 //
560 std::regex selRegEx(regexStr);
561 for (int i = getNVolumes(); i--;) {
563 if (lev >= 0 && vol->countParents() != lev) {
564 continue;
565 } // wrong level
566 if (!regexStr.empty() && !std::regex_match(vol->getSymName(), selRegEx)) {
567 continue;
568 } // wrong name
569 vol->setFreeDOFPattern(pat);
570 }
571 //
572}
573
574//________________________________________
575void AlignableDetector::setDOFCondition(int dof, float condErr, int lev, const std::string& regexStr)
576{
577 // set condition for DOF of volumes matching either to hierarchy level or
578 // whose name contains match
579 //
580 std::regex selRegEx(regexStr);
581 for (int i = getNVolumes(); i--;) {
583 if (lev >= 0 && vol->countParents() != lev) {
584 continue;
585 } // wrong level
586 if (!regexStr.empty() && !std::regex_match(vol->getSymName(), selRegEx)) {
587 continue;
588 } // wrong name
589 if (dof >= vol->getNDOFs()) {
590 continue;
591 }
592 vol->setParErr(dof, condErr);
593 if (condErr >= 0 && !vol->isFreeDOF(dof)) {
594 vol->setFreeDOF(dof);
595 }
596 //if (condErr<0 && vol->isFreeDOF(dof)) vol->fixDOF(dof);
597 }
598 //
599}
600
601//________________________________________
602void AlignableDetector::constrainOrphans(const double* sigma, const char* match)
603{
604 // additional constraint on volumes w/o parents (optionally containing "match" in symname)
605 // sigma<0 : dof is not contrained
606 // sigma=0 : dof constrained exactly (Lagrange multiplier)
607 // sigma>0 : dof constrained by gaussian constraint
608 //
609 TString mts = match, syms;
610 auto cstr = getController()->getConstraints().emplace_back();
611 for (int i = 0; i < AlignableVolume::kNDOFGeom; i++) {
612 if (sigma[i] >= 0) {
613 cstr.constrainDOF(i);
614 } else {
615 cstr.unConstrainDOF(i);
616 }
617 cstr.setSigma(i, sigma[i]);
618 }
619 for (int i = getNVolumes(); i--;) {
621 if (vol->getParent()) {
622 continue;
623 } // wrong level
624 if (!mts.IsNull() && !(syms = vol->getSymName()).Contains(mts)) {
625 continue;
626 } //wrong name
627 cstr.addChild(vol);
628 }
629 //
630 if (!cstr.getNChildren()) {
631 LOG(info) << "No volume passed filter " << match;
632 getController()->getConstraints().pop_back();
633 }
634}
635
636//________________________________________
638{
639 // set detector free dof
640 if (dof >= kNMaxKalibDOF) {
641 LOG(fatal) << "Detector CalibDOFs limited to " << kNMaxKalibDOF << ", requested " << dof;
642 }
643 mCalibDOF |= 0x1 << dof;
644 calcFree();
645}
646
647//________________________________________
649{
650 // fix detector dof
651 if (dof >= kNMaxKalibDOF) {
652 LOG(fatal) << "Detector CalibDOFs limited to " << kNMaxKalibDOF << ", requested " << dof;
653 }
654 mCalibDOF &= ~(0x1 << dof);
655 calcFree();
656}
657
658//__________________________________________________________________
660{
661 // is DOF free and conditioned?
662 return (!isZeroAbs(getParVal(i)) || !isZeroAbs(getParErr(i)));
663}
664
665//__________________________________________________________________
667{
668 // calculate free calib dofs. If condFix==true, condition parameter a la pede, i.e. error < 0
669 mNCalibDOFsFree = 0;
670 for (int i = 0; i < mNCalibDOFs; i++) {
671 if (!isFreeDOF(i)) {
672 if (condFix && varsSet()) {
673 setParErr(i, -999);
674 }
675 continue;
676 }
678 }
679 //
680}
681
682//______________________________________________________
684{
685 // create tree with sensors ideal, ref and reco positions
686 int ns = getNSensors();
687 double loc[3] = {0};
688 // ------- local container type for dumping sensor positions ------
689 typedef struct {
690 int volID; // volume id
691 double pId[3]; // ideal
692 double pRf[3]; // reference
693 double pRc[3]; // reco-time
694 } snpos_t;
695 snpos_t spos; //
696 TFile* fl = TFile::Open(outFName, "recreate");
697 TTree* tr = new TTree("snpos", Form("sensor poisitions for %s", mDetID.getName()));
698 tr->Branch("volID", &spos.volID, "volID/I");
699 tr->Branch("pId", &spos.pId, "pId[3]/D");
700 tr->Branch("pRf", &spos.pRf, "pRf[3]/D");
701 tr->Branch("pRc", &spos.pRc, "pRc[3]/D");
702 //
703 for (int isn = 0; isn < ns; isn++) {
704 AlignableSensor* sens = getSensor(isn);
705 spos.volID = sens->getVolID();
706 sens->getMatrixL2GIdeal().LocalToMaster(loc, spos.pId);
707 sens->getMatrixL2G().LocalToMaster(loc, spos.pRf);
708 sens->getMatrixL2GReco().LocalToMaster(loc, spos.pRc);
709 tr->Fill();
710 }
711 tr->Write();
712 delete tr;
713 fl->Close();
714 delete fl;
715}
716
717} // namespace align
718} // namespace o2
ClassImp(o2::align::AlignableDetector)
Base class for detector: wrapper for set of volumes.
End-chain alignment volume in detector branch, where the actual measurement is done.
Track model for the alignment.
std::string getName(const TDataMember *dm, int index, int size)
Steering class for the global alignment.
int32_t i
Helper for geometry and GRP related CCDB requests.
Descriptor of geometrical constraint.
Definition of the Names Generator class.
virtual int processPoints(GIndex gid, int npntCut=0, bool inv=false)
bool mObligatory[utils::NTrackTypes]
int selectVolumes(std::vector< AlignableVolume * > cont, int lev=-1, const std::string &regexStr="")
AlignableSensor * getSensor(int id) const
int mNPointsSel[utils::NTrackTypes]
virtual void writeLabeledPedeResults(FILE *parOut) const
void calcFree(bool condFree=false)
virtual void acknowledgeNewRun(int run)
virtual void setUseErrorParam(int v=0)
void constrainOrphans(const double *sigma, const char *match=nullptr)
virtual void writeSensorPositions(const char *outFName)
void setObligatory(int tp, bool v=true)
virtual void addVolume(AlignableVolume *vol)
virtual void updatePointByTrackInfo(AlignmentPoint *pnt, const trackParam_t *t) const
AlignableVolume * getVolOfDOFID(int id) const
AlignableVolume * getVolume(int id) const
virtual double getCalibDOFValWithCal(int) const
void setDOFCondition(int dof, float condErr, int lev=-1, const std::string &regexStr="")
virtual void writeAlignmentResults() const
virtual void writePedeInfo(FILE *parOut, const Option_t *opt="") const
void setFreeDOFPattern(uint64_t pat)
void Print(const Option_t *opt="") const override
void setAddError(double y, double z)
virtual void writeCalibrationResults() const
virtual const char * getCalibDOFName(int) const
void setAddError(double y, double z)
virtual void prepareMatrixL2G(bool reco=false)
virtual void writePedeInfo(FILE *parOut, const Option_t *opt="") const
virtual bool isSensor() const
void Print(const Option_t *opt="") const override
const TGeoHMatrix & getMatrixL2G() const
void setGlobalDeltaRef(const TGeoHMatrix &mat)
virtual void writeLabeledPedeResults(FILE *parOut) const
const TGeoHMatrix & getMatrixL2GReco() const
bool isFreeDOF(int dof) const
AlignableVolume * getVolOfDOFID(int id) const
void setChildrenConstrainPattern(uint32_t pat)
void createAlignmentObjects(std::vector< o2::detectors::AlignParam > &arr, const TGeoHMatrix *envelopeDelta=nullptr) const
const TGeoHMatrix & getMatrixL2GIdeal() const
AlignableVolume * getParent() const
const char * getSymName() const
void setFreeDOFPattern(uint32_t pat)
void setObligatoryDetector(DetID id, int tp, bool v=true)
void expandGlobalsBy(int n)
void setParLab(int par, int lab)
Definition DOFSet.h:60
const float * getParVals() const
Definition DOFSet.cxx:29
Controller * mController
Definition DOFSet.h:73
void setFirstParGloID(int id)
Definition DOFSet.h:55
float getParVal(int par) const
Definition DOFSet.h:39
int getNCalibDOFs() const
Definition DOFSet.h:46
int mNCalibDOFsFree
Definition DOFSet.h:77
const float * getParErrs() const
Definition DOFSet.cxx:35
float getParErr(int par) const
Definition DOFSet.h:40
bool varsSet() const
Definition DOFSet.h:71
void setParErr(int par, double e=0)
Definition DOFSet.h:59
int getNDOFs() const
Definition DOFSet.h:44
auto getController()
Definition DOFSet.h:67
static GRPGeomHelper & instance()
static constexpr std::string_view CCDBOBJECT
Definition NameConf.h:66
Static class with identifiers, bitmasks and names for ALICE detectors.
Definition DetID.h:58
static constexpr const char * getName(ID id)
names of defined detectors
Definition DetID.h:145
bool match(const std::vector< std::string > &queries, const char *pattern)
Definition dcs-ccdb.cxx:229
const GLdouble * v
Definition glcorearb.h:832
GLboolean * data
Definition glcorearb.h:298
GLuint id
Definition glcorearb.h:650
constexpr bool isZeroAbs(double d) noexcept
Definition utils.h:63
typename track::TrackParametrizationWithError< double > trackParam_t
Definition utils.h:29
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"