Files
Jungfraujoch/THIRD_PARTY_NOTICES.md
T
leonarski_fandClaude Opus 5 2e8040c60c
Build Packages / build:windows:nocuda (push) Successful in 16m47s
Build Packages / build:windows:cuda (push) Successful in 19m11s
Build Packages / build:rugnux:windows (push) Successful in 11m15s
Build Packages / build:rugnux:aarch64 (cross) (push) Successful in 7m54s
Build Packages / build:viewer-tgz:cpu (push) Successful in 14m55s
Build Packages / build:rugnux-tgz (x86_64) (push) Successful in 14m27s
Build Packages / build:viewer-tgz:cuda (push) Successful in 15m36s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 15m39s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 19m59s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 16m7s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 19m47s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 21m51s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 17m18s
Build Packages / build:rpm (rocky8) (push) Successful in 20m37s
Build Packages / build:rpm (rocky9) (push) Successful in 18m21s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 20m0s
Build Packages / Generate python client (push) Successful in 32s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 18m23s
Build Packages / Build documentation (push) Successful in 1m0s
Build Packages / Create release (push) Skipped
Build Packages / XDS test (durin plugin) (push) Successful in 9m20s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 9m21s
Build Packages / XDS test (neggia plugin) (push) Successful in 7m43s
Build Packages / DIALS test (push) Successful in 19m58s
Build Packages / Unit tests (push) Successful in 2h48m45s
rugnux: read mmCIF models with --model, and say when a model could not be used
--model called gemmi::read_pdb unconditionally, so a coordinate file in mmCIF -
which is how the PDB serves coordinates by default - was refused outright:

  Model validation: cannot read model 6G8A.cif:
  Incorrect file format (perhaps it is cif not pdb?)

Worse than the refusal was what followed it. ValidateAgainstModel logged,
returned an empty result, and the run went on to finish with exit code 0, no
R-free, no maps and nothing in the report - indistinguishable from a run that was
never given --model at all. A script that passed a .cif, checked the exit code
and grepped for R-free simply got nothing back.

Both read sites now go through read_structure_gz with CoorFormat::Detect, so PDB,
mmCIF and mmJSON are all read, gzipped or not, and the format comes from the
file's content rather than from its name. Detect is passed explicitly: GEMMI
otherwise takes the extension and only falls back to the content when it does not
recognise one, and a model arrives named however whoever produced it named it.

That needed a part of GEMMI the vendored subset had trimmed away. mmread.hpp was
already here but its CIF parser was not, so this restores what upstream GEMMI
ships: read_cif/mmcif/json/mmread_gz, plus GEMMI's own copies of PEGTL (MIT,
Colin Hirsch and Daniel Frey; 155 headers, 672 kB) and sajson (MIT, Chad Austin;
one header). Both are listed in THIRD_PARTY_NOTICES.md with their own licence
texts, PEGTL's collected by COLLECT.sh and sajson's kept by hand, its terms being
a comment block rather than a file. json.cpp carries a one-line change: upstream
keeps sajson at the root of its repository, outside the include tree this subset
copies, so the include points at where the other bundled headers live.

ModelValidationResult gains failure_reason, and a model that was asked for and
could not be used now reaches the results report as

  WARNING: Model validation did not run: model bogus.pdb has no atoms or no unit cell

in --mode mx and --mode scale alike. The run still succeeds - a merge that is good
is not made bad by a model that was not - but it no longer does so quietly.

One log line was making a claim it could not support: the indexing-ambiguity
message said the ambiguity was "resolved against the supplied model" while being
printed before the model is read, so it announced a resolution that a failed model
never performed. It now says the model will be used; the reference branch, where
the work really has already happened, keeps the past tense.

Verified on the rotation test dataset with a deposited mmCIF, the same file
gzipped, an mmCIF under a .pdb name, a PDB, and an unreadable file.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WmryXe8ASbNi632sUMfsa
2026-08-27 13:42:48 +02:00

7.7 KiB

Third-party software notices

Jungfraujoch is licensed under GPL-3.0 (see LICENSE); the FPGA design is licensed under CERN-OHL-S-2.0 (see fpga/LICENSE). It builds on a number of third-party components, acknowledged below as required by their licenses.

This file is the human-readable manifest. The verbatim license texts live in the licenses/ directory (regenerate with bash licenses/COLLECT.sh). The frontend's bundled JavaScript dependencies are listed separately in frontend/dist/THIRD_PARTY_LICENSES.txt, generated at build time (npm run licenses).

All licenses below are GPL-3.0-compatible.

Fetched at build time and statically linked into the C++ binaries

These are downloaded by CMake (FetchContent / ExternalProject) during the first configure and linked into the Jungfraujoch executables.

Component Version Copyright License (SPDX) License text
spdlog 1.17.0 Gabi Melman MIT spdlog.txt
Zstandard (pinned) Meta Platforms, Inc. BSD-3-Clause zstd.txt
HDF5 2.1.0 The HDF Group; UIUC BSD-3-Clause-style hdf5.txt
slsDetectorPackage 8.0.2 / 9.2.0 PSI LGPL-3.0-or-later LGPL, GPL
cpp-httplib 0.39.0 Yuji Hirose MIT cpp-httplib.txt
libzmq (ZeroMQ) 4.3.5 iMatix and contributors MPL-2.0 libzmq.txt
libtiff 4.7.1 Sam Leffler; SGI libtiff (BSD-like) libtiff.txt
FFTW 3.3.10 Matteo Frigo; MIT GPL-2.0-or-later fftw.txt
Ceres Solver (pinned) Google Inc. and contributors BSD-3-Clause ceres-solver.txt
fast-feedback-indexer (pinned) PSI BSD-3-Clause fast-feedback-indexer.txt
libjpeg-turbo (pinned) D. R. Commander and others; IJG IJG + BSD-3-Clause + Zlib libjpeg-turbo.txt
Catch2 3.13.0 Catch2 Authors BSL-1.0 catch2.txt

Catch2 is used only to build the test binary (jfjoch_test) and is not part of any shipped artifact; it is listed here for completeness.

Vendored directly in the repository

These are copied into the source tree (see the path) rather than fetched.

Component Path Copyright License (SPDX) License text
nlohmann/json include/nlohmann/ Niels Lohmann MIT nlohmann-json.txt
Macaron Base64 include/base64/ tomykaira MIT base64-macaron.txt
TinyCBOR frame_serialize/tinycbor/ Intel Corporation MIT tinycbor.txt
Bitshuffle compression/bitshuffle/ Kiyoshi Masui MIT bitshuffle.txt
Bitshuffle (h-perf) compression/bitshuffle_hperf/ Kal Cutter (DECTRIS) Apache-2.0 bitshuffle-hperf.txt
LZ4 compression/lz4/ Yann Collet BSD-2-Clause lz4.txt
HLS arbitrary-precision types fpga/include/ Xilinx, Inc. Apache-2.0 xilinx-hls-headers.txt
GEMMI gemmi_gph/ Global Phasing Ltd. MPL-2.0 gemmi.txt
PEGTL gemmi_gph/gemmi/third_party/tao/ Dr. Colin Hirsch and Daniel Frey MIT pegtl.txt
sajson gemmi_gph/gemmi/third_party/sajson.h Chad Austin MIT sajson.txt
traccc (ACTS) image_analysis/spot_finding/StrongPixelSet.cpp, SpotExtractorGPU.cu CERN, for the benefit of the ACTS project MPL-2.0 traccc.txt
xbflash.qspi tools/xbflash.qspi/ Xilinx / AMD Apache-2.0 xbflash-qspi.txt
wingetopt tools/wingetopt/ Todd C. Miller; The NetBSD Foundation ISC AND BSD-2-Clause wingetopt.txt

Runtime libraries and SDKs (shipped in binaries, not in the source tree)

Component Used by License Notice
Qt 6 jfjoch_viewer LGPL-3.0 notice, LGPL-3.0
NVIDIA CUDA Toolkit (cudart, cuFFT) CUDA builds NVIDIA CUDA EULA notice, EULA
zlib everywhere (compression) Zlib zlib.txt
Eigen analysis libs, Ceres, ffbidx (header-only) MPL-2.0 (+ BSD parts) eigen.txt, README

Frontend (npm) dependencies

The React/TypeScript frontend (frontend/) bundles a large transitive tree of npm packages, overwhelmingly MIT/ISC/BSD/Apache-2.0 licensed. Their full notices are generated automatically:

cd frontend && npm run licenses     # writes dist/THIRD_PARTY_LICENSES.txt

The generated file is produced as part of the frontend build target and installed alongside the served frontend, so the shipped web UI carries its own attribution.

Notes on weak-copyleft and attribution-sensitive components

  • MPL-2.0 (Eigen, GEMMI, libzmq, traccc): file-level copyleft. GEMMI is vendored in gemmi_gph/ in trimmed form; libzmq is fetched at build time; Eigen is provided externally (header-only). The corresponding source is available from each project upstream.
  • traccc is the one entry that is not a vendored directory. Its sparse connected-component labelling enters two otherwise first-party files: StrongPixelSet.cpp adapts the SparseCCL source, and SpotExtractorGPU.cu follows the design of its GPU counterpart. MPL-2.0 is file-level, so both files name the origin at the top and are covered by licenses/traccc.txt. See ACKNOWLEDGEMENT.md for the citation.
  • FFTW is GPL-2.0-or-later — compatible with, and absorbed by, this project's GPL-3.0 license.
  • Apache-2.0 components: where upstream ships a NOTICE file, it is reproduced in the corresponding licenses/ text.
  • Qt (LGPL-3.0) and NVIDIA CUDA (EULA) carry redistribution conditions beyond a copyright notice; see their dedicated notice files. The verbatim LGPL-3.0 and CUDA EULA texts are bundled (licenses/Qt6-LGPL-3.0.txt, licenses/NVIDIA-CUDA-EULA.txt); the CUDA EULA is the one shipped with CUDA Toolkit 12.8 — replace it if you build against a different toolkit version.