@@ -1325,6 +1325,7 @@ struct AnalysisSameEventPairing {
13251325 Produces<aod::DileptonsInfo> dileptonInfoList;
13261326 Produces<aod::JPsieeCandidates> PromptNonPromptSepTable;
13271327 Produces<aod::OniaMCTruth> MCTruthTableEffi;
1328+ Produces<aod::DileptonPolarization> dileptonPolarList;
13281329
13291330 o2::base::MatLayerCylSet* fLUT = nullptr;
13301331 int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc.
@@ -1335,7 +1336,7 @@ struct AnalysisSameEventPairing {
13351336 Configurable<std::string> track{"cfgTrackCuts", "jpsiO2MCdebugCuts2", "Comma separated list of barrel track cuts"};
13361337 Configurable<std::string> muon{"cfgMuonCuts", "", "Comma separated list of muon cuts"};
13371338 Configurable<std::string> pair{"cfgPairCuts", "", "Comma separated list of pair cuts, !!! Use only if you know what you are doing, otherwise leave empty"};
1338- Configurable<std::string> MCgenAcc{"cfgMCGenAccCut ", "", "cut for MC generated particles acceptance"};
1339+ Configurable<std::string> MCgenAcc{"cfgMCGenAccCuts ", "", "Comma separated list of MC generated particles acceptance cuts, !!! Use only if you know what you are doing, otherwise leave empty "};
13391340 // TODO: Add pair cuts via JSON
13401341 } fConfigCuts;
13411342
@@ -1354,6 +1355,7 @@ struct AnalysisSameEventPairing {
13541355 Configurable<bool> useRemoteField{"cfgUseRemoteField", false, "Chose whether to fetch the magnetic field from ccdb or set it manually"};
13551356 Configurable<float> magField{"cfgMagField", 5.0f, "Manually set magnetic field"};
13561357 Configurable<bool> flatTables{"cfgFlatTables", false, "Produce a single flat tables with all relevant information of the pairs and single tracks"};
1358+ Configurable<bool> polarTables{"cfgPolarTables", false, "Produce tables with dilepton polarization information"};
13571359 Configurable<bool> useKFVertexing{"cfgUseKFVertexing", false, "Use KF Particle for secondary vertex reconstruction (DCAFitter is used by default)"};
13581360 Configurable<bool> useAbsDCA{"cfgUseAbsDCA", false, "Use absolute DCA minimization instead of chi^2 minimization in secondary vertexing"};
13591361 Configurable<bool> propToPCA{"cfgPropToPCA", false, "Propagate tracks to secondary vertex"};
@@ -1396,7 +1398,7 @@ struct AnalysisSameEventPairing {
13961398 std::vector<MCSignal*> fGenMCSignals;
13971399
13981400 std::vector<AnalysisCompositeCut> fPairCuts;
1399- AnalysisCompositeCut fMCGenAccCut ;
1401+ std::vector<AnalysisCut*> fMCGenAccCuts ;
14001402 bool fUseMCGenAccCut = false;
14011403
14021404 uint32_t fTrackFilterMask; // mask for the track cuts required in this task to be applied on the barrel cuts produced upstream
@@ -1485,16 +1487,6 @@ struct AnalysisSameEventPairing {
14851487 }
14861488 }
14871489
1488- // get the mc generated acceptance cut
1489- TString mcGenAccCutStr = fConfigCuts.MCgenAcc.value;
1490- if (mcGenAccCutStr != "") {
1491- AnalysisCut* cut = dqcuts::GetAnalysisCut(mcGenAccCutStr.Data());
1492- if (cut != nullptr) {
1493- fMCGenAccCut.AddCut(cut);
1494- }
1495- fUseMCGenAccCut = true;
1496- }
1497-
14981490 // check that the barrel track cuts array required in this task is not empty
14991491 if (!trackCutsStr.IsNull()) {
15001492 // tokenize and loop over the barrel cuts produced by the barrel track selection task
@@ -1663,6 +1655,19 @@ struct AnalysisSameEventPairing {
16631655 } // end loop over cuts
16641656 } // end if (muonCutsStr)
16651657
1658+ // get the mc generated acceptance cuts
1659+ TString mcgenCutsStr = fConfigCuts.MCgenAcc.value;
1660+ if (!mcgenCutsStr.IsNull()) {
1661+ std::unique_ptr<TObjArray> objArray(mcgenCutsStr.Tokenize(","));
1662+ for (int icut = 0; icut < objArray->GetEntries(); ++icut) {
1663+ AnalysisCut* cut = dqcuts::GetAnalysisCut(objArray->At(icut)->GetName());
1664+ if (cut != nullptr) {
1665+ fMCGenAccCuts.push_back(cut);
1666+ }
1667+ }
1668+ fUseMCGenAccCut = true;
1669+ }
1670+
16661671 // Add histogram classes for each specified MCsignal at the generator level
16671672 // TODO: create a std::vector of hist classes to be used at Fill time, to avoid using Form in the process function
16681673 TString sigGenNamesStr = fConfigMC.genSignals.value;
@@ -1695,6 +1700,12 @@ struct AnalysisSameEventPairing {
16951700 histNames += Form("MCTruthGenPair_%s;", sig->GetName());
16961701 histNames += Form("MCTruthGenPairSel_%s;", sig->GetName());
16971702 fHasTwoProngGenMCsignals = true;
1703+ // for these pair level signals, also add histograms for each MCgenAcc cut if specified
1704+ if (fUseMCGenAccCut) {
1705+ for (auto& cut : fMCGenAccCuts) {
1706+ histNames += Form("MCTruthGenPairSel_%s_%s;", sig->GetName(), cut->GetName());
1707+ }
1708+ }
16981709 }
16991710 }
17001711 }
@@ -1806,6 +1817,9 @@ struct AnalysisSameEventPairing {
18061817 dileptonMiniTreeGen.reserve(1);
18071818 dileptonMiniTreeRec.reserve(1);
18081819 }
1820+ if (fConfigOptions.polarTables.value) {
1821+ dileptonPolarList.reserve(1);
1822+ }
18091823 constexpr bool eventHasQvector = ((TEventFillMap & VarManager::ObjTypes::ReducedEventQvector) > 0);
18101824 constexpr bool trackHasCov = ((TTrackFillMap & VarManager::ObjTypes::ReducedTrackBarrelCov) > 0);
18111825
@@ -1900,6 +1914,13 @@ struct AnalysisSameEventPairing {
19001914 VarManager::fgValues[VarManager::kVertexingTauzProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjected],
19011915 VarManager::fgValues[VarManager::kVertexingLzProjected], VarManager::fgValues[VarManager::kVertexingLxyProjected]);
19021916 }
1917+ if (fConfigOptions.polarTables.value && t1.has_reducedMCTrack() && t2.has_reducedMCTrack()) {
1918+ dileptonPolarList(VarManager::fgValues[VarManager::kCosThetaHE], VarManager::fgValues[VarManager::kPhiHE], VarManager::fgValues[VarManager::kPhiTildeHE],
1919+ VarManager::fgValues[VarManager::kCosThetaCS], VarManager::fgValues[VarManager::kPhiCS], VarManager::fgValues[VarManager::kPhiTildeCS],
1920+ VarManager::fgValues[VarManager::kCosThetaPP], VarManager::fgValues[VarManager::kPhiPP], VarManager::fgValues[VarManager::kPhiTildePP],
1921+ VarManager::fgValues[VarManager::kCosThetaRM],
1922+ VarManager::fgValues[VarManager::kCosThetaStarTPC], VarManager::fgValues[VarManager::kCosThetaStarFT0A], VarManager::fgValues[VarManager::kCosThetaStarFT0C]);
1923+ }
19031924 }
19041925 }
19051926 }
@@ -2147,12 +2168,6 @@ struct AnalysisSameEventPairing {
21472168
21482169 for (auto& mctrack : mcTracks) {
21492170 VarManager::FillTrackMC(mcTracks, mctrack);
2150- // if we have a mc generated acceptance cut, apply it here
2151- if (fUseMCGenAccCut) {
2152- if (!fMCGenAccCut.IsSelected(VarManager::fgValues)) {
2153- continue;
2154- }
2155- }
21562171 // NOTE: Signals are checked here mostly based on the skimmed MC stack, so depending on the requested signal, the stack could be incomplete.
21572172 // NOTE: However, the working model is that the decisions on MC signals are precomputed during skimming and are stored in the mcReducedFlags member.
21582173 // TODO: Use the mcReducedFlags to select signals
@@ -2176,12 +2191,6 @@ struct AnalysisSameEventPairing {
21762191 continue;
21772192 }
21782193 VarManager::FillTrackMC(mcTracks, track);
2179- // if we have a mc generated acceptance cut, apply it here
2180- if (fUseMCGenAccCut) {
2181- if (!fMCGenAccCut.IsSelected(VarManager::fgValues)) {
2182- continue;
2183- }
2184- }
21852194 auto track_raw = mcTracks.rawIteratorAt(track.globalIndex());
21862195 mcDecision = 0;
21872196 isig = 0;
@@ -2212,11 +2221,6 @@ struct AnalysisSameEventPairing {
22122221 }
22132222 if (sig->CheckSignal(true, t1_raw, t2_raw)) {
22142223 VarManager::FillPairMC<TPairType>(t1, t2);
2215- if (fUseMCGenAccCut) {
2216- if (!fMCGenAccCut.IsSelected(VarManager::fgValues)) {
2217- continue;
2218- }
2219- }
22202224 fHistMan->FillHistClass(Form("MCTruthGenPair_%s", sig->GetName()), VarManager::fgValues);
22212225 }
22222226 }
@@ -2247,12 +2251,15 @@ struct AnalysisSameEventPairing {
22472251 if (sig->CheckSignal(true, t1_raw, t2_raw)) {
22482252 mcDecision |= (static_cast<uint32_t>(1) << isig);
22492253 VarManager::FillPairMC<TPairType>(t1, t2);
2254+ fHistMan->FillHistClass(Form("MCTruthGenPairSel_%s", sig->GetName()), VarManager::fgValues);
2255+ // Fill also acceptance cut histograms if requested
22502256 if (fUseMCGenAccCut) {
2251- if (!fMCGenAccCut.IsSelected(VarManager::fgValues)) {
2252- continue;
2257+ for (auto& cut : fMCGenAccCuts) {
2258+ if (cut->IsSelected(VarManager::fgValues)) {
2259+ fHistMan->FillHistClass(Form("MCTruthGenPairSel_%s_%s", sig->GetName(), cut->GetName()), VarManager::fgValues);
2260+ }
22532261 }
22542262 }
2255- fHistMan->FillHistClass(Form("MCTruthGenPairSel_%s", sig->GetName()), VarManager::fgValues);
22562263 if (useMiniTree.fConfigMiniTree) {
22572264 // WARNING! To be checked
22582265 dileptonMiniTreeGen(mcDecision, -999, t1.pt(), t1.eta(), t1.phi(), t2.pt(), t2.eta(), t2.phi());
@@ -2293,10 +2300,7 @@ struct AnalysisSameEventPairing {
22932300 MyBarrelTracksWithCovWithAmbiguitiesWithColl const& barrelTracks, ReducedMCEvents const& mcEvents, ReducedMCTracks const& mcTracks)
22942301 {
22952302 runSameEventPairing<true, VarManager::kDecayToEE, gkEventFillMapWithCov, gkTrackFillMapWithCovWithColl>(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks);
2296- // Feature replaced by processMCGen
2297- /* if (fConfigMC.runMCGenPair) {
2298- runMCGen<VarManager::kDecayToEE>(mcEvents, mcTracks);
2299- }*/
2303+ runMCGenWithGrouping<VarManager::kDecayToEE>(events, mcEvents, mcTracks);
23002304 }
23012305
23022306 void processMuonOnlySkimmed(MyEventsVtxCovSelected const& events,
0 commit comments