Build Packages / Unit tests (push) Skipped
Build Packages / build:windows:cuda (push) Successful in 18m44s
Build Packages / build:viewer-tgz:cpu (push) Successful in 6m11s
Build Packages / build:viewer-tgz:cuda (push) Successful in 6m54s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 9m40s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 10m41s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 10m10s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 10m4s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 11m5s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 12m23s
Build Packages / build:rpm (rocky8) (push) Successful in 11m30s
Build Packages / build:rpm (rocky9) (push) Successful in 12m51s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 12m8s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 11m21s
Build Packages / DIALS test (push) Successful in 13m22s
Build Packages / XDS test (durin plugin) (push) Successful in 9m2s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m55s
Build Packages / XDS test (neggia plugin) (push) Successful in 5m57s
Build Packages / Generate python client (push) Successful in 23s
Build Packages / Build documentation (push) Successful in 57s
Build Packages / Create release (push) Skipped
Build Packages / build:windows:nocuda (push) Successful in 10m24s
This is an UNSTABLE release. It includes many experimental features, as well as many AI generated fixes. We recommend using rc.152 for production use. * rugnux: Add `--model model.pdb` - score the merged data against an atomic model and compute initial maps. It reports R-work/R-free (scaling the model to the observed amplitudes with an overall scale, an anisotropic B and a flat bulk solvent - the standard few-parameter model, so a batch of maps stays directly comparable) and writes 2Fo-Fc / Fo-Fc electron-density maps (CCP4) plus a map-coefficient MTZ. The structure itself is not refined; the model is only re-fractionalised into the data cell. * rugnux: The merged reflection output now carries French-Wilson amplitudes (|F| and its sigma) next to the intensities - MTZ `F`/`SIGF`, mmCIF `_refln.F_meas_au`, and the text HKL - computed with the correct centric/acentric Wilson prior and epsilon multiplicity, so a downstream program (e.g. phenix.refine) can refine against amplitudes. The intensity columns are unchanged. * rugnux: R-free test-set flags are now assigned deterministically and consistently across symmetry - a Bijvoet pair I(+)/I(-) is never split between the work and free sets, and the assignment is a reproducible per-hkl hash that depends only on the reflection index, so every dataset of one crystal form gets the same ~5% free set (what a multi-dataset campaign such as PanDDA needs). On small data the fraction is floored so the test set stays large enough for a stable R-free (~500 reflections, capped at 10%); it stays flat at 5% on ordinary data. When a reference MTZ carries a `FreeR_flag` column its test set is imported instead, letting a whole campaign inherit one shared free set. * rugnux: A reference MTZ (`--reference-mtz`) can now fix the space group and cell for rotation data too (previously rejected), without being used to scale - the rotation merge stays self-consistent. When the crystal has an indexing (merohedral) ambiguity - a lattice symmetry higher than its Laue symmetry, e.g. P3/P4/P6/C2 - the reference also resolves it: each candidate reindexing (identity plus the twin-law cosets of the metric symmetry) is scored by its intensity correlation against the reference and the data are re-merged in the best-correlating one. This is a metric-preserving relabelling of hkl (the cell is unchanged) and a no-op for a holohedral crystal such as lysozyme. * rugnux: `--model` validation now aligns the data to the model before scoring - the observed reflections are reindexed into the model's enantiomorph when the two differ only by hand (indistinguishable from merged intensities). A merohedral indexing ambiguity is resolved against the reference MTZ when one is given (so a whole campaign shares one indexing convention); only with a model and no reference does validation fall back to fitting each candidate reindexing and keeping the lowest R-free. * rugnux: De-novo symmetry - recover a genuine high-symmetry group whose data are imperfectly scaled. Such a merge's within-orbit chi² lands just past the self-consistency bound (each real symmetry step adds a little systematic scatter), right where a merohedral twin also lands, so the chi² ratio alone cannot separate them. The candidate is now rescued when the extra intensity-proportional systematic error it invokes stays small relative to the confirmed subgroup - a genuine symmetry step gains multiplicity without inflating the merge error model's b, whereas a twin forces non-equivalent reflections together and b balloons. Fixes cubic insulin (I23 instead of I222) with no change to any other crystal in the test battery, including the twins that must stay in their lower symmetry. * Docs: Document the French-Wilson amplitude estimation, R-free flagging, reference-based space-group/ambiguity resolution, and model-based validation/maps in CPU_DATA_ANALYSIS.md. * Frontend: The status-bar pill now shows a progress bar during detector calibration (previously only during measurement), and the calibration state and its button are labelled "Calibration"/"CALIBRATE" (the internal `Pedestal` state name is unchanged for back-compatibility).Reviewed-on: #70 Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch>
209 lines
7.9 KiB
Docker
209 lines
7.9 KiB
Docker
# Ubuntu 22.04 (Jammy) base with CUDA 13 devel toolchain
|
|
FROM nvidia/cuda:13.0.1-devel-ubuntu22.04
|
|
LABEL authors="leonarski_f"
|
|
|
|
ENV DEBIAN_FRONTEND=noninteractive
|
|
|
|
ARG OPENSSL_VERSION=3.5.4
|
|
ARG QT_VERSION=6.9.1
|
|
ARG DBUS_VERSION=1.14.10
|
|
ARG NODE_MAJOR=22
|
|
ARG EIGEN_VERSION=3.4.0
|
|
# HDF5, libtiff and libjpeg-turbo are built by the jungfraujoch CMake itself (FetchContent /
|
|
# ExternalProject). Eigen is an external find_package(Eigen3 3.4) dependency, installed from source
|
|
# below (3.4.x is required; Eigen's same-major-version rule rejects 5.x).
|
|
|
|
# Update base and install toolchain + Qt dependencies
|
|
# Notes:
|
|
# - GCC/G++ 13 are installed from jammy-backports
|
|
# - XCB/X11/OpenGL/EGL/DBus/fontconfig/freetype/zlib headers installed for building static Qt
|
|
RUN set -eux; \
|
|
apt-get update; \
|
|
apt-get install -y --no-install-recommends \
|
|
ca-certificates \
|
|
curl \
|
|
wget \
|
|
gpg \
|
|
git \
|
|
tar \
|
|
xz-utils \
|
|
build-essential \
|
|
ninja-build \
|
|
python3 \
|
|
python3-venv \
|
|
python3-requests \
|
|
perl \
|
|
pkg-config \
|
|
gdb \
|
|
file \
|
|
nasm \
|
|
python3.11 \
|
|
python3.11-venv \
|
|
dpkg-dev \
|
|
fakeroot \
|
|
libnuma-dev \
|
|
libkrb5-dev \
|
|
libxcb1-dev \
|
|
libx11-dev \
|
|
libxext-dev \
|
|
libxrender-dev \
|
|
libxi-dev \
|
|
libxrandr-dev \
|
|
libxcursor-dev \
|
|
libxfixes-dev \
|
|
libxinerama-dev \
|
|
libxkbcommon-dev \
|
|
libxkbcommon-x11-dev \
|
|
libx11-xcb-dev \
|
|
libxcb-image0-dev \
|
|
libxcb-icccm4-dev \
|
|
libxcb-keysyms1-dev \
|
|
libxcb-render-util0-dev \
|
|
libxcb-util-dev \
|
|
libxcb-randr0-dev \
|
|
libxcb-xkb-dev \
|
|
libxcb-shm0-dev \
|
|
libxcb-cursor0 \
|
|
libxcb-cursor-dev \
|
|
libxcb-shape0-dev \
|
|
libxcb-sync-dev \
|
|
libxcb-xfixes0-dev \
|
|
libxcb-glx0-dev \
|
|
libgl1-mesa-dev \
|
|
libglx-dev \
|
|
libegl1-mesa-dev \
|
|
libexpat1-dev \
|
|
zlib1g-dev \
|
|
libfontconfig1-dev \
|
|
libdrm-dev \
|
|
mesa-utils \
|
|
libassimp-dev \
|
|
libglvnd-dev \
|
|
libfreetype6-dev; \
|
|
wget -qO- https://apt.kitware.com/keys/kitware-archive-latest.asc \
|
|
| gpg --dearmor \
|
|
| tee /usr/share/keyrings/kitware-archive-keyring.gpg > /dev/null; \
|
|
echo "deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ jammy main" \
|
|
| tee /etc/apt/sources.list.d/kitware.list > /dev/null; \
|
|
apt-get update; \
|
|
apt-get install -y --no-install-recommends \
|
|
cmake=3.26.* \
|
|
cmake-data=3.26.* \
|
|
kitware-archive-keyring; \
|
|
apt-get -y install gcc-12 g++-12; \
|
|
apt-get clean; \
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
# Use GCC/G++ 12 for builds
|
|
ENV CC=/usr/bin/gcc-12
|
|
ENV CXX=/usr/bin/g++-12
|
|
ENV PATH=/usr/bin:${PATH}
|
|
|
|
# Build a static OpenSSL
|
|
RUN set -eux; \
|
|
cd /tmp; \
|
|
curl -LO https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz; \
|
|
tar -xf openssl-${OPENSSL_VERSION}.tar.gz; \
|
|
cd openssl-${OPENSSL_VERSION}; \
|
|
./Configure linux-x86_64 no-shared no-module no-tests --prefix=/opt/openssl-${OPENSSL_VERSION} --libdir=lib; \
|
|
make -j"$(nproc)"; \
|
|
make install_sw; \
|
|
cd /; rm -rf /tmp/openssl-${OPENSSL_VERSION} /tmp/openssl-${OPENSSL_VERSION}.tar.gz
|
|
|
|
# Expose static OpenSSL to CMake/pkg-config
|
|
ENV OPENSSL_ROOT_DIR=/opt/openssl-${OPENSSL_VERSION}
|
|
ENV PKG_CONFIG_PATH=${OPENSSL_ROOT_DIR}/lib/pkgconfig:${OPENSSL_ROOT_DIR}/lib64/pkgconfig:${PKG_CONFIG_PATH}
|
|
|
|
# Install a recent Node.js (NodeSource)
|
|
RUN set -eux; \
|
|
curl -fsSL https://deb.nodesource.com/setup_${NODE_MAJOR}.x | bash -; \
|
|
apt-get update; \
|
|
apt-get install -y --no-install-recommends nodejs; \
|
|
apt-get clean; \
|
|
rm -rf /var/lib/apt/lists/*; \
|
|
node --version; npm --version; (corepack enable || true)
|
|
|
|
# Static libdbus: link D-Bus into the viewer (Qt6::DBus) instead of pulling libdbus-1.so.3 at runtime.
|
|
# A distro libdbus-1.so drags in libsystemd (-> libzstd/liblz4/libcap/libgcrypt/libgpg-error) and
|
|
# libselinux (-> libpcre2). Disabling those integrations makes libdbus-1.a depend on ~libc alone, so
|
|
# that whole runtime .so tail disappears while the viewer keeps its single-instance / remote-control
|
|
# D-Bus feature -- it is a pure session-bus client (registers a name + exports an adaptor), so the
|
|
# daemon-side systemd/selinux features are irrelevant. Static-only install (no .so); the Qt build
|
|
# finds it through find_package(DBus1) via the -DDBus1_DIR hint (the CMake package config dbus
|
|
# installs, which imports libdbus-1.a). Built -fPIC (--with-pic) so the archive links into Qt's PIE
|
|
# tools (qdbusxml2cpp). expat is only a configure-time dep of the dbus daemon; the client libdbus-1
|
|
# links neither expat nor systemd.
|
|
RUN set -eux; \
|
|
cd /tmp; \
|
|
curl -LO https://dbus.freedesktop.org/releases/dbus/dbus-${DBUS_VERSION}.tar.xz; \
|
|
tar -xf dbus-${DBUS_VERSION}.tar.xz; \
|
|
cd dbus-${DBUS_VERSION}; \
|
|
./configure --prefix=/opt/dbus-${DBUS_VERSION}-static \
|
|
--enable-static --disable-shared --with-pic \
|
|
--disable-systemd --without-systemdsystemunitdir \
|
|
--disable-selinux --disable-apparmor --disable-libaudit \
|
|
--disable-tests --disable-asserts \
|
|
--disable-doxygen-docs --disable-xml-docs --disable-ducktype-docs \
|
|
CFLAGS="-fPIC"; \
|
|
make -j"$(nproc)"; \
|
|
make install; \
|
|
cd /; rm -rf /tmp/dbus-${DBUS_VERSION} /tmp/dbus-${DBUS_VERSION}.tar.xz
|
|
|
|
# Put the static libdbus pkgconfig ahead of the system one so Qt6::DBus resolves to the .a
|
|
ENV PKG_CONFIG_PATH=/opt/dbus-${DBUS_VERSION}-static/lib/pkgconfig:${PKG_CONFIG_PATH}
|
|
|
|
# Build and install static Qt with Core, Gui, Widgets, Charts, DBus
|
|
ARG QT_PREFIX=/opt/qt-${QT_VERSION}-static
|
|
RUN set -eux; \
|
|
cd /tmp; \
|
|
curl -LO https://download.qt.io/official_releases/qt/6.9/${QT_VERSION}/single/qt-everywhere-src-${QT_VERSION}.tar.xz; \
|
|
tar -xf qt-everywhere-src-${QT_VERSION}.tar.xz; \
|
|
mkdir -p qt-everywhere-src-${QT_VERSION}/build && cd qt-everywhere-src-${QT_VERSION}/build; \
|
|
cmake -G Ninja \
|
|
-DQT_BUILD_SUBMODULES="qtbase;qtshadertools;qtdeclarative;qtcharts;qt3d" \
|
|
-DBUILD_SHARED_LIBS=OFF \
|
|
-DQT_BUILD_TESTS=OFF \
|
|
-DQT_BUILD_EXAMPLES=OFF \
|
|
-DQT_FEATURE_dbus=ON \
|
|
-DQT_FEATURE_dbus_linked=ON \
|
|
-DDBus1_DIR=/opt/dbus-${DBUS_VERSION}-static/lib/cmake/DBus1 \
|
|
-DQT_FEATURE_xcb=ON \
|
|
-DQT_FEATURE_xcb_xlib=OFF \
|
|
-DQT_FEATURE_xkbcommon_x11=ON \
|
|
-DQT_FEATURE_opengl=ON \
|
|
-DQT_FEATURE_opengl_desktop=ON \
|
|
-DQT_FEATURE_opengl_dynamic=OFF \
|
|
-DQT_FEATURE_vulkan=OFF \
|
|
-DQT_FEATURE_glib=OFF \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_INSTALL_PREFIX=${QT_PREFIX} \
|
|
-DCMAKE_C_COMPILER=${CC} \
|
|
-DCMAKE_CXX_COMPILER=${CXX} \
|
|
-DQT_FEATURE_openssl=ON \
|
|
-DQT_FEATURE_openssl_linked=ON \
|
|
-DOPENSSL_USE_STATIC_LIBS=TRUE \
|
|
..; \
|
|
cmake --build . -j"$(nproc)"; \
|
|
cmake --install .; \
|
|
cd /; rm -rf /tmp/qt-everywhere-src-${QT_VERSION} /tmp/qt-everywhere-src-${QT_VERSION}.tar.xz
|
|
|
|
# Eigen 3.4 (header-only) -- external find_package(Eigen3 3.4) dependency, installed to /opt/eigen-3.4.
|
|
RUN set -eux; \
|
|
cd /tmp; \
|
|
git clone --depth 1 --branch ${EIGEN_VERSION} https://gitlab.com/libeigen/eigen.git; \
|
|
cmake -G Ninja -S eigen -B eigen-build -DCMAKE_INSTALL_PREFIX=/opt/eigen-3.4 \
|
|
-DEIGEN_BUILD_BLAS=OFF -DEIGEN_BUILD_LAPACK=OFF -DEIGEN_BUILD_DOC=OFF -DBUILD_TESTING=OFF; \
|
|
cmake --install eigen-build; \
|
|
cd /; rm -rf /tmp/eigen /tmp/eigen-build
|
|
|
|
# Make Qt, the static libdbus, and Eigen discoverable by CMake. The static libdbus prefix is
|
|
# required here (not only at Qt build time): every Qt6::DBus consumer re-runs find_package(DBus1)
|
|
# through Qt's exported config, so DBus1Config.cmake must be on CMAKE_PREFIX_PATH for the viewer build.
|
|
ENV CMAKE_PREFIX_PATH=/opt/qt-${QT_VERSION}-static:/opt/dbus-${DBUS_VERSION}-static:/opt/eigen-3.4
|
|
|
|
# Set workdir for your project
|
|
WORKDIR /workspace
|
|
|
|
# Default entrypoint: interactive shell
|
|
CMD ["/bin/bash", "-l"]
|