Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Siemens mMR NEMA IQ lowcounts #108

Merged
merged 5 commits into from
Sep 23, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions SIRF_data_preparation/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,20 +33,20 @@ in `~/devel/PETRIC/data/<datasetname>` with `datasetname` following convention o
PYTHONPATH=~/devel/PETRIC:$PYTHONPATH`
```

1. Run initial [data_QC.py](data_QC)
1. Run initial [data_QC.py](data_QC.py)
```
python -m SIRF_data_preparation.data_QC
```

2. Run [create_initial_images.py](create_initial_images).
2. Run [create_initial_images.py](create_initial_images.py).
```
python -m SIRF_data_preparation.create_initial_images --template_image=<some_image>
```
where the template image is one of the given VOIs (it does not matter which one, as they should all have the same geometry). (If you need to create VOIs yourself, you can use `None` or the vendor image).
3. Edit `OSEM_image.hv` to add modality, radionuclide and duration info which got lost (copy from `prompts.hs`)
4. Edit [dataset_settings.py](dataset_settings.py) for subsets (used by our reference reconstructions only, not by participants).
5. Edit [../petric.py](petric.py) for slices to use for creating figures (`DATA_SLICES`). Note that `data_QC` outputs centre-of-mass of the VOIs, which can be helpful for this.
6. Run [data_QC](data_QC) which should now make more plots. Check VOI alignment etc.
5. Edit [petric.py](../petric.py) for slices to use for creating figures (`DATA_SLICES`). Note that `data_QC` outputs centre-of-mass of the VOIs, which can be helpful for this.
6. Run [data_QC.py](data_QC.py) which should now make more plots. Check VOI alignment etc.
```
python -m SIRF_data_preparation.data_QC --dataset=<datasetname>
```
Expand All @@ -58,5 +58,5 @@ PYTHONPATH=~/devel/PETRIC:$PYTHONPATH`
```
stir_math data/<datasetname>/PETRIC/reference_image.hv output/<datasetname>/iter_final.hv
```
12. `rm output/<datasetname>/*ahv`, check its `README.md` etc
12. `cd data/<datasetname>; rm -f *ahv info.txt warnings.txt`, check its `README.md` etc
13. Transfer to web-server
8 changes: 8 additions & 0 deletions SIRF_data_preparation/Siemens_mMR_NEMA_IQ_lowcounts/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Siemens mMR NEMA IQ data (low counts)

This relies on the "normal" count level processsing to be done first, specifically the download and the ROIs.

Steps to follow:
1. `prepare_mMR_NEMA_IQ_data.py`
2. copy VOIs
3. further steps as [normal](../README.md#steps-to-follow-to-prepare-data)
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import argparse
import logging
import os

from ..data_utilities import prepare_challenge_Siemens_data, the_data_path, the_orgdata_path

this_directory = os.path.dirname(__file__)
repo_directory = os.path.dirname(this_directory)
challenge_data_path = os.path.join(repo_directory, 'data')

if __name__ == '__main__':
parser = argparse.ArgumentParser(description='SyneRBI PETRIC Siemens mMR NEMA IQ data preparation script.')

parser.add_argument('--log', type=str, default='warning')
parser.add_argument('--start', type=float, default=0)
parser.add_argument('--end', type=float, default=100)
parser.add_argument('--raw_data_path', type=str, default=None)
args = parser.parse_args()

if args.log in ['debug', 'info', 'warning', 'error', 'critical']:
level = eval(f'logging.{args.log.upper()}')
logging.basicConfig(level=level)
logging.info(f"Setting logging level to {args.log.upper()}")

start = args.start
end = args.end

if args.raw_data_path is None:
data_path = the_orgdata_path('Siemens_mMR_NEMA_IQ', 'raw', 'NEMA_IQ')
else:
data_path = args.raw_data_path

data_path = os.path.abspath(data_path)
logging.debug(f"Raw data path: {data_path}")

intermediate_data_path = the_orgdata_path('Siemens_mMR_NEMA_IQ_lowcounts', 'processing')
challenge_data_path = the_data_path('Siemens_mMR_NEMA_IQ_lowcounts')

os.makedirs(challenge_data_path, exist_ok=True)
os.chdir(challenge_data_path)
os.makedirs(intermediate_data_path, exist_ok=True)

f_template = os.path.join(data_path, 'mMR_template_span11.hs')

prepare_challenge_Siemens_data(data_path, challenge_data_path, intermediate_data_path, '20170809_NEMA_',
'60min_UCL.l.hdr', 'MUMAP_UCL.v', 'MUMAP_UCL.hv', 'UCL.n', 'norm.n.hdr', f_template,
'prompts', 'mult_factors', 'additive_term', 'randoms', 'attenuation_factor',
'attenuation_correction_factor', 'scatter', start, end)
5 changes: 2 additions & 3 deletions SIRF_data_preparation/create_initial_images.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,8 @@ def compute_kappa_image(obj_fun, initial_image):

WARNING: Assumes the objective function has been set-up already
"""
# This needs SIRF 3.7. If you don't have that yet, you should probably upgrade anyway!
Hessian_row_sum = obj_fun.multiply_with_Hessian(initial_image, initial_image.allocate(1))
return (-1 * Hessian_row_sum).power(.5)
minus_Hessian_row_sum = -1 * obj_fun.multiply_with_Hessian(initial_image, initial_image.allocate(1))
return minus_Hessian_row_sum.maximum(0).power(.5)


def main(argv=None):
Expand Down
4 changes: 2 additions & 2 deletions SIRF_data_preparation/dataset_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
from petric import DATA_SLICES

DATA_SUBSETS = {
'Siemens_mMR_NEMA_IQ': 7, 'Siemens_mMR_ACR': 7, 'NeuroLF_Hoffman_Dataset': 16, 'Mediso_NEMA_IQ': 12,
'Siemens_Vision600_thorax': 5}
'Siemens_mMR_NEMA_IQ': 7, 'Siemens_mMR_NEMA_IQ_lowcounts': 7, 'Siemens_mMR_ACR': 7, 'NeuroLF_Hoffman_Dataset': 16,
'Mediso_NEMA_IQ': 12, 'Siemens_Vision600_thorax': 5}


@dataclass
Expand Down
1 change: 1 addition & 0 deletions petric.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,7 @@ def get_image(fname):

DATA_SLICES = {
'Siemens_mMR_NEMA_IQ': {'transverse_slice': 72, 'coronal_slice': 109}, # 'sagittal_slice': 89
casperdcl marked this conversation as resolved.
Show resolved Hide resolved
'Siemens_mMR_NEMA_IQ_lowcounts': {'transverse_slice': 72, 'coronal_slice': 109, 'sagittal_slice': 89},
'Siemens_mMR_ACR': {'transverse_slice': 99},
'NeuroLF_Hoffman_Dataset': {'transverse_slice': 72},
'Mediso_NEMA_IQ': {'transverse_slice': 22, 'coronal_slice': 89, 'sagittal_slice': 66},
Expand Down