Skip to content

Commit

Permalink
Merge pull request #65 from jjjermiah/development
Browse files Browse the repository at this point in the history
Development
  • Loading branch information
jjjermiah committed Jan 30, 2024
2 parents 1913844 + 0d293c7 commit 6383868
Show file tree
Hide file tree
Showing 11 changed files with 344 additions and 161 deletions.
13 changes: 7 additions & 6 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,12 @@ jobs:
- name: Install poetry
uses: snok/install-poetry@v1

- name: Install dependencies
run: poetry install

- name: Test with pytest
run: |
pip install -r requirements.txt
poetry install
pytest --cov --cov-report=xml:coverage-report/coverage.xml
poetry run pytest -n 2 --cov --cov-report xml:coverage-report/coverage.xml
- name: Build documentation
run: poetry run make html --directory docs/
Expand All @@ -58,7 +59,7 @@ jobs:
- name: Use Codecov to track coverage
uses: codecov/codecov-action@v3
with:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
token: ${{ secrets.CODECOV_TOKEN }}
files: ./coverage-report/coverage.xml
fail_ci_if_error: true
verbose: true
Expand Down Expand Up @@ -208,7 +209,7 @@ jobs:
# test image with latest tag
docker run --rm \
${{ secrets.DOCKERHUB_USERNAME }}/nbiatoolkit:${LATEST_TAG} \
python -c "import nbiatoolkit; print(nbiatoolkit.__version__)"
NBIAToolkit
test_image_with_latest_tag:
Expand All @@ -222,4 +223,4 @@ jobs:
run: |
docker run --rm \
${{ secrets.DOCKERHUB_USERNAME }}/nbiatoolkit:latest \
python -c "import nbiatoolkit; print(nbiatoolkit.__version__)"
NBIAToolkit
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ LABEL maintainer="Jermiah Joseph"
# install the dependencies
RUN python -m pip install nbiatoolkit

RUN python -c 'import nbiatoolkit; print(nbiatoolkit.__version__)'
RUN python -c 'import nbiatoolkit; print(nbiatoolkit.version())'

# On run, open a bash shell
CMD ["/bin/bash"]
Expand Down
10 changes: 5 additions & 5 deletions docs/Tutorial.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -68,23 +68,23 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0.10.9'"
"'NBIAToolkit version: 0.12.1'"
]
},
"execution_count": 6,
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# import nbiatoolkit \n",
"nbiatoolkit.__version__"
"nbiatoolkit.version()"
]
},
{
Expand Down
1 change: 0 additions & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
wiki/NBIA.md
Tutorial.ipynb
CONTRIBUTING.md
CONTRIBUTING.md
CONDUCT.md
autoapi/index
```
327 changes: 214 additions & 113 deletions poetry.lock

Large diffs are not rendered by default.

9 changes: 7 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,22 @@ authors = ["Jermiah Joseph"]
license = "MIT"
readme = "README.md"

[tool.poetry.scripts]
DICOMSorter = "nbiatoolkit.dicomsort:DICOMSorter_cli"
NBIAToolkit = "nbiatoolkit:version"

[tool.poetry.dependencies]
python = ">=3.11 || 3.12"
requests = "2.31.0"
pydicom = "^2.4.3"
tqdm = "^4.66.1"

[tool.poetry.dev-dependencies]
pyfiglet = "^1.0"

[tool.poetry.group.dev.dependencies]
pytest = "^7.4.3"
jupyter = "^1.0.0"
pytest-cov = ">=4.0.0"
pytest-xdist = ">=3.5.0"
myst-nb = {version = "^1.0.0", python = "^3.9"}
sphinx-autoapi = "^3.0.0"
sphinx-rtd-theme = "^1.3.0"
Expand Down
3 changes: 2 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ ruff==v0.0.260
coverage-badge~=1.1.0
requests==2.31.0
pydicom==2.4.3
tqdm==4.66.1
tqdm==4.66.1
pyfiglet~=1.0
6 changes: 2 additions & 4 deletions src/nbiatoolkit/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,12 @@
# this file is used to import all the modules in the package
# this file is used to define the __all__ variable

# set __version__ variable
__version__ = "0.12.1"

# import the modules
from .nbia import NBIAClient
from .nbia import NBIAClient, version
from .auth import OAuth2
from .logger.logger import setup_logger
from .utils.nbia_endpoints import NBIA_ENDPOINTS

# define the __all__ variable
__all__ = ["NBIAClient", "OAuth2", "setup_logger", "NBIA_ENDPOINTS", "__version__"]
__all__ = ["NBIAClient", "OAuth2", "setup_logger", "NBIA_ENDPOINTS", "version"]
4 changes: 2 additions & 2 deletions src/nbiatoolkit/dicomsort/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
# "validateMD5"
# ]

from .dicomsort import DICOMSorter
from .dicomsort import DICOMSorter, DICOMSorter_cli
from .helper_functions import parseDICOMKeysFromFormat, sanitizeFileName, truncateUID

__all__ = ["DICOMSorter", "parseDICOMKeysFromFormat", "sanitizeFileName", "truncateUID"]
__all__ = ["DICOMSorter", "parseDICOMKeysFromFormat", "sanitizeFileName", "truncateUID", "DICOMSorter_cli"]
117 changes: 91 additions & 26 deletions src/nbiatoolkit/dicomsort/dicomsort.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import re, os, sys, shutil
import pydicom
import argparse

from pydicom.errors import InvalidDicomError

from .helper_functions import parseDICOMKeysFromFormat, sanitizeFileName, truncateUID

from typing import Optional

from concurrent.futures import ThreadPoolExecutor, as_completed
from tqdm import tqdm

class DICOMSorter:
def __init__(
Expand Down Expand Up @@ -83,25 +86,29 @@ def sortSingleDICOMFile(

os.makedirs(os.path.dirname(targetFilename), exist_ok=True)

match option:
case "copy":
shutil.copyfile(src=filePath, dst=targetFilename)
case "move":
shutil.move(src=filePath, dst=targetFilename)
if option == "copy":
shutil.copyfile(src=filePath, dst=targetFilename)
elif option == "move":
shutil.move(src=filePath, dst=targetFilename)
else:
raise ValueError(f"Invalid option: {option}")

return True

def sortDICOMFiles(self, option: str = "copy", overwrite: bool = False) -> bool:
def sortDICOMFiles(self, option: str = "copy", overwrite: bool = False, nParallel: int = 1) -> bool:
dicom_file_paths = self._get_dicom_files()
result = []
print("Running with {} parallel threads".format(nParallel))

results = [
self.sortSingleDICOMFile(file, option, overwrite)
for file in dicom_file_paths
]
with ThreadPoolExecutor(max_workers=nParallel) as executor:
futures = [executor.submit(self.sortSingleDICOMFile, filePath, option, overwrite) for filePath in dicom_file_paths]

return all(results)
for future in tqdm(as_completed(futures), total=len(futures)):
result.append(future.result())

def _get_dicom_files(self) -> list[str]:
return all(result)

def _get_dicom_files(self) -> 'list[str]':
dicom_file_paths = []
# Iterate over all files in the source directory
for root, dirs, files in os.walk(self.sourceDir):
Expand All @@ -112,17 +119,75 @@ def _get_dicom_files(self) -> list[str]:

return dicom_file_paths


# Test case
# if __name__ == "__main__":

# sorter = DICOMSorter(
# sourceDir = sourceDir,
# destinationDir=destinationDir,
# targetPattern=pattern,
# truncateUID=True,
# sanitizeFilename=True,
# overwrite=True
# )

# sorter.sortDICOMFiles(option="move")
# Create command line interface

# Given a source directory, destination directory, and target pattern, sort DICOM files
# into the destination directory according to the target pattern.
# The target pattern is a string with placeholders matching '%<DICOMKey>'.

def DICOMSorter_cli():
parser = argparse.ArgumentParser(
description="Sort DICOM files into destination directory according to target pattern."
)

parser.add_argument("sourceDir",
metavar="sourceDir",
type=str,
help="The source directory containing DICOM files.",
)

parser.add_argument("destinationDir",
metavar="destinationDir",
type=str,
help="The destination directory to sort DICOM files into.",
)

# Default is %%PatientName/%%SeriesNumber-%%SeriesInstanceUID/%%InstanceNumber.dcm
parser.add_argument("--targetPattern",
dest="targetPattern",
default="%PatientName/%SeriesNumber-%SeriesInstanceUID/%InstanceNumber.dcm",
type=str,
help='The target pattern for sorting DICOM files. Default is %%PatientName/%%SeriesNumber-%%SeriesInstanceUID/%%InstanceNumber.dcm.',
)

parser.add_argument("--truncateUID",
dest="truncateUID",
action="store_true",
default=True,
help="Truncate the UID to the last n characters (includes periods & underscores). Default is True.",
)

parser.add_argument("--sanitizeFilename",
dest="sanitizeFilename",
action="store_true",
help="Sanitize the file name by replacing potentially dangerous characters. Default is True.",
)

parser.add_argument("--overwrite",
dest="overwrite",
action="store_true",
help="Overwrite existing files. Default is False.",
)

parser.add_argument("--nParallel",
dest="nParallel",
action="store",
type=int,
help="Number of parallel threads. Default is 1.",)

parser.set_defaults(truncateUID=True)
parser.set_defaults(sanitizeFilename=True)
parser.set_defaults(overwrite=False)
parser.set_defaults(nParallel=1)

args = parser.parse_args()

sorter = DICOMSorter(
sourceDir=args.sourceDir,
destinationDir=args.destinationDir,
targetPattern=args.targetPattern,
truncateUID=args.truncateUID,
sanitizeFilename=args.sanitizeFilename,
)

sorter.sortDICOMFiles(option="copy", overwrite=args.overwrite, nParallel=int(args.nParallel))
13 changes: 13 additions & 0 deletions src/nbiatoolkit/nbia.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,18 @@
import io
import zipfile
from tqdm import tqdm
from pyfiglet import Figlet

# set __version__ variable
__version__ = "0.12.1"

def version():

f = Figlet(font='slant')
print(f.renderText('NBIAToolkit'))
print("Version: {}".format(__version__))
return



class NBIAClient:
Expand Down Expand Up @@ -345,6 +357,7 @@ def parsePARAMS(self, params: dict) -> dict:
return PARAMS



# main
if __name__ == "__main__":
from pprint import pprint
Expand Down

0 comments on commit 6383868

Please sign in to comment.