Overview /

DD4hep

github.com/AIDASoft/DD4hep geometryupstream · pass 2026-10-12-2 · commit 78ca69c4b2cc · assessor claude-opus-5-5

Only 33% of merged PRs have a recorded review, there is no C++ formatter, no code of conduct, no documented governance or version scheme, all 9 releases in 24 months were cut by one person, and a GPL-3.0 copy of GaudiPluginService ships inside the LGPL-3.0 project. CI builds and runs the core and example ctest suites, including reference-shape and multi-thread output comparisons, on 8 LCG stacks plus the Key4hep nightly, and it is required before merge. The latest release (1.38) ships in eic-shell and in upstream Spack, and 32 authors from 9 e-mail domains contributed in 24 months.

1.9overall, 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 (2) Document the tagging and release-notes procedure in RELEASING.md and have a second maintainer tag the next release.
highS com.conduct (1) Add CODE_OF_CONDUCT.md (for example the CERN Code of Conduct or Contributor Covenant) with a reporting contact.
highS dist.releases (1) State the version scheme (major.minor.patch mapped to vXX-YY[-ZZ] tags) and its compatibility meaning in README.md.
highS eng.change-control (1) Require one approving review in the master branch protection rule.
highS via.license (1) Correct the license statement in doc/usermanuals/DD4hep/chapters/basics.tex.
highM eng.static-quality (1) Add .clang-format and a PR job (or pre-commit.ci) that checks formatting of changed C++ lines.
highM via.license (1) Re-import GaudiPluginService from current Gaudi (Apache-2.0) or obtain relicensing, and update GaudiPluginService/LICENCE.
mediumS com.bus-factor (2) Add .github/CODEOWNERS with two owners per top-level package.
mediumS com.governance (1) Add GOVERNANCE.md naming the maintainers, how decisions are made, and how contributors become maintainers.
mediumS com.responsiveness (2) Document the label scheme and triage practice in .github/CONTRIBUTING.md.
mediumS dist.dependencies (1) Add minimum versions to find_package for LCIO, HepMC3, TBB, XercesC and G4HepEm in CMakeLists.txt.
mediumS dist.reproducibility (2) State in each release note the LCG and Key4hep stacks the release was tested in.
mediumS doc.contributing (1) Extend .github/CONTRIBUTING.md with an LCG-view or Key4hep setup, the CMake build, ctest, and Python/C++ style rules.
mediumS doc.user (1) List minimum versions for every optional dependency on the installation page, matching find_package in CMakeLists.txt.
mediumS doc.user (1) Add spack install dd4hep, Key4hep and eic-shell routes to the installation page.
mediumS eic.currency (2) Replace Hoption.h/Hparam.h in DDCore/src/graphics/DrawBField.cpp with the public THistPainter interface.
mediumS eic.data-model (2) Check the EDM4hep schema version from the podio metadata in EDM4hepFileReader.cpp and warn on mismatch.
mediumS eng.change-control (1) Add .github/CODEOWNERS assigning each top-level package (DDCore, DDG4, DDDigi, DDRec, ...) to at least one reviewer.
mediumS eng.testing (2) Ask in the PR template that bug-fix and feature PRs add or update a ctest.
mediumS via.citation (2) Re-enable the Zenodo-GitHub integration so each release gets a DOI, and update .zenodo.json creators.
mediumS via.citation (2) Add CITATION.cff citing the software DOI and the reference publication.
mediumS via.support (2) State the current supporting institutions and the plan for maintainer succession in the README.
mediumM dist.portability (2) Add an ubuntu-24.04-arm job and run ctest in the macOS job.
mediumM eic.environment (2) (EIC side) Add a scheduled eic/containers or epic CI job that builds DD4hep master in eic_ci:nightly and runs the epic geometry checks.
mediumM eng.ci (2) Run ctest in .github/workflows/mac.yml with Geant4 enabled (see issue
mediumM eng.testing (2) Add a gcov/lcov build job to .github/workflows/linux.yml and upload results to Codecov.
mediumL dist.dependencies (1) Replace the vendored TinyXML 2.5.2 with an external maintained parser (TinyXML2 or Xerces-C as default).
lowS com.responsiveness (2) Close or schedule the open issues older than one year, starting with
lowM eic.currency (2) (EIC side) Add a scheduled eic-shell job that builds DD4hep master and runs the epic geometry checks before each DD4hep release.

Assessment by criterion

Code health & engineering practices 1.8

1

Change control & code review eng.change-control

Initial · confidence high

96.5% of first-parent commits arrive through PRs, but only 32.7% of merged PRs carry a review from someone other than the author, below the 50% required for level 2.

Evidence (4)

Gaps to the next level

  • Fewer than 50% of merged PRs have a review by someone other than the author.
  • Branch protection requires status checks but no approving review, and there is no CODEOWNERS.

Actions

  • high S Require one approving review in the master branch protection rule.
  • medium S Add .github/CODEOWNERS assigning each top-level package (DDCore, DDG4, DDDigi, DDRec, ...) to at least one reviewer.
2

Continuous integration eng.ci

Established · confidence high

Every PR and push builds and runs ctest for the core and the examples on 8 LCG stacks and the Key4hep nightly, the jobs are required status checks, and 94% of default-branch runs succeed. The macOS job only compiles (without Geant4) and runs no tests, although the manual declares macOS supported.

Evidence (6)

Gaps to the next level

  • The declared macOS platform is built without Geant4 and no tests run on it.
  • The run on the assessed commit failed in the required g4units job (6 ddsim tests).

Actions

  • medium M Run ctest in .github/workflows/mac.yml with Geant4 enabled (see issue
2

Testing eng.testing

Established · confidence medium

Unit tests in DDTest and example suites for DDCore, DDG4, DDDigi, DDCond, DDAlign, DDCAD and DDRec run in CI, with ddsim end-to-end runs and regression checks against reference shape meshes and between thread counts. Coverage is not measured and only 1.8% of merged PRs touch test files.

Evidence (5)

Gaps to the next level

  • Test coverage is neither measured nor published (metrics:files.codecov is empty).
  • Fewer than 40% of merged PRs touch test files.

Actions

  • medium M Add a gcov/lcov build job to .github/workflows/linux.yml and upload results to Codecov.
  • medium S Ask in the PR template that bug-fix and feature PRs add or update a ctest.
1

Static analysis & consistency eng.static-quality

Initial · confidence high

flake8 runs on every PR for Python, clang-tidy checks only header guards, Coverity runs nightly, and -Wall -Wextra -pedantic are set, but no C++ formatter is configured or enforced.

Evidence (5)

Gaps to the next level

  • No .clang-format and no formatter enforced on C++ code.
  • clang-tidy runs only the llvm-header-guard check.

Actions

  • high M Add .clang-format and a PR job (or pre-commit.ci) that checks formatting of changed C++ lines.
3

Architecture & language standards eng.modularity

Sustained · confidence medium

The code is split into packages (DDCore, DDG4, DDDigi, DDRec, DDCond, DDAlign) with separate include/ and src/ trees, requires C++17, exports a DD4hep:: CMake package, loads detectors as plugins from compact XML, and has per-package user manuals.

Evidence (4)

Documentation & usability 1.7

1

User onboarding doc.user

Initial · confidence medium

The hosted installation page lists minimum versions for CMake, Boost and ROOT and the beginners guide has runnable ddsim and geoDisplay examples, but Geant4, Xerces-C, HepMC3, EDM4hep and LCIO have no versions and the only distribution route is a CentOS 7 LCG_102b view.

Evidence (4)

Gaps to the next level

  • Optional dependencies have no minimum versions, and the documented Boost minimum (1.56) differs from CMake (1.70).
  • No Spack, Key4hep or eic-shell installation route is documented.
  • The manual's "Build From Source" section reads "NEED REWRITE ONCE FINALIZED".

Actions

  • medium S List minimum versions for every optional dependency on the installation page, matching find_package in CMakeLists.txt.
  • medium S Add spack install dd4hep, Key4hep and eic-shell routes to the installation page.
3

Developer & API documentation doc.developer

Sustained · confidence medium

Public headers carry Doxygen comments, the Doxygen reference and LaTeX manuals are built and deployed by GitLab CI on master and tags (the hosted reference was generated on the assessed commit's date), and the per-package manuals describe design and data flow with bibliographies.

Evidence (4)
1

Contribution guidelines doc.contributing

Initial · confidence high

.github/CONTRIBUTING.md covers the PR and release-notes process and one coding rule, and issue and PR templates exist, but it does not explain environment setup, building or running the tests.

Evidence (3)
  • .github/CONTRIBUTING.md#L1-L33
  • files.issue_templates = [".github/ISSUE_TEMPLATE/bug_report.yml", ".github/ISSUE_TEMPLATE/feature.md", ".github/ISSUE_TEMPLATE/question.md"]
  • files.pr_template = [".github/PULL_REQUEST_TEMPLATE"]

Gaps to the next level

  • CONTRIBUTING has no development-environment setup, build or ctest instructions.
  • Coding conventions are limited to "no new warnings".

Actions

  • medium S Extend .github/CONTRIBUTING.md with an LCG-view or Key4hep setup, the CMake build, ctest, and Python/C++ style rules.

Community & governance 1.8

2

Issue & PR responsiveness com.responsiveness

Established · confidence medium

Median first response is 0.32 days, no issue went unanswered and 80% are labeled, but 5 of 13 open issues (38%) are older than one year and only about half of merged PRs show review or comments from someone other than the author.

Evidence (5)
  • issues.median_first_response_days_12m = 0.32
  • issues.unanswered_fraction_12m = 0.0
  • issues.labeled_fraction_12m = 0.804
  • issues.open_older_365d = 5
  • issues.open_total = 13

Gaps to the next level

  • 38% of open issues are older than one year (#777,
  • The triage process (labels, milestones) is not documented.

Actions

  • low S Close or schedule the open issues older than one year, starting with
  • medium S Document the label scheme and triage practice in .github/CONTRIBUTING.md.
3

Contributor base com.contributors

Sustained · confidence high

32 authors in 24 months from 9 e-mail domains, 13 new authors in 12 months, and 23.9% of merged PRs from outside the maintainer group.

Evidence (4)
  • git.authors_24m = 32
  • git.email_domains_24m = 9
  • git.new_authors_12m = 13
  • prs.external_fraction_12m = 0.239
2

Knowledge concentration (bus factor) com.bus-factor

Established · confidence medium

Bus factor (50%) is 3, 9 people reviewed and 2 merged, and the website names 4 main developers at CERN and DESY, but there are no per-component owners and all releases in 24 months were cut by one person without a documented procedure.

Evidence (5)

Gaps to the next level

  • No CODEOWNERS or list naming two owners per package.
  • Releases are made by one person and the release procedure is not documented.

Actions

  • high S Document the tagging and release-notes procedure in RELEASING.md and have a second maintainer tag the next release.
  • medium S Add .github/CODEOWNERS with two owners per top-level package.
1

Governance & roadmap com.governance

Initial · confidence medium

The main developers are named on the website, but no decision process or maintainer path is documented and the milestones page lists 2019-2020 items only.

Evidence (3)

Gaps to the next level

  • No documented decision process or path to becoming a reviewer or maintainer.
  • The roadmap is not kept up to date.

Actions

  • medium S Add GOVERNANCE.md naming the maintainers, how decisions are made, and how contributors become maintainers.
1

Code of conduct & user support com.conduct

Initial · confidence high

Support channels exist (issue tracker with a question template and the dd4hep-developers mailing list), but no code of conduct applies to the repository or the AIDASoft organization.

Evidence (3)

Gaps to the next level

  • No code of conduct with a reporting contact.

Actions

  • high S Add CODE_OF_CONDUCT.md (for example the CERN Code of Conduct or Contributor Covenant) with a reporting contact.

Infrastructure & distribution 1.8

3

Packaging & installability dist.packaging

Sustained · confidence high

Upstream Spack provides 1.38, which is the latest release v01-38 and the version eic-shell ships (the collector's latest_release_packaged = false reflects the v01-38 tag naming).

Evidence (4)
  • packaging.spack_builtin.versions = ["master", "1.38", "1.37", "1.36", "1.35"]
  • packaging.in_eic_shell = true
  • packaging.eic_shell_version = 1.38
  • releases.latest_tag = v01-38
1

Releases & versioning dist.releases

Initial · confidence medium

Nine releases in 24 months each have notes generated from PR descriptions, but the vXX-YY version scheme is not documented anywhere.

Evidence (3)

Gaps to the next level

  • No documented version scheme.
  • No flagged breaking changes, deprecation policy, or release workflow.

Actions

  • high S State the version scheme (major.minor.patch mapped to vXX-YY[-ZZ] tags) and its compatibility meaning in README.md.
1

Dependency management & supply chain dist.dependencies

Initial · confidence high

ROOT, Boost, Geant4, EDM4hep and podio have minimum versions, but LCIO, HepMC3, TBB, Xerces-C and G4HepEm do not, and TinyXML 2.5.2 (unmaintained upstream) and a copy of GaudiPluginService are vendored.

Evidence (4)

Gaps to the next level

  • Several find_package calls have no minimum version.
  • Unmaintained vendored TinyXML 2.5.2 remains as the default XML parser.

Actions

  • medium S Add minimum versions to find_package for LCIO, HepMC3, TBB, XercesC and G4HepEm in CMakeLists.txt.
  • medium L Replace the vendored TinyXML 2.5.2 with an external maintained parser (TinyXML2 or Xerces-C as default).
2

Reproducibility & environments dist.reproducibility

Established · confidence medium

CI runs in pinned LCG views (LCG_101, LCG_106, LCG_107a) and the install page documents sourcing an LCG view; ddsim writes DD4hep and Geant4 versions, all steering parameters and the command line into the run header. No environment is versioned with each DD4hep release.

Evidence (3)

Gaps to the next level

  • Releases do not name a tested environment (LCG or Key4hep release) to reproduce them.

Actions

  • medium S State in each release note the LCG and Key4hep stacks the release was tested in.
2

Portability & heterogeneous computing dist.portability

Established · confidence high

CI builds and tests with GCC 11/13/15 and Clang 22 on EL9, CentOS 7 and Ubuntu 24.04; macOS is built but not tested, there is no aarch64 job, and accelerator support is not addressed.

Evidence (4)

Gaps to the next level

  • No tests on macOS or aarch64.
  • No documentation of batch/HPC use or of why accelerators are not supported.
  • Three example scripts contain /afs/ or personal home paths.

Actions

  • medium M Add an ubuntu-24.04-arm job and run ctest in the macOS job.

EIC ecosystem integration 2.2

3

Reuse of EIC-supported components eic.reuse

Sustained · confidence medium

DD4hep builds on ROOT, Geant4, HepMC3 and podio/EDM4hep, its HepMC2 ASCII reader is a documented fallback when HepMC3 is not built, and it is itself the geometry component reused by epic, EICrecon and npsim.

Evidence (3)
  • eic.domain_components = ["edm4hep", "geant4", "hepmc3", "npsim", "podio"]
  • DDG4/python/DDSim/Helper/HepMC3.py#L14-L23
  • packaging.eic_spack_dependents = ["algorithms", "eic-ip6", "eicrecon", "epic", "g4occt", "juggler", "npdet", "npsim", "simphony"]
2

Data formats & interoperability eic.data-model

Established · confidence medium

DD4hep defines the compact XML geometry format, reads HepMC3 and EDM4hep and writes EDM4hep, and its EDM4hep outputs are read back in tests by PyROOT. The default .root output uses DD4hep-native classes that need DD4hep dictionaries, and file data-model versions are not checked on read.

Evidence (3)

Gaps to the next level

  • The EDM4hep version of input files is checked only at compile time, not on read.
  • The default ddsim .root output cannot be read without DD4hep libraries.

Actions

  • medium S Check the EDM4hep schema version from the podio metadata in EDM4hepFileReader.cpp and warn on mismatch.
2

EIC environment compatibility eic.environment

Established · confidence medium

eic/containers builds DD4hep 1.38 for eic-shell and the epic CI runs DD4hep tools (checkGeometry, npsim) in eic_xl:nightly and a pinned stable release, but both use released DD4hep, so no EIC CI tests DD4hep master before a release (calibrated against podio, ACTS, ROOT and EDM4hep in this pass).

Evidence (4)

Gaps to the next level

  • No EIC CI builds DD4hep master or release candidates in an eic container, so incompatibilities surface only after a release.

Actions

  • medium M (EIC side) Add a scheduled eic/containers or epic CI job that builds DD4hep master in eic_ci:nightly and runs the epic geometry checks.
2

Currency with the EIC stack eic.currency

Established · confidence medium

DD4hep 1.38 is the version in current eic-shell and CI tracks ROOT and Geant4 development stacks, but DrawBField.cpp includes ROOT headers Hoption.h/Hparam.h that emit deprecation warnings in the dev3 CI build.

Evidence (3)

Gaps to the next level

  • Uses ROOT headers deprecated for removal in ROOT 6.44.
  • Compatibility code for podio < 1.0 and EDM4hep < 1.0 remains.

Actions

  • medium S Replace Hoption.h/Hparam.h in DDCore/src/graphics/DrawBField.cpp with the public THistPainter interface.
  • low M (EIC side) Add a scheduled eic-shell job that builds DD4hep master and runs the epic geometry checks before each DD4hep release.

Impact & long-term viability 2.0

1

Licensing via.license

Initial · confidence high

LGPL-3.0 is detected and declared in Spack, but the bundled GaudiPluginService is GPL-3.0 with its own LICENCE and is built into the DD4hep libraries, and the user manual states that DD4hep is GPLv3.

Evidence (4)

Gaps to the next level

  • GPL-3.0 code is shipped inside the LGPL-3.0 project.
  • The user manual states a different license (GPLv3) than LICENSE (LGPLv3).

Actions

  • high M Re-import GaudiPluginService from current Gaudi (Apache-2.0) or obtain relicensing, and update GaudiPluginService/LICENCE.
  • high S Correct the license statement in doc/usermanuals/DD4hep/chapters/basics.tex.
2

Citation & attribution via.citation

Established · confidence medium

A Zenodo concept DOI (10.5281/zenodo.592244) and .zenodo.json exist and release notes credit each PR author, but the last versioned DOI is for v01-25-01 (February 2023) and .zenodo.json was last changed in 2018.

Evidence (3)

Gaps to the next level

  • Releases after v01-25-01 have no Zenodo DOI.
  • .zenodo.json lists 4 creators and has not been updated since 2018; no CITATION.cff.

Actions

  • medium S Re-enable the Zenodo-GitHub integration so each release gets a DOI, and update .zenodo.json creators.
  • medium S Add CITATION.cff citing the software DOI and the reference publication.
3

Adoption & downstream use via.adoption

Sustained · confidence high

DD4hep ships in eic-shell and underlies the ePIC geometry, simulation and reconstruction, and it is used outside EIC, for example by Key4hep detector models and CMS.

Evidence (4)
2

Institutional backing & continuity via.support

Established · confidence medium

The website and .zenodo.json acknowledge AIDA2020 (Horizon 2020 grant 654168) funding and name developers at CERN and DESY, but no current multi-institution maintenance commitment or succession plan is documented.

Evidence (2)

Gaps to the next level

  • The acknowledged grant ended in 2020; no current institutional commitment or succession plan is documented.

Actions

  • medium S State the current supporting institutions and the plan for maintainer succession in the README.

Key metrics

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

Commits, 12 months308git.commits_12m
Active authors, 12 months23git.authors_12m
Active authors, 24 months32git.authors_24m
New authors, 12 months13git.new_authors_12m
Bus factor (50% of commits, 24 months)3git.bus_factor_50_24m
Top author share of commits, 24 months29%git.top_author_share_24m
Institutional e-mail domains, 24 months9git.email_domains_24m
Default-branch changes via PR, 12 months96%git.first_parent_pr_fraction_12m
PRs merged, 12 months113prs.merged_12m
Merged PRs reviewed by non-author33%prs.reviewed_fraction_12m
Median days to merge73%prs.median_days_to_merge_12m
Merged PRs touching tests2%prs.test_touching_fraction_12m
Distinct reviewers, 12 months9prs.distinct_reviewers_12m
Issues opened, 12 months46issues.created_12m
Median days to first response32%issues.median_first_response_days_12m
Issues without response0%issues.unanswered_fraction_12m
Open issues older than 1 year5issues.open_older_365d
Releases, 24 months9releases.count_24m
Latest releasev01-38releases.latest_tag
Default-branch CI success rate94%ci.default_branch_success_rate
CI runs in eic-shellnoci.uses_eic_shell
License (SPDX)LGPL-3.0repo.license_spdx
Ships in eic-shellyespackaging.in_eic_shell
eic-shell version1.38packaging.eic_shell_version
Source lines (excluding vendored)234911code.source_lines
Test files36code.test_files