@@ -1225,6 +1225,7 @@ struct AnalysisSameEventPairing {
12251225
12261226 Produces<aod::Dielectrons> dielectronList;
12271227 Produces<aod::Dimuons> dimuonList;
1228+ Produces<aod::ElectronMuons> electronmuonList;
12281229 Produces<aod::DielectronsExtra> dielectronsExtraList;
12291230 Produces<aod::DielectronsInfo> dielectronInfoList;
12301231 Produces<aod::DimuonsExtra> dimuonsExtraList;
@@ -1303,6 +1304,7 @@ struct AnalysisSameEventPairing {
13031304 std::map<int , std::vector<TString>> fTrackMuonHistNames ;
13041305 std::vector<AnalysisCompositeCut> fPairCuts ;
13051306 std::vector<TString> fTrackCuts ;
1307+ std::vector<TString> fMuonCuts ;
13061308 std::map<std::pair<uint32_t , uint32_t >, uint32_t > fAmbiguousPairs ;
13071309
13081310 uint32_t fTrackFilterMask ; // mask for the track cuts required in this task to be applied on the barrel cuts produced upstream
@@ -1315,6 +1317,8 @@ struct AnalysisSameEventPairing {
13151317 bool fEnableBarrelHistos ;
13161318 bool fEnableMuonHistos ;
13171319 bool fEnableMuonMixingHistos ;
1320+ bool fEnableBarrelMuonHistos ;
1321+ // bool fEnableBarrelMuonMixingHistos;
13181322
13191323 NoBinningPolicy<aod::dqanalysisflags::MixingHash> hashBin;
13201324
@@ -1327,9 +1331,10 @@ struct AnalysisSameEventPairing {
13271331 fEnableBarrelMixingHistos = context.mOptions .get <bool >(" processMixingAllSkimmed" ) || context.mOptions .get <bool >(" processMixingBarrelSkimmed" ) || context.mOptions .get <bool >(" processMixingBarrelSkimmedFlow" ) || context.mOptions .get <bool >(" processMixingBarrelWithQvectorCentrSkimmedNoCov" );
13281332 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" );
13291333 fEnableMuonMixingHistos = context.mOptions .get <bool >(" processMixingAllSkimmed" ) || context.mOptions .get <bool >(" processMixingMuonSkimmed" );
1334+ fEnableBarrelMuonHistos = context.mOptions .get <bool >(" processElectronMuonSkimmed" );
13301335
13311336 if (context.mOptions .get <bool >(" processDummy" )) {
1332- if (fEnableBarrelHistos || fEnableBarrelMixingHistos || fEnableMuonHistos || fEnableMuonMixingHistos ) {
1337+ if (fEnableBarrelHistos || fEnableBarrelMixingHistos || fEnableMuonHistos || fEnableMuonMixingHistos || fEnableBarrelMuonHistos ) {
13331338 LOG (fatal) << " No other processing tasks should be enabled if the processDummy is enabled!!" ;
13341339 }
13351340 return ;
@@ -1340,6 +1345,7 @@ struct AnalysisSameEventPairing {
13401345 TString histNames = " " ;
13411346 std::vector<TString> names;
13421347 fTrackCuts .clear ();
1348+ fMuonCuts .clear ();
13431349
13441350 // NOTE: Pair cuts are only applied on the histogram output. The produced pair tables do not have these cuts applied
13451351 TString cutNamesStr = fConfigCuts .pair .value ;
@@ -1487,6 +1493,7 @@ struct AnalysisSameEventPairing {
14871493 fNCutsMuon = objArray->GetEntries ();
14881494 for (int icut = 0 ; icut < objArray->GetEntries (); ++icut) {
14891495 TString tempStr = objArray->At (icut)->GetName ();
1496+ fMuonCuts .push_back (tempStr);
14901497 if (objArrayMuonCuts->FindObject (tempStr.Data ()) != nullptr ) {
14911498 fMuonFilterMask |= (static_cast <uint32_t >(1 ) << icut);
14921499
@@ -1569,38 +1576,47 @@ struct AnalysisSameEventPairing {
15691576 VarManager::SetupMatLUTFwdDCAFitter (fLUT );
15701577 }
15711578
1572- /* if (context.mOptions.get<bool>("processElectronMuonSkimmed") || context.mOptions.get<bool>("processAllSkimmed")) {
1573- TString cutNamesBarrel = fConfigCuts.track.value;
1574- TString cutNamesMuon = fConfigCuts.muon.value;
1575- if (!cutNamesBarrel.IsNull() && !cutNamesMuon.IsNull()) {
1576- std::unique_ptr<TObjArray> objArrayBarrel(cutNamesBarrel.Tokenize(","));
1577- std::unique_ptr<TObjArray> objArrayMuon(cutNamesMuon.Tokenize(","));
1578- if (objArrayBarrel->GetEntries() == objArrayMuon->GetEntries()) { // one must specify equal number of barrel and muon cuts
1579- for (int icut = 0; icut < objArrayBarrel->GetEntries(); ++icut) { // loop over track cuts
1580- // no pair cuts
1581- names = {
1582- Form("PairsEleMuSEPM_%s_%s", objArrayBarrel->At(icut)->GetName(), objArrayMuon->At(icut)->GetName()),
1583- Form("PairsEleMuSEPP_%s_%s", objArrayBarrel->At(icut)->GetName(), objArrayMuon->At(icut)->GetName()),
1584- Form("PairsEleMuSEMM_%s_%s", objArrayBarrel->At(icut)->GetName(), objArrayMuon->At(icut)->GetName())};
1585- histNames += Form("%s;%s;%s;", names[0].Data(), names[1].Data(), names[2].Data());
1586- fTrackMuonHistNames.push_back(names);
1587-
1588- TString cutNamesStr = fConfigCuts.pair.value;
1589- if (!cutNamesStr.IsNull()) { // if pair cuts
1590- std::unique_ptr<TObjArray> objArrayPair(cutNamesStr.Tokenize(","));
1591- for (int iPairCut = 0; iPairCut < objArrayPair->GetEntries(); ++iPairCut) { // loop over pair cuts
1592- std::vector<TString> names = {
1593- Form("PairsEleMuSEPM_%s_%s_%s", objArrayBarrel->At(icut)->GetName(), objArrayMuon->At(icut)->GetName(), objArrayPair->At(iPairCut)->GetName()),
1594- Form("PairsEleMuSEPP_%s_%s_%s", objArrayBarrel->At(icut)->GetName(), objArrayMuon->At(icut)->GetName(), objArrayPair->At(iPairCut)->GetName()),
1595- Form("PairsEleMuSEMM_%s_%s_%s", objArrayBarrel->At(icut)->GetName(), objArrayMuon->At(icut)->GetName(), objArrayPair->At(iPairCut)->GetName())};
1596- histNames += Form("%s;%s;%s;", names[0].Data(), names[1].Data(), names[2].Data());
1597- fTrackMuonHistNames.push_back(names);
1598- } // end loop (pair cuts)
1599- } // end if (pair cuts)
1600- } // end loop (track cuts)
1601- } // end if (equal number of cuts)
1602- } // end if (track cuts)
1603- }*/
1579+ if (fEnableBarrelMuonHistos ) {
1580+ for (int iTrack = 0 ; iTrack < fNCutsBarrel ; ++iTrack) {
1581+ TString trackCutName = fTrackCuts [iTrack];
1582+ if (objArrayTrackCuts->FindObject (trackCutName.Data ()) == nullptr ) continue ;
1583+
1584+ for (int iMuon = 0 ; iMuon < fNCutsMuon ; ++iMuon) {
1585+ TString muonCutName = fMuonCuts [iMuon];
1586+ if (objArrayMuonCuts->FindObject (muonCutName.Data ()) == nullptr ) continue ;
1587+
1588+ names = {
1589+ Form (" PairsEleMuSEPM_%s_%s" , trackCutName.Data (), muonCutName.Data ()),
1590+ Form (" PairsEleMuSEPP_%s_%s" , trackCutName.Data (), muonCutName.Data ()),
1591+ Form (" PairsEleMuSEMM_%s_%s" , trackCutName.Data (), muonCutName.Data ())
1592+ };
1593+ histNames += Form (" %s;%s;%s;" , names[0 ].Data (), names[1 ].Data (), names[2 ].Data ());
1594+
1595+ // if (fEnableBarrelMuonMixingHistos) {
1596+ // names.push_back(Form("PairsBarrelMuonMEPM_%s_%s", trackCutName.Data(), muonCutName.Data()));
1597+ // names.push_back(Form("PairsBarrelMuonMEPP_%s_%s", trackCutName.Data(), muonCutName.Data()));
1598+ // names.push_back(Form("PairsBarrelMuonMEMM_%s_%s", trackCutName.Data(), muonCutName.Data()));
1599+ // histNames += Form("%s;%s;%s;", names[3].Data(), names[4].Data(), names[5].Data());
1600+ // }
1601+
1602+ TString cutNamesStr = fConfigCuts .pair .value ;
1603+ if (!cutNamesStr.IsNull ()) {
1604+ std::unique_ptr<TObjArray> objArrayPair (cutNamesStr.Tokenize (" ," ));
1605+ int nPairCuts = objArrayPair->GetEntries ();
1606+ for (int iPairCut = 0 ; iPairCut < nPairCuts; ++iPairCut) {
1607+ names = {
1608+ Form (" PairsEleMuSEPM_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), objArrayPair->At (iPairCut)->GetName ()),
1609+ Form (" PairsEleMuSEPP_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), objArrayPair->At (iPairCut)->GetName ()),
1610+ Form (" PairsEleMuSEMM_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), objArrayPair->At (iPairCut)->GetName ())
1611+ };
1612+ histNames += Form (" %s;%s;%s;" , names[0 ].Data (), names[1 ].Data (), names[2 ].Data ());
1613+ int index = iTrack * (fNCutsMuon * nPairCuts) + iMuon * nPairCuts + iPairCut;
1614+ fTrackMuonHistNames [index] = names;
1615+ }
1616+ }
1617+ }
1618+ }
1619+ }
16041620
16051621 if (fConfigQA ) {
16061622 fHistMan = new HistogramManager (" analysisHistos" , " aa" , VarManager::kNVars );
@@ -2254,6 +2270,109 @@ struct AnalysisSameEventPairing {
22542270 } // end event loop
22552271 }
22562272
2273+ template <bool TTwoProngFitter, int TPairType, uint32_t TEventFillMap, uint32_t TTrackFillMap, uint32_t TMuonFillMap, typename TEvents, typename TTrackAssocs, typename TTracks, typename TMuonAssocs, typename TMuons>
2274+ void runEmuSameEventPairing (TEvents const & events, Preslice<TTrackAssocs>& preslice1, TTrackAssocs const & assocs1, TTracks const & /* tracks1*/ , Preslice<TMuonAssocs>& preslice2, TMuonAssocs const & assocs2, TMuons const & /* tracks2*/ )
2275+ {
2276+ if (events.size () > 0 ) {
2277+ if (fCurrentRun != events.begin ().runNumber ()) {
2278+ initParamsFromCCDB (events.begin ().timestamp (), events.begin ().runNumber (), TTwoProngFitter);
2279+ fCurrentRun = events.begin ().runNumber ();
2280+ }
2281+ }
2282+
2283+ const auto & histNames = fTrackMuonHistNames ;
2284+ int nPairCuts = (fPairCuts .size () > 0 ) ? fPairCuts .size () : 1 ;
2285+
2286+ electronmuonList.reserve (1 );
2287+
2288+ uint32_t twoTrackFilter = 0 ;
2289+ int sign1 = 0 ;
2290+ int sign2 = 0 ;
2291+
2292+ constexpr bool eventHasQvector = ((TEventFillMap & VarManager::ObjTypes::ReducedEventQvector) > 0 );
2293+ constexpr bool eventHasQvectorCentr = ((TEventFillMap & VarManager::ObjTypes::CollisionQvect) > 0 );
2294+
2295+ for (auto & event : events) {
2296+ if (!event.isEventSelected_bit (0 )) continue ;
2297+ if (fConfigCuts .event && event.isEventSelected_bit (2 )) continue ;
2298+
2299+ VarManager::ResetValues (0 , VarManager::kNVars );
2300+ VarManager::FillEvent<TEventFillMap>(event, VarManager::fgValues);
2301+
2302+ auto groupedAssocs1 = assocs1.sliceBy (preslice1, event.globalIndex ());
2303+ if (groupedAssocs1.size () == 0 ) continue ;
2304+ auto groupedAssocs2 = assocs2.sliceBy (preslice2, event.globalIndex ());
2305+ if (groupedAssocs2.size () == 0 ) continue ;
2306+
2307+ // Custom combination policy
2308+ for (auto & [a1, a2] : o2::soa::combinations (soa::CombinationsFullIndexPolicy (groupedAssocs1, groupedAssocs2))) {
2309+ if (!(a1.isBarrelSelected_raw () & fTrackFilterMask )) continue ;
2310+ if (!a1.isBarrelSelectedPrefilter_raw ()) continue ;
2311+ if (!(a2.isMuonSelected_raw () & fMuonFilterMask )) continue ;
2312+
2313+ auto t1 = a1.template reducedtrack_as <TTracks>();
2314+ auto t2 = a2.template reducedmuon_as <TMuons>();
2315+ sign1 = t1.sign ();
2316+ sign2 = t2.sign ();
2317+
2318+ twoTrackFilter = 0 ;
2319+ int minCuts = std::min (fNCutsBarrel , fNCutsMuon );
2320+ for (int i = 0 ; i < minCuts; ++i) {
2321+ if ((a1.isBarrelSelected_raw () & (1u << i)) && (a2.isMuonSelected_raw () & (1u << i))) {
2322+ twoTrackFilter |= (1u << i);
2323+ }
2324+ }
2325+ if (t1.barrelAmbiguityInBunch () > 1 ) twoTrackFilter |= (1u << 28 );
2326+ if (t1.barrelAmbiguityOutOfBunch () > 1 ) twoTrackFilter |= (1u << 30 );
2327+ if (t2.muonAmbiguityInBunch () > 1 ) twoTrackFilter |= (1u << 29 );
2328+ if (t2.muonAmbiguityOutOfBunch () > 1 ) twoTrackFilter |= (1u << 31 );
2329+
2330+ VarManager::FillPair<VarManager::kElectronMuon , TTrackFillMap>(t1, t2);
2331+ if (fConfigOptions .propTrack ) {
2332+ VarManager::FillPairCollision<VarManager::kElectronMuon , TTrackFillMap>(event, t1, t2);
2333+ }
2334+ if constexpr (eventHasQvector) {
2335+ VarManager::FillPairVn<VarManager::kElectronMuon >(t1, t2);
2336+ }
2337+ if constexpr (eventHasQvectorCentr) {
2338+ VarManager::FillPairVn<TEventFillMap, VarManager::kElectronMuon >(t1, t2);
2339+ }
2340+
2341+ electronmuonList (event.globalIndex (), VarManager::fgValues[VarManager::kMass ],
2342+ VarManager::fgValues[VarManager::kPt ], VarManager::fgValues[VarManager::kEta ], VarManager::fgValues[VarManager::kPhi ],
2343+ t1.sign () + t2.sign (), twoTrackFilter, 0 );
2344+
2345+ for (int iTrack = 0 ; iTrack < fNCutsBarrel ; ++iTrack) {
2346+ if (!(a1.isBarrelSelected_raw () & (1u << iTrack))) continue ;
2347+
2348+ for (int iMuon = 0 ; iMuon < fNCutsMuon ; ++iMuon) {
2349+ if (!(a2.isMuonSelected_raw () & (1u << iMuon))) continue ;
2350+
2351+ for (unsigned int iPairCut = 0 ; iPairCut < (fPairCuts .empty () ? 1 : fPairCuts .size ()); iPairCut++) {
2352+ if (!fPairCuts .empty ()) {
2353+ AnalysisCompositeCut cut = fPairCuts .at (iPairCut);
2354+ if (!cut.IsSelected (VarManager::fgValues)) continue ;
2355+ }
2356+ int index = iTrack * (fNCutsMuon * nPairCuts) + iMuon * nPairCuts + iPairCut;
2357+ auto itHist = histNames.find (index);
2358+ if (itHist == histNames.end ()) continue ;
2359+ if (sign1 * sign2 < 0 ) { // Opposite Sign
2360+ fHistMan ->FillHistClass (histNames[index][0 ].Data (), VarManager::fgValues);
2361+ } else { // Like Sign
2362+ if (sign1 > 0 ) {
2363+ fHistMan ->FillHistClass (itHist->second [1 ].Data (), VarManager::fgValues);
2364+ } else {
2365+ fHistMan ->FillHistClass (itHist->second [2 ].Data (), VarManager::fgValues);
2366+ }
2367+ }
2368+ } // end pair cut loop
2369+ } // end muon cut loop
2370+ } // end barrel cut loop
2371+
2372+ } // end combinations loop
2373+ } // end event loop
2374+ }
2375+
22572376 void processAllSkimmed (MyEventsVtxCovSelected const & events,
22582377 soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts, aod::Prefilter> const & barrelAssocs, MyBarrelTracksWithCovWithAmbiguities const & barrelTracks,
22592378 soa::Join<aod::ReducedMuonsAssoc, aod::MuonTrackCuts> const & muonAssocs, MyMuonTracksWithCovWithAmbiguities const & muons)
@@ -2323,6 +2442,13 @@ struct AnalysisSameEventPairing {
23232442 runSameEventPairing<true , VarManager::kDecayToMuMu , gkEventFillMapWithMultExtraWithQVector, gkMuonFillMapWithCov>(events, muonAssocsPerCollision, muonAssocs, muons);
23242443 }
23252444
2445+ void processElectronMuonSkimmed (MyEventsVtxCovSelected const & events,
2446+ soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts, aod::Prefilter> const & barrelAssocs, MyBarrelTracksWithCovWithAmbiguities const & barrelTracks,
2447+ soa::Join<aod::ReducedMuonsAssoc, aod::MuonTrackCuts> const & muonAssocs, MyMuonTracksWithCovWithAmbiguities const & muons)
2448+ {
2449+ runEmuSameEventPairing<true , VarManager::kElectronMuon , gkEventFillMapWithCov, gkTrackFillMapWithCov, gkMuonFillMapWithCov>(events, trackAssocsPerCollision, muonAssocsPerCollision, barrelAssocs, barrelTracks, muonAssocs, muons);
2450+ }
2451+
23262452 void processMixingAllSkimmed (soa::Filtered<MyEventsHashSelected>& events,
23272453 soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts, aod::Prefilter> const & trackAssocs, MyBarrelTracksWithCov const & tracks,
23282454 soa::Join<aod::ReducedMuonsAssoc, aod::MuonTrackCuts> const & muonAssocs, MyMuonTracksWithCovWithAmbiguities const & muons)
@@ -2370,6 +2496,7 @@ struct AnalysisSameEventPairing {
23702496 PROCESS_SWITCH (AnalysisSameEventPairing, processMuonOnlySkimmed, " Run muon only pairing, with skimmed tracks" , false );
23712497 PROCESS_SWITCH (AnalysisSameEventPairing, processMuonOnlySkimmedMultExtra, " Run muon only pairing, with skimmed tracks" , false );
23722498 PROCESS_SWITCH (AnalysisSameEventPairing, processMuonOnlySkimmedFlow, " Run muon only pairing, with skimmed tracks and flow" , false );
2499+ PROCESS_SWITCH (AnalysisSameEventPairing, processElectronMuonSkimmed, " Run electron-muon pairing, with skimmed tracks/muons" , false );
23732500 PROCESS_SWITCH (AnalysisSameEventPairing, processMixingAllSkimmed, " Run all types of mixed pairing, with skimmed tracks/muons" , false );
23742501 PROCESS_SWITCH (AnalysisSameEventPairing, processMixingBarrelSkimmed, " Run barrel type mixing pairing, with skimmed tracks" , false );
23752502 PROCESS_SWITCH (AnalysisSameEventPairing, processMixingBarrelSkimmedFlow, " Run barrel type mixing pairing, with flow, with skimmed tracks" , false );
0 commit comments