Skip to content

Commit fdac9c9

Browse files
authored
[MFT] Improved handling of MFT tracking for B=0 (#7200)
* Converting MFT classes to templates - for B=0 * Fix cluster sorting, increment MFT TrackLTF ClassDefNV * Limit cluster sorting to CA tracks * Simple MFT track fitting for B=0 Simple parameter detemination for B=0 case based on first and last track-cluster position. Proper fitting to be used once the detector is aligned. * Reduce MFT tracker verbosity * Update TrackCA.h
1 parent 787a076 commit fdac9c9

14 files changed

Lines changed: 489 additions & 370 deletions

File tree

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,10 @@ constexpr float DefClusErrorCol = o2::itsmft::SegmentationAlpide::PitchCol * 0.5
5656
constexpr float DefClusError2Row = DefClusErrorRow * DefClusErrorRow;
5757
constexpr float DefClusError2Col = DefClusErrorCol * DefClusErrorCol;
5858

59-
int loadROFrameData(const o2::itsmft::ROFRecord& rof, ROframe& events, gsl::span<const itsmft::CompClusterExt> clusters,
59+
template <typename T>
60+
int loadROFrameData(const o2::itsmft::ROFRecord& rof, ROframe<T>& events, gsl::span<const itsmft::CompClusterExt> clusters,
6061
gsl::span<const unsigned char>::iterator& pattIt, const itsmft::TopologyDictionary& dict,
61-
const dataformats::MCTruthContainer<MCCompLabel>* mClsLabels = nullptr, const o2::mft::Tracker* tracker = nullptr);
62+
const dataformats::MCTruthContainer<MCCompLabel>* mClsLabels = nullptr, const o2::mft::Tracker<T>* tracker = nullptr);
6263

6364
void convertCompactClusters(gsl::span<const itsmft::CompClusterExt> clusters,
6465
gsl::span<const unsigned char>::iterator& pattIt,

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

Lines changed: 32 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,11 @@ namespace o2
3737
namespace mft
3838
{
3939

40-
class TrackCA;
41-
class TrackLTF;
42-
40+
template <typename T>
4341
class ROframe
4442
{
4543
public:
46-
ROframe(Int_t ROframeId);
44+
ROframe(const Int_t ROframeId) : mROframeId{ROframeId} {}
4745
Int_t getROFrameId() const { return mROframeId; }
4846
Int_t getTotalClusters() const;
4947

@@ -57,31 +55,44 @@ class ROframe
5755

5856
const Int_t getClusterExternalIndex(Int_t layerId, const Int_t clusterId) const { return mClusterExternalIndices[layerId][clusterId]; }
5957

60-
std::vector<TrackLTF>& getTracksLTF();
61-
TrackLTF& getCurrentTrackLTF();
62-
63-
std::vector<TrackCA>& getTracksCA();
64-
TrackCA& getCurrentTrackCA();
65-
66-
Road& getCurrentRoad();
67-
68-
template <typename... T>
69-
void addClusterToLayer(Int_t layer, T&&... args);
58+
std::vector<T>& getTracks() { return mTracks; }
59+
T& getCurrentTrack() { return mTracks.back(); }
7060

71-
void addClusterLabelToLayer(Int_t layer, const MCCompLabel label);
72-
void addClusterExternalIndexToLayer(Int_t layer, const Int_t idx);
61+
Road& getCurrentRoad() { return mRoads.back(); }
7362

74-
void addTrackLTF() { mTracksLTF.emplace_back(); }
63+
template <typename... C>
64+
void addClusterToLayer(Int_t layer, C&&... args)
65+
{
66+
mClusters[layer].emplace_back(std::forward<C>(args)...);
67+
}
68+
void addClusterLabelToLayer(Int_t layer, const MCCompLabel label) { mClusterLabels[layer].emplace_back(label); }
69+
void addClusterExternalIndexToLayer(Int_t layer, const Int_t idx) { mClusterExternalIndices[layer].push_back(idx); }
7570

76-
void addTrackCA(const Int_t);
71+
void addTrack(bool isCA = false)
72+
{
73+
mTracks.emplace_back(isCA);
74+
}
7775

78-
void addRoad();
76+
void addRoad() { mRoads.emplace_back(); }
7977

8078
void initialize(bool fullClusterScan = false);
8179

8280
void sortClusters();
8381

84-
void clear();
82+
void clear()
83+
{
84+
85+
for (Int_t iLayer = 0; iLayer < constants::mft::LayersNumber; ++iLayer) {
86+
mClusters[iLayer].clear();
87+
mClusterLabels[iLayer].clear();
88+
mClusterExternalIndices[iLayer].clear();
89+
for (Int_t iBin = 0; iBin < constants::index_table::MaxRPhiBins; ++iBin) {
90+
mClusterBinIndexRange[iLayer][iBin] = std::pair<Int_t, Int_t>(0, -1);
91+
}
92+
}
93+
mTracks.clear();
94+
mRoads.clear();
95+
}
8596

8697
const Int_t getNClustersInLayer(Int_t layerId) const { return mClusters[layerId].size(); }
8798

@@ -91,74 +102,10 @@ class ROframe
91102
std::array<std::vector<MCCompLabel>, constants::mft::LayersNumber> mClusterLabels;
92103
std::array<std::vector<Int_t>, constants::mft::LayersNumber> mClusterExternalIndices;
93104
std::array<std::array<std::pair<Int_t, Int_t>, constants::index_table::MaxRPhiBins>, constants::mft::LayersNumber> mClusterBinIndexRange;
94-
std::vector<TrackLTF> mTracksLTF;
95-
std::vector<TrackCA> mTracksCA;
105+
std::vector<T> mTracks;
96106
std::vector<Road> mRoads;
97107
};
98108

99-
template <typename... T>
100-
void ROframe::addClusterToLayer(Int_t layer, T&&... values)
101-
{
102-
mClusters[layer].emplace_back(std::forward<T>(values)...);
103-
}
104-
105-
inline void ROframe::addClusterLabelToLayer(Int_t layer, const MCCompLabel label) { mClusterLabels[layer].emplace_back(label); }
106-
107-
inline void ROframe::addClusterExternalIndexToLayer(Int_t layer, const Int_t idx)
108-
{
109-
mClusterExternalIndices[layer].push_back(idx);
110-
}
111-
112-
inline TrackLTF& ROframe::getCurrentTrackLTF()
113-
{
114-
return mTracksLTF.back();
115-
}
116-
117-
inline std::vector<TrackLTF>& ROframe::getTracksLTF()
118-
{
119-
return mTracksLTF;
120-
}
121-
122-
inline void ROframe::addRoad()
123-
{
124-
mRoads.emplace_back();
125-
}
126-
127-
inline Road& ROframe::getCurrentRoad()
128-
{
129-
return mRoads.back();
130-
}
131-
132-
inline void ROframe::addTrackCA(const Int_t roadId)
133-
{
134-
mTracksCA.emplace_back();
135-
}
136-
137-
inline TrackCA& ROframe::getCurrentTrackCA()
138-
{
139-
return mTracksCA.back();
140-
}
141-
142-
inline std::vector<TrackCA>& ROframe::getTracksCA()
143-
{
144-
return mTracksCA;
145-
}
146-
147-
inline void ROframe::clear()
148-
{
149-
for (Int_t iLayer = 0; iLayer < constants::mft::LayersNumber; ++iLayer) {
150-
mClusters[iLayer].clear();
151-
mClusterLabels[iLayer].clear();
152-
mClusterExternalIndices[iLayer].clear();
153-
for (Int_t iBin = 0; iBin < constants::index_table::MaxRPhiBins; ++iBin) {
154-
mClusterBinIndexRange[iLayer][iBin] = std::pair<Int_t, Int_t>(0, -1);
155-
}
156-
}
157-
mTracksLTF.clear();
158-
mTracksCA.clear();
159-
mRoads.clear();
160-
}
161-
162109
} // namespace mft
163110
} // namespace o2
164111

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

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,11 @@ class TrackLTF : public TrackMFTExt
3232
{
3333
public:
3434
TrackLTF() = default;
35+
TrackLTF(const bool isCA) { setCA(isCA); }
36+
3537
TrackLTF(const TrackLTF& t) = default;
3638
~TrackLTF() = default;
39+
3740
const std::array<Float_t, constants::mft::LayersNumber>& getXCoordinates() const { return mX; }
3841
const std::array<Float_t, constants::mft::LayersNumber>& getYCoordinates() const { return mY; }
3942
const std::array<Float_t, constants::mft::LayersNumber>& getZCoordinates() const { return mZ; }
@@ -56,23 +59,35 @@ class TrackLTF : public TrackMFTExt
5659
std::array<Int_t, constants::mft::LayersNumber> mClusterId;
5760
std::array<MCCompLabel, constants::mft::LayersNumber> mMCCompLabels;
5861

59-
ClassDefNV(TrackLTF, 10);
62+
ClassDefNV(TrackLTF, 11);
6063
};
6164

6265
//_________________________________________________________________________________________________
63-
class TrackCA : public TrackLTF
66+
class TrackLTFL : public TrackLTF // A track model for B=0
6467
{
68+
using SMatrix44Sym = ROOT::Math::SMatrix<double, 4, 4, ROOT::Math::MatRepSym<double, 4>>;
69+
6570
public:
66-
TrackCA()
71+
TrackLTFL() = default;
72+
TrackLTFL(const bool isCA) { setCA(isCA); }
73+
TrackLTFL(const TrackLTFL& t) = default;
74+
~TrackLTFL() = default;
75+
76+
// Kalman filter/fitting update for linear tracks
77+
bool update(const std::array<float, 2>& p, const std::array<float, 2>& cov)
6778
{
68-
TrackLTF();
69-
this->setCA(true);
79+
// TODO
80+
return true;
7081
}
71-
TrackCA(const TrackCA& t) = default;
72-
~TrackCA() = default;
7382

7483
private:
75-
ClassDefNV(TrackCA, 10);
84+
/// Covariance matrix of track parameters, ordered as follows: <pre>
85+
/// <X,X> <Y,X> <SlopeX,X> <SlopeY,X>
86+
/// <X,Y> <Y,Y> <SlopeX,Y> <SlopeY,Y>
87+
/// <X,SlopeX> <Y,SlopeX> <SlopeX,SlopeX> <SlopeY,SlopeX>
88+
/// <X,SlopeY> <Y,SlopeY> <SlopeX,SlopeY> <SlopeY,SlopeY>
89+
SMatrix44Sym mCovariances{}; ///< \brief Covariance matrix of track parameters
90+
ClassDefNV(TrackLTFL, 0);
7691
};
7792

7893
//_________________________________________________________________________________________________
@@ -153,16 +168,17 @@ inline void TrackLTF::sort()
153168

154169
namespace framework
155170
{
171+
156172
template <typename T>
157173
struct is_messageable;
158174
template <>
159-
struct is_messageable<o2::mft::TrackCA> : std::true_type {
175+
struct is_messageable<o2::mft::TrackLTF> : std::true_type {
160176
};
161177

162178
template <typename T>
163179
struct is_messageable;
164180
template <>
165-
struct is_messageable<o2::mft::TrackLTF> : std::true_type {
181+
struct is_messageable<o2::mft::TrackLTFL> : std::true_type {
166182
};
167183

168184
} // namespace framework

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ namespace o2
2929
namespace mft
3030
{
3131

32-
/// Class to fit a track to a set of clusters
32+
/// Class to fit a forward track to a set of clusters
33+
template <typename T>
3334
class TrackFitter
3435
{
3536

@@ -50,16 +51,16 @@ class TrackFitter
5051
void setVerbosity(float v) { mVerbose = v; }
5152
void setTrackModel(float m) { mTrackModel = m; }
5253

53-
bool initTrack(TrackLTF& track, bool outward = false);
54-
bool fit(TrackLTF& track, bool outward = false);
54+
bool initTrack(T& track, bool outward = false);
55+
bool fit(T& track, bool outward = false);
5556

5657
/// Return the maximum chi2 above which the track can be considered as abnormal
5758
static constexpr double getMaxChi2() { return SMaxChi2; }
5859

5960
private:
60-
bool propagateToZ(TrackLTF& track, double z);
61-
bool propagateToNextClusterWithMCS(TrackLTF& track, double z, int& startingLayerID, const int& newLayerID);
62-
bool computeCluster(TrackLTF& track, int cluster, int& startingLayerID);
61+
bool propagateToZ(T& track, double z);
62+
bool propagateToNextClusterWithMCS(T& track, double z, int& startingLayerID, const int& newLayerID);
63+
bool computeCluster(T& track, int cluster, int& startingLayerID);
6364

6465
bool mFieldON = true;
6566
Float_t mBZField; // kiloGauss.
@@ -71,7 +72,8 @@ class TrackFitter
7172
};
7273

7374
// Functions to estimate momentum and charge from track curvature
74-
Double_t invQPtFromFCF(const TrackLTF& track, Double_t bFieldZ, Double_t& chi2);
75+
template <typename T>
76+
Double_t invQPtFromFCF(const T& track, Double_t bFieldZ, Double_t& chi2);
7577
Bool_t LinearRegression(Int_t nVal, std::vector<double>& xVal, std::vector<double>& yVal, std::vector<double>& yErr, Double_t& a, Double_t& ae, Double_t& b, Double_t& be);
7678

7779
} // namespace mft

0 commit comments

Comments
 (0)