2424#include " Analysis/AnalysisCut.h"
2525#include " Analysis/AnalysisCompositeCut.h"
2626#include " PID/PIDResponse.h"
27+ #include " Analysis/TrackSelectionTables.h"
2728#include < iostream>
2829
2930using std::cout;
@@ -35,7 +36,7 @@ using namespace o2::framework;
3536using namespace o2 ::aod;
3637
3738using MyEvents = soa::Join<aod::Collisions, aod::EvSels, aod::Cents>;
38- using MyBarrelTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksCov, aod::pidRespTPC, aod::pidRespTOF, aod::pidRespTOFbeta>;
39+ using MyBarrelTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksCov, aod::TracksExtended, aod::TrackSelection, aod:: pidRespTPC, aod::pidRespTOF, aod::pidRespTOFbeta>;
3940
4041// HACK: In order to be able to deduce which kind of aod object is transmitted to the templated VarManager::Fill functions
4142// a constexpr static bit map must be defined and sent as template argument
@@ -45,7 +46,7 @@ using MyBarrelTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksCov,
4546// This is a temporary fix until the arrow/ROOT issues are solved, at which point it will be possible
4647// to automatically detect the object types transmitted to the VarManager
4748constexpr static uint32_t gkEventFillMap = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionCent;
48- constexpr static uint32_t gkTrackFillMap = VarManager::ObjTypes::Track | VarManager::ObjTypes::TrackExtra | VarManager::ObjTypes::TrackCov | VarManager::ObjTypes::TrackPID;
49+ constexpr static uint32_t gkTrackFillMap = VarManager::ObjTypes::Track | VarManager::ObjTypes::TrackExtra | VarManager::ObjTypes::TrackDCA | VarManager::ObjTypes::TrackSelection | VarManager::ObjTypes:: TrackCov | VarManager::ObjTypes::TrackPID;
4950
5051struct TableMaker {
5152
@@ -71,6 +72,14 @@ struct TableMaker {
7172 // Cuts should be defined using Configurables (prepare cut libraries, as discussed in O2 DQ meetings)
7273 AnalysisCompositeCut* fTrackCut ;
7374
75+ // Partition will select fast a group of tracks with basic requirements
76+ // If some of the cuts cannot be included in the Partition expression, add them via AnalysisCut(s)
77+ 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 ;
78+
79+ // 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)
80+ // Update the data model to have them as expression columns
81+ Partition<aod::Muons> muonSelectedTracks = o2::aod::muon::pt >= 1 .0f ;
82+
7483 void init (o2::framework::InitContext&)
7584 {
7685 fValues = new float [VarManager::kNVars ];
@@ -95,13 +104,13 @@ struct TableMaker {
95104
96105 fTrackCut = new AnalysisCompositeCut (true );
97106 AnalysisCut* trackVarCut = new AnalysisCut ();
98- trackVarCut->AddCut (VarManager::kPt , 1.0 , 1000.0 );
99- trackVarCut->AddCut (VarManager::kEta , -0.9 , 0.9 );
100- trackVarCut->AddCut (VarManager::kTPCsignal , 70.0 , 100.0 );
101- // trackVarCut->AddCut(VarManager::kIsITSrefit, 0.5, 1.5);
102- // trackVarCut->AddCut(VarManager::kIsTPCrefit, 0.5, 1.5);
103- trackVarCut->AddCut (VarManager::kTPCchi2 , 0.0 , 4.0 );
104- trackVarCut->AddCut (VarManager::kITSchi2 , 0.1 , 36.0 );
107+ // trackVarCut->AddCut(VarManager::kPt, 1.0, 1000.0);
108+ // trackVarCut->AddCut(VarManager::kEta, -0.9, 0.9);
109+ // trackVarCut->AddCut(VarManager::kTPCsignal, 70.0, 100.0);
110+ trackVarCut->AddCut (VarManager::kIsITSrefit , 0.5 , 1.5 );
111+ trackVarCut->AddCut (VarManager::kIsTPCrefit , 0.5 , 1.5 );
112+ // trackVarCut->AddCut(VarManager::kTPCchi2, 0.0, 4.0);
113+ // trackVarCut->AddCut(VarManager::kITSchi2, 0.1, 36.0);
105114 trackVarCut->AddCut (VarManager::kTPCncls , 100.0 , 161 .);
106115
107116 AnalysisCut* pidCut1 = new AnalysisCut ();
@@ -140,42 +149,33 @@ struct TableMaker {
140149 eventVtxCov (collision.covXX (), collision.covXY (), collision.covXZ (), collision.covYY (), collision.covYZ (), collision.covZZ (), collision.chi2 ());
141150
142151 uint64_t trackFilteringTag = 0 ;
143- float sinAlpha = 0 .f ;
144- float cosAlpha = 0 .f ;
145- float globalX = 0 .f ;
146- float globalY = 0 .f ;
147- float dcaXY = 0 .f ;
148- float dcaZ = 0 .f ;
149- for (auto & track : tracksBarrel) {
152+ trackBasic.reserve (barrelSelectedTracks.size ());
153+ trackBarrel.reserve (barrelSelectedTracks.size ());
154+ trackBarrelCov.reserve (barrelSelectedTracks.size ());
155+ trackBarrelPID.reserve (barrelSelectedTracks.size ());
150156
157+ for (auto & track : barrelSelectedTracks) {
151158 VarManager::FillTrack<gkTrackFillMap>(track, fValues );
152159 fHistMan ->FillHistClass (" TrackBarrel_BeforeCuts" , fValues );
153160 if (!fTrackCut ->IsSelected (fValues )) {
154161 continue ;
155162 }
156163 fHistMan ->FillHistClass (" TrackBarrel_AfterCuts" , fValues );
157164
158- // TODO: update the DCA calculation (use the values computed in the trackSelection workflow or use the propagateToDCA function from there)
159- // TODO: Move the DCA calculation in the VarManager, so the DCA is available for cuts and histograms
160- sinAlpha = sin (track.alpha ());
161- cosAlpha = cos (track.alpha ());
162- globalX = track.x () * cosAlpha - track.y () * sinAlpha;
163- globalY = track.x () * sinAlpha + track.y () * cosAlpha;
164-
165- dcaXY = sqrt (pow ((globalX - collision.posX ()), 2 ) +
166- pow ((globalY - collision.posY ()), 2 ));
167- dcaZ = sqrt (pow (track.z () - collision.posZ (), 2 ));
168-
165+ if (track.isGlobalTrack ()) {
166+ trackFilteringTag |= (uint64_t (1 ) << 0 );
167+ }
168+ if (track.isGlobalTrackSDD ()) {
169+ trackFilteringTag |= (uint64_t (1 ) << 1 );
170+ }
169171 trackBasic (event.lastIndex (), track.globalIndex (), trackFilteringTag, track.pt (), track.eta (), track.phi (), track.charge ());
170172 trackBarrel (track.tpcInnerParam (), track.flags (), track.itsClusterMap (), track.itsChi2NCl (),
171173 track.tpcNClsFindable (), track.tpcNClsFindableMinusFound (), track.tpcNClsFindableMinusCrossedRows (),
172174 track.tpcNClsShared (), track.tpcChi2NCl (),
173175 track.trdChi2 (), track.tofChi2 (),
174- track.length (), dcaXY, dcaZ);
176+ track.length (), track. dcaXY (), track. dcaZ () );
175177 trackBarrelCov (track.cYY (), track.cZZ (), track.cSnpSnp (), track.cTglTgl (), track.c1Pt21Pt2 ());
176178 trackBarrelPID (track.tpcSignal (),
177- /* 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
178- 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);*/
179179 track.tpcNSigmaEl (), track.tpcNSigmaMu (),
180180 track.tpcNSigmaPi (), track.tpcNSigmaKa (), track.tpcNSigmaPr (),
181181 track.tpcNSigmaDe (), track.tpcNSigmaTr (), track.tpcNSigmaHe (), track.tpcNSigmaAl (),
@@ -186,12 +186,14 @@ struct TableMaker {
186186 track.trdSignal ());
187187 }
188188
189- for (auto & muon : tracksMuon) {
189+ muonBasic.reserve (muonSelectedTracks.size ());
190+ muonExtended.reserve (muonSelectedTracks.size ());
191+ for (auto & muon : muonSelectedTracks) {
190192 // TODO: add proper information for muon tracks
191- if (muon.bc () != collision.bc ()) {
193+ if (muon.bcId () != collision.bcId ()) {
192194 continue ;
193195 }
194- // TODO: the trackFilteringFlag will not be needed to encode whether the track is a muon since there is a dedicated table for muons
196+ // TODO: the trackFilteringTag will not be needed to encode whether the track is a muon since there is a dedicated table for muons
195197 trackFilteringTag |= (uint64_t (1 ) << 0 ); // this is a MUON arm track
196198 muonBasic (event.lastIndex (), trackFilteringTag, muon.pt (), muon.eta (), muon.phi (), muon.charge ());
197199 muonExtended (muon.inverseBendingMomentum (), muon.thetaX (), muon.thetaY (), muon.zMu (), muon.bendingCoor (), muon.nonBendingCoor (), muon.chi2 (), muon.chi2MatchTrigger ());
@@ -233,9 +235,10 @@ struct TableMaker {
233235 fHistMan ->AddHistogram (classStr.Data (), " ITSncls" , " Number of cluster in ITS" , false , 8 , -0.5 , 7.5 , VarManager::kITSncls ); // TH1F histogram
234236 // for TPC PID
235237 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
236-
237- // fHistMan->AddHistogram(classStr.Data(), "DCAxy", "DCAxy", false, 100, -3.0, 3.0, VarManager::kTrackDCAxy); // TH1F histogram
238- // fHistMan->AddHistogram(classStr.Data(), "DCAz", "DCAz", false, 100, -5.0, 5.0, VarManager::kTrackDCAz); // TH1F histogram
238+ fHistMan ->AddHistogram (classStr.Data (), " DCAxy" , " DCAxy" , false , 100 , -3.0 , 3.0 , VarManager::kTrackDCAxy ); // TH1F histogram
239+ fHistMan ->AddHistogram (classStr.Data (), " DCAz" , " DCAz" , false , 100 , -5.0 , 5.0 , VarManager::kTrackDCAz ); // TH1F histogram
240+ fHistMan ->AddHistogram (classStr.Data (), " IsGlobalTrack" , " IsGlobalTrack" , false , 2 , -0.5 , 1.5 , VarManager::kIsGlobalTrack ); // TH1F histogram
241+ fHistMan ->AddHistogram (classStr.Data (), " IsGlobalTrackSDD" , " IsGlobalTrackSDD" , false , 2 , -0.5 , 1.5 , VarManager::kIsGlobalTrackSDD ); // TH1F histogram
239242 }
240243 }
241244 } // end loop over histogram classes
0 commit comments