22 #ifndef rtkGgoFunctions_h    23 #define rtkGgoFunctions_h    29 #include <itkRegularExpressionSeriesFileNames.h>    30 #include <itksys/RegularExpression.hxx>    48 template <
class TConstantImageSourceType, 
class TArgsInfo>
    52   using ImageType = 
typename TConstantImageSourceType::OutputImageType;
    54   const unsigned int Dimension = ImageType::GetImageDimension();
    56   typename ImageType::SizeType imageSize;
    57   if (args_info.dimension_given && !args_info.size_given)
    59     itkGenericOutputMacro(
    60       "Warning: --dimension is deprecated and will be removed in a future release. Use --size instead.");
    61     imageSize.Fill(args_info.dimension_arg[0]);
    62     for (
unsigned int i = 0; i < std::min(args_info.dimension_given, Dimension); i++)
    64       imageSize[i] = args_info.dimension_arg[i];
    69     imageSize.Fill(args_info.size_arg[0]);
    70     for (
unsigned int i = 0; i < std::min(args_info.size_given, Dimension); i++)
    71       imageSize[i] = args_info.size_arg[i];
    74   typename ImageType::SpacingType imageSpacing;
    75   imageSpacing.Fill(args_info.spacing_arg[0]);
    76   for (
unsigned int i = 0; i < std::min(args_info.spacing_given, Dimension); i++)
    77     imageSpacing[i] = args_info.spacing_arg[i];
    79   typename ImageType::PointType imageOrigin;
    80   for (
unsigned int i = 0; i < Dimension; i++)
    81     imageOrigin[i] = imageSpacing[i] * (imageSize[i] - 1) * -0.5;
    82   for (
unsigned int i = 0; i < std::min(args_info.origin_given, Dimension); i++)
    83     imageOrigin[i] = args_info.origin_arg[i];
    85   typename ImageType::DirectionType imageDirection;
    86   if (args_info.direction_given)
    87     for (
unsigned int i = 0; i < Dimension; i++)
    88       for (
unsigned int j = 0; j < Dimension; j++)
    89         imageDirection[i][j] = args_info.direction_arg[i * Dimension + j];
    91     imageDirection.SetIdentity();
    93   source->SetOrigin(imageOrigin);
    94   source->SetSpacing(imageSpacing);
    95   source->SetDirection(imageDirection);
    96   source->SetSize(imageSize);
    97   source->SetConstant({});
   101   if (args_info.like_given)
   103     using LikeReaderType = itk::ImageFileReader<ImageType>;
   104     auto likeReader = LikeReaderType::New();
   105     likeReader->SetFileName(args_info.like_arg);
   107     source->SetInformationFromImage(likeReader->GetOutput());
   128 template <
class TArgsInfo>
   129 const std::vector<std::string>
   133   auto names = itk::RegularExpressionSeriesFileNames::New();
   134   names->SetDirectory(args_info.path_arg);
   135   names->SetNumericSort(args_info.nsort_flag);
   136   names->SetRegularExpression(args_info.regexp_arg);
   137   names->SetSubMatch(args_info.submatch_arg);
   139   if (args_info.verbose_flag)
   140     std::cout << 
"Regular expression matches " << names->GetFileNames().size() << 
" file(s)..." << std::endl;
   143   if (args_info.submatch_given)
   146     itksys::RegularExpression reg;
   147     if (!reg.compile(args_info.regexp_arg))
   149       itkGenericExceptionMacro(<< 
"Error compiling regular expression " << args_info.regexp_arg);
   153     for (
const std::string & name : names->GetFileNames())
   156       if (reg.match(args_info.submatch_arg) == std::string(
""))
   158         itkGenericExceptionMacro(<< 
"Cannot find submatch " << args_info.submatch_arg << 
" in " << name
   159                                  << 
" from regular expression " << args_info.regexp_arg);
   164   std::vector<std::string> fileNames = names->GetFileNames();
   166   std::vector<size_t> idxtopop;
   168   for (
const auto & fn : fileNames)
   170     itk::ImageIOBase::Pointer imageio =
   171       itk::ImageIOFactory::CreateImageIO(fn.c_str(), itk::ImageIOFactory::IOFileModeEnum::ReadMode);
   173     if (imageio.IsNull())
   175       std::cerr << 
"Ignoring file: " << fn << 
"\n";
   176       idxtopop.push_back(i);
   180   std::reverse(idxtopop.begin(), idxtopop.end());
   181   for (
const auto & 
id : idxtopop)
   183     fileNames.erase(fileNames.begin() + id);
   189 template <
class TProjectionsReaderType, 
class TArgsInfo>
   196   if (args_info.component_given)
   198     reader->SetVectorComponent(args_info.component_arg);
   202   const unsigned int Dimension = TProjectionsReaderType::OutputImageType::GetImageDimension();
   203   typename TProjectionsReaderType::OutputImageDirectionType direction;
   204   if (args_info.newdirection_given)
   206     direction.Fill(args_info.newdirection_arg[0]);
   207     for (
unsigned int i = 0; i < args_info.newdirection_given; i++)
   208       direction[i / Dimension][i % Dimension] = args_info.newdirection_arg[i];
   209     reader->SetDirection(direction);
   211   typename TProjectionsReaderType::OutputImageSpacingType spacing;
   212   if (args_info.newspacing_given)
   214     spacing.Fill(args_info.newspacing_arg[0]);
   215     for (
unsigned int i = 0; i < args_info.newspacing_given; i++)
   216       spacing[i] = args_info.newspacing_arg[i];
   217     reader->SetSpacing(spacing);
   219   typename TProjectionsReaderType::OutputImagePointType origin;
   220   if (args_info.neworigin_given)
   222     origin.Fill(args_info.neworigin_arg[0]);
   223     for (
unsigned int i = 0; i < args_info.neworigin_given; i++)
   224       origin[i] = args_info.neworigin_arg[i];
   225     reader->SetOrigin(origin);
   229   typename TProjectionsReaderType::OutputImageSizeType upperCrop, lowerCrop;
   232   for (
unsigned int i = 0; i < args_info.lowercrop_given; i++)
   233     lowerCrop[i] = args_info.lowercrop_arg[i];
   234   reader->SetLowerBoundaryCropSize(lowerCrop);
   235   for (
unsigned int i = 0; i < args_info.uppercrop_given; i++)
   236     upperCrop[i] = args_info.uppercrop_arg[i];
   237   reader->SetUpperBoundaryCropSize(upperCrop);
   240   typename TProjectionsReaderType::MedianRadiusType medianRadius;
   241   medianRadius.Fill(0);
   242   for (
unsigned int i = 0; i < args_info.radius_given; i++)
   243     medianRadius[i] = args_info.radius_arg[i];
   244   reader->SetMedianRadius(medianRadius);
   245   if (args_info.multiplier_given)
   246     reader->SetConditionalMedianThresholdMultiplier(args_info.multiplier_arg);
   249   typename TProjectionsReaderType::ShrinkFactorsType binFactors;
   251   for (
unsigned int i = 0; i < args_info.binning_given; i++)
   252     binFactors[i] = args_info.binning_arg[i];
   253   reader->SetShrinkFactors(binFactors);
   256   if (args_info.spr_given)
   257     reader->SetScatterToPrimaryRatio(args_info.spr_arg);
   258   if (args_info.nonneg_given)
   259     reader->SetNonNegativityConstraintThreshold(args_info.nonneg_arg);
   260   if (args_info.airthres_given)
   261     reader->SetAirThreshold(args_info.airthres_arg);
   264   if (args_info.i0_given)
   265     reader->SetI0(args_info.i0_arg);
   266   reader->SetIDark(args_info.idark_arg);
   269   if (args_info.nolineint_flag)
   270     reader->ComputeLineIntegralOff();
   273   if (args_info.wpc_given)
   275     std::vector<double> coeffs;
   276     coeffs.assign(args_info.wpc_arg, args_info.wpc_arg + args_info.wpc_given);
   277     reader->SetWaterPrecorrectionCoefficients(coeffs);
   281   reader->SetFileNames(fileNames);
   293 template <
class TArgsInfo, 
class TIterativeReconstructionFilter>
   297   typename TIterativeReconstructionFilter::VolumeType::Pointer attenuationMap;
   298   using VolumeType = 
typename TIterativeReconstructionFilter::VolumeType;
   299   if (args_info.attenuationmap_given)
   302     attenuationMap = itk::ReadImage<VolumeType>(args_info.attenuationmap_arg);
   305   switch (args_info.bp_arg)
   310       recon->SetBackProjectionFilter(TIterativeReconstructionFilter::BP_VOXELBASED);
   313       recon->SetBackProjectionFilter(TIterativeReconstructionFilter::BP_JOSEPH);
   316       recon->SetBackProjectionFilter(TIterativeReconstructionFilter::BP_CUDAVOXELBASED);
   319       recon->SetBackProjectionFilter(TIterativeReconstructionFilter::BP_CUDARAYCAST);
   320       if (args_info.step_given)
   321         recon->SetStepSize(args_info.step_arg);
   324       recon->SetBackProjectionFilter(TIterativeReconstructionFilter::BP_JOSEPHATTENUATED);
   325       if (args_info.attenuationmap_given)
   326         recon->SetAttenuationMap(attenuationMap);
   329       recon->SetBackProjectionFilter(TIterativeReconstructionFilter::BP_ZENG);
   330       if (args_info.sigmazero_given)
   331         recon->SetSigmaZero(args_info.sigmazero_arg);
   332       if (args_info.alphapsf_given)
   333         recon->SetAlphaPSF(args_info.alphapsf_arg);
   334       if (args_info.attenuationmap_given)
   335         recon->SetAttenuationMap(attenuationMap);
   348 template <
class TArgsInfo, 
class TIterativeReconstructionFilter>
   352   typename TIterativeReconstructionFilter::VolumeType::Pointer attenuationMap;
   353   using VolumeType = 
typename TIterativeReconstructionFilter::VolumeType;
   354   if (args_info.attenuationmap_given)
   357     attenuationMap = itk::ReadImage<VolumeType>(args_info.attenuationmap_arg);
   359   using ClipImageType = itk::Image<double, TIterativeReconstructionFilter::VolumeType::ImageDimension>;
   360   typename ClipImageType::Pointer inferiorClipImage, superiorClipImage;
   361   if (args_info.inferiorclipimage_given)
   364     inferiorClipImage = itk::ReadImage<ClipImageType>(args_info.inferiorclipimage_arg);
   366   if (args_info.superiorclipimage_given)
   369     superiorClipImage = itk::ReadImage<ClipImageType>(args_info.superiorclipimage_arg);
   372   switch (args_info.fp_arg)
   377       recon->SetForwardProjectionFilter(TIterativeReconstructionFilter::FP_JOSEPH);
   378       if (args_info.superiorclipimage_given)
   379         recon->SetSuperiorClipImage(superiorClipImage);
   380       if (args_info.inferiorclipimage_given)
   381         recon->SetInferiorClipImage(inferiorClipImage);
   384       recon->SetForwardProjectionFilter(TIterativeReconstructionFilter::FP_CUDARAYCAST);
   385       if (args_info.step_given)
   386         recon->SetStepSize(args_info.step_arg);
   389       recon->SetForwardProjectionFilter(TIterativeReconstructionFilter::FP_JOSEPHATTENUATED);
   390       if (args_info.superiorclipimage_given)
   391         recon->SetSuperiorClipImage(superiorClipImage);
   392       if (args_info.inferiorclipimage_given)
   393         recon->SetInferiorClipImage(inferiorClipImage);
   394       if (args_info.attenuationmap_given)
   395         recon->SetAttenuationMap(attenuationMap);
   398       recon->SetForwardProjectionFilter(TIterativeReconstructionFilter::FP_ZENG);
   399       if (args_info.sigmazero_given)
   400         recon->SetSigmaZero(args_info.sigmazero_arg);
   401       if (args_info.alphapsf_given)
   402         recon->SetAlphaPSF(args_info.alphapsf_arg);
   403       if (args_info.attenuationmap_given)
   404         recon->SetAttenuationMap(attenuationMap);
   411 #endif // rtkGgoFunctions_h 
const std::vector< std::string > GetProjectionsFileNamesFromGgo(const TArgsInfo &args_info)
Read a stack of 2D projections from gengetopt specifications. 
 
void SetBackProjectionFromGgo(const TArgsInfo &args_info, TIterativeReconstructionFilter *recon)
Set the correct RTK backprojection type from gengetopt Given a gengetopt bp_arg option from the rtkpr...
 
void SetForwardProjectionFromGgo(const TArgsInfo &args_info, TIterativeReconstructionFilter *recon)
Set the correct RTK forward projection type from gengetopt Given a gengetopt fp_arg option from the r...
 
void SetConstantImageSourceFromGgo(TConstantImageSourceType *source, const TArgsInfo &args_info)
Create 3D image from gengetopt specifications. 
 
void SetProjectionsReaderFromGgo(TProjectionsReaderType *reader, const TArgsInfo &args_info)
 
void RTK_EXPORT RegisterIOFactories()
 
#define TRY_AND_EXIT_ON_ITK_EXCEPTION(execFunc)
Update a filter and catching/displaying exceptions.