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 {
140 {
141 public:
142 
144  typedef ElastixBase Self;
146 
150  typedef itk::Object ObjectType; //for the components
151  typedef ObjectType::Pointer ObjectPointer;
152  typedef itk::DataObject DataObjectType; //for the images
153  typedef DataObjectType::Pointer DataObjectPointer;
154  typedef itk::VectorContainer<
156  typedef ObjectContainerType::Pointer ObjectContainerPointer;
157  typedef itk::VectorContainer<
159  typedef DataObjectContainerType::Pointer DataObjectContainerPointer;
160  typedef itk::VectorContainer<
161  unsigned int, std::string > FileNameContainerType;
162  typedef FileNameContainerType::Pointer FileNameContainerPointer;
163 
168  typedef std::vector< double > FlatDirectionCosinesType;
169 
172 
176  typedef itk::Object ITKBaseType;
177 
179  virtual ITKBaseType * GetAsITKBaseType( void )
180  {
181  return dynamic_cast< ITKBaseType * >( this );
182  }
183 
184 
188 
190  virtual void SetDBIndex( DBIndexType _arg );
191 
192  virtual DBIndexType GetDBIndex( void )
193  {
194  return this->m_DBIndex;
195  }
196 
197 
204 
209  elxGetObjectMacro( RegistrationContainer, ObjectContainerType );
210  elxGetObjectMacro( FixedImagePyramidContainer, ObjectContainerType );
211  elxGetObjectMacro( MovingImagePyramidContainer, ObjectContainerType );
212  elxGetObjectMacro( InterpolatorContainer, ObjectContainerType );
213  elxGetObjectMacro( ImageSamplerContainer, ObjectContainerType );
214  elxGetObjectMacro( MetricContainer, ObjectContainerType );
215  elxGetObjectMacro( OptimizerContainer, ObjectContainerType );
216  elxGetObjectMacro( ResamplerContainer, ObjectContainerType );
217  elxGetObjectMacro( ResampleInterpolatorContainer, ObjectContainerType );
218  elxGetObjectMacro( TransformContainer, ObjectContainerType );
219 
224  elxSetObjectMacro( RegistrationContainer, ObjectContainerType );
225  elxSetObjectMacro( FixedImagePyramidContainer, ObjectContainerType );
226  elxSetObjectMacro( MovingImagePyramidContainer, ObjectContainerType );
227  elxSetObjectMacro( InterpolatorContainer, ObjectContainerType );
228  elxSetObjectMacro( ImageSamplerContainer, ObjectContainerType );
229  elxSetObjectMacro( MetricContainer, ObjectContainerType );
230  elxSetObjectMacro( OptimizerContainer, ObjectContainerType );
231  elxSetObjectMacro( ResamplerContainer, ObjectContainerType );
232  elxSetObjectMacro( ResampleInterpolatorContainer, ObjectContainerType );
233  elxSetObjectMacro( TransformContainer, ObjectContainerType );
234 
236  elxGetObjectMacro( FixedImageContainer, DataObjectContainerType );
237  elxGetObjectMacro( MovingImageContainer, DataObjectContainerType );
238  elxSetObjectMacro( FixedImageContainer, DataObjectContainerType );
239  elxSetObjectMacro( MovingImageContainer, DataObjectContainerType );
240 
242  elxGetObjectMacro( FixedMaskContainer, DataObjectContainerType );
243  elxGetObjectMacro( MovingMaskContainer, DataObjectContainerType );
244  elxSetObjectMacro( FixedMaskContainer, DataObjectContainerType );
245  elxSetObjectMacro( MovingMaskContainer, DataObjectContainerType );
246 
248  elxGetObjectMacro( ResultImageContainer, DataObjectContainerType );
249  elxSetObjectMacro( ResultImageContainer, DataObjectContainerType );
250 
254  elxGetObjectMacro( FixedImageFileNameContainer, FileNameContainerType );
255  elxGetObjectMacro( MovingImageFileNameContainer, FileNameContainerType );
256  elxSetObjectMacro( FixedImageFileNameContainer, FileNameContainerType );
257  elxSetObjectMacro( MovingImageFileNameContainer, FileNameContainerType );
258 
262  elxGetObjectMacro( FixedMaskFileNameContainer, FileNameContainerType );
263  elxGetObjectMacro( MovingMaskFileNameContainer, FileNameContainerType );
264  elxSetObjectMacro( FixedMaskFileNameContainer, FileNameContainerType );
265  elxSetObjectMacro( MovingMaskFileNameContainer, FileNameContainerType );
266 
268  elxGetNumberOfMacro( Registration );
269  elxGetNumberOfMacro( FixedImagePyramid );
270  elxGetNumberOfMacro( MovingImagePyramid );
271  elxGetNumberOfMacro( Interpolator );
272  elxGetNumberOfMacro( ImageSampler );
273  elxGetNumberOfMacro( Metric );
274  elxGetNumberOfMacro( Optimizer );
275  elxGetNumberOfMacro( Resampler );
276  elxGetNumberOfMacro( ResampleInterpolator );
277  elxGetNumberOfMacro( Transform );
278  elxGetNumberOfMacro( FixedImage );
279  elxGetNumberOfMacro( MovingImage );
280  elxGetNumberOfMacro( FixedImageFileName );
281  elxGetNumberOfMacro( MovingImageFileName );
282  elxGetNumberOfMacro( FixedMask );
283  elxGetNumberOfMacro( MovingMask );
284  elxGetNumberOfMacro( FixedMaskFileName );
285  elxGetNumberOfMacro( MovingMaskFileName );
286  elxGetNumberOfMacro( ResultImage );
287 
292  elxSetObjectMacro( InitialTransform, ObjectType );
293  elxGetObjectMacro( InitialTransform, ObjectType );
294 
301  elxSetObjectMacro( FinalTransform, ObjectType );
302  elxGetObjectMacro( FinalTransform, ObjectType );
303 
305  virtual int Run( void ) = 0;
306 
308  virtual int ApplyTransform( void ) = 0;
309 
313  virtual int BeforeAllBase( void );
314 
318  virtual int BeforeAllTransformixBase( void );
319 
323  virtual void BeforeRegistrationBase( void );
324 
325  virtual void AfterRegistrationBase( void );
326 
331  virtual int GetDefaultOutputPrecision( void ) const
332  {
333  return this->m_DefaultOutputPrecision;
334  }
335 
336 
340  virtual bool GetUseDirectionCosines( void ) const;
341 
345  const FlatDirectionCosinesType & arg );
346 
347  virtual const FlatDirectionCosinesType & GetOriginalFixedImageDirectionFlat( void ) const;
348 
350  virtual void CreateTransformParametersMap( void ) = 0;
351 
353  virtual ParameterMapType GetTransformParametersMap( void ) const = 0;
354 
356  virtual void SetConfigurations( std::vector< ConfigurationPointer > & configurations ) = 0;
357 
358 protected:
359 
360  ElastixBase();
361  virtual ~ElastixBase() {}
362 
366 
368 
381  template< class TImage >
383  {
384 public:
385 
386  typedef TImage ImageType;
387  typedef typename ImageType::Pointer ImagePointer;
388  typedef itk::ImageFileReader< ImageType > ImageReaderType;
389  typedef typename ImageReaderType::Pointer ImageReaderPointer;
390  typedef typename ImageType::DirectionType DirectionType;
391  typedef itk::ChangeInformationImageFilter< ImageType > ChangeInfoFilterType;
392  typedef typename ChangeInfoFilterType::Pointer ChangeInfoFilterPointer;
393 
395  FileNameContainerType * fileNameContainer, const std::string & imageDescription,
396  bool useDirectionCosines, DirectionType * originalDirectionCosines = NULL )
397  {
398  DataObjectContainerPointer imageContainer = DataObjectContainerType::New();
399 
401  for( unsigned int i = 0; i < fileNameContainer->Size(); ++i )
402  {
404  ImageReaderPointer imageReader = ImageReaderType::New();
405  imageReader->SetFileName( fileNameContainer->ElementAt( i ).c_str() );
406  ChangeInfoFilterPointer infoChanger = ChangeInfoFilterType::New();
407  DirectionType direction;
408  direction.SetIdentity();
409  infoChanger->SetOutputDirection( direction );
410  infoChanger->SetChangeDirection( !useDirectionCosines );
411  infoChanger->SetInput( imageReader->GetOutput() );
412 
414  try
415  {
416  infoChanger->Update();
417  }
418  catch( itk::ExceptionObject & excp )
419  {
421  std::string err_str = excp.GetDescription();
422  err_str += "\nError occurred while reading the image described as "
423  + imageDescription + ", with file name " + imageReader->GetFileName() + "\n";
424  excp.SetDescription( err_str );
426  throw excp;
427  }
428 
430  ImagePointer image = infoChanger->GetOutput();
431  imageContainer->CreateElementAt( i ) = image.GetPointer();
432 
434  if( originalDirectionCosines )
435  {
436  *originalDirectionCosines = imageReader->GetOutput()->GetDirection();
437  }
438 
439  } // end for i
440 
441  return imageContainer;
442 
443  } // end static method GenerateImageContainer
444 
445 
448  {
450  DataObjectContainerPointer imageContainer = DataObjectContainerType::New();
451 
453  imageContainer->CreateElementAt( 0 ) = image;
454 
456  return imageContainer;
457 
458  } // GenerateImageContainer()
459 
460 
463 
464  };
465 
467  {
468 public:
469 
472  DataObjectPointer image )
473  {
474  unsigned int j = 0; //container with only one image for now
475 
477  DataObjectContainerPointer imageContainer = DataObjectContainerType::New();
478 
480  imageContainer->CreateElementAt( j ) = image;
481 
483  return imageContainer;
484  } // end GenerateImageContainer()
485 
486 
490  };
491 
492 private:
493 
494  ElastixBase( const Self & ); // purposely not implemented
495  void operator=( const Self & ); // purposely not implemented
496 
498 
500 
514 
520 
523 
529 
533 
536 
545  const std::string & optionkey,
546  int & errorcode,
547  bool printerrors,
548  bool printinfo ) const;
549 
550 };
551 
552 } // end namespace elastix
553 
554 #undef elxGetObjectMacro
555 #undef elxSetObjectMacro
556 #undef elxGetNumberOfMacro
557 
558 #endif // end #ifndef __elxElastixBase_h
elxSetObjectMacro(Configuration, ConfigurationType)
itk::ChangeInformationImageFilter< ImageType > ChangeInfoFilterType
static DataObjectContainerPointer GenerateImageContainer(DataObjectPointer image)
ObjectContainerPointer m_InterpolatorContainer
DataObjectContainerType::Pointer DataObjectContainerPointer
virtual DBIndexType GetDBIndex(void)
BaseComponent Superclass
static DataObjectContainerPointer GenerateImageContainer(DataObjectPointer image)
itk::VectorContainer< unsigned int, std::string > FileNameContainerType
virtual bool GetUseDirectionCosines(void) const
ComponentDatabase ComponentDatabaseType
ComponentDatabaseType::IndexType DBIndexType
xl::xoutrow_type m_IterationInfo
virtual void SetConfigurations(std::vector< ConfigurationPointer > &configurations)=0
Configuration ConfigurationType
DataObjectContainerPointer m_MovingImageContainer
ObjectContainerPointer m_MetricContainer
itk::SmartPointer< Self > Pointer
DataObjectContainerPointer m_ResultImageContainer
itk::DataObject DataObjectType
virtual int BeforeAllBase(void)
virtual void CreateTransformParametersMap(void)=0
FileNameContainerPointer m_MovingMaskFileNameContainer
The xoutrow class can easily generate tables.
Definition: xoutrow.h:38
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
std::vector< double > FlatDirectionCosinesType
itk::VectorContainer< unsigned int, ObjectPointer > ObjectContainerType
ObjectContainerPointer m_FixedImagePyramidContainer
ParameterFileParser::ParameterMapType ParameterMapType
virtual void AfterRegistrationBase(void)
ObjectContainerPointer m_TransformContainer
ObjectContainerPointer m_ImageSamplerContainer
elxGetNumberOfMacro(Registration)
elxGetObjectMacro(Configuration, ConfigurationType)
FileNameContainerType::Pointer FileNameContainerPointer
virtual ParameterMapType GetTransformParametersMap(void) const =0
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
itk::ParameterMapInterface::ParameterMapType ParameterMapType
DataObjectContainerPointer m_FixedMaskContainer
FlatDirectionCosinesType m_OriginalFixedImageDirection
itk::SmartPointer< Self > Pointer
virtual int BeforeAllTransformixBase(void)
FileNameContainerPointer m_FixedImageFileNameContainer
ObjectPointer m_InitialTransform
virtual int ApplyTransform(void)=0
ObjectContainerType::Pointer ObjectContainerPointer
void operator=(const Self &)
ObjectPointer m_FinalTransform
ConfigurationPointer m_Configuration
virtual const FlatDirectionCosinesType & GetOriginalFixedImageDirectionFlat(void) const
virtual int GetDefaultOutputPrecision(void) const
A class that deals with user given parameters and command line arguments.
FileNameContainerPointer m_MovingImageFileNameContainer
ObjectContainerPointer m_RegistrationContainer
DataObjectContainerPointer m_MovingMaskContainer
The ComponentDatabase class is a class that stores the New() functions of all components.
DataObjectType::Pointer DataObjectPointer
FileNameContainerPointer m_FixedMaskFileNameContainer
ObjectContainerPointer m_ResamplerContainer
ConfigurationType::Pointer ConfigurationPointer
itk::ImageFileReader< ImageType > ImageReaderType
ObjectContainerPointer m_ResampleInterpolatorContainer
itk::VectorContainer< unsigned int, DataObjectPointer > DataObjectContainerType
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 11-03-2014 for elastix by doxygen 1.8.6 elastix logo