Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion monai/transforms/io/array.py
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,10 @@ def __call__(self, filename: Sequence[PathLike] | PathLike, reader: ImageReader
img_array, meta_data, self.simple_keys, pattern=self.pattern, sep=self.sep
)
if self.ensure_channel_first:
img = EnsureChannelFirst()(img)
if not isinstance(img, MetaTensor):
img = EnsureChannelFirst()(img, meta_dict=meta_data)
else:
img = EnsureChannelFirst()(img)
Comment on lines 302 to +306
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Check whether tests already cover disabled meta tracking with ensure_channel_first.
# Expect: At least one test combines set_track_meta(False) with ensure_channel_first=True.

rg -n -C3 'set_track_meta\s*\(\s*False\s*\)' --type py
rg -n -C3 'ensure_channel_first\s*=\s*True' --type py

Repository: Project-MONAI/MONAI

Length of output: 18238


🏁 Script executed:

# Find LoadImage/LoadImaged test files
fd -e py "test_load_image" tests/

Repository: Project-MONAI/MONAI

Length of output: 135


🏁 Script executed:

# Search within LoadImage test files for set_track_meta(False) usage
rg -l "class.*LoadImage" tests/ --type py

Repository: Project-MONAI/MONAI

Length of output: 166


🏁 Script executed:

# Check test_load_image.py and test_load_imaged.py for both conditions
for f in tests/transforms/test_load_image.py tests/transforms/test_load_imaged.py; do
  echo "=== $f ==="
  if [ -f "$f" ]; then
    rg -A5 -B5 "ensure_channel_first.*=.*True" "$f" | head -50
    echo "---"
    rg -A5 -B5 "set_track_meta.*False" "$f" | head -50
  fi
done

Repository: Project-MONAI/MONAI

Length of output: 783


🏁 Script executed:

# Read test_load_image.py to check for set_track_meta usage
wc -l tests/transforms/test_load_image.py

Repository: Project-MONAI/MONAI

Length of output: 102


🏁 Script executed:

# Read test_load_imaged.py to check for set_track_meta usage
wc -l tests/transforms/test_load_imaged.py

Repository: Project-MONAI/MONAI

Length of output: 103


🏁 Script executed:

# Check both files for any set_track_meta calls
grep -n "set_track_meta" tests/transforms/test_load_image.py tests/transforms/test_load_imaged.py

Repository: Project-MONAI/MONAI

Length of output: 386


🏁 Script executed:

# Get context around ensure_channel_first usage in both test files
rg -B10 -A10 "ensure_channel_first\s*=\s*True" tests/transforms/test_load_image.py

Repository: Project-MONAI/MONAI

Length of output: 45


🏁 Script executed:

rg -B10 -A10 "ensure_channel_meta_first\s*=\s*True" tests/transforms/test_load_imaged.py

Repository: Project-MONAI/MONAI

Length of output: 45


🏁 Script executed:

# Check lines around set_track_meta in test_load_image.py
sed -n '480,495p' tests/transforms/test_load_image.py

Repository: Project-MONAI/MONAI

Length of output: 734


🏁 Script executed:

# Check lines around set_track_meta in test_load_imaged.py
sed -n '168,185p' tests/transforms/test_load_imaged.py

Repository: Project-MONAI/MONAI

Length of output: 696


🏁 Script executed:

# Search for any ensure_channel_first in test files (case-insensitive)
rg -i "ensure_channel_first" tests/transforms/test_load_image.py tests/transforms/test_load_imaged.py

Repository: Project-MONAI/MONAI

Length of output: 831


🏁 Script executed:

# Find TESTS_META definition in test_load_image.py
rg -B5 -A5 "TESTS_META\s*=" tests/transforms/test_load_image.py

Repository: Project-MONAI/MONAI

Length of output: 347


🏁 Script executed:

# Find TESTS_META definition in test_load_imaged.py
rg -B5 -A5 "TESTS_META\s*=" tests/transforms/test_load_imaged.py

Repository: Project-MONAI/MONAI

Length of output: 444


🏁 Script executed:

# Get the full test_correct test method in test_load_image.py
sed -n '485,510p' tests/transforms/test_load_image.py

Repository: Project-MONAI/MONAI

Length of output: 825


🏁 Script executed:

# Check if TESTS_META includes ensure_channel_first anywhere
rg -A20 "TESTS_META\s*=" tests/transforms/test_load_image.py | grep "ensure_channel_first"

Repository: Project-MONAI/MONAI

Length of output: 45


🏁 Script executed:

rg -A20 "TESTS_META\s*=" tests/transforms/test_load_imaged.py | grep "ensure_channel_first"

Repository: Project-MONAI/MONAI

Length of output: 45


🏁 Script executed:

# Find all test methods that use ensure_channel_first in test files
rg -B2 "ensure_channel_first" tests/transforms/test_load_image.py tests/transforms/test_load_imaged.py | head -80

Repository: Project-MONAI/MONAI

Length of output: 1457


🏁 Script executed:

# Check if any of those tests also call set_track_meta(False)
rg -B20 "ensure_channel_first\s*=\s*True" tests/transforms/test_load_image.py | rg "set_track_meta"

Repository: Project-MONAI/MONAI

Length of output: 45


🏁 Script executed:

# Check which test method uses TEST_CASE_14, TEST_CASE_18, TEST_CASE_20
rg "TEST_CASE_14|TEST_CASE_18|TEST_CASE_20" tests/transforms/test_load_image.py

Repository: Project-MONAI/MONAI

Length of output: 337


🏁 Script executed:

# Get the test method that uses these test cases
sed -n '445,475p' tests/transforms/test_load_image.py

Repository: Project-MONAI/MONAI

Length of output: 1501


🏁 Script executed:

# Get context around the test_channel_dim method to see full implementation
sed -n '455,480p' tests/transforms/test_load_image.py

Repository: Project-MONAI/MONAI

Length of output: 1281


🏁 Script executed:

# Verify the _cmp method in test_load_imaged.py is not using set_track_meta(False)
sed -n '97,115p' tests/transforms/test_load_imaged.py

Repository: Project-MONAI/MONAI

Length of output: 931


Add regression test for set_track_meta(False) + ensure_channel_first=True.

The fix is correct, but there is no test coverage for set_track_meta(False) combined with LoadImage(..., ensure_channel_first=True) or LoadImaged(..., ensure_channel_first=True). Existing tests cover meta tracking separately from channel-first ordering, but not together. Add a test case to prevent regression of this specific scenario.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@monai/transforms/io/array.py` around lines 302 - 306, Add a regression test
that verifies disabling meta tracking with set_track_meta(False) does not break
channel-first conversion when using LoadImage or LoadImaged with
ensure_channel_first=True: create a test that calls set_track_meta(False), runs
LoadImage(..., ensure_channel_first=True) (and a LoadImaged variant) on a sample
array, and asserts the output is channel-first (shape/order) and that no
MetaTensor metadata is attached (or meta dict remains absent) to ensure
EnsureChannelFirst still runs on plain tensors; reference EnsureChannelFirst,
LoadImage/LoadImaged, ensure_channel_first, set_track_meta, and MetaTensor when
locating code to test.

if self.image_only:
return img
return img, img.meta if isinstance(img, MetaTensor) else meta_data
Expand Down
Loading