Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 32 additions & 20 deletions Analysis/Core/include/Analysis/VarManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ static const float fgkMuonMass = 0.105; // GeV
class VarManager : public TObject
{
public:
// map the information contained in the objects passed to the Fill functions
enum ObjTypes {
BC = BIT(0),
Collision = BIT(1),
Expand All @@ -47,13 +48,15 @@ class VarManager : public TObject
TrackCov = BIT(1),
TrackExtra = BIT(2),
TrackPID = BIT(3),
TrackDCA = BIT(4),
TrackSelection = BIT(5),
// TODO: Central model MUON variables to be added
ReducedTrack = BIT(4),
ReducedTrackBarrel = BIT(5),
ReducedTrackBarrelCov = BIT(6),
ReducedTrackBarrelPID = BIT(7),
ReducedTrackMuon = BIT(8),
Pair = BIT(9)
ReducedTrack = BIT(6),
ReducedTrackBarrel = BIT(7),
ReducedTrackBarrelCov = BIT(8),
ReducedTrackBarrelPID = BIT(9),
ReducedTrackMuon = BIT(10),
Pair = BIT(11)
};

public:
Expand Down Expand Up @@ -103,6 +106,8 @@ class VarManager : public TObject

// Barrel track variables
kPin,
kIsGlobalTrack,
kIsGlobalTrackSDD,
kIsITSrefit,
kIsSPDany,
kIsSPDfirst,
Expand Down Expand Up @@ -298,22 +303,22 @@ void VarManager::FillEvent(T const& event, float* values)
values[kBC] = event.globalBC();
values[kCentVZERO] = event.centV0M();
if (fgUsedVars[kIsINT7]) {
values[kIsINT7] = event.triggerAlias() & (uint32_t(1) << kINT7);
values[kIsINT7] = (event.triggerAlias() & (uint32_t(1) << kINT7)) > 0;
}
if (fgUsedVars[kIsEMC7]) {
values[kIsEMC7] = event.triggerAlias() & (uint32_t(1) << kEMC7);
values[kIsEMC7] = (event.triggerAlias() & (uint32_t(1) << kEMC7)) > 0;
}
if (fgUsedVars[kIsINT7inMUON]) {
values[kIsINT7inMUON] = event.triggerAlias() & (uint32_t(1) << kINT7inMUON);
values[kIsINT7inMUON] = (event.triggerAlias() & (uint32_t(1) << kINT7inMUON)) > 0;
}
if (fgUsedVars[kIsMuonSingleLowPt7]) {
values[kIsMuonSingleLowPt7] = event.triggerAlias() & (uint32_t(1) << kMuonSingleLowPt7);
values[kIsMuonSingleLowPt7] = (event.triggerAlias() & (uint32_t(1) << kMuonSingleLowPt7)) > 0;
}
if (fgUsedVars[kIsMuonUnlikeLowPt7]) {
values[kIsMuonUnlikeLowPt7] = event.triggerAlias() & (uint32_t(1) << kMuonUnlikeLowPt7);
values[kIsMuonUnlikeLowPt7] = (event.triggerAlias() & (uint32_t(1) << kMuonUnlikeLowPt7)) > 0;
}
if (fgUsedVars[kIsMuonLikeLowPt7]) {
values[kIsMuonLikeLowPt7] = event.triggerAlias() & (uint32_t(1) << kMuonLikeLowPt7);
values[kIsMuonLikeLowPt7] = (event.triggerAlias() & (uint32_t(1) << kMuonLikeLowPt7)) > 0;
}
}

Expand Down Expand Up @@ -356,19 +361,19 @@ void VarManager::FillTrack(T const& track, float* values)
if constexpr ((fillMap & TrackExtra) > 0 || (fillMap & ReducedTrackBarrel) > 0) {
values[kPin] = track.tpcInnerParam();
if (fgUsedVars[kIsITSrefit]) {
values[kIsITSrefit] = track.flags() & (uint64_t(1) << 2); // TODO: the flag mapping needs to be updated
values[kIsITSrefit] = (track.flags() & (uint32_t(1) << 0)) > 0;
}
if (fgUsedVars[kIsTPCrefit]) {
values[kIsTPCrefit] = track.flags() & (uint64_t(1) << 6); // TODO: the flag mapping needs to be updated
values[kIsTPCrefit] = (track.flags() & (uint32_t(1) << 1)) > 0;
}
if (fgUsedVars[kIsSPDfirst]) {
values[kIsSPDfirst] = track.itsClusterMap() & uint8_t(1);
values[kIsSPDfirst] = (track.itsClusterMap() & uint8_t(1)) > 0;
}
if (fgUsedVars[kIsSPDboth]) {
values[kIsSPDboth] = track.itsClusterMap() & uint8_t(3);
values[kIsSPDboth] = (track.itsClusterMap() & uint8_t(3)) > 0;
}
if (fgUsedVars[kIsSPDany]) {
values[kIsSPDfirst] = (track.itsClusterMap() & uint8_t(1)) || (track.itsClusterMap() & uint8_t(2));
values[kIsSPDany] = (track.itsClusterMap() & uint8_t(1)) || (track.itsClusterMap() & uint8_t(2));
}
values[kITSchi2] = track.itsChi2NCl();
values[kTPCncls] = track.tpcNClsFound();
Expand All @@ -379,9 +384,6 @@ void VarManager::FillTrack(T const& track, float* values)
if (fgUsedVars[kITSncls]) {
values[kITSncls] = track.itsNCls(); // dynamic column
}
// TODO: DCA calculation for central data model tracks to be added here
values[kTrackDCAxy] = -9999.;
values[kTrackDCAz] = -9999.;
}
if constexpr ((fillMap & ReducedTrackBarrel) > 0) {
if (fgUsedVars[kITSncls]) {
Expand All @@ -395,6 +397,16 @@ void VarManager::FillTrack(T const& track, float* values)
}
}

if constexpr ((fillMap & TrackDCA) > 0) {
values[kTrackDCAxy] = track.dcaXY();
values[kTrackDCAz] = track.dcaZ();
}

if constexpr ((fillMap & TrackSelection) > 0) {
values[kIsGlobalTrack] = track.isGlobalTrack();
values[kIsGlobalTrackSDD] = track.isGlobalTrackSDD();
}

if constexpr ((fillMap & TrackCov) > 0 || (fillMap & ReducedTrackBarrelCov) > 0) {
values[kTrackCYY] = track.cYY();
values[kTrackCZZ] = track.cZZ();
Expand Down
75 changes: 39 additions & 36 deletions Analysis/Tasks/PWGDQ/tableMaker.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "Analysis/AnalysisCut.h"
#include "Analysis/AnalysisCompositeCut.h"
#include "PID/PIDResponse.h"
#include "Analysis/TrackSelectionTables.h"
#include <iostream>

using std::cout;
Expand All @@ -35,7 +36,7 @@ using namespace o2::framework;
using namespace o2::aod;

using MyEvents = soa::Join<aod::Collisions, aod::EvSels, aod::Cents>;
using MyBarrelTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksCov, aod::pidRespTPC, aod::pidRespTOF, aod::pidRespTOFbeta>;
using MyBarrelTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksCov, aod::TracksExtended, aod::TrackSelection, aod::pidRespTPC, aod::pidRespTOF, aod::pidRespTOFbeta>;

// HACK: In order to be able to deduce which kind of aod object is transmitted to the templated VarManager::Fill functions
// a constexpr static bit map must be defined and sent as template argument
Expand All @@ -45,7 +46,7 @@ using MyBarrelTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksCov,
// This is a temporary fix until the arrow/ROOT issues are solved, at which point it will be possible
// to automatically detect the object types transmitted to the VarManager
constexpr static uint32_t gkEventFillMap = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionCent;
constexpr static uint32_t gkTrackFillMap = VarManager::ObjTypes::Track | VarManager::ObjTypes::TrackExtra | VarManager::ObjTypes::TrackCov | VarManager::ObjTypes::TrackPID;
constexpr static uint32_t gkTrackFillMap = VarManager::ObjTypes::Track | VarManager::ObjTypes::TrackExtra | VarManager::ObjTypes::TrackDCA | VarManager::ObjTypes::TrackSelection | VarManager::ObjTypes::TrackCov | VarManager::ObjTypes::TrackPID;

struct TableMaker {

Expand All @@ -71,6 +72,14 @@ struct TableMaker {
// Cuts should be defined using Configurables (prepare cut libraries, as discussed in O2 DQ meetings)
AnalysisCompositeCut* fTrackCut;

// Partition will select fast a group of tracks with basic requirements
// If some of the cuts cannot be included in the Partition expression, add them via AnalysisCut(s)
Partition<MyBarrelTracks> barrelSelectedTracks = o2::aod::track::pt >= 1.0f && nabs(o2::aod::track::eta) <= 0.9f && o2::aod::track::tpcSignal >= 70.0f && o2::aod::track::tpcSignal <= 100.0f && o2::aod::track::tpcChi2NCl < 4.0f && o2::aod::track::itsChi2NCl < 36.0f;

// TODO a few of the important muon variables in the central data model are dynamic columns so not usable in expressions (e.g. eta, phi)
// Update the data model to have them as expression columns
Partition<aod::Muons> muonSelectedTracks = o2::aod::muon::pt >= 1.0f;

void init(o2::framework::InitContext&)
{
fValues = new float[VarManager::kNVars];
Expand All @@ -95,13 +104,13 @@ struct TableMaker {

fTrackCut = new AnalysisCompositeCut(true);
AnalysisCut* trackVarCut = new AnalysisCut();
trackVarCut->AddCut(VarManager::kPt, 1.0, 1000.0);
trackVarCut->AddCut(VarManager::kEta, -0.9, 0.9);
trackVarCut->AddCut(VarManager::kTPCsignal, 70.0, 100.0);
//trackVarCut->AddCut(VarManager::kIsITSrefit, 0.5, 1.5);
//trackVarCut->AddCut(VarManager::kIsTPCrefit, 0.5, 1.5);
trackVarCut->AddCut(VarManager::kTPCchi2, 0.0, 4.0);
trackVarCut->AddCut(VarManager::kITSchi2, 0.1, 36.0);
//trackVarCut->AddCut(VarManager::kPt, 1.0, 1000.0);
//trackVarCut->AddCut(VarManager::kEta, -0.9, 0.9);
//trackVarCut->AddCut(VarManager::kTPCsignal, 70.0, 100.0);
trackVarCut->AddCut(VarManager::kIsITSrefit, 0.5, 1.5);
trackVarCut->AddCut(VarManager::kIsTPCrefit, 0.5, 1.5);
//trackVarCut->AddCut(VarManager::kTPCchi2, 0.0, 4.0);
//trackVarCut->AddCut(VarManager::kITSchi2, 0.1, 36.0);
trackVarCut->AddCut(VarManager::kTPCncls, 100.0, 161.);

AnalysisCut* pidCut1 = new AnalysisCut();
Expand Down Expand Up @@ -140,42 +149,33 @@ struct TableMaker {
eventVtxCov(collision.covXX(), collision.covXY(), collision.covXZ(), collision.covYY(), collision.covYZ(), collision.covZZ(), collision.chi2());

uint64_t trackFilteringTag = 0;
float sinAlpha = 0.f;
float cosAlpha = 0.f;
float globalX = 0.f;
float globalY = 0.f;
float dcaXY = 0.f;
float dcaZ = 0.f;
for (auto& track : tracksBarrel) {
trackBasic.reserve(barrelSelectedTracks.size());
trackBarrel.reserve(barrelSelectedTracks.size());
trackBarrelCov.reserve(barrelSelectedTracks.size());
trackBarrelPID.reserve(barrelSelectedTracks.size());

for (auto& track : barrelSelectedTracks) {
VarManager::FillTrack<gkTrackFillMap>(track, fValues);
fHistMan->FillHistClass("TrackBarrel_BeforeCuts", fValues);
if (!fTrackCut->IsSelected(fValues)) {
continue;
}
fHistMan->FillHistClass("TrackBarrel_AfterCuts", fValues);

// TODO: update the DCA calculation (use the values computed in the trackSelection workflow or use the propagateToDCA function from there)
// TODO: Move the DCA calculation in the VarManager, so the DCA is available for cuts and histograms
sinAlpha = sin(track.alpha());
cosAlpha = cos(track.alpha());
globalX = track.x() * cosAlpha - track.y() * sinAlpha;
globalY = track.x() * sinAlpha + track.y() * cosAlpha;

dcaXY = sqrt(pow((globalX - collision.posX()), 2) +
pow((globalY - collision.posY()), 2));
dcaZ = sqrt(pow(track.z() - collision.posZ(), 2));

if (track.isGlobalTrack()) {
trackFilteringTag |= (uint64_t(1) << 0);
}
if (track.isGlobalTrackSDD()) {
trackFilteringTag |= (uint64_t(1) << 1);
}
trackBasic(event.lastIndex(), track.globalIndex(), trackFilteringTag, track.pt(), track.eta(), track.phi(), track.charge());
trackBarrel(track.tpcInnerParam(), track.flags(), track.itsClusterMap(), track.itsChi2NCl(),
track.tpcNClsFindable(), track.tpcNClsFindableMinusFound(), track.tpcNClsFindableMinusCrossedRows(),
track.tpcNClsShared(), track.tpcChi2NCl(),
track.trdChi2(), track.tofChi2(),
track.length(), dcaXY, dcaZ);
track.length(), track.dcaXY(), track.dcaZ());
trackBarrelCov(track.cYY(), track.cZZ(), track.cSnpSnp(), track.cTglTgl(), track.c1Pt21Pt2());
trackBarrelPID(track.tpcSignal(),
/*0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);*/
track.tpcNSigmaEl(), track.tpcNSigmaMu(),
track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr(),
track.tpcNSigmaDe(), track.tpcNSigmaTr(), track.tpcNSigmaHe(), track.tpcNSigmaAl(),
Expand All @@ -186,12 +186,14 @@ struct TableMaker {
track.trdSignal());
}

for (auto& muon : tracksMuon) {
muonBasic.reserve(muonSelectedTracks.size());
muonExtended.reserve(muonSelectedTracks.size());
for (auto& muon : muonSelectedTracks) {
// TODO: add proper information for muon tracks
if (muon.bc() != collision.bc()) {
if (muon.bcId() != collision.bcId()) {
continue;
}
// TODO: the trackFilteringFlag will not be needed to encode whether the track is a muon since there is a dedicated table for muons
// TODO: the trackFilteringTag will not be needed to encode whether the track is a muon since there is a dedicated table for muons
trackFilteringTag |= (uint64_t(1) << 0); // this is a MUON arm track
muonBasic(event.lastIndex(), trackFilteringTag, muon.pt(), muon.eta(), muon.phi(), muon.charge());
muonExtended(muon.inverseBendingMomentum(), muon.thetaX(), muon.thetaY(), muon.zMu(), muon.bendingCoor(), muon.nonBendingCoor(), muon.chi2(), muon.chi2MatchTrigger());
Expand Down Expand Up @@ -233,9 +235,10 @@ struct TableMaker {
fHistMan->AddHistogram(classStr.Data(), "ITSncls", "Number of cluster in ITS", false, 8, -0.5, 7.5, VarManager::kITSncls); // TH1F histogram
//for TPC PID
fHistMan->AddHistogram(classStr.Data(), "TPCdedx_pIN", "TPC dE/dx vs pIN", false, 200, 0.0, 20.0, VarManager::kPin, 200, 0.0, 200., VarManager::kTPCsignal); // TH2F histogram

//fHistMan->AddHistogram(classStr.Data(), "DCAxy", "DCAxy", false, 100, -3.0, 3.0, VarManager::kTrackDCAxy); // TH1F histogram
//fHistMan->AddHistogram(classStr.Data(), "DCAz", "DCAz", false, 100, -5.0, 5.0, VarManager::kTrackDCAz); // TH1F histogram
fHistMan->AddHistogram(classStr.Data(), "DCAxy", "DCAxy", false, 100, -3.0, 3.0, VarManager::kTrackDCAxy); // TH1F histogram
fHistMan->AddHistogram(classStr.Data(), "DCAz", "DCAz", false, 100, -5.0, 5.0, VarManager::kTrackDCAz); // TH1F histogram
fHistMan->AddHistogram(classStr.Data(), "IsGlobalTrack", "IsGlobalTrack", false, 2, -0.5, 1.5, VarManager::kIsGlobalTrack); // TH1F histogram
fHistMan->AddHistogram(classStr.Data(), "IsGlobalTrackSDD", "IsGlobalTrackSDD", false, 2, -0.5, 1.5, VarManager::kIsGlobalTrackSDD); // TH1F histogram
}
}
} // end loop over histogram classes
Expand Down
13 changes: 10 additions & 3 deletions Analysis/Tasks/PWGDQ/tableReader.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,8 @@ struct BarrelTrackSelection {

uint8_t filterMap = uint8_t(0);

trackSel.reserve(tracks.size());

for (auto& track : tracks) {
filterMap = uint8_t(0);
VarManager::FillTrack<gkTrackFillMap>(track, fValues);
Expand Down Expand Up @@ -500,8 +502,9 @@ WorkflowSpec defineDataProcessing(ConfigContext const&)
adaptAnalysisTask<EventSelection>("my-event-selection"),
adaptAnalysisTask<BarrelTrackSelection>("barrel-track-selection"),
adaptAnalysisTask<MuonTrackSelection>("muon-track-selection"),
adaptAnalysisTask<TableReader>("table-reader")
//adaptAnalysisTask<DileptonHadronAnalysis>("dilepton-hadron")
adaptAnalysisTask<TableReader>("table-reader"),
adaptAnalysisTask<DileptonHadronAnalysis>("dilepton-hadron")

};
}

Expand Down Expand Up @@ -556,9 +559,13 @@ void DefineHistograms(HistogramManager* histMan, TString histClasses)
histMan->AddHistogram(classStr.Data(), "TPCncls_Run", "Number of cluster in TPC", true, kNRuns, 0.5, 0.5 + kNRuns, VarManager::kRunId,
10, -0.5, 159.5, VarManager::kTPCncls, 10, 0., 1., VarManager::kNothing, runsStr.Data()); // TH1F histogram
histMan->AddHistogram(classStr.Data(), "ITSncls", "Number of cluster in ITS", false, 8, -0.5, 7.5, VarManager::kITSncls); // TH1F histogram
histMan->AddHistogram(classStr.Data(), "ITSchi2", "ITS chi2", false, 100, 0.0, 50.0, VarManager::kITSchi2); // TH1F histogram
histMan->AddHistogram(classStr.Data(), "IsITSrefit", "", false, 2, -0.5, 1.5, VarManager::kIsITSrefit); // TH1F histogram
histMan->AddHistogram(classStr.Data(), "IsTPCrefit", "", false, 2, -0.5, 1.5, VarManager::kIsTPCrefit); // TH1F histogram
histMan->AddHistogram(classStr.Data(), "IsSPDany", "", false, 2, -0.5, 1.5, VarManager::kIsSPDany); // TH1F histogram
//for TPC PID
histMan->AddHistogram(classStr.Data(), "TPCdedx_pIN", "TPC dE/dx vs pIN", false, 200, 0.0, 20.0, VarManager::kPin, 200, 0.0, 200., VarManager::kTPCsignal); // TH2F histogram

histMan->AddHistogram(classStr.Data(), "TPCchi2", "TPC chi2", false, 100, 0.0, 10.0, VarManager::kTPCchi2); // TH1F histogram
histMan->AddHistogram(classStr.Data(), "DCAxy", "DCAxy", false, 100, -3.0, 3.0, VarManager::kTrackDCAxy); // TH1F histogram
histMan->AddHistogram(classStr.Data(), "DCAz", "DCAz", false, 100, -5.0, 5.0, VarManager::kTrackDCAz); // TH1F histogram
}
Expand Down