Skip to content

Commit caa7888

Browse files
Adding MFT cluster sizes and tracks flags to AO2D (#12358)
* Including MFT cluster size in AO2D * Fix clang * Minor fix in a comment * Fix clang * Fixing layer limit in setClusterSize --------- Co-authored-by: Lucamicheletti93 <luca.mike93@gmail.com>
1 parent 5091504 commit caa7888

File tree

8 files changed

+74
-13
lines changed

8 files changed

+74
-13
lines changed

DataFormats/Detectors/ITSMFT/MFT/include/DataFormatsMFT/TrackMFT.h

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,24 @@ class TrackMFT : public o2::track::TrackParCovFwd
7070
const o2::track::TrackParCovFwd& getOutParam() const { return mOutParameters; } ///< Returns track parameters fitted outwards
7171
void setOutParam(const o2::track::TrackParCovFwd parcov) { mOutParameters = parcov; } ///< Set track out parameters
7272

73+
void setClusterSize(int l, int size)
74+
{
75+
if (l >= 10) {
76+
return;
77+
}
78+
if (size > 63) {
79+
size = 63;
80+
}
81+
82+
mClusterSizes &= ~(0x3fULL << (l * 6));
83+
mClusterSizes |= (static_cast<uint64_t>(size) << (l * 6));
84+
}
85+
86+
uint64_t getClusterSizes() const
87+
{
88+
return mClusterSizes;
89+
}
90+
7391
private:
7492
Bool_t mIsCA = false; ///< Track finding method CA vs. LTF
7593

@@ -79,8 +97,9 @@ class TrackMFT : public o2::track::TrackParCovFwd
7997

8098
Double_t mSeedinvQPtFitChi2 = 0.; ///< Seed InvQPt Chi2 from FCF clusters X,Y positions
8199
Double_t mInvQPtSeed; ///< Seed InvQPt from FCF clusters X,Y positions
100+
uint64_t mClusterSizes = 0; ///< MFT cluster sizes per track
82101

83-
ClassDefNV(TrackMFT, 2);
102+
ClassDefNV(TrackMFT, 3);
84103
};
85104

86105
class TrackMFTExt : public TrackMFT
@@ -94,14 +113,28 @@ class TrackMFTExt : public TrackMFT
94113
using TrackMFT::TrackMFT; // inherit base constructors
95114

96115
int getExternalClusterIndex(int i) const { return mExtClsIndex[i]; }
116+
int getExternalClusterSize(int i) const { return mExtClsSize[i]; }
117+
int getExternalClusterLayer(int i) const { return mExtClsLayer[i]; }
97118

98119
void setExternalClusterIndex(int np, int idx)
99120
{
100121
mExtClsIndex[np] = idx;
101122
}
102123

124+
void setExternalClusterSize(int np, int clsSize)
125+
{
126+
mExtClsSize[np] = clsSize;
127+
}
128+
129+
void setExternalClusterLayer(int np, int clsLayer)
130+
{
131+
mExtClsLayer[np] = clsLayer;
132+
}
133+
103134
protected:
104135
std::array<int, MaxClusters> mExtClsIndex = {-1}; ///< External indices of associated clusters
136+
std::array<int, MaxClusters> mExtClsSize = {-1}; ///< Cluster size
137+
std::array<int, MaxClusters> mExtClsLayer = {-1}; ///< Cluster layer
105138

106139
ClassDefNV(TrackMFTExt, 1);
107140
};

Detectors/AOD/src/AODProducerWorkflowSpec.cxx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,14 +361,18 @@ void AODProducerWorkflowDPL::addToMFTTracksTable(mftTracksCursorType& mftTracksC
361361
}
362362
trackTime -= bcOfTimeRef * o2::constants::lhc::LHCBunchSpacingNS;
363363

364+
// the Cellular Automaton track-finding algorithm flag is stored in first of the 4 bits not used for the cluster size
365+
uint64_t mftClusterSizesAndTrackFlags = track.getClusterSizes();
366+
mftClusterSizesAndTrackFlags |= (track.isCA()) ? (1ULL << (60)) : 0;
367+
364368
mftTracksCursor(collisionID,
365369
track.getX(),
366370
track.getY(),
367371
truncateFloatFraction(track.getZ(), mTrackX), // for the forward tracks Z has the same role as X in barrel
368372
truncateFloatFraction(track.getPhi(), mTrackAlpha),
369373
truncateFloatFraction(track.getTanl(), mTrackTgl),
370374
truncateFloatFraction(track.getInvQPt(), mTrack1Pt),
371-
track.getNumberOfPoints(),
375+
mftClusterSizesAndTrackFlags,
372376
truncateFloatFraction(track.getTrackChi2(), mTrackChi2),
373377
truncateFloatFraction(trackTime, mTrackTime),
374378
truncateFloatFraction(trackTimeRes, mTrackTimeError));

Detectors/ITSMFT/MFT/tracking/include/MFTTracking/ROframe.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class ROframe
4747
while (layer--) {
4848
mClusters[layer].reserve(nClusters * fraction);
4949
mClusterExternalIndices[layer].reserve(nClusters * fraction);
50+
mClusterSizes[layer].reserve(nClusters * fraction);
5051
}
5152
mTracks.reserve(nClusters * fraction);
5253
}
@@ -58,6 +59,8 @@ class ROframe
5859

5960
const Int_t getClusterExternalIndex(Int_t layerId, const Int_t clusterId) const { return mClusterExternalIndices[layerId][clusterId]; }
6061

62+
const Int_t getClusterSize(Int_t layerId, const Int_t clusterId) const { return mClusterSizes[layerId][clusterId]; }
63+
6164
std::vector<T>& getTracks() { return mTracks; }
6265
T& getCurrentTrack() { return mTracks.back(); }
6366

@@ -70,6 +73,7 @@ class ROframe
7073
}
7174
void addClusterLabelToLayer(Int_t layer, const MCCompLabel label) { mClusterLabels[layer].emplace_back(label); }
7275
void addClusterExternalIndexToLayer(Int_t layer, const Int_t idx) { mClusterExternalIndices[layer].push_back(idx); }
76+
void addClusterSizeToLayer(Int_t layer, const Int_t clusterSize) { mClusterSizes[layer].push_back(clusterSize); }
7377

7478
void addTrack(bool isCA = false)
7579
{
@@ -87,6 +91,7 @@ class ROframe
8791
mClusters[iLayer].clear();
8892
mClusterLabels[iLayer].clear();
8993
mClusterExternalIndices[iLayer].clear();
94+
mClusterSizes[iLayer].clear();
9095
}
9196
mTracks.clear();
9297
mRoads.clear();
@@ -98,6 +103,7 @@ class ROframe
98103
std::array<std::vector<Cluster>, constants::mft::LayersNumber> mClusters;
99104
std::array<std::vector<MCCompLabel>, constants::mft::LayersNumber> mClusterLabels;
100105
std::array<std::vector<Int_t>, constants::mft::LayersNumber> mClusterExternalIndices;
106+
std::array<std::vector<Int_t>, constants::mft::LayersNumber> mClusterSizes;
101107
std::vector<T> mTracks;
102108
std::vector<Road> mRoads;
103109
};

Detectors/ITSMFT/MFT/tracking/include/MFTTracking/TrackCA.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class TrackLTF : public TrackMFTExt
4545
const std::array<Int_t, constants::mft::LayersNumber>& getLayers() const { return mLayer; }
4646
const std::array<Int_t, constants::mft::LayersNumber>& getClustersId() const { return mClusterId; }
4747
const std::array<MCCompLabel, constants::mft::LayersNumber>& getMCCompLabels() const { return mMCCompLabels; }
48-
void setPoint(const Cluster& cl, const Int_t layer, const Int_t clusterId, const MCCompLabel label, const Int_t extClsIndex);
48+
void setPoint(const Cluster& cl, const Int_t layer, const Int_t clusterId, const MCCompLabel label, const Int_t extClsIndex, const Int_t clsSize);
4949

5050
void sort();
5151

@@ -84,7 +84,7 @@ class TrackLTFL : public TrackLTF // A track model for B=0
8484
};
8585

8686
//_________________________________________________________________________________________________
87-
inline void TrackLTF::setPoint(const Cluster& cl, const Int_t layer, const Int_t clusterId, const MCCompLabel label, const Int_t extClsIndex)
87+
inline void TrackLTF::setPoint(const Cluster& cl, const Int_t layer, const Int_t clusterId, const MCCompLabel label, const Int_t extClsIndex, const Int_t clsSize)
8888
{
8989
auto nPoints = getNumberOfPoints();
9090
if (nPoints > 0) {
@@ -106,6 +106,8 @@ inline void TrackLTF::setPoint(const Cluster& cl, const Int_t layer, const Int_t
106106
mClusterId[nPoints] = clusterId;
107107
mMCCompLabels[nPoints] = label;
108108
setExternalClusterIndex(nPoints, extClsIndex);
109+
setExternalClusterSize(nPoints, clsSize);
110+
setExternalClusterLayer(nPoints, layer);
109111
setNumberOfPoints(nPoints + 1);
110112
}
111113

Detectors/ITSMFT/MFT/tracking/src/IOUtils.cxx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ int ioutils::loadROFrameData(const o2::itsmft::ROFRecord& rof, ROframe<T>& event
4747
auto first = rof.getFirstEntry();
4848
auto clusters_in_frame = rof.getROFData(clusters);
4949
auto nClusters = clusters_in_frame.size();
50+
int clusterSize = -999;
5051

5152
bool skip_ROF = true;
5253
auto& trackingParam = MFTTrackingParam::Instance();
@@ -69,13 +70,16 @@ int ioutils::loadROFrameData(const o2::itsmft::ROFRecord& rof, ROframe<T>& event
6970
sigmaY2 = dict->getErr2Z(pattID); // ALPIDE local Z coordinate => MFT global Y coordinate (ALPIDE columns)
7071
if (!dict->isGroup(pattID)) {
7172
locXYZ = dict->getClusterCoordinates(c);
73+
clusterSize = dict->getNpixels(pattID);
7274
} else {
7375
o2::itsmft::ClusterPattern patt(pattIt);
7476
locXYZ = dict->getClusterCoordinates(c, patt);
77+
clusterSize = patt.getNPixels();
7578
}
7679
} else {
7780
o2::itsmft::ClusterPattern patt(pattIt);
7881
locXYZ = dict->getClusterCoordinates(c, patt, false);
82+
clusterSize = patt.getNPixels();
7983
}
8084
if (skip_ROF) { // Skip filtered-out ROFs after processing pattIt
8185
clusterId++;
@@ -96,6 +100,7 @@ int ioutils::loadROFrameData(const o2::itsmft::ROFRecord& rof, ROframe<T>& event
96100
event.addClusterLabelToLayer(layer, *(mcLabels->getLabels(first + clusterId).begin()));
97101
}
98102
event.addClusterExternalIndexToLayer(layer, first + clusterId);
103+
event.addClusterSizeToLayer(layer, clusterSize);
99104
clusterId++;
100105
}
101106
return nClusters;

Detectors/ITSMFT/MFT/tracking/src/Tracker.cxx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ void Tracker<T>::findTracksLTF(ROframe<T>& event)
268268
Int_t binR_proj, binPhi_proj, bin;
269269
Int_t binIndex, clsMinIndex, clsMaxIndex, clsMinIndexS, clsMaxIndexS;
270270
Int_t extClsIndex;
271+
Int_t clsSize;
271272
Float_t dz = 0., dRCone = 1.;
272273
Float_t dR2, dR2min, dR2cut = mLTFclsR2Cut;
273274
Bool_t hasDisk[constants::mft::DisksNumber], newPoint;
@@ -395,7 +396,8 @@ void Tracker<T>::findTracksLTF(ROframe<T>& event)
395396
Cluster& cluster = event.getClustersInLayer(layer)[clsInLayer];
396397
mcCompLabel = mUseMC ? event.getClusterLabels(layer, cluster.clusterId) : MCCompLabel();
397398
extClsIndex = event.getClusterExternalIndex(layer, cluster.clusterId);
398-
event.getCurrentTrack().setPoint(cluster, layer, clsInLayer, mcCompLabel, extClsIndex);
399+
clsSize = event.getClusterSize(layer, cluster.clusterId);
400+
event.getCurrentTrack().setPoint(cluster, layer, clsInLayer, mcCompLabel, extClsIndex, clsSize);
399401
// mark the used clusters
400402
cluster.setUsed(true);
401403
}
@@ -418,6 +420,7 @@ void Tracker<T>::findTracksLTFfcs(ROframe<T>& event)
418420
Int_t binR_proj, binPhi_proj, bin;
419421
Int_t binIndex, clsMinIndex, clsMaxIndex, clsMinIndexS, clsMaxIndexS;
420422
Int_t extClsIndex;
423+
Int_t clsSize;
421424
Float_t dR2, dR2min, dR2cut = mLTFclsR2Cut;
422425
Bool_t hasDisk[constants::mft::DisksNumber], newPoint;
423426

@@ -530,7 +533,8 @@ void Tracker<T>::findTracksLTFfcs(ROframe<T>& event)
530533
Cluster& cluster = event.getClustersInLayer(layer)[clsInLayer];
531534
mcCompLabel = mUseMC ? event.getClusterLabels(layer, cluster.clusterId) : MCCompLabel();
532535
extClsIndex = event.getClusterExternalIndex(layer, cluster.clusterId);
533-
event.getCurrentTrack().setPoint(cluster, layer, clsInLayer, mcCompLabel, extClsIndex);
536+
clsSize = event.getClusterSize(layer, cluster.clusterId);
537+
event.getCurrentTrack().setPoint(cluster, layer, clsInLayer, mcCompLabel, extClsIndex, clsSize);
534538
// mark the used clusters
535539
cluster.setUsed(true);
536540
}
@@ -1069,14 +1073,17 @@ void Tracker<T>::addCellToCurrentTrackCA(const Int_t layer1, const Int_t cellId,
10691073
MCCompLabel mcCompLabel2 = mUseMC ? event.getClusterLabels(layer2, cluster2.clusterId) : MCCompLabel();
10701074

10711075
Int_t extClsIndex;
1076+
Int_t clsSize;
10721077

10731078
if (trackCA.getNumberOfPoints() == 0) {
10741079
extClsIndex = event.getClusterExternalIndex(layer2, cluster2.clusterId);
1075-
trackCA.setPoint(cluster2, layer2, clsInLayer2, mcCompLabel2, extClsIndex);
1080+
clsSize = event.getClusterSize(layer2, cluster2.clusterId);
1081+
trackCA.setPoint(cluster2, layer2, clsInLayer2, mcCompLabel2, extClsIndex, clsSize);
10761082
}
10771083

10781084
extClsIndex = event.getClusterExternalIndex(layer1, cluster1.clusterId);
1079-
trackCA.setPoint(cluster1, layer1, clsInLayer1, mcCompLabel1, extClsIndex);
1085+
clsSize = event.getClusterSize(layer2, cluster2.clusterId);
1086+
trackCA.setPoint(cluster1, layer1, clsInLayer1, mcCompLabel1, extClsIndex, clsSize);
10801087
}
10811088

10821089
//_________________________________________________________________________________________________

Detectors/ITSMFT/MFT/workflow/src/TrackerSpec.cxx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ void TrackerDPL::run(ProcessingContext& pc)
197197
int ncl = trc.getNumberOfPoints();
198198
for (int ic = 0; ic < ncl; ic++) {
199199
auto externalClusterID = trc.getExternalClusterIndex(ic);
200+
auto clusterSize = trc.getExternalClusterSize(ic);
201+
auto clusterLayer = trc.getExternalClusterLayer(ic);
202+
trc.setClusterSize(clusterLayer, clusterSize);
200203
allClusIdx.push_back(externalClusterID);
201204
}
202205
allTracks.emplace_back(trc);

Framework/Core/include/Framework/AnalysisDataModel.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,7 @@ DECLARE_SOA_COLUMN(Phi, phi, float);
506506
DECLARE_SOA_COLUMN(Tgl, tgl, float); //! TrackParFwd parameter tan(\lamba); (\lambda = 90 - \theta_{polar})
507507
DECLARE_SOA_COLUMN(Signed1Pt, signed1Pt, float); //! TrackParFwd parameter: charged inverse transverse momentum; (q/pt)
508508
DECLARE_SOA_COLUMN(NClusters, nClusters, int8_t); //! Number of clusters
509-
DECLARE_SOA_COLUMN(MFTClusterSizesAndTracksFlags, mftClusterSizesAndTrackFlags, uint64_t); //! Cluster sizes per track, stored per layer (each 6 bits). Remaining 4 bits for MFT flags
509+
DECLARE_SOA_COLUMN(MFTClusterSizesAndTrackFlags, mftClusterSizesAndTrackFlags, uint64_t); //! Cluster sizes per track, stored per layer (each 6 bits). Remaining 4 bits for MFT flags
510510
DECLARE_SOA_COLUMN(Chi2, chi2, float); //! Track chi^2
511511
DECLARE_SOA_COLUMN(PDca, pDca, float); //! PDca for MUONStandalone
512512
DECLARE_SOA_COLUMN(RAtAbsorberEnd, rAtAbsorberEnd, float); //! RAtAbsorberEnd for MUONStandalone tracks and GlobalMuonTrackstracks
@@ -563,7 +563,7 @@ namespace v001
563563
DECLARE_SOA_DYNAMIC_COLUMN(NClusters, nClusters, //! Number of MFT clusters
564564
[](uint64_t mftClusterSizesAndTrackFlags) -> int8_t {
565565
int8_t nClusters = 0;
566-
for (int layer = 0; layer < 11; layer++) {
566+
for (int layer = 0; layer < 10; layer++) {
567567
if ((mftClusterSizesAndTrackFlags >> (layer * 6)) & 0x3F) {
568568
nClusters++;
569569
}
@@ -635,7 +635,7 @@ DECLARE_SOA_TABLE_FULL(StoredMFTTracks_000, "MFTTracks", "AOD", "MFTTRACK", //!
635635
DECLARE_SOA_TABLE_FULL_VERSIONED(StoredMFTTracks_001, "MFTTracks", "AOD", "MFTTRACK", 1, //! On disk version of MFTTracks, version 1
636636
o2::soa::Index<>, fwdtrack::CollisionId,
637637
fwdtrack::X, fwdtrack::Y, fwdtrack::Z, fwdtrack::Phi, fwdtrack::Tgl,
638-
fwdtrack::Signed1Pt, fwdtrack::v001::NClusters<fwdtrack::MFTClusterSizesAndTracksFlags>, fwdtrack::MFTClusterSizesAndTracksFlags, fwdtrack::IsCA<fwdtrack::MFTClusterSizesAndTracksFlags>,
638+
fwdtrack::Signed1Pt, fwdtrack::v001::NClusters<fwdtrack::MFTClusterSizesAndTrackFlags>, fwdtrack::MFTClusterSizesAndTrackFlags, fwdtrack::IsCA<fwdtrack::MFTClusterSizesAndTrackFlags>,
639639
fwdtrack::Px<fwdtrack::Pt, fwdtrack::Phi>,
640640
fwdtrack::Py<fwdtrack::Pt, fwdtrack::Phi>,
641641
fwdtrack::Pz<fwdtrack::Pt, fwdtrack::Tgl>,
@@ -652,8 +652,8 @@ DECLARE_SOA_EXTENDED_TABLE(MFTTracks_001, StoredMFTTracks_001, "MFTTRACK", //! A
652652
aod::fwdtrack::Eta,
653653
aod::fwdtrack::P);
654654

655-
using MFTTracks = MFTTracks_000;
656-
using StoredMFTTracks = StoredMFTTracks_000;
655+
using MFTTracks = MFTTracks_001;
656+
using StoredMFTTracks = StoredMFTTracks_001;
657657

658658
using MFTTrack = MFTTracks::iterator;
659659

@@ -1549,6 +1549,7 @@ DECLARE_EQUIVALENT_FOR_INDEX(aod::StoredTracksExtra_000, aod::StoredTracksExtra_
15491549
DECLARE_EQUIVALENT_FOR_INDEX(aod::HMPID_000, aod::HMPID_001);
15501550
DECLARE_EQUIVALENT_FOR_INDEX(aod::StoredMFTTracks, aod::StoredMFTTracks_000);
15511551
DECLARE_EQUIVALENT_FOR_INDEX(aod::StoredMFTTracks, aod::StoredMFTTracks_001);
1552+
DECLARE_EQUIVALENT_FOR_INDEX(aod::StoredMFTTracks_000, aod::StoredMFTTracks_001);
15521553
} // namespace soa
15531554

15541555
namespace aod

0 commit comments

Comments
 (0)