22 #ifndef rtkGgoFunctions_h 23 #define rtkGgoFunctions_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)
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>
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)
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);
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
static ImageIOBasePointer CreateImageIO(const char *path, IOFileModeEnum mode)
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.