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.
Files changed (36) hide show
  1. brkraw/__init__.py +1 -1
  2. brkraw/apps/hook/core.py +58 -10
  3. brkraw/apps/loader/core.py +5 -1
  4. brkraw/apps/loader/helper.py +155 -14
  5. brkraw/apps/loader/info/scan.py +18 -5
  6. brkraw/apps/loader/types.py +6 -1
  7. brkraw/cli/commands/convert.py +201 -79
  8. brkraw/cli/commands/hook.py +146 -4
  9. brkraw/cli/commands/session.py +6 -1
  10. brkraw/cli/hook_args.py +80 -0
  11. brkraw/core/config.py +8 -0
  12. brkraw/core/layout.py +56 -11
  13. brkraw/default/rules/00_default.yaml +4 -0
  14. brkraw/default/specs/metadata_dicom.yaml +236 -0
  15. brkraw/default/specs/metadata_transforms.py +18 -0
  16. brkraw/resolver/affine.py +56 -32
  17. brkraw/schema/context_map.yaml +5 -0
  18. brkraw/schema/remapper.yaml +6 -0
  19. brkraw/specs/__init__.py +2 -2
  20. brkraw/specs/{converter → hook}/logic.py +1 -0
  21. brkraw/specs/{converter → hook}/validator.py +1 -0
  22. brkraw/specs/remapper/logic.py +83 -16
  23. brkraw/specs/remapper/validator.py +21 -5
  24. {brkraw-0.5.0rc1.dist-info → brkraw-0.5.1.dist-info}/METADATA +31 -4
  25. {brkraw-0.5.0rc1.dist-info → brkraw-0.5.1.dist-info}/RECORD +29 -33
  26. brkraw/default/rules/10-metadata.yaml +0 -42
  27. brkraw/default/rules/20-mrs.yaml +0 -14
  28. brkraw/default/specs/metadata_anat.yaml +0 -54
  29. brkraw/default/specs/metadata_common.yaml +0 -129
  30. brkraw/default/specs/metadata_func.yaml +0 -127
  31. brkraw/default/specs/mrs.yaml +0 -71
  32. brkraw/default/specs/mrs_transforms.py +0 -26
  33. brkraw/specs/{converter → hook}/__init__.py +1 -1
  34. {brkraw-0.5.0rc1.dist-info → brkraw-0.5.1.dist-info}/WHEEL +0 -0
  35. {brkraw-0.5.0rc1.dist-info → brkraw-0.5.1.dist-info}/entry_points.txt +0 -0
  36. {brkraw-0.5.0rc1.dist-info → brkraw-0.5.1.dist-info}/licenses/LICENSE +0 -0
@@ -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
- else:
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
- return [dict(rule) for rule in raw_rule if isinstance(rule, Mapping)]
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
- if isinstance(raw_rule, Mapping):
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
- if isinstance(raw_rule, Mapping):
690
- value = raw_rule.get("target")
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
- if not isinstance(rule, Mapping):
696
- continue
697
- value = rule.get("target")
698
- if isinstance(value, str):
699
- targets.add(value)
700
- return targets
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 inputs.")
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(rule: Any, key: str, errors: List[str], *, idx: Optional[int]) -> None:
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.0rc1
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 :: 4 - Beta
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
- A modular toolkit for preclinical MRI: from raw studies to reproducible outputs.
47
+ [![DOI](https://zenodo.org/badge/245546149.svg)](https://doi.org/10.5281/zenodo.3818614)
48
48
 
49
- BrkRaw (v0.5.0rc1) converts raw data into standardized, neuroimaging-ready
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=RABNSnaEeMIR7uEFu_8y-fnWcr5sWbz67mDhDH6gXOY,213
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=PkfhYtltZxRa2zRvj_nE8UCUjbJtBktSrxIxyXFBLE8,18906
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=DqEDNC8CIloKYCqxIo7yXpt8XNnu5G6Ru38SAnAGeAw,23119
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=yu3mOIRrJn4Yp1bzcrfmTwc2UUjsfQMsSBBARMTtP_A,22621
14
- brkraw/apps/loader/types.py,sha256=p2CcnmpNRgVB5HnqW8Y6AVjg--X4mgdsiEmFsoB_JOw,6685
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=CFVSml9bh3FUO6di7l8GGe94Ub0pwBcVQCh-JbsfF6A,2426
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=m_Yvqodqsf5K5UXiAhtMcPnTdUGRXlrqgvgovbtXfJ8,25487
28
- brkraw/cli/commands/hook.py,sha256=TSgaIfzOkTCzzrM_YhfWDAvAJGysVXX7onvKEdgL6ig,7306
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=GRlK3sdoxrHzznPMTDDDrnsNGJqpLv9ypwlO2ribtjo,12488
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=g8wg58wsTxSP0Lwk1i4Jx7Lm1lA6_8nbMZTzCGgSLsY,11556
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=_ulaH2m6ZdU1r_Y6s1u7vazMcs-WOqsoMi562C6LsHY,13118
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/10-metadata.yaml,sha256=dceK8nr-4o8v_n41RuH3py7V6G0aX0d7o3jmr1TDNZA,1109
51
- brkraw/default/rules/20-mrs.yaml,sha256=IghyjQV6YLnXiysa9WqO5hFsoCrPr2R2JPOUxHLIi5c,364
52
- brkraw/default/specs/metadata_anat.yaml,sha256=1JBxAFGbuON2OlFRcZg99LJBfVu141Z0pJ4qeRDwrqQ,912
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=V-UggK8sV8b4M0ODdu1Z0ohrViVM_rJ2CqI4n42Ahp8,18333
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=9Bw7RLHsSETVamR-a2VIgsW4XP4BHeYOYrl2of4IfBg,1638
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=TPSf94AAlN3PteFkOxVPkwwsvmic92zx-drx4v46wpU,3449
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=wrcF0sxdtYcf5RyMRjz5C8QPQr1A9oEtnVZnQzgKI0I,160
74
- brkraw/specs/converter/__init__.py,sha256=eMjazckpe8NYhHkNBVbomb9tC7KTHkYZC5eaGwASL_M,236
75
- brkraw/specs/converter/logic.py,sha256=GAogMBXP0JZv14HSYIgE4jYlIt8gw55mXSOCBFfOrDo,800
76
- brkraw/specs/converter/validator.py,sha256=lsqoV-V4o84T1QXk0GBlSuUrElYGb6EYOvZewaIw63Y,764
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=Ct4gbGv1LWmfb6KZTnEY9JkwxkaVolaW2Vo-0zw9Kxs,28478
84
- brkraw/specs/remapper/validator.py,sha256=W-9YLd-3UBgW0XdcG6HyHBLz5TAXF_MsjkXsjPFGec4,11601
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.0rc1.dist-info/METADATA,sha256=lLA9_Hg2WQgx8sVywwvaNnD6snIMOrEs7bBzgv0Z1Sc,2310
89
- brkraw-0.5.0rc1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
90
- brkraw-0.5.0rc1.dist-info/entry_points.txt,sha256=Qd3qG3g8GmGZUlV0gUP7WVpN_ulVn8Qw3l-O-stWxO0,450
91
- brkraw-0.5.0rc1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
92
- brkraw-0.5.0rc1.dist-info/RECORD,,
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"
@@ -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