Skip to content

Commit

Permalink
ENH: Isolate img that is being corrupted.
Browse files Browse the repository at this point in the history
  • Loading branch information
hjmjohnson committed Aug 8, 2022
1 parent 554e45b commit 6a5a715
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 129 deletions.
81 changes: 43 additions & 38 deletions Modules/IO/ImageBase/include/itkIOTestHelper.h
Expand Up @@ -75,55 +75,60 @@ class IOTestHelper

template <typename ImageType, typename ImageIOType>
static void
WriteImage(typename ImageType::Pointer & image,
WriteImage(typename ImageType::Pointer image,
const std::string & filename,
typename ImageIOType::Pointer imageio = nullptr)
{

using WriterType = itk::ImageFileWriter<ImageType>;
auto writer = WriterType::New();

if (imageio.IsNull())
{
imageio = ImageIOType::New();
}

writer->SetImageIO(imageio);

writer->SetFileName(filename.c_str());

writer->SetInput(image);

try
{
writer->Update();
}
catch (const itk::ExceptionObject & err)
{
std::cerr << "Exception Object caught: " << std::endl << err << std::endl;
throw;
using WriterType = itk::ImageFileWriter<ImageType>;
{ // Test valid filename writing
auto writer = WriterType::New();
writer->SetImageIO(imageio);
writer->SetFileName(filename);
writer->SetInput(image);
try
{
writer->Update();
}
catch (const itk::ExceptionObject & err)
{
std::cerr << "Exception Object caught: " << std::endl << err << std::endl;
throw;
}
}

// Test if writing to an invalid location causes exception to be thrown:
const std::string bad_root_path{ "/a_blatantly_obvious/bad_file_path/that/should/never/exist/on/the/computer/" };
const std::string bad_filename{ bad_root_path + filename };
try
{
{ // Test if writing to an invalid location causes exception to be thrown:
const std::string bad_root_path{ "/a_blatantly_obvious/bad_file_path/that/should/never/exist/on/the/computer/" };
const std::string bad_filename{ bad_root_path + filename };
bool exception_correctly_caught = false;

auto writer = WriterType::New();
writer->SetImageIO(imageio);
writer->SetFileName(bad_filename);
writer->Update();
}
catch (const itk::ExceptionObject & err)
{
// This is the correct behavior
std::cout << "Correctly caught exception for attempting to write to an invalid file." << std::endl;
return;
}
catch (...)
{
itkGenericExceptionMacro(<< "IO library exception not converted to an itk::ExceptionObject.");
writer->SetInput(image);
try
{
writer->Update();
}
catch (const itk::ExceptionObject & err)
{
// This is the correct behavior
std::cout << "Correctly caught exception for attempting to write to an invalid file." << std::endl;
exception_correctly_caught = true;
}
catch (...)
{
itkGenericExceptionMacro(<< "IO library exception not converted to an itk::ExceptionObject.");
}
if (!exception_correctly_caught)
{
itkGenericExceptionMacro(<< "Invalid file writing path did not throw an exception: " << bad_filename << " with "
<< imageio->GetNameOfClass());
}
}
itkGenericExceptionMacro(<< "Invalid file writing path did not throw an exception: " << bad_filename << " with "
<< imageio->GetNameOfClass());
}

//
Expand Down
185 changes: 94 additions & 91 deletions Modules/IO/NIFTI/test/itkNiftiImageIOTest.h
Expand Up @@ -76,110 +76,113 @@ MakeNiftiImage()

const typename ImageType::IndexType index = { { 0, 0, 0 } };
typename ImageType::RegionType region(index, size);
typename ImageType::Pointer img = itk::IOTestHelper::AllocateImageFromRegionAndSpacing<ImageType>(region, spacing);
{
typename ImageType::Pointer img = itk::IOTestHelper::AllocateImageFromRegionAndSpacing<ImageType>(region, spacing);

{ // Fill in entire image
itk::ImageRegionIterator<ImageType> ri(img, region);
try
{
while (!ri.IsAtEnd())
{ // Fill in entire image
itk::ImageRegionIterator<ImageType> ri(img, region);
try
{
ri.Set(RPI);
++ri;
while (!ri.IsAtEnd())
{
ri.Set(RPI);
++ri;
}
}
catch (const itk::ExceptionObject & ex)
{
std::cerr << "Error filling array" << ex << std::endl;
return EXIT_FAILURE;
}
}
catch (const itk::ExceptionObject & ex)
{
std::cerr << "Error filling array" << ex << std::endl;
return EXIT_FAILURE;
}
}

typename ImageType::RegionType RPIregion;
itk::ImageRegionIterator<ImageType> RPIiterator;
typename ImageType::RegionType RPIregion;
itk::ImageRegionIterator<ImageType> RPIiterator;

{ // Fill in left half
const typename ImageType::IndexType RPIindex = { { 0, 0, 0 } };
const typename ImageType::SizeType RPIsize = { { 5, 10, 10 } };
RPIregion = typename ImageType::RegionType(RPIindex, RPIsize);
RPIiterator = itk::ImageRegionIterator<ImageType>(img, RPIregion);
while (!RPIiterator.IsAtEnd())
{ // Fill in left half
const typename ImageType::IndexType RPIindex = { { 0, 0, 0 } };
const typename ImageType::SizeType RPIsize = { { 5, 10, 10 } };
RPIregion = typename ImageType::RegionType(RPIindex, RPIsize);
RPIiterator = itk::ImageRegionIterator<ImageType>(img, RPIregion);
while (!RPIiterator.IsAtEnd())
{
RPIiterator.Set(RPIiterator.Get() + LEFT);
++RPIiterator;
}
}
{ // Fill in anterior half
const typename ImageType::IndexType RPIindex = { { 0, 5, 0 } };
const typename ImageType::SizeType RPIsize = { { 10, 5, 10 } };
RPIregion = typename ImageType::RegionType(RPIindex, RPIsize);
RPIiterator = itk::ImageRegionIterator<ImageType>(img, RPIregion);
while (!RPIiterator.IsAtEnd())
{
RPIiterator.Set(RPIiterator.Get() + ANTERIOR);
++RPIiterator;
}
}
{ // Fill in superior half
const typename ImageType::IndexType RPIindex = { { 0, 0, 5 } };
const typename ImageType::SizeType RPIsize = { { 10, 10, 5 } };
RPIregion = typename ImageType::RegionType(RPIindex, RPIsize);
RPIiterator = itk::ImageRegionIterator<ImageType>(img, RPIregion);
while (!RPIiterator.IsAtEnd())
{
RPIiterator.Set(RPIiterator.Get() + SUPERIOR);
++RPIiterator;
}
}
{
RPIiterator.Set(RPIiterator.Get() + LEFT);
++RPIiterator;
// Don't use identity DirectionCosine, Unit Spacing, or Zero Origin
typename ImageType::DirectionType dc;
dc[0][0] = 0;
dc[0][1] = 1;
dc[0][2] = 0;
dc[1][0] = 0;
dc[1][1] = 0;
dc[1][2] = 1;
dc[2][0] = 1;
dc[2][1] = 0;
dc[2][2] = 0;
img->SetDirection(dc);
typename ImageType::SpacingType sp;
sp[0] = 1.0;
sp[1] = 2.0;
sp[2] = 3.0;
img->SetSpacing(sp);
typename ImageType::PointType og;
og[0] = -10.0;
og[1] = -20.0;
og[2] = -30.0;
img->SetOrigin(og);
}
}
{ // Fill in anterior half
const typename ImageType::IndexType RPIindex = { { 0, 5, 0 } };
const typename ImageType::SizeType RPIsize = { { 10, 5, 10 } };
RPIregion = typename ImageType::RegionType(RPIindex, RPIsize);
RPIiterator = itk::ImageRegionIterator<ImageType>(img, RPIregion);
while (!RPIiterator.IsAtEnd())
{
RPIiterator.Set(RPIiterator.Get() + ANTERIOR);
++RPIiterator;
// Set the qform, sfrom and aux_file values for the MetaDataDictionary.
itk::MetaDataDictionary & thisDic = img->GetMetaDataDictionary();
itk::EncapsulateMetaData<std::string>(thisDic, "qform_code_name", "NIFTI_XFORM_SCANNER_ANAT");
itk::EncapsulateMetaData<std::string>(thisDic, "sform_code_name", "NIFTI_XFORM_UNKNOWN");
itk::EncapsulateMetaData<std::string>(thisDic, "aux_file", "aux_info.txt");
}
}
{ // Fill in superior half
const typename ImageType::IndexType RPIindex = { { 0, 0, 5 } };
const typename ImageType::SizeType RPIsize = { { 10, 10, 5 } };
RPIregion = typename ImageType::RegionType(RPIindex, RPIsize);
RPIiterator = itk::ImageRegionIterator<ImageType>(img, RPIregion);
while (!RPIiterator.IsAtEnd())

try
{
RPIiterator.Set(RPIiterator.Get() + SUPERIOR);
++RPIiterator;
itk::IOTestHelper::WriteImage<ImageType, itk::NiftiImageIO>(img, std::string(filename));
}
}
{
// Don't use identity DirectionCosine, Unit Spacing, or Zero Origin
typename ImageType::DirectionType dc;
dc[0][0] = 0;
dc[0][1] = 1;
dc[0][2] = 0;
dc[1][0] = 0;
dc[1][1] = 0;
dc[1][2] = 1;
dc[2][0] = 1;
dc[2][1] = 0;
dc[2][2] = 0;
img->SetDirection(dc);
typename ImageType::SpacingType sp;
sp[0] = 1.0;
sp[1] = 2.0;
sp[2] = 3.0;
img->SetSpacing(sp);
typename ImageType::PointType og;
og[0] = -10.0;
og[1] = -20.0;
og[2] = -30.0;
img->SetOrigin(og);
}
{
// Set the qform, sfrom and aux_file values for the MetaDataDictionary.
itk::MetaDataDictionary & thisDic = img->GetMetaDataDictionary();
itk::EncapsulateMetaData<std::string>(thisDic, "qform_code_name", "NIFTI_XFORM_SCANNER_ANAT");
itk::EncapsulateMetaData<std::string>(thisDic, "sform_code_name", "NIFTI_XFORM_UNKNOWN");
itk::EncapsulateMetaData<std::string>(thisDic, "aux_file", "aux_info.txt");
}
catch (const itk::ExceptionObject & ex)
{
std::string message;
message = "Problem found while writing image ";
message += filename;
message += "\n";
message += ex.GetLocation();
message += "\n";
message += ex.GetDescription();
std::cerr << message << std::endl;
itk::IOTestHelper::Remove(filename);
return EXIT_FAILURE;
}
} // End writing image test

try
{
itk::IOTestHelper::WriteImage<ImageType, itk::NiftiImageIO>(img, std::string(filename));
}
catch (const itk::ExceptionObject & ex)
{
std::string message;
message = "Problem found while writing image ";
message += filename;
message += "\n";
message += ex.GetLocation();
message += "\n";
message += ex.GetDescription();
std::cerr << message << std::endl;
itk::IOTestHelper::Remove(filename);
return EXIT_FAILURE;
}
typename ImageType::Pointer input;
try
{
Expand Down

0 comments on commit 6a5a715

Please sign in to comment.