Skip to content

Commit

Permalink
working version
Browse files Browse the repository at this point in the history
  • Loading branch information
arnaudbore committed Jun 27, 2024
1 parent 3f0c33a commit b66bf98
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 15 deletions.
15 changes: 12 additions & 3 deletions dcm2bids/acquisition.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import logging
from os.path import join as opj
from os import sep

from dcm2bids.utils.utils import DEFAULT
from dcm2bids.version import __version__
Expand All @@ -30,6 +31,7 @@ def __init__(
id=None,
src_sidecar=None,
sidecar_changes=None,
bids_uri=None,
**kwargs
):
self.logger = logging.getLogger(__name__)
Expand All @@ -43,6 +45,7 @@ def __init__(
self.suffix = suffix
self.custom_entities = custom_entities
self.src_sidecar = src_sidecar
self.bids_uri = bids_uri

if sidecar_changes is None:
self.sidecar_changes = {}
Expand Down Expand Up @@ -277,10 +280,16 @@ def dstSidecarData(self, idList):
else:
values.append(idList.get(val, val))
if values[-1] != val:
if isinstance(values[-1], list):
values[-1] = ["bids::" + img_dest for img_dest in values[-1]]
if self.bids_uri == DEFAULT.bids_uri:
if isinstance(values[-1], list):
values[-1] = ["bids::" + img_dest for img_dest in values[-1]]
else:
values[-1] = "bids::" + values[-1]
else:
values[-1] = "bids::" + values[-1]
if isinstance(values[-1], list):
values[-1] = [img_dest.replace(self.participant.name + sep, "") for img_dest in values[-1]]
else:
values[-1] = values[-1].replace(self.participant.name + sep, "")

# handle if nested list vs str
flat_value_list = []
Expand Down
3 changes: 2 additions & 1 deletion dcm2bids/dcm2bids_gen.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,8 @@ def run(self):
self.config.get("search_method", DEFAULT.search_method),
self.config.get("case_sensitive", DEFAULT.case_sensitive),
self.config.get("dup_method", DEFAULT.dup_method),
self.config.get("post_op", DEFAULT.post_op)
self.config.get("post_op", DEFAULT.post_op),
self.config.get("bids_uri", DEFAULT.bids_uri)
)
parser.build_graph()
parser.build_acquisitions(self.participant)
Expand Down
37 changes: 30 additions & 7 deletions dcm2bids/sidecar.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@

from dcm2bids.acquisition import Acquisition
from dcm2bids.utils.io import load_json
from dcm2bids.utils.utils import DEFAULT, convert_dir, combine_dict_extractors, splitext_
from dcm2bids.utils.utils import (DEFAULT, convert_dir, combine_dict_extractors,
splitext_)

compare_float_keys = ["lt", "gt", "le", "ge", "btw", "btwe"]

Expand Down Expand Up @@ -99,11 +100,13 @@ def __init__(self,
search_method=DEFAULT.search_method,
case_sensitive=DEFAULT.case_sensitive,
dup_method=DEFAULT.dup_method,
post_op=DEFAULT.post_op):
post_op=DEFAULT.post_op,
bids_uri=DEFAULT.bids_uri):
self.logger = logging.getLogger(__name__)
self._search_method = ""
self._dup_method = ""
self._post_op = ""
self._bids_uri = ""
self.graph = OrderedDict()
self.acquisitions = []
self.extractors = extractors
Expand All @@ -114,6 +117,7 @@ def __init__(self,
self.case_sensitive = case_sensitive
self.dup_method = dup_method
self.post_op = post_op
self.bids_uri = bids_uri

@property
def search_method(self):
Expand Down Expand Up @@ -218,6 +222,25 @@ def post_op(self, value):
raise ValueError("post_op is not defined correctly. "
"Please check the documentation.")

@property
def bids_uri(self):
return self._bids_uri

@bids_uri.setter
def bids_uri(self, value):
"""
Checks if the method bids_uri is using is implemented
Warns the user if not and fall back to default
"""
if value in DEFAULT.bids_uri_choices:
self._bids_uri = value
else:
self.bids_uri = DEFAULT.bids_uri
self.logger.warning(
"BIDS URI methods implemented: %s", DEFAULT.bids_uri_choices)
self.logger.warning(f"{value} is not a bids URI method implemented.")
self.logger.warning(f"Falling back to default: {DEFAULT.bids_uri}.")

@property
def case_sensitive(self):
return self._case_sensitive
Expand Down Expand Up @@ -393,9 +416,10 @@ def build_acquisitions(self, participant):
if len(valid_descriptions) == 1:
desc = valid_descriptions[0]
desc, sidecar = self.searchDcmTagEntity(sidecar, desc)

acq = Acquisition(participant,
src_sidecar=sidecar, **desc)
src_sidecar=sidecar,
bids_uri=self.bids_uri,
**desc)
acq.setDstFile()

if acq.id:
Expand All @@ -414,6 +438,7 @@ def build_acquisitions(self, participant):
self.logger.warning(f"Several Pairing <- {sidecarName}")
for desc in valid_descriptions:
acq = Acquisition(participant,
bids_uri=self.bids_uri,
**desc)
self.logger.warning(f" -> {acq.suffix}")

Expand All @@ -438,7 +463,6 @@ def searchDcmTagEntity(self, sidecar, desc):
if self.auto_extract_entities:
self.extractors = combine_dict_extractors(self.extractors, DEFAULT.auto_extractors)


for dcmTag in self.extractors:
if dcmTag in sidecar.data.keys():
dcmInfo = sidecar.data.get(dcmTag)
Expand Down Expand Up @@ -473,12 +497,11 @@ def searchDcmTagEntity(self, sidecar, desc):
if left_auto_entities:
self.logger.warning(f"{left_auto_entities} have not been found for datatype '{descWithTask['datatype']}' "
f"and suffix '{descWithTask['suffix']}'.")

entities = list(entities) + list(auto_entities)
entities = list(set(entities))
descWithTask["custom_entities"] = entities


for curr_entity in entities:
if curr_entity in concatenated_matches.keys():
if curr_entity == 'dir':
Expand Down
10 changes: 6 additions & 4 deletions dcm2bids/utils/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,16 @@ class DEFAULT(object):
"func_bold": ["task"],
"func_sbref": ["task"],
"fmap_epi": ["dir"]}

compKeys = ["AcquisitionTime", "SeriesNumber", "SidecarFilename"]
search_methodChoices = ["fnmatch", "re"]
search_method = "fnmatch"
dup_method_choices = ["dup", "run"]
dup_method = "run"
runTpl = "_run-{:02d}"
dupTpl = "_dup-{:02d}"
bids_uri_choices = ["URI", "relative"]
bids_uri = "URI"
case_sensitive = True

# Entity table:
Expand Down Expand Up @@ -143,15 +145,15 @@ def convert_dir(dir):


def combine_dict_extractors(d1, d2):
""" combine dict
""" combine dict
Args:
d1 (dic): dictionary
d2 (dic): dictionary
Returns:
dict: dictionary with combined information
if d1 d2 use the same keys, return dict will return a list of items.
"""
"""
return {
k: [d[k][0] for d in (d1, d2) if k in d]
for k in set(d1.keys()) | set(d2.keys())
Expand Down

0 comments on commit b66bf98

Please sign in to comment.