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 using namespace itk;
80 
142 {
143 public:
144 
146  typedef ElastixBase Self;
148 
152  typedef itk::Object ObjectType; //for the components
153  typedef ObjectType::Pointer ObjectPointer;
154  typedef itk::DataObject DataObjectType; //for the images
155  typedef DataObjectType::Pointer DataObjectPointer;
156  typedef itk::VectorContainer<
158  typedef ObjectContainerType::Pointer ObjectContainerPointer;
159  typedef itk::VectorContainer<
161  typedef DataObjectContainerType::Pointer DataObjectContainerPointer;
162  typedef itk::VectorContainer<
163  unsigned int, std::string > FileNameContainerType;
164  typedef FileNameContainerType::Pointer FileNameContainerPointer;
165 
170  typedef std::vector<double> FlatDirectionCosinesType;
171 
175  typedef Object ITKBaseType;
176 
178  virtual ITKBaseType * GetAsITKBaseType( void )
179  {
180  return dynamic_cast<ITKBaseType *>( this );
181  }
182 
184  elxGetObjectMacro( Configuration, ConfigurationType );
185  elxSetObjectMacro( Configuration, ConfigurationType );
186 
188  virtual void SetDBIndex( DBIndexType _arg );
189  virtual DBIndexType GetDBIndex( void )
190  {
191  return this->m_DBIndex;
192  }
193 
198  elxGetObjectMacro( ComponentDatabase, ComponentDatabaseType );
199  elxSetObjectMacro( ComponentDatabase, ComponentDatabaseType );
200 
205  elxGetObjectMacro( RegistrationContainer, ObjectContainerType );
206  elxGetObjectMacro( FixedImagePyramidContainer, ObjectContainerType );
207  elxGetObjectMacro( MovingImagePyramidContainer, ObjectContainerType );
208  elxGetObjectMacro( InterpolatorContainer, ObjectContainerType );
209  elxGetObjectMacro( ImageSamplerContainer, ObjectContainerType );
210  elxGetObjectMacro( MetricContainer, ObjectContainerType );
211  elxGetObjectMacro( OptimizerContainer, ObjectContainerType );
212  elxGetObjectMacro( ResamplerContainer, ObjectContainerType );
213  elxGetObjectMacro( ResampleInterpolatorContainer, ObjectContainerType );
214  elxGetObjectMacro( TransformContainer, ObjectContainerType );
215 
220  elxSetObjectMacro( RegistrationContainer, ObjectContainerType );
221  elxSetObjectMacro( FixedImagePyramidContainer, ObjectContainerType );
222  elxSetObjectMacro( MovingImagePyramidContainer, ObjectContainerType );
223  elxSetObjectMacro( InterpolatorContainer, ObjectContainerType );
224  elxSetObjectMacro( ImageSamplerContainer, ObjectContainerType );
225  elxSetObjectMacro( MetricContainer, ObjectContainerType );
226  elxSetObjectMacro( OptimizerContainer, ObjectContainerType );
227  elxSetObjectMacro( ResamplerContainer, ObjectContainerType );
228  elxSetObjectMacro( ResampleInterpolatorContainer, ObjectContainerType );
229  elxSetObjectMacro( TransformContainer, ObjectContainerType );
230 
232  elxGetObjectMacro( FixedImageContainer, DataObjectContainerType );
233  elxGetObjectMacro( MovingImageContainer, DataObjectContainerType );
234  elxSetObjectMacro( FixedImageContainer, DataObjectContainerType );
235  elxSetObjectMacro( MovingImageContainer, DataObjectContainerType );
236 
238  elxGetObjectMacro( FixedMaskContainer, DataObjectContainerType );
239  elxGetObjectMacro( MovingMaskContainer, DataObjectContainerType );
240  elxSetObjectMacro( FixedMaskContainer, DataObjectContainerType );
241  elxSetObjectMacro( MovingMaskContainer, DataObjectContainerType );
242 
246  elxGetObjectMacro( FixedImageFileNameContainer, FileNameContainerType );
247  elxGetObjectMacro( MovingImageFileNameContainer, FileNameContainerType );
248  elxSetObjectMacro( FixedImageFileNameContainer, FileNameContainerType );
249  elxSetObjectMacro( MovingImageFileNameContainer, FileNameContainerType );
250 
254  elxGetObjectMacro( FixedMaskFileNameContainer, FileNameContainerType );
255  elxGetObjectMacro( MovingMaskFileNameContainer, FileNameContainerType );
256  elxSetObjectMacro( FixedMaskFileNameContainer, FileNameContainerType );
257  elxSetObjectMacro( MovingMaskFileNameContainer, FileNameContainerType );
258 
260  elxGetNumberOfMacro( Registration );
261  elxGetNumberOfMacro( FixedImagePyramid );
262  elxGetNumberOfMacro( MovingImagePyramid );
263  elxGetNumberOfMacro( Interpolator );
264  elxGetNumberOfMacro( ImageSampler );
265  elxGetNumberOfMacro( Metric );
266  elxGetNumberOfMacro( Optimizer );
267  elxGetNumberOfMacro( Resampler );
268  elxGetNumberOfMacro( ResampleInterpolator );
269  elxGetNumberOfMacro( Transform );
270  elxGetNumberOfMacro( FixedImage );
271  elxGetNumberOfMacro( MovingImage );
272  elxGetNumberOfMacro( FixedImageFileName );
273  elxGetNumberOfMacro( MovingImageFileName );
274  elxGetNumberOfMacro( FixedMask );
275  elxGetNumberOfMacro( MovingMask );
276  elxGetNumberOfMacro( FixedMaskFileName );
277  elxGetNumberOfMacro( MovingMaskFileName );
278 
283  elxSetObjectMacro( InitialTransform, ObjectType );
284  elxGetObjectMacro( InitialTransform, ObjectType );
285 
292  elxSetObjectMacro( FinalTransform, ObjectType );
293  elxGetObjectMacro( FinalTransform, ObjectType );
294 
296  virtual int Run( void ) = 0;
297 
299  virtual int ApplyTransform( void ) = 0;
300 
304  virtual int BeforeAllBase( void );
305 
309  virtual int BeforeAllTransformixBase( void );
310 
314  virtual void BeforeRegistrationBase( void );
315  virtual void AfterRegistrationBase( void );
316 
321  virtual int GetDefaultOutputPrecision( void ) const
322  {
323  return this->m_DefaultOutputPrecision;
324  }
325 
329  virtual bool GetUseDirectionCosines( void ) const;
330 
333  virtual void SetOriginalFixedImageDirectionFlat(
334  const FlatDirectionCosinesType & arg );
335  virtual const FlatDirectionCosinesType &
336  GetOriginalFixedImageDirectionFlat( void ) const;
337 
338 protected:
339 
340  ElastixBase();
341  virtual ~ElastixBase() {};
342 
343  ConfigurationPointer m_Configuration;
346 
348 
361  template < class TImage >
363  {
364  public:
365  typedef TImage ImageType;
366  typedef typename ImageType::Pointer ImagePointer;
367  typedef ImageFileReader<ImageType> ImageReaderType;
368  typedef typename ImageReaderType::Pointer ImageReaderPointer;
369  typedef typename ImageType::DirectionType DirectionType;
370  typedef ChangeInformationImageFilter<ImageType> ChangeInfoFilterType;
371  typedef typename ChangeInfoFilterType::Pointer ChangeInfoFilterPointer;
372 
373  static DataObjectContainerPointer GenerateImageContainer(
374  FileNameContainerType * fileNameContainer, const std::string & imageDescription,
375  bool useDirectionCosines, DirectionType * originalDirectionCosines = NULL )
376  {
377  DataObjectContainerPointer imageContainer = DataObjectContainerType::New();
378 
380  for ( unsigned int i = 0; i < fileNameContainer->Size(); ++i )
381  {
383  ImageReaderPointer imageReader = ImageReaderType::New();
384  imageReader->SetFileName( fileNameContainer->ElementAt( i ).c_str() );
385  ChangeInfoFilterPointer infoChanger = ChangeInfoFilterType::New();
386  DirectionType direction;
387  direction.SetIdentity();
388  infoChanger->SetOutputDirection( direction );
389  infoChanger->SetChangeDirection( !useDirectionCosines );
390  infoChanger->SetInput( imageReader->GetOutput() );
391 
393  try
394  {
395  infoChanger->Update();
396  }
397  catch( itk::ExceptionObject & excp )
398  {
400  std::string err_str = excp.GetDescription();
401  err_str += "\nError occurred while reading the image described as "
402  + imageDescription + ", with file name " + imageReader->GetFileName() + "\n";
403  excp.SetDescription( err_str );
405  throw excp;
406  }
407 
409  ImagePointer image = infoChanger->GetOutput();
410  imageContainer->CreateElementAt(i) = image.GetPointer();
411 
413  if ( originalDirectionCosines )
414  {
415  *originalDirectionCosines = imageReader->GetOutput()->GetDirection();
416  }
417 
418  } // end for i
419 
420  return imageContainer;
421 
422  } // end static method GenerateImageContainer
423 
426 
427  }; // end class MultipleImageLoader
428 
429 private:
430 
431  ElastixBase( const Self& ); // purposely not implemented
432  void operator=( const Self& ); // purposely not implemented
433 
435 
437 
451 
457 
463 
467 
470 
478  FileNameContainerPointer GenerateFileNameContainer(
479  const std::string & optionkey,
480  int & errorcode,
481  bool printerrors,
482  bool printinfo ) const;
483 
484 }; // end class ElastixBase
485 
486 
487 } // end namespace elastix
488 
489 #undef elxGetObjectMacro
490 #undef elxSetObjectMacro
491 #undef elxGetNumberOfMacro
492 
493 #endif // end #ifndef __elxElastixBase_h
494 


Generated on 21-03-2014 for elastix by doxygen 1.8.1.2 elastix logo