Overview /

HEPMC_Merger

github.com/eic/HEPMC_Merger generatorcore · pass 2026-10-12 · commit a86fdd66ffd5 · assessor claude-opus-5-5

The repository has no license (issue #10 open since 2024), no citation metadata, no unit tests or static analysis, one author wrote 50% of commits in 24 months, and the README usage example uses command-line options removed in v2.0.0. All default-branch changes in 12 months arrived through reviewed PRs under a ruleset that requires an approval and the eic-shell CI checks, and each release (8 in 24 months) is packaged in eic-spack the same day and shipped in eic-shell, where ePIC production workflows run it.

1.3overall, of 3

Action plan

The smallest steps that raise each criterion to its next level, in priority order. Download as Markdown ·

PriorityEffortCriterionAction
highS com.bus-factor (1) Add .github/CODEOWNERS naming at least two current maintainers and list them in the README.
highS com.conduct (1) Link the ePIC collaboration code of conduct with its reporting contact from the README (or add CODE_OF_CONDUCT.md in eic/.github).
highS eng.static-quality (0) Add .clang-format and .pre-commit-config.yaml with clang-format and enable pre-commit.ci.
highS eng.static-quality (0) Add target_compile_options(SignalBackgroundMerger PRIVATE -Wall -Wextra) in CMakeLists.txt.
highS via.citation (0) Add CITATION.cff listing the authors named in the banner and enable the Zenodo–GitHub integration.
highS via.license (0) Add a LICENSE file (LGPL-3.0-or-later, as suggested in issue
mediumS com.contributors (1) List the contributing institutions in the README and label newcomer issues to attract a contributor from a second institution.
mediumS com.governance (1) Add a README section stating the owning ePIC group, how decisions are made, and the planned status relative to TimeframeBuilder.
mediumS com.responsiveness (1) Close issues resolved by later PRs (#5 by the C++ rewrite with ROOT I/O,
mediumS dist.dependencies (1) Replace argparse/argparse.hpp with find_package(CLI11) (shipped in eic-shell) or record the vendored argparse version.
mediumS dist.portability (1) Add a Clang build (CXX=clang++ in eic-shell) or a macos-latest job to .github/workflows/linux-eic-shell.yml.
mediumS dist.releases (1) State SemVer in the README and add breaking-change and migration notes to release notes (starting from v2.0.0's CLI change).
mediumS dist.reproducibility (1) Add hepmc_merger_rng_seed, hepmc_merger_squash_time and status-shift attributes to the GenRunInfo in merge().
mediumS dist.reproducibility (1) Document in the README the eic-shell release that ships each merger release.
mediumS doc.contributing (1) Add CONTRIBUTING.md covering building in eic-shell, running the smoke test, code style and the PR review rule.
mediumS doc.developer (1) Add docs/design.md describing the slice loop, weighted sampling, status shifting and the hepmc_merger_* run attributes, plus Doxygen comments on each method.
mediumS doc.user (1) Replace the README example with the --bgFile <file> <freq> [skip] [status] form from the CI smoke test and add an "Installation" section covering eic-shell and HepMC3 >= 3.2.6, ROOT >= 6.20.
mediumS eic.data-model (2) Add a CI step that reads the merged output with uproot or pyhepmc and checks event count and hepmc_merger_* attributes.
mediumS eic.environment (1) Add a README section on running SignalBackgroundMerger from eic-shell and building it there.
mediumS eng.ci (1) Register tests with enable_testing()/add_test in CMakeLists.txt and run ctest --test-dir build in the build job.
mediumS eng.modularity (1) Remove the default --signalFile URL (require the option) and move or delete the legacy scripts in python/.
mediumS eng.testing (1) Add a CI step that runs the merger on local test files with a fixed --rngSeed and asserts placed event counts and GenRunInfo attributes with pyhepmc or uproot.
mediumS via.support (1) State in the README the owning ePIC working group and the maintenance plan until TimeframeBuilder replaces the merger.
mediumM eng.modularity (1) Split SignalBackgroundMerger.cpp into a library (include/, src/) for slice building and readers, plus a thin main.
mediumM eng.testing (1) Add Catch2 tests under tests/ for poissonTimes, parse_backgrounds and skip wrapping using the small .hepmc files in python/, registered with add_test.
lowS dist.dependencies (1) Remove python/requirements.txt with the legacy scripts, or add minimum versions.
lowS eic.currency (2) Raise cmake_minimum_required to 3.16 and the HepMC3 and ROOT minimums to the versions in current eic-shell.
lowS eng.ci (1) Set fetch-depth: 0 on actions/checkout in .github/workflows/linux-eic-shell.yml so the built version matches the tag.

Assessment by criterion

Code health & engineering practices 1.2

3

Change control & code review eng.change-control

Sustained · confidence high

All first-parent commits on main in 12 months came from PRs and every merged PR was reviewed by someone other than the author; an active ruleset requires one approving review, resolved threads and the build/smoke-test checks, and the eic organization PR template applies.

Evidence (5)
1

Continuous integration eng.ci

Initial · confidence medium

linux-eic-shell.yml builds in eic-shell on every PR and push to main (3 of 3 default-branch runs succeeded) and is a required check, but it runs no test suite; the only check is one smoke run whose result is verified by ls -la on the output file.

Evidence (4)

Gaps to the next level

  • No test suite (ctest) runs in CI; the smoke run checks only that the output file exists.
  • The actions/checkout step fetches no tags, so CI builds report version 0.0.0-unknown (CMake warning in run 37384280511).

Actions

  • medium S Register tests with enable_testing()/add_test in CMakeLists.txt and run ctest --test-dir build in the build job.
  • low S Set fetch-depth: 0 on actions/checkout in .github/workflows/linux-eic-shell.yml so the built version matches the tag.
1

Testing eng.testing

Initial · confidence high

There are no test files or test framework; the only automated test is a CI smoke run of one campaign configuration that checks the output file exists.

Evidence (3)

Gaps to the next level

  • No unit tests for Poisson time placement, weighted sampling, background cycling or status shifting.
  • No check of output content (event counts, vertex times, run attributes).

Actions

  • medium M Add Catch2 tests under tests/ for poissonTimes, parse_backgrounds and skip wrapping using the small .hepmc files in python/, registered with add_test.
  • medium S Add a CI step that runs the merger on local test files with a fixed --rngSeed and asserts placed event counts and GenRunInfo attributes with pyhepmc or uproot.
0

Static analysis & consistency eng.static-quality

Absent · confidence high

No formatter, linter, pre-commit or static-analysis configuration exists, and CMakeLists.txt sets no warning flags.

Evidence (3)

Gaps to the next level

  • No formatter or linter configured or enforced.
  • No compiler warning flags.

Actions

  • high S Add .clang-format and .pre-commit-config.yaml with clang-format and enable pre-commit.ci.
  • high S Add target_compile_options(SignalBackgroundMerger PRIVATE -Wall -Wextra) in CMakeLists.txt.
1

Architecture & language standards eng.modularity

Initial · confidence medium

CMake builds and installs one C++17 executable, but all logic (CLI parsing, I/O, sampling, metadata) sits in one 824-line class, and the default signal input is a server URL compiled into the source that had to be edited in PR #31 when the endpoint moved.

Evidence (5)

Gaps to the next level

  • Single-file monolithic class with public data members; no separation into components.
  • Default input file URL hard-coded in source.
  • Three legacy Python merger scripts and a notebook remain alongside the C++ code.

Actions

  • medium M Split SignalBackgroundMerger.cpp into a library (include/, src/) for slice building and readers, plus a thin main.
  • medium S Remove the default --signalFile URL (require the option) and move or delete the legacy scripts in python/.

Documentation & usability 1.0

1

User onboarding doc.user

Initial · confidence high

The README gives build steps and a --help pointer, but lists ROOT and HepMC without versions, does not mention eic-shell, and its usage example uses --bg1File/--bg1Freq options that the current CLI (since v2.0.0) rejects.

Evidence (3)

Gaps to the next level

  • README usage example and default-behaviour text are outdated and not runnable.
  • Dependency versions and the eic-shell route are not documented.
  • The --bgFile tuple and status-shift options are documented only in --help.

Actions

  • medium S Replace the README example with the --bgFile <file> <freq> [skip] [status] form from the CI smoke test and add an "Installation" section covering eic-shell and HepMC3 >= 3.2.6, ROOT >= 6.20.
1

Developer & API documentation doc.developer

Initial · confidence high

A few methods carry comments and the README "Logic" section describes the sampling in one paragraph, but there is no generated API reference and no architecture overview.

Evidence (3)

Gaps to the next level

  • No generated API documentation.
  • No description of slice building, weighted sampling and the GenRunInfo attribute schema.

Actions

  • medium S Add docs/design.md describing the slice loop, weighted sampling, status shifting and the hepmc_merger_* run attributes, plus Doxygen comments on each method.
1

Contribution guidelines doc.contributing

Initial · confidence high

Only the eic organization PR and issue templates apply; there is no CONTRIBUTING file describing setup, building, testing or conventions.

Evidence (3)

Gaps to the next level

  • No CONTRIBUTING describing eic-shell setup, build, test and PR conventions.

Actions

  • medium S Add CONTRIBUTING.md covering building in eic-shell, running the smoke test, code style and the PR review rule.

Community & governance 1.0

1

Issue & PR responsiveness com.responsiveness

Initial · confidence low

All 3 issues opened in 12 months got a same-day response, but 9 of 10 open issues are older than one year and no new issue is labeled.

Evidence (5)

Gaps to the next level

  • More than half of open issues are older than one year (#1,
  • No issue labeling or triage.

Actions

  • medium S Close issues resolved by later PRs (#5 by the C++ rewrite with ROOT I/O,
1

Contributor base com.contributors

Initial · confidence medium

Five authors committed in 24 months, but all commits map to one institutional e-mail domain, no new authors joined in 12 months, and no merged PR came from outside the maintainer group.

Evidence (4)
  • git.authors_24m = 5
  • git.email_domains_24m = 1
  • git.new_authors_12m = 0
  • prs.external_fraction_12m = 0.0

Gaps to the next level

  • Contributions come from a single institutional domain per the metrics.
  • No merged external PRs in 12 months.

Actions

  • medium S List the contributing institutions in the README and label newcomer issues to attract a contributor from a second institution.
1

Knowledge concentration (bus factor) com.bus-factor

Initial · confidence high

The top author wrote 50% of commits in 24 months (bus factor 1), while three people review and merge and two people cut releases; no CODEOWNERS exists and the README names one current maintainer.

Evidence (6)
  • git.bus_factor_50_24m = 1
  • git.top_author_share_24m = 0.5
  • prs.distinct_reviewers_12m = 3
  • prs.distinct_mergers_12m = 3
  • releases.authors_24m = 2
  • README.md#L2-L3

Gaps to the next level

  • Bus factor (50%) is 1.
  • No CODEOWNERS or maintainer list naming at least two current maintainers.

Actions

  • high S Add .github/CODEOWNERS naming at least two current maintainers and list them in the README.
1

Governance & roadmap com.governance

Initial · confidence high

The README names the C++ maintainer and decisions are discussed in public issues, but there is no documented decision process or maintainer path, and the stated plan to retire the merger in favour of TimeframeBuilder is recorded only in an issue comment.

Evidence (2)

Gaps to the next level

  • No documented decision process, maintainer path, roadmap or milestones.
  • Deprecation plan relative to TimeframeBuilder not documented.

Actions

  • medium S Add a README section stating the owning ePIC group, how decisions are made, and the planned status relative to TimeframeBuilder.
1

Code of conduct & user support com.conduct

Initial · confidence high

The eic organization issue-template configuration links the ePIC Mattermost and meeting series, but no code of conduct applies to the repository or organization.

Evidence (2)

Gaps to the next level

  • No code of conduct with a reporting contact.

Actions

  • high S Link the ePIC collaboration code of conduct with its reporting contact from the README (or add CODE_OF_CONDUCT.md in eic/.github).

Infrastructure & distribution 1.4

3

Packaging & installability dist.packaging

Sustained · confidence high

The eic-spack hepmcmerger recipe provides the latest release 2.4.0, which eic-shell ships, and the recipe gained v2.2.0, v2.3.0 and v2.4.0 on their release days.

Evidence (4)
1

Releases & versioning dist.releases

Initial · confidence high

Eight releases with generated notes appeared in 24 months, but no version scheme is documented and v2.0.0, which replaced the --bgNFile options, carries no migration note.

Evidence (3)

Gaps to the next level

  • No documented version scheme.
  • No changelog flagging breaking changes.

Actions

  • medium S State SemVer in the README and add breaking-change and migration notes to release notes (starting from v2.0.0's CLI change).
1

Dependency management & supply chain dist.dependencies

Initial · confidence high

HepMC3 (>= 3.2.6) and ROOT (>= 6.20) have minimum versions, but argparse is vendored without a version and unchanged since 2024 (eic-shell ships CLI11), python/requirements.txt has no versions, and there is no update monitoring.

Evidence (4)

Gaps to the next level

  • Vendored argparse without recorded version.
  • Python requirements unversioned.

Actions

  • medium S Replace argparse/argparse.hpp with find_package(CLI11) (shipped in eic-shell) or record the vendored argparse version.
  • low S Remove python/requirements.txt with the legacy scripts, or add minimum versions.
1

Reproducibility & environments dist.reproducibility

Initial · confidence medium

Outputs record the merger version, input files, frequencies, skips and window in GenRunInfo, but the random seed and status shifts are not recorded, and no environment (eic-shell version) is documented in the repository.

Evidence (2)

Gaps to the next level

  • --rngSeed, --squashTime and status shifts are not written to the output metadata.
  • No documented eic-shell version or container for running.

Actions

  • medium S Add hepmc_merger_rng_seed, hepmc_merger_squash_time and status-shift attributes to the GenRunInfo in merge().
  • medium S Document in the README the eic-shell release that ships each merger release.
1

Portability & heterogeneous computing dist.portability

Initial · confidence high

CI builds only on Linux with the eic-shell GCC toolchain; the source contains a macOS code path that is not built in CI.

Evidence (3)

Gaps to the next level

  • Single OS and compiler tested.

Actions

  • medium S Add a Clang build (CXX=clang++ in eic-shell) or a macos-latest job to .github/workflows/linux-eic-shell.yml.

EIC ecosystem integration 2.0

2

Data formats & interoperability eic.data-model

Established · confidence high

Inputs and outputs are HepMC3 (ASCII or ROOT tree) with configuration stored as hepmc_merger_* run attributes; no attribute-schema version is declared or checked and no round-trip test exists.

Evidence (2)

Gaps to the next level

  • No declared version of the run-attribute schema.
  • No I/O round-trip test.

Actions

  • medium S Add a CI step that reads the merged output with uproot or pyhepmc and checks event count and hepmc_merger_* attributes.
1

EIC environment compatibility eic.environment

Initial · confidence high

CI builds and runs the merger in eic_xl:nightly through eic/run-cvmfs-osg-eic-shell, but the README does not document building or running in eic-shell (only a commented-out ATHENA container line).

Evidence (3)

Gaps to the next level

  • eic-shell use is not documented.
  • No pinned stable eic-shell release is tested.

Actions

  • medium S Add a README section on running SignalBackgroundMerger from eic-shell and building it there.
2

Currency with the EIC stack eic.currency

Established · confidence medium

eic-shell ships the latest release 2.4.0 and the nightly eic-shell build passes, with HepMC3 and ROOT minimums below the shipped 3.3.0 and 6.40.04; there is no record of adaptation timing to component releases and the build emits a CMake deprecation warning for cmake_minimum_required(VERSION 3.8).

Evidence (3)

Gaps to the next level

  • No evidence of adapting to new component releases within one eic-shell cycle.
  • CMake deprecation warning in CI.

Actions

  • low S Raise cmake_minimum_required to 3.16 and the HepMC3 and ROOT minimums to the versions in current eic-shell.

Impact & long-term viability 1.0

0

Licensing via.license

Absent · confidence high

The repository has no LICENSE file and no license is detected; issue #10 requesting a free software license has been open since June 2024.

Evidence (2)

Gaps to the next level

  • No license.

Actions

  • high S Add a LICENSE file (LGPL-3.0-or-later, as suggested in issue
0

Citation & attribution via.citation

Absent · confidence high

There is no CITATION.cff, Zenodo DOI, codemeta or author file, and the README does not ask users to cite the software.

Evidence (2)
  • files.citation_cff = []
  • files.zenodo_json = []

Gaps to the next level

  • No citation information.

Actions

  • high S Add CITATION.cff listing the authors named in the banner and enable the Zenodo–GitHub integration.
1

Institutional backing & continuity via.support

Initial · confidence medium

The README and banner name maintainers with institutional affiliations, but no owning ePIC body, institutional commitment or funding is stated, and the maintainer intends to retire the tool (issue #29).

Evidence (3)

Gaps to the next level

  • No maintenance responsibility assigned within EIC/ePIC structures and no funding acknowledgement.

Actions

  • medium S State in the README the owning ePIC working group and the maintenance plan until TimeframeBuilder replaces the merger.

Key metrics

Collected automatically at the assessed commit. People are counted, never named. Full data: metrics.json.

Commits, 12 months6git.commits_12m
Active authors, 12 months3git.authors_12m
Active authors, 24 months5git.authors_24m
New authors, 12 months0git.new_authors_12m
Bus factor (50% of commits, 24 months)1git.bus_factor_50_24m
Top author share of commits, 24 months50%git.top_author_share_24m
Institutional e-mail domains, 24 months1git.email_domains_24m
Default-branch changes via PR, 12 months100%git.first_parent_pr_fraction_12m
PRs merged, 12 months6prs.merged_12m
Merged PRs reviewed by non-author100%prs.reviewed_fraction_12m
Median days to merge36%prs.median_days_to_merge_12m
Merged PRs touching tests0%prs.test_touching_fraction_12m
Distinct reviewers, 12 months3prs.distinct_reviewers_12m
Issues opened, 12 months3issues.created_12m
Median days to first response0%issues.median_first_response_days_12m
Issues without response0%issues.unanswered_fraction_12m
Open issues older than 1 year9issues.open_older_365d
Releases, 24 months8releases.count_24m
Latest releasev2.4.0releases.latest_tag
Default-branch CI success rate100%ci.default_branch_success_rate
CI runs in eic-shellyesci.uses_eic_shell
License (SPDX)–repo.license_spdx
Ships in eic-shellyespackaging.in_eic_shell
eic-shell version2.4.0packaging.eic_shell_version
Source lines (excluding vendored)4146code.source_lines
Test files0code.test_files