go home Home | Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Globals | Related Pages
elxElastixBase.h
Go to the documentation of this file.
1 /*======================================================================
2 
3  This file is part of the elastix software.
4 
5  Copyright (c) University Medical Center Utrecht. All rights reserved.
6  See src/CopyrightElastix.txt or http://elastix.isi.uu.nl/legal.php for
7  details.
8 
9  This software is distributed WITHOUT ANY WARRANTY; without even
10  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11  PURPOSE. See the above copyright notices for more information.
12 
13 ======================================================================*/
14 
24 #ifndef __elxElastixBase_h
25 #define __elxElastixBase_h
26 
27 #include "elxBaseComponent.h"
28 #include "elxComponentDatabase.h"
29 #include "elxConfiguration.h"
30 #include "itkObject.h"
31 #include "itkDataObject.h"
32 #include "elxMacro.h"
33 #include "xoutmain.h"
34 #include "itkVectorContainer.h"
35 #include "itkImageFileReader.h"
36 #include "itkChangeInformationImageFilter.h"
37 
38 #include <fstream>
39 #include <iomanip>
40 
47 #define elxGetObjectMacro(_name,_type) \
48  virtual _type * Get##_name (void) const \
49  { \
50  return this->m_##_name .GetPointer(); \
51  }
52 //end elxGetObjectMacro
53 
54 #define elxSetObjectMacro(_name,_type) \
55  virtual void Set##_name (_type * _arg) \
56  { \
57  if ( this->m_##_name != _arg ) \
58  { \
59  this->m_##_name = _arg; \
60  this->GetAsITKBaseType()->Modified(); \
61  } \
62  }
63 //end elxSetObjectMacro
64 
66 #define elxGetNumberOfMacro(_name) \
67  virtual unsigned int GetNumberOf##_name##s(void) const \
68  { \
69  if ( this->Get##_name##Container() != 0 ) \
70  { \
71  return this->Get##_name##Container()->Size(); \
72  } \
73  return 0; \
74  }
75 // end elxGetNumberOfMacro
76 
77 namespace elastix
78 {
79 
141 {
142 public:
143 
145  typedef ElastixBase Self;
147 
151  typedef itk::Object ObjectType; //for the components
152  typedef ObjectType::Pointer ObjectPointer;
153  typedef itk::DataObject DataObjectType; //for the images
154  typedef DataObjectType::Pointer DataObjectPointer;
155  typedef itk::VectorContainer<
157  typedef ObjectContainerType::Pointer ObjectContainerPointer;
158  typedef itk::VectorContainer<
160  typedef DataObjectContainerType::Pointer DataObjectContainerPointer;
161  typedef itk::VectorContainer<
162  unsigned int, std::string > FileNameContainerType;
163  typedef FileNameContainerType::Pointer FileNameContainerPointer;
164 
169  typedef std::vector<double> FlatDirectionCosinesType;
170 
174  typedef itk::Object ITKBaseType;
175 
177  virtual ITKBaseType * GetAsITKBaseType( void )
178  {
179  return dynamic_cast<ITKBaseType *>( this );
180  }
181 
185 
187  virtual void SetDBIndex( DBIndexType _arg );
188  virtual DBIndexType GetDBIndex( void )
189  {
190  return this->m_DBIndex;
191  }
192 
199 
204  elxGetObjectMacro( RegistrationContainer, ObjectContainerType );
205  elxGetObjectMacro( FixedImagePyramidContainer, ObjectContainerType );
206  elxGetObjectMacro( MovingImagePyramidContainer, ObjectContainerType );
207  elxGetObjectMacro( InterpolatorContainer, ObjectContainerType );
208  elxGetObjectMacro( ImageSamplerContainer, ObjectContainerType );
209  elxGetObjectMacro( MetricContainer, ObjectContainerType );
210  elxGetObjectMacro( OptimizerContainer, ObjectContainerType );
211  elxGetObjectMacro( ResamplerContainer, ObjectContainerType );
212  elxGetObjectMacro( ResampleInterpolatorContainer, ObjectContainerType );
213  elxGetObjectMacro( TransformContainer, ObjectContainerType );
214 
219  elxSetObjectMacro( RegistrationContainer, ObjectContainerType );
220  elxSetObjectMacro( FixedImagePyramidContainer, ObjectContainerType );
221  elxSetObjectMacro( MovingImagePyramidContainer, ObjectContainerType );
222  elxSetObjectMacro( InterpolatorContainer, ObjectContainerType );
223  elxSetObjectMacro( ImageSamplerContainer, ObjectContainerType );
224  elxSetObjectMacro( MetricContainer, ObjectContainerType );
225  elxSetObjectMacro( OptimizerContainer, ObjectContainerType );
226  elxSetObjectMacro( ResamplerContainer, ObjectContainerType );
227  elxSetObjectMacro( ResampleInterpolatorContainer, ObjectContainerType );
228  elxSetObjectMacro( TransformContainer, ObjectContainerType );
229 
231  elxGetObjectMacro( FixedImageContainer, DataObjectContainerType );
232  elxGetObjectMacro( MovingImageContainer, DataObjectContainerType );
233  elxSetObjectMacro( FixedImageContainer, DataObjectContainerType );
234  elxSetObjectMacro( MovingImageContainer, DataObjectContainerType );
235 
237  elxGetObjectMacro( FixedMaskContainer, DataObjectContainerType );
238  elxGetObjectMacro( MovingMaskContainer, DataObjectContainerType );
239  elxSetObjectMacro( FixedMaskContainer, DataObjectContainerType );
240  elxSetObjectMacro( MovingMaskContainer, DataObjectContainerType );
241 
245  elxGetObjectMacro( FixedImageFileNameContainer, FileNameContainerType );
246  elxGetObjectMacro( MovingImageFileNameContainer, FileNameContainerType );
247  elxSetObjectMacro( FixedImageFileNameContainer, FileNameContainerType );
248  elxSetObjectMacro( MovingImageFileNameContainer, FileNameContainerType );
249 
253  elxGetObjectMacro( FixedMaskFileNameContainer, FileNameContainerType );
254  elxGetObjectMacro( MovingMaskFileNameContainer, FileNameContainerType );
255  elxSetObjectMacro( FixedMaskFileNameContainer, FileNameContainerType );
256  elxSetObjectMacro( MovingMaskFileNameContainer, FileNameContainerType );
257 
259  elxGetNumberOfMacro( Registration );
260  elxGetNumberOfMacro( FixedImagePyramid );
261  elxGetNumberOfMacro( MovingImagePyramid );
262  elxGetNumberOfMacro( Interpolator );
263  elxGetNumberOfMacro( ImageSampler );
264  elxGetNumberOfMacro( Metric );
265  elxGetNumberOfMacro( Optimizer );
266  elxGetNumberOfMacro( Resampler );
267  elxGetNumberOfMacro( ResampleInterpolator );
268  elxGetNumberOfMacro( Transform );
269  elxGetNumberOfMacro( FixedImage );
270  elxGetNumberOfMacro( MovingImage );
271  elxGetNumberOfMacro( FixedImageFileName );
272  elxGetNumberOfMacro( MovingImageFileName );
273  elxGetNumberOfMacro( FixedMask );
274  elxGetNumberOfMacro( MovingMask );
275  elxGetNumberOfMacro( FixedMaskFileName );
276  elxGetNumberOfMacro( MovingMaskFileName );
277 
282  elxSetObjectMacro( InitialTransform, ObjectType );
283  elxGetObjectMacro( InitialTransform, ObjectType );
284 
291  elxSetObjectMacro( FinalTransform, ObjectType );
292  elxGetObjectMacro( FinalTransform, ObjectType );
293 
295  virtual int Run( void ) = 0;
296 
298  virtual int ApplyTransform( void ) = 0;
299 
303  virtual int BeforeAllBase( void );
304 
308  virtual int BeforeAllTransformixBase( void );
309 
313  virtual void BeforeRegistrationBase( void );
314  virtual void AfterRegistrationBase( void );
315 
320  virtual int GetDefaultOutputPrecision( void ) const
321  {
322  return this->m_DefaultOutputPrecision;
323  }
324 
328  virtual bool GetUseDirectionCosines( void ) const;
329 
333  const FlatDirectionCosinesType & arg );
334  virtual const FlatDirectionCosinesType &
336 
337 protected:
338 
339  ElastixBase();
340  virtual ~ElastixBase() {};
341 
345 
347 
360  template < class TImage >
362  {
363  public:
364  typedef TImage ImageType;
365  typedef typename ImageType::Pointer ImagePointer;
366  typedef itk::ImageFileReader<ImageType> ImageReaderType;
367  typedef typename ImageReaderType::Pointer ImageReaderPointer;
368  typedef typename ImageType::DirectionType DirectionType;
369  typedef itk::ChangeInformationImageFilter<ImageType> ChangeInfoFilterType;
370  typedef typename ChangeInfoFilterType::Pointer ChangeInfoFilterPointer;
371 
373  FileNameContainerType * fileNameContainer, const std::string & imageDescription,
374  bool useDirectionCosines, DirectionType * originalDirectionCosines = NULL )
375  {
376  DataObjectContainerPointer imageContainer = DataObjectContainerType::New();
377 
379  for ( unsigned int i = 0; i < fileNameContainer->Size(); ++i )
380  {
382  ImageReaderPointer imageReader = ImageReaderType::New();
383  imageReader->SetFileName( fileNameContainer->ElementAt( i ).c_str() );
384  ChangeInfoFilterPointer infoChanger = ChangeInfoFilterType::New();
385  DirectionType direction;
386  direction.SetIdentity();
387  infoChanger->SetOutputDirection( direction );
388  infoChanger->SetChangeDirection( !useDirectionCosines );
389  infoChanger->SetInput( imageReader->GetOutput() );
390 
392  try
393  {
394  infoChanger->Update();
395  }
396  catch( itk::ExceptionObject & excp )
397  {
399  std::string err_str = excp.GetDescription();
400  err_str += "\nError occurred while reading the image described as "
401  + imageDescription + ", with file name " + imageReader->GetFileName() + "\n";
402  excp.SetDescription( err_str );
404  throw excp;
405  }
406 
408  ImagePointer image = infoChanger->GetOutput();
409  imageContainer->CreateElementAt(i) = image.GetPointer();
410 
412  if ( originalDirectionCosines )
413  {
414  *originalDirectionCosines = imageReader->GetOutput()->GetDirection();
415  }
416 
417  } // end for i
418 
419  return imageContainer;
420 
421  } // end static method GenerateImageContainer
422 
425 
426  }; // end class MultipleImageLoader
427 
428 private:
429 
430  ElastixBase( const Self& ); // purposely not implemented
431  void operator=( const Self& ); // purposely not implemented
432 
434 
436 
450 
456 
462 
466 
469 
478  const std::string & optionkey,
479  int & errorcode,
480  bool printerrors,
481  bool printinfo ) const;
482 
483 }; // end class ElastixBase
484 
485 
486 } // end namespace elastix
487 
488 #undef elxGetObjectMacro
489 #undef elxSetObjectMacro
490 #undef elxGetNumberOfMacro
491 
492 #endif // end #ifndef __elxElastixBase_h
493 
elxSetObjectMacro(Configuration, ConfigurationType)
ObjectContainerPointer m_InterpolatorContainer
DataObjectContainerType::Pointer DataObjectContainerPointer
virtual DBIndexType GetDBIndex(void)
BaseComponent Superclass
itk::VectorContainer< unsigned int, std::string > FileNameContainerType
virtual bool GetUseDirectionCosines(void) const
ComponentDatabase ComponentDatabaseType
itk::VectorContainer< unsigned int, DataObjectPointer > DataObjectContainerType
ComponentDatabaseType::IndexType DBIndexType
xl::xoutrow_type m_IterationInfo
Configuration ConfigurationType
DataObjectContainerPointer m_MovingImageContainer
ObjectContainerPointer m_MetricContainer
itk::DataObject DataObjectType
virtual int BeforeAllBase(void)
itk::ImageFileReader< ImageType > ImageReaderType
FileNameContainerPointer m_MovingMaskFileNameContainer
The xoutrow class can easily generate tables.
Definition: xoutrow.h:40
The BaseComponent class is a class that all elastix components should inherit from.
ObjectContainerPointer m_OptimizerContainer
FileNameContainerPointer GenerateFileNameContainer(const std::string &optionkey, int &errorcode, bool printerrors, bool printinfo) const
ObjectContainerPointer m_FixedImagePyramidContainer
virtual void AfterRegistrationBase(void)
ObjectContainerPointer m_TransformContainer
ObjectContainerPointer m_ImageSamplerContainer
elxGetNumberOfMacro(Registration)
elxGetObjectMacro(Configuration, ConfigurationType)
FileNameContainerType::Pointer FileNameContainerPointer
itk::SmartPointer< Self > Pointer
virtual void SetOriginalFixedImageDirectionFlat(const FlatDirectionCosinesType &arg)
static DataObjectContainerPointer GenerateImageContainer(FileNameContainerType *fileNameContainer, const std::string &imageDescription, bool useDirectionCosines, DirectionType *originalDirectionCosines=NULL)
ObjectContainerPointer m_MovingImagePyramidContainer
virtual void SetDBIndex(DBIndexType _arg)
ChangeInfoFilterType::Pointer ChangeInfoFilterPointer
ComponentDatabaseType::Pointer ComponentDatabasePointer
ImageReaderType::Pointer ImageReaderPointer
DataObjectContainerPointer m_FixedMaskContainer
FlatDirectionCosinesType m_OriginalFixedImageDirection
virtual int BeforeAllTransformixBase(void)
FileNameContainerPointer m_FixedImageFileNameContainer
ObjectPointer m_InitialTransform
virtual int ApplyTransform(void)=0
ObjectContainerType::Pointer ObjectContainerPointer
itk::ChangeInformationImageFilter< ImageType > ChangeInfoFilterType
void operator=(const Self &)
ObjectPointer m_FinalTransform
ConfigurationPointer m_Configuration
virtual const FlatDirectionCosinesType & GetOriginalFixedImageDirectionFlat(void) const
itk::SmartPointer< Self > Pointer
virtual int GetDefaultOutputPrecision(void) const
A class that deals with user given parameters and command line arguments.
FileNameContainerPointer m_MovingImageFileNameContainer
ObjectContainerPointer m_RegistrationContainer
itk::VectorContainer< unsigned int, ObjectPointer > ObjectContainerType
DataObjectContainerPointer m_MovingMaskContainer
The ComponentDatabase class is a class that stores the New() functions of all components.
std::vector< double > FlatDirectionCosinesType
DataObjectType::Pointer DataObjectPointer
FileNameContainerPointer m_FixedMaskFileNameContainer
ObjectContainerPointer m_ResamplerContainer
ConfigurationType::Pointer ConfigurationPointer
ObjectContainerPointer m_ResampleInterpolatorContainer
virtual void BeforeRegistrationBase(void)
ObjectType::Pointer ObjectPointer
This class creates an interface for elastix.
virtual int Run(void)=0
virtual ITKBaseType * GetAsITKBaseType(void)
ComponentDatabasePointer m_ComponentDatabase
DataObjectContainerPointer m_FixedImageContainer


Generated on 05-01-2014 for elastix by doxygen 1.8.5 elastix logo