@@ -1340,7 +1340,7 @@ struct AnalysisSameEventPairing {
13401340 bool fEnableMuonHistos ;
13411341 bool fEnableMuonMixingHistos ;
13421342 bool fEnableBarrelMuonHistos ;
1343- // bool fEnableBarrelMuonMixingHistos;
1343+ bool fEnableBarrelMuonMixingHistos ;
13441344
13451345 NoBinningPolicy<aod::dqanalysisflags::MixingHash> hashBin;
13461346
@@ -1355,9 +1355,10 @@ struct AnalysisSameEventPairing {
13551355 fEnableMuonHistos = context.mOptions .get <bool >(" processAllSkimmed" ) || context.mOptions .get <bool >(" processMuonOnlySkimmed" ) || context.mOptions .get <bool >(" processMuonOnlySkimmedMultExtra" ) || context.mOptions .get <bool >(" processMuonOnlySkimmedFlow" ) || context.mOptions .get <bool >(" processMixingMuonSkimmed" );
13561356 fEnableMuonMixingHistos = context.mOptions .get <bool >(" processMixingAllSkimmed" ) || context.mOptions .get <bool >(" processMixingMuonSkimmed" );
13571357 fEnableBarrelMuonHistos = context.mOptions .get <bool >(" processElectronMuonSkimmed" );
1358+ fEnableBarrelMuonMixingHistos = context.mOptions .get <bool >(" processMixingElectronMuonSkimmed" );
13581359
13591360 if (context.mOptions .get <bool >(" processDummy" )) {
1360- if (fEnableBarrelHistos || fEnableBarrelMixingHistos || fEnableMuonHistos || fEnableMuonMixingHistos || fEnableBarrelMuonHistos ) {
1361+ if (fEnableBarrelHistos || fEnableBarrelMixingHistos || fEnableMuonHistos || fEnableMuonMixingHistos || fEnableBarrelMuonHistos || fEnableBarrelMuonMixingHistos ) {
13611362 LOG (fatal) << " No other processing tasks should be enabled if the processDummy is enabled!!" ;
13621363 }
13631364 return ;
@@ -1599,7 +1600,7 @@ struct AnalysisSameEventPairing {
15991600 VarManager::SetupMatLUTFwdDCAFitter (fLUT );
16001601 }
16011602
1602- if (fEnableBarrelMuonHistos ) {
1603+ if (fEnableBarrelMuonHistos || fEnableBarrelMuonMixingHistos ) {
16031604 for (int iTrack = 0 ; iTrack < fNCutsBarrel ; ++iTrack) {
16041605 TString trackCutName = fTrackCuts [iTrack];
16051606 if (objArrayTrackCuts->FindObject (trackCutName.Data ()) == nullptr )
@@ -1618,12 +1619,12 @@ struct AnalysisSameEventPairing {
16181619 int index = iTrack * fNCutsMuon + iMuon;
16191620 fTrackMuonHistNames [index] = names;
16201621
1621- // if (fEnableBarrelMuonMixingHistos) {
1622- // names.push_back(Form("PairsBarrelMuonMEPM_ %s_%s", trackCutName.Data(), muonCutName.Data()));
1623- // names.push_back(Form("PairsBarrelMuonMEPP_ %s_%s", trackCutName.Data(), muonCutName.Data()));
1624- // names.push_back(Form("PairsBarrelMuonMEMM_ %s_%s", trackCutName.Data(), muonCutName.Data()));
1625- // histNames += Form("%s;%s;%s;", names[3].Data(), names[4].Data(), names[5].Data());
1626- // }
1622+ if (fEnableBarrelMuonMixingHistos ) {
1623+ names.push_back (Form (" PairsEleMuMEPM_ %s_%s" , trackCutName.Data (), muonCutName.Data ()));
1624+ names.push_back (Form (" PairsEleMuMEPP_ %s_%s" , trackCutName.Data (), muonCutName.Data ()));
1625+ names.push_back (Form (" PairsEleMuMEMM_ %s_%s" , trackCutName.Data (), muonCutName.Data ()));
1626+ histNames += Form (" %s;%s;%s;" , names[3 ].Data (), names[4 ].Data (), names[5 ].Data ());
1627+ }
16271628
16281629 TString cutNamesStr = fConfigCuts .pair .value ;
16291630 if (!cutNamesStr.IsNull ()) {
@@ -1635,6 +1636,12 @@ struct AnalysisSameEventPairing {
16351636 Form (" PairsEleMuSEPP_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), objArrayPair->At (iPairCut)->GetName ()),
16361637 Form (" PairsEleMuSEMM_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), objArrayPair->At (iPairCut)->GetName ())};
16371638 histNames += Form (" %s;%s;%s;" , names[0 ].Data (), names[1 ].Data (), names[2 ].Data ());
1639+ if (fEnableBarrelMuonMixingHistos ) {
1640+ names.push_back (Form (" PairsEleMuMEPM_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), objArrayPair->At (iPairCut)->GetName ()));
1641+ names.push_back (Form (" PairsEleMuMEPP_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), objArrayPair->At (iPairCut)->GetName ()));
1642+ names.push_back (Form (" PairsEleMuMEMM_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), objArrayPair->At (iPairCut)->GetName ()));
1643+ histNames += Form (" %s;%s;%s;" , names[3 ].Data (), names[4 ].Data (), names[5 ].Data ());
1644+ }
16381645 index = iTrack * (fNCutsMuon * nPairCuts) + iMuon * nPairCuts + iPairCut;
16391646 fTrackMuonHistNames [index] = names;
16401647 }
@@ -1651,10 +1658,10 @@ struct AnalysisSameEventPairing {
16511658 DefineHistograms (fHistMan , histNames.Data (), fConfigAddSEPHistogram .value .data ()); // define all histograms
16521659 if (fEnableBarrelHistos ) {
16531660 DefineHistograms (fHistMan , " PairingSEQA" , " sameevent-pairing" ); // histograms for QA of the pairing
1654- };
1661+ }
16551662 if (fEnableBarrelMixingHistos ) {
16561663 DefineHistograms (fHistMan , " PairingMEQA" , " mixedevent-pairing" ); // histograms for QA of the pairing
1657- };
1664+ }
16581665 dqhistograms::AddHistogramsFromJSON (fHistMan , fConfigAddJSONHistograms .value .c_str ()); // ad-hoc histograms via JSON
16591666 VarManager::SetUseVars (fHistMan ->GetUsedVars ()); // provide the list of required variables so that VarManager knows what to fill
16601667 fOutputList .setObject (fHistMan ->GetMainHistogramList ());
@@ -2432,6 +2439,101 @@ struct AnalysisSameEventPairing {
24322439 } // end event loop
24332440 }
24342441
2442+ template <uint32_t TEventFillMap, typename TAssoc1, typename TAssoc2, typename TTracks1, typename TTracks2>
2443+ void runEmuMixedPairing (TAssoc1 const & assocs1, TAssoc2 const & assocs2, TTracks1 const & /* tracks1*/ , TTracks2 const & /* tracks2*/ )
2444+ {
2445+ const auto & histNames = fTrackMuonHistNames ;
2446+ int sign1 = 0 ;
2447+ int sign2 = 0 ;
2448+ int nPairCuts = (fPairCuts .size () > 0 ) ? fPairCuts .size () : 1 ;
2449+ constexpr bool eventHasQvector = ((TEventFillMap & VarManager::ObjTypes::ReducedEventQvector) > 0 );
2450+ constexpr bool eventHasQvectorCentr = ((TEventFillMap & VarManager::ObjTypes::CollisionQvect) > 0 );
2451+
2452+ for (auto & a1 : assocs1) {
2453+ if (!(a1.isBarrelSelected_raw () & fTrackFilterMask )) {
2454+ continue ;
2455+ }
2456+ for (auto & a2 : assocs2) {
2457+ if (!(a2.isMuonSelected_raw () & fMuonFilterMask )) {
2458+ continue ;
2459+ }
2460+
2461+ auto t1 = a1.template reducedtrack_as <TTracks1>();
2462+ auto t2 = a2.template reducedmuon_as <TTracks2>();
2463+ sign1 = t1.sign ();
2464+ sign2 = t2.sign ();
2465+
2466+ VarManager::FillPairME<TEventFillMap, VarManager::kElectronMuon >(t1, t2);
2467+ if constexpr (eventHasQvector) {
2468+ VarManager::FillPairVn<VarManager::kElectronMuon >(t1, t2);
2469+ }
2470+ if constexpr (eventHasQvectorCentr) {
2471+ VarManager::FillPairVn<TEventFillMap, VarManager::kElectronMuon >(t1, t2);
2472+ }
2473+
2474+ for (int iTrack = 0 ; iTrack < fNCutsBarrel ; ++iTrack) {
2475+ if (!(a1.isBarrelSelected_raw () & (1u << iTrack))) {
2476+ continue ;
2477+ }
2478+ for (int iMuon = 0 ; iMuon < fNCutsMuon ; ++iMuon) {
2479+ if (!(a2.isMuonSelected_raw () & (1u << iMuon))) {
2480+ continue ;
2481+ }
2482+ for (int iPairCut = 0 ; iPairCut < nPairCuts; ++iPairCut) {
2483+ if (!fPairCuts .empty ()) {
2484+ AnalysisCompositeCut cut = fPairCuts .at (iPairCut);
2485+ if (!cut.IsSelected (VarManager::fgValues)) {
2486+ continue ;
2487+ }
2488+ }
2489+ int index = iTrack * (fNCutsMuon * nPairCuts) + iMuon * nPairCuts + iPairCut;
2490+ auto itHist = histNames.find (index);
2491+ if (itHist == histNames.end () || itHist->second .size () < 6 ) {
2492+ continue ;
2493+ }
2494+ if (sign1 * sign2 < 0 ) {
2495+ fHistMan ->FillHistClass (itHist->second [3 ].Data (), VarManager::fgValues);
2496+ } else {
2497+ if (sign1 > 0 ) {
2498+ fHistMan ->FillHistClass (itHist->second [4 ].Data (), VarManager::fgValues);
2499+ } else {
2500+ fHistMan ->FillHistClass (itHist->second [5 ].Data (), VarManager::fgValues);
2501+ }
2502+ }
2503+ } // end pair cut loop
2504+ } // end muon cut loop
2505+ } // end barrel cut loop
2506+ }
2507+ }
2508+ }
2509+
2510+ template <uint32_t TEventFillMap, typename TEvents, typename TTrackAssocs, typename TTracks, typename TMuonAssocs, typename TMuons>
2511+ void runEmuSameSideMixing (TEvents& events, Preslice<TTrackAssocs>& preslice1, TTrackAssocs const & assocs1, TTracks const & tracks1,
2512+ Preslice<TMuonAssocs>& preslice2, TMuonAssocs const & assocs2, TMuons const & tracks2)
2513+ {
2514+ events.bindExternalIndices (&assocs1);
2515+ events.bindExternalIndices (&assocs2);
2516+ int mixingDepth = fConfigMixingDepth .value ;
2517+ for (auto & [event1, event2] : selfCombinations (hashBin, mixingDepth, -1 , events, events)) {
2518+ VarManager::ResetValues (0 , VarManager::kNVars );
2519+ VarManager::FillEvent<TEventFillMap>(event1, VarManager::fgValues);
2520+
2521+ auto groupedAssocs1 = assocs1.sliceBy (preslice1, event1.globalIndex ());
2522+ groupedAssocs1.bindExternalIndices (&events);
2523+ if (groupedAssocs1.size () == 0 ) {
2524+ continue ;
2525+ }
2526+
2527+ auto groupedAssocs2 = assocs2.sliceBy (preslice2, event2.globalIndex ());
2528+ groupedAssocs2.bindExternalIndices (&events);
2529+ if (groupedAssocs2.size () == 0 ) {
2530+ continue ;
2531+ }
2532+
2533+ runEmuMixedPairing<TEventFillMap>(groupedAssocs1, groupedAssocs2, tracks1, tracks2);
2534+ } // end event loop
2535+ }
2536+
24352537 void processAllSkimmed (MyEventsVtxCovSelected const & events,
24362538 soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts, aod::Prefilter> const & barrelAssocs, MyBarrelTracksWithCovWithAmbiguities const & barrelTracks,
24372539 soa::Join<aod::ReducedMuonsAssoc, aod::MuonTrackCuts> const & muonAssocs, MyMuonTracksWithCovWithAmbiguities const & muons)
@@ -2546,6 +2648,13 @@ struct AnalysisSameEventPairing {
25462648 runSameSideMixing<pairTypeMuMu, gkEventFillMapWithMultExtraWithQVector>(events, muonAssocs, muons, muonAssocsPerCollision);
25472649 }
25482650
2651+ void processMixingElectronMuonSkimmed (soa::Filtered<MyEventsHashSelected>& events,
2652+ soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts> const & barrelAssocs, aod::ReducedTracks const & barrelTracks,
2653+ soa::Join<aod::ReducedMuonsAssoc, aod::MuonTrackCuts> const & muonAssocs, MyMuonTracksWithCovWithAmbiguities const & muons)
2654+ {
2655+ runEmuSameSideMixing<gkEventFillMap>(events, trackEmuAssocsPerCollision, barrelAssocs, barrelTracks, muonAssocsPerCollision, muonAssocs, muons);
2656+ }
2657+
25492658 void processDummy (MyEventsBasic&)
25502659 {
25512660 // do nothing
@@ -2568,6 +2677,7 @@ struct AnalysisSameEventPairing {
25682677 PROCESS_SWITCH (AnalysisSameEventPairing, processMixingBarrelWithQvectorCentrSkimmedNoCov, " Run barrel type mixing pairing, with skimmed tracks and with Qvector from central framework" , false );
25692678 PROCESS_SWITCH (AnalysisSameEventPairing, processMixingMuonSkimmed, " Run muon type mixing pairing, with skimmed muons" , false );
25702679 PROCESS_SWITCH (AnalysisSameEventPairing, processMixingMuonSkimmedFlow, " Run muon type mixing pairing, with skimmed muons and flow" , false );
2680+ PROCESS_SWITCH (AnalysisSameEventPairing, processMixingElectronMuonSkimmed, " Run electron-muon mixing pairing, with skimmed tracks/muons" , false );
25712681 PROCESS_SWITCH (AnalysisSameEventPairing, processDummy, " Dummy function, enabled only if none of the others are enabled" , true );
25722682};
25732683
0 commit comments