Skip to content

TPC: Improve standalone dEdx calculation class - #15650

Draft
tubagundem wants to merge 2 commits into
AliceO2Group:devfrom
tubagundem:TPC_dEdx_calculation
Draft

TPC: Improve standalone dEdx calculation class#15650
tubagundem wants to merge 2 commits into
AliceO2Group:devfrom
tubagundem:TPC_dEdx_calculation

Conversation

@tubagundem

@tubagundem tubagundem commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Changes

  • Merge same-row clusters, then fix the traversal bug this introduced:
    Added handleSameRowClusters(), which merges clusters that fall in the same (sector, row) and are assigned to the same track into a single combined cluster — pad/time are a charge-weighted average, total charge is summed, max charge is the max across the merged clusters. Introducing this merge exposed a bug in the order clusters were traversed along the track; the second commit fixes it by walking clusters in the track's actual native cluster-reference order (rowOrder, recorded on first encounter) instead of assuming a fixed row order.

  • Fixed frequent track-propagation failures, plus a faster propagation option:
    Track propagation (mPropagateTrack) previously left the track state corrupted if rotate() or PropagateToXBxByBz failed partway through a step, causing every later row's propagation to fail too. Both now snapshot the track state first and roll back to it on failure, so one bad row no longer poisons the rest. Also added setPropagateParams() / mPropagateParams, a cheaper alternative that propagates only the track parameters (no material corrections) instead of the full track.

  • Excluded clusters no longer bias the subthreshold fill:
    Minimum-charge tracking and missing-cluster counting used to run over every cluster, including ones that would later be excluded (dead region, edge, failed propagation, etc.). Now they only run over clusters that are actually accepted into the dE/dx calculation.

  • New cluster-exclusion:

    • ExcludeSplitCl split into ExcludeSplitPadCl and ExcludeSplitTimeCl for finer-grained control (bit values renumbered).
    • ExcludeSamePadRowCl — exclude clusters that were merged from the same pad row.
    • Stack-boundary exclusion via new isInStackBoundaries() and a mStackBoundaries table (row ranges per GEM stack), controlled by a new stackBoundaryMethod parameter (0 = disabled, 1 = exclude boundary row, 2 = also exclude the adjacent row).
    • Dead-channel exclusion: a dead channel map is now loaded from CCDB (loadCalibsFromCCDB()) and clusters in dead regions are excluded.
  • Per-region occupancy output:
    Added an AverageOccupancy struct (IROC/OROC1-3) and a new output parameter on calculatedEdx() returning average track occupancy per TPC region.

  • Debug streamer overhaul:
    Replaced the old per-track parallel debug vectors with two linked trees: dEdxDebugTrack (one row per track: pristine track, output, average occupancy, summary counts) and dEdxDebugCl (one row per cluster, with the track's propagated/refit parameters at that cluster). Rows are matched via a new running mDebugTrackIndex. setStreamer() also now keeps a map of streamers keyed by output filename, so different calculatedEdx() calls writing to different debug files each get their own independent tree.

  • Simplified subthreshold cluster filling:
    Removed the Landau-based method (method=2) from fillMissingClusters(), keeping only minimum-charge and minimum-charge/2.

  • getOccupancy() signature change:
    Now takes a cluster time (float) instead of a ClusterNative, and is only valid when the refit method (not propagation) is used, since the occupancy map is only filled by setRefit().

  • Added macro/calculatedEdx.C:
    A full example macro demonstrating standalone use of CalculatedEdx: reads TPC tracks and native clusters (real data or MC), optionally restricts to TPC tracks matched to an ITS track, runs one CalculatedEdx instance per worker thread for parallel processing, validates all parameters up front, and reports CPU/wall-clock timing.

@shahor02

Copy link
Copy Markdown
Collaborator

Is this relevant for the pb26 production?

@tubagundem

Copy link
Copy Markdown
Contributor Author

Is this relevant for the pb26 production?

No, this is just to improve the dE/dx calculation class if we want to use it later or if we want to debug things locally.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants