00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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
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
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;
00217 Reset();
00218 };
00219
00220 template <unsigned int VImageDimension>
00221 VectorFieldSetVarianceCalculator<VImageDimension>::
00222 ~VectorFieldSetVarianceCalculator()
00223 {
00224 Reset();
00225 };
00226
00227 }
00228
00229 #endif