Skip to content

Commit

Permalink
Merge pull request #74 from Unique-Usman/main
Browse files Browse the repository at this point in the history
Added a yml file to build the docker image
  • Loading branch information
etpeterson authored Oct 28, 2024
2 parents 6c8a829 + 12ae83f commit 5c217fc
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 4 deletions.
78 changes: 78 additions & 0 deletions .github/workflows/docker-build-and-run.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: Build and Run Docker
on:
push:
branches:
- main
pull_request:
types: [opened, synchronize, edited]
branches:
- main
- "docker/**"
jobs:
build-and-run-docker:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'

- name: Install Python dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Generate input files
run: |
python -m Docker.generate_signal_docker_test
- name: Verify input files
run: |
for file in ivim_simulation.nii.gz ivim_simulation.bval ivim_simulation.bvec; do
if [ ! -f "$file" ]; then
echo "Error: $file not found"
exit 1
fi
done
echo "All input files generated successfully"
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Build Docker image
run: |
docker build -t tf2.4_ivim-mri_codecollection -f Docker/Dockerfile .
- name: Run Docker container
run: |
docker run --rm --name TF2.4_IVIM-MRI_CodeCollection \
-v ${{ github.workspace }}:/usr/src/app \
-v ${{ github.workspace }}:/usr/app/output \
tf2.4_ivim-mri_codecollection ivim_simulation.nii.gz ivim_simulation.bvec ivim_simulation.bval
- name: Verify output files
run: |
for file in f.nii.gz dp.nii.gz d.nii.gz; do
if [ ! -f "$file" ]; then
echo "Error: $file not found"
exit 1
fi
done
echo "All output files generated successfully"
- name: Clean up artifacts and Docker image
run: |
docker rmi tf2.4_ivim-mri_codecollection || true
rm -f tf2.4_ivim-mri_codecollection.tar.gz
rm -f ${{ github.workspace }}/f.nii.gz
rm -f ${{ github.workspace }}/dp.nii.gz
rm -f ${{ github.workspace }}/d.nii.gz
rm -f ${{ github.workspace }}/ivim_simulation.nii.gz
rm -f ${{ github.workspace }}/ivim_simulation.bval
rm -f ${{ github.workspace }}/ivim_simulation.bvec
- name: Cleanup Docker
run: |
docker system prune -a --force
42 changes: 42 additions & 0 deletions Docker/generate_signal_docker_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import numpy as np
import nibabel as nib
from utilities.data_simulation.GenerateData import GenerateData
from WrapImage.nifti_wrapper import save_nifti_file


def save_bval_bvec(filename, values):
if filename.endswith('.bval'):
# Convert list to a space-separated string for bval
values_string = ' '.join(map(str, values))
elif filename.endswith('.bvec'):
# Convert 2D list to a line-separated, space-separated string for bvec
values_string = '\n'.join(' '.join(map(str, row)) for row in values)
else:
raise ValueError("Unsupported file extension. Use '.bval' or '.bvec'.")

with open(filename, 'w') as file:
file.write(values_string)

# Set random seed for reproducibility
np.random.seed(42)
# Create GenerateData instance
gd = GenerateData()

# Generate random input data
shape = (10, 10, 5)
f_in = np.random.uniform(low=0, high=1, size=shape)
D_in = np.random.uniform(low=0, high=1e-3, size=shape)
Dp_in = np.random.uniform(low=0, high=1e-1, size=shape)
S0 = 1000 # Setting a constant S0 for simplicity
bvals = np.array([0, 50, 100, 500, 1000])
bvals_reshaped = np.broadcast_to(bvals, shape)

# Generate IVIM signal
signals = gd.ivim_signal(D_in, Dp_in, f_in, S0, bvals_reshaped)

# Save the generated image as a NIfTI file
save_nifti_file(signals, "ivim_simulation.nii.gz")
# Save the bval in a file
save_bval_bvec("ivim_simulation.bval", [0, 50, 100, 500, 1000])
# Save the bvec value
save_bval_bvec("ivim_simulation.bvec", [[1, 0, 0], [0, 1, 0], [0, 0, 1]])
4 changes: 3 additions & 1 deletion WrapImage/nifti_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ def save_nifti_file(data, output_file, affine=None, **kwargs):
For saving the 3d nifti images of the output of the algorithm
"""
if affine is None:
affine = np.eye(data.ndim + 1)
affine = np.eye(4)
else:
affine = np.array(affine.reshape(4, 4))
output_img = nib.nifti1.Nifti1Image(data, affine , **kwargs)
nib.save(output_img, output_file)

Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
numpy<2
nibabel
scipy
torchio
torch
Expand Down
6 changes: 3 additions & 3 deletions utilities/data_simulation/GenerateData.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def exponential_signal(self, D, bvalues):
bvalues : list or array of float
The diffusion (b-values)
"""
assert D >= 0, 'D must be >= 0'
assert np.all(D >= 0), 'all values in D must be >= 0'
return self._op.exp(-self._op.asarray(bvalues, dtype='float64') * D)

def multiexponential_signal(self, D, F, S0, bvalues):
Expand Down Expand Up @@ -116,7 +116,7 @@ def linear_signal(self, D, bvalues, offset=0):
offset : float
The signal offset
"""
assert D >= 0, 'D must be >= 0'
assert np.all(D >= 0), 'every value in D must be >= 0'
data = -D * np.asarray(bvalues)
return data + offset

Expand Down Expand Up @@ -144,4 +144,4 @@ def multilinear_signal(self, D, F, S0, bvalues, offset=0):
signal += f * self.linear_signal(d, bvalues)
signal *= S0
signal += offset
return signal
return signal

0 comments on commit 5c217fc

Please sign in to comment.