mosamatic2 2.0.11__tar.gz → 2.0.12__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mosamatic2 might be problematic. Click here for more details.

Files changed (98) hide show
  1. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/PKG-INFO +1 -1
  2. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/pyproject.toml +1 -1
  3. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/commands/dicom2nifti.py +8 -8
  4. mosamatic2-2.0.12/src/mosamatic2/core/data/multiniftiimage.py +26 -0
  5. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/data/multinumpyimage.py +4 -4
  6. mosamatic2-2.0.12/src/mosamatic2/core/data/niftiimage.py +13 -0
  7. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/data/numpyimage.py +1 -1
  8. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/tasks/calculatescorestask/calculatescorestask.py +2 -2
  9. mosamatic2-2.0.12/src/mosamatic2/core/tasks/dicom2niftitask/dicom2niftitask.py +38 -0
  10. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/tasks/segmentmusclefatl3tensorflowtask/segmentmusclefatl3tensorflowtask.py +3 -0
  11. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/tasks/selectslicefromscanstask/selectslicefromscanstask.py +1 -1
  12. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/utils.py +12 -2
  13. mosamatic2-2.0.12/src/mosamatic2/ui/resources/VERSION +1 -0
  14. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/tasks/dicom2niftitaskpanel.py +23 -23
  15. mosamatic2-2.0.11/src/mosamatic2/core/tasks/dicom2niftitask/dicom2niftitask.py +0 -24
  16. mosamatic2-2.0.11/src/mosamatic2/ui/resources/VERSION +0 -1
  17. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/README.md +0 -0
  18. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/models.py +0 -0
  19. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/__init__.py +0 -0
  20. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/app.py +0 -0
  21. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/cli.py +0 -0
  22. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/commands/__init__.py +0 -0
  23. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/commands/calculatescores.py +0 -0
  24. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/commands/createdicomsummary.py +0 -0
  25. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/commands/createpngsfromsegmentations.py +0 -0
  26. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/commands/defaultpipeline.py +0 -0
  27. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/commands/rescaledicomimages.py +0 -0
  28. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/commands/segmentmusclefatl3tensorflow.py +0 -0
  29. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/commands/selectslicefromscans.py +0 -0
  30. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/constants.py +0 -0
  31. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/__init__.py +0 -0
  32. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/data/__init__.py +0 -0
  33. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/data/dicomimage.py +0 -0
  34. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/data/dicomimageseries.py +0 -0
  35. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/data/dixonseries.py +0 -0
  36. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/data/filedata.py +0 -0
  37. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/data/multidicomimage.py +0 -0
  38. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/managers/__init__.py +0 -0
  39. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/managers/logmanager.py +0 -0
  40. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/managers/logmanagerlistener.py +0 -0
  41. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/pipelines/__init__.py +0 -0
  42. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/pipelines/defaultdockerpipeline/__init__.py +0 -0
  43. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/pipelines/defaultdockerpipeline/defaultdockerpipeline.py +0 -0
  44. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/pipelines/defaultpipeline/__init__.py +0 -0
  45. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/pipelines/defaultpipeline/defaultpipeline.py +0 -0
  46. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/pipelines/pipeline.py +0 -0
  47. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/singleton.py +0 -0
  48. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/tasks/__init__.py +0 -0
  49. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/tasks/calculatescorestask/__init__.py +0 -0
  50. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/tasks/createdicomsummarytask/__init__.py +0 -0
  51. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/tasks/createdicomsummarytask/createdicomsummarytask.py +0 -0
  52. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/tasks/createpngsfromsegmentationstask/__init__.py +0 -0
  53. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/tasks/createpngsfromsegmentationstask/createpngsfromsegmentationstask.py +0 -0
  54. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/tasks/dicom2niftitask/__init__.py +0 -0
  55. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/tasks/rescaledicomimagestask/__init__.py +0 -0
  56. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/tasks/rescaledicomimagestask/rescaledicomimagestask.py +0 -0
  57. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/tasks/segmentmusclefatl3tensorflowtask/__init__.py +0 -0
  58. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/tasks/segmentmusclefatl3tensorflowtask/paramloader.py +0 -0
  59. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/tasks/selectslicefromscanstask/__init__.py +0 -0
  60. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/core/tasks/task.py +0 -0
  61. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/server.py +0 -0
  62. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/__init__.py +0 -0
  63. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/mainwindow.py +0 -0
  64. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/resources/icons/mosamatic2.icns +0 -0
  65. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/resources/icons/mosamatic2.ico +0 -0
  66. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/resources/icons/spinner.gif +0 -0
  67. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/resources/images/body-composition.jpg +0 -0
  68. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/settings.py +0 -0
  69. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/utils.py +0 -0
  70. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/__init__.py +0 -0
  71. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/dialogs/__init__.py +0 -0
  72. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/dialogs/dialog.py +0 -0
  73. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/dialogs/helpdialog.py +0 -0
  74. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/__init__.py +0 -0
  75. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/defaultpanel.py +0 -0
  76. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/logpanel.py +0 -0
  77. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/mainpanel.py +0 -0
  78. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/pipelines/__init__.py +0 -0
  79. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/pipelines/defaultdockerpipelinepanel.py +0 -0
  80. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/pipelines/defaultpipelinepanel.py +0 -0
  81. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/pipelines/pipelinepanel.py +0 -0
  82. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/stackedpanel.py +0 -0
  83. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/tasks/__init__.py +0 -0
  84. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/tasks/calculatescorestaskpanel.py +0 -0
  85. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/tasks/createdicomsummarytaskpanel.py +0 -0
  86. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/tasks/createpngsfromsegmentationstaskpanel.py +0 -0
  87. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/tasks/rescaledicomimagestaskpanel.py +0 -0
  88. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/tasks/segmentmusclefatl3tensorflowtaskpanel.py +0 -0
  89. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/tasks/selectslicefromscanstaskpanel.py +0 -0
  90. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/tasks/taskpanel.py +0 -0
  91. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/visualizations/__init__.py +0 -0
  92. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/visualizations/slicevisualization/__init__.py +0 -0
  93. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/visualizations/slicevisualization/custominteractorstyle.py +0 -0
  94. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/visualizations/slicevisualization/sliceviewer.py +0 -0
  95. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/visualizations/slicevisualization/slicevisualization.py +0 -0
  96. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/panels/visualizations/visualization.py +0 -0
  97. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/widgets/splashscreen.py +0 -0
  98. {mosamatic2-2.0.11 → mosamatic2-2.0.12}/src/mosamatic2/ui/worker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: mosamatic2
3
- Version: 2.0.11
3
+ Version: 2.0.12
4
4
  Summary:
5
5
  Author: Ralph Brecheisen
6
6
  Author-email: r.brecheisen@maastrichtuniversity.nl
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mosamatic2"
3
- version = "2.0.11"
3
+ version = "2.0.12"
4
4
  description = ""
5
5
  authors = [
6
6
  {name = "Ralph Brecheisen", email = "r.brecheisen@maastrichtuniversity.nl"}
@@ -3,12 +3,12 @@ import click
3
3
  from mosamatic2.core.tasks import Dicom2NiftiTask
4
4
 
5
5
 
6
- @click.command(help='Converts DICOM series to NIFTI')
6
+ @click.command(help='Converts root directory with DICOM series to NIFTI format')
7
7
  @click.option(
8
- '--images',
8
+ '--scans',
9
9
  required=True,
10
10
  type=click.Path(exists=True),
11
- help='Directory with images',
11
+ help='Root directory with DICOM scans (one for each patient)',
12
12
  )
13
13
  @click.option(
14
14
  '--output',
@@ -22,14 +22,14 @@ from mosamatic2.core.tasks import Dicom2NiftiTask
22
22
  default=False,
23
23
  help='Overwrite [true|false]'
24
24
  )
25
- def dicom2nifti(images, output, overwrite):
25
+ def dicom2nifti(scans, output, overwrite):
26
26
  """
27
- Converts single DICOM series (scan) to NIFTI
27
+ Converts DICOM scans to NIFTI format.
28
28
 
29
29
  Parameters
30
30
  ----------
31
- --images : str
32
- Directory with DICOM images of a single series
31
+ --scans : str
32
+ Root directory with DICOM scans (one subdirectory for each patient)
33
33
 
34
34
  --output : str
35
35
  Path to output directory
@@ -38,7 +38,7 @@ def dicom2nifti(images, output, overwrite):
38
38
  Overwrite contents output directory [true|false]
39
39
  """
40
40
  task = Dicom2NiftiTask(
41
- inputs={'images': images},
41
+ inputs={'scans': scans},
42
42
  params=None,
43
43
  output=output,
44
44
  overwrite=overwrite,
@@ -0,0 +1,26 @@
1
+ import os
2
+ from mosamatic2.core.managers.logmanager import LogManager
3
+ from mosamatic2.core.data.filedata import FileData
4
+ from mosamatic2.core.data.niftiimage import NiftiImage
5
+
6
+ LOG = LogManager()
7
+
8
+
9
+ class MultiNiftiImage(FileData):
10
+ def __init__(self):
11
+ super(MultiNiftiImage, self).__init__()
12
+ self._images = []
13
+
14
+ def images(self):
15
+ return self._images
16
+
17
+ def load(self):
18
+ if self.path():
19
+ for f in os.listdir(self.path()):
20
+ f_path = os.path.join(self.path(), f)
21
+ image = NiftiImage()
22
+ image.set_path(f_path)
23
+ if image.load():
24
+ self._images.append(image)
25
+ return True
26
+ return False
@@ -1,14 +1,14 @@
1
1
  import os
2
2
  from mosamatic2.core.managers.logmanager import LogManager
3
3
  from mosamatic2.core.data.filedata import FileData
4
- from mosamatic2.core.data.numpyimage import NumPyImage
4
+ from mosamatic2.core.data.numpyimage import NumpyImage
5
5
 
6
6
  LOG = LogManager()
7
7
 
8
8
 
9
- class MultiNumPyImage(FileData):
9
+ class MultiNumpyImage(FileData):
10
10
  def __init__(self):
11
- super(MultiNumPyImage, self).__init__()
11
+ super(MultiNumpyImage, self).__init__()
12
12
  self._images = []
13
13
 
14
14
  def images(self):
@@ -18,7 +18,7 @@ class MultiNumPyImage(FileData):
18
18
  if self.path():
19
19
  for f in os.listdir(self.path()):
20
20
  f_path = os.path.join(self.path(), f)
21
- image = NumPyImage()
21
+ image = NumpyImage()
22
22
  image.set_path(f_path)
23
23
  if image.load():
24
24
  self._images.append(image)
@@ -0,0 +1,13 @@
1
+ from mosamatic2.core.data.filedata import FileData
2
+ from mosamatic2.core.utils import (
3
+ is_nifti,
4
+ load_nifti,
5
+ )
6
+
7
+ class NiftiImage(FileData):
8
+ def load(self):
9
+ if self.path():
10
+ if is_nifti(self.path()):
11
+ self.set_object(load_nifti(self.path()))
12
+ return True
13
+ return False
@@ -4,7 +4,7 @@ from mosamatic2.core.utils import (
4
4
  load_numpy_array,
5
5
  )
6
6
 
7
- class NumPyImage(FileData):
7
+ class NumpyImage(FileData):
8
8
  def load(self):
9
9
  if self.path():
10
10
  if is_numpy(self.path()):
@@ -4,7 +4,7 @@ import pandas as pd
4
4
  from mosamatic2.core.tasks.task import Task
5
5
  from mosamatic2.core.managers.logmanager import LogManager
6
6
  from mosamatic2.core.data.multidicomimage import MultiDicomImage
7
- from mosamatic2.core.data.numpyimage import NumPyImage
7
+ from mosamatic2.core.data.numpyimage import NumpyImage
8
8
  from mosamatic2.core.utils import (
9
9
  get_pixels_from_dicom_object,
10
10
  calculate_area,
@@ -74,7 +74,7 @@ class CalculateScoresTask(Task):
74
74
 
75
75
  def load_segmentation(self, f, file_type='npy'):
76
76
  if file_type == 'npy':
77
- segmentation = NumPyImage()
77
+ segmentation = NumpyImage()
78
78
  segmentation.set_path(f)
79
79
  if segmentation.load():
80
80
  return segmentation.object()
@@ -0,0 +1,38 @@
1
+ import os
2
+ import dicom2nifti
3
+ from mosamatic2.core.tasks.task import Task
4
+ from mosamatic2.core.managers.logmanager import LogManager
5
+ from mosamatic2.core.utils import is_dicom
6
+
7
+ LOG = LogManager()
8
+
9
+
10
+ class Dicom2NiftiTask(Task):
11
+ INPUTS = ['scans']
12
+ PARAMS = []
13
+
14
+ def __init__(self, inputs, params, output, overwrite):
15
+ super(Dicom2NiftiTask, self).__init__(inputs, params, output, overwrite)
16
+
17
+ def load_scan_dirs(self):
18
+ scan_dirs = []
19
+ for d in os.listdir(self.input('scans')):
20
+ scan_dir = os.path.join(self.input('scans'), d)
21
+ if os.path.isdir(scan_dir):
22
+ scan_dirs.append(scan_dir)
23
+ return scan_dirs
24
+
25
+ def run(self):
26
+ scan_dirs = self.load_scan_dirs()
27
+ nr_steps = len(scan_dirs)
28
+ for step in range(nr_steps):
29
+ scan_dir = scan_dirs[step]
30
+ scan_name = os.path.split(scan_dir)[1]
31
+ nifti_file_name = scan_name + '.nii.gz'
32
+ LOG.info(f'Converting DICOM series in {scan_dir} to {nifti_file_name}')
33
+ dicom2nifti.dicom_series_to_nifti(
34
+ scan_dir,
35
+ os.path.join(self.output(), nifti_file_name),
36
+ reorient_nifti=True,
37
+ )
38
+ self.set_progress(step, nr_steps)
@@ -9,6 +9,7 @@ from mosamatic2.core.tasks.task import Task
9
9
  from mosamatic2.core.tasks.segmentmusclefatl3tensorflowtask.paramloader import ParamLoader
10
10
  from mosamatic2.core.data.multidicomimage import MultiDicomImage
11
11
  from mosamatic2.core.data.dicomimage import DicomImage
12
+ from mosamatic2.core.managers.logmanager import LogManager
12
13
  from mosamatic2.core.utils import (
13
14
  normalize_between,
14
15
  get_pixels_from_dicom_object,
@@ -16,6 +17,8 @@ from mosamatic2.core.utils import (
16
17
  )
17
18
 
18
19
  DEVICE = 'cpu'
20
+ L3_INDEX = 167
21
+ LOG = LogManager()
19
22
 
20
23
 
21
24
  class SegmentMuscleFatL3TensorFlowTask(Task):
@@ -30,7 +30,7 @@ class SelectSliceFromScansTask(Task):
30
30
  os.makedirs(self._error_dir, exist_ok=True)
31
31
  self._error_file = os.path.join(self._error_dir, 'errors.txt')
32
32
  with open(self._error_file, 'w') as f:
33
- f.write('Errors:\n')
33
+ f.write('Errors:\n\n')
34
34
  LOG.info(f'Error directory: {self._error_dir}')
35
35
 
36
36
  def write_error(self, message):
@@ -5,6 +5,7 @@ import textwrap
5
5
  import math
6
6
  import pendulum
7
7
  import numpy as np
8
+ import nibabel as nb
8
9
  import struct
9
10
  import binascii
10
11
  import pydicom
@@ -134,6 +135,16 @@ def is_jpeg2000_compressed(p):
134
135
  return False
135
136
 
136
137
 
138
+ def is_nifti(f):
139
+ return f.endswith('.nii') or f.endswith('.nii.gz')
140
+
141
+
142
+ def load_nifti(f):
143
+ if is_nifti(f):
144
+ return nb.load(f)
145
+ return None
146
+
147
+
137
148
  def is_numpy_array(value):
138
149
  return isinstance(value, np.array)
139
150
 
@@ -149,8 +160,7 @@ def is_numpy(f):
149
160
  def load_numpy_array(f):
150
161
  if is_numpy(f):
151
162
  return np.load(f)
152
- else:
153
- return None
163
+ return None
154
164
 
155
165
 
156
166
  def get_pixels_from_tag_file(tag_file_path):
@@ -33,8 +33,8 @@ class Dicom2NiftiTaskPanel(TaskPanel):
33
33
  def __init__(self):
34
34
  super(Dicom2NiftiTaskPanel, self).__init__()
35
35
  self.set_title(PANEL_TITLE)
36
- self._images_dir_line_edit = None
37
- self._images_dir_select_button = None
36
+ self._scans_dir_line_edit = None
37
+ self._scans_dir_select_button = None
38
38
  self._output_dir_line_edit = None
39
39
  self._output_dir_select_button = None
40
40
  self._overwrite_checkbox = None
@@ -46,16 +46,16 @@ class Dicom2NiftiTaskPanel(TaskPanel):
46
46
  self._thread = None
47
47
  self.init_layout()
48
48
 
49
- def images_dir_line_edit(self):
50
- if not self._images_dir_line_edit:
51
- self._images_dir_line_edit = QLineEdit(self.settings().get(f'{PANEL_NAME}/images_dir'))
52
- return self._images_dir_line_edit
49
+ def scans_dir_line_edit(self):
50
+ if not self._scans_dir_line_edit:
51
+ self._scans_dir_line_edit = QLineEdit(self.settings().get(f'{PANEL_NAME}/scans_dir'))
52
+ return self._scans_dir_line_edit
53
53
 
54
- def images_dir_select_button(self):
55
- if not self._images_dir_select_button:
56
- self._images_dir_select_button = QPushButton('Select')
57
- self._images_dir_select_button.clicked.connect(self.handle_images_dir_select_button)
58
- return self._images_dir_select_button
54
+ def scans_dir_select_button(self):
55
+ if not self._scans_dir_select_button:
56
+ self._scans_dir_select_button = QPushButton('Select')
57
+ self._scans_dir_select_button.clicked.connect(self.handle_scans_dir_select_button)
58
+ return self._scans_dir_select_button
59
59
 
60
60
  def output_dir_line_edit(self):
61
61
  if not self._output_dir_line_edit:
@@ -93,13 +93,13 @@ class Dicom2NiftiTaskPanel(TaskPanel):
93
93
  return self._settings
94
94
 
95
95
  def init_layout(self):
96
- images_dir_layout = QHBoxLayout()
97
- images_dir_layout.addWidget(self.images_dir_line_edit())
98
- images_dir_layout.addWidget(self.images_dir_select_button())
96
+ scans_dir_layout = QHBoxLayout()
97
+ scans_dir_layout.addWidget(self.scans_dir_line_edit())
98
+ scans_dir_layout.addWidget(self.scans_dir_select_button())
99
99
  output_dir_layout = QHBoxLayout()
100
100
  output_dir_layout.addWidget(self.output_dir_line_edit())
101
101
  output_dir_layout.addWidget(self.output_dir_select_button())
102
- self.form_layout().addRow('Images directory', images_dir_layout)
102
+ self.form_layout().addRow('Scans directory', scans_dir_layout)
103
103
  self.form_layout().addRow('Output directory', output_dir_layout)
104
104
  self.form_layout().addRow('Overwrite', self.overwrite_checkbox())
105
105
  layout = QVBoxLayout()
@@ -108,11 +108,11 @@ class Dicom2NiftiTaskPanel(TaskPanel):
108
108
  self.setLayout(layout)
109
109
  self.setObjectName(PANEL_NAME)
110
110
 
111
- def handle_images_dir_select_button(self):
111
+ def handle_scans_dir_select_button(self):
112
112
  last_directory = self.settings().get('last_directory')
113
113
  directory = QFileDialog.getExistingDirectory(dir=last_directory)
114
114
  if directory:
115
- self.images_dir_line_edit().setText(directory)
115
+ self.scans_dir_line_edit().setText(directory)
116
116
  self.settings().set('last_directory', directory)
117
117
 
118
118
  def handle_output_dir_select_button(self):
@@ -134,7 +134,7 @@ class Dicom2NiftiTaskPanel(TaskPanel):
134
134
  self.run_task_button().setEnabled(False)
135
135
  self.save_inputs_and_parameters()
136
136
  self._task = Dicom2NiftiTask(
137
- inputs={'images': self.images_dir_line_edit().text()},
137
+ inputs={'scans': self.scans_dir_line_edit().text()},
138
138
  params=None,
139
139
  output=self.output_dir_line_edit().text(),
140
140
  overwrite=self.overwrite_checkbox().isChecked(),
@@ -167,10 +167,10 @@ class Dicom2NiftiTaskPanel(TaskPanel):
167
167
 
168
168
  def check_inputs_and_parameters(self):
169
169
  errors = []
170
- if self.images_dir_line_edit().text() == '':
171
- errors.append('Empty images directory path')
172
- if not os.path.isdir(self.images_dir_line_edit().text()):
173
- errors.append('Images directory does not exist')
170
+ if self.scans_dir_line_edit().text() == '':
171
+ errors.append('Empty scans directory path')
172
+ if not os.path.isdir(self.scans_dir_line_edit().text()):
173
+ errors.append('Scans directory does not exist')
174
174
  if self.output_dir_line_edit().text() == '':
175
175
  errors.append('Empty output directory path')
176
176
  if os.path.isdir(self.output_dir_line_edit().text()) and not self.overwrite_checkbox().isChecked():
@@ -178,6 +178,6 @@ class Dicom2NiftiTaskPanel(TaskPanel):
178
178
  return errors
179
179
 
180
180
  def save_inputs_and_parameters(self):
181
- self.settings().set(f'{PANEL_NAME}/images_dir', self.images_dir_line_edit().text())
181
+ self.settings().set(f'{PANEL_NAME}/scans_dir', self.scans_dir_line_edit().text())
182
182
  self.settings().set(f'{PANEL_NAME}/output_dir', self.output_dir_line_edit().text())
183
183
  self.settings().set(f'{PANEL_NAME}/overwrite', self.overwrite_checkbox().isChecked())
@@ -1,24 +0,0 @@
1
- import os
2
- import dicom2nifti
3
- from mosamatic2.core.tasks.task import Task
4
- from mosamatic2.core.managers.logmanager import LogManager
5
-
6
- LOG = LogManager()
7
-
8
-
9
- class Dicom2NiftiTask(Task):
10
- INPUTS = ['images']
11
- PARAMS = []
12
-
13
- def __init__(self, inputs, params, output, overwrite):
14
- super(Dicom2NiftiTask, self).__init__(inputs, params, output, overwrite)
15
-
16
- def run(self):
17
- nifti_file_name = os.path.split(self.input('images'))[1] + '.nii.gz'
18
- LOG.info(f'Converting DICOM directory to {nifti_file_name}')
19
- dicom2nifti.dicom_series_to_nifti(
20
- self.input('images'),
21
- os.path.join(self.output(), nifti_file_name),
22
- reorient_nifti=True,
23
- )
24
- self.set_progress(0, 1)
@@ -1 +0,0 @@
1
- 2.0.11
File without changes
File without changes