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