From 9d1a98996b15b50abdf12004984a0222d3d8a726 Mon Sep 17 00:00:00 2001 From: "Gabriel A. Devenyi" Date: Tue, 2 Apr 2024 12:47:40 -0400 Subject: [PATCH] ENH: Refactor antsTransformInfo to add some error handling and compute determinant --- Examples/antsTransformInfo.cxx | 66 ++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 3 deletions(-) diff --git a/Examples/antsTransformInfo.cxx b/Examples/antsTransformInfo.cxx index 98e8ba65f..b2abe9b3d 100644 --- a/Examples/antsTransformInfo.cxx +++ b/Examples/antsTransformInfo.cxx @@ -19,6 +19,9 @@ #include "antsCommandLineParser.h" #include "itkTransformFileReader.h" +#include "itkMatrixOffsetTransformBase.h" +#include "itkCompositeTransform.h" + #include @@ -72,16 +75,73 @@ antsTransformInfo(std::vector args, std::ostream * /*out_stream = n }; Cleanup_argv cleanup_argv(argv, argc + 1); + using ReadScalarType = double; + for (int i = 1; i < argc; i++) { std::cout << "Transform file: " << argv[i] << std::endl; - itk::TransformFileReader::Pointer reader = itk::TransformFileReader::New(); + using TransformReaderType = itk::TransformFileReaderTemplate; + auto reader = TransformReaderType::New(); + reader->SetFileName(argv[i]); - reader->Update(); + try + { + reader->Update(); + } + catch (const itk::ExceptionObject & excp) + { + std::cerr << "Error while reading the transform file" << std::endl; + std::cerr << excp << std::endl; + std::cerr << "[FAILED]" << std::endl; + return EXIT_FAILURE; + } + + const TransformReaderType::TransformListType * transforms = reader->GetTransformList(); + std::cout << "Number of transforms = " << transforms->size() << std::endl; + + unsigned int Dimension = transforms->front()->GetInputSpaceDimension(); - std::cout << *(reader->GetTransformList()->begin()) << std::endl; + + for (auto it = transforms->begin(); it != transforms->end(); ++it) + { + + if (Dimension == 3) + { + using ReadCompositeTransformType3D = itk::CompositeTransform; + if (!strcmp((*it)->GetNameOfClass(), "CompositeTransform")) + { + ReadCompositeTransformType3D::Pointer compositeRead = + static_cast((*it).GetPointer()); + compositeRead->Print(std::cout); + } + else + { + using TransformType3D = itk::MatrixOffsetTransformBase; + TransformType3D * itktx3d = dynamic_cast((*it).GetPointer()); + itktx3d->Print(std::cout); + std::cout << "Determinant: " << vnl_determinant(itktx3d->GetMatrix().GetVnlMatrix()) << std::endl; + } + } + else if (Dimension == 2) + { + using ReadCompositeTransformType2D = itk::CompositeTransform; + if (!strcmp((*it)->GetNameOfClass(), "CompositeTransform")) + { + ReadCompositeTransformType2D::Pointer compositeRead = + static_cast((*it).GetPointer()); + compositeRead->Print(std::cout); + } + else + { + using TransformType2D = itk::MatrixOffsetTransformBase; + TransformType2D * itktx2d = dynamic_cast((*it).GetPointer()); + itktx2d->Print(std::cout); + std::cout << "Determinant: " << vnl_determinant(itktx2d->GetMatrix().GetVnlMatrix()) << std::endl; + } + } + } } return EXIT_SUCCESS;