@@ -51,31 +51,53 @@ struct integrationTest {
5151 Configurable<bool > do2DNTrackCorr{" do2DNTrackCorr" , true , " Do 2D Ntrack correlation plots" };
5252
5353 Configurable<bool > doBasicQA{" doBasicQA" , true , " Do basic QA" };
54+ Configurable<bool > checkThinning{" checkThinning" , true , " Check thinning-related quantities (retaining of TPC-only tracks)" };
5455 ConfigurableAxis axisHasDetector{" axisHasDetector" , {16 , -0 .5f , 15 .5f }, " " };
5556 ConfigurableAxis axisEta{" axisEta" , {200 , -2 .0f , 2 .0f }, " " };
5657 ConfigurableAxis axisPhi{" axisPhi" , {200 , 0 .0f , +2 * TMath::Pi ()}, " " };
5758 ConfigurableAxis axisNclu{" axisNclu" , {10 , -0 .5f , 9 .5f }, " " };
5859 ConfigurableAxis axisPt{" axisPt" , {VARIABLE_WIDTH, 0 .0f , 0 .1f , 0 .2f , 0 .3f , 0 .4f , 0 .5f , 0 .6f , 0 .7f , 0 .8f , 0 .9f , 1 .0f , 1 .1f , 1 .2f , 1 .3f , 1 .4f , 1 .5f , 1 .6f , 1 .7f , 1 .8f , 1 .9f , 2 .0f , 2 .2f , 2 .4f , 2 .6f , 2 .8f , 3 .0f , 3 .2f , 3 .4f , 3 .6f , 3 .8f , 4 .0f , 4 .4f , 4 .8f , 5 .2f , 5 .6f , 6 .0f , 6 .5f , 7 .0f , 7 .5f , 8 .0f , 9 .0f , 10 .0f , 11 .0f , 12 .0f , 13 .0f , 14 .0f , 15 .0f , 17 .0f , 19 .0f , 21 .0f , 23 .0f , 25 .0f , 30 .0f , 35 .0f , 40 .0f , 50 .0f }, " pt axis for analysis" };
5960
61+ enum kTrackType { kTrackUsedV0 = 0 ,
62+ kTrackUsedCascade ,
63+ kTrackUsedDecay3Body ,
64+ kTrackUsedTrackedV0 ,
65+ kTrackUsedTrackedCascade ,
66+ kTrackUsedQA };
67+
6068 enum kTable { kBC = 0 ,
69+ kBCFlag ,
6170 kCollision ,
71+ kOrigin ,
6272 kTrack ,
6373 kTrackCov ,
6474 kTrackExtra ,
6575 kMftTrack ,
76+ kMftTrackCov ,
6677 kFwdTrack ,
6778 kFwdTrackCov ,
79+ kFwdTrackCl ,
6880 kAmbiguousTrack ,
6981 kAmbiguousMftTrack ,
7082 kAmbiguousFwdTrack ,
83+ kTracked3Body ,
84+ kTrackedCascade ,
85+ kTrackedV0 ,
86+ kTrackQA ,
7187 kV0 ,
7288 kCascade ,
89+ kDecay3Body ,
7390 kCalo ,
7491 kCaloTrigger ,
92+ kCpvCluster ,
7593 kFDD ,
94+ kFDDExtra ,
7695 kFT0 ,
77- kV0A ,
96+ kFT0Extra ,
97+ kFV0A ,
98+ kFV0AExtra ,
7899 kZDC ,
100+ kHMPID ,
79101 kMcCollision ,
80102 kMcCollisionLabel ,
81103 kMcParticle ,
@@ -91,24 +113,38 @@ struct integrationTest {
91113 TString lTableNames[] =
92114 {
93115 " bc" ,
116+ " bcflag" ,
94117 " collision" ,
118+ " origin" ,
95119 " track_iu" ,
96120 " trackcov_iu" ,
97121 " trackextra" ,
98122 " mfttrack" ,
123+ " mfttrackcov" ,
99124 " fwdtrack" ,
100125 " fwdtrackcov" ,
126+ " fwdtrkcl" ,
101127 " ambiguoustrack" ,
102128 " ambiguousmfttrack" ,
103129 " ambiguousfwdtrack" ,
130+ " tracked3body" ,
131+ " trackedcascade" ,
132+ " trackedv0" ,
133+ " trackqa" ,
104134 " v0" ,
105135 " cascade" ,
136+ " decay3body" ,
106137 " calo" ,
107- " calotrigger"
138+ " calotrigger" ,
139+ " cpvcluster" ,
108140 " fdd" ,
141+ " fddextra" ,
109142 " ft0" ,
143+ " ft0extra" ,
110144 " fv0a" ,
145+ " fv0aextra" ,
111146 " zdc" ,
147+ " hmpid" ,
112148 " mccollision" ,
113149 " mccollisionlabel" ,
114150 " mcparticle" ,
@@ -118,7 +154,7 @@ struct integrationTest {
118154 " Total count" ,
119155 " " // empty (last)
120156 };
121- const AxisSpec axisTables{30 , 0 .0f , 30 .0f , " " };
157+ const AxisSpec axisTables{40 , 0 .0f , 40 .0f , " " };
122158 const AxisSpec axisTracks{nBinsTracks, -0 .5f , MaxNTrack - 0 .5f , " N_{tracks}" };
123159 const AxisSpec axisCollisions{nBinsCollisions, -0 .5f , nBinsCollisions - 0 .5f , " N_{collisions}" };
124160 // Label correctly to avoid confusion
@@ -171,6 +207,32 @@ struct integrationTest {
171207 histos.add <TH1>(" hNCluAll" , " hNCluAll" , HistType::kTH1D , {axisNclu});
172208 histos.add <TH1>(" hNCluNoTPCOnly" , " hNCluNoTPCOnly" , HistType::kTH1D , {axisNclu});
173209 }
210+ if (checkThinning) {
211+ auto hThinningQA = histos.add <TH2>(" hThinningQA" , " hThinningQA" , HistType::kTH2D , {{64 , -0 .5f , 63 .5f }, {2 , -0 .5f , 1 .5f }});
212+
213+ TString kTrackTypeNames [] =
214+ {
215+ " V" ,
216+ " tV" ,
217+ " 3b" ,
218+ " C" ,
219+ " tC" ,
220+ " QA"
221+ };
222+
223+ // construct labels to make this plot easier to understand
224+ for (uint8_t i=0 ; i<64 ; i++){
225+ TString trackTypeString = " " ;
226+ for (uint8_t j=0 ; j<kTrackUsedQA +1 ; j++){
227+ if ( ((i) & (1 <<(j))) ){
228+ trackTypeString.Append (Form (" %s " , kTrackTypeNames [j].Data ()));
229+ }
230+ }
231+ hThinningQA->GetXaxis ()->SetBinLabel (i+1 , trackTypeString.Data ());
232+ }
233+ hThinningQA->GetYaxis ()->SetBinLabel (0 , " Not TPConly" );
234+ hThinningQA->GetYaxis ()->SetBinLabel (1 , " TPConly" );
235+ }
174236 }
175237 // *+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*
176238 // Standard sizes (uncorrelated)
@@ -193,42 +255,163 @@ struct integrationTest {
193255 aod::FDDs const & fdds,
194256 aod::FT0s const & ft0s,
195257 aod::FV0As const & fv0as,
258+ aod::Zdcs const & zdcs)
259+ {
260+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kBC ) + 0 .5f , bcs.size ());
261+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kCollision ) + 0 .5f , collisions.size ());
262+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kTrack ) + 0 .5f , tracks.size ());
263+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kTrackCov ) + 0 .5f , trackcovs.size ());
264+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kTrackExtra ) + 0 .5f , trackextras.size ());
265+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kMftTrack ) + 0 .5f , mfttracks.size ());
266+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFwdTrack ) + 0 .5f , fwdtracks.size ());
267+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFwdTrackCov ) + 0 .5f , fwdtrackcovs.size ());
268+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kAmbiguousTrack ) + 0 .5f , ambitracks.size ());
269+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kAmbiguousMftTrack ) + 0 .5f , ambimfttracks.size ());
270+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kAmbiguousFwdTrack ) + 0 .5f , ambifwdtracks.size ());
271+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kV0 ) + 0 .5f , v0s.size ());
272+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kCascade ) + 0 .5f , cascades.size ());
273+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kCalo ) + 0 .5f , calos.size ());
274+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kCaloTrigger ) + 0 .5f , calotriggers.size ());
275+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFDD ) + 0 .5f , fdds.size ());
276+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFT0 ) + 0 .5f , ft0s.size ());
277+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFV0A ) + 0 .5f , fv0as.size ());
278+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kZDC ) + 0 .5f , zdcs.size ());
279+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFrameCounter ) + 0 .5f );
280+ }
281+ PROCESS_SWITCH (integrationTest, processDataModel, " Check data model" , true );
282+
283+ // *+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*
284+ // Revised tables for newer data
285+ // Warning: will not work for legacy AO2Ds
286+ void processDataModel2026 (
287+ aod::BCs const & bcs,
288+ aod::BCFlags const & bcflags,
289+ aod::Collisions const & collisions,
290+ aod::Origins const & origins,
291+ aod::TracksIU const & tracks,
292+ aod::TracksCovIU const & trackcovs,
293+ aod::TracksExtra const & trackextras,
294+ aod::MFTTracks const & mfttracks,
295+ aod::MFTTracksCov const & mfttrackcovs,
296+ aod::FwdTracks const & fwdtracks,
297+ aod::FwdTracksCov const & fwdtrackcovs,
298+ aod::FwdTrkCls const & fwdtrkcls,
299+ aod::AmbiguousTracks const & ambitracks,
300+ aod::AmbiguousMFTTracks const & ambimfttracks,
301+ aod::AmbiguousFwdTracks const & ambifwdtracks,
302+ aod::Tracked3Bodys const & tracked3bodys,
303+ aod::TrackedCascades const & trackedcascades,
304+ aod::TrackedV0s const & trackedv0s,
305+ aod::TracksQAVersion const & tracksQA, // does not comply with normal iterator naming
306+ aod::V0s const & v0s,
307+ aod::Cascades const & cascades,
308+ aod::Decay3Bodys const & decay3bodys,
309+ aod::Calos const & calos,
310+ aod::CaloTriggers const & calotriggers,
311+ aod::CPVClusters const & cpvclusters,
312+ aod::FDDs const & fdds,
313+ aod::FDDsExtra const & fddsextra,
314+ aod::FT0s const & ft0s,
315+ aod::FT0sExtra const & ft0sextra,
316+ aod::FV0As const & fv0as,
317+ aod::FV0AsExtra const & fv0asextra,
196318 aod::Zdcs const & zdcs,
197- aod::McCollisions const & mccollisions,
198- aod::McCollisionLabels const & mccollisionlabels,
199- aod::McParticles const & mcparticles,
200- aod::McTrackLabels const & mctracklabels,
201- aod::McMFTTrackLabels const & mcmfttracklabels,
202- aod::McFwdTrackLabels const & mcfwdtracklabels)
319+ aod::HMPIDs const & hmpids)
203320 {
204321 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kBC ) + 0 .5f , bcs.size ());
322+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kBCFlag ) + 0 .5f , bcflags.size ());
205323 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kCollision ) + 0 .5f , collisions.size ());
324+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kOrigin ) + 0 .5f , origins.size ());
206325 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kTrack ) + 0 .5f , tracks.size ());
207326 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kTrackCov ) + 0 .5f , trackcovs.size ());
208327 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kTrackExtra ) + 0 .5f , trackextras.size ());
209328 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kMftTrack ) + 0 .5f , mfttracks.size ());
329+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kMftTrackCov ) + 0 .5f , mfttrackcovs.size ());
210330 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFwdTrack ) + 0 .5f , fwdtracks.size ());
211331 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFwdTrackCov ) + 0 .5f , fwdtrackcovs.size ());
332+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFwdTrackCl ) + 0 .5f , fwdtrkcls.size ());
212333 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kAmbiguousTrack ) + 0 .5f , ambitracks.size ());
213334 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kAmbiguousMftTrack ) + 0 .5f , ambimfttracks.size ());
214335 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kAmbiguousFwdTrack ) + 0 .5f , ambifwdtracks.size ());
336+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kTracked3Body ) + 0 .5f , tracked3bodys.size ());
337+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kTrackedCascade ) + 0 .5f , trackedcascades.size ());
338+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kTrackedV0 ) + 0 .5f , trackedv0s.size ());
339+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kTrackQA ) + 0 .5f , tracksQA.size ());
215340 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kV0 ) + 0 .5f , v0s.size ());
216341 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kCascade ) + 0 .5f , cascades.size ());
342+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kDecay3Body ) + 0 .5f , decay3bodys.size ());
217343 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kCalo ) + 0 .5f , calos.size ());
218344 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kCaloTrigger ) + 0 .5f , calotriggers.size ());
345+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kCpvCluster ) + 0 .5f , cpvclusters.size ());
219346 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFDD ) + 0 .5f , fdds.size ());
347+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFDDExtra ) + 0 .5f , fddsextra.size ());
220348 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFT0 ) + 0 .5f , ft0s.size ());
221- histos.fill (HIST (" hTableSizes" ), static_cast <float >(kV0A ) + 0 .5f , fv0as.size ());
349+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFT0Extra ) + 0 .5f , ft0sextra.size ());
350+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFV0A ) + 0 .5f , fv0as.size ());
351+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFV0AExtra ) + 0 .5f , fv0asextra.size ());
222352 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kZDC ) + 0 .5f , zdcs.size ());
353+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kHMPID ) + 0 .5f , hmpids.size ());
354+ histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFrameCounter ) + 0 .5f );
355+
356+ if (checkThinning) {
357+ // perform checks regarding thinning
358+ std::vector<uint8_t > trackBits (tracks.size (), 0 );
359+
360+ if (tracks.size () != trackextras.size ()){
361+ LOGF (fatal, " Check thinning requested and Tracks.size() != TracksExtra.size(). Very bad. Quitting..." );
362+ }
363+
364+ // mark tracks that are used by each kind of composite object
365+ for (const auto & v0 : v0s) {
366+ trackBits[v0.negTrackId ()] = trackBits[v0.negTrackId ()] | (1 << kTrackUsedV0 );
367+ trackBits[v0.posTrackId ()] = trackBits[v0.posTrackId ()] | (1 << kTrackUsedV0 );
368+ }
369+ for (const auto & cascade : cascades) {
370+ auto v0 = cascade.v0 (); // simple de-ref, no table joining
371+ trackBits[v0.negTrackId ()] = trackBits[v0.negTrackId ()] | (1 << kTrackUsedCascade );
372+ trackBits[v0.posTrackId ()] = trackBits[v0.posTrackId ()] | (1 << kTrackUsedCascade );
373+ trackBits[cascade.bachelorId ()] = trackBits[cascade.bachelorId ()] | (1 << kTrackUsedCascade );
374+ }
375+ for (const auto & trackedv0 : trackedv0s) {
376+ auto v0 = trackedv0.v0 (); // simple de-ref, no table joining
377+ trackBits[v0.negTrackId ()] = trackBits[v0.negTrackId ()] | (1 << kTrackUsedTrackedV0 );
378+ trackBits[v0.posTrackId ()] = trackBits[v0.posTrackId ()] | (1 << kTrackUsedTrackedV0 );
379+ }
380+ for (const auto & trackedcascade : trackedcascades) {
381+ auto cascade = trackedcascade.cascade (); // simple de-ref, no table joining
382+ auto v0 = cascade.v0 (); // simple de-ref, no table joining
383+ trackBits[v0.negTrackId ()] = trackBits[v0.negTrackId ()] | (1 << kTrackUsedTrackedCascade );
384+ trackBits[v0.posTrackId ()] = trackBits[v0.posTrackId ()] | (1 << kTrackUsedTrackedCascade );
385+ trackBits[cascade.bachelorId ()] = trackBits[cascade.bachelorId ()] | (1 << kTrackUsedTrackedCascade );
386+ }
387+ for (const auto & trackQA : tracksQA) {
388+ trackBits[trackQA.trackId ()] = trackBits[trackQA.trackId ()] | (1 << kTrackUsedQA );
389+ }
390+ for (uint32_t iTrack = 0 ; iTrack < trackextras.size (); iTrack++) {
391+ auto track = trackextras.rawIteratorAt (iTrack);
392+ bool isTPConly = track.hasTPC () && !track.hasTOF () && !track.hasTRD () && !track.hasITS ();
393+ histos.fill (HIST (" hThinningQA" ), static_cast <float >(trackBits[iTrack]), static_cast <float >(isTPConly));
394+ }
395+ }
396+ }
397+ PROCESS_SWITCH (integrationTest, processDataModel2026, " Check data model, 2026 version" , false );
398+
399+ void processDataModelMC (
400+ aod::McCollisions const & mccollisions,
401+ aod::McCollisionLabels const & mccollisionlabels,
402+ aod::McParticles const & mcparticles,
403+ aod::McTrackLabels const & mctracklabels,
404+ aod::McMFTTrackLabels const & mcmfttracklabels,
405+ aod::McFwdTrackLabels const & mcfwdtracklabels)
406+ {
223407 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kMcCollision ) + 0 .5f , mccollisions.size ());
224408 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kMcCollisionLabel ) + 0 .5f , mccollisionlabels.size ());
225409 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kMcParticle ) + 0 .5f , mcparticles.size ());
226410 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kMcTrackLabel ) + 0 .5f , mctracklabels.size ());
227411 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kMcMftTrackLabel ) + 0 .5f , mcmfttracklabels.size ());
228412 histos.fill (HIST (" hTableSizes" ), static_cast <float >(kMcFwdTrackLabel ) + 0 .5f , mcfwdtracklabels.size ());
229- histos.fill (HIST (" hTableSizes" ), static_cast <float >(kFrameCounter ) + 0 .5f );
230413 }
231- PROCESS_SWITCH (integrationTest, processDataModel , " Check data model" , true );
414+ PROCESS_SWITCH (integrationTest, processDataModelMC , " Check data model for MC tables " , false );
232415
233416 void processBCs (aod::BC const &, aod::Collisions const & collisions)
234417 {
@@ -239,7 +422,7 @@ struct integrationTest {
239422 void processCollisions (aod::Collision const &, FullTracksIU const & tracks, aod::V0s const & v0s, aod::Cascades const & cascades)
240423 {
241424 Int_t lHasITS = 0 , lHasTPC = 0 , lHasTRD = 0 , lHasTOF = 0 , lNotTPCOnly = 0 ;
242- for (auto & track : tracks) {
425+ for (const auto & track : tracks) {
243426 // TPC only bool
244427 bool isTPConly = track.hasTPC () && !track.hasTOF () && !track.hasTRD () && !track.hasITS ();
245428 histos.fill (HIST (" hPt" ), track.pt ());
0 commit comments