diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d945ccb..77e2646 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,5 +1,5 @@ # GitHub action to build software. -# Linux builds include pre-built dependencies via containers. +# The Linux build uses a pre-built dependency container image. # The Windows and MacOS builds build dependencies each run. name: Build @@ -7,102 +7,85 @@ on: pull_request: jobs: - ubuntu_20_04_build: + ubuntu_26_04_build: runs-on: ubuntu-latest - container: ghcr.io/rg2/xreg-deps-ubuntu-20.04:latest + container: ghcr.io/rg2/xreg-deps-ubuntu-26.04:latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - run: ./.github/workflows/linux_cmake_build shell: bash - run: ./dist/ubuntu_dist_pkgs shell: bash - - run: ./.github/workflows/linux_make_dist ubuntu-20.04 + - run: ./.github/workflows/linux_make_dist ubuntu-26.04 shell: bash - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: - name: ubuntu-20.04-build - path: xreg-ubuntu-20.04.tar.gz + name: ubuntu-26.04-build + path: xreg-ubuntu-26.04.tar.gz - ubuntu_18_04_build: + ubuntu_24_04_build: runs-on: ubuntu-latest - container: ghcr.io/rg2/xreg-deps-ubuntu-18.04:latest + container: ghcr.io/rg2/xreg-deps-ubuntu-24.04:latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - run: ./.github/workflows/linux_cmake_build shell: bash - run: ./dist/ubuntu_dist_pkgs shell: bash - - run: ./.github/workflows/linux_make_dist ubuntu-18.04 + - run: ./.github/workflows/linux_make_dist ubuntu-24.04 shell: bash - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: - name: ubuntu-18.04-build - path: xreg-ubuntu-18.04.tar.gz + name: ubuntu-24.04-build + path: xreg-ubuntu-24.04.tar.gz - ubuntu_16_04_build: + ubuntu_22_04_build: runs-on: ubuntu-latest - container: ghcr.io/rg2/xreg-deps-ubuntu-16.04:latest + container: ghcr.io/rg2/xreg-deps-ubuntu-22.04:latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - run: ./.github/workflows/linux_cmake_build shell: bash - run: ./dist/ubuntu_dist_pkgs shell: bash - - run: ./.github/workflows/linux_make_dist ubuntu-16.04 + - run: ./.github/workflows/linux_make_dist ubuntu-22.04 shell: bash - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: - name: ubuntu-16.04-build - path: xreg-ubuntu-16.04.tar.gz - - centos_7_build: - runs-on: ubuntu-latest - container: ghcr.io/rg2/xreg-deps-centos-7:latest - - steps: - - uses: actions/checkout@v2 - - run: ./.github/workflows/linux_cmake_build - shell: bash - - run: ./dist/centos_dist_pkgs - shell: bash - - run: ./.github/workflows/linux_make_dist centos-7 - shell: bash - - uses: actions/upload-artifact@v2 - with: - name: centos-7-build - path: xreg-centos-7.tar.gz - - windows_build: - runs-on: windows-2019 - - steps: - - uses: actions/checkout@v2 - - uses: ilammy/msvc-dev-cmd@v1 - - run: example_build_script_win.cmd - shell: cmd - - run: .github\workflows\win_make_dist.cmd - shell: cmd - - uses: actions/upload-artifact@v2 - with: - name: win-64-build - path: xreg-win64.zip + name: ubuntu-22.04-build + path: xreg-ubuntu-22.04.tar.gz - macos_build: - runs-on: macos-10.15 +# windows_build: +# runs-on: windows-2022 +# +# steps: +# - uses: actions/checkout@v4 +# - uses: ilammy/msvc-dev-cmd@v1 +# - run: example_build_script_win.cmd +# shell: cmd +# - run: .github\workflows\win_make_dist.cmd +# shell: cmd +# - uses: actions/upload-artifact@v4 +# with: +# name: win-64-build +# path: xreg-win64.zip - steps: - - uses: actions/checkout@v2 - - run: brew install ninja - - run: XREG_INSTALL_DIR="$HOME/xreg_install" ./example_build_script_2 - shell: bash - - run: mkdir xreg-macos-10.15 - - run: python3 ./dist/make_macos_dist.py $HOME/xreg_install xreg-macos-10.15 ../xreg_deps_install - - run: cp LICENSE xreg-macos-10.15 && cp ./dist/dist_readme/README.txt xreg-macos-10.15 - - run: tar czf xreg-macos-10.15.tar.gz xreg-macos-10.15 - - uses: actions/upload-artifact@v2 - with: - name: macos-10.15-build - path: xreg-macos-10.15.tar.gz +# macos_build: +# runs-on: macos-15-intel +# +# steps: +# - uses: actions/checkout@v4 +# - run: brew install ninja +# - run: XREG_INSTALL_DIR="$HOME/xreg_install" ./example_build_script_2 +# shell: bash +# - run: mkdir xreg-macos-15 +# - run: python3 ./dist/make_macos_dist.py $HOME/xreg_install xreg-macos-15 ../xreg_deps_install +# - run: cp LICENSE xreg-macos-15 && cp ./dist/dist_readme/README.txt xreg-macos-15 +# - run: tar czf xreg-macos-15.tar.gz xreg-macos-15 +# - uses: actions/upload-artifact@v4 +# with: +# name: macos-15-build +# path: xreg-macos-15.tar.gz diff --git a/.github/workflows/linux_make_dist b/.github/workflows/linux_make_dist index 441b631..c91ba81 100755 --- a/.github/workflows/linux_make_dist +++ b/.github/workflows/linux_make_dist @@ -3,7 +3,7 @@ XREG_NAME="xreg-${1}" mkdir $XREG_NAME -LD_LIBRARY_PATH="/usr/local/lib:/usr/local/lib64:/opt/tbb/lib/intel64/gcc4.7:$LD_LIBRARY_PATH" \ +LD_LIBRARY_PATH="/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH" \ python3 ./dist/make_linux_dist.py /usr/local $XREG_NAME cp ./dist/dist_readme/README.txt $XREG_NAME diff --git a/CMakeLists.txt b/CMakeLists.txt index a95843c..d2ac742 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,7 +99,6 @@ find_package(ITK REQUIRED) include(${ITK_USE_FILE}) find_package(VTK REQUIRED) -include(${VTK_USE_FILE}) find_package(OpenCV REQUIRED) diff --git a/docker/Dockerfile.ubuntu_dev_base b/docker/Dockerfile.ubuntu_dev_base index ea622cf..577e6e0 100644 --- a/docker/Dockerfile.ubuntu_dev_base +++ b/docker/Dockerfile.ubuntu_dev_base @@ -1,29 +1,23 @@ # This Docker file is used to build an ubuntu image with the necessary # packages installed to complete an xReg build (along with its dependencies) -ARG os_version=16.04 +ARG os_version=26.04 FROM ubuntu:${os_version} # DEBIAN_FRONTEND=noninteractive is needed to avoid an interactive prompt -# to set the timezone with 20.04 images. +# to set the timezone with images of 20.04 or more recent. RUN export DEBIAN_FRONTEND=noninteractive && \ apt-get update && apt-get install -y --no-install-recommends \ build-essential \ ca-certificates \ cmake \ + ninja-build \ + libtbb-dev \ wget \ libssl-dev \ git \ libglew-dev \ libxt-dev && \ rm -rf /var/lib/apt/lists/* - -# Build a recent version of cmake -RUN mkdir cmake_build && cd cmake_build && \ - wget https://github.com/Kitware/CMake/releases/download/v3.18.2/cmake-3.18.2.tar.gz && \ - tar xf cmake-3.18.2.tar.gz && cd cmake-3.18.2 && mkdir build && cd build && \ - cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build . && cmake --build . --target install && \ - cd / && rm -rf cmake_build - diff --git a/docker/Dockerfile.xreg b/docker/Dockerfile.xreg index 9b6fecb..1ce3249 100644 --- a/docker/Dockerfile.xreg +++ b/docker/Dockerfile.xreg @@ -6,7 +6,7 @@ ARG os_name=ubuntu # for ubuntu choose 16.04, 18.04, or 20.04 # for centos choose 7 or 8 -ARG os_version=16.04 +ARG os_version=26.04 FROM xreg-deps-${os_name}-${os_version} @@ -17,9 +17,8 @@ COPY . . RUN mkdir build && cd build && \ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS:BOOL=ON \ -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON \ - -DTBB_DIR:PATH="/opt/tbb/cmake" \ -DXREG_USE_LEGACY_FIND_TBB:BOOL=OFF \ .. && \ - cmake --build . && cmake --build . --target install && \ + cmake --build . --parallel 2 && cmake --build . --target install && \ cd / && rm -rf xreg_build diff --git a/docker/Dockerfile.xreg-deps b/docker/Dockerfile.xreg-deps index 202e227..5e47507 100644 --- a/docker/Dockerfile.xreg-deps +++ b/docker/Dockerfile.xreg-deps @@ -7,7 +7,7 @@ ARG os_name=ubuntu # for ubuntu choose 16.04, 18.04, or 20.04 # for centos choose 7 or 8 -ARG os_version=16.04 +ARG os_version=26.04 # e.g. by running Dockerfile.ubuntu_dev_base or Dockerfile.centos_dev_base FROM xreg-dev-base-${os_name}-${os_version} as xreg-dev-base-cust-deps @@ -21,46 +21,34 @@ RUN mkdir ffmpeg_dl && cd ffmpeg_dl && \ mv ffmpeg-*-amd64-static/ffmpeg /usr/local/bin && \ cd / && rm -rf ffmpeg_dl -# Get a more recent version of TBB than what is probably in the package manager -# At least one that works better w/ CMake -RUN mkdir tbb_dl && cd tbb_dl && \ - wget https://github.com/intel/tbb/releases/download/2018_U1/tbb2018_20170919oss_lin.tgz && \ - tar xf tbb2018_20170919oss_lin.tgz && \ - mv tbb2018_20170919oss /opt && cd /opt && ln -s tbb2018_20170919oss tbb && \ - cd / && rm -rf tbb_dl - -# building ninja as it is able to build quicker than make -RUN mkdir ninja_build && cd ninja_build && \ - wget https://github.com/ninja-build/ninja/archive/v1.10.1.tar.gz && \ - tar xf v1.10.1.tar.gz && cd ninja-1.10.1 && mkdir build && cd build && \ - cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build . && cmake --build . --target install && \ - cd / && rm -rf ninja_build - FROM xreg-dev-base-cust-deps as xreg-deps WORKDIR / -# bring in boost 1.74 header only +# bring in boost header only RUN mkdir boost_dl && cd boost_dl && \ - wget https://boostorg.jfrog.io/artifactory/main/release/1.74.0/source/boost_1_74_0.tar.gz && \ - tar xf boost_1_74_0.tar.gz && cd boost_1_74_0 && mv boost /usr/local/include && \ + wget https://archives.boost.io/release/1.87.0/source/boost_1_87_0.tar.bz2 && \ + tar xf boost_1_87_0.tar.bz2 && cd boost_1_87_0 && mv boost /usr/local/include && \ cd / && rm -rf boost_dl -# bring in eigen 3.3.4 header only +# bring in eigen header only, but needs to install cmake files RUN mkdir eigen_dl && cd eigen_dl && \ - wget https://gitlab.com/libeigen/eigen/-/archive/3.3.4/eigen-3.3.4.tar.gz && \ - tar xf eigen-3.3.4.tar.gz && cd eigen-3.3.4 && \ - mv Eigen /usr/local/include && mv unsupported /usr/local/include && \ - mv signature_of_eigen3_matrix_library /usr/local/include && \ + wget https://gitlab.com/libeigen/eigen/-/archive/3.4.1/eigen-3.4.1.tar.bz2 && \ + tar xf eigen-3.4.1.tar.bz2 && cd eigen-3.4.1 && \ + mkdir build && cd build && \ + cmake -DCMAKE_INSTALL_PREFIX:PATH="/usr/local" \ + -DINCLUDE_INSTALL_DIR:PATH="/usr/local/include" \ + .. && \ + cmake --build . && cmake --build . --target install && \ cd / && rm -rf eigen_dl -# bring in viennacl 1.7.1 header only +# bring in viennacl header only RUN mkdir viennacl_dl && cd viennacl_dl && \ wget https://github.com/viennacl/viennacl-dev/archive/release-1.7.1.tar.gz && \ tar xf release-1.7.1.tar.gz && cd viennacl-dev-release-1.7.1 && mv viennacl /usr/local/include && \ cd / && rm -rf viennacl_dl -# build format 5.3.0 +# build format RUN mkdir fmt_build && cd fmt_build && \ wget https://github.com/fmtlib/fmt/archive/5.3.0.tar.gz && \ tar xf 5.3.0.tar.gz && cd fmt-5.3.0 && \ @@ -69,11 +57,12 @@ RUN mkdir fmt_build && cd fmt_build && \ -DCMAKE_CXX_STANDARD:STRING="11" -DFMT_USE_CPP11:BOOL=ON \ -DFMT_TEST:BOOL=OFF -DFMT_INSTALL:BOOL=ON \ -DFMT_DOC:BOOL=OFF \ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ .. && \ cmake --build . && cmake --build . --target install && \ cd / && rm -rf fmt_build -# build nlopt 2.5.0 +# build nlopt RUN mkdir nlopt_build && cd nlopt_build && \ wget https://github.com/stevengj/nlopt/archive/v2.5.0.tar.gz && \ tar xf v2.5.0.tar.gz && cd nlopt-2.5.0 && \ @@ -84,55 +73,60 @@ RUN mkdir nlopt_build && cd nlopt_build && \ -DNLOPT_OCTAVE:BOOL=OFF -DNLOPT_MATLAB:BOOL=OFF \ -DNLOPT_GUILE:BOOL=OFF -DNLOPT_SWIG:BOOL=OFF \ -DNLOPT_LINK_PYTHON:BOOL=OFF \ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ .. && \ cmake --build . && cmake --build . --target install && \ cd / && rm -rf nlopt_build -# build ITK 5.2.1 +# build ITK RUN mkdir itk_build && cd itk_build && \ - wget https://github.com/InsightSoftwareConsortium/ITK/releases/download/v5.2.1/InsightToolkit-5.2.1.zip && \ + wget https://github.com/InsightSoftwareConsortium/ITK/releases/download/v5.2.1/InsightToolkit-5.2.1.tar.gz && \ tar xf InsightToolkit-5.2.1.tar.gz && cd InsightToolkit-5.2.1 && \ mkdir build && cd build && \ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS:BOOL=ON \ -DCMAKE_CXX_STANDARD:STRING="11" \ + -DCMAKE_CXX_FLAGS:STRING="-include cstdint" \ + -DCMAKE_C_FLAGS:STRING="-std=gnu17" \ -DBUILD_TESTING:BOOL=OFF -DBUILD_EXAMPLES:BOOL=OFF \ -DITK_USE_GPU:BOOL=OFF -DModule_ITKReview:BOOL=ON \ -DModule_LabelErodeDilate:BOOL=ON \ + -DITK_USE_SYSTEM_EIGEN=ON \ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ .. && \ cmake --build . && cmake --build . --target install && \ cd / && rm -rf itk_build -# build OpenCV 3.4.12 +# build OpenCV RUN mkdir opencv_build && cd opencv_build && \ - wget https://github.com/opencv/opencv/archive/3.4.12.tar.gz && \ - tar xf 3.4.12.tar.gz && cd opencv-3.4.12 && \ + wget https://github.com/opencv/opencv/archive/refs/tags/4.12.0.tar.gz && \ + tar xf 4.12.0.tar.gz && cd opencv-4.12.0 && \ mkdir build && cd build && \ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS:BOOL=ON \ -DCMAKE_CXX_STANDARD:STRING="11" \ -DBUILD_TESTS:BOOL=OFF -DBUILD_EXAMPLES:BOOL=OFF \ -DBUILD_DOCS:BOOL=OFF -DBUILD_WITH_DEBUG_INFO:BOOL=OFF \ - -DWITH_TBB:BOOL=ON -DBUILD_TBB:BOOL=OFF -DTBB_INCLUDE_DIRS:PATH="/opt/tbb/include" \ + -DWITH_TBB:BOOL=ON -DBUILD_TBB:BOOL=OFF \ -DWITH_IPP:BOOL=OFF -DWITH_VTK:BOOL=OFF \ -DWITH_CUBLAS:BOOL=OFF -DWITH_CUDA:BOOL=OFF \ - -DWITH_CUFFT:BOOL=OFF -DWITH_OPENCL:BOOL=OFF \ - -DBUILD_opencv_python2:BOOL=OFF -DBUILD_opencv_python3:BOOL=OFF \ + -DWITH_OPENCL:BOOL=OFF \ + -DBUILD_opencv_java_bindings_generator:BOOL=OFF \ + -DBUILD_opencv_python_tests:BOOL=OFF \ + -DBUILD_opencv_python_bindings_generator:BOOL=OFF \ -DBUILD_opencv_highgui:BOOL=OFF -DWITH_GSTREAMER:BOOL=OFF \ .. && \ cmake --build . && cmake --build . --target install && \ cd / && rm -rf opencv_build - -# build VTK 8.2.0 + +# build VTK, note --parallel 2 is used in order to avoid OOM errors RUN mkdir vtk_build && cd vtk_build && \ - wget https://www.vtk.org/files/release/8.2/VTK-8.2.0.tar.gz && \ - tar xf VTK-8.2.0.tar.gz && cd VTK-8.2.0 && \ + wget https://vtk.org/files/release/9.6/VTK-9.6.2.tar.gz && \ + tar xf VTK-9.6.2.tar.gz && cd VTK-9.6.2 && \ mkdir build && cd build && \ - TBB_ROOT="/opt/tbb" \ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS:BOOL=ON \ -DCMAKE_CXX_STANDARD:STRING="11" \ - -DVTK_Group_Imaging:BOOL=ON -DVTK_Group_Views:BOOL=ON \ + -DVTK_GROUP_ENABLE_Imaging=YES -DVTK_GROUP_ENABLE_Views=YES \ -DBUILD_TESTING:BOOL=OFF \ -DVTK_SMP_IMPLEMENTATION_TYPE:STRING="TBB" \ .. && \ - cmake --build . && cmake --build . --target install && \ + cmake --build . --parallel 2 && cmake --build . --target install && \ cd / && rm -rf vtk_build - diff --git a/docker/Dockerfile.xreg-dist-bin b/docker/Dockerfile.xreg-dist-bin index dd8ebda..db02a85 100644 --- a/docker/Dockerfile.xreg-dist-bin +++ b/docker/Dockerfile.xreg-dist-bin @@ -6,7 +6,7 @@ ARG os_name=ubuntu # for ubuntu choose 16.04, 18.04, or 20.04 # for centos choose 7 or 8 -ARG os_version=16.04 +ARG os_version=26.04 FROM xreg-${os_name}-${os_version} @@ -28,7 +28,7 @@ RUN ./xreg_dist_pkgs ENV XREG_NAME=${xreg_dist_str}-${os_name}-${os_version} RUN mkdir ${XREG_NAME} && \ - LD_LIBRARY_PATH="/usr/local/lib:/usr/local/lib64:/opt/tbb/lib/intel64/gcc4.7:$LD_LIBRARY_PATH" \ + LD_LIBRARY_PATH="/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH" \ python3 make_linux_dist.py /usr/local ${XREG_NAME} COPY ./dist/dist_readme/README.txt ${XREG_NAME} diff --git a/example_build_script b/example_build_script index eab9b2a..6b320d3 100755 --- a/example_build_script +++ b/example_build_script @@ -7,6 +7,9 @@ # stop after the first failed command set -e +# Catch errors and print helpful details before exiting +trap 'echo "Error: Command \"$BASH_COMMAND\" failed on line $LINENO with exit code $?" >&2' ERR + NEED_TO_DOWNLOAD=true NEED_TO_BUILD_THIRD_PARTY=true NEED_TO_START_XREG=true @@ -62,7 +65,7 @@ if [ "$NEED_TO_DOWNLOAD" = true ]; then rm $TBB_FILE - BOOST_URL="https://boostorg.jfrog.io/artifactory/main/release/1.74.0/source/boost_1_74_0.zip" + BOOST_URL="https://archives.boost.io/release/1.87.0/source/boost_1_87_0.zip" BOOST_FILE=`basename $BOOST_URL` @@ -72,7 +75,7 @@ if [ "$NEED_TO_DOWNLOAD" = true ]; then rm $BOOST_FILE - EIGEN_URL="https://gitlab.com/libeigen/eigen/-/archive/3.3.4/eigen-3.3.4.zip" + EIGEN_URL="https://gitlab.com/libeigen/eigen/-/archive/3.4.1/eigen-3.4.1.zip" EIGEN_FILE=`basename $EIGEN_URL` @@ -112,7 +115,7 @@ if [ "$NEED_TO_DOWNLOAD" = true ]; then rm $NLOPT_FILE - VTK_URL="https://www.vtk.org/files/release/8.2/VTK-8.2.0.zip" + VTK_URL="https://gitlab.kitware.com/vtk/vtk/-/archive/v9.6.2/vtk-v9.6.2.zip" wget $VTK_URL @@ -132,7 +135,7 @@ if [ "$NEED_TO_DOWNLOAD" = true ]; then rm $ITK_FILE - OPENCV_URL="https://github.com/opencv/opencv/archive/3.4.12.zip" + OPENCV_URL="https://github.com/opencv/opencv/archive/refs/tags/4.12.0.zip" OPENCV_FILE=`basename $OPENCV_URL` @@ -141,6 +144,8 @@ if [ "$NEED_TO_DOWNLOAD" = true ]; then unzip -q $OPENCV_FILE rm $OPENCV_FILE + + echo "Finished downloading third party libraries..." fi TBB_INC_DIR="$DEPS_DIR/tbb2018_20170919oss/include" @@ -156,15 +161,26 @@ FMT_DIR="$DEPS_DIR/`ls | grep "fmt-*"`" NLOPT_DIR="$DEPS_DIR/`ls | grep "nlopt-*"`" -VTK_DIR="$DEPS_DIR/`ls | grep "VTK-*"`" +VTK_DIR="$DEPS_DIR/`ls | grep "vtk-*"`" ITK_DIR="$DEPS_DIR/`ls | grep "InsightToolkit-*"`" OPENCV_DIR="$DEPS_DIR/`ls | grep "opencv-*"`" +echo "Finished setting third party downloaded directories..." + if [ "$NEED_TO_BUILD_THIRD_PARTY" = true ] ; then echo "Building third-party libraries..." + echo "Building Eigen..." + cd $EIGEN_DIR + mkdir build + cd build + cmake .. + cd ../../ + + echo "Building fmt..." + cd $FMT_DIR mkdir build cd build @@ -174,11 +190,14 @@ if [ "$NEED_TO_BUILD_THIRD_PARTY" = true ] ; then -DFMT_USE_CPP11:BOOL=ON \ -DFMT_TEST:BOOL=OFF \ -DFMT_INSTALL:BOOL=ON \ - -DFMT_DOC:BOOL=OFF + -DFMT_DOC:BOOL=OFF \ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 ninja cd ../../ -cd $NLOPT_DIR + echo "Building nlopt..." + + cd $NLOPT_DIR mkdir build cd build cmake -G Ninja .. \ @@ -191,37 +210,45 @@ cd $NLOPT_DIR -DNLOPT_MATLAB:BOOL=OFF \ -DNLOPT_GUILE:BOOL=OFF \ -DNLOPT_SWIG:BOOL=OFF \ - -DNLOPT_LINK_PYTHON:BOOL=OFF + -DNLOPT_LINK_PYTHON:BOOL=OFF \ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 ninja cd ../../ + echo "building VTK..." + cd $VTK_DIR mkdir build cd build VTK_NO_RENDER_FLAGS="" if [ "$DO_GUI" = false ]; then - VTK_NO_RENDER_FLAGS="-DVTK_RENDERING_BACKEND=None -DVTK_Group_Rendering:BOOL=OFF" + VTK_NO_RENDER_FLAGS="-DVTK_GROUP_ENABLE_Rendering=NO" fi TBB_ROOT="$TBB_INC_DIR/.." cmake -G Ninja .. \ -DCMAKE_CXX_STANDARD:STRING="11" \ -DCMAKE_BUILD_TYPE:STRING=$BUILD_CONFIG \ -DBUILD_SHARED_LIBS:BOOL=OFF \ - -DVTK_Group_Imaging:BOOL=ON \ - -DVTK_Group_Views:BOOL=ON \ + -DONLY_SHARED_LIBS:BOOL=OFF \ + -DVTK_GROUP_ENABLE_Imaging=YES \ + -DVTK_GROUP_ENABLE_Views=YES \ -DBUILD_TESTING:BOOL=OFF \ - -DVTK_SMP_IMPLEMENTATION_TYPE:STRING="TBB" $VTK_NO_RENDER_FLAGS + -DONLY_SHARED_LIBS:BOOL=OFF $VTK_NO_RENDER_FLAGS ninja cd ../.. + echo "building ITK..." + cd $ITK_DIR mkdir build cd build cmake -G Ninja .. \ + -DCMAKE_CXX_FLAGS:STRING="-include cstdint" \ + -DCMAKE_C_FLAGS:STRING="-std=gnu17" \ -DCMAKE_CXX_STANDARD:STRING="11" \ -DCMAKE_BUILD_TYPE:STRING=$BUILD_CONFIG \ -DBUILD_SHARED_LIBS:BOOL=OFF \ @@ -229,12 +256,17 @@ cd $NLOPT_DIR -DBUILD_EXAMPLES:BOOL=OFF \ -DITK_USE_GPU:BOOL=OFF \ -DModule_ITKReview:BOOL=ON \ - -DModule_LabelErodeDilate:BOOL=ON + -DEigen3_DIR:PATH=$EIGEN_DIR/build \ + -DITK_USE_SYSTEM_EIGEN:BOOL=ON \ + -DModule_LabelErodeDilate:BOOL=ON \ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 ninja cd ../.. + echo "building OpenCV..." + cd $OPENCV_DIR mkdir build cd build @@ -262,11 +294,13 @@ cd $NLOPT_DIR -DWITH_VTK:BOOL=OFF \ -DWITH_CUBLAS:BOOL=OFF \ -DWITH_CUDA:BOOL=OFF \ - -DWITH_CUFFT:BOOL=OFF \ -DWITH_OPENCL:BOOL=OFF \ -DWITH_EIGEN:BOOL=OFF \ - -DBUILD_opencv_python2:BOOL=OFF \ - -DBUILD_opencv_python3:BOOL=OFF $OPENCV_GUI_FLAGS + -DWITH_TIFF:BOOL=OFF \ + -DBUILD_TIFF:BOOL=OFF \ + -DBUILD_opencv_java_bindings_generator:BOOL=OFF \ + -DBUILD_opencv_python_tests:BOOL=OFF \ + -DBUILD_opencv_python_bindings_generator:BOOL=OFF $OPENCV_GUI_FLAGS ninja @@ -287,8 +321,10 @@ if [ "$NEED_TO_START_XREG" = true ]; then -DViennaCL_DIR:PATH="$VIENNACL_DIR" \ -DEIGEN3_INCLUDE_DIR:PATH="$EIGEN_DIR" \ -DBoost_INCLUDE_DIR:PATH="$BOOST_DIR" \ - -DNLopt_DIR:BOOL="$NLOPT_DIR/build" \ + -DNLopt_DIR:PATH="$NLOPT_DIR/build" \ + -DXREG_USE_LEGACY_FIND_TBB:BOOL=OFF \ -DTBB_DIR:PATH="$TBB_DIR" \ + -DTBB_INCLUDE_DIRS:PATH=$TBB_INC_DIR \ -Dfmt_DIR:PATH="$FMT_DIR/build" \ -DVTK_DIR:PATH="$VTK_DIR/build" \ -DITK_DIR:PATH="$ITK_DIR/build" \ diff --git a/example_build_script_2 b/example_build_script_2 index aa38c22..303d98d 100755 --- a/example_build_script_2 +++ b/example_build_script_2 @@ -10,6 +10,9 @@ # stop after the first failed command set -e +# Catch errors and print helpful details before exiting +trap 'echo "Error: Command \"$BASH_COMMAND\" failed on line $LINENO with exit code $?" >&2' ERR + # Disable these to skip downloading and building dependencies : ${NEED_TO_DOWNLOAD_THIRD_PARTY:=true} : ${NEED_TO_BUILD_THIRD_PARTY:=true} @@ -104,7 +107,7 @@ if [ "$NEED_TO_DOWNLOAD_THIRD_PARTY" = true ]; then rm $TBB_FILE - BOOST_URL="https://boostorg.jfrog.io/artifactory/main/release/1.74.0/source/boost_1_74_0.zip" + BOOST_URL="https://archives.boost.io/release/1.87.0/source/boost_1_87_0.zip" BOOST_FILE=`basename $BOOST_URL` @@ -114,7 +117,7 @@ if [ "$NEED_TO_DOWNLOAD_THIRD_PARTY" = true ]; then rm $BOOST_FILE - EIGEN_URL="https://gitlab.com/libeigen/eigen/-/archive/3.3.4/eigen-3.3.4.zip" + EIGEN_URL="https://gitlab.com/libeigen/eigen/-/archive/3.4.1/eigen-3.4.1.zip" EIGEN_FILE=`basename $EIGEN_URL` @@ -154,7 +157,7 @@ if [ "$NEED_TO_DOWNLOAD_THIRD_PARTY" = true ]; then rm $NLOPT_FILE - VTK_URL="https://www.vtk.org/files/release/8.2/VTK-8.2.0.zip" + VTK_URL="https://gitlab.kitware.com/vtk/vtk/-/archive/v9.6.2/vtk-v9.6.2.zip" wget $VTK_URL @@ -174,7 +177,7 @@ if [ "$NEED_TO_DOWNLOAD_THIRD_PARTY" = true ]; then rm $ITK_FILE - OPENCV_URL="https://github.com/opencv/opencv/archive/3.4.12.zip" + OPENCV_URL="https://github.com/opencv/opencv/archive/refs/tags/4.12.0.zip" OPENCV_FILE=`basename $OPENCV_URL` @@ -183,8 +186,12 @@ if [ "$NEED_TO_DOWNLOAD_THIRD_PARTY" = true ]; then unzip -q $OPENCV_FILE rm $OPENCV_FILE + + echo "Finished downloading third party libraries..." fi +echo "Setting third party downloaded directories..." + TBB_EXTRACT_DIR="$DEPS_DIR/tbb2018_20170919oss" TBB_INSTALL_DIR="$DEPS_INSTALL_DIR/tbb" TBB_INC_DIR="$TBB_INSTALL_DIR/include" @@ -200,12 +207,14 @@ FMT_DIR="$DEPS_DIR/`ls | grep "fmt-*"`" NLOPT_DIR="$DEPS_DIR/`ls | grep "nlopt-*"`" -VTK_DIR="$DEPS_DIR/`ls | grep "VTK-*"`" +VTK_DIR="$DEPS_DIR/`ls | grep "vtk-*"`" ITK_DIR="$DEPS_DIR/`ls | grep "InsightToolkit-*"`" OPENCV_DIR="$DEPS_DIR/`ls | grep "opencv-*"`" +echo "Finished setting third party downloaded directories..." + if [ "$NEED_TO_BUILD_THIRD_PARTY" = true ] ; then echo "Copying TBB to install prefix..." @@ -215,15 +224,24 @@ if [ "$NEED_TO_BUILD_THIRD_PARTY" = true ] ; then mkdir -p $DEPS_INSTALL_DIR/include mv $BOOST_DIR/boost $DEPS_INSTALL_DIR/include - - mv $EIGEN_DIR/Eigen $DEPS_INSTALL_DIR/include - mv $EIGEN_DIR/unsupported $DEPS_INSTALL_DIR/include - mv $EIGEN_DIR/signature_of_eigen3_matrix_library $DEPS_INSTALL_DIR/include mv $VIENNACL_DIR/viennacl $DEPS_INSTALL_DIR/include echo "Building third-party libraries..." + echo "Building Eigen..." + cd $EIGEN_DIR + mkdir build + cd build + cmake -G Ninja .. \ + -DCMAKE_INSTALL_PREFIX:PATH=$DEPS_INSTALL_DIR \ + -DINCLUDE_INSTALL_DIR:PATH="$DEPS_INSTALL_DIR/include" + cmake --build . + cmake --install . + cd ../../ + + echo "Building fmt..." + cd $FMT_DIR mkdir build cd build @@ -235,11 +253,14 @@ if [ "$NEED_TO_BUILD_THIRD_PARTY" = true ] ; then -DFMT_USE_CPP11:BOOL=ON \ -DFMT_TEST:BOOL=OFF \ -DFMT_INSTALL:BOOL=ON \ - -DFMT_DOC:BOOL=OFF + -DFMT_DOC:BOOL=OFF \ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 cmake --build . cmake --install . cd ../../ + echo "Building nlopt..." + cd $NLOPT_DIR mkdir build cd build @@ -255,7 +276,8 @@ if [ "$NEED_TO_BUILD_THIRD_PARTY" = true ] ; then -DNLOPT_MATLAB:BOOL=OFF \ -DNLOPT_GUILE:BOOL=OFF \ -DNLOPT_SWIG:BOOL=OFF \ - -DNLOPT_LINK_PYTHON:BOOL=OFF + -DNLOPT_LINK_PYTHON:BOOL=OFF \ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 # nlopt tries to override the install prefix originally passsed cmake -UCMAKE_INSTALL_PREFIX -DCMAKE_INSTALL_PREFIX:PATH=$DEPS_INSTALL_DIR . @@ -265,13 +287,15 @@ if [ "$NEED_TO_BUILD_THIRD_PARTY" = true ] ; then cd ../../ + echo "building VTK..." + cd $VTK_DIR mkdir build cd build VTK_NO_RENDER_FLAGS="" if [ "$XREG_DO_GUI" = false ]; then - VTK_NO_RENDER_FLAGS="-DVTK_RENDERING_BACKEND=None -DVTK_Group_Rendering:BOOL=OFF" + VTK_NO_RENDER_FLAGS="-DVTK_GROUP_ENABLE_Rendering=NO" fi TBB_ROOT="$TBB_INC_DIR/.." cmake -G Ninja .. \ @@ -279,22 +303,26 @@ if [ "$NEED_TO_BUILD_THIRD_PARTY" = true ] ; then -DBUILD_SHARED_LIBS:BOOL=$BUILD_SHARED \ -DCMAKE_CXX_STANDARD:STRING="11" \ -DCMAKE_BUILD_TYPE:STRING=$BUILD_CONFIG \ - -DVTK_Group_Imaging:BOOL=ON \ - -DVTK_Group_Views:BOOL=ON \ + -DVTK_GROUP_ENABLE_Imaging=YES \ + -DVTK_GROUP_ENABLE_Views=YES \ -DBUILD_TESTING:BOOL=OFF \ - -DVTK_SMP_IMPLEMENTATION_TYPE:STRING="TBB" $VTK_NO_RENDER_FLAGS + -DONLY_SHARED_LIBS:BOOL=$BUILD_SHARED $VTK_NO_RENDER_FLAGS cmake --build . cmake --install . cd ../.. + echo "building ITK..." + cd $ITK_DIR mkdir build cd build cmake -G Ninja .. \ -DCMAKE_INSTALL_PREFIX:PATH=$DEPS_INSTALL_DIR \ + -DCMAKE_CXX_FLAGS:STRING="-include cstdint" \ + -DCMAKE_C_FLAGS:STRING="-std=gnu17" \ -DBUILD_SHARED_LIBS:BOOL=$BUILD_SHARED \ -DCMAKE_CXX_STANDARD:STRING="11" \ -DCMAKE_BUILD_TYPE:STRING=$BUILD_CONFIG \ @@ -302,13 +330,17 @@ if [ "$NEED_TO_BUILD_THIRD_PARTY" = true ] ; then -DBUILD_EXAMPLES:BOOL=OFF \ -DITK_USE_GPU:BOOL=OFF \ -DModule_ITKReview:BOOL=ON \ - -DModule_LabelErodeDilate:BOOL=ON + -DModule_LabelErodeDilate:BOOL=ON \ + -DITK_USE_SYSTEM_EIGEN=ON \ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 cmake --build . cmake --install . cd ../.. + echo "building OpenCV..." + cd $OPENCV_DIR mkdir build cd build @@ -334,11 +366,13 @@ if [ "$NEED_TO_BUILD_THIRD_PARTY" = true ] ; then -DWITH_VTK:BOOL=OFF \ -DWITH_CUBLAS:BOOL=OFF \ -DWITH_CUDA:BOOL=OFF \ - -DWITH_CUFFT:BOOL=OFF \ -DWITH_OPENCL:BOOL=OFF \ -DWITH_EIGEN:BOOL=OFF \ - -DBUILD_opencv_python2:BOOL=OFF \ - -DBUILD_opencv_python3:BOOL=OFF $OPENCV_GUI_FLAGS + -DWITH_TIFF:BOOL=OFF \ + -DBUILD_TIFF:BOOL=OFF \ + -DBUILD_opencv_java_bindings_generator:BOOL=OFF \ + -DBUILD_opencv_python_tests:BOOL=OFF \ + -DBUILD_opencv_python_bindings_generator:BOOL=OFF $OPENCV_GUI_FLAGS cmake --build . cmake --install . @@ -350,6 +384,7 @@ fi # START: XREG BUILD: if [ "$NEED_TO_BUILD_XREG" = true ]; then + echo "Building XREG..." mkdir $XREG_BUILD_DIR cd $XREG_BUILD_DIR @@ -376,6 +411,29 @@ if [ "$NEED_TO_BUILD_XREG" = true ]; then if [ "$XREG_INSTALL_DIR" != "" ]; then cmake --install . + + # xreg's install target does not copy TBB, since it is found via + # find_package(TBB) as an external/imported target rather than a + # target built by this project. Copy the runtime library over manually + # so that it is discoverable at ${XREG_INSTALL_DIR}/lib. + echo "Copying TBB runtime library to install prefix..." + + if [ "$BUILD_CONFIG" == "Debug" ]; then + TBB_LIB_NAME_PATTERN="libtbb_debug.*" + else + TBB_LIB_NAME_PATTERN="libtbb.*" + fi + + # On Linux the package ships both lib/intel64/ and lib/ia32/ variants + # with identical filenames, so restrict the search to intel64 to avoid + # copying whichever architecture "find" happens to visit last. macOS + # has no such split and keeps the libraries directly under lib/. + TBB_LIB_SEARCH_DIR="$TBB_INSTALL_DIR/lib" + if [ -d "$TBB_INSTALL_DIR/lib/intel64" ]; then + TBB_LIB_SEARCH_DIR="$TBB_INSTALL_DIR/lib/intel64" + fi + + find "$TBB_LIB_SEARCH_DIR" -name "$TBB_LIB_NAME_PATTERN" -exec cp -a {} "$XREG_INSTALL_DIR/lib/" \; fi fi diff --git a/example_build_script_win.cmd b/example_build_script_win.cmd index cb849d5..63f40cc 100644 --- a/example_build_script_win.cmd +++ b/example_build_script_win.cmd @@ -127,10 +127,10 @@ ECHO Extracting TBB tar -xf tbb-2020.3-win.zip || EXIT /b ECHO Downloading boost -curl -L -O -J https://boostorg.jfrog.io/artifactory/main/release/1.74.0/source/boost_1_74_0.zip || EXIT /b +curl -L -O -J https://archives.boost.io/release/1.87.0/source/boost_1_87_0.zip || EXIT /b ECHO Extracting boost -tar -xf boost_1_74_0.zip || EXIT /b +tar -xf boost_1_87_0.zip || EXIT /b ECHO Downloading Eigen curl -L -O -J https://gitlab.com/libeigen/eigen/-/archive/3.3.4/eigen-3.3.4.zip || EXIT /b @@ -164,10 +164,10 @@ ECHO Extracting nlopt tar -xf nlopt-2.5.0.zip ECHO Downloading VTK -curl -L -O -J https://www.vtk.org/files/release/8.2/VTK-8.2.0.zip || EXIT /b +curl -L -O -J https://gitlab.kitware.com/vtk/vtk/-/archive/v9.6.2/vtk-v9.6.2.zip || EXIT /b ECHO Extracting VTK -tar -xf VTK-8.2.0.zip || EXIT /b +tar -xf vtk-v9.6.2.zip || EXIT /b ECHO Downloading ITK curl -L -O -J https://github.com/InsightSoftwareConsortium/ITK/releases/download/v5.2.1/InsightToolkit-5.2.1.zip || EXIT /b @@ -195,7 +195,7 @@ ECHO Installing TBB (2/2) COPY %INSTALL_ROOT%\tbb\bin\intel64\vc14\tbb.dll %INSTALL_ROOT%\bin || EXIT /b ECHO Installing boost -MOVE boost_1_74_0\boost %INSTALL_ROOT%\include\boost || EXIT /b +MOVE boost_1_87_0\boost %INSTALL_ROOT%\include\boost || EXIT /b ECHO Installing Eigen MOVE eigen-3.3.4\Eigen %INSTALL_ROOT%\include\Eigen || EXIT /b @@ -300,7 +300,7 @@ cmake --install . || EXIT /b cd ..\.. || EXIT /b ECHO Building VTK, setting up... -cd VTK-8.2.0 || EXIT /b +cd vtk-v9.6.2 || EXIT /b mkdir build || EXIT /b @@ -312,8 +312,9 @@ cmake %CMAKE_GENERATOR_ARG% .. ^ -DCMAKE_CXX_STANDARD:STRING="11" ^ -DCMAKE_BUILD_TYPE:STRING=%BUILD_CONFIG% ^ -DBUILD_SHARED_LIBS:BOOL=%BUILD_SHARED% ^ - -DVTK_Group_Imaging:BOOL=ON ^ - -DVTK_Group_Views:BOOL=ON ^ + -DONLY_SHARED_LIBS:BOOL=%BUILD_SHARED% ^ + -DVTK_GROUP_ENABLE_Imaging=YES ^ + -DVTK_GROUP_ENABLE_Views=YES ^ -DBUILD_TESTING:BOOL=OFF || EXIT /b ECHO VTK building diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 90993bb..bf35a4d 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -84,6 +84,8 @@ foreach (XREG_CUR_LIB_DIR ${XREG_LIB_SUB_DIRS}) list(APPEND XREG_LIB_OBJS $) endforeach() +vtk_module_autoinit(TARGETS xreg_vtk MODULES ${VTK_LIBRARIES}) + # combine the subcomponents into a single library add_library(xreg ${XREG_LIB_OBJS}) diff --git a/lib/common/xregProgOptUtils.cpp b/lib/common/xregProgOptUtils.cpp index b1cd094..1e3474b 100644 --- a/lib/common/xregProgOptUtils.cpp +++ b/lib/common/xregProgOptUtils.cpp @@ -1,7 +1,7 @@ /* * MIT License * - * Copyright (c) 2020 Robert Grupp + * Copyright (c) 2020-2026 Robert Grupp * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -43,8 +43,7 @@ #include #include -#include -#include +#include #include @@ -238,6 +237,29 @@ void WritePrettyHelp(const xreg::ProgOpts::StringList& flag_strs, const std::string kTBB_MAX_NUM_THREADS_ARG_STR = "tbb-max-threads"; +#if TBB_INTERFACE_VERSION >= 12000 +#define XREG_TBB_USE_GLOBAL_CONTROL 1 +//# include +using TBBThreadLimiter = tbb::global_control; +#else +#define XREG_TBB_USE_GLOBAL_CONTROL 0 +//# include +using TBBThreadLimiter = tbb::task_scheduler_init; +#endif + +/// \brief Creates a thread limiter for the requested maximum thread count. +std::unique_ptr MakeTBBThreadLimiter(const unsigned long max_num_threads) +{ +#if XREG_TBB_USE_GLOBAL_CONTROL + return std::unique_ptr( + new TBBThreadLimiter(tbb::global_control::max_allowed_parallelism, + static_cast(max_num_threads))); +#else + return std::unique_ptr( + new TBBThreadLimiter(static_cast(max_num_threads))); +#endif +} + /// \brief Global for storing TBB thread information. /// /// By default, this is a null instance, so TBB defaults are used. @@ -245,9 +267,9 @@ const std::string kTBB_MAX_NUM_THREADS_ARG_STR = "tbb-max-threads"; /// created here. This is outside of the program options class, so that /// a user option will still have precedence even when the program /// options are destructed. -std::unique_ptr& ProgOptsTBBTaskSchedInit() +std::unique_ptr& ProgOptsTBBTaskSchedInit() { - static std::unique_ptr tbb_sched_init; + static std::unique_ptr tbb_sched_init; return tbb_sched_init; } @@ -1347,8 +1369,7 @@ void xreg::ProgOpts::parse(int argc, char* argv[]) if (tbb_max_num_threads_opt_added_ && has(kTBB_MAX_NUM_THREADS_ARG_STR)) { - ProgOptsTBBTaskSchedInit().reset( - new tbb::task_scheduler_init(get(kTBB_MAX_NUM_THREADS_ARG_STR).as_uint32())); + ProgOptsTBBTaskSchedInit() = std::move(MakeTBBThreadLimiter(get(kTBB_MAX_NUM_THREADS_ARG_STR).as_uint32())); } if (print_help_backend_str_ && has("backend")) diff --git a/tests/wiki_cmds.py b/tests/wiki_cmds.py index 84ce153..783affb 100644 --- a/tests/wiki_cmds.py +++ b/tests/wiki_cmds.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2020-2022 Robert Grupp +# Copyright (c) 2020-2026 Robert Grupp # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -27,10 +27,12 @@ # the script must be run in an environment with a sufficient display. Some X11 # forwarding configurations may NOT work. +import json import sys import os.path import os import platform +import urllib.parse import urllib.request import shutil import time @@ -38,6 +40,45 @@ import subprocess as sp +def download_tcia_image(series_uid, dst_file_name, use_existing=False): + if use_existing and os.path.exists(dst_file_name): + print(' Using already downloaded file: {}'.format(dst_file_name)) + return + + # get a token for public datasets + + # first build up the token request + token_url = "https://services.cancerimagingarchive.net/nbia-api/oauth/token" + payload = { + "username": "nbia_guest", + "password": "", + "client_id": "NBIA", + "grant_type": "password" + } + + token_req_data = urllib.parse.urlencode(payload).encode("utf-8") + + token_req = urllib.request.Request(token_url, data=token_req_data, method="POST") + + with urllib.request.urlopen(token_req) as response: + response_data = json.loads(response.read().decode("utf-8")) + access_token = response_data["access_token"] + + print(f"Token acquired: {access_token[:15]}...") + + image_url = f"https://services.cancerimagingarchive.net/nbia-api/services/v2/getImage?SeriesInstanceUID={series_uid}" + + # Attach the Bearer token header + headers = {"Authorization": f"Bearer {access_token}"} + image_req = urllib.request.Request(image_url, headers=headers) + + # Stream the file to disk to handle large ZIP files smoothly + print("Downloading series...") + + with urllib.request.urlopen(image_req) as response, open(dst_file_name, "wb") as out_file: + while chunk := response.read(8192): + out_file.write(chunk) + def download_file(url, dst_file_name=None, use_existing=False): print('Downloading: {} ...'.format(url)) @@ -80,6 +121,12 @@ def has_xdg_open(): except: return False +def has_default_video_player_linux(): + try: + return 'No default applications' not in sp.check_output('gio mime video/mp4', shell=True).decode() + except: + return False + def view_image(img_path): if platform.system() == 'Darwin': sp.check_call('open {}'.format(img_path), shell=True) @@ -95,7 +142,7 @@ def view_movie(movie_path): sp.check_call('open {}'.format(movie_path), shell=True) elif platform.system() == 'Windows': sp.check_call(movie_path, shell=True) - elif (platform.system() == 'Linux') and has_xdg_open(): + elif (platform.system() == 'Linux') and has_xdg_open() and has_default_video_player_linux(): sp.check_call('xdg-open {}'.format(movie_path), shell=True) wait_prompt('Inspect {} in a video player'.format(movie_path)) @@ -137,7 +184,8 @@ def macos_check_for_dyld_vars(): ['Slicer 5.0.3', 'Slicer 5.0.2', 'Slicer 4.11.20210226']] \ + ['C:\\Program Files\\Slicer 4.10.2\\Slicer.exe'] linux_slicer_default_paths = ['{}/Slicer'.format(sd) for sd in \ - ['$HOME/Slicer-5.0.3-linux-amd64', + ['$HOME/Slicer-5.12.2-linux-amd64', + '$HOME/Slicer-5.0.3-linux-amd64', '$HOME/Slicer-5.0.2-linux-amd64', '$HOME/Slicer-4.11.20210226-linux-amd64', '$HOME/Slicer-4.10.2-linux-amd64']] @@ -208,7 +256,7 @@ def macos_check_for_dyld_vars(): if True: print('DICOM conversion/resampling...') - download_file('https://services.cancerimagingarchive.net/services/v4/TCIA/query/getImage?SeriesInstanceUID=61.7.167248355135476067044532759811631626828', 'ABD_LYMPH_001.zip', True) + download_tcia_image('61.7.167248355135476067044532759811631626828', 'ABD_LYMPH_001.zip', True) extract_zip('ABD_LYMPH_001.zip', 'ABD_LYMPH_001') @@ -388,7 +436,7 @@ def macos_check_for_dyld_vars(): print('3D DICOM conversion/resampling...') - download_file('https://services.cancerimagingarchive.net/services/v4/TCIA/query/getImage?SeriesInstanceUID=1.3.6.1.4.1.14519.5.2.1.1706.4016.124291161306415775701317569638', 'TCGA-G2-A3VY_ct.zip', True) + download_tcia_image('1.3.6.1.4.1.14519.5.2.1.1706.4016.124291161306415775701317569638', 'TCGA-G2-A3VY_ct.zip', True) extract_zip('TCGA-G2-A3VY_ct.zip', 'TCGA-G2-A3VY_ct_dcm') @@ -405,13 +453,13 @@ def macos_check_for_dyld_vars(): print('2D DICOM conversion...') - download_file('https://services.cancerimagingarchive.net/services/v4/TCIA/query/getImage?SeriesInstanceUID=1.3.6.1.4.1.14519.5.2.1.1706.4016.146872675804132000774592060313', 'TCGA-G2-A3VY_radiographs_1.zip', True) + download_tcia_image('1.3.6.1.4.1.14519.5.2.1.1706.4016.146872675804132000774592060313', 'TCGA-G2-A3VY_radiographs_1.zip', True) extract_zip('TCGA-G2-A3VY_radiographs_1.zip', 'TCGA-G2-A3VY_radiographs') download_file('https://github.com/rg2/xreg/wiki/examples/tcia_hip_radiograph_rigid_2d_3d/2-c73e.fcsv', use_existing=True) - run_cmd('xreg-convert-dicom-radiograph TCGA-G2-A3VY_radiographs/2-c73e4bdf6c7d19772d00acd2891965fa.dcm 2-c73e_pd.h5 2-c73e.fcsv') + run_cmd('xreg-convert-dicom-radiograph TCGA-G2-A3VY_radiographs/00000002.dcm 2-c73e_pd.h5 2-c73e.fcsv') run_cmd('xreg-remap-tile-proj-data -d 0.25 -o 2-c73e_pd.h5 2-c73e_remap.png')