Skip to content

Commit 82b4f7b

Browse files
f3schBenedikt Volkel
authored andcommitted
AOD: Add TPC time0 option B (#13131)
* AOD: Add TPC time0 option B Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch> * AOD: skip call to truncateFloat if tpc-only track Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch> * AOD: store t0 wrt to BC of assoc. collision Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch> * AOD: Also store used bcOfTimeRef Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch> --------- Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch> (cherry picked from commit 08d9479)
1 parent bd74dc3 commit 82b4f7b

File tree

4 files changed

+101
-10
lines changed

4 files changed

+101
-10
lines changed

Detectors/AOD/include/AODProducerWorkflow/AODProducerWorkflowSpec.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,7 @@ class AODProducerWorkflowDPL : public Task
389389
float trackTimeRes = -999.f;
390390
int diffBCRef = 0; // offset of time reference BC from the start of the orbit
391391
int bcSlice[2] = {-1, -1};
392+
bool isTPConly = false; // not to be written out
392393
};
393394

394395
struct TrackQA {

Detectors/AOD/src/AODProducerWorkflowSpec.cxx

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,13 @@ void AODProducerWorkflowDPL::addToTracksTable(TracksCursorType& tracksCursor, Tr
321321
template <typename TracksExtraCursorType>
322322
void AODProducerWorkflowDPL::addToTracksExtraTable(TracksExtraCursorType& tracksExtraCursor, TrackExtraInfo& extraInfoHolder)
323323
{
324+
// In case of TPC-only tracks, do not truncate the time error since we encapsulate there a special encoding of
325+
// the deltaFwd/Bwd times
326+
auto trackTimeRes = extraInfoHolder.trackTimeRes;
327+
if (!extraInfoHolder.isTPConly) {
328+
trackTimeRes = truncateFloatFraction(trackTimeRes, mTrackTimeError);
329+
}
330+
324331
// extra
325332
tracksExtraCursor(truncateFloatFraction(extraInfoHolder.tpcInnerParam, mTrack1Pt),
326333
extraInfoHolder.flags,
@@ -341,7 +348,7 @@ void AODProducerWorkflowDPL::addToTracksExtraTable(TracksExtraCursorType& tracks
341348
truncateFloatFraction(extraInfoHolder.trackEtaEMCAL, mTrackPosEMCAL),
342349
truncateFloatFraction(extraInfoHolder.trackPhiEMCAL, mTrackPosEMCAL),
343350
truncateFloatFraction(extraInfoHolder.trackTime, mTrackTime),
344-
truncateFloatFraction(extraInfoHolder.trackTimeRes, mTrackTimeError));
351+
trackTimeRes);
345352
}
346353

347354
template <typename TracksQACursorType>
@@ -486,7 +493,7 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
486493
}
487494
}
488495

489-
if (extraInfoHolder.trackTimeRes < 0.f) { // failed or rejected?
496+
if (!extraInfoHolder.isTPConly && extraInfoHolder.trackTimeRes < 0.f) { // failed or rejected?
490497
LOG(warning) << "Barrel track " << trackIndex << " has no time set, rejection is not expected : time=" << extraInfoHolder.trackTime
491498
<< " timeErr=" << extraInfoHolder.trackTimeRes << " BCSlice: " << extraInfoHolder.bcSlice[0] << ":" << extraInfoHolder.bcSlice[1];
492499
continue;
@@ -2438,11 +2445,21 @@ AODProducerWorkflowDPL::TrackExtraInfo AODProducerWorkflowDPL::processBarrelTrac
24382445
extraInfoHolder.tpcNClsFindableMinusFound = tpcOrig.getNClusters() - tpcClData.found;
24392446
extraInfoHolder.tpcNClsFindableMinusCrossedRows = tpcOrig.getNClusters() - tpcClData.crossed;
24402447
extraInfoHolder.tpcNClsShared = tpcClData.shared;
2441-
if (src == GIndex::TPC) { // standalone TPC track should set its time from their timebins range
2442-
double terr = 0.5 * (tpcOrig.getDeltaTFwd() + tpcOrig.getDeltaTBwd()) * mTPCBinNS; // half-span of the interval
2443-
double t = (tpcOrig.getTime0() + 0.5 * (tpcOrig.getDeltaTFwd() - tpcOrig.getDeltaTBwd())) * mTPCBinNS; // central value
2444-
LOG(debug) << "TPC tracks t0:" << tpcOrig.getTime0() << " tbwd: " << tpcOrig.getDeltaTBwd() << " tfwd: " << tpcOrig.getDeltaTFwd() << " t: " << t << " te: " << terr;
2445-
setTrackTime(t, terr, false);
2448+
if (src == GIndex::TPC) { // standalone TPC track should set its time from their timebins range
2449+
if (needBCSlice) {
2450+
double t = (tpcOrig.getTime0() + 0.5 * (tpcOrig.getDeltaTFwd() - tpcOrig.getDeltaTBwd())) * mTPCBinNS; // central value
2451+
double terr = 0.5 * (tpcOrig.getDeltaTFwd() + tpcOrig.getDeltaTBwd()) * mTPCBinNS;
2452+
double err = mTimeMarginTrackTime + terr;
2453+
bcOfTimeRef = fillBCSlice(extraInfoHolder.bcSlice, t - err, t + err, bcsMap);
2454+
}
2455+
aod::track::extensions::TPCTimeErrEncoding p;
2456+
p.setDeltaTFwd(tpcOrig.getDeltaTFwd());
2457+
p.setDeltaTBwd(tpcOrig.getDeltaTBwd());
2458+
extraInfoHolder.trackTimeRes = p.getTimeErr();
2459+
extraInfoHolder.trackTime = float(tpcOrig.getTime0() * mTPCBinNS - bcOfTimeRef * o2::constants::lhc::LHCBunchSpacingNS);
2460+
extraInfoHolder.diffBCRef = int(bcOfTimeRef);
2461+
extraInfoHolder.isTPConly = true; // no truncation
2462+
extraInfoHolder.flags |= o2::aod::track::TrackTimeAsym;
24462463
} else if (src == GIndex::ITSTPC) { // its-tpc matched tracks have gaussian time error and the time was not set above
24472464
const auto& trITSTPC = data.getTPCITSTrack(trackIndex);
24482465
auto ts = trITSTPC.getTimeMUS();

Framework/Core/include/Framework/AnalysisDataModel.h

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,29 @@ DECLARE_SOA_DYNAMIC_COLUMN(ITSClsSizeInLayer, itsClsSizeInLayer, //! Size of the
306306
return (itsClusterSizes >> (layer * 4)) & 0xf;
307307
});
308308

309+
namespace extensions
310+
{
311+
using TPCTimeErrEncoding = o2::aod::track::extensions::TPCTimeErrEncoding;
312+
DECLARE_SOA_DYNAMIC_COLUMN(TPCDeltaTFwd, tpcDeltaTFwd, //! Delta Forward of track time in TPC time bis
313+
[](float timeErr, uint32_t trackType) -> float {
314+
if (!(trackType & TrackFlags::TrackTimeAsym)) {
315+
return TPCTimeErrEncoding::invalidValue;
316+
}
317+
TPCTimeErrEncoding enc;
318+
enc.encoding.timeErr = timeErr;
319+
return enc.getDeltaTFwd();
320+
});
321+
322+
DECLARE_SOA_DYNAMIC_COLUMN(TPCDeltaTBwd, tpcDeltaTBwd, //! Delta Backward of track time in TPC time bis
323+
[](float timeErr, uint32_t trackType) -> float {
324+
if (!(trackType & TrackFlags::TrackTimeAsym)) {
325+
return TPCTimeErrEncoding::invalidValue;
326+
}
327+
TPCTimeErrEncoding p;
328+
p.encoding.timeErr = timeErr;
329+
return p.getDeltaTBwd();
330+
});
331+
} // namespace extensions
309332
} // namespace v001
310333

311334
DECLARE_SOA_DYNAMIC_COLUMN(HasITS, hasITS, //! Flag to check if track has a ITS match
@@ -477,8 +500,8 @@ DECLARE_SOA_TABLE_FULL(StoredTracksExtra_000, "TracksExtra", "AOD", "TRACKEXTRA"
477500
DECLARE_SOA_TABLE_FULL_VERSIONED(StoredTracksExtra_001, "TracksExtra", "AOD", "TRACKEXTRA", 1, // On disk version of TracksExtra, version 1
478501
track::TPCInnerParam, track::Flags, track::ITSClusterSizes,
479502
track::TPCNClsFindable, track::TPCNClsFindableMinusFound, track::TPCNClsFindableMinusCrossedRows,
480-
track::TPCNClsShared, track::TRDPattern, track::ITSChi2NCl,
481-
track::TPCChi2NCl, track::TRDChi2, track::TOFChi2,
503+
track::TPCNClsShared, track::v001::extensions::TPCDeltaTFwd<track::TrackTimeRes, track::Flags>, track::v001::extensions::TPCDeltaTBwd<track::TrackTimeRes, track::Flags>,
504+
track::TRDPattern, track::ITSChi2NCl, track::TPCChi2NCl, track::TRDChi2, track::TOFChi2,
482505
track::TPCSignal, track::TRDSignal, track::Length, track::TOFExpMom,
483506
track::PIDForTracking<track::Flags>,
484507
track::IsPVContributor<track::Flags>,

Framework/Core/include/Framework/DataTypes.h

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
#ifndef O2_FRAMEWORK_DATATYPES_H_
1212
#define O2_FRAMEWORK_DATATYPES_H_
1313

14+
#include "CommonConstants/LHCConstants.h"
15+
1416
#include <cstdint>
17+
#include <limits>
1518

1619
namespace o2::aod::collision
1720
{
@@ -34,10 +37,11 @@ enum TrackTypeEnum : uint8_t {
3437
Run2Track = 254,
3538
Run2Tracklet = 255
3639
};
37-
enum TrackFlags {
40+
enum TrackFlags : uint32_t {
3841
TrackTimeResIsRange = 0x1, // Gaussian or range
3942
PVContributor = 0x2, // This track has contributed to the collision vertex fit
4043
OrphanTrack = 0x4, // Track has no association with any collision vertex
44+
TrackTimeAsym = 0x8, // track with an asymmetric time range
4145
// NOTE Highest 4 (29..32) bits reserved for PID hypothesis
4246
};
4347
enum TrackFlagsRun2Enum {
@@ -62,6 +66,52 @@ enum TRDTrackPattern : uint8_t {
6266
HasNeighbor = 0x40,
6367
HasCrossing = 0x80,
6468
};
69+
namespace extensions
70+
{
71+
struct TPCTimeErrEncoding {
72+
// TPC delta forward & backward packing
73+
union TPCDeltaTime {
74+
struct {
75+
uint16_t timeForward;
76+
uint16_t timeBackward;
77+
} __attribute__((packed)) deltas;
78+
float timeErr;
79+
} encoding;
80+
static_assert(sizeof(float) == 2 * sizeof(uint16_t));
81+
82+
float getTimeErr() const
83+
{
84+
return encoding.timeErr;
85+
}
86+
87+
// Use all 16 bits of uint16_t to encode delta scale with max precision
88+
// e.g., TPCTrack::mDeltaFwd * timeScaler
89+
// max range for the time deltas is 0 - <512 (1<<9) TPC time bins
90+
static constexpr float timeScaler{(1 << 16) / (1 << 9)};
91+
// bogus value to max incorrect usae immedately obvious
92+
static constexpr float invalidValue{std::numeric_limits<float>::min()};
93+
// convert TPC time bins to ns
94+
static constexpr float TPCBinNS = 8 * o2::constants::lhc::LHCBunchSpacingNS;
95+
96+
void setDeltaTFwd(float fwd)
97+
{
98+
encoding.deltas.timeForward = static_cast<uint16_t>(fwd * timeScaler);
99+
}
100+
void setDeltaTBwd(float bwd)
101+
{
102+
encoding.deltas.timeBackward = static_cast<uint16_t>(bwd * timeScaler);
103+
}
104+
105+
float getDeltaTFwd() const
106+
{
107+
return static_cast<float>(encoding.deltas.timeForward) / timeScaler * TPCBinNS;
108+
}
109+
float getDeltaTBwd() const
110+
{
111+
return static_cast<float>(encoding.deltas.timeBackward) / timeScaler * TPCBinNS;
112+
}
113+
};
114+
} // namespace extensions
65115
} // namespace o2::aod::track
66116

67117
namespace o2::aod::fwdtrack

0 commit comments

Comments
 (0)