Skip to content

Commit c0320da

Browse files
authored
PWGDQ: Improve filterPbPb and add muon process function (#4015)
* PWGDQ: Bugfix filterPbPb * Formatting
1 parent 7ea39d9 commit c0320da

File tree

4 files changed

+83
-21
lines changed

4 files changed

+83
-21
lines changed

PWGDQ/Core/CutsLibrary.cxx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2341,6 +2341,26 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName)
23412341
return cut;
23422342
}
23432343

2344+
if (!nameStr.compare("eventDoubleGap")) {
2345+
cut->AddCut(VarManager::kIsDoubleGap, 0.5, 1.5);
2346+
return cut;
2347+
}
2348+
2349+
if (!nameStr.compare("eventSingleGap")) {
2350+
cut->AddCut(VarManager::kIsSingleGap, 0.5, 1.5);
2351+
return cut;
2352+
}
2353+
2354+
if (!nameStr.compare("eventSingleGapA")) {
2355+
cut->AddCut(VarManager::kIsSingleGapA, 0.5, 1.5);
2356+
return cut;
2357+
}
2358+
2359+
if (!nameStr.compare("eventSingleGapC")) {
2360+
cut->AddCut(VarManager::kIsSingleGapC, 0.5, 1.5);
2361+
return cut;
2362+
}
2363+
23442364
// Event cuts based on centrality
23452365
if (!nameStr.compare("eventStandardNoINT7Cent090")) {
23462366
cut->AddCut(VarManager::kVtxZ, -10.0, 10.0);

PWGDQ/Core/VarManager.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#ifndef PWGDQ_CORE_VARMANAGER_H_
1818
#define PWGDQ_CORE_VARMANAGER_H_
1919

20+
#include <cstdint>
2021
#ifndef HomogeneousField
2122
#define HomogeneousField
2223
#endif
@@ -462,7 +463,7 @@ class VarManager : public TObject
462463
};
463464

464465
enum EventFilters {
465-
kDoubleGap = 1,
466+
kDoubleGap = 0,
466467
kSingleGapA,
467468
kSingleGapC
468469
};
@@ -915,10 +916,17 @@ void VarManager::FillEvent(T const& event, float* values)
915916
values[kVtxY] = event.posY();
916917
values[kVtxZ] = event.posZ();
917918
values[kVtxNcontrib] = event.numContrib();
918-
919919
if (fgUsedVars[kIsSel8]) {
920920
values[kIsSel8] = (event.tag() & (uint64_t(1) << o2::aod::evsel::kIsTriggerTVX)) > 0;
921921
}
922+
if (fgUsedVars[kIsDoubleGap]) {
923+
values[kIsDoubleGap] = (event.tag() & (uint64_t(1) << (56 + kDoubleGap))) > 0;
924+
}
925+
if (fgUsedVars[kIsSingleGap] || fgUsedVars[kIsSingleGapA] || fgUsedVars[kIsSingleGapC]) {
926+
values[kIsSingleGapA] = (event.tag() & (uint64_t(1) << (56 + kSingleGapA))) > 0;
927+
values[kIsSingleGapC] = (event.tag() & (uint64_t(1) << (56 + kSingleGapC))) > 0;
928+
values[kIsSingleGap] = values[kIsSingleGapA] || values[kIsSingleGapC];
929+
}
922930
}
923931

924932
if constexpr ((fillMap & ReducedEventExtended) > 0) {

PWGDQ/TableProducer/tableMaker.cxx

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ struct TableMaker {
242242
context.mOptions.get<bool>("processMuonOnlyWithMults") || context.mOptions.get<bool>("processMuonOnlyWithCentAndMults") ||
243243
context.mOptions.get<bool>("processMuonOnlyWithCovAndCent") ||
244244
context.mOptions.get<bool>("processMuonOnlyWithCov") || context.mOptions.get<bool>("processMuonOnlyWithCovAndEventFilter") || context.mOptions.get<bool>("processMuonOnlyWithEventFilter") ||
245-
context.mOptions.get<bool>("processAmbiguousMuonOnlyWithCov") || context.mOptions.get<bool>("processAmbiguousMuonOnly") ||
245+
context.mOptions.get<bool>("processMuonOnlyWithMultsAndEventFilter") || context.mOptions.get<bool>("processAmbiguousMuonOnlyWithCov") || context.mOptions.get<bool>("processAmbiguousMuonOnly") ||
246246
context.mOptions.get<bool>("processMuonMLOnly") || context.mOptions.get<bool>("processMuonMLOnly"));
247247

248248
if (enableBarrelHistos) {
@@ -369,9 +369,9 @@ struct TableMaker {
369369
if (collision.sel7()) {
370370
tag |= (uint64_t(1) << evsel::kNsel); //! SEL7 stored at position kNsel in the tag bit map
371371
}
372-
// Put the 32 first bits of the event filter in the last 32 bits of the tag
372+
// Put the 8 first bits of the event filter in the last 8 bits of the tag
373373
if constexpr ((TEventFillMap & VarManager::ObjTypes::EventFilter) > 0) {
374-
tag |= (collision.eventFilter() << 32);
374+
tag |= (collision.eventFilter() << 56);
375375
}
376376

377377
VarManager::ResetValues(0, VarManager::kNEventWiseVariables);
@@ -1338,6 +1338,21 @@ struct TableMaker {
13381338
}
13391339
}
13401340

1341+
// Produce muon tables only, with multiplicity and event filtering ----------------------------------------------------------------------------------------
1342+
void processMuonOnlyWithMultsAndEventFilter(MyEventsWithMultsAndFilter::iterator const& collision, aod::BCsWithTimestamps const& bcs,
1343+
soa::Filtered<MyMuons> const& tracksMuon)
1344+
{
1345+
for (int i = 0; i < kNaliases; i++) {
1346+
if (collision.alias_bit(i) > 0) {
1347+
(reinterpret_cast<TH2I*>(fStatsList->At(0)))->Fill(1.0, static_cast<float>(i));
1348+
}
1349+
}
1350+
(reinterpret_cast<TH2I*>(fStatsList->At(0)))->Fill(1.0, static_cast<float>(kNaliases));
1351+
if (collision.eventFilter()) {
1352+
fullSkimming<gkEventFillMapWithMultsAndEventFilter, 0u, gkMuonFillMap>(collision, bcs, nullptr, tracksMuon, nullptr, nullptr);
1353+
}
1354+
}
1355+
13411356
// Produce MFT tracks tables and muons, with event filtering ------------------------------------------------------------------------------------------------------------------
13421357
void processMuonsAndMFTWithFilter(MyEventsWithFilter::iterator const& collision, aod::BCsWithTimestamps const& bcs,
13431358
aod::MFTTracks const& tracksMft, soa::Filtered<MyMuonsWithCov> const& tracksMuon)
@@ -1464,6 +1479,7 @@ struct TableMaker {
14641479
PROCESS_SWITCH(TableMaker, processBarrelOnly, "Build barrel-only DQ skimmed data model, w/o centrality", false);
14651480
PROCESS_SWITCH(TableMaker, processMuonOnlyWithCent, "Build muon-only DQ skimmed data model, w/ centrality", false);
14661481
PROCESS_SWITCH(TableMaker, processMuonOnlyWithMults, "Build muon-only DQ skimmed data model, w/ multiplicity", false);
1482+
PROCESS_SWITCH(TableMaker, processMuonOnlyWithMultsAndEventFilter, "Build muon-only DQ skimmed data model, w/ multiplicity, w/ event filter", false);
14671483
PROCESS_SWITCH(TableMaker, processMuonOnlyWithCentAndMults, "Build muon-only DQ skimmed data model, w/ centrality and multiplicities", false);
14681484
PROCESS_SWITCH(TableMaker, processMuonOnlyWithCovAndCent, "Build muon-only DQ skimmed data model, w/ centrality and muon cov matrix", false);
14691485
PROCESS_SWITCH(TableMaker, processMuonOnlyWithCov, "Build muon-only DQ skimmed data model, w/ muon cov matrix", false);

PWGDQ/Tasks/filterPbPb.cxx

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
// granted to it by virtue of its status as an Intergovernmental Organization
1010
// or submit itself to any jurisdiction.
1111
//
12+
#include <fairlogger/Logger.h>
13+
#include <cstdint>
1214
#include <iostream>
1315
#include <fstream>
1416
#include "Framework/AnalysisTask.h"
@@ -33,12 +35,7 @@ using namespace o2::aod;
3335

3436
using MyEvents = soa::Join<aod::Collisions, aod::EvSels>;
3537
using MyBCs = soa::Join<aod::BCsWithTimestamps, aod::BcSels, aod::Run3MatchedToBCSparse>;
36-
using MyBarrelTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::TrackSelection,
37-
aod::pidTPCFullEl, aod::pidTPCFullPi,
38-
aod::pidTPCFullKa, aod::pidTPCFullPr,
39-
aod::pidTOFFullEl, aod::pidTOFFullPi,
40-
aod::pidTOFFullKa, aod::pidTOFFullPr>;
41-
38+
using MyBarrelTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TrackSelection>;
4239
using MyMuons = aod::FwdTracks;
4340

4441
constexpr static uint32_t gkEventFillMap = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision;
@@ -48,9 +45,10 @@ void DefineHistograms(HistogramManager* histMan, TString histClasses);
4845
struct DQFilterPbPbTask {
4946
Produces<aod::DQEventFilter> eventFilter;
5047
OutputObj<TH1I> fStats{"Statistics"};
51-
OutputObj<TH1F> fIsEventDGOutcome{TH1F("Filter outcome", "Filter outcome", 7, -0.5, 6.5)};
48+
OutputObj<TH1F> fIsEventDGOutcome{TH1F("Filter outcome", "Filter outcome", 8, -1.5, 6.5)};
5249

5350
Configurable<std::string> fConfigBarrelSelections{"cfgBarrelSels", "jpsiPID1:2:5", "<track-cut>:<nmin>:<nmax>,[<track-cut>:<nmin>:<nmax>],..."};
51+
Configurable<std::string> fConfigEventTypes{"cfgEventTypes", "doublegap,singlegap", "Which event types to select. doublegap, singlegap or both, comma separated"};
5452
Configurable<int> fConfigNDtColl{"cfgNDtColl", 4, "Number of standard deviations to consider in BC range"};
5553
Configurable<int> fConfigMinNBCs{"cfgMinNBCs", 7, "Minimum number of BCs to consider in BC range"};
5654
Configurable<int> fConfigMinNPVCs{"cfgMinNPVCs", 2, "Minimum number of PV contributors"};
@@ -73,17 +71,21 @@ struct DQFilterPbPbTask {
7371
std::vector<int> fBarrelNminTracks; // minimal number of tracks in barrel
7472
std::vector<int> fBarrelNmaxTracks; // maximal number of tracks in barrel
7573

74+
int eventTypeMap = 0;
75+
std::vector<std::string> eventTypeOptions = {"doublegap", "singlegap"}; // Map for which types of event to select
76+
7677
// Helper function for selecting DG events
7778
template <typename TEvent, typename TBCs, typename TTracks, typename TMuons>
7879
uint64_t isEventDG(TEvent const& collision, TBCs const& bcs, TTracks const& tracks, TMuons const& muons,
7980
aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds,
80-
std::vector<float> FITAmpLimits, int nDtColl, int minNBCs, int minNPVCs, int maxNPVCs, float maxFITTime,
81+
int eventTypes, std::vector<float> FITAmpLimits, int nDtColl, int minNBCs, int minNPVCs, int maxNPVCs, float maxFITTime,
8182
bool useFV0, bool useFT0, bool useFDD, bool doVetoFwd, bool doVetoBarrel)
8283
{
8384
fIsEventDGOutcome->Fill(0., 1.);
8485
// Find BC associated with collision
8586
if (!collision.has_foundBC()) {
86-
return -1;
87+
fIsEventDGOutcome->Fill(-1., 1);
88+
return 0;
8789
}
8890
// foundBCId is stored in EvSels
8991
auto bc = collision.template foundBC_as<TBCs>();
@@ -207,12 +209,17 @@ struct DQFilterPbPbTask {
207209

208210
// Compute FIT decision
209211
uint64_t FITDecision = 0;
210-
if (isSideAClean && isSideCClean) {
211-
FITDecision |= (uint64_t(1) << VarManager::kDoubleGap);
212-
} else if (isSideAClean && !isSideCClean) {
213-
FITDecision |= (uint64_t(1) << VarManager::kSingleGapA);
214-
} else if (!isSideAClean && isSideCClean) {
215-
FITDecision |= (uint64_t(1) << VarManager::kSingleGapC);
212+
if (eventTypes & (uint32_t(1) << 0)) {
213+
if (isSideAClean && isSideCClean) {
214+
FITDecision |= (uint64_t(1) << VarManager::kDoubleGap);
215+
}
216+
}
217+
if (eventTypes & (uint32_t(1) << 1)) {
218+
if (isSideAClean && !isSideCClean) {
219+
FITDecision |= (uint64_t(1) << VarManager::kSingleGapA);
220+
} else if (!isSideAClean && isSideCClean) {
221+
FITDecision |= (uint64_t(1) << VarManager::kSingleGapC);
222+
}
216223
}
217224
if (!FITDecision) {
218225
fIsEventDGOutcome->Fill(2, 1);
@@ -289,6 +296,17 @@ struct DQFilterPbPbTask {
289296
void init(o2::framework::InitContext&)
290297
{
291298
DefineCuts();
299+
300+
TString eventTypesString = fConfigEventTypes.value;
301+
for (std::vector<std::string>::size_type i = 0; i < eventTypeOptions.size(); i++) {
302+
if (eventTypesString.Contains(eventTypeOptions[i])) {
303+
eventTypeMap |= (uint32_t(1) << i);
304+
LOGF(info, "filterPbPb will select '%s' events", eventTypeOptions[i]);
305+
}
306+
}
307+
if (eventTypeMap == 0) {
308+
LOGF(fatal, "No valid choice of event types to select. Use 'doublegap', 'singlegap' or both");
309+
}
292310
}
293311

294312
template <uint32_t TEventFillMap>
@@ -299,7 +317,7 @@ struct DQFilterPbPbTask {
299317

300318
std::vector<float> FITAmpLimits = {fConfigFV0AmpLimit, fConfigFT0AAmpLimit, fConfigFT0CAmpLimit, fConfigFDDAAmpLimit, fConfigFDDCAmpLimit};
301319
uint64_t filter = isEventDG(collision, bcs, tracks, muons, ft0s, fv0as, fdds,
302-
FITAmpLimits, fConfigNDtColl, fConfigMinNBCs, fConfigMinNPVCs, fConfigMaxNPVCs, fConfigMaxFITTime,
320+
eventTypeMap, FITAmpLimits, fConfigNDtColl, fConfigMinNBCs, fConfigMinNPVCs, fConfigMaxNPVCs, fConfigMaxFITTime,
303321
fConfigUseFV0, fConfigUseFT0, fConfigUseFDD, fConfigVetoForward, fConfigVetoBarrel);
304322

305323
bool isSelected = filter;

0 commit comments

Comments
 (0)