1010
1111from imperandi .ingest import clean
1212
13+ ACQUISITION_TEMP_COLS = {
14+ "_acq_timestamp" ,
15+ "_series_number_sort" ,
16+ "_acquisition_number_sort" ,
17+ }
18+
19+
20+ def _assert_no_acquisition_temp_cols (df : pd .DataFrame ) -> None :
21+ assert ACQUISITION_TEMP_COLS .isdisjoint (df .columns )
22+
1323
1424def test_normalize_clean_args_prefers_optional_csv_path (tmp_path ):
1525 csv_pos = tmp_path / "pos.csv"
@@ -344,6 +354,7 @@ def test_compute_visit_and_acquisition_order():
344354 assert set (out2 ["acquisition_order" ].dropna ()) == {0 , 1 , 2 }
345355 assert (out2 ["delay_since_prev_acq_sec" ].dropna () >= 0 ).all ()
346356 assert (out2 ["delay_since_first_acq_sec" ].dropna () >= 0 ).all ()
357+ _assert_no_acquisition_temp_cols (out2 )
347358
348359 # Handles aggregated time values represented as datetime.time objects or repr strings
349360 df3 = pd .DataFrame (
@@ -367,6 +378,7 @@ def test_compute_visit_and_acquisition_order():
367378 assert out3 .set_index ("volume_id" ).loc ["v3" , "acquisition_order" ] == 2
368379 assert (out3 ["delay_since_prev_acq_sec" ].dropna () >= 0 ).all ()
369380 assert (out3 ["delay_since_first_acq_sec" ].dropna () >= 0 ).all ()
381+ _assert_no_acquisition_temp_cols (out3 )
370382
371383 # Ensure ordering uses acquisition timestamp, not lexical volume_id order.
372384 df4 = pd .DataFrame (
@@ -391,6 +403,7 @@ def test_compute_visit_and_acquisition_order():
391403 assert out4_by_volume .loc ["v1" , "acquisition_order" ] == 2
392404 assert (out4 ["delay_since_prev_acq_sec" ].dropna () >= 0 ).all ()
393405 assert (out4 ["delay_since_first_acq_sec" ].dropna () >= 0 ).all ()
406+ _assert_no_acquisition_temp_cols (out4 )
394407
395408
396409def test_compute_acquisition_order_without_time_uses_series_and_acquisition_number ():
@@ -413,6 +426,7 @@ def test_compute_acquisition_order_without_time_uses_series_and_acquisition_numb
413426 assert out_by_volume .loc ["v2" , "acquisition_order" ] == 0
414427 assert out_by_volume .loc ["v3" , "acquisition_order" ] == 1
415428 assert out_by_volume .loc ["v1" , "acquisition_order" ] == 2
429+ _assert_no_acquisition_temp_cols (out )
416430
417431
418432def test_compute_acquisition_order_without_date_and_time_falls_back_to_numbers ():
@@ -433,6 +447,7 @@ def test_compute_acquisition_order_without_date_and_time_falls_back_to_numbers()
433447 assert out_by_volume .loc ["v2" , "acquisition_order" ] == 0
434448 assert out_by_volume .loc ["v3" , "acquisition_order" ] == 1
435449 assert out_by_volume .loc ["v1" , "acquisition_order" ] == 2
450+ _assert_no_acquisition_temp_cols (out )
436451
437452
438453def test_compute_acquisition_order_tie_breaks_by_volume_id_when_no_sort_keys ():
@@ -450,6 +465,28 @@ def test_compute_acquisition_order_tie_breaks_by_volume_id_when_no_sort_keys():
450465 assert out_by_volume .loc ["v1" , "acquisition_order" ] == 0
451466 assert out_by_volume .loc ["v10" , "acquisition_order" ] == 1
452467 assert out_by_volume .loc ["v2" , "acquisition_order" ] == 2
468+ _assert_no_acquisition_temp_cols (out )
469+
470+
471+ def test_compute_acquisition_order_drops_internal_sort_columns ():
472+ df = pd .DataFrame (
473+ {
474+ "patient_key" : ["p" , "p" ],
475+ "study_id" : ["s" , "s" ],
476+ "volume_id" : ["v1" , "v2" ],
477+ "date" : [pd .Timestamp ("2020-01-01" ), pd .Timestamp ("2020-01-01" )],
478+ "time" : [dt_time (12 , 0 , 0 ), dt_time (12 , 1 , 0 )],
479+ "SeriesNumber" : [1 , 1 ],
480+ "AcquisitionNumber" : [1 , 2 ],
481+ }
482+ )
483+
484+ out = clean .compute_acquisition_order (df .copy ())
485+
486+ _assert_no_acquisition_temp_cols (out )
487+ assert "acquisition_order" in out .columns
488+ assert "delay_since_prev_acq_sec" in out .columns
489+ assert "delay_since_first_acq_sec" in out .columns
453490
454491
455492def test_group_volumes_sorts_acquisition_number_numerically ():
0 commit comments