Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update OS to Ubuntu 24.04 and ROOT to 6.32.04 #103

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
221 changes: 9 additions & 212 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@

FROM ubuntu:22.04
LABEL ubuntu.version="22.04"
MAINTAINER Tom Eichlersmith <[email protected]>
FROM rootproject/root:6.32.04-ubuntu24.04
LABEL maintainer="Tom Eichlersmith <[email protected]>, Tamas Almos Vami <[email protected]>"

ARG NPROC=1

Expand Down Expand Up @@ -50,7 +49,10 @@ RUN install-ubuntu-packages \
sudo \
time \
util-linux \
zsh
zsh \
libx11-dev \
libxmu-dev \
&& rm -rf /var/lib/apt/lists/*

# Basic python support, necessary for the build steps.
#
Expand All @@ -68,10 +70,10 @@ RUN install-ubuntu-packages \
#
# Adapted from acts-project/machines
###############################################################################
ENV __wget wget -q -O -
ENV __wget="wget -q -O -"
ENV __untar_to="tar -xz --strip-components=1 --directory"
ENV __untar="${__untar_to} src"
ENV __prefix /usr/local
ENV __prefix="/usr/local"

# this directory is where folks should "install" code compiled with the container
# i.e. folks should mount a local install directory to /externals so that the
Expand All @@ -96,136 +98,8 @@ RUN mkdir src &&\
cmake --build src/build --target install -j$NPROC &&\
rm -rf src

###############################################################################
# PYTHIA6
#
# Needed for GENIE. Needs to be linked with ROOT.
#
# Looks complicated? Tell me about it.
# Core of what's done follows from here:
# https://root-forum.cern.ch/t/root-with-pythia6-and-pythia8/19211
# (1) Download pythia6 build tarball from ROOT. Known to lead to a build that can work with ROOT.
# (2) Download the latest Pythia6 (6.4.2.8) from Pythia. Yes, it's still ancient.
# (3) Declare extern some definitions that need to be extern via sed.
# Compiler/linker warns. Hard-won solution.
# (4) Build with C and FORTRAN the various pieces.
# (5) Put everything in a directory in the install area, and cleanup.
#
# (Ideally GENIE works with Pythia8? But not sure that works yet despite the adverts that it does.)
#
###############################################################################
ENV PYTHIA_VERSION="6.428"
ENV PREVIOUS_PYTHIA_VERSION="6.416"
ENV PYTHIA_MAJOR_VERSION=6
LABEL pythia.version=${PYTHIA_VERSION}
#"6.428"
# Pythia uses an un-dotted version file naming convention. To deal with that
# we need some string manipulation and exports that work best with bash
SHELL ["/bin/bash", "-c"]
#ENV PYTHIA_MAJOR_VERSION=$(awk '{print int($1) }' <<< ${PYTHIA_VERSION} )
# export PYTHIA_MAJOR_VERSION=$(awk '{print int($1) }' <<< ${PYTHIA_VERSION} ) &&\

RUN mkdir src && \
export PYTHIA_VERSION_INTEGER=$(awk '{print $1*1000}' <<< ${PYTHIA_VERSION} ) &&\
export PREVIOUS_PYTHIA_VERSION_INTEGER=$(awk '{print $1*1000}' <<< ${PREVIOUS_PYTHIA_VERSION} ) &&\
${__wget} https://root.cern.ch/download/pythia${PYTHIA_MAJOR_VERSION}.tar.gz | ${__untar} &&\
wget --no-check-certificate https://pythia.org/download/pythia${PYTHIA_MAJOR_VERSION}/pythia${PYTHIA_VERSION_INTEGER}.f &&\
mv pythia${PYTHIA_VERSION_INTEGER}.f src/pythia${PYTHIA_VERSION_INTEGER}.f && rm -rf src/pythia${PREVIOUS_PYTHIA_VERSION_INTEGER}.f &&\
cd src/ &&\
sed -i 's/int py/extern int py/g' pythia${PYTHIA_MAJOR_VERSION}_common_address.c && \
sed -i 's/extern int pyuppr/int pyuppr/g' pythia${PYTHIA_MAJOR_VERSION}_common_address.c && \
sed -i 's/char py/extern char py/g' pythia${PYTHIA_MAJOR_VERSION}_common_address.c && \
echo 'void MAIN__() {}' >main.c && \
gcc -c -fPIC -shared main.c -lgfortran && \
gcc -c -fPIC -shared pythia${PYTHIA_MAJOR_VERSION}_common_address.c -lgfortran && \
gfortran -c -fPIC -shared pythia*.f && \
gfortran -c -fPIC -shared -fno-second-underscore tpythia${PYTHIA_MAJOR_VERSION}_called_from_cc.F && \
gfortran -shared -Wl,-soname,libPythia${PYTHIA_MAJOR_VERSION}.so -o libPythia${PYTHIA_MAJOR_VERSION}.so main.o pythia*.o tpythia*.o &&\
mkdir -p ${__prefix}/pythia${PYTHIA_MAJOR_VERSION} && cp -r * ${__prefix}/pythia${PYTHIA_MAJOR_VERSION}/ &&\
cd ../ && rm -rf src &&\
echo "${__prefix}/pythia${PYTHIA_MAJOR_VERSION}/" > /etc/ld.so.conf.d/pythia${PYTHIA_MAJOR_VERSION}.conf

SHELL ["/bin/sh", "-c"]
###############################################################################
# CERN's ROOT
# Needed for GENIE and serialization within the Framework
#
# We have a very specific configuration of the ROOT build system
# - Use C++17 so that ROOT doesn't re-define C++17 STL classes in its headers
# We want to use C++17 in Framework and ROOT's redefinitions prevent that.
# - Use gnuinstall=ON and CMAKE_INSTALL_LIBDIR=lib to make ROOT be a system install
# - Start with a minimal build (gminimal) and then enable things from there.
# - Need asimage and opengl built for the ROOT GUIs to be functional.
# - Want pyroot to support some PyROOT-based analyses
# - Turn off xrootd since its build fails for some reason (and we don't need it)
# - gsl_shared, mathmore, and pytia6 are all used by GENIE
#
# After building and installing, we write a ld conf file to include ROOT's
# libraries in the linker cache, then rebuild the linker cache so that
# downstream libraries in this Dockerfile can link to ROOT easily.
#
# We promote the environment variables defined in thisroot.sh to this
# Dockerfile so that thisroot.sh doesn't need to be sourced.
###############################################################################

RUN install-ubuntu-packages \
fonts-freefont-ttf \
libafterimage-dev \
libfftw3-dev \
libfreetype6-dev \
libftgl-dev \
libgif-dev \
libgl1-mesa-dev \
libgl2ps-dev \
libglew-dev \
libglu-dev \
libjpeg-dev \
liblz4-dev \
liblzma-dev \
libpcre++-dev \
libpng-dev \
libx11-dev \
libxext-dev \
libxft-dev \
libxml2-dev \
libxmu-dev \
libxpm-dev \
libz-dev \
libzstd-dev \
srm-ifce-dev \
libgsl-dev # Necessary for GENIE

ENV ROOT_VERSION="6.22.08"
LABEL root.version=${ROOT_VERSION}
RUN mkdir src &&\
${__wget} https://root.cern/download/root_v${ROOT_VERSION}.source.tar.gz |\
${__untar} &&\
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_STANDARD=17 \
-DCMAKE_INSTALL_PREFIX=${__prefix} \
-DCMAKE_INSTALL_LIBDIR=lib \
-Dgnuinstall=ON \
-Dgminimal=ON \
-Dasimage=ON \
-Dgdml=ON \
-Dopengl=ON \
-Dpyroot=ON \
-Dxrootd=OFF \
-Dgsl_shared=ON \
-Dmathmore=ON \
-Dpythia6=ON \
-DPYTHIA6_LIBRARY=${__prefix}/pythia6/libPythia6.so \
-B build \
-S src \
&& cmake --build build --target install -j$NPROC &&\
rm -rf build src &&\
ldconfig
ENV ROOTSYS=${__prefix}
ENV PYTHONPATH=${ROOTSYS}/lib:${PYTHONPATH}
ENV JUPYTER_PATH=${ROOTSYS}/etc/notebook:${JUPYTER_PATH}
ENV JUPYTER_CONFIG_DIR=${ROOTSYS}/etc/notebook:${JUPYTER_CONFIG_DIR}
ENV CLING_STANDARD_PCH=none

###############################################################################
# Geant4
Expand Down Expand Up @@ -294,83 +168,6 @@ RUN mkdir src &&\
&&\
rm -rf src

###############################################################################
# LHAPDF
#
# Needed for GENIE
#
# - We disable the python subpackage because it is based on Python2 whose
# executable has been removed from Ubuntu 22.04.
###############################################################################
ENV LHAPDF_VERSION="6.5.3"
LABEL lhapdf.version=${LHAPDF_VERSION}
RUN mkdir src &&\
${__wget} https://lhapdf.hepforge.org/downloads/?f=LHAPDF-${LHAPDF_VERSION}.tar.gz |\
${__untar} &&\
cd src &&\
./configure --disable-python --prefix=${__prefix} &&\
make -j$NPROC install &&\
cd ../ &&\
rm -rf src

###############################################################################
# GENIE
#
# Needed for ... GENIE :)
#
# - GENIE looks in ${ROOTSYS}/lib for various ROOT libraries it depends on.
# This is annoying because root installs its libs to ${ROOTSYS}/lib/root
# when the gnuinstall parameter is ON. We fixed this by forcing ROOT to
# install its libs to ${ROOTSYS}/lib even with gnuinstall ON.
# - liblog4cpp5-dev from the Ubuntu 22.04 repos seems to be functional
# - GENIE's binaries link to pythia6 at runtime so we need to add the pythia6
# library directory into the linker cache
# - GENIE reads its configuration from files written into its source tree
# (and not installed), so we need to keep its source tree around
#
# Some errors from the build configuration
# - The 'quota: not found' error can be ignored. It is just saving a snapshot
# of the build environment.
# - The 'cant exec git' error is resolved within the perl script which
# deduces the version from the files in the .git directory if git is
# not installed.
###############################################################################

# See https://github.com/LDMX-Software/docker/pull/48
#
# Note that libgsl-dev needs to be available already when building ROOT to build
# GENIE
RUN install-ubuntu-packages \
liblog4cpp5-dev \
libtool


ENV GENIE_VERSION=3.02.00
#ENV GENIE_REWEIGHT_VERSION=1_02_00
ENV GENIE=/usr/local/src/GENIE/Generator
#ENV GENIE_DOT_VERSION="$(sed 's,_,\.,g' <<< $GENIE_VERSION )"
LABEL genie.version=${GENIE_VERSION}

SHELL ["/bin/bash", "-c"]

RUN mkdir -p ${GENIE} &&\
export ENV GENIE_GET_VERSION="$(sed 's,\.,_,g' <<< $GENIE_VERSION )" &&\
${__wget} https://github.com/GENIE-MC/Generator/archive/refs/tags/R-${GENIE_GET_VERSION}.tar.gz |\
${__untar_to} ${GENIE} &&\
cd ${GENIE} &&\
./configure \
--enable-lhapdf6 \
--disable-lhapdf5 \
--enable-gfortran \
--with-gfortran-lib=/usr/x86_64-linux-gnu/ \
--disable-pythia8 \
--with-pythia6-lib=${__prefix}/pythia6 \
--enable-test \
&& \
make -j$NPROC && \
make -j$NPROC install

SHELL ["/bin/sh", "-c"]

###############################################################################
# Catch2
Expand Down Expand Up @@ -444,7 +241,7 @@ RUN ldconfig -v
# Extra python packages for analysis
###############################################################################
COPY ./python_packages.txt /etc/python_packages.txt
RUN python3 -m pip install --no-cache-dir --requirement /etc/python_packages.txt
RUN python3 -m pip install --no-cache-dir --break-system-packages --requirement /etc/python_packages.txt

# Dependencies for LDMX-sw and/or the container environment
RUN install-ubuntu-packages \
Expand Down
56 changes: 28 additions & 28 deletions python_packages.txt
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
contourpy==1.0.6
cycler==0.11.0
Cython==0.29.32
fonttools==4.38.0
joblib==1.2.0
kiwisolver==1.4.4
llvmlite==0.39.1
matplotlib==3.6.2
mplhep==0.3.26
mplhep-data==0.0.3
numba==0.56.4
numpy==1.21.5
packaging==21.3
pandas==1.5.2
Pillow==9.3.0
pip==22.0.2
pyparsing==3.0.9
python-dateutil==2.8.2
pytz==2022.6
scikit-learn==1.1.3
scipy==1.9.3
setuptools==59.6.0
six==1.16.0
threadpoolctl==3.1.0
uhi==0.3.2
uproot==4.3.7
wheel==0.37.1
xgboost==1.7.1
contourpy
cycler
Cython
fonttools
joblib
kiwisolver
llvmlite
matplotlib
mplhep
mplhep-data
numba
numpy
packaging
pandas
Pillow
pip
pyparsing
python-dateutil
pytz
scikit-learn
scipy
setuptools
six
threadpoolctl
uhi
uproot
wheel
xgboost
Loading