BrainLesion / eReg

TODO
Apache License 2.0
1 stars 0 forks source link

transform / resampling does not work #61

Closed neuronflow closed 6 months ago

neuronflow commented 7 months ago

Describe the bug A clear and concise description of what the bug is.

To Reproduce Steps to reproduce the behavior:

t1c = "/home/florian/flow/BrainLesion/preprocessing/example/example_data/OtherEXampleFromTCIA/MRHR_T1_AX_POST_GAD_OtherEXampleTCIA_TCGA-FG-6692_Si_TCGA-FG-6692_MRHR_T1_AX_POST_GAD_SE_13_se2d1r_t1c.nii.gz"

fla = "/home/florian/flow/BrainLesion/preprocessing/example/example_data/OtherEXampleFromTCIA/MRHR_FLAIR_AX_OtherEXampleTCIA_TCGA-FG-6692_Si_TCGA-FG-6692_MRHR_FLAIR_AX_SE_IR_5_tir2d1_21_fla.nii.gz"

from ereg.registration import RegistrationClass

registration_obj = (
    RegistrationClass()
)  # the configuration file to use to customize the registration, and is optional
registration_obj.register(
    target_image=t1c,  # the target image, which can be either a file or SimpleITK.Image object
    moving_image=fla,  # the moving image, which can be either a file or SimpleITK.Image object
    output_image="/home/florian/flow/BrainLesion/preprocessing/ereg_tests/warped.nii.gz",  # the output image to save the registered image to
    transform_file="/home/florian/flow/BrainLesion/preprocessing/ereg_tests/transform.mat",  # the transform file to save the transform to; if already present, will use this transform instead of computing a new one
    log_file="/home/florian/flow/BrainLesion/preprocessing/ereg_tests/reg.log",  # the log file to write to
)

registration_obj.resample_image(
    target_image=t1c,  # the target image, which can be either a file or SimpleITK.Image object
    moving_image=fla,  # the moving image, which can be either a file or SimpleITK.Image object
    output_image="/home/florian/flow/BrainLesion/preprocessing/ereg_tests/warped_transform.nii.gz",  # the output image to save the registered image to
    transform_file="/home/florian/flow/BrainLesion/preprocessing/ereg_tests/transform.mat",
    log_file="/home/florian/flow/BrainLesion/preprocessing/ereg_tests/trans.log",
)

Expected behavior A log file and a transformation file should be created. An error msg should appear if this fails.

Environment Python 3.10

operating system and version?

e.g. Ubuntu 23.10 LTS Ubuntu 20

Python environment and version?

e.g. Conda environment with Python 3.10. Check your Python version with:

python --version
neuronflow commented 7 months ago

Why is the transform an optional input for the resample_image method?

We also need a unit test, that also tests this resampling.

sarthakpati commented 7 months ago

Can you check https://github.com/BrainLesion/eReg/commit/5a4f5d35e490c03137cba8cb9c1404d15ab05513?

neuronflow commented 7 months ago

Can you check 5a4f5d3?

Sorry, I cannot follow?

sarthakpati commented 7 months ago

Can you check 5a4f5d3?

Sorry, I cannot follow?

I meant, can you check out this commit and try again?

It should be the latest commit in the branch https://github.com/BrainLesion/eReg/tree/61-transform-resampling-does-not-work

neuronflow commented 7 months ago

Now a warp file but no log file is created.

Here the code I am using:

t1c = "/home/florian/flow/BrainLesion/preprocessing/example/example_data/OtherEXampleFromTCIA/MRHR_T1_AX_POST_GAD_OtherEXampleTCIA_TCGA-FG-6692_Si_TCGA-FG-6692_MRHR_T1_AX_POST_GAD_SE_13_se2d1r_t1c.nii.gz"

fla = "/home/florian/flow/BrainLesion/preprocessing/example/example_data/OtherEXampleFromTCIA/MRHR_FLAIR_AX_OtherEXampleTCIA_TCGA-FG-6692_Si_TCGA-FG-6692_MRHR_FLAIR_AX_SE_IR_5_tir2d1_21_fla.nii.gz"

from ereg.registration import RegistrationClass

registration_obj = (
    RegistrationClass()
)  # the configuration file to use to customize the registration, and is optional
registration_obj.register(
    target_image=t1c,  # the target image, which can be either a file or SimpleITK.Image object
    moving_image=fla,  # the moving image, which can be either a file or SimpleITK.Image object
    output_image="/home/florian/flow/eReg/ereg_tests/warped.nii.gz",  # the output image to save the registered image to
    transform_file="/home/florian/flow/eReg/ereg_tests/transform.mat",  # the transform file to save the transform to; if already present, will use this transform instead of computing a new one
    log_file="/home/florian/flow/eReg/ereg_tests/reg.log",  # the log file to write to
)

registration_obj.resample_image(
    target_image=t1c,  # the target image, which can be either a file or SimpleITK.Image object
    moving_image=fla,  # the moving image, which can be either a file or SimpleITK.Image object
    output_image="/home/florian/flow/eReg/ereg_tests/warped_transform.nii.gz",  # the output image to save the registered image to
    transform_file="/home/florian/flow/eReg/ereg_tests/transform.mat",
    log_file="/home/florian/flow/eReg/ereg_tests/trans.log",
)

I am using this example data for my tests: https://github.com/BrainLesion/preprocessing/tree/main/example/example_data

sarthakpati commented 7 months ago

Hmm, here is what I am getting using (very similar) code:

import os
from pprint import pprint
from ereg import RegistrationClass

base_output = "C:/Users/sarth/Downloads/ereg_test/"
pprint(f"Current files in {base_output}: {os.listdir(base_output)}")
fla = os.path.join(base_output, "fla.nii.gz")
t1c = os.path.join(base_output, "t1c.nii.gz")
output_image_file_0 = os.path.join(base_output, "fla_registered_0.nii.gz")
output_image_file_1 = os.path.join(base_output, "fla_registered_1.nii.gz")
output_transform_file = os.path.join(base_output, "fla_transform.mat")
log_file = os.path.join(base_output, "fla_registration.log")

registration_obj = RegistrationClass()
registration_obj.register(
    target_image=t1c,  # the target image, which can be either a file or SimpleITK.Image object
    moving_image=fla,  # the moving image, which can be either a file or SimpleITK.Image object
    output_image=output_image_file_0,  # the output image to save the registered image to
    transform_file=output_transform_file,  # the transform file to save the transform to; if already present, will use this transform instead of computing a new one
    log_file=log_file,  # the log file to write to
)
registration_obj.resample_image(
    target_image=t1c,  # the target image, which can be either a file or SimpleITK.Image object
    moving_image=fla,  # the moving image, which can be either a file or SimpleITK.Image object
    output_image=output_image_file_1,  # the output image to save the registered image to
    transform_file=output_transform_file,  # the transform file to save the transform to; if already present, will use this transform instead of computing a new one
    log_file=log_file,
)
pprint(f"Current files in {base_output}: {os.listdir(base_output)}")

Output:

("Current files in C:/Users/sarth/Downloads/ereg_test/: ['fla.nii.gz', "
 "'t1c.nii.gz']")
("Current files in C:/Users/sarth/Downloads/ereg_test/: ['fla.nii.gz', "
 "'fla_registered_0.nii.gz', 'fla_registered_1.nii.gz', "
 "'fla_registration.log', 'fla_transform.mat', 't1c.nii.gz']")

Log file: fla_registration.log

neuronflow commented 7 months ago

Can you try submitting another log file for the resampling? resampling_log_file = os.path.join(base_output, "fla_transformation.log")

sarthakpati commented 7 months ago

Can you try submitting another log file for the resampling? resampling_log_file = os.path.join(base_output, "fla_transformation.log")

That seems to have done it! log_file_1 in the example below was not generated:

from pprint import pprint
from ereg import RegistrationClass

base_output = "C:/Users/sarth/Downloads/ereg_test/"
pprint(f"Current files in {base_output}: {os.listdir(base_output)}")
fla = os.path.join(base_output, "fla.nii.gz")
t1c = os.path.join(base_output, "t1c.nii.gz")
output_image_file_0 = os.path.join(base_output, "fla_registered_0.nii.gz")
output_image_file_1 = os.path.join(base_output, "fla_registered_1.nii.gz")
output_transform_file = os.path.join(base_output, "fla_transform.mat")
log_file_0 = os.path.join(base_output, "fla_registration_0.log")
log_file_1 = os.path.join(base_output, "fla_registration_1.log")

registration_obj = RegistrationClass()
registration_obj.register(
    target_image=t1c,  # the target image, which can be either a file or SimpleITK.Image object
    moving_image=fla,  # the moving image, which can be either a file or SimpleITK.Image object
    output_image=output_image_file_0,  # the output image to save the registered image to
    transform_file=output_transform_file,  # the transform file to save the transform to; if already present, will use this transform instead of computing a new one
    log_file=log_file_0,  # the log file to write to
)
registration_obj.resample_image(
    target_image=t1c,  # the target image, which can be either a file or SimpleITK.Image object
    moving_image=fla,  # the moving image, which can be either a file or SimpleITK.Image object
    output_image=output_image_file_1,  # the output image to save the registered image to
    transform_file=output_transform_file,  # the transform file to save the transform to; if already present, will use this transform instead of computing a new one
    log_file=log_file_1,
)
pprint(f"Current files in {base_output}: {os.listdir(base_output)}")
("Current files in C:/Users/sarth/Downloads/ereg_test/: ['fla.nii.gz', "
 "'t1c.nii.gz']")
("Current files in C:/Users/sarth/Downloads/ereg_test/: ['fla.nii.gz', "
 "'fla_registered_0.nii.gz', 'fla_registered_1.nii.gz', "
 "'fla_registration_0.log', 'fla_transform.mat', 't1c.nii.gz']")
sarthakpati commented 7 months ago

I can confirm that the logging lines related to resampling [ref] are indeed getting invoked, but no idea why the file itself is not getting created.

UPDATE: Using the solution in a comment here worked. Can you please try with https://github.com/BrainLesion/eReg/commit/8072831cd2653b497a6ecdf748fef05db5ae7ea7? Here is my output from the previous code block:

("Current files in C:/Users/sarth/Downloads/ereg_test/: ['fla.nii.gz', "
 "'fla_registered_0.nii.gz', 'fla_registration_0.log', 'fla_transform.mat', "
 "'t1c.nii.gz']")
("Current files in C:/Users/sarth/Downloads/ereg_test/: ['fla.nii.gz', "
 "'fla_registered_0.nii.gz', 'fla_registered_1.nii.gz', "
 "'fla_registration_0.log', 'fla_registration_1.log', 'fla_transform.mat', "
 "'t1c.nii.gz']")
neuronflow commented 7 months ago

I tested, and still no log is created.

sarthakpati commented 7 months ago

Okay, in that case I don't know how else to proceed since I am unable to reproduce the error. Can you or someone else who is able to reproduce the issue try to debug this?

neuronflow commented 7 months ago

Do you test on a Windows machine? your paths seem to suggest that.

I believe one way would be to construct a unit test testing warp and log file creation, similar to this. Once this test is passed, hopefully it will work.

A primitive test could just check for existence of these files:

Inspiration: https://github.com/BrainLesion/preprocessing/pull/49/files#diff-caa1336a0c8d1b31e5d432977cd054bf8792b3d44cebfd4b70324fe0c62703aa

sarthakpati commented 7 months ago

Do you test on a Windows machine? your paths seem to suggest that.

Yes.

I believe one way would be to construct a unit test testing warp and log file creation, similar to this. Once this test is passed, hopefully it will work.

A few points:

  1. Since this issue is related to the logging library, I am unsure what would I do even if I manage to put together a test that passed. The test would fail on GitHub's Actions, but I would have no way to debug what's going on.
  2. Have you tried running the example code I put in this comment [ref]? If so, are you able to generate fla_registered_1.nii.gz? If so, then I think we can close this issue out and create a different one related to non-creation of logging. In any case, the logging problem can be (partially) circumvented by pushing all messages to the console.
sarthakpati commented 7 months ago

Do you test on a Windows machine? your paths seem to suggest that.

Yes.

I believe one way would be to construct a unit test testing warp and log file creation, similar to this. Once this test is passed, hopefully it will work.

A few points:

  1. Since this issue is related to the logging library, I am unsure what would I do even if I manage to put together a test that passed. The test would fail on GitHub's Actions, but I would have no way to debug what's going on.
  2. Have you tried running the example code I put in this comment [ref]? If so, are you able to generate fla_registered_1.nii.gz? If so, then I think we can close this issue out and create a different one related to non-creation of logging. In any case, the logging problem can be (partially) circumvented by pushing all messages to the console.

With https://github.com/BrainLesion/eReg/pull/62/commits/017cb6c8e45ac8450beb2cf6634a61aea4f0aa78, I am getting this output with the code I sent:

("Current files in C:/Users/sarth/Downloads/ereg_test/: ['fla.nii.gz', "
 "'t1c.nii.gz']")
Target image: C:/Users/sarth/Downloads/ereg_test/t1c.nii.gz, Moving image: C:/Users/sarth/Downloads/ereg_test/fla.nii.gz
Starting registration with parameters:: {'bias': False, 'metric_parameters': {'type': 'mean_squares', 'histogram_bins': 50, 'radius': 5, 'intensityDifferenceThreshold': 0.001, 'varianceForJointPDFSmoothing': 1.5}, 'optimizer_parameters': {'type': 'regular_step_gradient_descent', 'min_step': '1e-4', 'max_step': 1.0, 'iterations': 200, 'relaxation': 0.1, 'learningrate': 1.0, 'tolerance': '1e-6', 'convergence_minimum': '1e-6', 'convergence_window_size': 10, 'line_search_lower_limit': 0.0, 'line_search_upper_limit': 5.0, 'line_search_epsilon': 0.01, 'step_length': 0.1, 'simplex_delta': 0.1, 'maximum_number_of_corrections': 5, 'maximum_number_of_function_evaluations': 2000, 'solution_accuracy': '1e-5', 'hessian_approximate_accuracy': '1e-5', 'delta_convergence_distance': '1e-5', 'delta_convergence_tolerance': '1e-5', 'line_search_maximum_evaluations': 50, 'line_search_minimum_step': '1e-20', 'line_search_accuracy': '1e-4', 'epsilon': '1e-8', 'initial_radius': 1.0, 'growth_factor': -1.0, 'shrink_factor': -1.0, 'maximum_line_iterations': 100, 'step_tolerance': '1e-6', 'value_tolerance': '1e-6'}, 'transform': 'versorrigid', 'composite_transform': False, 'previous_transforms': [], 'initialization': 'geometry', 'interpolator': 'linear', 'sampling_strategy': 'random', 'sampling_percentage': 0.01, 'shrink_factors': [4, 2, 1], 'smoothing_sigmas': [2, 1, 0], 'attempts': 5}
Initializing registration.
Starting registration.
Final Optimizer Parameters:: convergence=0.0, iterations=30, metric=28450.710036942543, stop condition=RegularStepGradientDescentOptimizerv4: Step too small after 29 iterations. Current step (3.99601e-05) is less than minimum step (0.0001).
Target image: Image (0000021E33799B80)
  RTTI typeinfo:   class itk::Image<float,3>
  Reference Count: 1
  Modified Time: 1872
  Debug: Off
  Object Name:
  Observers:
    none
  Source: (none)
  Source output name: (none)
  Release Data: Off
  Data Released: False
  Global Release Data: Off
  PipelineMTime: 1856
  UpdateMTime: 1868
  RealTimeStamp: 0 seconds
  LargestPossibleRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [256, 224, 26]
  BufferedRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [256, 224, 26]
  RequestedRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [256, 224, 26]
  Spacing: [0.898438, 0.898438, 5.5]
  Origin: [-113.656, 74.6162, -46.8588]
  Direction:
0.998145 4.82309e-08 0.0608771
-0.00456797 -0.997181 0.0748977
-0.0607054 0.0750368 0.995331

  IndexToPointMatrix:
0.896771 4.33325e-08 0.334824
-0.00410404 -0.895905 0.411937
-0.05454 0.0674159 5.47432

  PointToIndexMatrix:
1.11098 -0.00508435 -0.0675678
5.37341e-08 -1.10991 0.0835193
0.0110686 0.0136178 0.180969

  Inverse Direction:
0.998145 -0.00456797 -0.0607054
4.82768e-08 -0.997181 0.0750368
0.0608771 0.0748977 0.995331

  PixelContainer:
    ImportImageContainer (0000021E324CD660)
      RTTI typeinfo:   class itk::ImportImageContainer<unsigned __int64,float>
      Reference Count: 1
      Modified Time: 1865
      Debug: Off
      Object Name:
      Observers:
        none
      Pointer: 0000021E72B76040
      Container manages memory: true
      Size: 1490944
      Capacity: 1490944
, Moving image: Image (0000021E337976F0)
  RTTI typeinfo:   class itk::Image<float,3>
  Reference Count: 1
  Modified Time: 2126
  Debug: Off
  Object Name:
  Observers:
    none
  Source: (none)
  Source output name: (none)
  Release Data: Off
  Data Released: False
  Global Release Data: Off
  PipelineMTime: 2111
  UpdateMTime: 2122
  RealTimeStamp: 0 seconds
  LargestPossibleRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [208, 256, 26]
  BufferedRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [208, 256, 26]
  RequestedRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [208, 256, 26]
  Spacing: [0.898438, 0.898438, 5.5]
  Origin: [-90.7199, 71.3685, -98.396]
  Direction:
0.998351 -8.88907e-10 -0.0574024
0.0164015 -0.95831 0.285258
0.0550093 0.285729 0.95673

  IndexToPointMatrix:
0.896956 -7.98627e-10 -0.315713
0.0147358 -0.860982 1.56892
0.0494224 0.25671 5.26202

  PointToIndexMatrix:
1.11121 0.0182556 0.0612277
-1.38278e-09 -1.06664 0.318029
-0.0104368 0.0518651 0.173951

  Inverse Direction:
0.998351 0.0164015 0.0550093
-1.24235e-09 -0.95831 0.285729
-0.0574023 0.285258 0.95673

  PixelContainer:
    ImportImageContainer (0000021E33D4D760)
      RTTI typeinfo:   class itk::ImportImageContainer<unsigned __int64,float>
      Reference Count: 1
      Modified Time: 2120
      Debug: Off
      Object Name:
      Observers:
        none
      Pointer: 0000021E7313D040
      Container manages memory: true
      Size: 1384448
      Capacity: 1384448
, Transform file: C:/Users/sarth/Downloads/ereg_test/fla_transform.mat
Resampling image.
SSIM score of moving against target image: 0.6702636855503058
Target image: C:/Users/sarth/Downloads/ereg_test/t1c.nii.gz, Moving image: C:/Users/sarth/Downloads/ereg_test/fla.nii.gz, Transform file: C:/Users/sarth/Downloads/ereg_test/fla_transform.mat
Resampling image.
SSIM score of moving against target image: 0.6702636855503058
("Current files in C:/Users/sarth/Downloads/ereg_test/: ['fla.nii.gz', "
 "'fla_registered_0.log', 'fla_registered_0.nii.gz', "
 "'fla_registered_1.nii.gz', 'fla_registration_0.log', "
 "'fla_registration_1.log', 'fla_transform.mat', 't1c.nii.gz']")

The log and console both get output.

neuronflow commented 7 months ago

I tried with this script:

t1c = "/home/florian/flow/BrainLesion/preprocessing/example/example_data/OtherEXampleFromTCIA/MRHR_T1_AX_POST_GAD_OtherEXampleTCIA_TCGA-FG-6692_Si_TCGA-FG-6692_MRHR_T1_AX_POST_GAD_SE_13_se2d1r_t1c.nii.gz"

fla = "/home/florian/flow/BrainLesion/preprocessing/example/example_data/OtherEXampleFromTCIA/MRHR_FLAIR_AX_OtherEXampleTCIA_TCGA-FG-6692_Si_TCGA-FG-6692_MRHR_FLAIR_AX_SE_IR_5_tir2d1_21_fla.nii.gz"

from ereg.registration import RegistrationClass

registration_obj = (
    RegistrationClass()
)  # the configuration file to use to customize the registration, and is optional
registration_obj.register(
    target_image=t1c,  # the target image, which can be either a file or SimpleITK.Image object
    moving_image=fla,  # the moving image, which can be either a file or SimpleITK.Image object
    output_image="/home/florian/flow/eReg/ereg_tests/warped.nii.gz",  # the output image to save the registered image to
    transform_file="/home/florian/flow/eReg/ereg_tests/transform.mat",  # the transform file to save the transform to; if already present, will use this transform instead of computing a new one
    log_file="/home/florian/flow/eReg/ereg_tests/reg.log",  # the log file to write to
)

registration_obj.resample_image(
    target_image=t1c,  # the target image, which can be either a file or SimpleITK.Image object
    moving_image=fla,  # the moving image, which can be either a file or SimpleITK.Image object
    output_image="/home/florian/flow/eReg/ereg_tests/warped_transform.nii.gz",  # the output image to save the registered image to
    transform_file="/home/florian/flow/eReg/ereg_tests/transform.mat",
    log_file="/home/florian/flow/eReg/ereg_tests/trans.log",
)

This now generates three log files:

as specified:

Additionally:

Should the register method expect two log file inputs? One for the registration one for the resampling part?

sarthakpati commented 7 months ago

Should the register method expect two log file inputs? One for the registration one for the resampling part?

Nope, all logging related to a task should go to a single file.

  • warped.log

This should not get generated if reg.log was given as an input for log_file. Weird...

neuronflow commented 7 months ago

indeed weird :)

contents of reg.log:

20:47:19,registration,INFO,Target image: /home/florian/flow/BrainLesion/preprocessing/example/example_data/OtherEXampleFromTCIA/MRHR_T1_AX_POST_GAD_OtherEXampleTCIA_TCGA-FG-6692_Si_TCGA-FG-6692_MRHR_T1_AX_POST_GAD_SE_13_se2d1r_t1c.nii.gz, Moving image: /home/florian/flow/BrainLesion/preprocessing/example/example_data/OtherEXampleFromTCIA/MRHR_FLAIR_AX_OtherEXampleTCIA_TCGA-FG-6692_Si_TCGA-FG-6692_MRHR_FLAIR_AX_SE_IR_5_tir2d1_21_fla.nii.gz

the other two log files remain empty.

Console:

(ereg) (base) florian@a4000-21an1:~/flow/eReg$ /home/florian/miniconda3/envs/ereg/bin/python /home/florian/flow/eReg/try.py
Target image: /home/florian/flow/BrainLesion/preprocessing/example/example_data/OtherEXampleFromTCIA/MRHR_T1_AX_POST_GAD_OtherEXampleTCIA_TCGA-FG-6692_Si_TCGA-FG-6692_MRHR_T1_AX_POST_GAD_SE_13_se2d1r_t1c.nii.gz, Moving image: /home/florian/flow/BrainLesion/preprocessing/example/example_data/OtherEXample
sarthakpati commented 6 months ago

Unable to replicate this. Code:

from pprint import pprint
from ereg import RegistrationClass

base_output = "C:/Users/sarth/Downloads/ereg_test/"
pprint(f"Current files in {base_output}: {os.listdir(base_output)}")
fla = os.path.join(base_output, "fla.nii.gz")
t1c = os.path.join(base_output, "t1c.nii.gz")
output_image_file_0 = os.path.join(base_output, "fla_registered.nii.gz")
output_image_file_1 = os.path.join(base_output, "fla_resampled.nii.gz")
output_transform_file = os.path.join(base_output, "fla_transform.mat")
log_file_0 = os.path.join(base_output, "registration.log")
log_file_1 = os.path.join(base_output, "resampling.log")

pprint("=== Starting registration ===")
pprint(f"Current files in {base_output}: {os.listdir(base_output)}")
registration_obj = RegistrationClass()
registration_obj.register(
    target_image=t1c,  # the target image, which can be either a file or SimpleITK.Image object
    moving_image=fla,  # the moving image, which can be either a file or SimpleITK.Image object
    output_image=output_image_file_0,  # the output image to save the registered image to
    transform_file=output_transform_file,  # the transform file to save the transform to; if already present, will use this transform instead of computing a new one
    log_file=log_file_0,  # the log file to write to
)
pprint("=== Starting resampling ===")
registration_obj.resample_image(
    target_image=t1c,  # the target image, which can be either a file or SimpleITK.Image object
    moving_image=fla,  # the moving image, which can be either a file or SimpleITK.Image object
    output_image=output_image_file_1,  # the output image to save the registered image to
    transform_file=output_transform_file,  # the transform file to save the transform to; if already present, will use this transform instead of computing a new one
    log_file=log_file_1,
)
pprint(f"Current files in {base_output}: {os.listdir(base_output)}")

Console output:

("Current files in C:/Users/sarth/Downloads/ereg_test/: ['fla.nii.gz', "
 "'t1c.nii.gz']")
'=== Starting registration ==='
("Current files in C:/Users/sarth/Downloads/ereg_test/: ['fla.nii.gz', "
 "'t1c.nii.gz']")
Target image: C:/Users/sarth/Downloads/ereg_test/t1c.nii.gz, Moving image: C:/Users/sarth/Downloads/ereg_test/fla.nii.gz
Starting registration with parameters:: {'bias': False, 'metric_parameters': {'type': 'mean_squares', 'histogram_bins': 50, 'radius': 5, 'intensityDifferenceThreshold': 0.001, 'varianceForJointPDFSmoothing': 1.5}, 'optimizer_parameters': {'type': 'regular_step_gradient_descent', 'min_step': '1e-4', 'max_step': 1.0, 'iterations': 200, 'relaxation': 0.1, 'learningrate': 1.0, 'tolerance': '1e-6', 'convergence_minimum': '1e-6', 'convergence_window_size': 10, 'line_search_lower_limit': 0.0, 'line_search_upper_limit': 5.0, 'line_search_epsilon': 0.01, 'step_length': 0.1, 'simplex_delta': 0.1, 'maximum_number_of_corrections': 5, 'maximum_number_of_function_evaluations': 2000, 'solution_accuracy': '1e-5', 'hessian_approximate_accuracy': '1e-5', 'delta_convergence_distance': '1e-5', 'delta_convergence_tolerance': '1e-5', 'line_search_maximum_evaluations': 50, 'line_search_minimum_step': '1e-20', 'line_search_accuracy': '1e-4', 'epsilon': '1e-8', 'initial_radius': 1.0, 'growth_factor': -1.0, 'shrink_factor': -1.0, 'maximum_line_iterations': 100, 'step_tolerance': '1e-6', 'value_tolerance': '1e-6'}, 'transform': 'versorrigid', 'composite_transform': False, 'previous_transforms': [], 'initialization': 'geometry', 'interpolator': 'linear', 'sampling_strategy': 'random', 'sampling_percentage': 0.01, 'shrink_factors': [4, 2, 1], 'smoothing_sigmas': [2, 1, 0], 'attempts': 5}
Initializing registration.
Starting registration.
Final Optimizer Parameters:: convergence=0.0, iterations=141, metric=29311.701283887756, stop condition=RegularStepGradientDescentOptimizerv4: Step too small after 140 iterations. Current step (5.89053e-05) is less than minimum step (0.0001).
Target image: Image (000001E64476B140)
  RTTI typeinfo:   class itk::Image<float,3>
  Reference Count: 1
  Modified Time: 1872
  Debug: Off
  Object Name: 
  Observers: 
    none
  Source: (none)
  Source output name: (none)
  Release Data: Off
  Data Released: False
  Global Release Data: Off
  PipelineMTime: 1856
  UpdateMTime: 1868
  RealTimeStamp: 0 seconds
  LargestPossibleRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [256, 224, 26]
  BufferedRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [256, 224, 26]
  RequestedRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [256, 224, 26]
  Spacing: [0.898438, 0.898438, 5.5]
  Origin: [-113.656, 74.6162, -46.8588]
  Direction:
0.998145 4.82309e-08 0.0608771
-0.00456797 -0.997181 0.0748977
-0.0607054 0.0750368 0.995331

  IndexToPointMatrix:
0.896771 4.33325e-08 0.334824
-0.00410404 -0.895905 0.411937
-0.05454 0.0674159 5.47432

  PointToIndexMatrix:
1.11098 -0.00508435 -0.0675678
5.37341e-08 -1.10991 0.0835193
0.0110686 0.0136178 0.180969

  Inverse Direction:
0.998145 -0.00456797 -0.0607054
4.82768e-08 -0.997181 0.0750368
0.0608771 0.0748977 0.995331

  PixelContainer:
    ImportImageContainer (000001E644924DE0)
      RTTI typeinfo:   class itk::ImportImageContainer<unsigned __int64,float>
      Reference Count: 1
      Modified Time: 1865
      Debug: Off
      Object Name:
      Observers:
        none
      Pointer: 000001E6045C6040
      Container manages memory: true
      Size: 1490944
      Capacity: 1490944
, Moving image: Image (000001E64476A060)
  RTTI typeinfo:   class itk::Image<float,3>
  Reference Count: 1
  Modified Time: 2126
  Debug: Off
  Object Name:
  Observers:
    none
  Source: (none)
  Source output name: (none)
  Release Data: Off
  Data Released: False
  Global Release Data: Off
  PipelineMTime: 2111
  UpdateMTime: 2122
  RealTimeStamp: 0 seconds
  LargestPossibleRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [208, 256, 26]
  BufferedRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [208, 256, 26]
  RequestedRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [208, 256, 26]
  Spacing: [0.898438, 0.898438, 5.5]
  Origin: [-90.7199, 71.3685, -98.396]
  Direction:
0.998351 -8.88907e-10 -0.0574024
0.0164015 -0.95831 0.285258
0.0550093 0.285729 0.95673

  IndexToPointMatrix:
0.896956 -7.98627e-10 -0.315713
0.0147358 -0.860982 1.56892
0.0494224 0.25671 5.26202

  PointToIndexMatrix:
1.11121 0.0182556 0.0612277
-1.38278e-09 -1.06664 0.318029
-0.0104368 0.0518651 0.173951

  Inverse Direction:
0.998351 0.0164015 0.0550093
-1.24235e-09 -0.95831 0.285729
-0.0574023 0.285258 0.95673

  PixelContainer:
    ImportImageContainer (000001E644923EE0)
      RTTI typeinfo:   class itk::ImportImageContainer<unsigned __int64,float>
      Reference Count: 1
      Modified Time: 2120
      Debug: Off
      Object Name:
      Observers:
        none
      Pointer: 000001E604B82040
      Container manages memory: true
      Size: 1384448
      Capacity: 1384448
, Transform file: C:/Users/sarth/Downloads/ereg_test/fla_transform.mat
Resampling image.
SSIM score of moving against target image: 0.6632827569421897
'=== Starting resampling ==='
Target image: C:/Users/sarth/Downloads/ereg_test/t1c.nii.gz, Moving image: C:/Users/sarth/Downloads/ereg_test/fla.nii.gz, Transform file: C:/Users/sarth/Downloads/ereg_test/fla_transform.mat
Resampling image.
SSIM score of moving against target image: 0.6632827569421897
("Current files in C:/Users/sarth/Downloads/ereg_test/: ['fla.nii.gz', "
 "'fla_registered.log', 'fla_registered.nii.gz', 'fla_resampled.nii.gz', "
 "'fla_transform.mat', 'registration.log', 'resampling.log', 't1c.nii.gz']")

Contents of log files:

registration.log

08:45:39,registration,INFO,Target image: C:/Users/sarth/Downloads/ereg_test/t1c.nii.gz, Moving image: C:/Users/sarth/Downloads/ereg_test/fla.nii.gz
08:45:39,registration,INFO,Starting registration with parameters:: {'bias': False, 'metric_parameters': {'type': 'mean_squares', 'histogram_bins': 50, 'radius': 5, 'intensityDifferenceThreshold': 0.001, 'varianceForJointPDFSmoothing': 1.5}, 'optimizer_parameters': {'type': 'regular_step_gradient_descent', 'min_step': '1e-4', 'max_step': 1.0, 'iterations': 200, 'relaxation': 0.1, 'learningrate': 1.0, 'tolerance': '1e-6', 'convergence_minimum': '1e-6', 'convergence_window_size': 10, 'line_search_lower_limit': 0.0, 'line_search_upper_limit': 5.0, 'line_search_epsilon': 0.01, 'step_length': 0.1, 'simplex_delta': 0.1, 'maximum_number_of_corrections': 5, 'maximum_number_of_function_evaluations': 2000, 'solution_accuracy': '1e-5', 'hessian_approximate_accuracy': '1e-5', 'delta_convergence_distance': '1e-5', 'delta_convergence_tolerance': '1e-5', 'line_search_maximum_evaluations': 50, 'line_search_minimum_step': '1e-20', 'line_search_accuracy': '1e-4', 'epsilon': '1e-8', 'initial_radius': 1.0, 'growth_factor': -1.0, 'shrink_factor': -1.0, 'maximum_line_iterations': 100, 'step_tolerance': '1e-6', 'value_tolerance': '1e-6'}, 'transform': 'versorrigid', 'composite_transform': False, 'previous_transforms': [], 'initialization': 'geometry', 'interpolator': 'linear', 'sampling_strategy': 'random', 'sampling_percentage': 0.01, 'shrink_factors': [4, 2, 1], 'smoothing_sigmas': [2, 1, 0], 'attempts': 5}
08:45:39,registration,INFO,Initializing registration.
08:45:39,registration,INFO,Starting registration.
08:45:41,registration,INFO,Final Optimizer Parameters:: convergence=0.0, iterations=141, metric=29311.701283887756, stop condition=RegularStepGradientDescentOptimizerv4: Step too small after 140 iterations. Current step (5.89053e-05) is less than minimum step (0.0001).

resampling.log

08:45:41,resample,INFO,Target image: C:/Users/sarth/Downloads/ereg_test/t1c.nii.gz, Moving image: C:/Users/sarth/Downloads/ereg_test/fla.nii.gz, Transform file: C:/Users/sarth/Downloads/ereg_test/fla_transform.mat
08:45:41,resample,INFO,Resampling image.
08:45:42,resample,INFO,SSIM score of moving against target image: 0.6632827569421897

Since this is now pretty much a wild goose chase, can we PLEASE get the associated PR for this merged and open up a separate issue for the log files?