Skip to content

Commit 4dc105f

Browse files
authored
Merge branch 'AliceO2Group:master' into master
2 parents 4b01793 + 6f50b7b commit 4dc105f

2 files changed

Lines changed: 76 additions & 46 deletions

File tree

PWGEM/Dilepton/DataModel/lmeeMLTables.h

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -159,31 +159,38 @@ DECLARE_SOA_COLUMN(Chi2MFTMCHMID, chi2MFTMCHMID, float); //! chi2/ndf of MFT-MC
159159
DECLARE_SOA_COLUMN(NClustersMFT, nClustersMFT, uint8_t); //!
160160
DECLARE_SOA_COLUMN(IsPrimary, isPrimary, bool); //!
161161
DECLARE_SOA_COLUMN(IsCorrectMatch, isCorrectMatch, bool); //!
162+
163+
DECLARE_SOA_COLUMN(NMFTs, nMFTs, uint16_t); //! number of MFTsa tracks per collision
162164
} // namespace emmlfwdtrack
163165

164166
DECLARE_SOA_TABLE(EMFwdTracksForML, "AOD", "EMFWDTRKML", //!
165-
o2::soa::Index<>, collision::PosZ, collision::NumContrib, mult::MultFT0C, evsel::NumTracksInTimeRange, evsel::SumAmpFT0CInTimeRange, emmltrack::HadronicRate,
166-
fwdtrack::TrackType,
167+
o2::soa::Index<>, collision::PosZ, /*collision::NumContrib,*/ mult::MultFT0C, /*evsel::NumTracksInTimeRange,*/ evsel::SumAmpFT0CInTimeRange, emmltrack::HadronicRate, emmlfwdtrack::NMFTs,
168+
// fwdtrack::TrackType,
167169

168170
emmlfwdtrack::Signed1PtMFTatMP, emmlfwdtrack::TglMFTatMP, emmlfwdtrack::PhiMFTatMP,
169-
emmlfwdtrack::Signed1PtErrMFTatMP, emmlfwdtrack::TglErrMFTatMP, emmlfwdtrack::PhiErrMFTatMP,
170171
emmlfwdtrack::XMFTatMP, emmlfwdtrack::YMFTatMP,
171-
emmlfwdtrack::XErrMFTatMP, emmlfwdtrack::YErrMFTatMP,
172172

173173
emmlfwdtrack::Signed1PtMCHMIDatMP, emmlfwdtrack::TglMCHMIDatMP, emmlfwdtrack::PhiMCHMIDatMP,
174-
emmlfwdtrack::Signed1PtErrMCHMIDatMP, emmlfwdtrack::TglErrMCHMIDatMP, emmlfwdtrack::PhiErrMCHMIDatMP,
175174
emmlfwdtrack::XMCHMIDatMP, emmlfwdtrack::YMCHMIDatMP,
176-
emmlfwdtrack::XErrMCHMIDatMP, emmlfwdtrack::YErrMCHMIDatMP,
177175

178-
// fwdtrack::FwdDcaX, fwdtrack::FwdDcaY,
179-
fwdtrack::NClusters, fwdtrack::PDca, fwdtrack::RAtAbsorberEnd,
180-
fwdtrack::Chi2MatchMCHMID, fwdtrack::Chi2MatchMCHMFT,
181-
fwdtrack::MFTClusterSizesAndTrackFlags, emmlfwdtrack::Chi2MFTMCHMID, emmlfwdtrack::Chi2MCHMID, emmlfwdtrack::Chi2MFT, emmlfwdtrack::NClustersMFT,
176+
// fwdtrack::NClusters, fwdtrack::PDca, fwdtrack::RAtAbsorberEnd,
177+
// fwdtrack::Chi2MatchMCHMID,
178+
fwdtrack::Chi2MatchMCHMFT,
179+
// fwdtrack::MFTClusterSizesAndTrackFlags, emmlfwdtrack::Chi2MFTMCHMID, emmlfwdtrack::Chi2MCHMID, emmlfwdtrack::Chi2MFT, emmlfwdtrack::NClustersMFT,
182180
mcparticle::PdgCode, emmlfwdtrack::IsPrimary, emmlfwdtrack::IsCorrectMatch, mcparticle::Pt, mcparticle::Eta, mcparticle::Phi);
183181

184182
// iterators
185183
using EMFwdTrackForML = EMFwdTracksForML::iterator;
186184

185+
DECLARE_SOA_TABLE(EMFwdTrackErrsForML, "AOD", "EMFWDTRKERRML", //! Joinable with EMFwdTracksForML
186+
emmlfwdtrack::Signed1PtErrMFTatMP, emmlfwdtrack::TglErrMFTatMP, emmlfwdtrack::PhiErrMFTatMP,
187+
emmlfwdtrack::XErrMFTatMP, emmlfwdtrack::YErrMFTatMP,
188+
emmlfwdtrack::Signed1PtErrMCHMIDatMP, emmlfwdtrack::TglErrMCHMIDatMP, emmlfwdtrack::PhiErrMCHMIDatMP,
189+
emmlfwdtrack::XErrMCHMIDatMP, emmlfwdtrack::YErrMCHMIDatMP);
190+
191+
// iterators
192+
using EMFwdTrackErrForML = EMFwdTrackErrsForML::iterator;
193+
187194
} // namespace o2::aod
188195

189196
#endif // PWGEM_DILEPTON_DATAMODEL_LMEEMLTABLES_H_

PWGEM/Dilepton/TableProducer/treeCreatorMuonML.cxx

Lines changed: 59 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ struct TreeCreatorMuonML {
7676
using MyMFTTracksMC = soa::Join<o2::aod::MFTTracks, aod::McMFTTrackLabels>;
7777
using MyMFTTrackMC = MyMFTTracksMC::iterator;
7878

79-
Produces<aod::EMFwdTracksForML> mltable;
79+
Produces<aod::EMFwdTracksForML> trackTable;
80+
Produces<aod::EMFwdTrackErrsForML> trackErrTable;
8081

8182
// Configurables
8283
Configurable<std::string> ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"};
@@ -88,6 +89,8 @@ struct TreeCreatorMuonML {
8889
Configurable<std::string> cfgZShiftPath{"cfgZShiftPath", "Users/m/mcoquet/ZShift", "CCDB path for z shift to apply to forward tracks"};
8990
Configurable<float> cfgManualZShift{"cfgManualZShift", 0, "manual z-shift for propagation of global muon to PV"};
9091
Configurable<float> cfgDownSampling{"cfgDownSampling", 1.1, "down sampling for fake matches"};
92+
Configurable<float> matchingZ{"matchingZ", -77.5, "z position where matching is performed"};
93+
Configurable<float> maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 100.f, "max. chi2 for MCH-MFT matching"};
9194

9295
struct : ConfigurableGroup {
9396
std::string prefix = "eventCutGroup";
@@ -107,14 +110,19 @@ struct TreeCreatorMuonML {
107110

108111
struct : ConfigurableGroup {
109112
std::string prefix = "glMuonCutGroup";
110-
Configurable<float> minEta{"minEta", -3.6, "min. eta acceptance for MFT-MCH-MID"};
111-
Configurable<float> maxEta{"maxEta", -2.5, "max. eta acceptance for MFT-MCH-MID"};
112-
Configurable<float> maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 100.f, "max. chi2 for MCH-MFT matching"};
113-
Configurable<float> maxChi2{"maxChi2", 20.f, "max. chi2 for global muon"};
113+
// Configurable<float> minEta{"minEta", -3.6, "min. eta acceptance for MFT-MCH-MID"};
114+
// Configurable<float> maxEta{"maxEta", -2.5, "max. eta acceptance for MFT-MCH-MID"};
115+
// Configurable<float> maxChi2{"maxChi2", 1e+10, "max. chi2 for global muon"};
114116
Configurable<bool> refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"};
115-
Configurable<float> matchingZ{"matchingZ", -77.5, "z position where matching is performed"};
116117
} glMuonCutGroup;
117118

119+
struct : ConfigurableGroup {
120+
std::string prefix = "MFTCutGroup";
121+
Configurable<float> minPt{"minPt", 0.04f, "min. pT for MFTsa to reject crazy tracks"};
122+
Configurable<float> minEta{"minEta", -4.1f, "min. eta acceptance for MFTsa to reject crazy tracks"};
123+
Configurable<float> maxEta{"maxEta", -2.0f, "max. eta acceptance for MFTsa to reject crazy tracks"};
124+
} MFTCutGroup;
125+
118126
o2::ccdb::CcdbApi ccdbApi;
119127
Service<o2::ccdb::BasicCCDBManager> ccdb;
120128
std::mt19937 engine;
@@ -198,6 +206,8 @@ struct TreeCreatorMuonML {
198206

199207
void addHistograms()
200208
{
209+
fRegistry.add("Event/hCorrFT0CvsMFT", "mult. corr. between FT0C and MFT;multFT0C;N_{MFTsa}", kTH2F, {{600, 0, 60000}, {100, 0, 10000}}, false);
210+
201211
auto hMuonType = fRegistry.add<TH1>("hMuonType", "muon type", kTH1F, {{5, -0.5f, 4.5f}}, false);
202212
hMuonType->GetXaxis()->SetBinLabel(1, "MFT-MCH-MID (global muon)");
203213
hMuonType->GetXaxis()->SetBinLabel(2, "MFT-MCH-MID (global muon other match)");
@@ -270,7 +280,7 @@ struct TreeCreatorMuonML {
270280
}
271281

272282
template <bool withMFTCov, typename TCollision, typename TFwdTrack, typename TFwdTracks, typename TMFTTracks, typename TMFTTracksCov>
273-
bool fillFwdTrackTable(TCollision const& collision, TFwdTrack const& fwdtrack, TFwdTracks const&, TMFTTracks const&, TMFTTracksCov const& mftCovs, const float hadronicRate)
283+
bool fillFwdTrackTable(TCollision const& collision, TFwdTrack const& fwdtrack, TFwdTracks const&, TMFTTracks const&, TMFTTracksCov const& mftCovs, const float hadronicRate, const uint16_t nmft)
274284
{
275285
if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
276286
return false;
@@ -284,6 +294,10 @@ struct TreeCreatorMuonML {
284294
float chi2 = fwdtrack.chi2() / (2.f * (mchtrack.nClusters() + mfttrack.nClusters()) - 5.f);
285295
float chi2mft = mfttrack.chi2() / (2.f * mfttrack.nClusters() - 5.f);
286296

297+
if (mfttrack.eta() < MFTCutGroup.minEta || MFTCutGroup.maxEta < mfttrack.eta() || mfttrack.pt() < MFTCutGroup.minPt) {
298+
return false;
299+
}
300+
287301
// auto mcParticle_MFTMCHMID = fwdtrack.template mcParticle_as<aod::McParticles>(); // this is identical to mcParticle_MCHMID
288302
auto mcParticle_MCHMID = mchtrack.template mcParticle_as<aod::McParticles>(); // this is identical to mcParticle_MFTMCHMID
289303
auto mcParticle_MFT = mfttrack.template mcParticle_as<aod::McParticles>();
@@ -299,33 +313,33 @@ struct TreeCreatorMuonML {
299313
if (fwdtrack.chi2MatchMCHMID() < 0.f) { // this should never happen. only for protection.
300314
return false;
301315
}
302-
if (fwdtrack.chi2MatchMCHMFT() < 0.f || glMuonCutGroup.maxMatchingChi2MCHMFT < fwdtrack.chi2MatchMCHMFT()) { // this should never happen. only for protection.
303-
return false;
304-
}
305-
if (fwdtrack.chi2() < 0.f || glMuonCutGroup.maxChi2 < chi2) { // this should never happen. only for protection.
316+
if (fwdtrack.chi2MatchMCHMFT() < 0.f || maxMatchingChi2MCHMFT < fwdtrack.chi2MatchMCHMFT()) {
306317
return false;
307318
}
319+
// if (fwdtrack.chi2() < 0.f || glMuonCutGroup.maxChi2 < chi2) {
320+
// return false;
321+
// }
308322
if (mfttrack.chi2() < 0.f) { // this should never happen. only for protection.
309323
return false;
310324
}
311325

312-
o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, fwdtrack, collision, propagationPoint::kToVertex, glMuonCutGroup.matchingZ, mBz, mZShift);
326+
o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, fwdtrack, collision, propagationPoint::kToVertex, matchingZ, mBz, mZShift);
313327
float pt = propmuonAtPV.getPt();
314328
float eta = propmuonAtPV.getEta();
315329
float phi = propmuonAtPV.getPhi();
316330
// o2::math_utils::bringTo02Pi(phi);
317331
phi = RecoDecay::constrainAngle(phi, 0, 1U);
318332

319-
if (eta < glMuonCutGroup.minEta || glMuonCutGroup.maxEta < eta) {
320-
return false;
321-
}
333+
// if (eta < glMuonCutGroup.minEta || glMuonCutGroup.maxEta < eta) {
334+
// return false;
335+
// }
322336

323337
float dcaX = propmuonAtPV.getX() - collision.posX();
324338
float dcaY = propmuonAtPV.getY() - collision.posY();
325339
// float dcaZ = propmuonAtPV.getZ() - collision.posZ();
326340
float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY);
327341

328-
o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToVertex, glMuonCutGroup.matchingZ, mBz, mZShift);
342+
o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToVertex, matchingZ, mBz, mZShift);
329343
// float ptMatchedMCHMID = propmuonAtPV_Matched.getPt();
330344
float etaMatchedMCHMID = propmuonAtPV_Matched.getEta();
331345
float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi();
@@ -335,7 +349,7 @@ struct TreeCreatorMuonML {
335349
pt = propmuonAtPV_Matched.getP() * std::sin(2.f * std::atan(std::exp(-eta)));
336350
}
337351

338-
o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToDCA, glMuonCutGroup.matchingZ, mBz, mZShift);
352+
o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToDCA, matchingZ, mBz, mZShift);
339353
float dcaX_Matched = propmuonAtDCA_Matched.getX() - collision.posX();
340354
float dcaY_Matched = propmuonAtDCA_Matched.getY() - collision.posY();
341355
float dcaXY_Matched = std::sqrt(dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched);
@@ -356,7 +370,7 @@ struct TreeCreatorMuonML {
356370
if constexpr (withMFTCov) {
357371
auto mfttrackcov = mftCovs.rawIteratorAt(map_mfttrackcovs[mfttrack.globalIndex()]);
358372
o2::track::TrackParCovFwd mftsaAtMP = getTrackParCovFwdShift(mfttrack, mZShift, mfttrackcov); // values at innermost update
359-
mftsaAtMP.propagateToZhelix(glMuonCutGroup.matchingZ, mBz); // propagated to matching plane
373+
mftsaAtMP.propagateToZhelix(matchingZ, mBz); // propagated to matching plane
360374
xMFTatMP = mftsaAtMP.getX();
361375
yMFTatMP = mftsaAtMP.getY();
362376
xErrMFTatMP = std::sqrt(mftsaAtMP.getSigma2X());
@@ -369,7 +383,7 @@ struct TreeCreatorMuonML {
369383
tglErrMFTatMP = std::sqrt(mftsaAtMP.getSigma2Tanl());
370384
phiErrMFTatMP = std::sqrt(mftsaAtMP.getSigma2Phi());
371385

372-
auto muonAtMP = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToMatchingPlane, glMuonCutGroup.matchingZ, mBz, mZShift); // propagated to matching plane
386+
auto muonAtMP = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToMatchingPlane, matchingZ, mBz, mZShift); // propagated to matching plane
373387
xMCHMIDatMP = muonAtMP.getX();
374388
yMCHMIDatMP = muonAtMP.getY();
375389
xErrMCHMIDatMP = std::sqrt(muonAtMP.getSigma2X());
@@ -387,24 +401,24 @@ struct TreeCreatorMuonML {
387401
float dphi = phiMatchedMCHMID - phi;
388402
o2::math_utils::bringToPMPi(dphi);
389403

390-
mltable(collision.posZ(), collision.numContrib(), collision.multFT0C(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange(), hadronicRate,
391-
fwdtrack.trackType(),
404+
trackTable(collision.posZ(), /*collision.numContrib(),*/ collision.multFT0C(), /*collision.trackOccupancyInTimeRange(),*/ collision.ft0cOccupancyInTimeRange(), hadronicRate, nmft,
405+
// fwdtrack.trackType(),
392406

393-
signed1PtMFTatMP, tglMFTatMP, phiMFTatMP,
394-
signed1PtErrMFTatMP, tglErrMFTatMP, phiErrMFTatMP,
395-
xMFTatMP, yMFTatMP,
396-
xErrMFTatMP, yErrMFTatMP,
407+
signed1PtMFTatMP, tglMFTatMP, phiMFTatMP,
408+
xMFTatMP, yMFTatMP,
397409

398-
signed1PtMCHMIDatMP, tglMCHMIDatMP, phiMCHMIDatMP,
399-
signed1PtErrMCHMIDatMP, tglErrMCHMIDatMP, phiErrMCHMIDatMP,
400-
xMCHMIDatMP, yMCHMIDatMP,
401-
xErrMCHMIDatMP, yErrMCHMIDatMP,
410+
signed1PtMCHMIDatMP, tglMCHMIDatMP, phiMCHMIDatMP,
411+
xMCHMIDatMP, yMCHMIDatMP,
402412

403-
// dcaX, dcaY,
404-
fwdtrack.nClusters(), pDCA, rAtAbsorberEnd, fwdtrack.chi2MatchMCHMID(), fwdtrack.chi2MatchMCHMFT(),
405-
mfttrack.mftClusterSizesAndTrackFlags(), chi2, mchtrack.chi2(), chi2mft, mfttrack.nClusters(),
406-
pdgCode, isPrimary, isMatched,
407-
mcParticle_MCHMID.pt(), mcParticle_MCHMID.eta(), mcParticle_MCHMID.phi());
413+
// fwdtrack.chi2MatchMCHMID(),
414+
fwdtrack.chi2MatchMCHMFT(),
415+
pdgCode, isPrimary, isMatched,
416+
mcParticle_MCHMID.pt(), mcParticle_MCHMID.eta(), mcParticle_MCHMID.phi());
417+
418+
trackErrTable(signed1PtErrMFTatMP, tglErrMFTatMP, phiErrMFTatMP,
419+
xErrMFTatMP, yErrMFTatMP,
420+
signed1PtErrMCHMIDatMP, tglErrMCHMIDatMP, phiErrMCHMIDatMP,
421+
xErrMCHMIDatMP, yErrMCHMIDatMP);
408422

409423
fRegistry.fill(HIST("hMuonType"), fwdtrack.trackType());
410424
fRegistry.fill(HIST("MFTMCHMID/hPt"), pt);
@@ -432,6 +446,7 @@ struct TreeCreatorMuonML {
432446

433447
SliceCache cache;
434448
Preslice<aod::FwdTracks> perCollision = o2::aod::fwdtrack::collisionId;
449+
Preslice<aod::MFTTracks> perCollision_MFT = o2::aod::fwdtrack::collisionId;
435450

436451
std::unordered_map<int, int> map_mfttrackcovs;
437452
void processWithMFTCov(MyCollisionsMC const& collisions, aod::BCsWithTimestamps const&, MyFwdTracksMC const& fwdtracks, MyMFTTracksMC const& mfttracks, aod::MFTTracksCov const& mftCovs, aod::McParticles const&, aod::McCollisions const&)
@@ -458,6 +473,10 @@ struct TreeCreatorMuonML {
458473

459474
float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), bc.runNumber(), irSourceForCptFetcher) * 1.e-3; // kHz
460475

476+
auto mfttracks_per_collision = mfttracks.sliceBy(perCollision_MFT, collision.globalIndex());
477+
uint16_t nmft = mfttracks_per_collision.size();
478+
fRegistry.fill(HIST("Event/hCorrFT0CvsMFT"), collision.multFT0C(), mfttracks_per_collision.size());
479+
461480
auto fwdtracks_coll = fwdtracks.sliceBy(perCollision, collision.globalIndex());
462481
for (const auto& fwdtrack : fwdtracks_coll) {
463482
if (!fwdtrack.has_mcParticle()) {
@@ -467,7 +486,7 @@ struct TreeCreatorMuonML {
467486
continue;
468487
}
469488

470-
fillFwdTrackTable<true>(collision, fwdtrack, fwdtracks, mfttracks, mftCovs, hadronicRate);
489+
fillFwdTrackTable<true>(collision, fwdtrack, fwdtracks, mfttracks, mftCovs, hadronicRate, nmft);
471490

472491
} // end of fwdtrack loop
473492
} // end of collision loop
@@ -496,6 +515,10 @@ struct TreeCreatorMuonML {
496515

497516
float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), bc.runNumber(), irSourceForCptFetcher) * 1.e-3; // kHz
498517

518+
auto mfttracks_per_collision = mfttracks.sliceBy(perCollision_MFT, collision.globalIndex());
519+
uint16_t nmft = mfttracks_per_collision.size();
520+
fRegistry.fill(HIST("Event/hCorrFT0CvsMFT"), collision.multFT0C(), mfttracks_per_collision.size());
521+
499522
auto fwdtracks_coll = fwdtracks.sliceBy(perCollision, collision.globalIndex());
500523
for (const auto& fwdtrack : fwdtracks_coll) {
501524
if (!fwdtrack.has_mcParticle()) {
@@ -505,7 +528,7 @@ struct TreeCreatorMuonML {
505528
continue;
506529
}
507530

508-
fillFwdTrackTable<false>(collision, fwdtrack, fwdtracks, mfttracks, nullptr, hadronicRate);
531+
fillFwdTrackTable<false>(collision, fwdtrack, fwdtracks, mfttracks, nullptr, hadronicRate, nmft);
509532

510533
} // end of fwdtrack loop
511534
} // end of collision loop

0 commit comments

Comments
 (0)