Skip to content

Commit 7654d7a

Browse files
authored
Merge pull request #14 from DigitalHolography/improve-imports-global
feature/Improve_imports_global
2 parents 454c1fb + 832eeac commit 7654d7a

File tree

12 files changed

+258
-124
lines changed

12 files changed

+258
-124
lines changed

README.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,16 @@ To see more complete examples, check out `src/pipelines/basic_stats.py` and `src
106106
### Simple Pipeline Structure
107107

108108
```python
109-
from pipelines import ProcessPipeline, ProcessResult
109+
from pipelines import ProcessPipeline, ProcessResult, registerPipeline
110110

111+
@registerPipeline(
112+
name="My Analysis",
113+
description="Calculates a custom clinical metric.",
114+
required_deps=["torch>=2.2"],
115+
)
111116
class MyAnalysis(ProcessPipeline):
112-
description = "Calculates a custom clinical metric."
113-
114117
def run(self, h5file):
118+
import torch
115119
# 1. Read data using h5py
116120
# 2. Perform calculations
117121
# 3. Return metrics and artifacts

src/angio_eye.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
sv_ttk = None
1616

1717
from pipelines import (
18+
PipelineDescriptor,
1819
ProcessPipeline,
1920
ProcessResult,
2021
load_pipeline_catalog,
@@ -70,7 +71,7 @@ def __init__(self) -> None:
7071
self.title("HDF5 Process")
7172
self.geometry("800x600")
7273
self.h5_file: h5py.File | None = None
73-
self.pipeline_registry: dict[str, ProcessPipeline] = {}
74+
self.pipeline_registry: dict[str, PipelineDescriptor] = {}
7475
self.pipeline_check_vars: dict[str, tk.BooleanVar] = {}
7576
self.last_process_result: ProcessResult | None = None
7677
self.last_process_pipeline: ProcessPipeline | None = None
@@ -329,12 +330,12 @@ def _register_pipelines(self) -> None:
329330
self._populate_pipeline_checks(available, missing)
330331

331332
def _populate_pipeline_checks(
332-
self, available: list[ProcessPipeline], missing: list[ProcessPipeline]
333+
self, available: list[PipelineDescriptor], missing: list[PipelineDescriptor]
333334
) -> None:
334335
for child in self.pipeline_checks_inner.winfo_children():
335336
child.destroy()
336337
self.pipeline_check_vars = {}
337-
rows: list[ProcessPipeline] = [*available, *missing]
338+
rows: list[PipelineDescriptor] = [*available, *missing]
338339
for idx, pipeline in enumerate(rows):
339340
is_available = getattr(pipeline, "available", True)
340341
var = tk.BooleanVar(value=is_available)
@@ -422,8 +423,8 @@ def run_selected_pipeline(self) -> None:
422423
"Missing pipeline", "Select a pipeline before running."
423424
)
424425
return
425-
pipeline = self.pipeline_registry.get(name)
426-
if pipeline is None:
426+
pipeline_desc = self.pipeline_registry.get(name)
427+
if pipeline_desc is None:
427428
messagebox.showerror(
428429
"Pipeline missing", f"Pipeline '{name}' is not registered."
429430
)
@@ -432,6 +433,7 @@ def run_selected_pipeline(self) -> None:
432433
messagebox.showwarning("Missing file", "Load a .h5 file first.")
433434
return
434435
try:
436+
pipeline = pipeline_desc.instantiate()
435437
result = pipeline.run(self.h5_file)
436438
except Exception as exc: # noqa: BLE001
437439
messagebox.showerror("Pipeline error", f"Pipeline failed: {exc}")
@@ -522,7 +524,7 @@ def run_batch(self) -> None:
522524
)
523525
return
524526

525-
pipelines: list[ProcessPipeline] = []
527+
pipelines: list[PipelineDescriptor] = []
526528
missing: list[str] = []
527529
for name in selected_names:
528530
pipeline = self.pipeline_registry.get(name)
@@ -646,15 +648,16 @@ def _safe_pipeline_suffix(self, name: str) -> str:
646648
def _run_pipelines_on_file(
647649
self,
648650
h5_path: Path,
649-
pipelines: Sequence[ProcessPipeline],
651+
pipelines: Sequence[PipelineDescriptor],
650652
output_root: Path,
651653
) -> None:
652654
data_dir = output_root / h5_path.stem
653655
data_dir.mkdir(parents=True, exist_ok=True)
654656
combined_h5_out = data_dir / f"{h5_path.stem}_pipelines_result.h5"
655657
pipeline_results: list[tuple[str, ProcessResult]] = []
656658
with h5py.File(h5_path, "r") as h5file:
657-
for pipeline in pipelines:
659+
for pipeline_desc in pipelines:
660+
pipeline = pipeline_desc.instantiate()
658661
result = pipeline.run(h5file)
659662
pipeline_results.append((pipeline.name, result))
660663
self._log_batch(f"[OK] {h5_path.name} -> {pipeline.name}")

src/cli.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,30 @@
1919
import sys
2020
import tempfile
2121
import zipfile
22-
from collections.abc import Iterable, Sequence
22+
from collections.abc import Sequence
2323
from pathlib import Path
2424

2525
import h5py
2626

27-
from pipelines import ProcessPipeline, ProcessResult, load_all_pipelines
27+
from pipelines import (
28+
PipelineDescriptor,
29+
ProcessResult,
30+
load_pipeline_catalog,
31+
)
2832
from pipelines.core.utils import write_combined_results_h5
2933

3034

31-
def _build_pipeline_registry() -> dict[str, ProcessPipeline]:
32-
pipelines = load_all_pipelines()
33-
return {p.name: p for p in pipelines}
35+
def _build_pipeline_registry() -> dict[str, PipelineDescriptor]:
36+
available, _ = load_pipeline_catalog()
37+
# pipelines = load_all_pipelines()
38+
return {p.name: p for p in available}
3439

3540

3641
def _load_pipeline_list(
37-
path: Path, registry: dict[str, ProcessPipeline]
38-
) -> list[ProcessPipeline]:
42+
path: Path, registry: dict[str, PipelineDescriptor]
43+
) -> list[PipelineDescriptor]:
3944
raw_lines = path.read_text(encoding="utf-8").splitlines()
40-
selected: list[ProcessPipeline] = []
45+
selected: list[PipelineDescriptor] = []
4146
missing: list[str] = []
4247
for line in raw_lines:
4348
name = line.strip()
@@ -92,7 +97,7 @@ def _prepare_data_root(
9297

9398
def _run_pipelines_on_file(
9499
h5_path: Path,
95-
pipelines: Sequence[ProcessPipeline],
100+
pipelines: Sequence[PipelineDescriptor],
96101
output_root: Path,
97102
) -> list[Path]:
98103
outputs: list[Path] = []
@@ -101,7 +106,8 @@ def _run_pipelines_on_file(
101106
combined_h5_out = data_dir / f"{h5_path.stem}_pipelines_result.h5"
102107
pipeline_results: list[tuple[str, ProcessResult]] = []
103108
with h5py.File(h5_path, "r") as h5file:
104-
for pipeline in pipelines:
109+
for pipeline_desc in pipelines:
110+
pipeline = pipeline_desc.instantiate()
105111
result = pipeline.run(h5file)
106112
pipeline_results.append((pipeline.name, result))
107113
print(f"[OK] {h5_path.name} -> {pipeline.name}")
@@ -200,7 +206,7 @@ def run_cli(
200206
shutil.rmtree(work_tempdir_path, ignore_errors=True)
201207

202208

203-
def main(argv: Iterable[str] | None = None) -> int:
209+
def main(argv: Sequence[str] | None = None) -> int:
204210
parser = argparse.ArgumentParser(
205211
description="Run AngioEye pipelines over a folder of HDF5 files."
206212
)

0 commit comments

Comments
 (0)