Skip to content

sEPD Event Plane Calibration - Generation#4106

Merged
pinkenburg merged 16 commits intosPHENIX-Collaboration:masterfrom
Steepspace:sEPD-Calib-Gen
Feb 22, 2026
Merged

sEPD Event Plane Calibration - Generation#4106
pinkenburg merged 16 commits intosPHENIX-Collaboration:masterfrom
Steepspace:sEPD-Calib-Gen

Conversation

@Steepspace
Copy link
Copy Markdown
Contributor

@Steepspace Steepspace commented Jan 13, 2026

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work for users)
  • Requiring change in macros repository (Please provide links to the macros pull request in the last section)
  • I am a member of GitHub organization of sPHENIX Collaboration, EIC, or ECCE (contact Chris Pinkenburg to join)

What kind of change does this PR introduce? (Bug fix, feature, ...)

This PR introduces the sEPD Q Vector calibration engine and CDB generation components for the sEPD Event Plane calibration pipeline. It establishes a centralized definition system and implements the physics logic for re-centering, flattening, and database payload generation.

Summary:

  • sEPD_TreeGen.h/cc: Extract event-level and tower-level sEPD data into TTrees and QA histograms.
  • QVecDefs.h: Establishes a shared namespace for harmonics, centrality bins, and standardized naming conventions for histograms.
  • QVecCalib.h/cc: Orchestrates the three-pass calibration logic (Re-centering, Flattening, and Validation).
  • QVecCDB.h/cc: Manages the transformation of calibration moments and bad tower maps into standardized CDB payloads.
  • GenQVecCalib.cc & GenQVecCDB.cc: Executable drivers for the calibration processing and database commitment stages.

TODOs (if applicable)

Links to other PRs in macros and calibration repositories (if applicable)

sPHENIX-Collaboration/macros#1270

Motivation

This PR establishes the sEPD Q-vector calibration engine and CDB generation components for the Event Plane calibration pipeline. The work implements a complete three-pass calibration workflow (Re-centering, Flattening, Validation) to correct for systematic effects in Q-vector measurements from the sEPD detector.

Key Changes

Core Calibration Infrastructure:

  • QVecCalib (module + implementation): Implements three-pass calibration logic as a Fun4All SubsysReco module, reads from slim DST, merges QVecCDB functionality, and writes calibration results to both ROOT and CDB formats
  • sEPD_TreeGen (module + implementation): Extracts event-level and tower-level sEPD data into DST/TTrees with QA histogram generation, validates events against vertex/minimum-bias criteria, and produces per-channel charge recording
  • QVecDefs.h: Centralized definitions for calibration constants (HARMONICS = {2, 3, 4}, CENT_BINS = 80 at 1% granularity, SEPD_CHANNELS = 744) and utility naming functions
  • EventPlaneData: New PHObject-derived data structure (header + implementation + ROOT dictionary) for storing calibrated event-plane information with per-channel sEPD charge arrays

Build Configuration:

  • New Makefile.am for the sepd_eventplanecalib subsystem with dependencies on phool, SubsysReco, centrality_io, fun4all, ffamodules, globalvertex_io, calomodules, cdbobjects, and epd_io
  • Autotools configuration (configure.ac, autogen.sh) for project bootstrap

Code Quality Improvements:

  • Removed std::format and unique_ptr usage for broader compiler compatibility
  • Updated centrality binning from coarser to 1% bin granularity
  • Increased debug/progress-report frequency thresholds to reduce log verbosity
  • Applied clang-tidy fixes and removed unused/redundant executables (GenQVecCalib.cc, GenQVecCDB.cc)

Potential Risk Areas

  1. I/O Format Changes: Introduction of new CDB payload structures and EventPlaneData PHObject could impact downstream reconstruction if legacy code expects different object formats. Verify compatibility with existing reconstruction chains.

  2. Centrality Binning: Transition from coarser to 1% bins increases memory/storage requirements for correction matrices and histograms. Monitor performance impact with high-occupancy datasets.

  3. Three-Pass Workflow: The calibration pipeline has state dependencies between passes. Ensure correct pass sequencing (ComputeRecentering → ApplyRecentering → ApplyFlattening) to avoid incorrect calibration factors.

  4. File I/O and DST Dependencies: Code reads from slim DST and QA histogram files; missing or malformed input files will fail gracefully but should be validated in large-scale production runs.

  5. ROOT Dictionary Generation: Addition of EventPlaneDataLinkDef.h requires proper rootcint invocation during build. Check that the dictionary is correctly embedded in the shared library.

Possible Future Improvements

  • Extend calibration to support additional Q-vector harmonics beyond {2, 3, 4}
  • Implement data validation/quality checks during CDB writing to catch anomalous corrections before deployment
  • Add streaming/online capability for real-time calibration monitoring during data-taking
  • Decouple correction factor I/O to support formats beyond ROOT (e.g., JSON, HDF5) for easier external analysis
  • Parallelization of per-centrality-bin processing for large calibration datasets

Note: This summary is AI-generated and may contain inaccuracies. Please use your best judgment when reviewing technical details, especially regarding the three-pass calibration interdependencies and data format compatibility with existing code paths.

This commit introduces the sEPD Q Vector calibration engine and CDB generation components for the sEPD Event Plane calibration pipeline. It establishes a centralized definition system and implements the physics logic for re-centering, flattening, and database payload generation.

Summary:
- sEPD_TreeGen.h/cc: Extract event-level and tower-level sEPD data into TTrees and QA histograms.
- QVecDefs.h: Establishes a shared namespace for harmonics, centrality bins, and standardized naming conventions for histograms.
- QVecCalib.h/cc: Orchestrates the three-pass calibration logic (Re-centering, Flattening, and Validation).
- QVecCDB.h/cc: Manages the transformation of calibration moments and bad tower maps into standardized CDB payloads.
- GenQVecCalib.cc & GenQVecCDB.cc: Executable drivers for the calibration processing and database commitment stages.
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jan 13, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

A new sEPD event plane calibration module is introduced with build infrastructure, shared definitions, an event data container, and a three-pass Q-vector calibration pipeline for computing and applying recentering and flattening corrections.

Changes

Cohort / File(s) Summary
Build Infrastructure
Makefile.am, configure.ac, autogen.sh
Autotools setup for the sepd_eventplanecalib module, including compiler flags, ROOT dictionary generation rules, test executable scaffolding, and bootstrap script.
Shared Definitions
QVecDefs.h
Public constants (CENT_BINS=80, HARMONICS={2,3,4}, SEPD_CHANNELS=744), enums (ChannelStatus, Subdetector, QComponent), QVec struct, and histogram naming utility function in QVecShared namespace.
Event Plane Data Container
EventPlaneData.h, EventPlaneData.cc, EventPlaneDataLinkDef.h
PHObject-derived class encapsulating per-event sEPD data: event_id, z-vertex, centrality, total charge, and per-channel charge array. Includes ROOT dictionary linkage and lifecycle methods (Reset, identify, isValid).
Event-to-Tree Converter
sEPD_TreeGen.h, sEPD_TreeGen.cc
SubsysReco module generating flat ROOT TTrees and QA histograms from DST sEPD tower data. Validates events against vertex and minimum-bias criteria, filters towers by charge threshold, and produces EventPlaneData for downstream processing.
Q-Vector Calibration Pipeline
QVecCalib.h, QVecCalib.cc
SubsysReco module orchestrating a three-pass anisotropy calibration workflow (ComputeRecentering, ApplyRecentering, ApplyFlattening). Loads QA histograms and precomputed corrections, computes first/second-order averages and correction matrices per centrality/harmonic, applies recentering and flattening corrections per event, and writes results to ROOT files and CDB.

Sequence Diagram(s)

sequenceDiagram
    participant EVT as Event
    participant TREE as sEPD_TreeGen
    participant EPDATA as EventPlaneData
    participant PASS as QVecCalib Pass
    participant QA as QA Histograms
    participant CORR as Correction Data
    participant OUT as CDB/ROOT Output

    EVT->>TREE: process_event()
    TREE->>TREE: validate z-vertex & MB
    TREE->>TREE: extract sEPD towers
    TREE->>EPDATA: populate event data
    EPDATA->>EPDATA: store per-channel charges

    activate PASS
    PASS->>QA: load QA histograms
    PASS->>PASS: identify bad channels
    
    alt ComputeRecentering Pass
        PASS->>PASS: accumulate Q-vectors per event
        PASS->>PASS: compute 1st-order averages
        PASS->>OUT: write averages to CDB
    else ApplyRecentering Pass
        PASS->>CORR: load precomputed averages
        PASS->>PASS: apply 1st-order corrections
        PASS->>PASS: compute 2nd moments (Qxx, Qyy, Qxy)
        PASS->>OUT: write centered Q-vectors
    else ApplyFlattening Pass
        PASS->>CORR: load centered averages & 2nd moments
        PASS->>PASS: calculate flattening matrix per centrality/harmonic
        PASS->>PASS: apply 2nd-order corrections
        PASS->>OUT: write final corrected Q-vectors
    end
    
    deactivate PASS
Loading

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@sphenix-jenkins-ci
Copy link
Copy Markdown

Build & test report

Report for commit a284e7e6ed03611202bb5747d14bc9b68a4a6470:
Jenkins passed


Automatically generated by sPHENIX Jenkins continuous integration
sPHENIX             jenkins.io

Refactor the QVecCalib and QVecCDB modules to support a third "Combined NS" calibration slot. This update ensures that the combined North-South event plane is derived from individually recentered sub-detectors and then flattened as a single entity, significantly improving event plane resolution and flatness.

Changes to QVecCalib:
- Calibration Logic: Implemented a "Best of Both Worlds" approach where North and South vectors are recentered individually to preserve natural multiplicity weighting before being summed to form the NS vector.
- Flattening Procedure: Added logic to calculate a unique flattening matrix for the combined NS vector, ensuring its final distribution is circular (⟨Qx2​⟩/⟨Qy2​⟩=1 and ⟨Qx​Qy​⟩=0).
- Memory Optimization: Simplified the CorrectionData struct by removing intermediate second-moment storage (avg_Q_xx, avg_Q_yy, avg_Q_xy), utilizing local variables during matrix computation instead.
- Histogram Refactoring: Replaced high-memory TH3 histograms with a suite of TH2 histograms (Psi_S, Psi_N, Psi_NS) to track event plane angles against centrality.

Changes to QVecCDB:
- Database Schema: Expanded the m_correction_data array and the SEPD_EventPlaneCalib payload to include the 3rd calibration slot for the NS detector.
- IO Updates: Updated load_correction_data and write_cdb_EventPlane to process and commit the NS-specific 2nd moments (xx, yy, xy) to the Calibration Database (CDB).

Technical Notes:
- Satisfies the requirement that the NS combination treats the sum of recentered sub-detectors as a distinct third detector for whitening.
- Prevents the resolution degradation caused by equal-weighting individually flattened sub-detectors.
@sphenix-jenkins-ci
Copy link
Copy Markdown

Build & test report

Report for commit 9ced97a03a5fb410bab67df8bc8f4a59009ca164:
Jenkins passed


Automatically generated by sPHENIX Jenkins continuous integration
sPHENIX             jenkins.io

@Steepspace Steepspace marked this pull request as ready for review January 30, 2026 03:46
Copilot AI review requested due to automatic review settings January 30, 2026 03:46
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces the sEPD Event Plane calibration infrastructure for sPHENIX, implementing a three-pass calibration procedure to correct detector-induced biases in Q-vector reconstruction. The implementation includes data extraction, calibration computation, and CDB payload generation capabilities.

Changes:

  • Implements a modular three-pass calibration framework (re-centering, flattening, validation) for sEPD Q-vectors
  • Establishes centralized definitions and naming conventions for harmonics, centrality bins, and histogram management
  • Provides executable drivers for calibration processing and database commitment with flexible command-line interfaces

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 27 comments.

Show a summary per file
File Description
configure.ac Standard autoconf configuration for the calibration library
autogen.sh Build bootstrap script with shell variable quoting issues
Makefile.am Automake build configuration defining library and executables
QVecDefs.h Centralized namespace defining constants, enums, and helper functions
sEPD_TreeGen.h Header for SubsysReco module extracting event and tower data into TTrees
sEPD_TreeGen.cc Implementation of tree generation with event selection and QA histograms
QVecCalib.h Header defining multi-pass calibration orchestration class
QVecCalib.cc Implementation of Q-vector calibration logic with three correction passes
QVecCDB.h Header for CDB payload generation from calibration results
QVecCDB.cc Implementation transforming calibration data into database format
GenQVecCalib.cc Executable driver for running calibration passes
GenQVecCDB.cc Executable driver for generating CDB payloads

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread calibrations/sepd/sepd_eventplanecalib/sEPD_TreeGen.h Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCalib.h Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/sEPD_TreeGen.h Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/sEPD_TreeGen.cc Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCalib.cc
Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCalib.h Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCalib.cc Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/sEPD_TreeGen.cc Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCDB.cc Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCalib.cc Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Comment thread calibrations/sepd/sepd_eventplanecalib/autogen.sh Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/GenQVecCalib.cc Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/GenQVecCDB.cc Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCalib.cc
Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCalib.h Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCDB.cc Outdated
@Steepspace Steepspace marked this pull request as draft January 30, 2026 18:25
Addresses Major Issues:
- Guard cd against failure to prevent silent misbehavior.
- std::stoll can throw if events argument is non-numeric; exception is unhandled.
- std::stoi can throw if runnumber argument is non-numeric; exception is unhandled.
- Guard zero/NaN sigma before z-score calculations.
- Validate pass before casting to Pass to avoid silent no-op runs.
@Steepspace Steepspace marked this pull request as ready for review January 30, 2026 21:54
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCalib.cc Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCalib.cc Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCDB.cc Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/sEPD_TreeGen.cc Outdated
@Steepspace Steepspace marked this pull request as draft January 30, 2026 22:05
Addresses Major Issues:
- Type truncation: GetXmin()/GetXmax() return Double_t, stored as int.
- Sigma guard placed after Fill — degenerate thresholds when sigma is zero.
- Differentiate “already exists” from directory-creation failure.
- Guard against null TowerInfo* to avoid crashes. The get_tower_at_channel() method returns.
@Steepspace
Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jan 30, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCalib.cc Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCalib.cc Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCalib.cc Outdated
Comment thread calibrations/sepd/sepd_eventplanecalib/sEPD_TreeGen.cc Outdated
Addresses Major Issues:
 - Potential undefined behavior from unchecked cast; memory leak from ProfileY.
 - Memory leak from ProfileX calls.
 - Output file creation not validated.
 - Add guard to prevent histogram and tree filename collision.
 - Add error checking for TFile creation before writing.
@Steepspace
Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jan 30, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCalib.cc Outdated
Addresses Major Issues:
- Missing null check after dynamic_cast<TH1*>.
@Steepspace
Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jan 30, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@sphenix-jenkins-ci
Copy link
Copy Markdown

Build & test report

Report for commit c09d98c9ad2981c0452b7e446276304f7e26d7cb:
Jenkins on fire


Automatically generated by sPHENIX Jenkins continuous integration
sPHENIX             jenkins.io

@sphenix-jenkins-ci
Copy link
Copy Markdown

Build & test report

Report for commit 32892881d48e294245287b22dd09eb0befc05375:
Jenkins on fire


Automatically generated by sPHENIX Jenkins continuous integration
sPHENIX             jenkins.io

@Steepspace Steepspace marked this pull request as ready for review January 31, 2026 16:28
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Comment on lines +27 to +31
void set_sepd_charge(int channel, double chg) {sepd_charge[channel] = chg;}
double get_sepd_charge(int channel) const {return sepd_charge[channel];}

void set_sepd_phi(int channel, double phi) {sepd_phi[channel] = phi;}
double get_sepd_phi(int channel) const {return sepd_phi[channel];}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Missing bounds validation on channel index—potential undefined behavior.

The per-channel accessors directly index into std::array without validating that channel is within [0, SEPD_CHANNELS). An out-of-bounds index causes undefined behavior (memory corruption on write, garbage/crash on read).

Consider adding bounds checks or at minimum using std::array::at() which throws std::out_of_range for invalid indices:

🛡️ Proposed fix using bounds-checked access
-  void set_sepd_charge(int channel, double chg) {sepd_charge[channel] = chg;}
-  double get_sepd_charge(int channel) const {return sepd_charge[channel];}
+  void set_sepd_charge(int channel, double chg) {sepd_charge.at(channel) = chg;}
+  double get_sepd_charge(int channel) const {return sepd_charge.at(channel);}

-  void set_sepd_phi(int channel, double phi) {sepd_phi[channel] = phi;}
-  double get_sepd_phi(int channel) const {return sepd_phi[channel];}
+  void set_sepd_phi(int channel, double phi) {sepd_phi.at(channel) = phi;}
+  double get_sepd_phi(int channel) const {return sepd_phi.at(channel);}

Alternatively, if performance is critical and you trust all call sites, an assert(channel >= 0 && channel < SEPD_CHANNELS) gives debug-build protection without release overhead.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
void set_sepd_charge(int channel, double chg) {sepd_charge[channel] = chg;}
double get_sepd_charge(int channel) const {return sepd_charge[channel];}
void set_sepd_phi(int channel, double phi) {sepd_phi[channel] = phi;}
double get_sepd_phi(int channel) const {return sepd_phi[channel];}
void set_sepd_charge(int channel, double chg) {sepd_charge.at(channel) = chg;}
double get_sepd_charge(int channel) const {return sepd_charge.at(channel);}
void set_sepd_phi(int channel, double phi) {sepd_phi.at(channel) = phi;}
double get_sepd_phi(int channel) const {return sepd_phi.at(channel);}

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Comment thread calibrations/sepd/sepd_eventplanecalib/sEPD_TreeGen.cc Outdated
Comment on lines +311 to +317
TFile output(m_outfile_name.c_str(), "recreate");
output.cd();

hSEPD_Charge->Write();
h2SEPD_totalcharge_centrality->Write();

output.Close();
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Check histogram output file creation for failure

TFile in "recreate" can fail (permissions, disk full, bad path). Without an IsOpen()/IsZombie() check, histogram output is silently lost.

Proposed fix
  TFile output(m_outfile_name.c_str(), "recreate");
+ if (output.IsZombie() || !output.IsOpen())
+ {
+   std::cout << PHWHERE << "Failed to open histogram output file: " << m_outfile_name << std::endl;
+   return Fun4AllReturnCodes::ABORTRUN;
+ }
  output.cd();

  hSEPD_Charge->Write();
  h2SEPD_totalcharge_centrality->Write();

@sphenix-jenkins-ci
Copy link
Copy Markdown

Build & test report

Report for commit f683f68bb17547a627e002e0a380707a17e82ac5:
Jenkins passed


Automatically generated by sPHENIX Jenkins continuous integration
sPHENIX             jenkins.io

@sphenix-jenkins-ci
Copy link
Copy Markdown

Build & test report

Report for commit 90f4f0103389d1b0b1931f3846bc61c98b593b8c:
Jenkins passed


Automatically generated by sPHENIX Jenkins continuous integration
sPHENIX             jenkins.io

@Steepspace Steepspace marked this pull request as draft February 6, 2026 02:12
- Remove saving to regular TTrees, instead only save to DST
- No need to save sepd channel phi as it can be reconstructed from the EpdGeom node that's saved to the DST by default
- Remove usage of std::format
- Remove usage of unique_ptr
- Add Print Method for verbosity and debug
- Ensure EventPlaneData has proper Reset Method to refresh buffer between events
@sphenix-jenkins-ci
Copy link
Copy Markdown

Build & test report

Report for commit 9a0ede1040dc08e650edd48e46e2e1c498b52601:
Jenkins on fire


Automatically generated by sPHENIX Jenkins continuous integration
sPHENIX             jenkins.io

- Transformed QVecCalib into a Fun4All module
- Reads from slim DST instead of TTree
- Merged Functionality of QVecCDB into QVecCalib
- Remove QVecCDB and it's corresponding executable
- Removed usage of unique_ptr
- Using Fun4All server HistoManager to keep track of the histograms
- Prevent lots of output by increasing the progress report counter
@sphenix-jenkins-ci
Copy link
Copy Markdown

Build & test report

Report for commit ddacfb7b8db24faa079fd7bd0f5051937a4588df:
Jenkins on fire


Automatically generated by sPHENIX Jenkins continuous integration
sPHENIX             jenkins.io

@sphenix-jenkins-ci
Copy link
Copy Markdown

Build & test report

Report for commit 6e237318746a2dbfa20c83483c1184feaf705886:
Jenkins on fire


Automatically generated by sPHENIX Jenkins continuous integration
sPHENIX             jenkins.io

- removed GenQVecCalib.cc
- Address readability-avoid-nested-conditional-operator
@sphenix-jenkins-ci
Copy link
Copy Markdown

Build & test report

Report for commit 4aacac3f41e2980b17ff0b1385d8113d0beaed86:
Jenkins passed


Automatically generated by sPHENIX Jenkins continuous integration
sPHENIX             jenkins.io

- Use 1% centrality bins instead of 10%
- Allows to capture the finer variations of calibraitons that change on the order of 1% centrality
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 17, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":401,"request":{"method":"PATCH","url":"https://api.github.com/repos/sPHENIX-Collaboration/coresoftware/issues/comments/3746516472","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: skip review by coderabbit.ai -->\n\n> [!IMPORTANT]\n> ## Review skipped\n> \n> Draft detected.\n> \n> Please check the settings in the CodeRabbit UI or the `.coderabbit.yaml` file in this repository. To trigger a single review, invoke the `@coderabbitai review` command.\n> \n> You can disable this status message by setting the `reviews.review_status` to `false` in the CodeRabbit configuration file.\n> \n> Use the checkbox below for a quick retry:\n> - [ ] <!-- {\"checkboxId\": \"e9bb8d72-00e8-4f67-9cb2-caf3b22574fe\"} --> 🔍 Trigger review\n\n<!-- end of auto-generated comment: skip review by coderabbit.ai -->\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nAdds a complete sEPD calibration toolset: tree producer, multi‑pass Q‑vector calibration, CDB payload generator, CLI programs, shared definitions, and Autotools build/bootstrap files.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Core Implementations** <br> `calibrations/sepd/sepd_eventplanecalib/QVecCalib.cc`, `calibrations/sepd/sepd_eventplanecalib/QVecCDB.cc`, `calibrations/sepd/sepd_eventplanecalib/sEPD_TreeGen.cc`|Full implementations: QVecCalib (multi‑pass event processing, correction computation, ROOT I/O), QVecCDB (load histograms, assemble per‑harmonic/cent/subdetector moments, write EventPlane and HotMap CDB TTrees), and sEPD_TreeGen (SubsysReco module producing flat TTrees and QA histograms).|\n|**Public Headers & Shared Types** <br> `calibrations/sepd/sepd_eventplanecalib/QVecCalib.h`, `calibrations/sepd/sepd_eventplanecalib/QVecCDB.h`, `calibrations/sepd/sepd_eventplanecalib/sEPD_TreeGen.h`, `calibrations/sepd/sepd_eventplanecalib/QVecDefs.h`, `calibrations/sepd/sepd_eventplanecalib/EventPlaneData.h`, `calibrations/sepd/sepd_eventplanecalib/EventPlaneDataLinkDef.h`|Adds class interfaces, enums, and data structures: QVecCalib (Pass enum, ctor, run), QVecCDB (ctor, run), sEPD_TreeGen API, QVecShared definitions (CENT_BINS, HARMONICS, sepd_channels, ChannelStatus, QVec, CorrectionMoments, get_hist_name), and EventPlaneData with ROOT LinkDef.|\n|**Command‑line Executables** <br> `calibrations/sepd/sepd_eventplanecalib/GenQVecCalib.cc`, `calibrations/sepd/sepd_eventplanecalib/GenQVecCDB.cc`|Adds two CLI programs: GenQVecCalib (parses inputs, maps pass string→enum, constructs QVecCalib, runs with error handling) and GenQVecCDB (parses input ROOT/run number/optional output_dir and cdb_tag, constructs QVecCDB, runs with error handling).|\n|**Build, Bootstrap & Packaging** <br> `calibrations/sepd/sepd_eventplanecalib/Makefile.am`, `calibrations/sepd/sepd_eventplanecalib/configure.ac`, `calibrations/sepd/sepd_eventplanecalib/autogen.sh`|Adds Autotools build: libsepd_eventplanecalib.la (sources include EventPlaneData_Dict.cc, EventPlaneData.cc, sEPD_TreeGen.cc, QVecCalib.cc, QVecCDB.cc), installs headers, builds GenQVecCalib/GenQVecCDB, provides test stub generation rule, and bootstrap/configure scripts.|\n|**Small utilities / data objects** <br> `calibrations/sepd/sepd_eventplanecalib/EventPlaneData.cc`|Adds EventPlaneData constructor initializing per‑channel arrays.|\n\n## Sequence Diagram(s)\n\n```mermaid\nsequenceDiagram\n    rect rgba(200,200,255,0.5)\n    participant User as User (CLI)\n    participant Exec as Exec (GenQVecCalib / GenQVecCDB)\n    participant Calib as Calib (QVecCalib / QVecCDB)\n    participant ROOT as ROOT (TFile / TChain)\n    participant FS as Filesystem (output CDB)\n    end\n\n    User->>Exec: invoke with arguments\n    Exec->>Calib: construct(input paths, options) & run()\n    Calib->>ROOT: open TFile / TChain, load histograms/profiles\n    Calib->>Calib: process events / compute corrections / populate moments\n    Calib->>FS: write SEPD_EventPlaneCalib and HotMap CDB TTrees (output_dir, cdb_tag)\n    Exec->>User: exit status / summary\n```\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- announcements_start -->\n\n> [!TIP]\n> [Issue Planner](https://www.coderabbit.ai/issue-planner) is now in beta. Read the [docs](https://docs.coderabbit.ai/issues/planning) and try it out! Share your feedback on [Discord](https://discord.com/invite/coderabbit).\n\n<!-- announcements_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=sPHENIX-Collaboration/coresoftware&utm_content=4106)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":1}},"response":{"url":"https://api.github.com/repos/sPHENIX-Collaboration/coresoftware/issues/comments/3746516472","status":401,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","connection":"close","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Tue, 17 Feb 2026 16:31:04 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-media-type":"github.v3; format=json","x-github-request-id":"4051:5ECAF:484771:1385F51:699497C7","x-xss-protection":"0"},"data":{"message":"Bad credentials","documentation_url":"https://docs.github.com/rest","status":"401"}}}

@sphenix-jenkins-ci
Copy link
Copy Markdown

Build & test report

Report for commit c700d69e3c66f9874bccded3051adbeb6ef1e162:
Jenkins passed


Automatically generated by sPHENIX Jenkins continuous integration
sPHENIX             jenkins.io

@pinkenburg pinkenburg marked this pull request as ready for review February 21, 2026 20:04
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Comment thread calibrations/sepd/sepd_eventplanecalib/QVecCalib.cc
Comment on lines +828 to +832
void QVecCalib::process_recentering(double cent, size_t h_idx, const QVecShared::QVec& q_S, const QVecShared::QVec& q_N, const RecenterHists& h)
{
int cent_bin = hCentrality->FindBin(cent) - 1;

const auto& S = m_correction_data[cent_bin][h_idx][(size_t) QVecShared::Subdetector::S];
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Out-of-bounds array access when cent falls outside histogram range.

hCentrality->FindBin(cent) returns 0 for underflow and nbins+1 for overflow. After subtracting 1, cent_bin becomes −1 or m_cent_bins — both out of bounds for m_correction_data[cent_bin][…], causing undefined behavior. The same pattern appears in process_flattening at line 874.

process_event_check() validates charge thresholds but does not enforce that cent maps to a valid bin index.

Suggested fix (apply in both methods)
  int cent_bin = hCentrality->FindBin(cent) - 1;
+
+ if (cent_bin < 0 || cent_bin >= static_cast<int>(m_cent_bins))
+ {
+   return;  // out of calibration range, skip
+ }

Also applies to: 872-878

Comment thread calibrations/sepd/sepd_eventplanecalib/QVecDefs.h
@sphenix-jenkins-ci
Copy link
Copy Markdown

Build & test report

Report for commit 7dcddfcdc133399bbaf7f8a0ca7b849a8cf7b488:
Jenkins passed


Automatically generated by sPHENIX Jenkins continuous integration
sPHENIX             jenkins.io

@sphenix-jenkins-ci
Copy link
Copy Markdown

Build & test report

Report for commit 7d79c3af890e7d39e914b0dc79af8c81fc163450:
Jenkins passed


Automatically generated by sPHENIX Jenkins continuous integration
sPHENIX             jenkins.io

@pinkenburg
Copy link
Copy Markdown
Contributor

clang-tidy warnings not from this PR

@pinkenburg pinkenburg merged commit 0fbb5c6 into sPHENIX-Collaboration:master Feb 22, 2026
21 of 22 checks passed
@Steepspace Steepspace deleted the sEPD-Calib-Gen branch February 27, 2026 00:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants