brkraw 0.5.0rc1__py3-none-any.whl → 0.5.1__py3-none-any.whl
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.
- brkraw/__init__.py +1 -1
- brkraw/apps/hook/core.py +58 -10
- brkraw/apps/loader/core.py +5 -1
- brkraw/apps/loader/helper.py +155 -14
- brkraw/apps/loader/info/scan.py +18 -5
- brkraw/apps/loader/types.py +6 -1
- brkraw/cli/commands/convert.py +201 -79
- brkraw/cli/commands/hook.py +146 -4
- brkraw/cli/commands/session.py +6 -1
- brkraw/cli/hook_args.py +80 -0
- brkraw/core/config.py +8 -0
- brkraw/core/layout.py +56 -11
- brkraw/default/rules/00_default.yaml +4 -0
- brkraw/default/specs/metadata_dicom.yaml +236 -0
- brkraw/default/specs/metadata_transforms.py +18 -0
- brkraw/resolver/affine.py +56 -32
- brkraw/schema/context_map.yaml +5 -0
- brkraw/schema/remapper.yaml +6 -0
- brkraw/specs/__init__.py +2 -2
- brkraw/specs/{converter → hook}/logic.py +1 -0
- brkraw/specs/{converter → hook}/validator.py +1 -0
- brkraw/specs/remapper/logic.py +83 -16
- brkraw/specs/remapper/validator.py +21 -5
- {brkraw-0.5.0rc1.dist-info → brkraw-0.5.1.dist-info}/METADATA +31 -4
- {brkraw-0.5.0rc1.dist-info → brkraw-0.5.1.dist-info}/RECORD +29 -33
- brkraw/default/rules/10-metadata.yaml +0 -42
- brkraw/default/rules/20-mrs.yaml +0 -14
- brkraw/default/specs/metadata_anat.yaml +0 -54
- brkraw/default/specs/metadata_common.yaml +0 -129
- brkraw/default/specs/metadata_func.yaml +0 -127
- brkraw/default/specs/mrs.yaml +0 -71
- brkraw/default/specs/mrs_transforms.py +0 -26
- brkraw/specs/{converter → hook}/__init__.py +1 -1
- {brkraw-0.5.0rc1.dist-info → brkraw-0.5.1.dist-info}/WHEEL +0 -0
- {brkraw-0.5.0rc1.dist-info → brkraw-0.5.1.dist-info}/entry_points.txt +0 -0
- {brkraw-0.5.0rc1.dist-info → brkraw-0.5.1.dist-info}/licenses/LICENSE +0 -0
brkraw/specs/remapper/logic.py
CHANGED
|
@@ -503,9 +503,15 @@ def map_parameters(
|
|
|
503
503
|
val = _apply_inputs_transform(inputs, transforms, rule["transform"])
|
|
504
504
|
else:
|
|
505
505
|
val = inputs
|
|
506
|
-
|
|
506
|
+
elif "sources" in rule:
|
|
507
507
|
raw = _resolve_value(source, rule.get("sources", []), transforms, result, ids)
|
|
508
508
|
val = _apply_transform_chain(raw, transforms, rule.get("transform"))
|
|
509
|
+
elif "const" in rule:
|
|
510
|
+
val = _apply_transform_chain(rule.get("const"), transforms, rule.get("transform"))
|
|
511
|
+
elif "ref" in rule:
|
|
512
|
+
val = _apply_transform_chain(_get_nested(result, rule["ref"]), transforms, rule.get("transform"))
|
|
513
|
+
else:
|
|
514
|
+
val = _apply_transform_chain(rule.get("default"), transforms, rule.get("transform"))
|
|
509
515
|
|
|
510
516
|
if "." in out_key:
|
|
511
517
|
_set_nested(result, out_key, val)
|
|
@@ -670,34 +676,95 @@ def _apply_map_rules(
|
|
|
670
676
|
|
|
671
677
|
def _normalize_map_rules(raw_rule: Any) -> List[Dict[str, Any]]:
|
|
672
678
|
if isinstance(raw_rule, list):
|
|
673
|
-
|
|
679
|
+
rules = [dict(rule) for rule in raw_rule if isinstance(rule, Mapping)]
|
|
680
|
+
return _expand_case_rules(rules)
|
|
674
681
|
if isinstance(raw_rule, Mapping):
|
|
675
|
-
return [dict(raw_rule)]
|
|
682
|
+
return _expand_case_rules([dict(raw_rule)])
|
|
676
683
|
raise ValueError("Map rule must be a mapping or list of mappings.")
|
|
677
684
|
|
|
678
685
|
|
|
679
686
|
def _is_selector_rule(raw_rule: Any) -> bool:
|
|
680
|
-
|
|
681
|
-
return bool(raw_rule.get("selector"))
|
|
682
|
-
if isinstance(raw_rule, list):
|
|
683
|
-
return any(isinstance(rule, Mapping) and rule.get("selector") for rule in raw_rule)
|
|
684
|
-
return False
|
|
687
|
+
return any(rule.get("selector") for rule in _iter_rule_objects(raw_rule))
|
|
685
688
|
|
|
686
689
|
|
|
687
690
|
def _rule_targets(raw_rule: Any) -> Set[str]:
|
|
688
691
|
targets: Set[str] = set()
|
|
689
|
-
|
|
690
|
-
value =
|
|
692
|
+
for rule in _iter_rule_objects(raw_rule):
|
|
693
|
+
value = rule.get("target")
|
|
691
694
|
if isinstance(value, str):
|
|
692
695
|
targets.add(value)
|
|
696
|
+
return targets
|
|
697
|
+
|
|
698
|
+
|
|
699
|
+
def _iter_rule_objects(raw_rule: Any) -> Iterable[Mapping[str, Any]]:
|
|
700
|
+
if isinstance(raw_rule, Mapping):
|
|
701
|
+
yield raw_rule
|
|
702
|
+
cases = raw_rule.get("cases")
|
|
703
|
+
if isinstance(cases, list):
|
|
704
|
+
for case in cases:
|
|
705
|
+
yield from _iter_rule_objects(case)
|
|
693
706
|
elif isinstance(raw_rule, list):
|
|
694
707
|
for rule in raw_rule:
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
708
|
+
yield from _iter_rule_objects(rule)
|
|
709
|
+
|
|
710
|
+
|
|
711
|
+
def _expand_case_rules(rules: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
|
712
|
+
expanded: List[Dict[str, Any]] = []
|
|
713
|
+
for rule in rules:
|
|
714
|
+
expanded.extend(_expand_rule_cases(rule))
|
|
715
|
+
return expanded
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
def _expand_rule_cases(rule: Dict[str, Any]) -> List[Dict[str, Any]]:
|
|
719
|
+
cases = rule.get("cases")
|
|
720
|
+
if not isinstance(cases, list):
|
|
721
|
+
return [dict(rule)]
|
|
722
|
+
parent = dict(rule)
|
|
723
|
+
parent.pop("cases", None)
|
|
724
|
+
expanded: List[Dict[str, Any]] = []
|
|
725
|
+
for case in cases:
|
|
726
|
+
if not isinstance(case, Mapping):
|
|
727
|
+
continue
|
|
728
|
+
merged = _merge_case_rule(parent, case)
|
|
729
|
+
if "cases" in merged:
|
|
730
|
+
expanded.extend(_expand_rule_cases(merged))
|
|
731
|
+
else:
|
|
732
|
+
expanded.append(merged)
|
|
733
|
+
if _rule_has_value(parent):
|
|
734
|
+
expanded.append(parent)
|
|
735
|
+
return expanded
|
|
736
|
+
|
|
737
|
+
|
|
738
|
+
def _merge_case_rule(parent: Mapping[str, Any], case: Mapping[str, Any]) -> Dict[str, Any]:
|
|
739
|
+
merged = dict(parent)
|
|
740
|
+
parent_when = parent.get("when")
|
|
741
|
+
case_when = case.get("when")
|
|
742
|
+
if isinstance(parent_when, Mapping) and isinstance(case_when, Mapping):
|
|
743
|
+
merged["when"] = {**parent_when, **case_when}
|
|
744
|
+
elif case_when is not None:
|
|
745
|
+
merged["when"] = case_when
|
|
746
|
+
elif parent_when is not None:
|
|
747
|
+
merged["when"] = parent_when
|
|
748
|
+
for key, value in case.items():
|
|
749
|
+
if key == "when":
|
|
750
|
+
continue
|
|
751
|
+
merged[key] = value
|
|
752
|
+
return merged
|
|
753
|
+
|
|
754
|
+
|
|
755
|
+
def _rule_has_value(rule: Mapping[str, Any]) -> bool:
|
|
756
|
+
if "value" in rule:
|
|
757
|
+
return True
|
|
758
|
+
if "values" in rule:
|
|
759
|
+
return isinstance(rule.get("values"), Mapping)
|
|
760
|
+
if "default" in rule and "when" not in rule:
|
|
761
|
+
return True
|
|
762
|
+
rule_type = rule.get("type")
|
|
763
|
+
if rule_type == "const":
|
|
764
|
+
return "value" in rule
|
|
765
|
+
if rule_type == "mapping":
|
|
766
|
+
return isinstance(rule.get("values"), Mapping)
|
|
767
|
+
return False
|
|
701
768
|
|
|
702
769
|
|
|
703
770
|
def _rule_applies_to_target(raw_rule: Any, target: Optional[str]) -> bool:
|
|
@@ -14,7 +14,7 @@ import yaml
|
|
|
14
14
|
from ..meta import validate_meta
|
|
15
15
|
|
|
16
16
|
_ALLOWED_FILES = {"method", "acqp", "visu_pars", "reco", "subject"}
|
|
17
|
-
_RULE_KEYS = {"sources", "inputs", "transform", "default"}
|
|
17
|
+
_RULE_KEYS = {"sources", "inputs", "const", "ref", "transform", "default"}
|
|
18
18
|
_INPUT_KEYS = {"sources", "const", "ref", "transform", "default", "required"}
|
|
19
19
|
_INLINE_SOURCE_KEYS = {"inputs", "transform"}
|
|
20
20
|
_META_KEY = "__meta__"
|
|
@@ -154,12 +154,14 @@ def _validate_spec_minimal(spec: Any) -> List[str]:
|
|
|
154
154
|
extra = set(rule.keys()) - _RULE_KEYS
|
|
155
155
|
if extra:
|
|
156
156
|
errors.append(f"{path}: unexpected keys {sorted(extra)}.")
|
|
157
|
-
if not any(k in rule for k in ("sources", "inputs")):
|
|
158
|
-
errors.append(f"{path}: requires sources or
|
|
157
|
+
if not any(k in rule for k in ("sources", "inputs", "const", "ref")):
|
|
158
|
+
errors.append(f"{path}: requires sources, inputs, const, or ref.")
|
|
159
159
|
if "sources" in rule:
|
|
160
160
|
_validate_sources(rule["sources"], path, errors)
|
|
161
161
|
if "inputs" in rule:
|
|
162
162
|
_validate_inputs(rule["inputs"], path, errors)
|
|
163
|
+
if "ref" in rule and not isinstance(rule["ref"], str):
|
|
164
|
+
errors.append(f"{path}: ref must be a string.")
|
|
163
165
|
if "transform" in rule:
|
|
164
166
|
t = rule["transform"]
|
|
165
167
|
if isinstance(t, list):
|
|
@@ -230,11 +232,25 @@ def _validate_map_minimal(map_data: Any) -> List[str]:
|
|
|
230
232
|
return errors
|
|
231
233
|
|
|
232
234
|
|
|
233
|
-
def _validate_map_rule(
|
|
235
|
+
def _validate_map_rule(
|
|
236
|
+
rule: Any,
|
|
237
|
+
key: str,
|
|
238
|
+
errors: List[str],
|
|
239
|
+
*,
|
|
240
|
+
idx: Optional[Union[int, str]],
|
|
241
|
+
) -> None:
|
|
234
242
|
label = f"map[{key!r}]" if idx is None else f"map[{key!r}][{idx}]"
|
|
235
243
|
if not isinstance(rule, dict):
|
|
236
244
|
errors.append(f"{label}: rule must be a mapping.")
|
|
237
245
|
return
|
|
246
|
+
cases = rule.get("cases")
|
|
247
|
+
if cases is not None:
|
|
248
|
+
if not isinstance(cases, list):
|
|
249
|
+
errors.append(f"{label}: cases must be a list.")
|
|
250
|
+
else:
|
|
251
|
+
for case_idx, case in enumerate(cases):
|
|
252
|
+
nested = f"{idx}.cases[{case_idx}]" if idx is not None else f"cases[{case_idx}]"
|
|
253
|
+
_validate_map_rule(case, key, errors, idx=nested)
|
|
238
254
|
rule_type = rule.get("type")
|
|
239
255
|
if rule_type is None:
|
|
240
256
|
if "values" in rule:
|
|
@@ -245,7 +261,7 @@ def _validate_map_rule(rule: Any, key: str, errors: List[str], *, idx: Optional[
|
|
|
245
261
|
errors.append(f"{label}: invalid type {rule_type!r}.")
|
|
246
262
|
if rule_type == "mapping":
|
|
247
263
|
table = rule.get("values")
|
|
248
|
-
if not isinstance(table, dict):
|
|
264
|
+
if not isinstance(table, dict) and cases is None:
|
|
249
265
|
errors.append(f"{label}: values must be a mapping.")
|
|
250
266
|
when = rule.get("when")
|
|
251
267
|
if when is not None and not isinstance(when, dict):
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: brkraw
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.1
|
|
4
4
|
Summary: Toolkit for loading Bruker Paravision datasets, mapping metadata, and exporting NIfTI
|
|
5
5
|
Project-URL: Homepage, https://brkraw.github.io
|
|
6
6
|
Maintainer-email: SungHo Lee <shlee@unc.edu>
|
|
7
7
|
License: GNLv3
|
|
8
8
|
License-File: LICENSE
|
|
9
9
|
Keywords: bruker,cli,conversion,dataset,mri,neuroimaging,nifti,paravision,preclinical
|
|
10
|
-
Classifier: Development Status ::
|
|
10
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
11
11
|
Classifier: Intended Audience :: Science/Research
|
|
12
12
|
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
13
13
|
Classifier: Natural Language :: English
|
|
@@ -44,11 +44,38 @@ Description-Content-Type: text/markdown
|
|
|
44
44
|
</picture>
|
|
45
45
|
<!-- markdownlint-enable MD041 MD033 MD013 -->
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
[](https://doi.org/10.5281/zenodo.3818614)
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
A modular toolkit for Bruker MRI raw-data handling.
|
|
50
|
+
|
|
51
|
+
BrkRaw (v0.5.1) converts raw data into standardized, neuroimaging-ready
|
|
50
52
|
datasets, with extensible rules/specs and plugin hooks.
|
|
51
53
|
|
|
52
54
|
- Documentation: [brkraw.github.io](https://brkraw.github.io/)
|
|
53
55
|
- Releases: [BrkRaw/brkraw releases](https://github.com/BrkRaw/brkraw/releases)
|
|
54
56
|
- PyPI: [brkraw on PyPI](https://pypi.org/project/brkraw/)
|
|
57
|
+
|
|
58
|
+
## Citation
|
|
59
|
+
|
|
60
|
+
If you use BrkRaw in your research, please cite it.
|
|
61
|
+
|
|
62
|
+
- Citation metadata: [CITATION.cff](./CITATION.cff)
|
|
63
|
+
- DOI (Zenodo): [10.5281/zenodo.3818614](https://doi.org/10.5281/zenodo.3818614)
|
|
64
|
+
|
|
65
|
+
### Cite as (BibTeX)
|
|
66
|
+
|
|
67
|
+
<!-- BEGIN: brkraw-bibtex -->
|
|
68
|
+
```biblatex
|
|
69
|
+
@software{brkraw_2026,
|
|
70
|
+
author = {Lee, Sung-Ho and Devenyi, Gabriel A and Ban, Woomi and Shih, Yen-Yu Ian},
|
|
71
|
+
title = {BrkRaw: A modular toolkit for Bruker MRI raw-data handling},
|
|
72
|
+
year = {2026},
|
|
73
|
+
version = {0.5.0},
|
|
74
|
+
doi = {10.5281/zenodo.3818614},
|
|
75
|
+
url = {https://github.com/BrkRaw/brkraw},
|
|
76
|
+
note = {Documentation: https://brkraw.github.io},
|
|
77
|
+
license = {GPL-3.0-only},
|
|
78
|
+
date = {2026-01-13}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
<!-- END: brkraw-bibtex -->
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
brkraw/__init__.py,sha256=
|
|
1
|
+
brkraw/__init__.py,sha256=xRDzaw80M_f5rceXUn0qFpdFc04QizjLqQ4XnZjM1iw,210
|
|
2
2
|
brkraw/apps/__init__.py,sha256=sEdA1SrY-Vu0xU1ct5Eab7vX-_IFMDip2j3FdSQVT58,170
|
|
3
3
|
brkraw/apps/addon/__init__.py,sha256=fUR1QNwiaqSbkMIkPxLjKC7mJifR6HhrM8TO7lTo7Mg,531
|
|
4
4
|
brkraw/apps/addon/core.py,sha256=xVlTElgOHNnoy3avNoeOudOvQSDzvuVsmGq9IVKNINc,659
|
|
@@ -6,38 +6,39 @@ brkraw/apps/addon/dependencies.py,sha256=Hhujlqmy3DdlLfAM250r3kcl9iX2Lj4eDHBCw0T
|
|
|
6
6
|
brkraw/apps/addon/installation.py,sha256=LeciuHv_5ENg3OjzKClgIMAg3mYs8h3VUvFXmX6_Nao,18144
|
|
7
7
|
brkraw/apps/addon/io.py,sha256=bjgwl0T1tsL02aAJtScLw3fnh2PfOlmK5aGAQj6WF8Y,413
|
|
8
8
|
brkraw/apps/hook/__init__.py,sha256=W3xf6VmPZkVtQMwnYIrl626fnlck6bO20St0C45tMNY,398
|
|
9
|
-
brkraw/apps/hook/core.py,sha256=
|
|
9
|
+
brkraw/apps/hook/core.py,sha256=z6PpwHYYESJD8EO__qVsXZj31YqP5JSSmNHYVHZRCnk,20720
|
|
10
10
|
brkraw/apps/loader/__init__.py,sha256=ytG3wTI3mRHxkLkZ3GNYA6LJduplYgUinZBMuJJkeMQ,163
|
|
11
|
-
brkraw/apps/loader/core.py,sha256=
|
|
11
|
+
brkraw/apps/loader/core.py,sha256=hyc7gk-Bl5g5_bMUdnSY99xjjY9YOt3P0o25QIo0zzE,23268
|
|
12
12
|
brkraw/apps/loader/formatter.py,sha256=WWVCVKdZl6vdyKPCW6rLRmwKuF1cCTTNMPP0vmyBF6Y,9341
|
|
13
|
-
brkraw/apps/loader/helper.py,sha256=
|
|
14
|
-
brkraw/apps/loader/types.py,sha256=
|
|
13
|
+
brkraw/apps/loader/helper.py,sha256=Vf8nqgH3KBGIf74f52wcnB1rINEVViUM2O4W8FeGmNs,27879
|
|
14
|
+
brkraw/apps/loader/types.py,sha256=F3EXtV5vEYlHvCBRwjlz3iaTaJiSe7CYC6IayP_bbug,6825
|
|
15
15
|
brkraw/apps/loader/info/__init__.py,sha256=1tWVkBakwf3LZK-FwsMrt10fkkdz9cWw1j-Y4Dk6Lio,164
|
|
16
|
-
brkraw/apps/loader/info/scan.py,sha256=
|
|
16
|
+
brkraw/apps/loader/info/scan.py,sha256=_oLBG7YlwVUv1vWXBvCZbXQiMvC1ARKCRNTvrAkqO0U,2849
|
|
17
17
|
brkraw/apps/loader/info/scan.yaml,sha256=tYyGRg4t_rf6jGZAT8F0_dUA9MlQeZ5zeOuTNQ2wQM8,1728
|
|
18
18
|
brkraw/apps/loader/info/study.py,sha256=0_5gUlDOd5xsmXaYF9pyhwUKsq3-oCZ5SMvH6RqlPp4,2743
|
|
19
19
|
brkraw/apps/loader/info/study.yaml,sha256=M_wAy-B-4SErZ610KSNiqUW8aotorXkomymMYFdlyJw,3713
|
|
20
20
|
brkraw/apps/loader/info/transform.py,sha256=vHYBvRbgRfLBPr1-NMUijiJ_p7S2iJ-SPuZsV4rEWqI,2577
|
|
21
21
|
brkraw/cli/__init__.py,sha256=Z97T007Iut9FMPWTRa7MDcUhd9uQhhQ0qmRJ1H4owlw,89
|
|
22
|
+
brkraw/cli/hook_args.py,sha256=B2CKdSmZqSoQaBW4SMtjCXLLheDt-NJ1VwgvGp4Mtzw,2625
|
|
22
23
|
brkraw/cli/main.py,sha256=aqfLycTR_3F-uIEmFi62Q1OUxQ_wwlmQfw-lRfCdPgU,2659
|
|
23
24
|
brkraw/cli/utils.py,sha256=Ii14ZqIVqDx-pIrRAtBrL50yzfEQcQZRtJSRWZ211mE,1348
|
|
24
25
|
brkraw/cli/commands/__init__.py,sha256=PHh4jqD7i0aL8W8hXThczKcT4xsNZiXanBxOH5IOW5I,36
|
|
25
26
|
brkraw/cli/commands/addon.py,sha256=yUK30gQ0AGse1WDifW5DLUCg84RlWGemid0uNVOnxzU,11179
|
|
26
27
|
brkraw/cli/commands/config.py,sha256=bcbLQpb7Vw_imYwQsds4ZbWAOtgj_Dw3ojmFN4UmMBs,6471
|
|
27
|
-
brkraw/cli/commands/convert.py,sha256=
|
|
28
|
-
brkraw/cli/commands/hook.py,sha256=
|
|
28
|
+
brkraw/cli/commands/convert.py,sha256=8mkJYZCFXKahqqOIN_C4W7F_qbcwR0idYy40cdhZILU,30615
|
|
29
|
+
brkraw/cli/commands/hook.py,sha256=nPGIVMlWrpIJDCMdJABKGzV4HcuBdC3bLIh8cqJ8He4,11925
|
|
29
30
|
brkraw/cli/commands/info.py,sha256=fwojS5GlEf2upY3v5-ueQQQf9CPWTn46-1-tub2gnxQ,2251
|
|
30
31
|
brkraw/cli/commands/init.py,sha256=FLOimOmZbkrCRjTm0iJ8_w8o027He5dzbl3UT2Zu72U,6957
|
|
31
32
|
brkraw/cli/commands/params.py,sha256=5z_2O24IrUL-_AEjHIzjZHA_89piDHtXkxHkd7C12D0,3159
|
|
32
33
|
brkraw/cli/commands/prune.py,sha256=Sl8Zl78PAGtRvDB6HH-CqcDr4NBfXSrf8602ZAKL7nM,8798
|
|
33
|
-
brkraw/cli/commands/session.py,sha256=
|
|
34
|
+
brkraw/cli/commands/session.py,sha256=COEjRwy-Z-Y9_-SZVAwUsIpDutXQ0UQ1baMNvjN6jYU,12749
|
|
34
35
|
brkraw/core/__init__.py,sha256=9UPOF5mtjZdGgjQ6-JJJs-eg8CGl4BuV7flGDWKgCBg,218
|
|
35
|
-
brkraw/core/config.py,sha256=
|
|
36
|
+
brkraw/core/config.py,sha256=fohxJOoBruBrdzFIrXmBmZE5AW9EpnTOLAr3am8xDM8,11820
|
|
36
37
|
brkraw/core/entrypoints.py,sha256=OqEvqBna7fTjR8MofIGJE80EzxL0WUYxeiJEUlQjfR8,880
|
|
37
38
|
brkraw/core/formatter.py,sha256=5OcJOkQ3mcoRqt6SPib01fA5riObL1wbiJL4rsNwFEw,11387
|
|
38
39
|
brkraw/core/fs.py,sha256=IMhdguizZEcrpcx9eb41MKJnfMoLuvoWDhVmV83mW9M,17337
|
|
39
40
|
brkraw/core/jcamp.py,sha256=TaI-SrhoAA1tXpiVzVqn83NV0OHxTO0tAf_k1YXIWFE,17626
|
|
40
|
-
brkraw/core/layout.py,sha256=
|
|
41
|
+
brkraw/core/layout.py,sha256=F69Wglkp-3M7LNP3162cU17rWcQ7MSYenFSvXgyJUGY,14253
|
|
41
42
|
brkraw/core/parameters.py,sha256=_Nl7K0yT149tm0c2SXQbYWhZD5z29ySbZPc78d7zOU8,27983
|
|
42
43
|
brkraw/core/zip.py,sha256=m0mixVf4bb116QzAF_3o6-3EDCeq53JhjfKq0NLl5K0,37805
|
|
43
44
|
brkraw/dataclasses/__init__.py,sha256=cAYJ_XqyHtpK9OaLaXsjwySbWuIkznrTGa68OnKZFxs,211
|
|
@@ -47,16 +48,11 @@ brkraw/dataclasses/scan.py,sha256=VjmT8depuYJzeI4E2sduut-cLZiqf_fIUe06wbvW108,19
|
|
|
47
48
|
brkraw/dataclasses/study.py,sha256=2qGDDQQgJMHDENVCug_iJ5fUwGLhVhRLwrbgzP60r0g,4540
|
|
48
49
|
brkraw/default/__init__.py,sha256=eEYYkxX5Hz9woXVOBJ2H2_CQoEih0vH6nRt3sH2Z8v8,49
|
|
49
50
|
brkraw/default/pruner_specs/deid4share.yaml,sha256=TnQrlF9GGub5wiJ81SQOXALvLfJWHynxY-ZoQ8y_oZs,949
|
|
50
|
-
brkraw/default/rules/
|
|
51
|
-
brkraw/default/
|
|
52
|
-
brkraw/default/specs/
|
|
53
|
-
brkraw/default/specs/metadata_common.yaml,sha256=pDcwHa-f2d2v9X_3UHmwoYkiHNFkxThyEZUyzPUrIxQ,2443
|
|
54
|
-
brkraw/default/specs/metadata_func.yaml,sha256=IK8f5zRmopxqyRKgkAHj6sqDjfm7plKQ5Q9mTLpFJoI,2059
|
|
55
|
-
brkraw/default/specs/metadata_transforms.py,sha256=mfb9ogfxd0VzZmxmXf57AK2iGIrktTnMWakiLKSVCkk,1745
|
|
56
|
-
brkraw/default/specs/mrs.yaml,sha256=7r0CXTe6pBxrmTqg2JCjamwPTSDepfHj37T28z8jG1o,1246
|
|
57
|
-
brkraw/default/specs/mrs_transforms.py,sha256=3dxfv1-yfnowOWCacXp2Ucy7tc_MpgxMn2Hh4MVPSSQ,622
|
|
51
|
+
brkraw/default/rules/00_default.yaml,sha256=a4PZOR0oam0ziZqLsvaQZqwoDu-uXbPVdxJcm9rSy0o,140
|
|
52
|
+
brkraw/default/specs/metadata_dicom.yaml,sha256=grrwGOBIIEUJPTs6vktWydnEsvBTjbgwez0190Q8ma0,4295
|
|
53
|
+
brkraw/default/specs/metadata_transforms.py,sha256=illM4MKwwz-6PPKLrIno5lba1f5zKC8y09PAR5gCH1o,2383
|
|
58
54
|
brkraw/resolver/__init__.py,sha256=2vz8b135CA4aebHUHSc2Hgtc3Ko2-qbdAxfTnUtTeGk,84
|
|
59
|
-
brkraw/resolver/affine.py,sha256=
|
|
55
|
+
brkraw/resolver/affine.py,sha256=s7vm30C5fkmOMTuY-Bc5lZeE3Wy4pbHydL1V4gzkDB4,19501
|
|
60
56
|
brkraw/resolver/datatype.py,sha256=Kp-_-_JDfCh4io19Vw4YiAVTjWgaFAkxkO7ZDDglAKY,2155
|
|
61
57
|
brkraw/resolver/fid.py,sha256=SXglNSD6hFK7pAoHrUvuNbCYPgIAvbRdh6PACp7Oz7g,2847
|
|
62
58
|
brkraw/resolver/helpers.py,sha256=BpL-zpbtGae6n-XQOmD5qP7KrD5HFnElzAD3bcBq0J4,1029
|
|
@@ -64,29 +60,29 @@ brkraw/resolver/image.py,sha256=01mqBVFfoY2Z0V60k3G0qTKpEH-lqRCaSdkZ7pj7Bb8,6735
|
|
|
64
60
|
brkraw/resolver/nifti.py,sha256=otqjDeRZMpplC6Z_uxWMjKoNtxvQyELvwK-ZbVMTuf8,12870
|
|
65
61
|
brkraw/resolver/shape.py,sha256=r2sQpgKGMN0nmBPj9_LTt7d3ls-y4R8n1HIMDvpNdfk,8110
|
|
66
62
|
brkraw/schema/__init__.py,sha256=eEYYkxX5Hz9woXVOBJ2H2_CQoEih0vH6nRt3sH2Z8v8,49
|
|
67
|
-
brkraw/schema/context_map.yaml,sha256=
|
|
63
|
+
brkraw/schema/context_map.yaml,sha256=OUtoa7NgQZ7ytUe8zuNiJ5ratt1p0DRrrfDAP5Kthqs,1798
|
|
68
64
|
brkraw/schema/meta.yaml,sha256=ePnTt7jD00lMKob6MPoziws9eYOWa-BX2MrVrIMSo90,1042
|
|
69
65
|
brkraw/schema/niftiheader.yaml,sha256=Hj7eQNyLbyuT__-jznzAB15JIP9ArRhBGvJstZFGNZg,1499
|
|
70
66
|
brkraw/schema/pruner.yaml,sha256=bTmxvs5naAt_CsPQC-nIUEF5aL2T-iWUWGhg05ug_Ic,1023
|
|
71
|
-
brkraw/schema/remapper.yaml,sha256=
|
|
67
|
+
brkraw/schema/remapper.yaml,sha256=qIGiT6DqrJ2AK8g7gHj7Cc6GmQIT47VPaB2nRvnNc8k,3622
|
|
72
68
|
brkraw/schema/rules.yaml,sha256=G9iOoy6B4yyzCAOVpinrrHSXa9QMJj0U_fY8C_mCq7I,2901
|
|
73
|
-
brkraw/specs/__init__.py,sha256=
|
|
74
|
-
brkraw/specs/
|
|
75
|
-
brkraw/specs/
|
|
76
|
-
brkraw/specs/
|
|
69
|
+
brkraw/specs/__init__.py,sha256=ELdbEBR9guezmc7FS21JXRqjZ1E1FaUCjI3lQi5V4Dw,150
|
|
70
|
+
brkraw/specs/hook/__init__.py,sha256=a9cQPvtgUzO7_KeFM0lP8zFgtzOqgMP5e8gyHNX1pRA,236
|
|
71
|
+
brkraw/specs/hook/logic.py,sha256=5cg1Sq-0VJgyqfmLR7AmDNxqYIv1IatsfhQYN44FkNQ,801
|
|
72
|
+
brkraw/specs/hook/validator.py,sha256=x1ibsBUaPpX4cNCKOIoxplIVrXO-R_I0lc3jYKZPA6c,765
|
|
77
73
|
brkraw/specs/meta/__init__.py,sha256=UbqZCVZEfI_KRCuUEGeD50m8k87PhRtqK_bbQesO3JA,102
|
|
78
74
|
brkraw/specs/meta/validator.py,sha256=wvcT20sf9dQszhgPIyXCdjmgZpeTXi796yFxksudKfA,5561
|
|
79
75
|
brkraw/specs/pruner/__init__.py,sha256=TPeWLvjZY5z5h10fEY1LccLmyAfIe0wLuZk11chjBXQ,316
|
|
80
76
|
brkraw/specs/pruner/logic.py,sha256=c6mSST6yTgwJD75ORI-G4EtC4Txgbdhu-P0xdzjsxMA,13070
|
|
81
77
|
brkraw/specs/pruner/validator.py,sha256=prGb55BixiiztbmLSo6x3OfFvwrEP-mjtOvXUwySMXk,4009
|
|
82
78
|
brkraw/specs/remapper/__init__.py,sha256=DXzO8lxlCxfsswPVmPlJgDtbt-Gd_2N9qW_lgbd2V8c,626
|
|
83
|
-
brkraw/specs/remapper/logic.py,sha256=
|
|
84
|
-
brkraw/specs/remapper/validator.py,sha256=
|
|
79
|
+
brkraw/specs/remapper/logic.py,sha256=dWDg06DNRIU3qssX6Iy1g7o5uvqNk7nW4QqrLgZqoQA,30822
|
|
80
|
+
brkraw/specs/remapper/validator.py,sha256=R-Pib4MCgUVYAvAAoFR04bF-j7TDaePj-jGaxO9uhOU,12208
|
|
85
81
|
brkraw/specs/rules/__init__.py,sha256=oF1ury9vxTYMlTgz9Yo9um8jRAzaJeTMwjAcDLV-KOE,214
|
|
86
82
|
brkraw/specs/rules/logic.py,sha256=w-NstF6o91EfLU2Ho00i8kbvvd7d8yrinPd83UnAW2c,9175
|
|
87
83
|
brkraw/specs/rules/validator.py,sha256=AHS-r-E0HGHxwhhU48nCyS6LQvllQCgXLS_NDXBm3-k,3508
|
|
88
|
-
brkraw-0.5.
|
|
89
|
-
brkraw-0.5.
|
|
90
|
-
brkraw-0.5.
|
|
91
|
-
brkraw-0.5.
|
|
92
|
-
brkraw-0.5.
|
|
84
|
+
brkraw-0.5.1.dist-info/METADATA,sha256=D6mXGLxZbPvEs1uW1GNaqzGi6fmN9DJvpD0eY3KejEY,3075
|
|
85
|
+
brkraw-0.5.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
86
|
+
brkraw-0.5.1.dist-info/entry_points.txt,sha256=Qd3qG3g8GmGZUlV0gUP7WVpN_ulVn8Qw3l-O-stWxO0,450
|
|
87
|
+
brkraw-0.5.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
88
|
+
brkraw-0.5.1.dist-info/RECORD,,
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
metadata_spec:
|
|
2
|
-
- name: "metadata-common"
|
|
3
|
-
description: "Default metadata mapping for Bruker scans."
|
|
4
|
-
use: "specs/metadata_common.yaml"
|
|
5
|
-
|
|
6
|
-
- name: "metadata-anat"
|
|
7
|
-
description: "Anatomical metadata mapping for RARE/FLASH sequences."
|
|
8
|
-
when:
|
|
9
|
-
method:
|
|
10
|
-
sources:
|
|
11
|
-
- file: method
|
|
12
|
-
key: Method
|
|
13
|
-
transform: normalize_method
|
|
14
|
-
if:
|
|
15
|
-
any:
|
|
16
|
-
- contains: ["$method", "RARE"]
|
|
17
|
-
- contains: ["$method", "FLASH"]
|
|
18
|
-
use: "specs/metadata_anat.yaml"
|
|
19
|
-
|
|
20
|
-
- name: "metadata-func-epi"
|
|
21
|
-
description: "Functional metadata mapping for EPI with short TR."
|
|
22
|
-
when:
|
|
23
|
-
method:
|
|
24
|
-
sources:
|
|
25
|
-
- file: method
|
|
26
|
-
key: Method
|
|
27
|
-
transform: normalize_method
|
|
28
|
-
tr_sec:
|
|
29
|
-
sources:
|
|
30
|
-
- file: method
|
|
31
|
-
key: PVM_RepetitionTime
|
|
32
|
-
transform: first_seconds
|
|
33
|
-
num_repeats:
|
|
34
|
-
sources:
|
|
35
|
-
- file: method
|
|
36
|
-
key: PVM_NRepetitions
|
|
37
|
-
if:
|
|
38
|
-
all:
|
|
39
|
-
- contains: ["$method", "EPI"]
|
|
40
|
-
- le: ["$tr_sec", 4]
|
|
41
|
-
- gt: ["$num_repeats", 5]
|
|
42
|
-
use: "specs/metadata_func.yaml"
|
brkraw/default/rules/20-mrs.yaml
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
info_spec:
|
|
2
|
-
- name: "mrs-method"
|
|
3
|
-
description: "Use MRS info spec for PRESS/STEAM/SLASER sequences."
|
|
4
|
-
when:
|
|
5
|
-
method:
|
|
6
|
-
sources:
|
|
7
|
-
- file: method
|
|
8
|
-
key: Method
|
|
9
|
-
if:
|
|
10
|
-
any:
|
|
11
|
-
- contains: ["$method", "PRESS"]
|
|
12
|
-
- contains: ["$method", "STEAM"]
|
|
13
|
-
- contains: ["$method", "SLASER"]
|
|
14
|
-
use: "specs/mrs.yaml"
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
__meta__:
|
|
2
|
-
name: "metadata_anat"
|
|
3
|
-
version: "0.0.1"
|
|
4
|
-
description: "Anatomical metadata mapping for BIDS 1.10.1."
|
|
5
|
-
category: "metadata_spec"
|
|
6
|
-
include:
|
|
7
|
-
- "metadata_common.yaml"
|
|
8
|
-
|
|
9
|
-
RepetitionTime:
|
|
10
|
-
sources:
|
|
11
|
-
- file: visu_pars
|
|
12
|
-
key: VisuAcqRepetitionTime
|
|
13
|
-
transform: to_seconds
|
|
14
|
-
|
|
15
|
-
EchoTime:
|
|
16
|
-
sources:
|
|
17
|
-
- file: visu_pars
|
|
18
|
-
key: VisuAcqEchoTime
|
|
19
|
-
transform: to_seconds
|
|
20
|
-
|
|
21
|
-
InversionTime:
|
|
22
|
-
sources:
|
|
23
|
-
- file: visu_pars
|
|
24
|
-
key: VisuAcqInversionTime
|
|
25
|
-
transform: to_seconds
|
|
26
|
-
|
|
27
|
-
FlipAngle:
|
|
28
|
-
sources:
|
|
29
|
-
- file: visu_pars
|
|
30
|
-
key: VisuAcqFlipAngle
|
|
31
|
-
|
|
32
|
-
PhaseEncodingDirection:
|
|
33
|
-
inputs:
|
|
34
|
-
value:
|
|
35
|
-
const: null
|
|
36
|
-
transform: pick_value
|
|
37
|
-
|
|
38
|
-
EffectiveEchoSpacing:
|
|
39
|
-
inputs:
|
|
40
|
-
value:
|
|
41
|
-
const: null
|
|
42
|
-
transform: pick_value
|
|
43
|
-
|
|
44
|
-
TotalReadoutTime:
|
|
45
|
-
inputs:
|
|
46
|
-
value:
|
|
47
|
-
const: null
|
|
48
|
-
transform: pick_value
|
|
49
|
-
|
|
50
|
-
MultibandAccelerationFactor:
|
|
51
|
-
inputs:
|
|
52
|
-
value:
|
|
53
|
-
const: null
|
|
54
|
-
transform: pick_value
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
__meta__:
|
|
2
|
-
name: "metadata_common"
|
|
3
|
-
version: "0.0.1"
|
|
4
|
-
description: "Common BIDS 1.10.1 metadata mapping for Bruker PvDataset."
|
|
5
|
-
category: "metadata_spec"
|
|
6
|
-
transforms_source: "metadata_transforms.py"
|
|
7
|
-
|
|
8
|
-
Manufacturer:
|
|
9
|
-
sources:
|
|
10
|
-
- file: visu_pars
|
|
11
|
-
key: VisuManufacturer
|
|
12
|
-
transform: strip_jcamp_string
|
|
13
|
-
|
|
14
|
-
ManufacturersModelName:
|
|
15
|
-
sources:
|
|
16
|
-
- file: visu_pars
|
|
17
|
-
key: VisuStation
|
|
18
|
-
transform: strip_jcamp_string
|
|
19
|
-
|
|
20
|
-
DeviceSerialNumber:
|
|
21
|
-
sources:
|
|
22
|
-
- file: visu_pars
|
|
23
|
-
key: VisuSystemOrderNumber
|
|
24
|
-
|
|
25
|
-
StationName:
|
|
26
|
-
sources:
|
|
27
|
-
- file: visu_pars
|
|
28
|
-
key: VisuStation
|
|
29
|
-
transform: strip_jcamp_string
|
|
30
|
-
|
|
31
|
-
SoftwareVersions:
|
|
32
|
-
sources:
|
|
33
|
-
- file: visu_pars
|
|
34
|
-
key: VisuAcqSoftwareVersion
|
|
35
|
-
transform: strip_jcamp_string
|
|
36
|
-
|
|
37
|
-
MagneticFieldStrength:
|
|
38
|
-
inputs:
|
|
39
|
-
freq:
|
|
40
|
-
sources:
|
|
41
|
-
- file: visu_pars
|
|
42
|
-
key: VisuAcqImagingFrequency
|
|
43
|
-
transform: freq_to_field
|
|
44
|
-
|
|
45
|
-
ReceiveCoilName:
|
|
46
|
-
sources:
|
|
47
|
-
- file: visu_pars
|
|
48
|
-
key: VisuCoilReceiveName
|
|
49
|
-
transform: strip_jcamp_string
|
|
50
|
-
|
|
51
|
-
ReceiveCoilActiveElements:
|
|
52
|
-
sources:
|
|
53
|
-
- file: visu_pars
|
|
54
|
-
key: VisuCoilReceiveType
|
|
55
|
-
transform: strip_jcamp_string
|
|
56
|
-
|
|
57
|
-
TransmitCoilName:
|
|
58
|
-
sources:
|
|
59
|
-
- file: visu_pars
|
|
60
|
-
key: VisuCoilTransmitName
|
|
61
|
-
transform: strip_jcamp_string
|
|
62
|
-
|
|
63
|
-
CoilCombinationMethod:
|
|
64
|
-
inputs:
|
|
65
|
-
value:
|
|
66
|
-
const: null
|
|
67
|
-
transform: pick_value
|
|
68
|
-
|
|
69
|
-
GradientSetType:
|
|
70
|
-
sources:
|
|
71
|
-
- file: acqp
|
|
72
|
-
key: ACQ_status
|
|
73
|
-
transform: strip_jcamp_string
|
|
74
|
-
|
|
75
|
-
PulseSequenceType:
|
|
76
|
-
sources:
|
|
77
|
-
- file: method
|
|
78
|
-
key: PULPROG
|
|
79
|
-
transform: strip_jcamp_string
|
|
80
|
-
|
|
81
|
-
ScanningSequence:
|
|
82
|
-
sources:
|
|
83
|
-
- file: visu_pars
|
|
84
|
-
key: VisuAcqSequenceName
|
|
85
|
-
transform: strip_jcamp_string
|
|
86
|
-
|
|
87
|
-
SequenceVariant:
|
|
88
|
-
sources:
|
|
89
|
-
- file: visu_pars
|
|
90
|
-
key: VisuAcqEchoSequenceType
|
|
91
|
-
transform: strip_jcamp_string
|
|
92
|
-
|
|
93
|
-
SequenceName:
|
|
94
|
-
sources:
|
|
95
|
-
- file: visu_pars
|
|
96
|
-
key: VisuAcquisitionProtocol
|
|
97
|
-
- file: acqp
|
|
98
|
-
key: ACQ_protocol_name
|
|
99
|
-
transform: strip_jcamp_string
|
|
100
|
-
|
|
101
|
-
PulseSequenceDetails:
|
|
102
|
-
sources:
|
|
103
|
-
- file: acqp
|
|
104
|
-
key: ACQ_scan_name
|
|
105
|
-
transform: strip_jcamp_string
|
|
106
|
-
|
|
107
|
-
NonlinearGradientCorrection:
|
|
108
|
-
sources:
|
|
109
|
-
- file: visu_pars
|
|
110
|
-
key: VisuAcqKSpaceTraversal
|
|
111
|
-
transform: strip_jcamp_string
|
|
112
|
-
|
|
113
|
-
InstitutionName:
|
|
114
|
-
sources:
|
|
115
|
-
- file: visu_pars
|
|
116
|
-
key: VisuInstitution
|
|
117
|
-
transform: strip_jcamp_string
|
|
118
|
-
|
|
119
|
-
InstitutionAddress:
|
|
120
|
-
inputs:
|
|
121
|
-
value:
|
|
122
|
-
const: null
|
|
123
|
-
transform: pick_value
|
|
124
|
-
|
|
125
|
-
InstitutionalDepartmentName:
|
|
126
|
-
inputs:
|
|
127
|
-
value:
|
|
128
|
-
const: null
|
|
129
|
-
transform: pick_value
|