@@ -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