Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 8 additions & 84 deletions Common/TableProducer/fwdtrackPropagation.cxx
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
// All rights not expressly granted are reserved.
Expand All @@ -13,7 +13,7 @@
/// \brief Common task to produce propagated forward tracks
/// \author Maurice Coquet <maurice.louis.coquet@cern.ch>
/// \author Luca Micheletti <luca.micheletti@cern.ch>
/// \author Daiki Sekihata <daiki.sekihata@cern.ch>

Check warning on line 16 in Common/TableProducer/fwdtrackPropagation.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[doc/file]

Documentation for \file is missing, incorrect or misplaced.

#include <string>
#include <map>
Expand Down Expand Up @@ -70,14 +70,11 @@
Configurable<float> maxPDCAforSmallR{"maxPDCAforSmallR", 594.f, "max. pDCA for small R at absorber end"};
Configurable<float> maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 50.f, "max. chi2 for MCH-MFT matching"};
Configurable<float> maxChi2SA{"maxChi2SA", 1e+6, "max. chi2 for standalone muon"};
Configurable<float> maxChi2GL{"maxChi2GL", 1e+6, "max. chi2 for global muon"};
Configurable<float> maxChi2GL{"maxChi2GL", 50.f, "max. chi2 for global muon"};
Configurable<bool> refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"};
Configurable<bool> applyDEtaDPhi{"cfgApplyDEtaDPhi", false, "flag to apply deta-dphi elliptic cut"};
Configurable<float> minDEta{"minDEta", 0.1, "min deta between MFT-MCH-MID and its attached MID-MCH at PV"};
Configurable<float> minDPhi{"minDPhi", 0.1, "min dphi between MFT-MCH-MID and its attached MID-MCH at PV"};

HistogramRegistry fRegistry{"fRegistry"};
static constexpr std::string_view muon_types[5] = {"MFTMCHMID/", "MFTMCHMIDOtherMatch/", "MFTMCH/", "MCHMID/", "MCH/"};

Check warning on line 77 in Common/TableProducer/fwdtrackPropagation.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[name/function-variable]

Use lowerCamelCase for names of functions and variables.

void init(o2::framework::InitContext&)
{
Expand Down Expand Up @@ -130,8 +127,8 @@

fRegistry.add("MFTMCHMID/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{100, 0.0f, 10}}, false);
fRegistry.add("MFTMCHMID/hRelDiffPt", "pT resolution;p_{T} (GeV/c);#Deltap_{T}/p_{T}", kTH2F, {{100, 0.0f, 10}, {200, 0, 0.2}}, false);
fRegistry.add("MFTMCHMID/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {60, -5.f, -2.f}}, false);

Check warning on line 130 in Common/TableProducer/fwdtrackPropagation.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[pi-multiple-fraction]

Use multiples/fractions of PI defined in o2::constants::math.

Check warning on line 130 in Common/TableProducer/fwdtrackPropagation.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[external-pi]

Use the PI constant (and its multiples and fractions) defined in o2::constants::math.
fRegistry.add("MFTMCHMID/hEtaPhi_MatchedMCHMID", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {60, -5.f, -2.f}}, false);

Check warning on line 131 in Common/TableProducer/fwdtrackPropagation.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[pi-multiple-fraction]

Use multiples/fractions of PI defined in o2::constants::math.

Check warning on line 131 in Common/TableProducer/fwdtrackPropagation.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[external-pi]

Use the PI constant (and its multiples and fractions) defined in o2::constants::math.
fRegistry.add("MFTMCHMID/hDiffCollId", "difference in collision index;collisionId_{TTCA} - collisionId_{MP}", kTH1F, {{41, -20.5, +20.5}}, false);
fRegistry.add("MFTMCHMID/hSign", "sign;sign", kTH1F, {{3, -1.5, +1.5}}, false);
fRegistry.add("MFTMCHMID/hNclusters", "Nclusters;Nclusters", kTH1F, {{21, -0.5f, 20.5}}, false);
Expand Down Expand Up @@ -193,89 +190,16 @@
return true;
}

template <typename TFwdTracks, typename TMFTTracks, typename TCollision, typename TTarget, typename TCandidates>
bool isBestMatch(TCollision const& collision, TTarget const& target, TCandidates const& candidates)
template <typename TCollision, typename TFwdTrack, typename TFwdTracks, typename TMFTTracks>
void fillFwdTrackTable(TCollision const& collision, TFwdTrack fwdtrack, TFwdTracks const&, TMFTTracks const&, const bool isAmbiguous)
{
std::map<int64_t, float> map_chi2MFTMCH;
for (const auto& matchedtrack : candidates) { // MFT-MCH-MID or MFT-MCH
if (matchedtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
continue;
}
o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(matchedtrack, collision, propagationPoint::kToVertex);
float eta = propmuonAtPV.getEta();
float phi = propmuonAtPV.getPhi();
if (refitGlobalMuon) {
const auto& mfttrack = matchedtrack.template matchMFTTrack_as<TMFTTracks>();
eta = mfttrack.eta();
phi = mfttrack.phi();
}
o2::math_utils::bringTo02Pi(phi);
if (eta < minEtaGL || maxEtaGL < eta) {
continue;
}

const auto& mchtrack = matchedtrack.template matchMCHTrack_as<TFwdTracks>(); // MCH-MID
o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex);
float etaMatchedMCHMID = propmuonAtPV_Matched.getEta();
float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi();
o2::math_utils::bringTo02Pi(phiMatchedMCHMID);

float deta = etaMatchedMCHMID - eta;
float dphi = phiMatchedMCHMID - phi;
o2::math_utils::bringToPMPi(dphi);
if (applyDEtaDPhi && std::sqrt(std::pow(deta / minDEta, 2) + std::pow(dphi / minDPhi, 2)) > 1.f) {
continue;
}

if (matchedtrack.chi2() < 0.f || maxChi2GL < matchedtrack.chi2()) {
continue;
}

float rAtAbsorberEnd = matchedtrack.rAtAbsorberEnd(); // this works only for GlobalMuonTrack
if (rAtAbsorberEnd < minRabsGL || maxRabs < rAtAbsorberEnd) {
continue;
}
o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(matchedtrack, collision, propagationPoint::kToDCA);
float dcaX = propmuonAtDCA.getX() - collision.posX();
float dcaY = propmuonAtDCA.getY() - collision.posY();
float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY);
if (maxDCAxy < dcaXY) {
continue;
}

o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToDCA);
float dcaX_Matched = propmuonAtDCA_Matched.getX() - collision.posX();
float dcaY_Matched = propmuonAtDCA_Matched.getY() - collision.posY();
float dcaXY_Matched = std::sqrt(dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched);
float pDCA = mchtrack.p() * dcaXY_Matched;

if (rAtAbsorberEnd < midRabs ? pDCA > maxPDCAforSmallR : pDCA > maxPDCAforLargeR) {
continue;
}

map_chi2MFTMCH[matchedtrack.globalIndex()] = matchedtrack.chi2MatchMCHMFT();
}
if (map_chi2MFTMCH.begin()->first != target.globalIndex()) { // search for minimum matching chi2
map_chi2MFTMCH.clear();
return false;
}
map_chi2MFTMCH.clear();
if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && (fwdtrack.chi2MatchMCHMFT() > maxMatchingChi2MCHMFT || fwdtrack.chi2() > maxChi2GL)) {
return;
} // Users have to decide the best match between MFT and MCH-MID at analysis level. The same global muon is repeatedly stored.

if (target.chi2MatchMCHMFT() > maxMatchingChi2MCHMFT) {
return false;
if (fwdtrack.chi2MatchMCHMID() < 0.f) { // this should never happen. only for protection.
return;
}
return true;
}

template <typename TCollision, typename TFwdTrack, typename TFwdTracks, typename TMFTTracks>
void fillFwdTrackTable(TCollision const& collision, TFwdTrack fwdtrack, TFwdTracks const& fwdtracks, TMFTTracks const&, const bool isAmbiguous)
{
if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
const auto& matchedGlobalTracks = fwdtracks.sliceBy(perMFTTrack, fwdtrack.matchMFTTrackId()); // MFT-MCH-MID or MFT-MCH
if (!isBestMatch<TFwdTracks, TMFTTracks>(collision, fwdtrack, matchedGlobalTracks)) {
return;
}
} // find the best match between MFT and MCH-MID

o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, collision, propagationPoint::kToVertex);
o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(fwdtrack, collision, propagationPoint::kToDCA);
Expand All @@ -297,7 +221,7 @@

float dFdx = 2.f * dcaX / dcaXY;
float dFdy = 2.f * dcaY / dcaXY;
float sigma_dcaXY = std::sqrt(cXXatDCA * dFdx * dFdx + cYYatDCA * dFdy * dFdy + 2.f * cXYatDCA * dFdx * dFdy);

Check warning on line 224 in Common/TableProducer/fwdtrackPropagation.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[name/function-variable]

Use lowerCamelCase for names of functions and variables.

float pDCA = fwdtrack.p() * dcaXY;
int nClustersMFT = 0;
Expand All @@ -311,11 +235,11 @@

if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
const auto& mchtrack = fwdtrack.template matchMCHTrack_as<TFwdTracks>(); // MCH-MID
o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex);

Check warning on line 238 in Common/TableProducer/fwdtrackPropagation.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[name/function-variable]

Use lowerCamelCase for names of functions and variables.
etaMatchedMCHMID = propmuonAtPV_Matched.getEta();
phiMatchedMCHMID = propmuonAtPV_Matched.getPhi();
o2::math_utils::bringTo02Pi(phiMatchedMCHMID);
o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToDCA);

Check warning on line 242 in Common/TableProducer/fwdtrackPropagation.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[name/function-variable]

Use lowerCamelCase for names of functions and variables.
float dcaX_Matched = propmuonAtDCA_Matched.getX() - collision.posX();
float dcaY_Matched = propmuonAtDCA_Matched.getY() - collision.posY();
float dcaXY_Matched = std::sqrt(dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched);
Expand Down
Loading