brkraw 0.5.5__py3-none-any.whl → 0.5.7__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 CHANGED
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = '0.5.5'
3
+ __version__ = '0.5.7'
4
4
  from .apps.loader import BrukerLoader
5
5
 
6
6
 
@@ -17,11 +17,23 @@ RULE_KEYS = {"info_spec", "metadata_spec", "converter_hook"}
17
17
  _SPEC_EXTS = (".yaml", ".yml")
18
18
 
19
19
 
20
- def warn_dependencies(target: Path, *, kind: str, root: Optional[Union[str, Path]]) -> bool:
20
+ def warn_dependencies(
21
+ target: Path,
22
+ *,
23
+ kind: str,
24
+ root: Optional[Union[str, Path]],
25
+ ignore_rules_dir: Optional[Path] = None,
26
+ ignore_specs_dir: Optional[Path] = None,
27
+ ) -> bool:
21
28
  paths = config_core.paths(root=root)
22
29
  warned = False
23
30
  if kind == "spec":
24
- used_by_rules = rules_using_spec(target.name, paths.rules_dir)
31
+ used_by_rules = rules_using_spec(
32
+ target,
33
+ paths.rules_dir,
34
+ root=paths.root,
35
+ ignore_dir=ignore_rules_dir,
36
+ )
25
37
  if used_by_rules:
26
38
  logger.warning(
27
39
  "Spec %s is referenced by rules: %s",
@@ -29,7 +41,11 @@ def warn_dependencies(target: Path, *, kind: str, root: Optional[Union[str, Path
29
41
  ", ".join(sorted(used_by_rules)),
30
42
  )
31
43
  warned = True
32
- included_by = specs_including_spec(target.name, paths.specs_dir)
44
+ included_by = specs_including_spec(
45
+ target,
46
+ paths.specs_dir,
47
+ ignore_dir=ignore_specs_dir,
48
+ )
33
49
  if included_by:
34
50
  logger.warning(
35
51
  "Spec %s is included by: %s",
@@ -54,12 +70,34 @@ def warn_dependencies(target: Path, *, kind: str, root: Optional[Union[str, Path
54
70
  return warned
55
71
 
56
72
 
57
- def rules_using_spec(spec_name: str, rules_dir: Path) -> Set[str]:
73
+ def _is_under(path: Path, base: Optional[Path]) -> bool:
74
+ if base is None:
75
+ return False
76
+ try:
77
+ path.relative_to(base)
78
+ except ValueError:
79
+ return False
80
+ return True
81
+
82
+
83
+ def rules_using_spec(
84
+ target: Union[str, Path],
85
+ rules_dir: Path,
86
+ *,
87
+ root: Optional[Union[str, Path]] = None,
88
+ ignore_dir: Optional[Path] = None,
89
+ ) -> Set[str]:
58
90
  used_by: Set[str] = set()
59
91
  if not rules_dir.exists():
60
92
  return used_by
93
+ if isinstance(target, Path):
94
+ target_path = target.resolve()
95
+ else:
96
+ target_path = None
61
97
  files = list(rules_dir.rglob("*.yaml")) + list(rules_dir.rglob("*.yml"))
62
98
  for path in files:
99
+ if _is_under(path, ignore_dir):
100
+ continue
63
101
  data = yaml.safe_load(path.read_text(encoding="utf-8"))
64
102
  if not isinstance(data, dict):
65
103
  continue
@@ -70,17 +108,46 @@ def rules_using_spec(spec_name: str, rules_dir: Path) -> Set[str]:
70
108
  if not isinstance(item, dict):
71
109
  continue
72
110
  use = item.get("use")
73
- if isinstance(use, str) and Path(use).name == spec_name:
111
+ if not isinstance(use, str):
112
+ continue
113
+ if target_path is None:
114
+ if Path(use).name == str(target):
115
+ used_by.add(path.name)
116
+ continue
117
+ if root is None:
118
+ continue
119
+ version = item.get("version") if isinstance(item.get("version"), str) else None
120
+ try:
121
+ resolved = resolve_spec_reference(
122
+ use,
123
+ category=key,
124
+ version=version,
125
+ root=root,
126
+ )
127
+ except Exception:
128
+ continue
129
+ if resolved.resolve() == target_path:
74
130
  used_by.add(path.name)
75
131
  return used_by
76
132
 
77
133
 
78
- def specs_including_spec(spec_name: str, specs_dir: Path) -> Set[str]:
134
+ def specs_including_spec(
135
+ target: Union[str, Path],
136
+ specs_dir: Path,
137
+ *,
138
+ ignore_dir: Optional[Path] = None,
139
+ ) -> Set[str]:
79
140
  included_by: Set[str] = set()
80
141
  if not specs_dir.exists():
81
142
  return included_by
143
+ if isinstance(target, Path):
144
+ target_path = target.resolve()
145
+ else:
146
+ target_path = None
82
147
  files = list(specs_dir.rglob("*.yaml")) + list(specs_dir.rglob("*.yml"))
83
148
  for path in files:
149
+ if _is_under(path, ignore_dir):
150
+ continue
84
151
  data = yaml.safe_load(path.read_text(encoding="utf-8"))
85
152
  if not isinstance(data, dict):
86
153
  continue
@@ -92,8 +159,17 @@ def specs_including_spec(spec_name: str, specs_dir: Path) -> Set[str]:
92
159
  include_list = [include]
93
160
  elif isinstance(include, list) and all(isinstance(item, str) for item in include):
94
161
  include_list = include
95
- if any(Path(item).name == spec_name for item in include_list):
96
- included_by.add(path.name)
162
+ for item in include_list:
163
+ inc_path = Path(item)
164
+ if not inc_path.is_absolute():
165
+ inc_path = (path.parent / inc_path).resolve()
166
+ if target_path is None:
167
+ if inc_path.name == str(target):
168
+ included_by.add(path.name)
169
+ break
170
+ elif inc_path == target_path:
171
+ included_by.add(path.name)
172
+ break
97
173
  return included_by
98
174
 
99
175
 
brkraw/apps/hook/core.py CHANGED
@@ -150,12 +150,18 @@ def uninstall_hook(
150
150
  "transforms": [],
151
151
  }
152
152
  root_path = config_core.resolve_root(root)
153
+ namespace = entry.get("namespace") if isinstance(entry, dict) else None
153
154
  for kind in ("specs", "pruner_specs", "rules", "transforms"):
154
155
  for relpath in entry.get(kind, []) if isinstance(entry, dict) else []:
155
156
  target_path = root_path / relpath
156
157
  if not target_path.exists():
157
158
  continue
158
- if _has_dependencies(target_path, kind, root=root_path) and not force:
159
+ if _has_dependencies(
160
+ target_path,
161
+ kind,
162
+ root=root_path,
163
+ namespace=namespace,
164
+ ) and not force:
159
165
  raise RuntimeError("Dependencies found; use --force to remove.")
160
166
  target_path.unlink()
161
167
  removed[kind].append(relpath)
@@ -587,9 +593,22 @@ def _has_dependencies(
587
593
  kind: str,
588
594
  *,
589
595
  root: Optional[Union[str, Path]],
596
+ namespace: Optional[str] = None,
590
597
  ) -> bool:
591
598
  try:
592
- return addon_deps.warn_dependencies(target, kind=_kind_to_remove(kind), root=root)
599
+ ignore_rules_dir = None
600
+ ignore_specs_dir = None
601
+ if namespace:
602
+ paths = config_core.paths(root=root)
603
+ ignore_rules_dir = paths.rules_dir / namespace
604
+ ignore_specs_dir = paths.specs_dir / namespace
605
+ return addon_deps.warn_dependencies(
606
+ target,
607
+ kind=_kind_to_remove(kind),
608
+ root=root,
609
+ ignore_rules_dir=ignore_rules_dir,
610
+ ignore_specs_dir=ignore_specs_dir,
611
+ )
593
612
  except Exception:
594
613
  return False
595
614
 
@@ -565,7 +565,6 @@ class BrukerLoader:
565
565
 
566
566
  if scope == 'scan':
567
567
  if not as_dict:
568
- config_core.configure_logging(root=base, stream=sys.stdout)
569
568
  text = format_info_tables(
570
569
  {"Scan(s)": scan_info},
571
570
  width=width,
@@ -574,7 +573,7 @@ class BrukerLoader:
574
573
  scan_transpose=scan_transpose,
575
574
  float_decimals=float_decimals,
576
575
  )
577
- logger.info("%s", text)
576
+ print(text)
578
577
  return None
579
578
  return scan_info
580
579
 
@@ -586,19 +585,17 @@ class BrukerLoader:
586
585
 
587
586
  if scope == 'study':
588
587
  if not as_dict:
589
- config_core.configure_logging(root=base, stream=sys.stdout)
590
588
  text = format_info_tables(
591
589
  study_info,
592
590
  width=width,
593
591
  float_decimals=float_decimals,
594
592
  )
595
- logger.info("%s", text)
593
+ print(text)
596
594
  return None
597
595
  return study_info
598
596
 
599
597
  study_info['Scan(s)'] = scan_info
600
598
  if not as_dict:
601
- config_core.configure_logging(root=base, stream=sys.stdout)
602
599
  text = format_info_tables(
603
600
  study_info,
604
601
  width=width,
@@ -607,7 +604,7 @@ class BrukerLoader:
607
604
  scan_transpose=scan_transpose,
608
605
  float_decimals=float_decimals,
609
606
  )
610
- logger.info("%s", text)
607
+ print(text)
611
608
  return None
612
609
  return study_info
613
610
 
@@ -56,6 +56,10 @@ FOV (mm):
56
56
  - file: method
57
57
  key: PVM_Fov
58
58
  transform: convert_to_list
59
+ Num Slices:
60
+ sources:
61
+ - file: acqp
62
+ key: NSLICES
59
63
  NumSlicePack:
60
64
  sources:
61
65
  - file: method
@@ -5,7 +5,7 @@ study:
5
5
  description: "Study-level info mapping for Bruker datasets."
6
6
  category: "info_spec"
7
7
  transforms_source: "transform.py"
8
- Study.Opperator:
8
+ Study.Operator:
9
9
  sources:
10
10
  - file: subject
11
11
  key: SUBJECT_referral
@@ -91,7 +91,7 @@ scan:
91
91
  description: "Scan-level fallback info mapping for Bruker datasets."
92
92
  category: "info_spec"
93
93
  transforms_source: "transform.py"
94
- Study.Opperator:
94
+ Study.Operator:
95
95
  sources:
96
96
  - file: visu_pars
97
97
  key: VisuStudyReferringPhysician
@@ -28,10 +28,10 @@ if TYPE_CHECKING:
28
28
  from ...resolver.nifti import Nifti1HeaderContents, XYZUNIT, TUNIT
29
29
 
30
30
 
31
- InfoScope = Literal['full', 'study', 'scan']
31
+ InfoScope: TypeAlias = Literal['full', 'study', 'scan']
32
32
  Dataobjs = Optional[Union[NDArray, Tuple[NDArray, ...]]]
33
33
  Affines = Optional[Union[NDArray, Tuple[NDArray, ...]]]
34
- AffineSpace = Literal["raw", "scanner", "subject_ras"]
34
+ AffineSpace: TypeAlias = Literal["raw", "scanner", "subject_ras"]
35
35
  ConvertedObj = Optional[Union["ToFilename", Tuple["ToFilename", ...]]]
36
36
  Metadata = Optional[Union[Dict, Tuple[Optional[Dict], ...]]]
37
37
  HookArgs = Optional[Mapping[str, Mapping[str, Any]]]
@@ -12,7 +12,7 @@ import logging
12
12
  import os
13
13
  import re
14
14
  from pathlib import Path
15
- from typing import Any, Mapping, Optional, Dict, List, Tuple, cast, get_args
15
+ from typing import Any, Mapping, Optional, Dict, List, Tuple, Sequence, cast, get_args
16
16
 
17
17
  import numpy as np
18
18
  from brkraw.cli.utils import load
@@ -387,6 +387,8 @@ def cmd_convert(args: argparse.Namespace) -> int:
387
387
  for path in output_paths:
388
388
  reserved_paths.add(path)
389
389
 
390
+ _ensure_output_dirs(output_paths)
391
+
390
392
  sidecar_meta = None
391
393
  if args.sidecar:
392
394
  sidecar_meta = loader.get_metadata(
@@ -397,12 +399,10 @@ def cmd_convert(args: argparse.Namespace) -> int:
397
399
 
398
400
  if args.no_convert:
399
401
  for path in output_paths:
400
- path.parent.mkdir(parents=True, exist_ok=True)
401
402
  _write_sidecar(path, sidecar_meta)
402
403
  total_written += 1
403
404
  else:
404
405
  for path, obj in zip(output_paths, nii_list):
405
- path.parent.mkdir(parents=True, exist_ok=True)
406
406
  obj.to_filename(str(path))
407
407
  logger.info("Wrote NIfTI: %s", path)
408
408
  total_written += 1
@@ -713,6 +713,15 @@ def _parse_hook_args(values: List[str]) -> Dict[str, Dict[str, Any]]:
713
713
  return parsed
714
714
 
715
715
 
716
+ def _ensure_output_dirs(paths: Sequence[Path]) -> None:
717
+ for path in paths:
718
+ try:
719
+ path.parent.mkdir(parents=True, exist_ok=True)
720
+ except OSError as exc:
721
+ logger.error("Failed to create output directory %s: %s", path.parent, exc)
722
+ raise
723
+
724
+
716
725
  def _uses_counter_tag(
717
726
  *,
718
727
  layout_template: Optional[str],
@@ -274,7 +274,8 @@ def cmd_preset(args: argparse.Namespace) -> int:
274
274
  return 2
275
275
  preset = _infer_hook_preset(entry)
276
276
  payload = {"hooks": {args.target: preset}}
277
- text = yaml.safe_dump(payload, sort_keys=False)
277
+ normalized = _normalize_yaml_payload(payload)
278
+ text = yaml.safe_dump(normalized, sort_keys=False)
278
279
  if args.output:
279
280
  Path(args.output).expanduser().write_text(text, encoding="utf-8")
280
281
  logger.info("Wrote preset: %s", args.output)
@@ -283,6 +284,18 @@ def cmd_preset(args: argparse.Namespace) -> int:
283
284
  return 0
284
285
 
285
286
 
287
+ def _normalize_yaml_payload(value: Any) -> Any:
288
+ if isinstance(value, Path):
289
+ return str(value)
290
+ if dataclasses.is_dataclass(value) and not isinstance(value, type):
291
+ return _normalize_yaml_payload(dataclasses.asdict(value))
292
+ if isinstance(value, dict):
293
+ return {key: _normalize_yaml_payload(item) for key, item in value.items()}
294
+ if isinstance(value, (list, tuple, set)):
295
+ return [_normalize_yaml_payload(item) for item in value]
296
+ return value
297
+
298
+
286
299
  def register(subparsers: argparse._SubParsersAction) -> None: # type: ignore[name-defined]
287
300
  hook_parser = subparsers.add_parser(
288
301
  "hook",
@@ -39,7 +39,7 @@ def cmd_info(args: argparse.Namespace) -> int:
39
39
  width=width,
40
40
  )
41
41
  if text is not None:
42
- logger.info("%s", text)
42
+ print(text)
43
43
  return 0
44
44
 
45
45
 
@@ -97,7 +97,7 @@ def register(subparsers: argparse._SubParsersAction) -> None: # type: ignore[na
97
97
  "--output",
98
98
  dest="output",
99
99
  type=str,
100
- help="Output zip path (default: <input>_pruned.*).",
100
+ help="Output zip path (default: ./<root_name>.zip when omitted).",
101
101
  )
102
102
  prune_parser.add_argument(
103
103
  "--no-validate",
brkraw/cli/utils.py CHANGED
@@ -7,6 +7,7 @@ from __future__ import annotations
7
7
 
8
8
  import itertools
9
9
  import logging
10
+ import sys
10
11
  import threading
11
12
  import time
12
13
  from contextlib import contextmanager
@@ -26,7 +27,7 @@ def spinner(prefix: str = "Loading") -> Iterator[None]:
26
27
  Yields:
27
28
  None.
28
29
  """
29
- if logger.isEnabledFor(logging.DEBUG):
30
+ if logger.isEnabledFor(logging.DEBUG) or not sys.stdout.isatty():
30
31
  yield
31
32
  return
32
33
 
@@ -35,7 +36,11 @@ def spinner(prefix: str = "Loading") -> Iterator[None]:
35
36
 
36
37
  def run() -> None:
37
38
  while not stop_event.is_set():
38
- print(f"\r{prefix} {next(seq)}", end="", flush=True)
39
+ try:
40
+ print(f"\r{prefix} {next(seq)}", end="", flush=True)
41
+ except BrokenPipeError:
42
+ stop_event.set()
43
+ break
39
44
  time.sleep(0.08)
40
45
 
41
46
  thread = threading.Thread(target=run, daemon=True)
@@ -45,7 +50,10 @@ def spinner(prefix: str = "Loading") -> Iterator[None]:
45
50
  finally:
46
51
  stop_event.set()
47
52
  thread.join()
48
- print("\r" + " " * (len(prefix) + 2) + "\r", end="", flush=True)
53
+ try:
54
+ print("\r" + " " * (len(prefix) + 2) + "\r", end="", flush=True)
55
+ except BrokenPipeError:
56
+ pass
49
57
 
50
58
 
51
59
  def load(path, *, prefix: str = "Loading") -> BrukerLoader:
brkraw/resolver/affine.py CHANGED
@@ -1,6 +1,13 @@
1
1
  from __future__ import annotations
2
- from typing import Optional, Union, TypedDict, Tuple, Literal, List, Any
3
- from typing import cast, TYPE_CHECKING
2
+ from typing import Optional, Union, TypedDict, Tuple, Literal, List, Any, TYPE_CHECKING
3
+ from typing import cast
4
+ if TYPE_CHECKING:
5
+ from typing_extensions import TypeAlias
6
+ else:
7
+ try:
8
+ from typing import TypeAlias
9
+ except ImportError: # pragma: no cover - fallback for Python 3.8
10
+ from typing_extensions import TypeAlias
4
11
  from .helpers import get_file, get_reco, return_alt_val_if_none
5
12
  import logging
6
13
  import numpy as np
@@ -11,8 +18,8 @@ if TYPE_CHECKING:
11
18
  from ..dataclasses import Scan, Reco
12
19
  from ..core.parameters import Parameters
13
20
 
14
- SubjectType = Literal["Biped", "Quadruped", "Phantom", "Other", "OtherAnimal"]
15
- SubjectPose = Literal[
21
+ SubjectType: TypeAlias = Literal["Biped", "Quadruped", "Phantom", "Other", "OtherAnimal"]
22
+ SubjectPose: TypeAlias = Literal[
16
23
  "Head_Supine", "Head_Prone", "Head_Left", "Head_Right",
17
24
  "Foot_Supine", "Foot_Prone", "Foot_Left", "Foot_Right",
18
25
  ]
@@ -405,11 +412,37 @@ def resolve_matvec_and_shape(visu_pars,
405
412
  shape = np.append(shape, _num_slices)
406
413
  extent = np.append(extent, _num_slices * _slice_thickness)
407
414
  else:
408
- _rotate = np.squeeze(rotate)
415
+ spack_slices = visu_pars.get("VisuCoreSlicePacksSlices")
416
+ spack_count: Optional[int] = None
417
+ if spack_slices is not None:
418
+ spack_arr = np.asarray(spack_slices)
419
+ if spack_arr.ndim >= 1:
420
+ spack_count = int(spack_arr.shape[0])
421
+ if spack_count == 0:
422
+ spack_count = None
423
+
424
+ def _select_pack_row(arr: np.ndarray, *, width: int, name: str) -> np.ndarray:
425
+ arr = np.asarray(arr, dtype=float)
426
+ if arr.ndim == 1:
427
+ if arr.size != width:
428
+ raise ValueError(f"{name} has shape {arr.shape}, expected ({width},)")
429
+ return arr
430
+ if arr.ndim != 2 or arr.shape[1] != width:
431
+ raise ValueError(f"{name} has shape {arr.shape}, expected (*, {width})")
432
+ if spack_count is None or spack_count == 1:
433
+ return arr[0, :]
434
+ if spack_idx < 0 or spack_idx >= arr.shape[0]:
435
+ raise IndexError(
436
+ f"spack_idx out of range for {name}: {spack_idx} (entries: {arr.shape[0]})"
437
+ )
438
+ return arr[spack_idx, :]
439
+
440
+ _rotate = _select_pack_row(rotate, width=9, name="VisuCoreOrientation")
441
+ _origin = _select_pack_row(origin, width=3, name="VisuCorePosition")
409
442
  row = _rotate[0:3]
410
443
  col = _rotate[3:6]
411
444
  slc = _rotate[6:9]
412
- vec = np.squeeze(origin)
445
+ vec = np.squeeze(_origin)
413
446
 
414
447
  rot = np.column_stack([row, col, slc])
415
448
  resols = extent / shape
brkraw/resolver/nifti.py CHANGED
@@ -260,7 +260,7 @@ def resolve(
260
260
 
261
261
  if num_cycles > 1:
262
262
  time_step = cast(float, image_info['time_per_cycle']) / 1000.0
263
- num_slices = image_info['dataobj'].shape[2]
263
+ num_slices = cast(np.ndarray, image_info['dataobj']).shape[2]
264
264
  slice_duration = time_step / num_slices
265
265
  else:
266
266
  time_step = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brkraw
3
- Version: 0.5.5
3
+ Version: 0.5.7
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>
@@ -49,7 +49,7 @@ Description-Content-Type: text/markdown
49
49
 
50
50
  A modular toolkit for Bruker MRI raw-data handling.
51
51
 
52
- BrkRaw (v0.5.5) converts raw data into standardized, neuroimaging-ready
52
+ BrkRaw (v0.5.7) converts raw data into standardized, neuroimaging-ready
53
53
  datasets, with extensible rules/specs and plugin hooks.
54
54
 
55
55
  - Documentation: [brkraw.github.io](https://brkraw.github.io/)
@@ -70,7 +70,7 @@ If you use BrkRaw in your research, please cite it.
70
70
  @software{brkraw,
71
71
  author = {Lee, Sung-Ho and Devenyi, Gabriel A. and Ban, Woomi and Shih, Yen-Yu Ian},
72
72
  title = {BrkRaw: A modular toolkit for Bruker MRI raw-data handling},
73
- version = {0.5.5},
73
+ version = {0.5.7},
74
74
  doi = {10.5281/zenodo.3818614},
75
75
  url = {https://github.com/BrkRaw/brkraw},
76
76
  note = {Documentation: https://brkraw.github.io},
@@ -1,39 +1,39 @@
1
- brkraw/__init__.py,sha256=NNoLZss9K8Drck-8uP0v-fmqjTX4pxmlAi1s4ZLsw20,210
1
+ brkraw/__init__.py,sha256=6LifbJIia8iXJ8kuTt4Naq-0aVQREIB0dG0MKf-i72s,210
2
2
  brkraw/api/__init__.py,sha256=y7ZSFdF2uZK5e6ExGt3CQGg-DD5fmT0WouQiplSbwsA,3858
3
3
  brkraw/api/types.py,sha256=s11MIkHApOeREQZeIbx1zXz5R4WtYaBIVXD4s47Vnoc,672
4
4
  brkraw/apps/__init__.py,sha256=sEdA1SrY-Vu0xU1ct5Eab7vX-_IFMDip2j3FdSQVT58,170
5
5
  brkraw/apps/addon/__init__.py,sha256=fUR1QNwiaqSbkMIkPxLjKC7mJifR6HhrM8TO7lTo7Mg,531
6
6
  brkraw/apps/addon/core.py,sha256=xVlTElgOHNnoy3avNoeOudOvQSDzvuVsmGq9IVKNINc,659
7
- brkraw/apps/addon/dependencies.py,sha256=Hhujlqmy3DdlLfAM250r3kcl9iX2Lj4eDHBCw0TlNZo,14022
7
+ brkraw/apps/addon/dependencies.py,sha256=C1DliuLCptgEE8-Lcg7GkQaZD9aDc80y1Fj1JPHiLvo,16037
8
8
  brkraw/apps/addon/installation.py,sha256=LeciuHv_5ENg3OjzKClgIMAg3mYs8h3VUvFXmX6_Nao,18144
9
9
  brkraw/apps/addon/io.py,sha256=bjgwl0T1tsL02aAJtScLw3fnh2PfOlmK5aGAQj6WF8Y,413
10
10
  brkraw/apps/hook/__init__.py,sha256=W3xf6VmPZkVtQMwnYIrl626fnlck6bO20St0C45tMNY,398
11
- brkraw/apps/hook/core.py,sha256=z6PpwHYYESJD8EO__qVsXZj31YqP5JSSmNHYVHZRCnk,20720
11
+ brkraw/apps/hook/core.py,sha256=C_EF_Z5k1-owG46DtEzp7SL9Db3mnbIzB1gKZBM6Owo,21327
12
12
  brkraw/apps/loader/__init__.py,sha256=ih3YNHm2JQpR_5bWNpKwzVImXg4rl6eK8C_40texwr0,101
13
- brkraw/apps/loader/core.py,sha256=NfwxZyp85CBtjSzT72zU91Hg1MafkVvEnHhvradD6OA,22460
13
+ brkraw/apps/loader/core.py,sha256=FKc-ux2_zo413jNA3ENoB_xWq8eX05a-cy1Idrguw7o,22196
14
14
  brkraw/apps/loader/formatter.py,sha256=oiGO942bZMZODxI8kgYE0gdX4FLjwaZTquvZN3yGeeU,9315
15
15
  brkraw/apps/loader/helper.py,sha256=dujao_UH8C6aeZQ-GCTwCleoa-ZkrIDYSKlgwSN6gwA,34574
16
- brkraw/apps/loader/types.py,sha256=0w82elJXF0wYPZQ3eKiPTAR1vdearWnUtNH6CNzyYNo,6226
16
+ brkraw/apps/loader/types.py,sha256=MzQOQCZ0HLfBqUMvXaSEi53OdI9u-ZCozAcjdod2apY,6248
17
17
  brkraw/apps/loader/info/__init__.py,sha256=1tWVkBakwf3LZK-FwsMrt10fkkdz9cWw1j-Y4Dk6Lio,164
18
18
  brkraw/apps/loader/info/scan.py,sha256=omq7d00huVNY2ClMwkEclWWe2a8P3AZV42Xy0vG7YUk,2837
19
- brkraw/apps/loader/info/scan.yaml,sha256=tYyGRg4t_rf6jGZAT8F0_dUA9MlQeZ5zeOuTNQ2wQM8,1728
19
+ brkraw/apps/loader/info/scan.yaml,sha256=0LzH5AawmIiQ_3PTkwn9qeEp3xqndMDKBXnOWzXAypo,1787
20
20
  brkraw/apps/loader/info/study.py,sha256=0_5gUlDOd5xsmXaYF9pyhwUKsq3-oCZ5SMvH6RqlPp4,2743
21
- brkraw/apps/loader/info/study.yaml,sha256=M_wAy-B-4SErZ610KSNiqUW8aotorXkomymMYFdlyJw,3713
21
+ brkraw/apps/loader/info/study.yaml,sha256=2-O24oQtQzgenjC1lPIdCd5FgEv2j4q4qXPitsdf424,3711
22
22
  brkraw/apps/loader/info/transform.py,sha256=gXYtIlbAwaLZX1K7jRFgFAJRG9D-zqlLQ-89BJOhuxM,2558
23
23
  brkraw/cli/__init__.py,sha256=Z97T007Iut9FMPWTRa7MDcUhd9uQhhQ0qmRJ1H4owlw,89
24
24
  brkraw/cli/hook_args.py,sha256=B2CKdSmZqSoQaBW4SMtjCXLLheDt-NJ1VwgvGp4Mtzw,2625
25
25
  brkraw/cli/main.py,sha256=OC6BBvSMTZdXz6tdArt163qfvDsldkAXLZ8osBFShFs,4086
26
- brkraw/cli/utils.py,sha256=dyEFydR7SsKUhSyHESqZqzAVu1zc2iLSA7GwG_OQ6FM,1348
26
+ brkraw/cli/utils.py,sha256=wEN2Paehe11-Ho-jwg_KRewKhEnDM7sRMvKWCHgAGU4,1564
27
27
  brkraw/cli/commands/__init__.py,sha256=PHh4jqD7i0aL8W8hXThczKcT4xsNZiXanBxOH5IOW5I,36
28
28
  brkraw/cli/commands/addon.py,sha256=ctPJ6h_SPFovT1EY6iY-Fyrhfcu0Lo3oCvDz52YsKNM,11179
29
29
  brkraw/cli/commands/cache.py,sha256=wyGjM7WjIW8jcwRoEoUpSdlnzCLUTcozpan2KEG8i5Q,2254
30
30
  brkraw/cli/commands/config.py,sha256=qWj4yPNDeikLmONZw8-g1C098t-2oGCExJtam-fb6Pk,6480
31
- brkraw/cli/commands/convert.py,sha256=wWm4inT3Jb5DFNXuB0RZt96DqJ-FSPRvCj7FoVGGqic,31880
32
- brkraw/cli/commands/hook.py,sha256=esRVd-t_SGJDKvdfNlPd0belOqZNjLGMVXE1l0N1tbc,11889
33
- brkraw/cli/commands/info.py,sha256=Cog04r1oJYhIGQrfxH9JhLQLt6rwFSfJMuVN38MIDPI,2251
31
+ brkraw/cli/commands/convert.py,sha256=uB0Qp1SViXdJKJvGE60cFDIRV5s4EJB2Gr472nRPP-E,32092
32
+ brkraw/cli/commands/hook.py,sha256=1EYQHl-P_dPHpPBY5XUKgajI9lc9oi6fsIBj13xvzEQ,12431
33
+ brkraw/cli/commands/info.py,sha256=9V6Qlp57Pg4qEaSjW8w6EpW8Orm-5lzdRm5po8qsglQ,2239
34
34
  brkraw/cli/commands/init.py,sha256=4LC0XHmZsGGozoNq2vlGBF6Y1MtbK77Ub7wVbwo9ACc,6957
35
35
  brkraw/cli/commands/params.py,sha256=LtYgXdffJ4PuXb5FMcRQhvHpRlFN28MIkpd0UMNx9-Y,3159
36
- brkraw/cli/commands/prune.py,sha256=RFH0GCkiu9EJNDUHg9lwH2DNBa9A-Yx9sIcUqITRrkg,8791
36
+ brkraw/cli/commands/prune.py,sha256=z1RDbw8wECtJrvuP1f9LOooI822a5dz1yCLqWz_rMww,8805
37
37
  brkraw/cli/commands/session.py,sha256=t77PyNZpQoXxpszpqiKsOsKfLg9woXBJA_yinVhuEVk,12299
38
38
  brkraw/core/__init__.py,sha256=9UPOF5mtjZdGgjQ6-JJJs-eg8CGl4BuV7flGDWKgCBg,218
39
39
  brkraw/core/cache.py,sha256=oF6MOIrywGUrU9l8OweoBVww5ZSqv9BtALjNaPnr59Q,2324
@@ -56,12 +56,12 @@ brkraw/default/rules/00_default.yaml,sha256=a4PZOR0oam0ziZqLsvaQZqwoDu-uXbPVdxJc
56
56
  brkraw/default/specs/metadata_dicom.yaml,sha256=grrwGOBIIEUJPTs6vktWydnEsvBTjbgwez0190Q8ma0,4295
57
57
  brkraw/default/specs/metadata_transforms.py,sha256=illM4MKwwz-6PPKLrIno5lba1f5zKC8y09PAR5gCH1o,2383
58
58
  brkraw/resolver/__init__.py,sha256=2vz8b135CA4aebHUHSc2Hgtc3Ko2-qbdAxfTnUtTeGk,84
59
- brkraw/resolver/affine.py,sha256=s7vm30C5fkmOMTuY-Bc5lZeE3Wy4pbHydL1V4gzkDB4,19501
59
+ brkraw/resolver/affine.py,sha256=wpCEnOjauYEecWlmSZqY-_ebeZTcN1zsmdKYZPO2Owc,21034
60
60
  brkraw/resolver/datatype.py,sha256=a1bqsGibtnRGGiPKAGbkXj1-Tyjmk52pUPgXM8F2px8,2522
61
61
  brkraw/resolver/fid.py,sha256=SXglNSD6hFK7pAoHrUvuNbCYPgIAvbRdh6PACp7Oz7g,2847
62
62
  brkraw/resolver/helpers.py,sha256=BpL-zpbtGae6n-XQOmD5qP7KrD5HFnElzAD3bcBq0J4,1029
63
63
  brkraw/resolver/image.py,sha256=9G3PRgQnSiU2dS23WxhoV_L-ekWnuY9z9pVwzTOF7ag,10716
64
- brkraw/resolver/nifti.py,sha256=S4Z1NZdJp0LbipyUndEUoJqQzAjGfoizhGQC9byQG38,12617
64
+ brkraw/resolver/nifti.py,sha256=h4hOWebgMRl0LpNUEPbFybJ3tN9oj7J4zw2wKtABWLo,12635
65
65
  brkraw/resolver/shape.py,sha256=r2sQpgKGMN0nmBPj9_LTt7d3ls-y4R8n1HIMDvpNdfk,8110
66
66
  brkraw/schema/__init__.py,sha256=eEYYkxX5Hz9woXVOBJ2H2_CQoEih0vH6nRt3sH2Z8v8,49
67
67
  brkraw/schema/context_map.yaml,sha256=OUtoa7NgQZ7ytUe8zuNiJ5ratt1p0DRrrfDAP5Kthqs,1798
@@ -85,8 +85,8 @@ brkraw/specs/remapper/validator.py,sha256=R-Pib4MCgUVYAvAAoFR04bF-j7TDaePj-jGaxO
85
85
  brkraw/specs/rules/__init__.py,sha256=oF1ury9vxTYMlTgz9Yo9um8jRAzaJeTMwjAcDLV-KOE,214
86
86
  brkraw/specs/rules/logic.py,sha256=PbcvkyTjGKJn5CLg_V5QgnWNKirAqRrV3e1YVRx8FyQ,9092
87
87
  brkraw/specs/rules/validator.py,sha256=AHS-r-E0HGHxwhhU48nCyS6LQvllQCgXLS_NDXBm3-k,3508
88
- brkraw-0.5.5.dist-info/METADATA,sha256=stg8aCKjoMzzB0VCtjN7F1GunvD73ybWshFCLwkXcqY,3058
89
- brkraw-0.5.5.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
90
- brkraw-0.5.5.dist-info/entry_points.txt,sha256=fdCNXyFoqRsPYXXizC_LS44B9Myjr1dH2tewvtcIN-E,493
91
- brkraw-0.5.5.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
92
- brkraw-0.5.5.dist-info/RECORD,,
88
+ brkraw-0.5.7.dist-info/METADATA,sha256=_ZnDJuPxq8GeszcdNfWXfZGV1njLBdI_muXN9-DoJmc,3058
89
+ brkraw-0.5.7.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
90
+ brkraw-0.5.7.dist-info/entry_points.txt,sha256=fdCNXyFoqRsPYXXizC_LS44B9Myjr1dH2tewvtcIN-E,493
91
+ brkraw-0.5.7.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
92
+ brkraw-0.5.7.dist-info/RECORD,,
File without changes