3636#include "Common/DataModel/PIDResponse.h"
3737#include "Common/DataModel/TrackSelectionTables.h"
3838#include "Common/DataModel/MftmchMatchingML.h"
39+ #include "Common/Core/TableHelper.h"
3940#include "PWGDQ/DataModel/ReducedInfoTables.h"
4041#include "PWGDQ/Core/VarManager.h"
4142#include "PWGDQ/Core/HistogramManager.h"
@@ -98,6 +99,7 @@ using MyEvents = soa::Join<aod::Collisions, aod::EvSels>;
9899using MyEventsWithMults = soa::Join<aod::Collisions, aod::EvSels, aod::Mults>;
99100using MyEventsWithFilter = soa::Join<aod::Collisions, aod::EvSels, aod::DQEventFilter>;
100101using MyEventsWithMultsAndFilter = soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::MultsExtra, aod::DQEventFilter>;
102+ using MyEventsWithMultsAndRapidityGapFilter = soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::MultsExtra, aod::DQRapidityGapFilter>;
101103using MyEventsWithCent = soa::Join<aod::Collisions, aod::EvSels, aod::CentFT0Cs>;
102104using MyEventsWithCentAndMults = soa::Join<aod::Collisions, aod::EvSels, aod::CentFT0Cs, aod::Mults, aod::MultsExtra>;
103105using MyEventsWithMultsExtra = soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::MultsExtra>;
@@ -116,6 +118,7 @@ constexpr static uint32_t gkEventFillMapWithMults = VarManager::ObjTypes::BC | V
116118constexpr static uint32_t gkEventFillMapWithMultsZdc = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionMult | VarManager::ObjTypes::Zdc;
117119constexpr static uint32_t gkEventFillMapWithMultsAndEventFilter = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionMult | VarManager::ObjTypes::CollisionMultExtra | VarManager::ObjTypes::EventFilter;
118120constexpr static uint32_t gkEventFillMapWithMultsEventFilterZdc = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionMult | VarManager::ObjTypes::CollisionMultExtra | VarManager::ObjTypes::EventFilter | VarManager::ObjTypes::Zdc;
121+ constexpr static uint32_t gkEventFillMapWithMultsRapidityGapFilterZdc = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionMult | VarManager::ObjTypes::CollisionMultExtra | VarManager::ObjTypes::RapidityGapFilter | VarManager::ObjTypes::Zdc;
119122// constexpr static uint32_t gkEventFillMapWithCent = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionCent;
120123constexpr static uint32_t gkEventFillMapWithCentAndMults = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionCent | VarManager::CollisionMult | VarManager::ObjTypes::CollisionMultExtra;
121124constexpr static uint32_t gkEventFillMapWithMultsExtra = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::CollisionMult | VarManager::ObjTypes::CollisionMultExtra;
@@ -356,7 +359,8 @@ struct TableMaker {
356359
357360 // Check whether we have to define barrel or muon histograms
358361 bool enableBarrelHistos = (context.mOptions.get<bool>("processPPWithFilter") || context.mOptions.get<bool>("processPPWithFilterBarrelOnly") || context.mOptions.get<bool>("processPPBarrelOnly") ||
359- context.mOptions.get<bool>("processPbPb") || context.mOptions.get<bool>("processPbPbBarrelOnly") || context.mOptions.get<bool>("processPbPbBarrelOnlyWithV0Bits") || context.mOptions.get<bool>("processPbPbBarrelOnlyWithV0BitsNoTOF"));
362+ context.mOptions.get<bool>("processPbPb") || context.mOptions.get<bool>("processPbPbBarrelOnly") || context.mOptions.get<bool>("processPbPbBarrelOnlyWithV0Bits") || context.mOptions.get<bool>("processPbPbBarrelOnlyWithV0BitsNoTOF")) ||
363+ context.mOptions.get<bool>("processPbPbWithFilterBarrelOnly");
360364
361365 bool enableMuonHistos = (context.mOptions.get<bool>("processPPWithFilter") || context.mOptions.get<bool>("processPPWithFilterMuonOnly") || context.mOptions.get<bool>("processPPWithFilterMuonMFT") || context.mOptions.get<bool>("processPPMuonOnly") || context.mOptions.get<bool>("processPPMuonMFT") || context.mOptions.get<bool>("processPPMuonMFTWithMultsExtra") ||
362366 context.mOptions.get<bool>("processPbPb") || context.mOptions.get<bool>("processPbPbMuonOnly") || context.mOptions.get<bool>("processPbPbMuonMFT"));
@@ -772,7 +776,7 @@ struct TableMaker {
772776 (reinterpret_cast<TH2D*>(fStatsList->At(kStatsEvent)))->Fill(1.0, static_cast<float>(o2::aod::evsel::kNsel));
773777
774778 // apply the event filter computed by filter-PP
775- if constexpr ((TEventFillMap & VarManager::ObjTypes::EventFilter) > 0) {
779+ if constexpr ((TEventFillMap & VarManager::ObjTypes::EventFilter) > 0 || (TEventFillMap & VarManager::ObjTypes::RapidityGapFilter) > 0 ) {
776780 if (!collision.eventFilter()) {
777781 continue;
778782 }
@@ -788,15 +792,18 @@ struct TableMaker {
788792 tag |= (static_cast<uint64_t>(1) << 0);
789793 }
790794 // Put the 8 first bits of the event filter in the last 8 bits of the tag
791- if constexpr ((TEventFillMap & VarManager::ObjTypes::EventFilter) > 0) {
795+ if constexpr ((TEventFillMap & VarManager::ObjTypes::EventFilter) > 0 || (TEventFillMap & VarManager::ObjTypes::RapidityGapFilter) > 0 ) {
792796 tag |= (collision.eventFilter() << 56);
793797 }
794798
795799 VarManager::ResetValues(0, VarManager::kNEventWiseVariables);
796800 VarManager::FillBC(bc);
797801 VarManager::FillEvent<TEventFillMap>(collision); // extract event information and place it in the fValues array
798802 if constexpr ((TEventFillMap & VarManager::ObjTypes::Zdc) > 0) {
799- if (bcEvSel.has_zdc()) {
803+ if constexpr ((TEventFillMap & VarManager::ObjTypes::RapidityGapFilter) > 0) {
804+ // Collision table already has ZDC info
805+ VarManager::FillZDC(collision);
806+ } else if (bcEvSel.has_zdc()) {
800807 auto bc_zdc = bcEvSel.zdc();
801808 VarManager::FillZDC(bc_zdc);
802809 }
@@ -863,17 +870,26 @@ struct TableMaker {
863870 // create the event tables
864871 event(tag, bc.runNumber(), collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), collision.collisionTime(), collision.collisionTimeRes());
865872 if constexpr ((TEventFillMap & VarManager::ObjTypes::CollisionMult) > 0) {
866- multTPC = collision.multTPC();
867- multFV0A = collision.multFV0A();
868873 multFV0C = collision.multFV0C();
869- multFT0A = collision.multFT0A();
870- multFT0C = collision.multFT0C();
871- multFDDA = collision.multFDDA();
872- multFDDC = collision.multFDDC();
874+ multTPC = collision.multTPC();
873875 multZNA = collision.multZNA();
874876 multZNC = collision.multZNC();
875877 multTracklets = collision.multTracklets();
876878 multTracksPV = collision.multNTracksPV();
879+ if constexpr ((TEventFillMap & VarManager::ObjTypes::RapidityGapFilter) > 0) {
880+ // Use the FIT signals from the nearest BC with FIT amplitude above threshold
881+ multFV0A = collision.newBcMultFV0A();
882+ multFT0A = collision.newBcMultFT0A();
883+ multFT0C = collision.newBcMultFT0C();
884+ multFDDA = collision.newBcMultFDDA();
885+ multFDDC = collision.newBcMultFDDC();
886+ } else {
887+ multFV0A = collision.multFV0A();
888+ multFT0A = collision.multFT0A();
889+ multFT0C = collision.multFT0C();
890+ multFDDA = collision.multFDDA();
891+ multFDDC = collision.multFDDC();
892+ }
877893 }
878894 if constexpr ((TEventFillMap & VarManager::ObjTypes::CollisionCent) > 0) {
879895 centFT0C = collision.centFT0C();
@@ -883,7 +899,11 @@ struct TableMaker {
883899 eventVtxCov(collision.covXX(), collision.covXY(), collision.covXZ(), collision.covYY(), collision.covYZ(), collision.covZZ(), collision.chi2());
884900 eventInfo(collision.globalIndex());
885901 if constexpr ((TEventFillMap & VarManager::ObjTypes::Zdc) > 0) {
886- if (bcEvSel.has_zdc()) {
902+ if constexpr ((TEventFillMap & VarManager::ObjTypes::RapidityGapFilter) > 0) {
903+ // ZDC information is already in the DQRapidityGapFilter
904+ zdc(collision.energyCommonZNA(), collision.energyCommonZNC(), collision.energyCommonZPA(), collision.energyCommonZPC(),
905+ collision.timeZNA(), collision.timeZNC(), collision.timeZPA(), collision.timeZPC());
906+ } else if (bcEvSel.has_zdc()) {
887907 auto bc_zdc = bcEvSel.zdc();
888908 zdc(bc_zdc.energyCommonZNA(), bc_zdc.energyCommonZNC(), bc_zdc.energyCommonZPA(), bc_zdc.energyCommonZPC(),
889909 bc_zdc.timeZNA(), bc_zdc.timeZNC(), bc_zdc.timeZPA(), bc_zdc.timeZPC());
@@ -1424,6 +1444,14 @@ struct TableMaker {
14241444 fullSkimming<gkEventFillMapWithCentAndMults, gkTrackFillMapWithCov, 0u, 0u>(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr);
14251445 }
14261446
1447+ // produce the barrel-only DQ skimmed data model typically for UPC Pb-Pb (no centrality), subscribe to the DQ rapidity gap event filter (filter-PbPb)
1448+ void processPbPbWithFilterBarrelOnly(MyEventsWithMultsAndRapidityGapFilter const& collisions, MyBCs const& bcs, aod::Zdcs& zdcs,
1449+ MyBarrelTracksWithCov const& tracksBarrel,
1450+ TrackAssoc const& trackAssocs)
1451+ {
1452+ fullSkimming<gkEventFillMapWithMultsRapidityGapFilterZdc, gkTrackFillMapWithCov, 0u, 0u>(collisions, bcs, zdcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr);
1453+ }
1454+
14271455 // produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter
14281456 void processPbPbBarrelOnlyWithV0Bits(MyEventsWithCentAndMults const& collisions, BCsWithTimestamps const& bcs,
14291457 MyBarrelTracksWithV0Bits const& tracksBarrel,
@@ -1478,6 +1506,7 @@ struct TableMaker {
14781506 PROCESS_SWITCH(TableMaker, processPPMuonMFTWithMultsExtra, "Build muon + mft DQ skimmed data model typically for pp/p-Pb and UPC Pb-Pb", false);
14791507 PROCESS_SWITCH(TableMaker, processPbPb, "Build full DQ skimmed data model typically for Pb-Pb, w/o event filtering", false);
14801508 PROCESS_SWITCH(TableMaker, processPbPbBarrelOnly, "Build barrel only DQ skimmed data model typically for Pb-Pb, w/o event filtering", false);
1509+ PROCESS_SWITCH(TableMaker, processPbPbWithFilterBarrelOnly, "Build barrel only DQ skimmed data model typically for UPC Pb-Pb, w/ event filtering", false);
14811510 PROCESS_SWITCH(TableMaker, processPbPbBarrelOnlyWithV0Bits, "Build barrel only DQ skimmed data model typically for Pb-Pb, w/ V0 bits, w/o event filtering", false);
14821511 PROCESS_SWITCH(TableMaker, processPbPbBarrelOnlyWithV0BitsNoTOF, "Build barrel only DQ skimmed data model typically for Pb-Pb, w/ V0 bits, no TOF, w/o event filtering", false);
14831512 PROCESS_SWITCH(TableMaker, processPbPbMuonOnly, "Build muon only DQ skimmed data model typically for Pb-Pb, w/o event filtering", false);
0 commit comments