Re-Run Pipeline With Changing Largest Possible Region

Synopsis

Re-run a pipeline where the LargestPossibleRegion in the pipeline is expected to change on consecutive runs. The pipeline does not detect this condition, and it will throw an exception,

Requested region is (at least partially) outside the largest possible region.

In this case, an UpdateLargestPossibleRegion() call is required instead of Update().

Results

Output:

Initial LargestPossibleRegion: ImageRegion (0x7fff11257330)
Dimension: 3
Index: [0, 0, 0]
Size: [256, 256, 3]


Trying to call Update() after shrinking the LargestPossibleRegion...

Error:
itk::InvalidRequestedRegionError (0x28cd880)
Location: "unknown"
File: /home/matt/bin/ITKExamples-Clang-RelWithDebInfo/ITK/Modules/Core/Common/src/itkDataObject.cxx
Line: 411
Description: Requested region is (at least partially) outside the largest possible region.


Trying to call UpdateLargestPossibleRegion() after shrinking the LargestPossibleRegion...

Shrunk LargestPossibleRegion: ImageRegion (0x7fff11257330)
  Dimension: 3
  Index: [0, 0, 0]
  Size: [256, 256, 2]

Code

C++

#include "itkImageSeriesReader.h"
#include "itkNumericSeriesFileNames.h"

int
main(int argc, char * argv[])
{
  if (argc != 4)
  {
    std::cerr << "Usage: " << std::endl;
    std::cerr << argv[0];
    std::cerr << " <seriesFormat> <startIndex> <endIndex>";
    std::cerr << std::endl;
    return EXIT_FAILURE;
  }

  const char * seriesFormat = argv[1];
  unsigned int startIndex = std::stoi(argv[2]);
  unsigned int endIndex = std::stoi(argv[3]);

  constexpr unsigned int Dimension = 3;

  using PixelType = unsigned char;
  using ImageType = itk::Image<PixelType, Dimension>;

  using NameGeneratorType = itk::NumericSeriesFileNames;
  NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
  nameGenerator->SetSeriesFormat(seriesFormat);
  nameGenerator->SetStartIndex(startIndex);
  nameGenerator->SetEndIndex(endIndex);
  std::vector<std::string> fileNames = nameGenerator->GetFileNames();

  using ReaderType = itk::ImageSeriesReader<ImageType>;
  ReaderType::Pointer reader = ReaderType::New();
  reader->SetFileNames(fileNames);

  try
  {
    reader->Update();

    ImageType::ConstPointer     output = reader->GetOutput();
    const ImageType::RegionType largestRegion = output->GetLargestPossibleRegion();
    std::cout << "Initial LargestPossibleRegion: ";
    std::cout << largestRegion << std::endl;
    ;
  }
  catch (itk::ExceptionObject & error)
  {
    std::cerr << "Error: " << error << std::endl;
    return EXIT_FAILURE;
  }

  fileNames.pop_back();

  try
  {
    std::cout << "\nTrying to call Update() "
              << "after shrinking the LargestPossibleRegion...\n"
              << std::endl;
    reader->SetFileNames(fileNames);
    reader->Update();
  }
  catch (itk::ExceptionObject & error)
  {
    // Print out the error that occurs
    std::cout << "Error: " << error << std::endl;
  }

  try
  {
    std::cout << "Trying to call UpdateLargestPossibleRegion() "
              << "after shrinking the LargestPossibleRegion...\n"
              << std::endl;
    reader->SetFileNames(fileNames);
    reader->UpdateLargestPossibleRegion();

    ImageType::ConstPointer     output = reader->GetOutput();
    const ImageType::RegionType largestRegion = output->GetLargestPossibleRegion();
    std::cout << "Shrunk LargestPossibleRegion: ";
    std::cout << largestRegion << std::endl;
    ;
  }
  catch (itk::ExceptionObject & error)
  {
    std::cerr << "Error: " << error << std::endl;
    return EXIT_FAILURE;
  }

  return EXIT_SUCCESS;
}

Classes demonstrated