20 #include "itkImageFileReader.h" 21 #include "itkPSMEntropyModelFilter.h" 22 #include "itkPSMProjectReader.h" 23 #include "itkCommand.h" 27 class MyMultiscaleIterationCommand :
public itk::Command
32 typedef Command Superclass;
33 typedef SmartPointer< Self > Pointer;
34 typedef SmartPointer< const Self > ConstPointer;
36 typedef Image<float, 3> ImageType;
45 virtual void Execute(Object *caller,
const EventObject &)
53 std::cout <<
"Scale = " << o->GetCurrentScale() << std::endl;
55 std::cout <<
" Eigenmode variances: ";
60 std::cout << std::endl;
61 std::cout <<
" Regularization = " << o->GetRegularizationConstant() << std::endl;
63 virtual void Execute(
const Object *,
const EventObject &)
65 std::cout <<
"SHOULDN'T BE HERE" << std::endl;
73 void operator=(
const Self &);
79 int itkPSMEntropyModelFilterMultiscaleTest(
int argc,
char* argv[] )
82 std::string errstring =
"";
83 std::string output_path =
"";
84 std::string input_path_prefix =
"";
89 std::cout <<
"Wrong number of arguments. \nUse: " 90 <<
"itkPSMEntropyModelFilterTest parameter_file [output_path]\n" 91 <<
"See itk::PSMParameterFileReader for documentation on the parameter file format." 98 output_path = std::string(argv[2]);
103 input_path_prefix = std::string(argv[3]);
106 typedef itk::Image<float, 3> ImageType;
111 itk::PSMProjectReader::Pointer xmlreader =
112 itk::PSMProjectReader::New();
113 xmlreader->SetFileName(argv[1]);
116 itk::PSMProject::Pointer project = xmlreader->GetOutput();
119 itk::PSMEntropyModelFilter<ImageType>::Pointer P
124 itk::MyMultiscaleIterationCommand::Pointer mycommand = itk::MyMultiscaleIterationCommand::New();
125 P->AddObserver(itk::IterationEvent(), mycommand);
128 const std::vector<std::string> &dt_files = project->GetDistanceTransforms();
129 std::cout <<
"Reading distance transforms ..." << std::endl;
130 for (
unsigned int i = 0; i < dt_files.size(); i++)
132 itk::ImageFileReader<ImageType>::Pointer reader =
133 itk::ImageFileReader<ImageType>::New();
134 reader->SetFileName(input_path_prefix + dt_files[i]);
137 std::cout <<
" " << (input_path_prefix + dt_files[i]) << std::endl;
141 std::cout <<
"Done!" << std::endl;
144 unsigned int number_of_scales = project->GetNumberOfOptimizationScales();
145 std::cout <<
"Found " << number_of_scales <<
" number of scales. " << std::endl;
148 std::vector<double> regularization_initial(number_of_scales);
149 std::vector<double> regularization_final(number_of_scales);
150 std::vector<double> regularization_decayspan(number_of_scales);
151 std::vector<double> tolerance(number_of_scales);
152 std::vector<unsigned int> maximum_iterations(number_of_scales);
155 for (
unsigned int i = 0; i < number_of_scales; i++)
157 std::cout <<
"Optimization parameters for scale " << i <<
": " << std::endl;
158 regularization_initial[i] = project->GetOptimizationAttribute(
"regularization_initial",i);
159 std::cout <<
" regularization_initial = " << regularization_initial[i] << std::endl;
160 regularization_final[i] = project->GetOptimizationAttribute(
"regularization_final",i);
161 std::cout <<
" regularization_final = " << regularization_final[i] << std::endl;
162 regularization_decayspan[i] = project->GetOptimizationAttribute(
"regularization_decayspan",i);
163 std::cout <<
" regularization_decayspan = " << regularization_decayspan[i] << std::endl;
164 tolerance[i] = project->GetOptimizationAttribute(
"tolerance",i);
165 std::cout <<
" tolerance = " << tolerance[i] << std::endl;
166 maximum_iterations[i] =
static_cast<unsigned int>(project->GetOptimizationAttribute(
"maximum_iterations",i));
167 std::cout <<
" maximum_iterations = " << maximum_iterations[i] << std::endl;
171 P->SetRegularizationDecaySpan(regularization_decayspan);
173 P->SetRegularizationFinal(regularization_final);
180 const std::vector<std::string> &out_files = project->GetModel(std::string(
"optimized"));
181 if (out_files.size() != P->GetParticleSystem()->GetNumberOfDomains())
183 errstring +=
"Number of output files does not match the number of particle domains (inputs).";
189 for (
unsigned int d = 0; d < P->GetParticleSystem()->GetNumberOfDomains(); d++)
192 std::string fname = output_path + out_files[d];
193 std::ofstream out( fname.c_str() );
196 errstring +=
"Could not open point file for output: ";
200 for (
unsigned int j = 0; j < P->GetParticleSystem()->GetNumberOfParticles(d); j++)
202 for (
unsigned int i = 0; i < 3; i++)
204 out << P->GetParticleSystem()->GetPosition(j,d)[i] <<
" ";
214 catch(itk::ExceptionObject &e)
216 errstring =
"ITK exception with description: " + std::string(e.GetDescription())
217 + std::string(
"\n at location:") + std::string(e.GetLocation())
218 + std::string(
"\n in file:") + std::string(e.GetFile());
223 errstring =
"Unknown exception thrown";
229 std::cout <<
"All tests passed" << std::endl;
234 std::cout <<
"Test failed with the following error:" << std::endl;
235 std::cout << errstring << std::endl;
void SetMaximumNumberOfIterations(const std::vector< unsigned int > &n)
MyMultiscaleIterationCommand Self
void SetNumberOfScales(unsigned int n)
unsigned int GetNumberOfElapsedIterations() const
virtual void Execute(Object *caller, const EventObject &)
const std::vector< double > & GetShapePCAVariances() const
itkTypeMacro(MyMultiscaleIterationCommand, Command)
void SetRegularizationInitial(const std::vector< double > &v)
void SetInput(const std::string &s, itk::DataObject *o)
void SetTolerance(const std::vector< double > &v)