Source code for voxelops.schemas.heudiconv
"""HeudiConv schemas: inputs, outputs, and defaults."""
from dataclasses import dataclass, field
from pathlib import Path
from typing import Optional
[docs]
@dataclass
class HeudiconvInputs:
"""Required inputs for HeudiConv DICOM to BIDS conversion.
Parameters
----------
dicom_dir : Path
Directory containing DICOM files.
participant : str
Participant label (without 'sub-' prefix).
output_dir : Optional[Path], optional
Output BIDS directory, by default None.
If None, defaults to dicom_dir/../bids.
session : Optional[str], optional
Session label (without 'ses-' prefix), by default None.
heuristic : Optional[Path], optional
Path to heuristic.py file, by default None.
"""
dicom_dir: Path
participant: str
output_dir: Optional[Path] = None
session: Optional[str] = None
heuristic: Optional[Path] = None
[docs]
def __post_init__(self):
"""Ensure paths are Path objects."""
self.dicom_dir = Path(self.dicom_dir)
if self.output_dir:
self.output_dir = Path(self.output_dir)
[docs]
@dataclass
class HeudiconvOutputs:
"""Expected outputs from HeudiConv.
Parameters
----------
bids_dir : Path
Root BIDS directory.
participant_dir : Path
Participant-specific directory (sub-XX/).
dataset_description : Path
dataset_description.json file.
"""
bids_dir: Path
participant_dir: Path
dataset_description: Path
[docs]
@classmethod
def from_inputs(cls, inputs: HeudiconvInputs, output_dir: Path):
"""Generate expected output paths from inputs.
Parameters
----------
inputs : HeudiconvInputs
HeudiconvInputs instance.
output_dir : Path
Resolved output directory.
Returns
-------
HeudiconvOutputs
HeudiconvOutputs with expected paths.
"""
participant_dir = output_dir / f"sub-{inputs.participant}"
if inputs.session:
participant_dir = participant_dir / f"ses-{inputs.session}"
return cls(
bids_dir=output_dir,
participant_dir=participant_dir,
dataset_description=output_dir / "dataset_description.json",
)
[docs]
@dataclass
class HeudiconvDefaults:
"""Default configuration for HeudiConv.
Parameters
----------
heuristic : Optional[Path], optional
Path to heuristic.py file (required for conversion), by default None.
bids_validator : bool, optional
Run BIDS validator after conversion, by default True.
overwrite : bool, optional
Overwrite existing output, by default False.
converter : str, optional
DICOM converter to use, by default "dcm2niix".
docker_image : str, optional
Docker image to use, by default "nipy/heudiconv:1.3.4".
post_process : bool, optional
Enable post-heudiconv processing, by default True.
post_process_dry_run : bool, optional
Test mode - report only, don't modify, by default False.
"""
heuristic: Optional[Path] = None
bids_validator: bool = True
overwrite: bool = False
converter: str = "dcm2niix"
bids: Optional[str] = "notop"
grouping: Optional[str] = "all"
docker_image: str = "nipy/heudiconv:1.3.4"
# Post-processing options
post_process: bool = True # Enable post-heudiconv processing
post_process_dry_run: bool = False # Test mode - report only, don't modify
[docs]
def __post_init__(self):
"""Ensure heuristic path is Path object if provided."""
if self.heuristic:
self.heuristic = Path(self.heuristic)