freVectorFieldSetVarianceCalculator.txx

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   F.R.E.E. - flexible registration evaluation engine
00004   Version:   v.1.0.0
00005   Date:      $Date: 2006/09/01 12:00:00 $
00006   Module:    $RCSfile: freVectorFieldSetVarianceCalculator.txx,v $
00007   Language:  C++
00008 
00009 
00010 
00011   Copyright (c) 2007 Ralf o Floca (Department of Medical Informatics,
00012   Institute for Medical Biometry and Informatics, University of Heidelberg,
00013   Germany). All rights reserved.
00014   See FREECopyright.txt or http://www.mi.med.uni-hd.de/free/copyright.htm
00015   for details.
00016 
00017      This software is distributed WITHOUT ANY WARRANTY; without even 
00018      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00019      PURPOSE.  See the above copyright notices for more information.
00020 
00021 =========================================================================*/
00022 #ifndef __freVectorFieldSetVarianceCalculator_txx
00023 #define __freVectorFieldSetVarianceCalculator_txx
00024 
00025 #include "freExceptions.h"
00026 #include "freVectorFieldSetVarianceCalculator.h"
00027 #include "freMeanVectorFieldGenerator.h"
00028 #include "freVarianceFieldGenerator.h"
00029 #include "freVectorSampleCharacteristicsCalculator.h"
00030 
00031 #include "itkSubtractImageFilter.h"
00032 #include "itkImageFileWriter.h"
00033 #include "itkImageFileReader.h"
00034 #include <stdio.h>
00035 
00036 namespace FREE
00037 {
00038 
00039 template <unsigned int VImageDimension>
00040 void
00041 VectorFieldSetVarianceCalculator<VImageDimension>::
00042 Compute()
00043 {
00044         // Calculation of MVF
00045         MeanVectorFieldGenerator<VectorFieldType,VectorFieldType> meanGenerator;
00046         if (fnOnProgress.IsNotNull()) fnOnProgress->Execute(0, "Calculating mean VF", this);
00047 
00048         for (unsigned int i = 0; i<m_iSetSize; i++)
00049         {
00050                 if (fnOnNextVectorField.IsNotNull()) fnOnNextVectorField->Execute(i, "", this);
00051                 meanGenerator.AddField(GetVectorField(i));
00052         };
00053 
00054   m_smpMeanVectorField = meanGenerator.GetOutput();
00055 
00056         // Calculation of variance field and DVFs
00057         VarianceFieldGenerator<VectorFieldType,VarianceFieldType> varianceGenerator;
00058         if (fnOnProgress.IsNotNull()) fnOnProgress->Execute(3, "Calculating variance field", this);
00059 
00060         for (unsigned int iIndex = 0; iIndex<m_iSetSize; iIndex++)
00061         {
00062                 if (fnOnNextVectorField.IsNotNull()) fnOnNextVectorField->Execute(iIndex, "", this);
00063 
00064                 VectorFieldPointer smpDVF = varianceGenerator.AddField(GetVectorField(iIndex),m_smpMeanVectorField);
00065 
00066                 if (fnOnNewDifferenceVectorField.IsNotNull()) fnOnNewDifferenceVectorField->Execute(iIndex, 0, smpDVF.GetPointer(), this);
00067 
00068                 SetVectorField(smpDVF, iIndex);
00069         };
00070 
00071   m_smpVarianceDifferenceField = varianceGenerator.GetOutput();
00072 };
00073 
00080 template <unsigned int VImageDimension>
00081 void
00082 VectorFieldSetVarianceCalculator<VImageDimension>::
00083 SetVectorField(const VectorFieldPointer& smpField, unsigned int iIndex)
00084 {
00085         if (m_bFieldsOnDisk)
00086         {
00087                 std::string sFileName = GetVectorFieldName(iIndex);
00088     try
00089     {
00090       typedef itk::ImageFileWriter< VectorFieldType >  FieldWriterType;
00091                         typename FieldWriterType::Pointer  fieldWriter = FieldWriterType::New();
00092 
00093                   fieldWriter->SetInput( smpField );
00094                         fieldWriter->SetFileName(sFileName.c_str());
00095                 
00096                         fieldWriter->Update();
00097     }
00098                 catchAllNPassMacro("Error; Saving vector field temporarily. File: " << sFileName);
00099         }
00100         else
00101         {
00102                 if (m_VectorFields.size()>iIndex)
00103                 {
00104                         m_VectorFields[iIndex] = smpField;
00105                 }
00106                 else
00107                 {
00108                         m_VectorFields.push_back(smpField);
00109                 }
00110         }
00111 };
00112 
00120 template <unsigned int VImageDimension>
00121 typename VectorFieldSetVarianceCalculator<VImageDimension>::VectorFieldPointer
00122 VectorFieldSetVarianceCalculator<VImageDimension>::
00123 GetVectorField(unsigned int iIndex)
00124 {
00125         VectorFieldPointer smpField;
00126 
00127         if (m_bFieldsOnDisk)
00128         {
00129                 std::string sFileName = GetVectorFieldName(iIndex);
00130     try
00131     {
00132       typedef itk::ImageFileReader< VectorFieldType >  FieldReaderType;
00133                         typename FieldReaderType::Pointer  fieldReader = FieldReaderType::New();
00134                         
00135                         fieldReader->SetFileName(sFileName.c_str());
00136                         smpField = fieldReader->GetOutput();
00137                         
00138                         fieldReader->Update();
00139     }
00140                 catchAllNPassMacro("Error; Loading vector field. File: " << sFileName);
00141         }
00142         else
00143         {
00144                 if (m_VectorFields.size()>iIndex)
00145                 {
00146                         smpField = m_VectorFields[iIndex];
00147                 }
00148         }
00149         return smpField;
00150 };
00151 
00152 template <unsigned int VImageDimension>
00153 void
00154 VectorFieldSetVarianceCalculator<VImageDimension>::
00155 ClearVectorFields()
00156 {
00157         if (m_bFieldsOnDisk)
00158         {
00159                 for (unsigned int i = 0; i<m_iSetSize; i++)
00160                 {
00161                 std::string sFileName = GetVectorFieldName(i);
00162                         if( remove( sFileName.c_str() ) == -1 ) throwExceptionMacro("Error; Deleting temporary vector field. File: " << sFileName);
00163                 };
00164         }
00165         else
00166         {
00167                 m_VectorFields.clear();
00168         }
00169 };
00170 
00171 template <unsigned int VImageDimension>
00172 std::string
00173 VectorFieldSetVarianceCalculator<VImageDimension>::
00174 GetVectorFieldName(unsigned int iIndex)
00175 {
00176         std::string result = m_sFieldsPath + "VFSDifference_Smpl_"+Convert::ToStr(iIndex)+".mhd";
00177         return result;
00178 };
00179 
00180 template <unsigned int VImageDimension>
00181 void
00182 VectorFieldSetVarianceCalculator<VImageDimension>::
00183 AddVectorField(VectorFieldType* pVectorField)
00184 {
00185         SetVectorField(pVectorField,m_iSetSize);
00186         m_iSetSize++;
00187 };
00188 
00189 template <unsigned int VImageDimension>
00190 void
00191 VectorFieldSetVarianceCalculator<VImageDimension>::
00192 Reset()
00193 {
00194         fnOnProgress = NULL;
00195         fnOnNextVectorField = NULL;
00196         fnOnNewDifferenceVectorField = NULL;
00197 
00198         m_sFieldsPath = GetGeneralFREEPath();
00199 
00200         m_smpMeanVectorField = NULL;
00201 
00202         m_smpVarianceDifferenceField = NULL;
00203 
00204         ClearVectorFields();
00205         m_iSetSize = 0;
00206         m_bFieldsOnDisk = false;
00207 };
00208 
00212 template <unsigned int VImageDimension>
00213 VectorFieldSetVarianceCalculator<VImageDimension>::
00214 VectorFieldSetVarianceCalculator()
00215 {
00216         m_bFieldsOnDisk = false; //important for a first correct reseting
00217         Reset();
00218 };
00219 
00220 template <unsigned int VImageDimension>
00221 VectorFieldSetVarianceCalculator<VImageDimension>::
00222 ~VectorFieldSetVarianceCalculator()
00223 {
00224         Reset();
00225 };
00226 
00227 } //End of namespace FREE
00228 
00229 #endif

Generated at Sat Oct 13 18:02:05 2007 for f.r.e.e. - Flexible Registration and Evaluation Engine by doxygen 1.5.3 written by Dimitri van Heesch, © 1997-2000