Skip to content

Commit

Permalink
PID QA: Filteirng input collisions and tracks (AliceO2Group#2004)
Browse files Browse the repository at this point in the history
* PID QA: Filteirng input collisions and tracks
* Add quality cut for on clusters
  • Loading branch information
njacazio authored and lvermunt committed Mar 1, 2023
1 parent 873fc67 commit af4bac4
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 113 deletions.
64 changes: 29 additions & 35 deletions DPG/Tasks/AOTTrack/PID/qaPIDTOF.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ struct tofPidQa {
ConfigurableAxis expSigmaBins{"expSigmaBins", {200, 0.f, 200.f}, "Binning in expected Sigma"};
ConfigurableAxis nSigmaBins{"nSigmaBins", {401, -10.025f, 10.025f}, "Binning in NSigma"};
Configurable<int> applyEvSel{"applyEvSel", 2, "Flag to apply event selection cut: 0 -> no event selection, 1 -> Run 2 event selection, 2 -> Run 3 event selection"};
Configurable<bool> applyTrackCut{"applyTrackCut", false, "Flag to apply standard track cuts"};
Configurable<int> trackSelection{"trackSelection", 1, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"};
Configurable<bool> applyRapidityCut{"applyRapidityCut", false, "Flag to apply rapidity cut"};
Configurable<bool> enableEvTimeSplitting{"enableEvTimeSplitting", false, "Flag to enable histograms splitting depending on the Event Time used"};
Configurable<bool> produceDeltaTEtaPhiMap{"produceDeltaTEtaPhiMap", false, "Produces the map of the delta time as a function of eta and phi"};
Expand Down Expand Up @@ -279,8 +279,7 @@ struct tofPidQa {
auto h = histos.add<TH1>("event/evsel", "", kTH1F, {{10, 0.5, 10.5, "Ev. Sel."}});
h->GetXaxis()->SetBinLabel(1, "Events read");
h->GetXaxis()->SetBinLabel(2, "Passed ev. sel.");
h->GetXaxis()->SetBinLabel(3, "Passed mult.");
h->GetXaxis()->SetBinLabel(4, "Passed vtx Z");
h->GetXaxis()->SetBinLabel(3, "Passed vtx Z");

h = histos.add<TH1>("event/trackselection", "", kTH1F, {{10, 0.5, 10.5, "Selection passed"}});
h->GetXaxis()->SetBinLabel(1, "Tracks read");
Expand All @@ -294,8 +293,6 @@ struct tofPidQa {
for (int i = 0; i < 9; i++) {
h->GetXaxis()->SetBinLabel(i + 1, PID::getName(i));
}
histos.add("event/trackmultiplicity", "", kTH1F, {multAxis});
histos.add("event/tofmultiplicity", "", kTH1F, {multAxis});

histos.add("event/evtime/colltime", "collisionTime()", kTH1F, {colTimeAxis});
histos.add("event/evtime/colltimereso", "collisionTimeRes()", kTH2F, {multAxis, colTimeResoAxis});
Expand Down Expand Up @@ -347,19 +344,13 @@ struct tofPidQa {
histos.fill(HIST("event/evsel"), 2);
}

// Computing Multiplicity first
int ntracks = 0;
int tofmult = 0;
float evtime = 0.f;
float evtimereso = 0.f;
int evtimeflag = 0;

if constexpr (fillHistograms) {
for (auto t : tracks) {
if (applyTrackCut && !t.isGlobalTrack()) {
continue;
}
ntracks += 1;
if (!t.hasTOF()) { // Skipping tracks without TOF
continue;
}
Expand All @@ -378,16 +369,13 @@ struct tofPidQa {
evtimeflag = 4;
}
}
histos.fill(HIST("event/evsel"), 3);
}
if (abs(collision.posZ()) > 10.f) {
return false;
}
if constexpr (fillHistograms) {
histos.fill(HIST("event/evsel"), 4);
histos.fill(HIST("event/evsel"), 3);
histos.fill(HIST("event/vertexz"), collision.posZ());
histos.fill(HIST("event/trackmultiplicity"), ntracks);
histos.fill(HIST("event/tofmultiplicity"), tofmult);

histos.fill(HIST("event/evtime/colltime"), collision.collisionTime() * 1000.f);
histos.fill(HIST("event/evtime/colltimereso"), tofmult, collision.collisionTimeRes() * 1000.f);
Expand Down Expand Up @@ -468,11 +456,21 @@ struct tofPidQa {
return true;
}

using CollisionCandidate = soa::Join<aod::Collisions, aod::EvSels>::iterator;
Filter eventFilter = (applyEvSel.node() == 0) ||
((applyEvSel.node() == 1) && (o2::aod::evsel::sel7 == true)) ||
((applyEvSel.node() == 2) && (o2::aod::evsel::sel8 == true));
Filter trackFilter = (trackSelection.node() == 0) ||
((trackSelection.node() == 1) && requireGlobalTrackInFilter()) ||
((trackSelection.node() == 2) && requireGlobalTrackWoPtEtaInFilter()) ||
((trackSelection.node() == 3) && requireGlobalTrackWoDCAInFilter()) ||
((trackSelection.node() == 4) && requireQualityTracksInFilter()) ||
((trackSelection.node() == 5) && requireInAcceptanceTracksInFilter());
using CollisionCandidate = soa::Filtered<soa::Join<aod::Collisions, aod::EvSels>>::iterator;
using TrackCandidates = soa::Join<aod::Tracks, aod::TracksExtra, aod::TrackSelection,
aod::pidEvTimeFlags, aod::TOFSignal, aod::TOFEvTime>;

void process(CollisionCandidate const& collision,
soa::Join<aod::Tracks, aod::TracksExtra,
aod::TOFSignal, aod::TOFEvTime, aod::pidEvTimeFlags,
aod::TrackSelection> const& tracks)
soa::Filtered<TrackCandidates> const& tracks)
{
isEventSelected<true>(collision, tracks);
for (auto t : tracks) {
Expand Down Expand Up @@ -604,14 +602,12 @@ struct tofPidQa {
}

// QA of nsigma only tables
#define makeProcessFunction(inputPid, particleId) \
void process##particleId(CollisionCandidate const& collision, \
soa::Join<aod::Tracks, aod::TracksExtra, aod::TrackSelection, \
aod::pidEvTimeFlags, aod::TOFSignal, aod::TOFEvTime, \
inputPid> const& tracks) \
{ \
processSingleParticle<PID::particleId, false>(collision, tracks); \
} \
#define makeProcessFunction(inputPid, particleId) \
void process##particleId(CollisionCandidate const& collision, \
soa::Filtered<soa::Join<TrackCandidates, inputPid>> const& tracks) \
{ \
processSingleParticle<PID::particleId, false>(collision, tracks); \
} \
PROCESS_SWITCH(tofPidQa, process##particleId, Form("Process for the %s hypothesis for TOF NSigma QA", #particleId), false);

makeProcessFunction(aod::pidTOFEl, Electron);
Expand All @@ -626,14 +622,12 @@ struct tofPidQa {
#undef makeProcessFunction

// QA of full tables
#define makeProcessFunction(inputPid, particleId) \
void processFull##particleId(CollisionCandidate const& collision, \
soa::Join<aod::Tracks, aod::TracksExtra, aod::TrackSelection, \
aod::pidEvTimeFlags, aod::TOFSignal, aod::TOFEvTime, \
inputPid> const& tracks) \
{ \
processSingleParticle<PID::particleId, true>(collision, tracks); \
} \
#define makeProcessFunction(inputPid, particleId) \
void processFull##particleId(CollisionCandidate const& collision, \
soa::Filtered<soa::Join<TrackCandidates, inputPid>> const& tracks) \
{ \
processSingleParticle<PID::particleId, true>(collision, tracks); \
} \
PROCESS_SWITCH(tofPidQa, processFull##particleId, Form("Process for the %s hypothesis for full TOF PID QA", #particleId), false);

makeProcessFunction(aod::pidTOFFullEl, Electron);
Expand Down
55 changes: 20 additions & 35 deletions DPG/Tasks/AOTTrack/PID/qaPIDTOFBeta.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -16,35 +16,25 @@
///

#include "Framework/AnalysisTask.h"
#include "Common/TableProducer/PID/pidTOFBase.h"
#include "Framework/runDataProcessing.h"
#include "Framework/HistogramRegistry.h"
#include "Framework/StaticFor.h"
#include "Common/DataModel/TrackSelectionTables.h"
#include "Common/DataModel/EventSelection.h"
#include "Common/DataModel/PIDResponse.h"
#include "Common/DataModel/FT0Corrected.h"
#include "Common/TableProducer/PID/pidTOFBase.h"

/// Task to produce the TOF Beta QA plots
struct tofPidBetaQa {
static constexpr int Np = 9;
static constexpr const char* pT[Np] = {"e", "#mu", "#pi", "K", "p", "d", "t", "^{3}He", "#alpha"};
static constexpr std::string_view hexpected[Np] = {"expected/El", "expected/Mu", "expected/Pi",
"expected/Ka", "expected/Pr", "expected/De",
"expected/Tr", "expected/He", "expected/Al"};
static constexpr std::string_view hdelta[Np] = {"delta/El", "delta/Mu", "delta/Pi",
"delta/Ka", "delta/Pr", "delta/De",
"delta/Tr", "delta/He", "delta/Al"};
static constexpr std::string_view hnsigma[Np] = {"nsigma/El", "nsigma/Mu", "nsigma/Pi",
"nsigma/Ka", "nsigma/Pr", "nsigma/De",
"nsigma/Tr", "nsigma/He", "nsigma/Al"};
HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject};

Configurable<int> logAxis{"logAxis", 0, "Flag to use a log momentum axis"};
Configurable<int> nBinsP{"nBinsP", 400, "Number of bins for the momentum"};
Configurable<float> minP{"minP", 0.1f, "Minimum momentum in range"};
Configurable<float> maxP{"maxP", 5.f, "Maximum momentum in range"};
Configurable<int> applyEvSel{"applyEvSel", 2, "Flag to apply event selection cut: 0 -> no event selection, 1 -> Run 2 event selection, 2 -> Run 3 event selection"};
Configurable<bool> applyTrackCut{"applyTrackCut", true, "Flag to apply standard track cuts"};
Configurable<int> trackSelection{"trackSelection", 1, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"};
Configurable<bool> splitTrdTracks{"splitTrdTracks", false, "Flag to fill histograms for tracks with TRD match"};
Configurable<bool> splitSignalPerCharge{"splitSignalPerCharge", true, "Split the signal per charge (reduces memory footprint if off)"};
Configurable<bool> splitSignalPerEvTime{"splitSignalPerEvTime", true, "Split the signal per event time (reduces memory footprint if off)"};
Expand Down Expand Up @@ -190,26 +180,30 @@ struct tofPidBetaQa {
auto h = histos.add<TH1>("event/evsel", "", kTH1F, {{10, 0.5, 10.5, "Ev. Sel."}});
h->GetXaxis()->SetBinLabel(1, "Events read");
h->GetXaxis()->SetBinLabel(2, "Passed ev. sel.");
h->GetXaxis()->SetBinLabel(3, "Passed mult.");
h->GetXaxis()->SetBinLabel(4, "Passed vtx Z");
h->GetXaxis()->SetBinLabel(3, "Passed vtx Z");

h = histos.add<TH1>("event/trackselection", "", kTH1F, {{10, 0.5, 10.5, "Selection passed"}});
h->GetXaxis()->SetBinLabel(1, "Tracks read");
h->GetXaxis()->SetBinLabel(2, "hasTOF");
h->GetXaxis()->SetBinLabel(3, "isGlobalTrack");
}

template <uint8_t i, typename T>
void fillParticleHistos(const T& t, const float tof, const float exp_diff, const float nsigma)
{
histos.fill(HIST(hexpected[i]), t.p(), tof - exp_diff);
histos.fill(HIST(hdelta[i]), t.p(), exp_diff);
histos.fill(HIST(hnsigma[i]), t.p(), nsigma);
}
Filter eventFilter = (applyEvSel.node() == 0) ||
((applyEvSel.node() == 1) && (o2::aod::evsel::sel7 == true)) ||
((applyEvSel.node() == 2) && (o2::aod::evsel::sel8 == true));
Filter trackFilter = (trackSelection.node() == 0) ||
((trackSelection.node() == 1) && requireGlobalTrackInFilter()) ||
((trackSelection.node() == 2) && requireGlobalTrackWoPtEtaInFilter()) ||
((trackSelection.node() == 3) && requireGlobalTrackWoDCAInFilter()) ||
((trackSelection.node() == 4) && requireQualityTracksInFilter()) ||
((trackSelection.node() == 5) && requireInAcceptanceTracksInFilter());

using CollisionCandidate = soa::Join<aod::Collisions, aod::EvSels>::iterator;
using CollisionCandidate = soa::Filtered<soa::Join<aod::Collisions, aod::EvSels>>::iterator;
using TrackCandidates = soa::Join<aod::Tracks, aod::TracksExtra, aod::TrackSelection,
aod::pidTOFbeta, aod::pidTOFmass,
aod::pidEvTimeFlags, aod::TOFSignal, aod::TOFEvTime>;
void process(CollisionCandidate const& collision,
soa::Join<aod::Tracks, aod::TracksExtra, aod::pidTOFbeta, aod::pidTOFmass, aod::TrackSelection, aod::TOFSignal, aod::pidEvTimeFlags> const& tracks)
soa::Filtered<TrackCandidates> const& tracks)
{

histos.fill(HIST("event/evsel"), 1);
Expand All @@ -225,28 +219,19 @@ struct tofPidBetaQa {

histos.fill(HIST("event/evsel"), 2);

// Computing Multiplicity first
float ntracks = 0;
for (auto t : tracks) {
if (applyTrackCut && !t.isGlobalTrack()) {
continue;
}
ntracks += 1;
}
histos.fill(HIST("event/evsel"), 3);
if (abs(collision.posZ()) > 10.f) {
return;
}

histos.fill(HIST("event/evsel"), 4);
histos.fill(HIST("event/evsel"), 3);

for (auto const& track : tracks) {
histos.fill(HIST("event/trackselection"), 1.f);
if (!track.hasTOF()) { // Skipping tracks without TOF
continue;
}
histos.fill(HIST("event/trackselection"), 2.f);
if (applyTrackCut && !track.isGlobalTrack()) {
if (!track.isGlobalTrack()) {
continue;
}
histos.fill(HIST("event/trackselection"), 3.f);
Expand Down
Loading

0 comments on commit af4bac4

Please sign in to comment.