Project
Loading...
Searching...
No Matches
TrackResiduals.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
17
18#ifndef ALICEO2_TPC_TRACKRESIDUALS_H_
19#define ALICEO2_TPC_TRACKRESIDUALS_H_
20
21#include <memory>
22#include <vector>
23#include <array>
24#include <bitset>
25#include <string>
26
27#include "DataFormatsTPC/Defs.h"
31
32#include "TTree.h"
33#include "TFile.h"
34
35namespace o2
36{
37namespace tpc
38{
39
46{
47 public:
49 TrackResiduals() = default;
50
54
56 enum { VoxZ,
60 VoxDim = 3,
61 VoxHDim = 4 };
62
64 enum { ResX,
69
71 enum { DistDone = 1 << 0,
72 DispDone = 1 << 1,
73 SmoothDone = 1 << 2,
74 Masked = 1 << 7 };
75
77 Gaussian };
78
80 struct VoxRes {
81 VoxRes() = default;
82 std::array<float, ResDim> D{};
83 std::array<float, ResDim> E{};
84 std::array<float, ResDim> DS{};
85 std::array<float, ResDim> DC{};
86 float EXYCorr{0.f};
87 float dYSigMAD{0.f};
88 float dZSigLTM{0.f};
89 std::array<float, VoxHDim> stat{};
90 std::array<unsigned char, VoxDim> bvox{};
91 unsigned char bsec{0};
92 unsigned char flags{0};
94 };
95
98 struct LocalResid {
99 LocalResid() = default;
100 LocalResid(short dyIn, short dzIn, short tgSlpIn, std::array<unsigned char, VoxDim> bvoxIn) : dy(dyIn), dz(dzIn), tgSlp(tgSlpIn), bvox(bvoxIn) {}
101 short dy{0};
102 short dz{0};
103 short tgSlp{0};
104 std::array<unsigned char, VoxDim> bvox{};
106 };
107
109 struct VoxStats {
110 VoxStats() = default;
111 std::array<float, VoxDim> meanPos{};
112 float nEntries{0.f};
114 };
115
116 // -------------------------------------- initialization --------------------------------------------------
119 void init(bool doBinning = true);
121 void initBinning();
125 void initResultsContainer(int iSec);
129 void reset();
130
131 // -------------------------------------- settings --------------------------------------------------
133 void setPrintMemoryUsage() { mPrintMem = true; }
142 void setKernelType(KernelType kernel = KernelType::Epanechnikov, float bwX = 2.1f, float bwP = 2.1f, float bwZ = 1.7f, float scX = 1.f, float scP = 1.f, float scZ = 1.f);
143
146 void setSmoothPol2(int dim, bool flag) { mSmoothPol2[dim] = flag; }
147
148 void setVdriftCorr(float corr) { mEffVdriftCorr = corr; }
149
150 void setT0Corr(float corr) { mEffT0Corr = corr; }
151
152 // -------------------------------------- I/O --------------------------------------------------
153
154 std::vector<LocalResid>& getLocalResVec() { return mLocalResidualsIn; }
155 std::vector<VoxStats>** getVoxStatPtr() { return &mVoxStatsInPtr; }
156
157 const std::array<std::vector<VoxRes>, SECTORSPERSIDE * SIDES>& getVoxelResults() const { return mVoxelResults; }
158
159 // -------------------------------------- steering functions --------------------------------------------------
160
163 void processSectorResiduals(Int_t iSec);
164
170 void processVoxelResiduals(std::vector<float>& dy, std::vector<float>& dz, std::vector<float>& tg, VoxRes& resVox);
171
176 void processVoxelDispersions(std::vector<float>& tg, std::vector<float>& dy, VoxRes& resVox);
177
182 int validateVoxels(int iSec);
183
186 void smooth(int iSec);
187
188 // -------------------------------------- statistics --------------------------------------------------
189
198 float fitPoly1Robust(std::vector<float>& x, std::vector<float>& y, std::array<float, 2>& res, std::array<float, 3>& err, float cutLTM) const;
199
204 float getMAD2Sigma(std::vector<float> data) const;
205
215 void medFit(int nPoints, int offset, const std::vector<float>& x, const std::vector<float>& y, float& a, float& b, std::array<float, 3>& err) const;
216
226 float roFunc(int nPoints, int offset, const std::vector<float>& x, const std::vector<float>& y, float b, float& aa) const;
227
235 float selectKthMin(const int k, std::vector<float>& data) const;
236
245 bool getSmoothEstimate(int iSec, float x, float p, float z, std::array<float, ResDim>& res, int whichDim = 0);
246
251 double getKernelWeight(std::array<double, 3> u2vec) const;
252
261 static void fitCircle(int nCl, std::array<float, param::NPadRows>& x, std::array<float, param::NPadRows>& y, float& xc, float& yc, float& r, std::array<float, param::NPadRows>& residHelixY);
262
267 static bool fitPoly1(int nCl, std::array<float, param::NPadRows>& x, std::array<float, param::NPadRows>& y, std::array<float, 2>& res);
268
269 // -------------------------------------- binning / geometry --------------------------------------------------
270
273 void setNXBins(int nBins) { mNXBins = nBins; }
274 int getNXBins() const { return mNXBins; }
275
278 void setNY2XBins(int nBins) { mNY2XBins = nBins; }
279 int getNY2XBins() const { return mNY2XBins; }
280
283 void setNZ2XBins(int nBins) { mNZ2XBins = nBins; }
284 int getNZ2XBins() const { return mNZ2XBins; }
285
287 int getNVoxelsPerSector() const { return mNVoxPerSector; }
288
291 void setY2XBinning(const std::vector<float>& binning);
292
295 void setZ2XBinning(const std::vector<float>& binning);
296
302 size_t getGlbVoxBin(int ix, int ip, int iz) const;
303
307 size_t getGlbVoxBin(const std::array<unsigned char, VoxDim>& bvox) const;
308
318 void getVoxelCoordinates(int isec, int ix, int ip, int iz, float& x, float& p, float& z) const;
319
323 float getX(int ix) const;
324
328 float getMaxY2X(int ix) const;
329
334 float getY2X(int ix, int ip) const;
335
339 float getZ2X(int iz) const;
340
345 bool getXBinIgnored(int iSec, int bin) const { return mXBinsIgnore[iSec].test(bin); }
346
354 void findVoxel(float x, float y2x, float z2x, int& ix, int& ip, int& iz) const;
355
357 bool findVoxelBin(int secID, float x, float y, float z, std::array<unsigned char, VoxDim>& bvox) const;
358
362 int getXBin(float x) const;
363
367 int getXBinExact(float x) const;
368
372 int getRowID(float x) const;
373
379 int getY2XBinExact(float y2x, int ix) const;
380
386 int getY2XBin(float y2x, int ix) const;
387
392 int getZ2XBinExact(float z2x) const;
393
398 int getZ2XBin(float z2x) const;
399
403 float getDXI(int ix) const;
404
409 float getDY2XI(int ix, int iy = 0) const;
410
414 float getDZ2X(int iz = 0) const;
415
419 float getDZ2XI(int iz = 0) const;
420
421 // -------------------------------------- debugging --------------------------------------------------
422
424 void printMem() const;
425
428 void dumpResults(int iSec);
429
431 void createOutputFile(const char* filename = "debugVoxRes.root");
432
434 void closeOutputFile();
435
437 TFile* getOutputFilePtr() { return mFileOut.get(); }
438
440 void setStats(const std::vector<TrackResiduals::VoxStats>& statsIn, int iSec);
441
443 void fillStats(int iSec);
444
446 void clear();
447
449 TTree* getOutputTree() { return mTreeOut.get(); }
450
452 void setAdhocScalingFactorX(const std::array<float, 2>& scaling) { mAdhocScalingX = scaling; }
453
455 void doAdhocCorrectionZ2X(bool corr) { mDoAdhocCorrectionZ2X = corr; }
456
457 private:
458 std::bitset<SECTORSPERSIDE * SIDES> mInitResultsContainer{};
459
460 // some constants
461 static constexpr float sFloatEps{1.e-7f};
462 static constexpr float sDeadZone{1.5f};
463 static constexpr int sSmtLinDim{4};
464 static constexpr int sMaxSmtDim{7};
465
466 // settings
467 const SpacePointsCalibConfParam* mParams = nullptr;
468
469 // input data
470 std::vector<LocalResid> mLocalResidualsIn;
471 std::vector<VoxStats> mVoxStatsIn, *mVoxStatsInPtr{&mVoxStatsIn};
472 // output data
473 std::unique_ptr<TFile> mFileOut;
474 std::unique_ptr<TTree> mTreeOut;
475 // status flags
476 bool mIsInitialized{};
477 bool mPrintMem{};
478 // binning
479 int mNXBins{param::NPadRows};
480 int mNY2XBins{param::NY2XBins};
481 int mNZ2XBins{param::NZ2XBins};
482 int mNVoxPerSector{};
483 float mDX{};
484 float mDXI{};
485 std::vector<float> mMaxY2X{};
486 std::vector<float> mDY2X{};
487 std::vector<float> mDY2XI{};
488 std::vector<float> mY2XBinsDH{};
489 std::vector<float> mY2XBinsDI{};
490 std::vector<float> mY2XBinsCenter{};
491 float mDZ2X{};
492 float mDZ2XI{};
493 std::vector<float> mZ2XBinsDH{};
494 std::vector<float> mZ2XBinsDI{};
495 std::vector<float> mZ2XBinsCenter{};
496 float mMaxZ2X{1.f};
497 std::array<bool, VoxDim> mUniformBins{true, true, true};
498 // smoothing
500 bool mUseErrInSmoothing{true};
501 std::array<bool, VoxDim> mSmoothPol2{};
502 std::array<int, SECTORSPERSIDE * SIDES> mNSmoothingFailedBins{};
503 std::array<int, VoxDim> mStepKern{};
504 std::array<float, VoxDim> mKernelScaleEdge{};
505 std::array<float, VoxDim> mKernelWInv{};
506 std::array<double, ResDim * sMaxSmtDim> mLastSmoothingRes{};
507 // calibrated parameters
508 float mEffVdriftCorr{0.f};
509 float mEffT0Corr{0.f};
510 // (intermediate) results
511 std::array<std::bitset<param::NPadRows>, SECTORSPERSIDE * SIDES> mXBinsIgnore{};
512 std::array<std::array<float, param::NPadRows>, SECTORSPERSIDE * SIDES> mValidFracXBins{};
513 std::array<std::vector<VoxRes>, SECTORSPERSIDE * SIDES> mVoxelResults{};
514 VoxRes mVoxelResultsOut{};
515 VoxRes* mVoxelResultsOutPtr{&mVoxelResultsOut};
516 std::array<float, 2> mAdhocScalingX{0, 0};
517 bool mDoAdhocCorrectionZ2X{false};
518
519 ClassDefNV(TrackResiduals, 3);
520};
521
522//_____________________________________________________
523inline size_t TrackResiduals::getGlbVoxBin(const std::array<unsigned char, VoxDim>& bvox) const
524{
525 return bvox[VoxX] + (bvox[VoxF] + bvox[VoxZ] * mNY2XBins) * mNXBins;
526}
527
528//_____________________________________________________
529inline size_t TrackResiduals::getGlbVoxBin(int ix, int ip, int iz) const
530{
531 return ix + (ip + iz * mNY2XBins) * mNXBins;
532}
533
534//_____________________________________________________
535inline void TrackResiduals::getVoxelCoordinates(int isec, int ix, int ip, int iz, float& x, float& p, float& z) const
536{
537 x = getX(ix);
538 p = getY2X(ix, ip);
539 z = getZ2X(iz);
540 if (isec >= SECTORSPERSIDE) {
541 z = -z;
542 }
543}
544
545//_____________________________________________________
546inline float TrackResiduals::getDXI(int ix) const
547{
548 if (mUniformBins[VoxX]) {
549 return mDXI;
550 } else {
551 if (ix < param::NRowsPerROC[0]) {
552 // we are in the IROC
553 return 1.f / param::RowDX[0];
554 } else if (ix > param::NRowsAccumulated[param::NROCTypes - 2]) {
555 // we are in the last OROC
556 return 1.f / param::RowDX[param::NROCTypes - 1];
557 } else if (ix < param::NRowsAccumulated[1]) {
558 // OROC1
559 return 1.f / param::RowDX[1];
560 } else {
561 // OROC2
562 return 1.f / param::RowDX[2];
563 }
564 }
565}
566
567//_____________________________________________________
568inline float TrackResiduals::getX(int ix) const
569{
570 return mUniformBins[VoxX] ? param::MinX + (ix + 0.5) * mDX : param::RowX[ix];
571}
572
573//_____________________________________________________
574inline float TrackResiduals::getMaxY2X(int ix) const
575{
576 return mMaxY2X[ix];
577}
578
579//_____________________________________________________
580inline float TrackResiduals::getY2X(int ix, int ip) const
581{
582 if (mUniformBins[VoxF]) {
583 return (0.5f + ip) * mDY2X[ix] - mMaxY2X[ix];
584 }
585 return mMaxY2X[ix] * mY2XBinsCenter[ip];
586}
587
588//_____________________________________________________
589inline float TrackResiduals::getZ2X(int iz) const
590{
591 if (mUniformBins[VoxZ]) {
592 return (0.5f + iz) * getDZ2X();
593 }
594 return mZ2XBinsCenter[iz];
595}
596
597//_____________________________________________________
598inline float TrackResiduals::getDY2XI(int ix, int iy) const
599{
600 if (mUniformBins[VoxF]) {
601 return mDY2XI[ix];
602 }
603 return mY2XBinsDI[iy] / mMaxY2X[ix];
604}
605
606//_____________________________________________________
607inline float TrackResiduals::getDZ2X(int iz) const
608{
609 if (mUniformBins[VoxZ]) {
610 return mDZ2X;
611 }
612 return 2.f * mZ2XBinsDH[iz];
613}
614
615//_____________________________________________________
616inline float TrackResiduals::getDZ2XI(int iz) const
617{
618 if (mUniformBins[VoxZ]) {
619 return mDZ2XI;
620 }
621 return mZ2XBinsDI[iz];
622}
623
624//_____________________________________________________
625inline void TrackResiduals::findVoxel(float x, float y2x, float z2x, int& ix, int& ip, int& iz) const
626{
627 ix = getXBin(x);
628 ip = getY2XBin(y2x, ix);
629 iz = getZ2XBin(z2x);
630}
631
632//_____________________________________________________
633inline int TrackResiduals::getXBinExact(float x) const
634{
635 if (mUniformBins[VoxX]) {
636 int ix = (x - param::MinX) * mDXI;
637 return (ix < 0 || ix >= mNXBins) ? -1 : ix;
638 }
639 return getRowID(x);
640}
641
642//_____________________________________________________
643inline int TrackResiduals::getXBin(float x) const
644{
645 int bx = getXBinExact(x);
646 return bx > -1 ? (bx < mNXBins ? bx : mNXBins - 1) : 0;
647}
648
649//_____________________________________________________
650inline int TrackResiduals::getY2XBinExact(float y2x, int ix) const
651{
652 if (y2x < -mMaxY2X[ix]) {
653 return -1;
654 }
655 if (y2x > mMaxY2X[ix]) {
656 return mNY2XBins;
657 }
658 if (mUniformBins[VoxF]) {
659 return static_cast<int>((y2x + mMaxY2X[ix]) * getDY2XI(ix));
660 }
661 y2x /= mMaxY2X[ix];
662 for (int iBin = 0; iBin < mNY2XBins; ++iBin) {
663 if (y2x < mY2XBinsCenter[iBin] + mY2XBinsDH[iBin]) {
664 return iBin;
665 }
666 }
667 return mNY2XBins;
668}
669
670//_____________________________________________________
671inline int TrackResiduals::getY2XBin(float y2x, int ix) const
672{
673 int bp = getY2XBinExact(y2x, ix);
674 return bp > -1 ? (bp < mNY2XBins ? bp : mNY2XBins - 1) : 0;
675}
676
677//_____________________________________________________
678inline int TrackResiduals::getZ2XBinExact(float z2x) const
679{
680 if (mUniformBins[VoxZ]) {
681 float bz = z2x * getDZ2XI();
682 if (bz >= mNZ2XBins) {
683 return -1;
684 }
685 if (bz < 0) {
686 // accounting for clusters which were moved to the wrong side
687 // TODO: how can this happen?
688 bz = 0;
689 }
690 return static_cast<int>(bz);
691 }
692 for (int iBin = 0; iBin < mNZ2XBins; ++iBin) {
693 if (z2x < mZ2XBinsCenter[iBin] + mZ2XBinsDH[iBin]) {
694 return iBin;
695 }
696 }
697 return -1;
698}
699
700//_____________________________________________________
701inline int TrackResiduals::getZ2XBin(float z2x) const
702{
703 int iz = getZ2XBinExact(z2x);
704 return iz < 0 ? mNZ2XBins - 1 : iz;
705}
706
707} // namespace tpc
708
709} // namespace o2
710
711#endif
uint32_t res
Definition RawData.h:0
Parameters used for TPC space point calibration.
Definition of the TrackInterpolation class.
std::vector< LocalResid > & getLocalResVec()
TrackResiduals()=default
Default constructor.
float getDZ2XI(int iz=0) const
void setNXBins(int nBins)
void setVdriftCorr(float corr)
void setKernelType(KernelType kernel=KernelType::Epanechnikov, float bwX=2.1f, float bwP=2.1f, float bwZ=1.7f, float scX=1.f, float scP=1.f, float scZ=1.f)
int getZ2XBin(float z2x) const
bool getSmoothEstimate(int iSec, float x, float p, float z, std::array< float, ResDim > &res, int whichDim=0)
int getXBinExact(float x) const
void setY2XBinning(const std::vector< float > &binning)
int getXBin(float x) const
void processSectorResiduals(Int_t iSec)
static bool fitPoly1(int nCl, std::array< float, param::NPadRows > &x, std::array< float, param::NPadRows > &y, std::array< float, 2 > &res)
float getZ2X(int iz) const
size_t getGlbVoxBin(int ix, int ip, int iz) const
void setStats(const std::vector< TrackResiduals::VoxStats > &statsIn, int iSec)
Set the voxel statistics directly from outside.
void closeOutputFile()
Closes the file with the debug output.
void clear()
clear member to be able to process new sector or new input files
float getX(int ix) const
void fillStats(int iSec)
Fill statistics from TTree.
void setSmoothPol2(int dim, bool flag)
TrackResiduals(const TrackResiduals &)=delete
Copying and assigning is forbidden.
TFile * getOutputFilePtr()
Allow to access the output file from outside.
void printMem() const
Prints the current memory usage.
void setZ2XBinning(const std::vector< float > &binning)
void initResultsContainer(int iSec)
int getNVoxelsPerSector() const
Get the total number of voxels per TPC sector (mNXBins * mNY2XBins * mNZ2XBins)
float getY2X(int ix, int ip) const
int getY2XBin(float y2x, int ix) const
int getRowID(float x) const
@ VoxDim
dimensionality of the voxels
@ VoxV
voxel dispersions
void createOutputFile(const char *filename="debugVoxRes.root")
Creates a file for the debug output.
void setPrintMemoryUsage()
Sets a flag to print the memory usage at certain points in the program for performance studies.
float getDY2XI(int ix, int iy=0) const
@ DispDone
voxel dispersions have been processed
@ DistDone
voxel residuals have been processed
@ SmoothDone
voxel has been smoothed
void findVoxel(float x, float y2x, float z2x, int &ix, int &ip, int &iz) const
float roFunc(int nPoints, int offset, const std::vector< float > &x, const std::vector< float > &y, float b, float &aa) const
void medFit(int nPoints, int offset, const std::vector< float > &x, const std::vector< float > &y, float &a, float &b, std::array< float, 3 > &err) const
static void fitCircle(int nCl, std::array< float, param::NPadRows > &x, std::array< float, param::NPadRows > &y, float &xc, float &yc, float &r, std::array< float, param::NPadRows > &residHelixY)
TrackResiduals & operator=(const TrackResiduals &)=delete
float getDXI(int ix) const
float fitPoly1Robust(std::vector< float > &x, std::vector< float > &y, std::array< float, 2 > &res, std::array< float, 3 > &err, float cutLTM) const
void getVoxelCoordinates(int isec, int ix, int ip, int iz, float &x, float &p, float &z) const
int getY2XBinExact(float y2x, int ix) const
bool findVoxelBin(int secID, float x, float y, float z, std::array< unsigned char, VoxDim > &bvox) const
Calculates the bin indices for given x, y, z in sector coordinates.
bool getXBinIgnored(int iSec, int bin) const
void initBinning()
Initializes the binning in X, Y/X and Z.
float getMAD2Sigma(std::vector< float > data) const
@ ResD
index for dispersions
void reset()
Resets all (also intermediate) results.
void setAdhocScalingFactorX(const std::array< float, 2 > &scaling)
Ad-hoc radial scaling factor A/C-Side.
int getZ2XBinExact(float z2x) const
double getKernelWeight(std::array< double, 3 > u2vec) const
void processVoxelDispersions(std::vector< float > &tg, std::vector< float > &dy, VoxRes &resVox)
void init(bool doBinning=true)
float selectKthMin(const int k, std::vector< float > &data) const
float getMaxY2X(int ix) const
void setNY2XBins(int nBins)
void initVoxelStats()
Initialize the statistics for the local residuals container.
void setNZ2XBins(int nBins)
void setT0Corr(float corr)
TTree * getOutputTree()
output tree
float getDZ2X(int iz=0) const
void processVoxelResiduals(std::vector< float > &dy, std::vector< float > &dz, std::vector< float > &tg, VoxRes &resVox)
void doAdhocCorrectionZ2X(bool corr)
Ad-hoc correction of Z/X.
const std::array< std::vector< VoxRes >, SECTORSPERSIDE *SIDES > & getVoxelResults() const
std::vector< VoxStats > ** getVoxStatPtr()
GLint GLenum GLint x
Definition glcorearb.h:403
GLboolean GLboolean GLboolean b
Definition glcorearb.h:1233
GLboolean * data
Definition glcorearb.h:298
GLintptr offset
Definition glcorearb.h:660
GLbitfield flags
Definition glcorearb.h:1570
GLboolean r
Definition glcorearb.h:1233
GLboolean GLboolean GLboolean GLboolean a
Definition glcorearb.h:1233
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
constexpr unsigned char SECTORSPERSIDE
Definition Defs.h:40
constexpr unsigned char SIDES
Definition Defs.h:41
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::string filename()
LocalResid(short dyIn, short dzIn, short tgSlpIn, std::array< unsigned char, VoxDim > bvoxIn)
std::array< unsigned char, VoxDim > bvox
voxel identifier: VoxZ, VoxF, VoxX
short dy
residual in y, ranges from -param::sMaxResid to +param::sMaxResid
short tgSlp
tangens of the phi angle between padrow and track, ranges from -param::MaxTgSlp to +param::MaxTgSlp
short dz
residual in z, ranges from -param::sMaxResid to +param::sMaxResid
Structure which gets filled with the results for each voxel.
std::array< float, ResDim > DC
Cheb parameterized residual.
std::array< unsigned char, VoxDim > bvox
voxel identifier: VoxZ, VoxF, VoxX
std::array< float, ResDim > E
their errors
float dYSigMAD
MAD estimator of dY sigma (dispersion after slope removal)
std::array< float, ResDim > D
values of extracted distortions
float dZSigLTM
Z sigma from unbinned LTM estimator.
std::array< float, ResDim > DS
smoothed residual
unsigned char bsec
sector ID (0-35)
float EXYCorr
correlation between extracted X and Y
std::array< float, VoxHDim > stat
statistics: averages of each voxel dimension + entries
Structure which holds the statistics for each voxel.
std::array< float, VoxDim > meanPos