Skip to content

Commit c318d90

Browse files
author
Maurice Coquet
committed
New muon ML skimming
1 parent 088b554 commit c318d90

File tree

5 files changed

+215
-80
lines changed

5 files changed

+215
-80
lines changed

PWGDQ/Core/MuonMatchingMlResponse.h

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,17 @@
4040
break; \
4141
}
4242

43+
// Check if the index of mCachedIndices (index associated to a FEATURE)
44+
// matches the entry in EnumInputFeatures associated to this FEATURE
45+
// if so, the inputFeatures vector is filled with the FEATURE's value
46+
// by calling the corresponding GETTER=FEATURE from track
47+
#define CHECK_AND_FILL_MUONGLOB_TRACK(FEATURE, GETTER) \
48+
case static_cast<uint8_t>(InputFeaturesMFTMuonMatch::FEATURE): { \
49+
inputFeature = muonglob.GETTER(); \
50+
break; \
51+
}
52+
53+
4354
// Check if the index of mCachedIndices (index associated to a FEATURE)
4455
// matches the entry in EnumInputFeatures associated to this FEATURE
4556
// if so, the inputFeatures vector is filled with the FEATURE's value
@@ -164,7 +175,8 @@ enum class InputFeaturesMFTMuonMatch : uint8_t {
164175
centFT0M,
165176
centFT0A,
166177
centFT0C,
167-
chi2MCHMFT
178+
chi2MCHMFT,
179+
chi2GlobMUON
168180
};
169181

170182
template <typename TypeOutputScore = float>
@@ -251,6 +263,32 @@ class MlResponseMFTMuonMatch : public MlResponse<TypeOutputScore>
251263
return inputFeature;
252264
}
253265

266+
template <typename T1, typename T2, typename T3, typename C1, typename U>
267+
float returnFeatureGlob(uint8_t idx, T1 const& muonglob, T2 const& muon, T3 const& mft, C1 const& mftcov, U const& collision)
268+
{
269+
float inputFeature = 0.;
270+
switch (idx) {
271+
CHECK_AND_FILL_MFT_TRACK(xMFT,getX);
272+
CHECK_AND_FILL_MFT_TRACK(yMFT,getY);
273+
CHECK_AND_FILL_MFT_TRACK(qOverptMFT,getInvQPt);
274+
CHECK_AND_FILL_MFT_TRACK(tglMFT,getTanl);
275+
CHECK_AND_FILL_MFT_TRACK(phiMFT,getPhi);
276+
CHECK_AND_FILL_MFT_TRACK(chi2MFT,getTrackChi2);
277+
CHECK_AND_FILL_MUON_TRACK(xMCH,getX);
278+
CHECK_AND_FILL_MUON_TRACK(yMCH,getY);
279+
CHECK_AND_FILL_MUON_TRACK(qOverptMCH,getInvQPt);
280+
CHECK_AND_FILL_MUON_TRACK(tglMCH,getTanl);
281+
CHECK_AND_FILL_MUON_TRACK(phiMCH,getPhi);
282+
CHECK_AND_FILL_MUON_TRACK(chi2MCH,getTrackChi2);
283+
CHECK_AND_FILL_MUONGLOB_TRACK(chi2MCHMFT,chi2MatchMCHMFT);
284+
CHECK_AND_FILL_MUONGLOB_TRACK(chi2GlobMUON,chi2);
285+
CHECK_AND_FILL_MFTMUON_COLLISION(posZ);
286+
}
287+
return inputFeature;
288+
}
289+
290+
291+
254292
template <typename T1>
255293
float returnFeatureTest(uint8_t idx, T1 const& muon)
256294
{
@@ -286,6 +324,18 @@ class MlResponseMFTMuonMatch : public MlResponse<TypeOutputScore>
286324
return inputFeatures;
287325
}
288326

327+
template <typename T1, typename T2, typename T3, typename C1, typename U>
328+
std::vector<float> getInputFeaturesGlob(T1 const& muonglob, T2 const& muon, T3 const& mft, C1 const& mftcov, U const& collision)
329+
{
330+
std::vector<float> inputFeatures;
331+
for (const auto& idx : MlResponse<TypeOutputScore>::mCachedIndices) {
332+
float inputFeature = returnFeatureGlob(idx, muonglob, muon, mft, mftcov, collision);
333+
inputFeatures.emplace_back(inputFeature);
334+
}
335+
return inputFeatures;
336+
}
337+
338+
289339
/// Method to get the value of variable chosen for binning
290340
/// \param track is the single track, \param collision is the collision
291341
/// \return binning variable
@@ -358,7 +408,8 @@ class MlResponseMFTMuonMatch : public MlResponse<TypeOutputScore>
358408
FILL_MAP_MFTMUON_MATCH(c1PtPhiMCH),
359409
FILL_MAP_MFTMUON_MATCH(c1PtTglMCH),
360410
FILL_MAP_MFTMUON_MATCH(c1Pt21Pt2MCH),
361-
FILL_MAP_MFTMUON_MATCH(chi2MCHMFT)};
411+
FILL_MAP_MFTMUON_MATCH(chi2MCHMFT),
412+
FILL_MAP_MFTMUON_MATCH(chi2GlobMUON)};
362413
}
363414

364415
uint8_t mCachedIndexBinning; // index correspondance between configurable and available input features

PWGDQ/Core/VarManager.cxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ std::map<TString, int> VarManager::fgVarNamesMap;
2727
bool VarManager::fgUsedVars[VarManager::kNVars] = {false};
2828
bool VarManager::fgUsedKF = false;
2929
float VarManager::fgMagField = 0.5;
30+
float VarManager::fgzMatching = -77.5;
3031
float VarManager::fgValues[VarManager::kNVars] = {0.0f};
3132
float VarManager::fgTPCInterSectorBoundary = 1.0; // cm
3233
int VarManager::fgITSROFbias = 0;

PWGDQ/Core/VarManager.h

Lines changed: 58 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -891,7 +891,8 @@ class VarManager : public TObject
891891
// Index used to set different options for Muon propagation
892892
kToVertex = 0, // propagtion to vertex by default
893893
kToDCA,
894-
kToRabs
894+
kToRabs,
895+
kToMatching
895896
};
896897

897898
static TString fgVariableNames[kNVars]; // variable names
@@ -938,6 +939,18 @@ class VarManager : public TObject
938939
fgMagField = magField;
939940
}
940941

942+
// Setup plane position for MFT-MCH matching
943+
static void SetMatchingPlane(float z)
944+
{
945+
fgzMatching = z;
946+
}
947+
948+
static float GetMatchingPlane()
949+
{
950+
return fgzMatching;
951+
}
952+
953+
941954
// Setup the 2 prong KFParticle
942955
static void SetupTwoProngKFParticle(float magField)
943956
{
@@ -1047,8 +1060,12 @@ class VarManager : public TObject
10471060
return deltaPsi;
10481061
}
10491062

1063+
template <typename T, typename C>
1064+
static o2::track::TrackParCovFwd FwdToTrackPar(const T& track, const C& cov);
10501065
template <typename T, typename C>
10511066
static o2::dataformats::GlobalFwdTrack PropagateMuon(const T& muon, const C& collision, int endPoint = kToVertex);
1067+
template <typename T, typename C>
1068+
static o2::track::TrackParCovFwd PropagateFwd(const T& track, const C& cov, float z);
10521069
template <uint32_t fillMap, typename T, typename C>
10531070
static void FillMuonPDca(const T& muon, const C& collision, float* values = nullptr);
10541071
template <uint32_t fillMap, typename T, typename C>
@@ -1208,6 +1225,7 @@ class VarManager : public TObject
12081225
static void SetVariableDependencies(); // toggle those variables on which other used variables might depend
12091226

12101227
static float fgMagField;
1228+
static float fgzMatching;
12111229
static float fgCenterOfMassEnergy; // collision energy
12121230
static float fgMassofCollidingParticle; // mass of the colliding particle
12131231
static float fgTPCInterSectorBoundary; // TPC inter-sector border size at the TPC outer radius, in cm
@@ -1252,6 +1270,19 @@ class VarManager : public TObject
12521270
ClassDef(VarManager, 4);
12531271
};
12541272

1273+
template <typename T, typename C>
1274+
o2::track::TrackParCovFwd VarManager::FwdToTrackPar(const T& track, const C& cov)
1275+
{
1276+
double chi2 = track.chi2();
1277+
SMatrix5 tpars(track.x(), track.y(), track.phi(), track.tgl(), track.signed1Pt());
1278+
std::vector<double> v1{cov.cXX(), cov.cXY(), cov.cYY(), cov.cPhiX(), cov.cPhiY(),
1279+
cov.cPhiPhi(), cov.cTglX(), cov.cTglY(), cov.cTglPhi(), cov.cTglTgl(),
1280+
cov.c1PtX(), cov.c1PtY(), cov.c1PtPhi(), cov.c1PtTgl(), cov.c1Pt21Pt2()};
1281+
SMatrix55 tcovs(v1.begin(), v1.end());
1282+
o2::track::TrackParCovFwd trackparCov{track.z(), tpars, tcovs, chi2};
1283+
return trackparCov;
1284+
}
1285+
12551286
template <typename T, typename U, typename V>
12561287
auto VarManager::getRotatedCovMatrixXX(const T& matrix, U phi, V theta)
12571288
{
@@ -1300,13 +1331,7 @@ KFPTrack VarManager::createKFPTrackFromTrack(const T& track)
13001331
template <typename T>
13011332
KFPTrack VarManager::createKFPFwdTrackFromFwdTrack(const T& muon)
13021333
{
1303-
double chi2 = muon.chi2();
1304-
SMatrix5 tpars(muon.x(), muon.y(), muon.phi(), muon.tgl(), muon.signed1Pt());
1305-
std::vector<double> v1{muon.cXX(), muon.cXY(), muon.cYY(), muon.cPhiX(), muon.cPhiY(),
1306-
muon.cPhiPhi(), muon.cTglX(), muon.cTglY(), muon.cTglPhi(), muon.cTglTgl(),
1307-
muon.c1PtX(), muon.c1PtY(), muon.c1PtPhi(), muon.c1PtTgl(), muon.c1Pt21Pt2()};
1308-
SMatrix55 tcovs(v1.begin(), v1.end());
1309-
o2::track::TrackParCovFwd trackparCov{muon.z(), tpars, tcovs, chi2};
1334+
o2::track::TrackParCovFwd trackparCov = FwdToTrackPar(muon, muon);
13101335

13111336
std::array<float, 21> trk_cov;
13121337
trackparCov.getCovXYZPxPyPzGlo(trk_cov);
@@ -1321,7 +1346,7 @@ KFPTrack VarManager::createKFPFwdTrackFromFwdTrack(const T& muon)
13211346
kfpTrack.SetCovarianceMatrix(trkcov_KF);
13221347
kfpTrack.SetCharge(muon.sign());
13231348
kfpTrack.SetNDF(muon.nClusters() - 5);
1324-
kfpTrack.SetChi2(chi2);
1349+
kfpTrack.SetChi2(muon.chi2());
13251350
return kfpTrack;
13261351
}
13271352

@@ -1340,19 +1365,13 @@ KFPVertex VarManager::createKFPVertexFromCollision(const T& collision)
13401365
template <typename T, typename C>
13411366
o2::dataformats::GlobalFwdTrack VarManager::PropagateMuon(const T& muon, const C& collision, const int endPoint)
13421367
{
1343-
double chi2 = muon.chi2();
1344-
SMatrix5 tpars(muon.x(), muon.y(), muon.phi(), muon.tgl(), muon.signed1Pt());
1345-
std::vector<double> v1{muon.cXX(), muon.cXY(), muon.cYY(), muon.cPhiX(), muon.cPhiY(),
1346-
muon.cPhiPhi(), muon.cTglX(), muon.cTglY(), muon.cTglPhi(), muon.cTglTgl(),
1347-
muon.c1PtX(), muon.c1PtY(), muon.c1PtPhi(), muon.c1PtTgl(), muon.c1Pt21Pt2()};
1348-
SMatrix55 tcovs(v1.begin(), v1.end());
1349-
o2::track::TrackParCovFwd fwdtrack{muon.z(), tpars, tcovs, chi2};
1368+
o2::track::TrackParCovFwd fwdtrack = FwdToTrackPar(muon, muon);
13501369
o2::dataformats::GlobalFwdTrack propmuon;
13511370
if (static_cast<int>(muon.trackType()) > 2) {
13521371
o2::dataformats::GlobalFwdTrack track;
1353-
track.setParameters(tpars);
1372+
track.setParameters(fwdtrack.getParameters());
13541373
track.setZ(fwdtrack.getZ());
1355-
track.setCovariances(tcovs);
1374+
track.setCovariances(fwdtrack.getCovariances());
13561375
auto mchTrack = mMatching.FwdtoMCH(track);
13571376

13581377
if (endPoint == kToVertex) {
@@ -1364,6 +1383,9 @@ o2::dataformats::GlobalFwdTrack VarManager::PropagateMuon(const T& muon, const C
13641383
if (endPoint == kToRabs) {
13651384
o2::mch::TrackExtrap::extrapToZ(mchTrack, -505.);
13661385
}
1386+
if (endPoint == kToMatching) {
1387+
o2::mch::TrackExtrap::extrapToVertexWithoutBranson(mchTrack, fgzMatching);
1388+
}
13671389

13681390
auto proptrack = mMatching.MCHtoFwd(mchTrack);
13691391
propmuon.setParameters(proptrack.getParameters());
@@ -1384,6 +1406,15 @@ o2::dataformats::GlobalFwdTrack VarManager::PropagateMuon(const T& muon, const C
13841406
return propmuon;
13851407
}
13861408

1409+
template <typename T, typename C>
1410+
o2::track::TrackParCovFwd VarManager::PropagateFwd(const T& track, const C& cov, float z)
1411+
{
1412+
o2::track::TrackParCovFwd fwdtrack = FwdToTrackPar(track, cov);
1413+
fwdtrack.propagateToZhelix(z, fgMagField);
1414+
return fwdtrack;
1415+
1416+
}
1417+
13871418
template <uint32_t fillMap, typename T, typename C>
13881419
void VarManager::FillMuonPDca(const T& muon, const C& collision, float* values)
13891420
{
@@ -1480,7 +1511,6 @@ void VarManager::FillGlobalMuonRefit(T1 const& muontrack, T2 const& mfttrack, co
14801511
values[kEta] = mfttrack.eta();
14811512
values[kPhi] = mfttrack.phi();
14821513
}
1483-
}
14841514

14851515
template <uint32_t MuonfillMap, uint32_t MFTfillMap, typename T1, typename T2, typename C, typename C2>
14861516
void VarManager::FillGlobalMuonRefitCov(T1 const& muontrack, T2 const& mfttrack, const C& collision, C2 const& mftcov, float* values)
@@ -1491,12 +1521,7 @@ void VarManager::FillGlobalMuonRefitCov(T1 const& muontrack, T2 const& mfttrack,
14911521
if constexpr ((MuonfillMap & MuonCov) > 0) {
14921522
if constexpr ((MFTfillMap & MFTCov) > 0) {
14931523
o2::dataformats::GlobalFwdTrack propmuon = PropagateMuon(muontrack, collision);
1494-
SMatrix5 tpars(mfttrack.x(), mfttrack.y(), mfttrack.phi(), mfttrack.tgl(), mfttrack.signed1Pt());
1495-
std::vector<double> v1{mftcov.cXX(), mftcov.cXY(), mftcov.cYY(), mftcov.cPhiX(), mftcov.cPhiY(),
1496-
mftcov.cPhiPhi(), mftcov.cTglX(), mftcov.cTglY(), mftcov.cTglPhi(), mftcov.cTglTgl(),
1497-
mftcov.c1PtX(), mftcov.c1PtY(), mftcov.c1PtPhi(), mftcov.c1PtTgl(), mftcov.c1Pt21Pt2()};
1498-
SMatrix55 tcovs(v1.begin(), v1.end());
1499-
o2::track::TrackParCovFwd mft{mfttrack.z(), tpars, tcovs, mfttrack.chi2()};
1524+
o2::track::TrackParCovFwd mft = FwdToTrackPar(mfttrack, mftcov);
15001525

15011526
o2::dataformats::GlobalFwdTrack globalRefit = o2::aod::fwdtrackutils::refitGlobalMuonCov(propmuon, mft);
15021527
values[kX] = globalRefit.getX();
@@ -3685,20 +3710,8 @@ void VarManager::FillPairVertexing(C const& collision, T const& t1, T const& t2,
36853710
procCode = fgFitterTwoProngBarrel.process(pars1, pars2);
36863711
} else if constexpr ((pairType == kDecayToMuMu) && muonHasCov) {
36873712
// Initialize track parameters for forward
3688-
double chi21 = t1.chi2();
3689-
double chi22 = t2.chi2();
3690-
SMatrix5 t1pars(t1.x(), t1.y(), t1.phi(), t1.tgl(), t1.signed1Pt());
3691-
std::vector<double> v1{t1.cXX(), t1.cXY(), t1.cYY(), t1.cPhiX(), t1.cPhiY(),
3692-
t1.cPhiPhi(), t1.cTglX(), t1.cTglY(), t1.cTglPhi(), t1.cTglTgl(),
3693-
t1.c1PtX(), t1.c1PtY(), t1.c1PtPhi(), t1.c1PtTgl(), t1.c1Pt21Pt2()};
3694-
SMatrix55 t1covs(v1.begin(), v1.end());
3695-
o2::track::TrackParCovFwd pars1{t1.z(), t1pars, t1covs, chi21};
3696-
SMatrix5 t2pars(t2.x(), t2.y(), t2.phi(), t2.tgl(), t2.signed1Pt());
3697-
std::vector<double> v2{t2.cXX(), t2.cXY(), t2.cYY(), t2.cPhiX(), t2.cPhiY(),
3698-
t2.cPhiPhi(), t2.cTglX(), t2.cTglY(), t2.cTglPhi(), t2.cTglTgl(),
3699-
t2.c1PtX(), t2.c1PtY(), t2.c1PtPhi(), t2.c1PtTgl(), t2.c1Pt21Pt2()};
3700-
SMatrix55 t2covs(v2.begin(), v2.end());
3701-
o2::track::TrackParCovFwd pars2{t2.z(), t2pars, t2covs, chi22};
3713+
o2::track::TrackParCovFwd pars1 = FwdToTrackPar(t1, t1);
3714+
o2::track::TrackParCovFwd pars2 = FwdToTrackPar(t2, t2);
37023715
procCode = fgFitterTwoProngFwd.process(pars1, pars2);
37033716
} else {
37043717
return;
@@ -3960,20 +3973,8 @@ void VarManager::FillPairVertexing(C const& collision, T const& t1, T const& t2,
39603973
}
39613974
if (propToSV) {
39623975
if constexpr ((pairType == kDecayToMuMu) && muonHasCov) {
3963-
double chi21 = t1.chi2();
3964-
double chi22 = t2.chi2();
3965-
SMatrix5 t1pars(t1.x(), t1.y(), t1.phi(), t1.tgl(), t1.signed1Pt());
3966-
std::vector<double> c1{t1.cXX(), t1.cXY(), t1.cYY(), t1.cPhiX(), t1.cPhiY(),
3967-
t1.cPhiPhi(), t1.cTglX(), t1.cTglY(), t1.cTglPhi(), t1.cTglTgl(),
3968-
t1.c1PtX(), t1.c1PtY(), t1.c1PtPhi(), t1.c1PtTgl(), t1.c1Pt21Pt2()};
3969-
SMatrix55 t1covs(c1.begin(), c1.end());
3970-
o2::track::TrackParCovFwd pars1{t1.z(), t1pars, t1covs, chi21};
3971-
SMatrix5 t2pars(t2.x(), t2.y(), t2.phi(), t2.tgl(), t2.signed1Pt());
3972-
std::vector<double> c2{t2.cXX(), t2.cXY(), t2.cYY(), t2.cPhiX(), t2.cPhiY(),
3973-
t2.cPhiPhi(), t2.cTglX(), t2.cTglY(), t2.cTglPhi(), t2.cTglTgl(),
3974-
t2.c1PtX(), t2.c1PtY(), t2.c1PtPhi(), t2.c1PtTgl(), t2.c1Pt21Pt2()};
3975-
SMatrix55 t2covs(c2.begin(), c2.end());
3976-
o2::track::TrackParCovFwd pars2{t2.z(), t2pars, t2covs, chi22};
3976+
o2::track::TrackParCovFwd pars1 = FwdToTrackPar(t1, t1);
3977+
o2::track::TrackParCovFwd pars2 = FwdToTrackPar(t2, t2);
39773978

39783979
auto geoMan1 = o2::base::GeometryManager::meanMaterialBudget(t1.x(), t1.y(), t1.z(), KFGeoTwoProng.GetX(), KFGeoTwoProng.GetY(), KFGeoTwoProng.GetZ());
39793980
auto geoMan2 = o2::base::GeometryManager::meanMaterialBudget(t2.x(), t2.y(), t2.z(), KFGeoTwoProng.GetX(), KFGeoTwoProng.GetY(), KFGeoTwoProng.GetZ());
@@ -4282,29 +4283,10 @@ void VarManager::FillDileptonTrackVertexing(C const& collision, T1 const& lepton
42824283
mlepton2 = o2::constants::physics::MassMuon;
42834284
mtrack = o2::constants::physics::MassMuon;
42844285

4285-
double chi21 = lepton1.chi2();
4286-
double chi22 = lepton2.chi2();
4287-
double chi23 = track.chi2();
4288-
SMatrix5 t1pars(lepton1.x(), lepton1.y(), lepton1.phi(), lepton1.tgl(), lepton1.signed1Pt());
4289-
std::vector<double> v1{lepton1.cXX(), lepton1.cXY(), lepton1.cYY(), lepton1.cPhiX(), lepton1.cPhiY(),
4290-
lepton1.cPhiPhi(), lepton1.cTglX(), lepton1.cTglY(), lepton1.cTglPhi(), lepton1.cTglTgl(),
4291-
lepton1.c1PtX(), lepton1.c1PtY(), lepton1.c1PtPhi(), lepton1.c1PtTgl(), lepton1.c1Pt21Pt2()};
4292-
SMatrix55 t1covs(v1.begin(), v1.end());
4293-
o2::track::TrackParCovFwd pars1{lepton1.z(), t1pars, t1covs, chi21};
4294-
4295-
SMatrix5 t2pars(lepton2.x(), lepton2.y(), lepton2.phi(), lepton2.tgl(), lepton2.signed1Pt());
4296-
std::vector<double> v2{lepton2.cXX(), lepton2.cXY(), lepton2.cYY(), lepton2.cPhiX(), lepton2.cPhiY(),
4297-
lepton2.cPhiPhi(), lepton2.cTglX(), lepton2.cTglY(), lepton2.cTglPhi(), lepton2.cTglTgl(),
4298-
lepton2.c1PtX(), lepton2.c1PtY(), lepton2.c1PtPhi(), lepton2.c1PtTgl(), lepton2.c1Pt21Pt2()};
4299-
SMatrix55 t2covs(v2.begin(), v2.end());
4300-
o2::track::TrackParCovFwd pars2{lepton2.z(), t2pars, t2covs, chi22};
4301-
4302-
SMatrix5 t3pars(track.x(), track.y(), track.phi(), track.tgl(), track.signed1Pt());
4303-
std::vector<double> v3{track.cXX(), track.cXY(), track.cYY(), track.cPhiX(), track.cPhiY(),
4304-
track.cPhiPhi(), track.cTglX(), track.cTglY(), track.cTglPhi(), track.cTglTgl(),
4305-
track.c1PtX(), track.c1PtY(), track.c1PtPhi(), track.c1PtTgl(), track.c1Pt21Pt2()};
4306-
SMatrix55 t3covs(v3.begin(), v3.end());
4307-
o2::track::TrackParCovFwd pars3{track.z(), t3pars, t3covs, chi23};
4286+
o2::track::TrackParCovFwd pars1 = FwdToTrackPar(lepton1, lepton1);
4287+
o2::track::TrackParCovFwd pars2 = FwdToTrackPar(lepton2, lepton2);
4288+
o2::track::TrackParCovFwd pars3 = FwdToTrackPar(track, track);
4289+
43084290
procCode = VarManager::fgFitterThreeProngFwd.process(pars1, pars2, pars3);
43094291
procCodeJpsi = VarManager::fgFitterTwoProngFwd.process(pars1, pars2);
43104292
} else if constexpr ((candidateType == kBtoJpsiEEK || candidateType == kDstarToD0KPiPi) && trackHasCov) {

0 commit comments

Comments
 (0)