Skip to content

Commit cb66b5e

Browse files
authored
Add extra info with charge and timing and occupancy to unbinned residuals (#14969)
* Add extra info with charge and timing to unbinned residuals * Store TOF time wrt t0 in DetInfoRes, diff to expectation in trackData.deltaTOF * Add per-stack TPC mult info to TrackData
1 parent 0cf7ec2 commit cb66b5e

File tree

12 files changed

+269
-30
lines changed

12 files changed

+269
-30
lines changed

Detectors/GlobalTrackingWorkflow/tpcinterpolationworkflow/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
# granted to it by virtue of its status as an Intergovernmental Organization
1010
# or submit itself to any jurisdiction.
1111

12+
# add_compile_options(-O0 -g -fPIC -fno-omit-frame-pointer)
13+
1214
o2_add_library(TPCInterpolationWorkflow
1315
SOURCES src/TPCInterpolationSpec.cxx
1416
src/TPCResidualWriterSpec.cxx

Detectors/GlobalTrackingWorkflow/tpcinterpolationworkflow/include/TPCInterpolationWorkflow/TPCResidualAggregatorSpec.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,9 @@ class ResidualAggregatorDevice : public o2::framework::Task
128128
updateTimeDependentParams(pc);
129129
std::chrono::duration<double, std::milli> ccdbUpdateTime = std::chrono::high_resolution_clock::now() - runStartTime;
130130

131-
// we always require the unbinned residuals and the associated track references
131+
// we always require the unbinned residuals and the associated detector info and track references
132132
auto residualsData = pc.inputs().get<gsl::span<o2::tpc::UnbinnedResid>>("unbinnedRes");
133+
auto residualsDataDet = pc.inputs().get<gsl::span<o2::tpc::DetInfoResid>>("detinfoRes");
133134
auto trackRefs = pc.inputs().get<gsl::span<o2::tpc::TrackDataCompact>>("trackRefs");
134135

135136
// track data input is optional
@@ -151,7 +152,7 @@ class ResidualAggregatorDevice : public o2::framework::Task
151152

152153
o2::base::TFIDInfoHelper::fillTFIDInfo(pc, mAggregator->getCurrentTFInfo());
153154
LOG(detail) << "Processing TF " << mAggregator->getCurrentTFInfo().tfCounter << " with " << trkData->size() << " tracks and " << residualsData.size() << " unbinned residuals associated to them";
154-
mAggregator->process(residualsData, trackRefs, trkDataPtr, lumi);
155+
mAggregator->process(residualsData, residualsDataDet, trackRefs, trkDataPtr, lumi);
155156
std::chrono::duration<double, std::milli> runDuration = std::chrono::high_resolution_clock::now() - runStartTime;
156157
LOGP(debug, "Duration for run method: {} ms. From this taken for time dependent param update: {} ms",
157158
std::chrono::duration_cast<std::chrono::milliseconds>(runDuration).count(),
@@ -222,6 +223,7 @@ DataProcessorSpec getTPCResidualAggregatorSpec(bool trackInput, bool ctpInput, b
222223
auto& inputs = dataRequest->inputs;
223224
o2::tpc::VDriftHelper::requestCCDBInputs(inputs);
224225
inputs.emplace_back("unbinnedRes", "GLO", "UNBINNEDRES");
226+
inputs.emplace_back("detinfoRes", "GLO", "DETINFORES");
225227
inputs.emplace_back("trackRefs", "GLO", "TRKREFS");
226228
if (trackInput) {
227229
inputs.emplace_back("trkData", "GLO", "TRKDATA");

Detectors/GlobalTrackingWorkflow/tpcinterpolationworkflow/include/TPCInterpolationWorkflow/TPCUnbinnedResidualReaderSpec.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class TPCUnbinnedResidualReader : public o2::framework::Task
4343
std::string mInFileName;
4444
std::string mInTreeName;
4545
std::vector<UnbinnedResid> mUnbinnedResid, *mUnbinnedResidPtr = &mUnbinnedResid;
46+
std::vector<DetInfoResid> mDetInfoUnbRes, *mDetInfoUnbResPtr = &mDetInfoUnbRes;
4647
std::vector<TrackData> mTrackData, *mTrackDataPtr = &mTrackData;
4748
std::vector<TrackDataCompact> mTrackDataCompact, *mTrackDataCompactPtr = &mTrackDataCompact;
4849
};

Detectors/GlobalTrackingWorkflow/tpcinterpolationworkflow/src/TPCInterpolationSpec.cxx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,12 @@ void TPCInterpolationDPL::updateTimeDependentParams(ProcessingContext& pc)
6666
initOnceDone = true;
6767
// other init-once stuff
6868
const auto& param = SpacePointsCalibConfParam::Instance();
69+
mInterpolation.setSqrtS(o2::base::GRPGeomHelper::instance().getGRPLHCIF()->getSqrtS());
70+
mInterpolation.setNHBPerTF(o2::base::GRPGeomHelper::getNHBFPerTF());
6971
mInterpolation.init(mSources, mSourcesMap);
7072
if (mProcessITSTPConly) {
7173
mInterpolation.setProcessITSTPConly();
7274
}
73-
mInterpolation.setSqrtS(o2::base::GRPGeomHelper::instance().getGRPLHCIF()->getSqrtS());
7475
int nTfs = mSlotLength / (o2::base::GRPGeomHelper::getNHBFPerTF() * o2::constants::lhc::LHCOrbitMUS * 1e-6);
7576
bool limitTracks = (param.maxTracksPerCalibSlot < 0) ? false : true;
7677
int nTracksPerTfMax = (nTfs > 0 && limitTracks) ? param.maxTracksPerCalibSlot / nTfs : -1;
@@ -93,6 +94,11 @@ void TPCInterpolationDPL::updateTimeDependentParams(ProcessingContext& pc)
9394
mInterpolation.setProcessSeeds();
9495
}
9596
o2::its::GeometryTGeo::Instance()->fillMatrixCache(o2::math_utils::bit2Mask(o2::math_utils::TransformType::T2GRot) | o2::math_utils::bit2Mask(o2::math_utils::TransformType::T2L));
97+
mInterpolation.setExtDetResid(mExtDetResid);
98+
mInterpolation.setITSClusterDictionary(mITSDict);
99+
if (mDebugOutput) {
100+
mInterpolation.setDumpTrackPoints();
101+
}
96102
}
97103
// we may have other params which need to be queried regularly
98104
if (mTPCVDriftHelper.isUpdated()) {
@@ -103,11 +109,6 @@ void TPCInterpolationDPL::updateTimeDependentParams(ProcessingContext& pc)
103109
mInterpolation.setTPCVDrift(mTPCVDriftHelper.getVDriftObject());
104110
mTPCVDriftHelper.acknowledgeUpdate();
105111
}
106-
if (mDebugOutput) {
107-
mInterpolation.setDumpTrackPoints();
108-
}
109-
mInterpolation.setExtDetResid(mExtDetResid);
110-
mInterpolation.setITSClusterDictionary(mITSDict);
111112
}
112113

113114
void TPCInterpolationDPL::finaliseCCDB(ConcreteDataMatcher& matcher, void* obj)
@@ -143,6 +144,7 @@ void TPCInterpolationDPL::run(ProcessingContext& pc)
143144
}
144145
}
145146
pc.outputs().snapshot(Output{"GLO", "UNBINNEDRES", 0}, mInterpolation.getClusterResiduals());
147+
pc.outputs().snapshot(Output{"GLO", "DETINFORES", 0}, mInterpolation.getClusterResidualsDetInfo());
146148
pc.outputs().snapshot(Output{"GLO", "TRKREFS", 0}, mInterpolation.getTrackDataCompact());
147149
if (mSendTrackData) {
148150
pc.outputs().snapshot(Output{"GLO", "TRKDATA", 0}, mInterpolation.getReferenceTracks());
@@ -188,6 +190,7 @@ DataProcessorSpec getTPCInterpolationSpec(GTrackID::mask_t srcCls, GTrackID::mas
188190
}
189191
}
190192
outputs.emplace_back("GLO", "UNBINNEDRES", 0, Lifetime::Timeframe);
193+
outputs.emplace_back("GLO", "DETINFORES", 0, Lifetime::Timeframe);
191194
outputs.emplace_back("GLO", "TRKREFS", 0, Lifetime::Timeframe);
192195
if (sendTrackData) {
193196
outputs.emplace_back("GLO", "TRKDATA", 0, Lifetime::Timeframe);

Detectors/GlobalTrackingWorkflow/tpcinterpolationworkflow/src/TPCResidualWriterSpec.cxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ DataProcessorSpec getTPCResidualWriterSpec(bool writeTrackData, bool debugOutput
3838
BranchDefinition<std::vector<TrackData>>{InputSpec{"tracksUnfiltered", "GLO", "TPCINT_TRK", 0}, "tracksUnfiltered", ((writeUnfiltered && writeTrackData) ? 1 : 0)},
3939
BranchDefinition<std::vector<TPCClusterResiduals>>{InputSpec{"residualsUnfiltered", "GLO", "TPCINT_RES", 0}, "residualsUnfiltered", (writeUnfiltered ? 1 : 0)},
4040
BranchDefinition<std::vector<UnbinnedResid>>{InputSpec{"residuals", "GLO", "UNBINNEDRES"}, "residuals"},
41+
BranchDefinition<std::vector<DetInfoResid>>{InputSpec{"detInfo", "GLO", "DETINFORES"}, "detInfo"},
4142
BranchDefinition<std::vector<TrackDataCompact>>{InputSpec{"trackRefs", "GLO", "TRKREFS"}, "trackRefs"},
4243
BranchDefinition<std::vector<TrackData>>{InputSpec{"tracks", "GLO", "TRKDATA"}, "tracks", (writeTrackData ? 1 : 0)},
4344
BranchDefinition<std::vector<TrackDataExtended>>{InputSpec{"trackExt", "GLO", "TRKDATAEXT"}, "trackExt", (debugOutput ? 1 : 0)})();

Detectors/GlobalTrackingWorkflow/tpcinterpolationworkflow/src/TPCUnbinnedResidualReaderSpec.cxx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ void TPCUnbinnedResidualReader::connectTree()
4444
assert(mTreeIn);
4545
mTreeIn->SetBranchAddress("residuals", &mUnbinnedResidPtr);
4646
mTreeIn->SetBranchAddress("trackRefs", &mTrackDataCompactPtr);
47+
if (mTreeIn->GetBranch("detInfo")) {
48+
mTreeIn->SetBranchAddress("detInfo", &mDetInfoUnbResPtr);
49+
} else {
50+
LOGP(warn, "No detInfo branch found in the unbinned residuals tree, empty vector will be sent");
51+
}
4752
if (mTrackInput) {
4853
mTreeIn->SetBranchAddress("tracks", &mTrackDataPtr);
4954
}
@@ -58,6 +63,7 @@ void TPCUnbinnedResidualReader::run(ProcessingContext& pc)
5863
LOG(info) << "Pushing " << mUnbinnedResid.size() << " unbinned residuals at entry " << currEntry;
5964
pc.outputs().snapshot(Output{"GLO", "UNBINNEDRES", 0}, mUnbinnedResid);
6065
pc.outputs().snapshot(Output{"GLO", "TRKREFS", 0}, mTrackDataCompact);
66+
pc.outputs().snapshot(Output{"GLO", "DETINFORES", 0}, mDetInfoUnbRes);
6167
if (mTrackInput) {
6268
LOG(info) << "Pushing " << mTrackData.size() << " reference tracks for these residuals";
6369
pc.outputs().snapshot(Output{"GLO", "TRKDATA", 0}, mTrackData);
@@ -73,6 +79,7 @@ DataProcessorSpec getUnbinnedTPCResidualsReaderSpec(bool trkInput)
7379
{
7480
std::vector<OutputSpec> outputs;
7581
outputs.emplace_back("GLO", "UNBINNEDRES", 0, Lifetime::Timeframe);
82+
outputs.emplace_back("GLO", "DETINFORES", 0, Lifetime::Timeframe);
7683
outputs.emplace_back("GLO", "TRKREFS", 0, Lifetime::Timeframe);
7784
if (trkInput) {
7885
outputs.emplace_back("GLO", "TRKDATA", 0, Lifetime::Timeframe);

Detectors/TPC/calibration/SpacePoints/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ o2_add_library(SpacePoints
2929
O2::DataFormatsITSMFT
3030
O2::DataFormatsTRD
3131
O2::DataFormatsTOF
32-
O2::DataFormatsGlobalTracking)
32+
O2::DataFormatsGlobalTracking
33+
O2::GPUTracking)
3334

3435
o2_target_root_dictionary(SpacePoints
3536
HEADERS include/SpacePoints/TrackResiduals.h

Detectors/TPC/calibration/SpacePoints/include/SpacePoints/ResidualAggregator.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ struct ResidualsContainer {
4949
void fillStatisticsBranches();
5050
uint64_t getNEntries() const { return nResidualsTotal; }
5151

52-
void fill(const o2::dataformats::TFIDInfo& ti, const gsl::span<const UnbinnedResid> resid, const gsl::span<const o2::tpc::TrackDataCompact> trkRefsIn, const gsl::span<const o2::tpc::TrackData>* trkDataIn, const o2::ctp::LumiInfo* lumiInput);
52+
void fill(const o2::dataformats::TFIDInfo& ti, const gsl::span<const UnbinnedResid> resid, const gsl::span<const DetInfoResid> detInfoRes, const gsl::span<const o2::tpc::TrackDataCompact> trkRefsIn, const gsl::span<const o2::tpc::TrackData>* trkDataIn, const o2::ctp::LumiInfo* lumiInput);
5353
void merge(ResidualsContainer* prev);
5454
void print();
5555
void writeToFile(bool closeFileAfterwards);
@@ -64,6 +64,7 @@ struct ResidualsContainer {
6464
std::vector<uint32_t> sumUnbinnedResid, *sumUnbinnedResidPtr{&sumUnbinnedResid}; ///< sum of unbinned residuals for each TF
6565
std::vector<o2::ctp::LumiInfo> lumi, *lumiPtr{&lumi}; ///< luminosity information from CTP per TF
6666
std::vector<UnbinnedResid> unbinnedRes, *unbinnedResPtr{&unbinnedRes}; ///< unbinned residuals which are sent to the aggregator
67+
std::vector<DetInfoResid> detInfoUnbRes, *detInfoUnbResPtr{&detInfoUnbRes}; ///< detector info associated to unbinned residuals which are sent to the aggregator
6768
std::vector<TrackData> trkData, *trkDataPtr{&trkData}; ///< track data and cluster ranges
6869
std::vector<TrackDataCompact> trackInfo, *trackInfoPtr{&trackInfo}; ///< allows to obtain track type for each unbinned residual downstream
6970
o2::ctp::LumiInfo lumiTF; ///< for each processed TF we store the lumi information in the tree of unbinned residuals

Detectors/TPC/calibration/SpacePoints/include/SpacePoints/TrackInterpolation.h

Lines changed: 90 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ class TTree;
4747
namespace o2
4848
{
4949

50+
namespace gpu
51+
{
52+
class GPUParam;
53+
}
54+
5055
namespace tpc
5156
{
5257
class VDriftCorrFact;
@@ -101,15 +106,72 @@ struct UnbinnedResid {
101106
ClassDefNV(UnbinnedResid, 2);
102107
};
103108

109+
struct DetInfoResid { // detector info associated with residual
110+
uint32_t word = 0; // container interpreted in a different way depending on the detector type
111+
//
112+
// TPC view: qTot and qMax of the cluster
113+
uint16_t qTotTPC() const { return static_cast<uint16_t>(word & 0xFFFFu); }
114+
uint16_t qMaxTPC() const { return static_cast<uint16_t>((word >> 16) & 0xFFFFu); }
115+
void setTPC(uint16_t qTot, uint16_t qMax) { word = (static_cast<uint32_t>(qMax) << 16) | static_cast<uint32_t>(qTot); }
116+
//
117+
// TRD view: q0, q1, q2 + calibrated slope (truncated to in +-3.5 range)
118+
static constexpr uint32_t TRDQ0NB = 7, TRDQ1NB = 7, TRDQ2NB = 6, TRDSlpNB = 12;
119+
static constexpr uint32_t TRDQ0Msk = (1 << TRDQ0NB) - 1, TRDQ1Msk = (1 << TRDQ1NB) - 1, TRDQ2Msk = ((1 << TRDQ2NB) - 1), TRDSlpMsk = (1 << TRDSlpNB) - 1;
120+
static constexpr float TRDMaxSlope = 3.5, TRDSlope2Int = ((1 << TRDSlpNB) - 1) / (2 * TRDMaxSlope), TRDInt2Slope = 1.f / TRDSlope2Int;
121+
uint16_t q0TRD() const { return static_cast<uint16_t>(word & TRDQ0Msk); }
122+
uint16_t q1TRD() const { return static_cast<uint16_t>((word >> TRDQ0NB) & TRDQ1Msk); }
123+
uint16_t q2TRD() const { return static_cast<uint16_t>((word >> (TRDQ0NB + TRDQ1NB)) & TRDQ2Msk); }
124+
float slopeTRD() const { return ((word >> (TRDQ0NB + TRDQ1NB + TRDQ2NB)) & TRDSlpMsk) * TRDInt2Slope - TRDMaxSlope; }
125+
void setTRD(uint8_t q0, uint8_t q1, uint8_t q2, float slope)
126+
{
127+
float rslope = (slope + TRDMaxSlope) * TRDSlope2Int;
128+
if (rslope < 0.f) {
129+
rslope = 0;
130+
} else if (rslope > TRDSlpMsk) {
131+
rslope = TRDSlpMsk;
132+
}
133+
uint32_t slpI = std::round(rslope);
134+
word = (static_cast<uint32_t>(slpI << (TRDQ0NB + TRDQ1NB + TRDQ2NB)) |
135+
static_cast<uint32_t>((q2 & TRDQ2Msk) << (TRDQ0NB + TRDQ1NB)) |
136+
static_cast<uint32_t>((q1 & TRDQ1Msk) << TRDQ0NB) |
137+
static_cast<uint32_t>(q0 & TRDQ0Msk));
138+
}
139+
//
140+
// TOF view (time difference in \mus wrt seeding ITS-TPC track)
141+
float timeTOF() const { return std::bit_cast<float>(word); }
142+
void setTOF(float t) { word = std::bit_cast<uint32_t>(t); }
143+
//
144+
// No info for ITS is stored
145+
//
146+
// PV view (time difference in \mus wrt contributing ITS-TPC track)
147+
float timePV() const { return std::bit_cast<float>(word); }
148+
void setPV(float t) { word = std::bit_cast<uint32_t>(t); }
149+
150+
ClassDefNV(DetInfoResid, 1);
151+
};
152+
104153
/// Structure for the information required to associate each residual with a given track type (ITS-TPC-TRD-TOF, etc)
105154
struct TrackDataCompact {
106155
TrackDataCompact() = default;
107-
TrackDataCompact(uint32_t idx, uint8_t nRes, uint8_t source, uint8_t nextraRes = 0) : idxFirstResidual(idx), nResiduals(nRes), sourceId(source), nExtDetResid(nextraRes) {}
156+
TrackDataCompact(uint32_t idx, std::array<uint8_t, 4> mlt, uint8_t nRes, uint8_t source, uint8_t nextraRes = 0) : idxFirstResidual(idx), multStack{mlt}, nResiduals(nRes), sourceId(source), nExtDetResid(nextraRes) {}
108157
uint32_t idxFirstResidual; ///< the index of the first residual from this track
158+
std::array<uint8_t, 4> multStack{}; // multiplicity in the stack packed as asinh(x*0.05)/0.05
109159
uint8_t nResiduals; ///< total number of TPC residuals associated to this track
110160
uint8_t nExtDetResid = 0; ///< number of external detectors (wrt TPC) residuals stored, on top of clIdx.getEntries
111161
uint8_t sourceId; ///< source ID obtained from the global track ID
112-
ClassDefNV(TrackDataCompact, 2);
162+
163+
void setMultStack(float v, int stack)
164+
{
165+
uint32_t mltPacked = std::round(std::asinh(v * 0.05) / 0.05);
166+
multStack[stack] = mltPacked < 0xff ? mltPacked : 0xff;
167+
}
168+
float getMultStack(int stack) const
169+
{
170+
return std::sinh(multStack[stack] * 0.05) / 0.05;
171+
}
172+
float getMultStackPacked(int stack) const { return multStack[stack]; }
173+
174+
ClassDefNV(TrackDataCompact, 3);
113175
};
114176

115177
// TODO add to UnbinnedResid::sec flag if cluster was used or not
@@ -149,11 +211,22 @@ struct TrackData {
149211
short TRDTrkltSlope[6] = {}; ///< TRD tracklet slope 0x7fff / param::MaxTRDSlope
150212
uint8_t nExtDetResid = 0; ///< number of external detectors (to TPC) residuals stored, on top of clIdx.getEntries
151213
o2::dataformats::RangeReference<> clIdx{}; ///< index of first cluster residual and total number of TPC cluster residuals of this track
152-
214+
std::array<uint8_t, 4> multStack{}; // multiplicity in the stack packed as asinh(x*0.05)/0.05
153215
float getT0Error() const { return float(clAvailTOF); }
154216
bool isTOFAvail() const { return clAvailTOF != 0; }
155217

156-
ClassDefNV(TrackData, 9);
218+
void setMultStack(float v, int stack)
219+
{
220+
uint32_t mltPacked = std::round(std::asinh(v * 0.05) / 0.05);
221+
multStack[stack] = mltPacked < 0xff ? mltPacked : 0xff;
222+
}
223+
float getMultStack(int stack) const
224+
{
225+
return std::sinh(multStack[stack] * 0.05) / 0.05;
226+
}
227+
float getMultStackPacked(int stack) const { return multStack[stack]; }
228+
229+
ClassDefNV(TrackData, 10);
157230
};
158231

159232
/// \class TrackInterpolation
@@ -268,6 +341,8 @@ class TrackInterpolation
268341
void diffToMA(const int np, const std::array<float, param::NPadRows>& y, std::array<float, param::NPadRows>& diffMA) const;
269342

270343
// -------------------------------------- settings --------------------------------------------------
344+
void setNHBPerTF(int n) { mNHBPerTF = n; }
345+
271346
void setTPCVDrift(const o2::tpc::VDriftCorrFact& v);
272347

273348
/// Sets the flag if material correction should be applied when extrapolating the tracks
@@ -296,10 +371,13 @@ class TrackInterpolation
296371

297372
void setExtDetResid(bool v) { mExtDetResid = v; }
298373

299-
int processTRDLayer(const o2::trd::TrackTRD& trkTRD, int iLayer, o2::track::TrackParCov& trkWork, std::array<float, 2>* trkltTRDYZ = nullptr, std::array<float, 3>* trkltTRDCov = nullptr, TrackData* trkData = nullptr);
374+
int processTRDLayer(const o2::trd::TrackTRD& trkTRD, int iLayer, o2::track::TrackParCov& trkWork, std::array<float, 2>* trkltTRDYZ = nullptr,
375+
std::array<float, 3>* trkltTRDCov = nullptr, TrackData* trkData = nullptr,
376+
o2::trd::Tracklet64* trk64 = nullptr, o2::trd::CalibratedTracklet* trkCalib = nullptr);
300377

301378
// --------------------------------- output ---------------------------------------------
302379
std::vector<UnbinnedResid>& getClusterResiduals() { return mClRes; }
380+
std::vector<DetInfoResid>& getClusterResidualsDetInfo() { return mDetInfoRes; }
303381
std::vector<TrackDataCompact>& getTrackDataCompact() { return mTrackDataCompact; }
304382
std::vector<TrackDataExtended>& getTrackDataExtended() { return mTrackDataExtended; }
305383
std::vector<TrackData>& getReferenceTracks() { return mTrackData; }
@@ -308,8 +386,14 @@ class TrackInterpolation
308386

309387
private:
310388
static constexpr float sFloatEps{1.e-7f}; ///< float epsilon for robust linear fitting
389+
static constexpr int NSTACKS = 4;
390+
static constexpr std::array<int, NSTACKS + 1> STACKROWS{0, 63, 97, 127, 152};
311391
// parameters + settings
312392
const SpacePointsCalibConfParam* mParams = nullptr;
393+
std::shared_ptr<o2::gpu::GPUParam> mTPCParam = nullptr;
394+
int mNHBPerTF = 32;
395+
int mNTPCOccBinLength = 16; ///< TPC occupancy bin length in TB
396+
float mNTPCOccBinLengthInv = 1.f / 16; ///< its inverse
313397
float mTPCTimeBinMUS{.2f}; ///< TPC time bin duration in us
314398
float mTPCVDriftRef = -1.; ///< TPC nominal drift speed in cm/microseconds
315399
float mTPCDriftTimeOffsetRef = 0.; ///< TPC nominal (e.g. at the start of run) drift time bias in cm/mus
@@ -348,6 +432,7 @@ class TrackInterpolation
348432
std::vector<TrackDataCompact> mTrackDataCompact{}; ///< required to connect each residual to a global track
349433
std::vector<TrackDataExtended> mTrackDataExtended{}; ///< full tracking information for debugging
350434
std::vector<UnbinnedResid> mClRes{}; ///< residuals for each available TPC cluster of all tracks
435+
std::vector<DetInfoResid> mDetInfoRes{}; ///< packed detector info associated with each residual
351436
std::vector<TrackData> mTrackDataUnfiltered{}; ///< same as mTrackData, but for all tracks before outlier filtering
352437
std::vector<TPCClusterResiduals> mClResUnfiltered{}; ///< same as mClRes, but for all residuals before outlier filtering
353438

0 commit comments

Comments
 (0)