Skip to content

Build DSI Studio

Build DSI Studio #449

name: Build DSI Studio
on:
workflow_dispatch:
inputs:
tag:
description: 'Tag'
required: true
default: '2024.06.12'
release_name:
description: 'Release Name'
required: true
default: '2024 "Hou" Release'
build_windows:
type: boolean
description: 'Build Windows'
required: false
default: 'true'
build_linux:
type: boolean
description: 'Build Linux'
required: false
default: 'true'
build_mac:
type: boolean
description: 'Build Mac'
required: false
default: 'true'
build_docker:
type: boolean
description: 'Build Docker'
required: false
default: 'true'
jobs:
linux-build:
if: ${{ github.event.inputs.build_linux == 'true' }}
strategy:
matrix:
os: [ubuntu2204,ubuntu2004,ubuntu1804,ubuntu1604,centos7]
fail-fast: false
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v4.1.1
- name: Set up QEMU
uses: docker/setup-qemu-action@v3.0.0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3.0.0
- name: Build and push
uses: docker/build-push-action@v5.1.0
with:
context: .
file: build_packages/${{ matrix.os }}/Dockerfile
push: false
outputs: dsi-studio
- name: Packaging
run: |
zip -r dsi_studio_${{ matrix.os }}.zip dsi-studio
- name: Create Release
uses: ncipollo/release-action@v1.13.0
with:
allowUpdates: true
artifacts: "*.zip"
tag: ${{ github.event.inputs.tag }}
name: ${{ github.event.inputs.release_name }}
prerelease: false
macos-build-qt5:
if: ${{ github.event.inputs.build_mac == 'true' }}
strategy:
matrix:
os: [macos-12]
fail-fast: false
runs-on: ${{ matrix.os }}
env:
CFLAGS: -Werror
steps:
- uses: actions/checkout@v4.1.1
- name: Install Qt
uses: jurplel/install-qt-action@v3.3.0
with:
modules: qtcharts
- name: Download TIPL and Atlases
run: |
git clone https://github.com/frankyeh/TIPL.git
git clone https://github.com/frankyeh/DSI-Studio-atlas.git
git clone https://github.com/frankyeh/UNet-Studio-Data.git
rm -fr DSI-Studio-atlas/.git
- name: Build DSI Studio
run: |
mkdir -p build
cd build
export PATH="$Qt5_DIR/bin:$PATH" && export LDFLAGS="-L$Qt5_DIR/lib" && export CPPFLAGS="-I$Qt5_DIR/include" && export PKG_CONFIG_PATH="$Qt5_DIR/lib/pkgconfig"
qmake ../dsi_studio.pro DEFINES+="QMAKE_DEFAULT_INCDIRS=/usr/include QMAKE_DEFAULT_LIBDIRS=/usr/lib"
make
cd ..
- name: Packaging
run: |
mv build/dsi_studio.app .
macdeployqt dsi_studio.app
curl -sSLO "https://github.com/frankyeh/TinyFSL/releases/download/2022.08.03/tiny_fsl_${{ matrix.os }}.zip"
7z e tiny_fsl_${{ matrix.os }}.zip -odsi_studio.app/Contents/MacOS/plugin
rm -fr dsi_studio.app/Contents/MacOS/plugin/tiny_fsl
rm *.zip
mv other/* dsi_studio.app/Contents/MacOS/
mv DSI-Studio-atlas dsi_studio.app/Contents/MacOS/atlas
mv UNet-Studio-Data/network dsi_studio.app/Contents/MacOS/
mv dsi_studio.icns dsi_studio.app/Contents/Resources/
zip -r dsi_studio_${{ matrix.os }}.zip dsi_studio.app
- name: Create Release
uses: ncipollo/release-action@v1.13.0
with:
allowUpdates: true
artifacts: "*.zip"
tag: ${{ github.event.inputs.tag }}
name: ${{ github.event.inputs.release_name }}
prerelease: false
macos-build-qt6:
if: ${{ github.event.inputs.build_mac == 'true' }}
strategy:
matrix:
os: [macos-13,macos-12]
fail-fast: false
runs-on: ${{ matrix.os }}
env:
CFLAGS: -Werror
steps:
- uses: actions/checkout@v4.1.1
- name: brew update
run: |
brew update
brew install cmake
- name: Install Qt
uses: jurplel/install-qt-action@v3.3.0
with:
version: '6.5.2'
modules: qtcharts
- name: Download TIPL and Atlases
run: |
git clone https://github.com/frankyeh/TIPL.git
git clone https://github.com/frankyeh/DSI-Studio-atlas.git
git clone https://github.com/frankyeh/UNet-Studio-Data.git
rm -fr DSI-Studio-atlas/.git
- name: Build DSI Studio
run: |
mkdir -p build
cmake -S . -B build -DCMAKE_BUILD_TYPE:STRING=Release -DTIPL_DIR=.
cmake --build ./build --parallel --config Release
- name: Packaging
run: |
mv build/dsi_studio.app .
macdeployqt dsi_studio.app
curl -sSLO "https://github.com/frankyeh/TinyFSL/releases/download/2022.08.03/tiny_fsl_${{ matrix.os }}.zip"
7z e tiny_fsl_${{ matrix.os }}.zip -odsi_studio.app/Contents/MacOS/plugin
rm -fr dsi_studio.app/Contents/MacOS/plugin/tiny_fsl
rm *.zip
mv other/* dsi_studio.app/Contents/MacOS/
mv DSI-Studio-atlas dsi_studio.app/Contents/MacOS/atlas
mv UNet-Studio-Data/network dsi_studio.app/Contents/MacOS/
mv dsi_studio.icns dsi_studio.app/Contents/Resources/
zip -r dsi_studio_${{ matrix.os }}_qt6.zip dsi_studio.app
- name: Create Release
uses: ncipollo/release-action@v1.13.0
with:
allowUpdates: true
artifacts: "*.zip"
tag: ${{ github.event.inputs.tag }}
name: ${{ github.event.inputs.release_name }}
prerelease: false
windows_build:
if: ${{ github.event.inputs.build_windows == 'true' }}
runs-on: windows-2019
steps:
- uses: actions/checkout@v4.1.1
- name: Install Qt
uses: jurplel/install-qt-action@v3.2.1
with:
version: 6.5.2
modules: addons.qtcharts
- name: Step to run when failed
if: ${{ failure() }}
uses: jurplel/install-qt-action@v3.2.1
with:
version: 6.5.2
modules: addons.qtcharts
- name: Install Ninja and CMake
run: |
choco install ninja cmake
- name: Install Zlib
run: |
./build_packages/install_zlib.bat
del "C:/Program Files/zlib/lib/zlib.lib"
del "C:/Program Files/zlib/bin/zlib.dll"
- name: get TIPL and DSI Studio atlas
run: |
git clone https://github.com/frankyeh/TIPL.git
git clone https://github.com/frankyeh/DSI-Studio-atlas.git
git clone https://github.com/frankyeh/UNet-Studio-Data.git
- name: Build DSI Studio CPU
run: |
for /f "usebackq delims=#" %%a in (`"%programfiles(x86)%\Microsoft Visual Studio\Installer\vswhere" -latest -property installationPath`) do call "%%a\Common7\Tools\VsDevCmd.bat" -arch=x64
mkdir -p build_cpu
cmake -S . -B build_cpu -GNinja "-DZLIB_LIBRARY=C:/Program Files/zlib/lib/zlibstatic.lib" "-DCMAKE_BUILD_TYPE:STRING=Release" "-DCMAKE_C_COMPILER:STRING=cl" "-DCMAKE_CXX_COMPILER:STRING=cl" -DTIPL_DIR=.
cmake --build ./build_cpu --parallel --config Release
shell: cmd
- name: Install Cuda
uses: Jimver/cuda-toolkit@v0.2.11
- name: Build DSI Studio
run: |
for /f "usebackq delims=#" %%a in (`"%programfiles(x86)%\Microsoft Visual Studio\Installer\vswhere" -latest -property installationPath`) do call "%%a\Common7\Tools\VsDevCmd.bat" -arch=x64
mkdir -p build
cmake -S . -B build -GNinja "-DZLIB_LIBRARY=C:/Program Files/zlib/lib/zlibstatic.lib" "-DCMAKE_BUILD_TYPE:STRING=Release" "-DCMAKE_C_COMPILER:STRING=cl" "-DCMAKE_CXX_COMPILER:STRING=cl" -DTIPL_DIR=.
cmake --build ./build --parallel --config Release
shell: cmd
- name: Packaging
run: |
mkdir dsi_studio_win
move other\color_map dsi_studio_win
move other\* dsi_studio_win
move build\dsi_studio.exe dsi_studio_win
windeployqt --no-translations --no-system-d3d-compiler --compiler-runtime --no-opengl-sw dsi_studio_win\dsi_studio.exe
move DSI-Studio-atlas dsi_studio_win\atlas
rm dsi_studio_win\atlas\.git -r -force
move UNet-Studio-Data\network dsi_studio_win\
curl -sSLO "https://github.com/frankyeh/TinyFSL/releases/download/2022.08.03/tiny_fsl_win.zip"
7z e tiny_fsl_win.zip -odsi_studio_win\plugin
rm dsi_studio_win\plugin\cublas*
rd dsi_studio_win\plugin\tiny_fsl
del *.zip
- name: Zip Release
uses: TheDoctor0/zip-release@0.7.6
with:
filename: dsi_studio_win.zip
exclusions: .git
path: dsi_studio_win
- name: Packaging
run: |
rename dsi_studio_win dsi_studio_win_cpu
move build_cpu\dsi_studio.exe dsi_studio_win_cpu
windeployqt --no-translations --no-system-d3d-compiler --compiler-runtime --no-opengl-sw dsi_studio_win_cpu\dsi_studio.exe
shell: cmd
- name: Zip Release
uses: TheDoctor0/zip-release@0.7.6
with:
filename: dsi_studio_win_cpu.zip
exclusions: .git
path: dsi_studio_win_cpu
- name: Create Release
uses: ncipollo/release-action@v1.13.0
with:
allowUpdates: true
artifacts: "*.zip"
tag: ${{ github.event.inputs.tag }}
name: ${{ github.event.inputs.release_name }}
prerelease: false
docker_build:
if: ${{ github.event.inputs.build_docker == 'true' }}
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v4.1.1
- name: Set up QEMU
uses: docker/setup-qemu-action@v3.0.0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3.0.0
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Login to the Container registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Current Time
run: echo "DATE_TAG=$(date "+%Y-%m-%d")" >> $GITHUB_ENV
- name: Build and push
uses: docker/build-push-action@v5.1.0
with:
context: .
file: build_packages/docker/Dockerfile
push: true
tags: |
"dsistudio/dsistudio:chen-${{ env.DATE_TAG }}"
dsistudio/dsistudio:latest
test_animal_recon:
needs: linux-build
runs-on: ubuntu-20.04
steps:
- name: Setup Environment
run: |
curl -sL "https://github.com/frankyeh/DSI-Studio/releases/download/${{ github.event.inputs.tag }}/dsi_studio_ubuntu2004.zip" | jar x
curl -sL https://zenodo.org/record/6321169/files/mountsinai-S-sub-032156_dwi.src.gz?download=1 -o Rhesus.src.gz
chmod 777 ./dsi-studio/dsi_studio
- name: Test DTI Recon
run: |
./dsi-studio/dsi_studio --source=*.src.gz --action=rec --method=1 |& tee -a log.txt
ls Rhesus.src.gz.dti.fib.gz
- name: Test GQI Recon
run: |
./dsi-studio/dsi_studio --source=*.src.gz --action=rec |& tee -a log.txt
ls Rhesus.src.gz.gqi.1.25.fib.gz
- name: Test QSDR Recon
run: |
./dsi-studio/dsi_studio --source=*.src.gz --action=rec --method=7 |& tee -a log.txt
ls Rhesus.src.gz.*
test_human_recon:
needs: linux-build
runs-on: ubuntu-20.04
steps:
- name: Setup Environment
run: |
curl -sL "https://github.com/frankyeh/DSI-Studio/releases/download/${{ github.event.inputs.tag }}/dsi_studio_ubuntu2004.zip" | jar x
curl -sL https://zenodo.org/record/6320992/files/20081006_M025Y_DSI_203.src.gz?download=1 -o DSI.src.gz
curl -sL https://zenodo.org/record/6320992/files/20081006_M025Y_DTI64.src.gz?download=1 -o DTI.src.gz
curl -sL https://zenodo.org/record/6320992/files/20081006_M025Y_HARDI.src.gz?download=1 -o HARDI.src.gz
chmod 777 ./dsi-studio/dsi_studio
- name: Test DTI Recon
run: |
./dsi-studio/dsi_studio --source=*.src.gz --action=rec --method=1
ls DSI.src.gz.dti.fib.gz
ls DTI.src.gz.dti.fib.gz
ls HARDI.src.gz.dti.fib.gz
- name: Test GQI Recon
run: |
./dsi-studio/dsi_studio --source=*.src.gz --action=rec
ls DSI.src.gz.gqi.1.25.fib.gz
ls DTI.src.gz.gqi.1.25.fib.gz
ls HARDI.src.gz.gqi.1.25.fib.gz
- name: Test QSDR Recon
run: |
./dsi-studio/dsi_studio --source=*.src.gz --action=rec --method=7 --template=0
ls DSI.src.gz.icbm152_adult.qsdr.1.25.*
ls DTI.src.gz.icbm152_adult.qsdr.1.25.*
ls HARDI.src.gz.icbm152_adult.qsdr.1.25.*
test_human_tracking_qsdr:
needs: linux-build
runs-on: ubuntu-20.04
steps:
- name: Setup Environment
run: |
curl -sL "https://github.com/frankyeh/DSI-Studio/releases/download/${{ github.event.inputs.tag }}/dsi_studio_ubuntu2004.zip" | jar x
curl -sL https://github.com/frankyeh/DSI-Studio-atlas/blob/main/ICBM152_adult/ICBM152_adult.fib.gz?raw=true -o ICBM152_adult.fib.gz
chmod 777 ./dsi-studio/dsi_studio
- name: Tracking
run: |
./dsi-studio/dsi_studio --source=ICBM152_adult.fib.gz --action=trk --output=icbm152.tt.gz --export=stat,tdi
ls icbm152.tt.gz
ls icbm152.tt.gz.tdi.nii.gz
ls icbm152.tt.gz.stat.txt
echo --------------------------------------------------------------------------------------------------
./dsi-studio/dsi_studio --source=ICBM152_adult.fib.gz --action=trk --track_id=ArcuateFasciculusL --tip_iteration=0 --output=AF_L.tt.gz
ls AF_L.tt.gz
echo --------------------------------------------------------------------------------------------------
./dsi-studio/dsi_studio --source=ICBM152_adult.fib.gz --action=trk --roi=FreeSurferDKT_Cortical:left_precentral,dilate,dilate,smoothing --roi2=FreeSurferDKT_Cortical:right_precentral,dilate,dilate,smoothing --output=LR.tt.gz
ls LR.tt.gz
echo --------------------------------------------------------------------------------------------------
./dsi-studio/dsi_studio --source=ICBM152_adult.fib.gz --action=trk --fiber_count=1000000 --output=no_file --connectivity=FreeSurferDKT_Cortical --connectivity_value=count,qa
ls ICBM152_adult.fib.gz.tt.gz.FreeSurferDKT_Cortical.count.pass.connectivity.mat
ls ICBM152_adult.fib.gz.tt.gz.FreeSurferDKT_Cortical.count.pass.connectogram.txt
ls ICBM152_adult.fib.gz.tt.gz.FreeSurferDKT_Cortical.count.pass.network_measures.txt
ls ICBM152_adult.fib.gz.tt.gz.FreeSurferDKT_Cortical.qa.pass.connectivity.mat
ls ICBM152_adult.fib.gz.tt.gz.FreeSurferDKT_Cortical.qa.pass.connectogram.txt
ls ICBM152_adult.fib.gz.tt.gz.FreeSurferDKT_Cortical.qa.pass.network_measures.txt
test_human_tracking_gqi:
needs: linux-build
runs-on: ubuntu-20.04
steps:
- name: Setup Environment
run: |
curl -sL "https://github.com/frankyeh/DSI-Studio/releases/download/${{ github.event.inputs.tag }}/dsi_studio_ubuntu2004.zip" | jar x
curl -sL https://zenodo.org/record/6307812/files/100206.src.gz.gqi.1.7.fib.gz?download=1 -o 100206.fib.gz
curl -sL https://github.com/frankyeh/DSI-Studio-atlas/blob/main/ICBM152_adult/ICBM152_adult.QA.nii.gz?raw=true -o template_qa.nii.gz
chmod 777 ./dsi-studio/dsi_studio
- name: Tracking
run: |
./dsi-studio/dsi_studio --source=100206.fib.gz --action=trk --output=100206.tt.gz --export=stat,tdi
ls 100206.tt.gz
ls 100206.tt.gz.tdi.nii.gz
ls 100206.tt.gz.stat.txt
echo --------------------------------------------------------------------------------------------------
./dsi-studio/dsi_studio --source=100206.fib.gz --action=trk --track_id=ArcuateFasciculusL --tip_iteration=0 --output=AF_L.tt.gz
ls AF_L.tt.gz
echo --------------------------------------------------------------------------------------------------
./dsi-studio/dsi_studio --source=100206.fib.gz --action=trk --roi=FreeSurferDKT_Cortical:left_precentral,dilate,dilate,smoothing --roi2=FreeSurferDKT_Cortical:right_precentral,dilate,dilate,smoothing --output=LR.tt.gz
ls LR.tt.gz
echo --------------------------------------------------------------------------------------------------
./dsi-studio/dsi_studio --source=100206.fib.gz --action=trk --fiber_count=1000000 --output=no_file --connectivity=FreeSurferDKT_Cortical --connectivity_value=count,qa
ls 100206.fib.gz.tt.gz.FreeSurferDKT_Cortical.count.pass.connectivity.mat
ls 100206.fib.gz.tt.gz.FreeSurferDKT_Cortical.count.pass.connectogram.txt
ls 100206.fib.gz.tt.gz.FreeSurferDKT_Cortical.count.pass.network_measures.txt
ls 100206.fib.gz.tt.gz.FreeSurferDKT_Cortical.qa.pass.connectivity.mat
ls 100206.fib.gz.tt.gz.FreeSurferDKT_Cortical.qa.pass.connectogram.txt
ls 100206.fib.gz.tt.gz.FreeSurferDKT_Cortical.qa.pass.network_measures.txt
echo --------------------------------------------------------------------------------------------------
./dsi-studio/dsi_studio --source=100206.fib.gz --action=trk --other_slices=template_qa.nii.gz --dt_threshold_index=template_qa-qa --seed_count=1000000 --dt_threshold=0.1 --output=dt.tt.gz
ls dt.tt.gz
test_export_registration:
needs: linux-build
runs-on: ubuntu-20.04
steps:
- name: Setup Environment
run: |
curl -sL "https://github.com/frankyeh/DSI-Studio/releases/download/${{ github.event.inputs.tag }}/dsi_studio_ubuntu2004.zip" | jar x
curl -sL https://zenodo.org/record/6307812/files/100206.src.gz.gqi.1.7.fib.gz?download=1 -o 100206.fib.gz
chmod 777 ./dsi-studio/dsi_studio
- name: Export
run: |
./dsi-studio/dsi_studio --source=100206.fib.gz --action=exp --export=qa,iso
ls 100206.fib.gz.qa.nii.gz
ls 100206.fib.gz.iso.nii.gz
- name: Registration
run: |
curl -sL https://zenodo.org/record/6324701/files/HCP1065_qa.nii.gz?download=1 -o HCP1065_qa.nii.gz
curl -sL https://zenodo.org/record/6324701/files/HCP1065_iso.nii.gz?download=1 -o HCP1065_iso.nii.gz
./dsi-studio/dsi_studio --action=reg --from=100206.fib.gz.qa.nii.gz --to=HCP1065_qa.nii.gz --apply_warp=100206.fib.gz.qa.nii.gz
ls 100206.fib.gz.qa.nii.gz.wp.nii.gz
./dsi-studio/dsi_studio --action=reg --from=100206.fib.gz.qa.nii.gz --to=HCP1065_qa.nii.gz --from2=100206.fib.gz.iso.nii.gz --to2=HCP1065_iso.nii.gz --apply_warp=100206.fib.gz.qa.nii.gz
ls 100206.fib.gz.qa.nii.gz.wp.nii.gz
test_connectometry:
needs: linux-build
runs-on: ubuntu-20.04
steps:
- name: Setup Environment
run: |
curl -sL "https://github.com/frankyeh/DSI-Studio/releases/download/${{ github.event.inputs.tag }}/dsi_studio_ubuntu2004.zip" | jar x
curl -sL https://zenodo.org/record/6324701/files/CMU60.db.fib.gz?download=1 -o CMU60.db.fib.gz
curl -sL https://zenodo.org/record/6324701/files/CMU60.demo.csv?download=1 -o CMU60.demo.csv
chmod 777 ./dsi-studio/dsi_studio
- name: Connectometry
run: |
./dsi-studio/dsi_studio --source=CMU60.db.fib.gz --action=cnt --demo=CMU60.demo.csv --t_threshold=2.5 --permutation=200 --variable_list=0,1,2 --voi=1
ls *.report.html
ls * -l
test_automatic_tracking:
needs: linux-build
runs-on: ubuntu-20.04
steps:
- name: Setup Environment
run: |
curl -sL "https://github.com/frankyeh/DSI-Studio/releases/download/${{ github.event.inputs.tag }}/dsi_studio_ubuntu2004.zip" | jar x
curl -sL https://zenodo.org/record/6307812/files/100206.src.gz.gqi.1.7.fib.gz?download=1 -o 100206.fib.gz
curl -sL https://zenodo.org/record/6307812/files/100307.src.gz.gqi.1.7.fib.gz?download=1 -o 100307.fib.gz
chmod 777 ./dsi-studio/dsi_studio
- name: Tracking
run: |
./dsi-studio/dsi_studio --source=*.fib.gz --action=atk --track_id=ArcuateFasciculusL
ls */*ArcuateFasciculusL.tt.gz
test_src_construction:
needs: linux-build
runs-on: ubuntu-20.04
steps:
- name: Setup Environment
run: |
curl -sL "https://github.com/frankyeh/DSI-Studio/releases/download/${{ github.event.inputs.tag }}/dsi_studio_ubuntu2004.zip" | jar x
chmod 777 ./dsi-studio/dsi_studio
- name: Test GQI Recon
run: |
aws s3 sync --no-sign-request --region eu-west-1 --exclude "*" --include "*dwi.*" s3://openneuro.org/ds002087 ds002087
./dsi-studio/dsi_studio --action=src --source=ds002087