Skip to content

Commit f4a435e

Browse files
authored
[PWGDQ,Trigger] Proposal for the electron-muon pp trigger (#9769)
1 parent b319e98 commit f4a435e

File tree

4 files changed

+70
-44
lines changed

4 files changed

+70
-44
lines changed

EventFiltering/filterTables.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ DECLARE_SOA_COLUMN(DiMuon, hasDiMuon, bool); //! dimuon trigger with
6767
// EM dielectrons
6868
DECLARE_SOA_COLUMN(LMeeIMR, hasLMeeIMR, bool); //! dielectron trigger for intermediate mass region
6969
DECLARE_SOA_COLUMN(LMeeHMR, hasLMeeHMR, bool); //! dielectron trigger for high mass region
70+
// Electron-muon pair
71+
DECLARE_SOA_COLUMN(ElectronMuon, hasElectronMuon, bool); //! dimuon trigger with low pT on muons
7072

7173
// heavy flavours
7274
DECLARE_SOA_COLUMN(HfHighPt2P, hasHfHighPt2P, bool); //! high-pT 2-prong charm hadron
@@ -207,7 +209,7 @@ using DiffractionBCFilter = DiffractionBCFilters::iterator;
207209

208210
// Dileptons & Quarkonia
209211
DECLARE_SOA_TABLE(DqFilters, "AOD", "DqFilters", //!
210-
filtering::SingleE, filtering::LMeeIMR, filtering::LMeeHMR, filtering::DiElectron, filtering::SingleMuLow, filtering::SingleMuHigh, filtering::DiMuon);
212+
filtering::SingleE, filtering::LMeeIMR, filtering::LMeeHMR, filtering::DiElectron, filtering::SingleMuLow, filtering::SingleMuHigh, filtering::DiMuon, filtering::ElectronMuon);
211213
using DqFilter = DqFilters::iterator;
212214

213215
// heavy flavours

PWGDQ/Core/CutsLibrary.cxx

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,17 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName)
8080
cut->AddCut(GetAnalysisCut("MCHMID"));
8181
return cut;
8282
}
83+
if (!nameStr.compare("ElectronForEMu")) {
84+
cut->AddCut(GetAnalysisCut("jpsiKineSkimmed"));
85+
cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4"));
86+
cut->AddCut(GetAnalysisCut("electronPIDnsigmaLoose"));
87+
return cut;
88+
}
89+
if (!nameStr.compare("MuonForEMu")) {
90+
cut->AddCut(GetAnalysisCut("muonLowPt5"));
91+
cut->AddCut(GetAnalysisCut("muonQualityCuts"));
92+
return cut;
93+
}
8394
// ///////////////////////////////////////////////
8495
// End of Cuts for CEFP //
8596
// ///////////////////////////////////////////////
@@ -3575,6 +3586,19 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName)
35753586
return cut;
35763587
}
35773588

3589+
if (!nameStr.compare("emu_electron_specialTest")) {
3590+
cut->AddCut(GetAnalysisCut("jpsiStandardKineForEMu"));
3591+
cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4"));
3592+
cut->AddCut(GetAnalysisCut("electronPIDnsigmaVeryVeryLoose2"));
3593+
return cut;
3594+
}
3595+
3596+
if (!nameStr.compare("emu_electron_specialTest2")) {
3597+
cut->AddCut(GetAnalysisCut("jpsiStandardKineForEMu"));
3598+
cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4"));
3599+
return cut;
3600+
}
3601+
35783602
if (!nameStr.compare("muonLooseTriggerTestCuts")) {
35793603
cut->AddCut(GetAnalysisCut("muonLooseTriggerTestCuts"));
35803604
return cut;
@@ -4094,6 +4118,12 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName)
40944118
return cut;
40954119
}
40964120

4121+
if (!nameStr.compare("jpsiStandardKineForEMu")) {
4122+
cut->AddCut(VarManager::kPt, 5.0, 1000.0);
4123+
cut->AddCut(VarManager::kEta, -0.9, 0.9);
4124+
return cut;
4125+
}
4126+
40974127
if (!nameStr.compare("lmeePrefilterKine")) {
40984128
cut->AddCut(VarManager::kPt, 0., 20.0);
40994129
cut->AddCut(VarManager::kEta, -1.2, 1.2);
@@ -5344,8 +5374,8 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName)
53445374

53455375
if (!nameStr.compare("electronPIDnsigmaVeryVeryLoose2")) {
53465376
cut->AddCut(VarManager::kTPCnSigmaEl, -4.0, 4.0);
5347-
cut->AddCut(VarManager::kTPCnSigmaPr, 2.5, 3000.0);
5348-
cut->AddCut(VarManager::kTPCnSigmaPi, 2.5, 3000.0);
5377+
cut->AddCut(VarManager::kTPCnSigmaPr, 1.5, 3000.0);
5378+
cut->AddCut(VarManager::kTPCnSigmaPi, 1.5, 3000.0);
53495379
return cut;
53505380
}
53515381

PWGDQ/Tasks/filterPP.cxx

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
//
1414
#include <iostream>
1515
#include <vector>
16+
#include <map>
17+
#include <string>
1618
#include <memory>
1719
#include <cstring>
1820
#include <TH1.h>
@@ -59,6 +61,7 @@ enum DQTriggers {
5961
kSingleMuLow,
6062
kSingleMuHigh,
6163
kDiMuon,
64+
kElectronMuon,
6265
kNTriggersDQ
6366
};
6467
} // namespace
@@ -247,14 +250,14 @@ struct DQBarrelTrackSelection {
247250
fCurrentRun = bc.runNumber();
248251
}
249252

250-
uint32_t filterMap = uint32_t(0);
253+
uint32_t filterMap = static_cast<uint32_t>(0);
251254
trackSel.reserve(tracksBarrel.size());
252255

253256
VarManager::ResetValues(0, VarManager::kNBarrelTrackVariables);
254257
for (auto& track : tracksBarrel) {
255-
filterMap = uint32_t(0);
258+
filterMap = static_cast<uint32_t>(0);
256259
if (!track.has_collision()) {
257-
trackSel(uint32_t(0));
260+
trackSel(static_cast<uint32_t>(0));
258261
} else {
259262
VarManager::FillTrack<TTrackFillMap>(track);
260263
if (fConfigQA) {
@@ -263,7 +266,7 @@ struct DQBarrelTrackSelection {
263266
int i = 0;
264267
for (auto cut = fTrackCuts.begin(); cut != fTrackCuts.end(); ++cut, ++i) {
265268
if ((*cut).IsSelected(VarManager::fgValues)) {
266-
filterMap |= (uint32_t(1) << i);
269+
filterMap |= (static_cast<uint32_t>(1) << i);
267270
if (fConfigQA) {
268271
fHistMan->FillHistClass(fCutHistNames[i].Data(), VarManager::fgValues);
269272
}
@@ -331,16 +334,16 @@ struct DQMuonsSelection {
331334
template <uint32_t TMuonFillMap, typename TMuons>
332335
void runMuonSelection(TMuons const& muons)
333336
{
334-
uint32_t filterMap = uint32_t(0);
337+
uint32_t filterMap = static_cast<uint32_t>(0);
335338
trackSel.reserve(muons.size());
336339

337340
VarManager::ResetValues(0, VarManager::kNMuonTrackVariables);
338341
// fill event information which might be needed in histograms or cuts that combine track and event properties
339342

340343
for (auto& muon : muons) {
341-
filterMap = uint32_t(0);
344+
filterMap = static_cast<uint32_t>(0);
342345
if (!muon.has_collision()) {
343-
trackSel(uint32_t(0));
346+
trackSel(static_cast<uint32_t>(0));
344347
} else {
345348
VarManager::FillTrack<TMuonFillMap>(muon);
346349
if (fConfigQA) {
@@ -349,7 +352,7 @@ struct DQMuonsSelection {
349352
int i = 0;
350353
for (auto cut = fTrackCuts.begin(); cut != fTrackCuts.end(); ++cut, ++i) {
351354
if ((*cut).IsSelected(VarManager::fgValues)) {
352-
filterMap |= (uint32_t(1) << i);
355+
filterMap |= (static_cast<uint32_t>(1) << i);
353356
if (fConfigQA) {
354357
fHistMan->FillHistClass(fCutHistNames[i].Data(), VarManager::fgValues);
355358
}
@@ -386,8 +389,8 @@ struct DQFilterPPTask {
386389
Configurable<std::string> fConfigFilterLsBarrelTracksPairs{"cfgWithBarrelLS", "false", "Comma separated list of booleans for each trigger, If true, also select like sign (--/++) barrel track pairs"};
387390
Configurable<std::string> fConfigFilterLsMuonsPairs{"cfgWithMuonLS", "false", "Comma separated list of booleans for each trigger, If true, also select like sign (--/++) muon pairs"};
388391

389-
Filter filterBarrelTrackSelected = aod::dqppfilter::isDQBarrelSelected > uint32_t(0);
390-
Filter filterMuonTrackSelected = aod::dqppfilter::isDQMuonSelected > uint32_t(0);
392+
Filter filterBarrelTrackSelected = aod::dqppfilter::isDQBarrelSelected > static_cast<uint32_t>(0);
393+
Filter filterMuonTrackSelected = aod::dqppfilter::isDQMuonSelected > static_cast<uint32_t>(0);
391394

392395
int fNBarrelCuts; // number of barrel selections
393396
int fNMuonCuts; // number of muon selections
@@ -496,14 +499,14 @@ struct DQFilterPPTask {
496499
// if the event is not selected produce tables and return
497500
if (!collision.isDQEventSelected()) {
498501
eventFilter(0);
499-
dqtable(false, false, false, false, false, false, false);
502+
dqtable(false, false, false, false, false, false, false, false);
500503
return;
501504
}
502505
fStats->Fill(-1.0);
503506

504507
if (tracksBarrel.size() == 0 && muons.size() == 0) {
505508
eventFilter(0);
506-
dqtable(false, false, false, false, false, false, false);
509+
dqtable(false, false, false, false, false, false, false, false);
507510
return;
508511
}
509512

@@ -515,7 +518,7 @@ struct DQFilterPPTask {
515518
// count the number of barrel tracks fulfilling each cut
516519
for (auto track : tracksBarrel) {
517520
for (int i = 0; i < fNBarrelCuts; ++i) {
518-
if (track.isDQBarrelSelected() & (uint32_t(1) << i)) {
521+
if (track.isDQBarrelSelected() & (static_cast<uint32_t>(1) << i)) {
519522
objCountersBarrel[i] += 1;
520523
}
521524
}
@@ -526,7 +529,7 @@ struct DQFilterPPTask {
526529
for (int i = 0; i < fNBarrelCuts; i++) {
527530
if (fBarrelRunPairing[i]) {
528531
if (objCountersBarrel[i] > 1) { // pairing has to be enabled and at least two tracks are needed
529-
pairingMask |= (uint32_t(1) << i);
532+
pairingMask |= (static_cast<uint32_t>(1) << i);
530533
}
531534
objCountersBarrel[i] = 0; // reset counters for selections where pairing is needed (count pairs instead)
532535
}
@@ -539,7 +542,7 @@ struct DQFilterPPTask {
539542
for (int icut = 0; icut < fNBarrelCuts; icut++) {
540543
TString objStr = objArrayLS->At(icut)->GetName();
541544
if (!objStr.CompareTo("true")) {
542-
pairingLS |= (uint32_t(1) << icut);
545+
pairingLS |= (static_cast<uint32_t>(1) << icut);
543546
}
544547
}
545548

@@ -556,12 +559,12 @@ struct DQFilterPPTask {
556559
VarManager::FillPair<VarManager::kDecayToEE, TTrackFillMap>(t1, t2); // compute pair quantities
557560
for (int icut = 0; icut < fNBarrelCuts; icut++) {
558561
// select like-sign pairs if trigger has set boolean true within fConfigFilterLsBarrelTracksPairs
559-
if (!(pairingLS & (uint32_t(1) << icut))) {
562+
if (!(pairingLS & (static_cast<uint32_t>(1) << icut))) {
560563
if (t1.sign() * t2.sign() > 0) {
561564
continue;
562565
}
563566
}
564-
if (!(pairFilter & (uint32_t(1) << icut))) {
567+
if (!(pairFilter & (static_cast<uint32_t>(1) << icut))) {
565568
continue;
566569
}
567570
if (!fBarrelPairCuts[icut].IsSelected(VarManager::fgValues)) {
@@ -579,7 +582,7 @@ struct DQFilterPPTask {
579582
// count the number of muon tracks fulfilling each selection
580583
for (auto muon : muons) {
581584
for (int i = 0; i < fNMuonCuts; ++i) {
582-
if (muon.isDQMuonSelected() & (uint32_t(1) << i)) {
585+
if (muon.isDQMuonSelected() & (static_cast<uint32_t>(1) << i)) {
583586
objCountersMuon[i] += 1;
584587
}
585588
}
@@ -590,7 +593,7 @@ struct DQFilterPPTask {
590593
for (int i = 0; i < fNMuonCuts; i++) {
591594
if (fMuonRunPairing[i]) { // pairing has to be enabled and at least two tracks are needed
592595
if (objCountersMuon[i] > 1) {
593-
pairingMask |= (uint32_t(1) << i);
596+
pairingMask |= (static_cast<uint32_t>(1) << i);
594597
}
595598
objCountersMuon[i] = 0; // reset counters for selections where pairing is needed (count pairs instead)
596599
}
@@ -603,7 +606,7 @@ struct DQFilterPPTask {
603606
for (int icut = 0; icut < fNMuonCuts; icut++) {
604607
TString objStr = objArrayMuonLS->At(icut)->GetName();
605608
if (!objStr.CompareTo("true")) {
606-
pairingLS |= (uint32_t(1) << icut);
609+
pairingLS |= (static_cast<uint32_t>(1) << icut);
607610
}
608611
}
609612

@@ -620,12 +623,12 @@ struct DQFilterPPTask {
620623
VarManager::FillPair<VarManager::kDecayToMuMu, TTrackFillMap>(t1, t2); // compute pair quantities
621624
for (int icut = 0; icut < fNMuonCuts; icut++) {
622625
// select like-sign pairs if trigger has set boolean true within fConfigFilterLsMuonsPairs
623-
if (!(pairingLS & (uint32_t(1) << icut))) {
626+
if (!(pairingLS & (static_cast<uint32_t>(1) << icut))) {
624627
if (t1.sign() * t2.sign() > 0) {
625628
continue;
626629
}
627630
}
628-
if (!(pairFilter & (uint32_t(1) << icut))) {
631+
if (!(pairFilter & (static_cast<uint32_t>(1) << icut))) {
629632
continue;
630633
}
631634
if (!fMuonPairCuts[icut].IsSelected(VarManager::fgValues)) {
@@ -648,7 +651,7 @@ struct DQFilterPPTask {
648651
uint64_t filter = 0;
649652
for (int i = 0; i < fNBarrelCuts; i++) {
650653
if (objCountersBarrel[i] >= fBarrelNreqObjs[i]) {
651-
filter |= (uint64_t(1) << i);
654+
filter |= (static_cast<uint64_t>(1) << i);
652655
fStats->Fill(static_cast<float>(i));
653656
if (i < kNTriggersDQ) {
654657
decisions[i] = true;
@@ -657,15 +660,15 @@ struct DQFilterPPTask {
657660
}
658661
for (int i = 0; i < fNMuonCuts; i++) {
659662
if (objCountersMuon[i] >= fMuonNreqObjs[i]) {
660-
filter |= (uint64_t(1) << (i + fNBarrelCuts));
663+
filter |= (static_cast<uint64_t>(1) << (i + fNBarrelCuts));
661664
fStats->Fill(static_cast<float>(i + fNBarrelCuts));
662665
if (i + fNBarrelCuts < kNTriggersDQ) {
663666
decisions[i + fNBarrelCuts] = true;
664667
}
665668
}
666669
}
667670
eventFilter(filter);
668-
dqtable(decisions[0], decisions[1], decisions[2], decisions[3], decisions[4], decisions[5], decisions[6]);
671+
dqtable(decisions[0], decisions[1], decisions[2], decisions[3], decisions[4], decisions[5], decisions[6], decisions[7]);
669672
}
670673

671674
void processFilterPP(MyEventsSelected::iterator const& collision, aod::BCs const& bcs,

PWGDQ/Tasks/filterPPwithAssociation.cxx

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ enum DQTriggers {
7070
kSingleMuLow,
7171
kSingleMuHigh,
7272
kDiMuon,
73-
// kElectronMuon, // the ElectronMuon trigger is not available now
73+
kElectronMuon,
7474
kNTriggersDQ
7575
};
7676
} // namespace
@@ -1042,16 +1042,13 @@ struct DQFilterPPTask {
10421042
}
10431043
}
10441044
}
1045-
// the ElectronMuon trigger is not available now
1046-
/*
10471045
for (int i = fNBarrelCuts + fNMuonCuts; i < fNBarrelCuts + fNMuonCuts + fNElectronMuonCuts; i++) {
10481046
if (filter & (static_cast<uint64_t>(1) << i)) {
10491047
if (i < kNTriggersDQ) {
10501048
decisions[i] = true;
10511049
}
10521050
}
10531051
}
1054-
*/
10551052
// if this collision fired at least one input, add it to the map, or if it is there already, update the decisions with a logical OR
10561053
// This may happen in the case when some collisions beyond the iterator are added because they contain ambiguous tracks fired on by another collision
10571054
if (fFiltersMap.find(collision.globalIndex()) == fFiltersMap.end()) {
@@ -1132,16 +1129,14 @@ struct DQFilterPPTask {
11321129
fStats->Fill(-2.0);
11331130
if (!collision.isDQEventSelected()) {
11341131
eventFilter(0);
1135-
dqtable(false, false, false, false, false, false, false);
1136-
// dqtable(false, false, false, false, false, false, false, false); // the ElectronMuon trigger is not available now
1132+
dqtable(false, false, false, false, false, false, false, false);
11371133
continue;
11381134
}
11391135
fStats->Fill(-1.0);
11401136

11411137
if (fFiltersMap.find(collision.globalIndex()) == fFiltersMap.end()) {
11421138
eventFilter(0);
1143-
dqtable(false, false, false, false, false, false, false);
1144-
// dqtable(false, false, false, false, false, false, false, false); // the ElectronMuon trigger is not available now
1139+
dqtable(false, false, false, false, false, false, false, false);
11451140
} else {
11461141
totalEventsTriggered++;
11471142
for (int i = 0; i < fNBarrelCuts + fNMuonCuts + fNElectronMuonCuts; i++) {
@@ -1150,8 +1145,7 @@ struct DQFilterPPTask {
11501145
}
11511146
eventFilter(fFiltersMap[collision.globalIndex()]);
11521147
auto dqDecisions = fCEFPfilters[collision.globalIndex()];
1153-
dqtable(dqDecisions[0], dqDecisions[1], dqDecisions[2], dqDecisions[3], dqDecisions[4], dqDecisions[5], dqDecisions[6]);
1154-
// dqtable(dqDecisions[0], dqDecisions[1], dqDecisions[2], dqDecisions[3], dqDecisions[4], dqDecisions[5], dqDecisions[6], dqDecisions[7]); // the ElectronMuon trigger is not available now
1148+
dqtable(dqDecisions[0], dqDecisions[1], dqDecisions[2], dqDecisions[3], dqDecisions[4], dqDecisions[5], dqDecisions[6], dqDecisions[7]);
11551149
}
11561150
}
11571151

@@ -1256,16 +1250,14 @@ struct DQFilterPPTask {
12561250
fStats->Fill(-2.0);
12571251
if (!collision.isDQEventSelected()) {
12581252
eventFilter(0);
1259-
dqtable(false, false, false, false, false, false, false);
1260-
// dqtable(false, false, false, false, false, false, false, false); // the ElectronMuon trigger is not available now
1253+
dqtable(false, false, false, false, false, false, false, false);
12611254
continue;
12621255
}
12631256
fStats->Fill(-1.0);
12641257

12651258
if (fFiltersMap.find(collision.globalIndex()) == fFiltersMap.end()) {
12661259
eventFilter(0);
1267-
dqtable(false, false, false, false, false, false, false);
1268-
// dqtable(false, false, false, false, false, false, false, false); // the ElectronMuon trigger is not available now
1260+
dqtable(false, false, false, false, false, false, false, false);
12691261
} else {
12701262
totalEventsTriggered++;
12711263
for (int i = 0; i < fNMuonCuts; i++) {
@@ -1274,8 +1266,7 @@ struct DQFilterPPTask {
12741266
}
12751267
eventFilter(fFiltersMap[collision.globalIndex()]);
12761268
auto dqDecisions = fCEFPfilters[collision.globalIndex()];
1277-
dqtable(dqDecisions[0], dqDecisions[1], dqDecisions[2], dqDecisions[3], dqDecisions[4], dqDecisions[5], dqDecisions[6]);
1278-
// dqtable(dqDecisions[0], dqDecisions[1], dqDecisions[2], dqDecisions[3], dqDecisions[4], dqDecisions[5], dqDecisions[6], dqDecisions[7]); // the ElectronMuon trigger is not available now
1269+
dqtable(dqDecisions[0], dqDecisions[1], dqDecisions[2], dqDecisions[3], dqDecisions[4], dqDecisions[5], dqDecisions[6], dqDecisions[7]);
12791270
}
12801271
}
12811272

0 commit comments

Comments
 (0)