Skip to content

ENH: Update fit-to-patient for non-contrast heart models#87

Merged
aylward merged 4 commits into
Project-MONAI:mainfrom
aylward:fit_to_patient
Jul 14, 2026
Merged

ENH: Update fit-to-patient for non-contrast heart models#87
aylward merged 4 commits into
Project-MONAI:mainfrom
aylward:fit_to_patient

Conversation

@aylward

@aylward aylward commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

Non-contrast heart models from TotalSegmentator are incomplete, but this update makes registration to a statistical model possible.

Summary by CodeRabbit

  • New Features
    • Added optional high-resolution heart processing gated by a new license flag.
    • Anatomy-group outputs now use grouped labelmaps that preserve original label IDs.
    • Image-to-USD conversion now defaults to 1 frame per second.
    • Tutorial 6 now also saves forward and inverse transforms alongside reconstructed frames.
  • Bug Fixes
    • Corrected contrast-region label ID handling for contrast-enhanced results.
  • Documentation
    • Updated workflows, tutorials, and developer guidance to use the process() entry point (and refreshed related examples/terminology).

Non-contrast heart models from TotalSegmentator are incomplete,
but this update makes registration to a statistical model
possible.
Copilot AI review requested due to automatic review settings July 14, 2026 03:04

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown

Walkthrough

The changes migrate workflow execution to process, revise PCA configuration, replace anatomy masks with label-preserving labelmaps, expand TotalSegmentator heart processing, add DirLab-4DCT preprocessing, update tutorials and callers, and adjust contour and USD conversion utilities.

Changes

Workflow API and callers

Layer / File(s) Summary
Workflow entrypoints and PCA configuration
src/physiotwin4d/workflow_fit_statistical_model_to_patient.py, src/physiotwin4d/workflow_reconstruct_highres_4d_ct.py
Public workflow entrypoints use process, and PCA surface selection uses use_surface.
Workflow callers and tutorials
src/physiotwin4d/cli/*, docs/*, experiments/*, tutorials/*
CLI commands, examples, experiments, and tutorials use the updated workflow APIs; Tutorial 6 also writes registration transforms.

Segmentation and utility behavior

Layer / File(s) Summary
Anatomy labelmaps
src/physiotwin4d/segment_anatomy_base.py, tests/*, docs/developer/segmentation.rst, experiments/Heart-GatedCT_To_USD/*
Anatomy groups now preserve original label IDs and include other; tests validate taxonomy-constrained labelmaps.
High-resolution chest segmentation
src/physiotwin4d/segment_chest_total_segmentator.py, src/physiotwin4d/segment_chest_total_segmentator_with_contrast.py
Taxonomy mappings and task execution are updated for high-resolution heart labels, optional licensed post-processing, body fills, and contrast label ID 155.
Workflow utilities
src/physiotwin4d/contour_tools.py, src/physiotwin4d/workflow_convert_image_to_usd.py
Five contour methods become static, while USD conversion stores segmentation result objects and uses a 1.0 FPS default.

DirLab-4DCT data flow

Layer / File(s) Summary
Raw headers and HU conversion
data/DirLab-4DCT/**, src/physiotwin4d/data_download_tools.py
MetaImage headers and conversion scripts support recursive raw-volume discovery, HU offset correction, clipping, and compressed MHA output.
Preprocessed experiment inputs
experiments/Lung-GatedCT_To_USD/*
Experiments load pre-converted MHA volumes directly and no longer perform in-module intensity correction.

Estimated code review effort: 4 (Complex) | ~45 minutes

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Copilot AI review requested due to automatic review settings July 14, 2026 03:09

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
src/physiotwin4d/workflow_convert_image_to_usd.py (1)

83-84: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Update the docstring to reflect the new default value.

The default value for frames_per_second was changed to 1.0 (at line 57), but the docstring still states it defaults to 24.0. As per coding guidelines, docstrings must be updated and kept factual for changed public methods.

📝 Proposed fix
-            frames_per_second: Frames per second for animated USD time series.
-                Defaults to 24.0, matching the underlying VTK-to-USD converter.
+            frames_per_second: Frames per second for animated USD time series.
+                Defaults to 1.0.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/physiotwin4d/workflow_convert_image_to_usd.py` around lines 83 - 84,
Update the frames_per_second parameter documentation in the workflow conversion
function’s docstring to state that the default is 1.0 instead of 24.0, matching
the value defined in the function signature.

Source: Coding guidelines

docs/developer/segmentation.rst (1)

40-44: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Doc references stale contrast id 135.

segment_chest_total_segmentator_with_contrast.py now registers "contrast" at id 155 (moved from 135 to avoid colliding with the new body_extremities=135 label), but this line still documents "contrast at id 135".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/developer/segmentation.rst` around lines 40 - 44, Update the taxonomy
documentation for the default “contrast” placeholder to use id 155 instead of
135, while retaining the “soft_tissue” id 133 reference and the surrounding
description.
src/physiotwin4d/segment_chest_total_segmentator.py (1)

46-47: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Restore target_spacing to 1.5 or update the contract around resampling. self.target_spacing = 0.0 disables SegmentAnatomyBase.preprocess_input(), contradicts the class docstring, and breaks the current initialization test that expects 1.5. If the new behavior is intentional, update the docstring and test to match.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/physiotwin4d/segment_chest_total_segmentator.py` around lines 46 - 47,
Restore self.target_spacing to 1.5 in the TotalSegmentator class so it matches
the documented contract and existing initialization test, preserving the
expected resampling behavior through SegmentAnatomyBase.preprocess_input().
🧹 Nitpick comments (3)
src/physiotwin4d/contour_tools.py (1)

34-35: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Update docstrings for the changed public methods.

The static-method conversion is compatible with the supplied callers, but the public documentation is incomplete: transform_contours omits several parameters, create_reference_image lacks argument and return documentation, and create_mask_from_mesh has no docstring. Please update all five changed methods with complete, factual docstrings.

As per coding guidelines, update docstrings for every changed public method.

Also applies to: 74-75, 138-139, 167-168, 363-364

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/physiotwin4d/contour_tools.py` around lines 34 - 35, Update the
docstrings for all five changed public methods, including extract_contours,
transform_contours, create_reference_image, create_mask_from_mesh, and the
method at the additional referenced location. Document every parameter and the
return value with accurate descriptions, ensuring transform_contours includes
its omitted parameters and create_reference_image and create_mask_from_mesh have
complete argument and return documentation.

Source: Coding guidelines

src/physiotwin4d/segment_anatomy_base.py (1)

456-463: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Group labelmaps aren't cast to uint8 like the main "labelmap" key.

labelmap_image is explicitly re-cast to uint8 before being returned, but the labelmaps dict (heart/lung/etc.) is built from the pre-cast image and returned as-is. All current segmenters happen to already produce uint8 labelmaps, so this is not currently observable, but the returned dict has no guaranteed-consistent pixel type across its values, which downstream consumers (writers, comparisons) may implicitly assume.

♻️ Suggested fix
         labelmaps = self.create_anatomy_group_labelmaps(labelmap_image)

         labelmap_image = itk.GetImageFromArray(
             itk.GetArrayFromImage(labelmap_image).astype(np.uint8)
         )
         labelmap_image.CopyInformation(input_image)

-        return {"labelmap": labelmap_image, **labelmaps}
+        labelmaps = {
+            group: itk.GetImageFromArray(
+                itk.GetArrayFromImage(group_labelmap).astype(np.uint8)
+            )
+            for group, group_labelmap in labelmaps.items()
+        }
+        for group_labelmap, source in zip(labelmaps.values(), labelmaps.values()):
+            group_labelmap.CopyInformation(input_image)
+
+        return {"labelmap": labelmap_image, **labelmaps}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/physiotwin4d/segment_anatomy_base.py` around lines 456 - 463, Update the
labelmap construction flow around create_anatomy_group_labelmaps so every group
labelmap in labelmaps is converted to uint8 before returning. Apply the same
pixel-type normalization used for the main "labelmap" while preserving each
group's existing image metadata and the return structure.
tutorials/tutorial_04_fit_statistical_model_to_patient.py (1)

101-110: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Persisted ITK images/transforms omit compression=True in two tutorials. Both itk.imwrite and itk.transformwrite default their compression parameter to False; the coding guidelines require compressed storage for both ITK images and .hdf transforms.

  • tutorials/tutorial_04_fit_statistical_model_to_patient.py#L101-L110: add compression=True to the three itk.imwrite(...) calls (patient image, patient labelmap, heart labelmap).
  • tutorials/tutorial_06_reconstruct_highres_4d_ct.py#L107-L111: add compression=True to the two itk.transformwrite(...) calls (forward and inverse transform).
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tutorials/tutorial_04_fit_statistical_model_to_patient.py` around lines 101 -
110, Enable compression on all persisted ITK outputs: update the three
itk.imwrite calls in tutorials/tutorial_04_fit_statistical_model_to_patient.py
for patient_image, patient_labelmap, and heart_labelmap, and the two
itk.transformwrite calls in tutorials/tutorial_06_reconstruct_highres_4d_ct.py
for the forward and inverse transforms, by passing compression=True.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@experiments/Heart-Create_Statistical_Model/README.md`:
- Line 164: Update the workflow result assignment around
WorkflowFitStatisticalModelToPatient.process() so it selects
registered_template_model_surface from the returned dictionary instead of
assigning the entire dictionary to registered_mesh.

In `@src/physiotwin4d/segment_chest_total_segmentator.py`:
- Line 286: Remove the three unconditional debug itk.imwrite calls for
preprocessed_image, labelmap_arr_heart, and labelmap_arr_body from the
segmentation flow. Do not replace them with other production writes; preserve
the segmentation behavior while eliminating the working-directory artifacts and
associated debug image creation if it is used only by those writes.
- Around line 369-393: Binarize the heart interior mask before constructing
interior_image in the high-resolution heart expansion block: make interior_arr
contain 1 for labels 141–144 and 0 elsewhere, while preserving the existing
dilation and erosion calls using foreground value 1. Keep the subsequent
exterior mask application and labelmap replacement behavior unchanged.

In `@src/physiotwin4d/workflow_convert_image_to_usd.py`:
- Line 228: Wrap the assignment to self.reference_segmentation_results in the
workflow conversion code so each resulting line is no longer than 88 characters,
preserving the existing segmenter.segment(self.reference_image) behavior.

In `@tests/conftest.py`:
- Around line 517-529: Remove the unconditional "contrast" lookup from the
fixture result assembled with segmenter_total_segmentator, since
create_anatomy_group_labelmaps only returns registered groups. Keep the existing
groups unchanged; if contrast output is required, use the
segmenter_total_segmentator_with_contrast fixture instead.

In `@tutorials/tutorial_04_fit_statistical_model_to_patient.py`:
- Around line 128-143: Guard PCA registration in the workflow setup using the
loaded pca_model: call set_use_pca_registration only when pca_model is not None,
while preserving the existing enabled configuration when it is available. Update
the result-saving flow around workflow.pca_coefficients so it does not call
tolist() when PCA was skipped, and save registered coefficients only when they
exist.

---

Outside diff comments:
In `@docs/developer/segmentation.rst`:
- Around line 40-44: Update the taxonomy documentation for the default
“contrast” placeholder to use id 155 instead of 135, while retaining the
“soft_tissue” id 133 reference and the surrounding description.

In `@src/physiotwin4d/segment_chest_total_segmentator.py`:
- Around line 46-47: Restore self.target_spacing to 1.5 in the TotalSegmentator
class so it matches the documented contract and existing initialization test,
preserving the expected resampling behavior through
SegmentAnatomyBase.preprocess_input().

In `@src/physiotwin4d/workflow_convert_image_to_usd.py`:
- Around line 83-84: Update the frames_per_second parameter documentation in the
workflow conversion function’s docstring to state that the default is 1.0
instead of 24.0, matching the value defined in the function signature.

---

Nitpick comments:
In `@src/physiotwin4d/contour_tools.py`:
- Around line 34-35: Update the docstrings for all five changed public methods,
including extract_contours, transform_contours, create_reference_image,
create_mask_from_mesh, and the method at the additional referenced location.
Document every parameter and the return value with accurate descriptions,
ensuring transform_contours includes its omitted parameters and
create_reference_image and create_mask_from_mesh have complete argument and
return documentation.

In `@src/physiotwin4d/segment_anatomy_base.py`:
- Around line 456-463: Update the labelmap construction flow around
create_anatomy_group_labelmaps so every group labelmap in labelmaps is converted
to uint8 before returning. Apply the same pixel-type normalization used for the
main "labelmap" while preserving each group's existing image metadata and the
return structure.

In `@tutorials/tutorial_04_fit_statistical_model_to_patient.py`:
- Around line 101-110: Enable compression on all persisted ITK outputs: update
the three itk.imwrite calls in
tutorials/tutorial_04_fit_statistical_model_to_patient.py for patient_image,
patient_labelmap, and heart_labelmap, and the two itk.transformwrite calls in
tutorials/tutorial_06_reconstruct_highres_4d_ct.py for the forward and inverse
transforms, by passing compression=True.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: abdc6a98-e2d4-4726-9063-94a05139b70e

📥 Commits

Reviewing files that changed from the base of the PR and between 4cfbfbc and 5e27522.

📒 Files selected for processing (23)
  • docs/api/model_registration/index.rst
  • docs/api/workflows.rst
  • docs/developer/registration_models.rst
  • docs/developer/segmentation.rst
  • docs/tutorials.rst
  • experiments/Heart-Create_Statistical_Model/README.md
  • experiments/Heart-GatedCT_To_USD/2-generate_segmentation.py
  • experiments/Heart-Statistical_Model_To_Patient/heart_model_to_patient-CHOPValve.py
  • src/physiotwin4d/cli/fit_statistical_model_to_patient.py
  • src/physiotwin4d/cli/reconstruct_highres_4d_ct.py
  • src/physiotwin4d/contour_tools.py
  • src/physiotwin4d/segment_anatomy_base.py
  • src/physiotwin4d/segment_chest_total_segmentator.py
  • src/physiotwin4d/segment_chest_total_segmentator_with_contrast.py
  • src/physiotwin4d/segment_heart_simpleware.py
  • src/physiotwin4d/workflow_convert_image_to_usd.py
  • src/physiotwin4d/workflow_fit_statistical_model_to_patient.py
  • src/physiotwin4d/workflow_reconstruct_highres_4d_ct.py
  • tests/conftest.py
  • tests/test_segment_chest_total_segmentator.py
  • tutorials/tutorial_04_fit_statistical_model_to_patient.py
  • tutorials/tutorial_06_reconstruct_highres_4d_ct.py
  • tutorials/tutorial_08_cardiac_fit_model.py

Comment thread experiments/Heart-Create_Statistical_Model/README.md Outdated
Comment thread src/physiotwin4d/segment_chest_total_segmentator.py Outdated
Comment thread src/physiotwin4d/segment_chest_total_segmentator.py
Comment thread src/physiotwin4d/workflow_convert_image_to_usd.py Outdated
Comment thread tests/conftest.py
Comment thread tutorials/tutorial_04_fit_statistical_model_to_patient.py Outdated
Copilot AI review requested due to automatic review settings July 14, 2026 20:24

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
tutorials/tutorial_01b_lung_gated_ct_to_usd.py (1)

141-150: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Change usd_project_name to reflect lung anatomy.

Since this tutorial processes lung data from DirLab, consider renaming the USD project name from "cardiac_model" to "lung_model" (or similar) to avoid confusion in the output artifacts.

♻️ Proposed fix
     workflow = WorkflowConvertImageToUSD(
         time_series_images=time_series_images,
         reference_image=reference_image,
         output_directory=str(output_dir),
-        usd_project_name="cardiac_model",
+        usd_project_name="lung_model",
         registration_method=registration_method,
         log_level=log_level,
         save_assets=True,
     )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tutorials/tutorial_01b_lung_gated_ct_to_usd.py` around lines 141 - 150,
Update the usd_project_name argument in the WorkflowConvertImageToUSD
initialization to use a lung-specific name such as "lung_model" instead of
"cardiac_model", keeping the remaining workflow configuration unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tutorials/tutorial_01b_lung_gated_ct_to_usd.py`:
- Around line 1-68: Update the module-level docstring to describe the
DirLab-4DCT lung workflow rather than cardiac processing. Replace heart-specific
title, anatomy, dataset, input path, terminology, class descriptions, and output
filenames with accurate lung tutorial details, while preserving the documented
workflow purpose, requirements, and limitations where applicable.

---

Nitpick comments:
In `@tutorials/tutorial_01b_lung_gated_ct_to_usd.py`:
- Around line 141-150: Update the usd_project_name argument in the
WorkflowConvertImageToUSD initialization to use a lung-specific name such as
"lung_model" instead of "cardiac_model", keeping the remaining workflow
configuration unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4025c926-9f8f-42b0-8e87-1afd927394ca

📥 Commits

Reviewing files that changed from the base of the PR and between 5e27522 and 88f6692.

📒 Files selected for processing (113)
  • data/DirLab-4DCT/README.md
  • data/DirLab-4DCT/downloaded_data/Case10Pack_T00.mhd
  • data/DirLab-4DCT/downloaded_data/Case10Pack_T10.mhd
  • data/DirLab-4DCT/downloaded_data/Case10Pack_T20.mhd
  • data/DirLab-4DCT/downloaded_data/Case10Pack_T30.mhd
  • data/DirLab-4DCT/downloaded_data/Case10Pack_T40.mhd
  • data/DirLab-4DCT/downloaded_data/Case10Pack_T50.mhd
  • data/DirLab-4DCT/downloaded_data/Case10Pack_T60.mhd
  • data/DirLab-4DCT/downloaded_data/Case10Pack_T70.mhd
  • data/DirLab-4DCT/downloaded_data/Case10Pack_T80.mhd
  • data/DirLab-4DCT/downloaded_data/Case10Pack_T90.mhd
  • data/DirLab-4DCT/downloaded_data/Case1Pack_T00.mhd
  • data/DirLab-4DCT/downloaded_data/Case1Pack_T10.mhd
  • data/DirLab-4DCT/downloaded_data/Case1Pack_T20.mhd
  • data/DirLab-4DCT/downloaded_data/Case1Pack_T30.mhd
  • data/DirLab-4DCT/downloaded_data/Case1Pack_T40.mhd
  • data/DirLab-4DCT/downloaded_data/Case1Pack_T50.mhd
  • data/DirLab-4DCT/downloaded_data/Case1Pack_T60.mhd
  • data/DirLab-4DCT/downloaded_data/Case1Pack_T70.mhd
  • data/DirLab-4DCT/downloaded_data/Case1Pack_T80.mhd
  • data/DirLab-4DCT/downloaded_data/Case1Pack_T90.mhd
  • data/DirLab-4DCT/downloaded_data/Case2Pack_T00.mhd
  • data/DirLab-4DCT/downloaded_data/Case2Pack_T10.mhd
  • data/DirLab-4DCT/downloaded_data/Case2Pack_T20.mhd
  • data/DirLab-4DCT/downloaded_data/Case2Pack_T30.mhd
  • data/DirLab-4DCT/downloaded_data/Case2Pack_T40.mhd
  • data/DirLab-4DCT/downloaded_data/Case2Pack_T50.mhd
  • data/DirLab-4DCT/downloaded_data/Case2Pack_T60.mhd
  • data/DirLab-4DCT/downloaded_data/Case2Pack_T70.mhd
  • data/DirLab-4DCT/downloaded_data/Case2Pack_T80.mhd
  • data/DirLab-4DCT/downloaded_data/Case2Pack_T90.mhd
  • data/DirLab-4DCT/downloaded_data/Case3Pack_T00.mhd
  • data/DirLab-4DCT/downloaded_data/Case3Pack_T10.mhd
  • data/DirLab-4DCT/downloaded_data/Case3Pack_T20.mhd
  • data/DirLab-4DCT/downloaded_data/Case3Pack_T30.mhd
  • data/DirLab-4DCT/downloaded_data/Case3Pack_T40.mhd
  • data/DirLab-4DCT/downloaded_data/Case3Pack_T50.mhd
  • data/DirLab-4DCT/downloaded_data/Case3Pack_T60.mhd
  • data/DirLab-4DCT/downloaded_data/Case3Pack_T70.mhd
  • data/DirLab-4DCT/downloaded_data/Case3Pack_T80.mhd
  • data/DirLab-4DCT/downloaded_data/Case3Pack_T90.mhd
  • data/DirLab-4DCT/downloaded_data/Case4Pack_T00.mhd
  • data/DirLab-4DCT/downloaded_data/Case4Pack_T10.mhd
  • data/DirLab-4DCT/downloaded_data/Case4Pack_T20.mhd
  • data/DirLab-4DCT/downloaded_data/Case4Pack_T30.mhd
  • data/DirLab-4DCT/downloaded_data/Case4Pack_T40.mhd
  • data/DirLab-4DCT/downloaded_data/Case4Pack_T50.mhd
  • data/DirLab-4DCT/downloaded_data/Case4Pack_T60.mhd
  • data/DirLab-4DCT/downloaded_data/Case4Pack_T70.mhd
  • data/DirLab-4DCT/downloaded_data/Case4Pack_T80.mhd
  • data/DirLab-4DCT/downloaded_data/Case4Pack_T90.mhd
  • data/DirLab-4DCT/downloaded_data/Case5Pack_T00.mhd
  • data/DirLab-4DCT/downloaded_data/Case5Pack_T10.mhd
  • data/DirLab-4DCT/downloaded_data/Case5Pack_T20.mhd
  • data/DirLab-4DCT/downloaded_data/Case5Pack_T30.mhd
  • data/DirLab-4DCT/downloaded_data/Case5Pack_T40.mhd
  • data/DirLab-4DCT/downloaded_data/Case5Pack_T50.mhd
  • data/DirLab-4DCT/downloaded_data/Case5Pack_T60.mhd
  • data/DirLab-4DCT/downloaded_data/Case5Pack_T70.mhd
  • data/DirLab-4DCT/downloaded_data/Case5Pack_T80.mhd
  • data/DirLab-4DCT/downloaded_data/Case5Pack_T90.mhd
  • data/DirLab-4DCT/downloaded_data/Case6Pack_T00.mhd
  • data/DirLab-4DCT/downloaded_data/Case6Pack_T10.mhd
  • data/DirLab-4DCT/downloaded_data/Case6Pack_T20.mhd
  • data/DirLab-4DCT/downloaded_data/Case6Pack_T30.mhd
  • data/DirLab-4DCT/downloaded_data/Case6Pack_T40.mhd
  • data/DirLab-4DCT/downloaded_data/Case6Pack_T50.mhd
  • data/DirLab-4DCT/downloaded_data/Case6Pack_T60.mhd
  • data/DirLab-4DCT/downloaded_data/Case6Pack_T70.mhd
  • data/DirLab-4DCT/downloaded_data/Case6Pack_T80.mhd
  • data/DirLab-4DCT/downloaded_data/Case6Pack_T90.mhd
  • data/DirLab-4DCT/downloaded_data/Case7Pack_T00.mhd
  • data/DirLab-4DCT/downloaded_data/Case7Pack_T10.mhd
  • data/DirLab-4DCT/downloaded_data/Case7Pack_T20.mhd
  • data/DirLab-4DCT/downloaded_data/Case7Pack_T30.mhd
  • data/DirLab-4DCT/downloaded_data/Case7Pack_T40.mhd
  • data/DirLab-4DCT/downloaded_data/Case7Pack_T50.mhd
  • data/DirLab-4DCT/downloaded_data/Case7Pack_T60.mhd
  • data/DirLab-4DCT/downloaded_data/Case7Pack_T70.mhd
  • data/DirLab-4DCT/downloaded_data/Case7Pack_T80.mhd
  • data/DirLab-4DCT/downloaded_data/Case7Pack_T90.mhd
  • data/DirLab-4DCT/downloaded_data/Case8Deploy_T00.mhd
  • data/DirLab-4DCT/downloaded_data/Case8Deploy_T10.mhd
  • data/DirLab-4DCT/downloaded_data/Case8Deploy_T20.mhd
  • data/DirLab-4DCT/downloaded_data/Case8Deploy_T30.mhd
  • data/DirLab-4DCT/downloaded_data/Case8Deploy_T40.mhd
  • data/DirLab-4DCT/downloaded_data/Case8Deploy_T50.mhd
  • data/DirLab-4DCT/downloaded_data/Case8Deploy_T60.mhd
  • data/DirLab-4DCT/downloaded_data/Case8Deploy_T70.mhd
  • data/DirLab-4DCT/downloaded_data/Case8Deploy_T80.mhd
  • data/DirLab-4DCT/downloaded_data/Case8Deploy_T90.mhd
  • data/DirLab-4DCT/downloaded_data/Case9Pack_T00.mhd
  • data/DirLab-4DCT/downloaded_data/Case9Pack_T10.mhd
  • data/DirLab-4DCT/downloaded_data/Case9Pack_T20.mhd
  • data/DirLab-4DCT/downloaded_data/Case9Pack_T30.mhd
  • data/DirLab-4DCT/downloaded_data/Case9Pack_T40.mhd
  • data/DirLab-4DCT/downloaded_data/Case9Pack_T50.mhd
  • data/DirLab-4DCT/downloaded_data/Case9Pack_T60.mhd
  • data/DirLab-4DCT/downloaded_data/Case9Pack_T70.mhd
  • data/DirLab-4DCT/downloaded_data/Case9Pack_T80.mhd
  • data/DirLab-4DCT/downloaded_data/Case9Pack_T90.mhd
  • data/DirLab-4DCT/downloaded_data/Convert4DCTToMHD.py
  • data/DirLab-4DCT/fix_downloaded_data.py
  • experiments/Heart-Create_Statistical_Model/README.md
  • experiments/Lung-GatedCT_To_USD/0-register_dirlab_4dct.py
  • experiments/Lung-GatedCT_To_USD/Experiment_SegReg.py
  • experiments/Lung-GatedCT_To_USD/data_dirlab_4d_ct.py
  • src/physiotwin4d/data_download_tools.py
  • src/physiotwin4d/segment_chest_total_segmentator.py
  • tests/conftest.py
  • tutorials/tutorial_01b_lung_gated_ct_to_usd.py
  • tutorials/tutorial_04_fit_statistical_model_to_patient.py
  • tutorials/tutorial_06_reconstruct_highres_4d_ct.py
💤 Files with no reviewable changes (1)
  • tests/conftest.py
🚧 Files skipped from review as they are similar to previous changes (2)
  • tutorials/tutorial_04_fit_statistical_model_to_patient.py
  • src/physiotwin4d/segment_chest_total_segmentator.py

Comment thread tutorials/tutorial_01b_lung_gated_ct_to_usd.py
Copilot AI review requested due to automatic review settings July 14, 2026 20:48

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@aylward aylward merged commit 9089787 into Project-MONAI:main Jul 14, 2026
9 checks passed
@aylward aylward deleted the fit_to_patient branch July 14, 2026 21:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants