Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
SpectralUnmixingAppTimeEval.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
13 //#include <boost>
14 #include <chrono>
15 #include <mitkCommon.h>
16 
21 
22 #include <mitkCommandLineParser.h>
23 #include <mitkException.h>
24 #include <mitkIOUtil.h>
25 #include <mitkUIDGenerator.h>
26 
27 #include <itksys/SystemTools.hxx>
28 
29 
31 
32 
33 struct InputParameters
34 {
35  std::string inputPath;
36  std::string outputPath;
37  int numberOfInputs;
38 };
39 
40 InputParameters parseInput(int argc, char *argv[])
41 {
42  MITK_INFO << "Parsing arguments...";
43  mitkCommandLineParser parser;
44 
45  parser.setCategory("MITK-Photoacoustics");
46  parser.setTitle("Mitk Spectral Unmixing App");
47  parser.setDescription("Batch processing for spectral unmixing.");
48  parser.setContributor("Computer Assisted Medical Interventions, DKFZ");
49 
50  parser.setArgumentPrefix("--", "-");
51 
52  parser.beginGroup("Required parameters");
53  parser.addArgument("inputPath",
54  "i",
56  "Input folder (directory)",
57  "input folder",
58  us::Any(),
59  false, false, false, mitkCommandLineParser::Input);
60  parser.addArgument("outputPath",
61  "o",
63  "Input save folder (directory)",
64  "input save folder",
65  us::Any(),
66  false, false, false, mitkCommandLineParser::Output);
67  parser.addArgument("numberOfInputs",
68  "n",
70  "Number of Input files",
71  "number of inputs",
72  us::Any(),
73  false);
74  parser.endGroup();
75 
76 
77  InputParameters input;
78 
79 
80  std::map<std::string, us::Any> parsedArgs = parser.parseArguments(argc, argv);
81  if (argc == 0)
82  exit(-1);
83 
84  for (int i = 0; i < argc; ++i)
85  {
86  MITK_INFO << argv[i];
87  }
88 
89  if (parsedArgs.count("inputPath"))
90  {
91  input.inputPath = us::any_cast<std::string>(parsedArgs["inputPath"]);
92  }
93  else
94  {
95  MITK_ERROR << "Error: No inputPath";
96  mitkThrow() << "Error: No inputPath";
97  }
98 
99  if (parsedArgs.count("outputPath"))
100  {
101  input.outputPath = us::any_cast<std::string>(parsedArgs["outputPath"]);
102  }
103  else
104  {
105  MITK_ERROR << "Error: No outputPath";
106  mitkThrow() << "Error: No outputPath";
107  }
108  if (parsedArgs.count("numberOfInputs"))
109  {
110  input.numberOfInputs = us::any_cast<int>(parsedArgs["numberOfInputs"]);
111  }
112  else
113  {
114  MITK_ERROR << "Error: No number of Inputs";
115  mitkThrow() << "Error: No number of Inputs";
116  }
117  MITK_INFO << "Parsing arguments...[Done]";
118  return input;
119 }
120 
121 
123 {
124  mitk::pa::SpectralUnmixingFilterBase::Pointer spectralUnmixingFilter;
125 
126  if (algorithm == "QR")
127  {
128  spectralUnmixingFilter = mitk::pa::LinearSpectralUnmixingFilter::New();
129  dynamic_cast<mitk::pa::LinearSpectralUnmixingFilter *>(spectralUnmixingFilter.GetPointer())
130  ->SetAlgorithm(mitk::pa::LinearSpectralUnmixingFilter::AlgortihmType::HOUSEHOLDERQR);
131  }
132 
133  else if (algorithm == "SVD")
134  {
135  spectralUnmixingFilter = mitk::pa::LinearSpectralUnmixingFilter::New();
136  dynamic_cast<mitk::pa::LinearSpectralUnmixingFilter *>(spectralUnmixingFilter.GetPointer())
137  ->SetAlgorithm(mitk::pa::LinearSpectralUnmixingFilter::AlgortihmType::JACOBISVD);
138  }
139 
140  else if (algorithm == "LU")
141  {
142  spectralUnmixingFilter = mitk::pa::LinearSpectralUnmixingFilter::New();
143  dynamic_cast<mitk::pa::LinearSpectralUnmixingFilter *>(spectralUnmixingFilter.GetPointer())
144  ->SetAlgorithm(mitk::pa::LinearSpectralUnmixingFilter::AlgortihmType::FULLPIVLU);
145  }
146 
147  else if (algorithm == "NNLS")
148  {
149  spectralUnmixingFilter = mitk::pa::SpectralUnmixingFilterVigra::New();
150  dynamic_cast<mitk::pa::SpectralUnmixingFilterVigra *>(spectralUnmixingFilter.GetPointer())
151  ->SetAlgorithm(mitk::pa::SpectralUnmixingFilterVigra::VigraAlgortihmType::LARS);
152  }
153 
154  else if (algorithm == "WLS")
155  {
156  spectralUnmixingFilter = mitk::pa::SpectralUnmixingFilterVigra::New();
157  dynamic_cast<mitk::pa::SpectralUnmixingFilterVigra *>(spectralUnmixingFilter.GetPointer())
158  ->SetAlgorithm(mitk::pa::SpectralUnmixingFilterVigra::VigraAlgortihmType::WEIGHTED);
159 
160  /*std::vector<int> weigthVec = {39, 45, 47};
161 
162  for (int i = 0; i < 3; ++i)
163  {
164  dynamic_cast<mitk::pa::SpectralUnmixingFilterVigra *>(spectralUnmixingFilter.GetPointer())
165  ->AddWeight(weigthVec[i]);
166  }*/
167  }
168  return spectralUnmixingFilter;
169 }
170 
171 void add_weight(int weights, mitk::pa::SpectralUnmixingFilterBase::Pointer m_SpectralUnmixingFilter)
172 {
173  std::vector<int> weigthVec = { 30, 32, 33, 35, 37, 38, 40, 41, 43, 44, 45, 46, 47, 47,
174  47, 47, 47, 46, 46, 45, 44, 44, 43, 42, 42, 41 };
175 
176  for (int i = 0; i < weights; ++i)
177  {
178  dynamic_cast<mitk::pa::SpectralUnmixingFilterVigra *>(m_SpectralUnmixingFilter.GetPointer())
179  ->AddWeight(weigthVec[i]);
180  }
181 }
182 
183 
184 
185 int main(int argc, char *argv[])
186 {
187  auto input = parseInput(argc, argv);
188 
189  std::string inputDir = input.inputPath;
190  std::string outputDir = input.outputPath;
191  unsigned int N = input.numberOfInputs;
192 
193 /*
194  //maybee try with "itk system tools"
195 
196  //auto test = itksys::SystemTools::GetFilenameName(argv[0]).c_str();
197 
198  //MITK_INFO << "test: " << test;
199 
200 
201  / +++ temporary solution BEGIN +++
202  std::vector<std::string> files;
203  std::string file;
204  for (int i = 1; i < 34; ++i)
205  {
206 
207  if (i < 10)
208  {
209  file = "E:/NHDATA/sdmas_beamformed/merged/static-oxy_sdmas_00" + std::to_string(i) + "_merged.nrrd";
210  }
211  else
212  {
213  file = "E:/NHDATA/sdmas_beamformed/merged/static-oxy_sdmas_0" + std::to_string(i) + "_merged.nrrd";
214  }
215  files.push_back(file);
216  }
217  / +++ temporary solution END +++
218 
219  std::vector<std::string> files;
220  std::string file;
221  for (int i = 0; i < 7; ++i)
222  {
223  file = "E:/NHCAMI/cami-experimental/PAI/spectralUnmixing/inSilico/paImages/selection/noiselevel1_rep1000_wavelength_selction_data_" +
224  std::to_string(i) + ".nrrd";
225  files.push_back(file);
226  }
227  std::vector<std::string> files;
228  std::string file;
229  file = "E:/NHCAMI/cami-experimental/PAI/spectralUnmixing/inSilico/paImages/selection/noiselevel1_rep1000_wavelength_selction_data.nrrd";
230  files.push_back(file);*/
231 
232  std::vector<std::string> algorithms = { "QR", "LU", "SVD", "NNLS", "WLS" };
233  int repetition = 6000;
234 
235  for (unsigned alg = 0; alg < 5; ++alg)
236  {
237  ofstream myerrorfile;
238  myerrorfile.open("E:/NHDATA/time/time_evaluation_" + std::to_string(repetition)+"_" + algorithms[alg] + "_new02.txt");
239 
240  int ctr = 0;
241  for(int i = 2; i < 27; ++i)
242  {
243  myerrorfile << std::to_string(i) + "\t";
244  std::string file;
245  if (i < 10)
246  file = "E:/NHDATA/time/input/time_0" + std::to_string(i) + ".nrrd";
247  else
248  file = "E:/NHDATA/time/input/time_" + std::to_string(i) + ".nrrd";
249 
250  auto m_inputImage = mitk::IOUtil::Load<mitk::Image>(file);
251 
252  MITK_INFO << "File: " << i;
253 
254  for (int j = 0; j < repetition; ++j)
255  {
256  std::chrono::steady_clock::time_point _start;
257  _start = std::chrono::steady_clock::now();
258 
259  mitk::pa::SpectralUnmixingFilterBase::Pointer m_SpectralUnmixingFilter = GetFilterInstance(algorithms[alg]);
260  m_SpectralUnmixingFilter->SetInput(m_inputImage);
261  m_SpectralUnmixingFilter->AddOutputs(2);
262  m_SpectralUnmixingFilter->Verbose(false);
263  m_SpectralUnmixingFilter->RelativeError(false);
264  m_SpectralUnmixingFilter->AddChromophore(mitk::pa::PropertyCalculator::ChromophoreType::OXYGENATED);
265  m_SpectralUnmixingFilter->AddChromophore(mitk::pa::PropertyCalculator::ChromophoreType::DEOXYGENATED);
266 
267  for (int wl = 0; wl < i; ++wl)
268  {
269  m_SpectralUnmixingFilter->AddWavelength(700 + wl * 10);
270  }
271 
272  if (alg == 4)
273  {
274  add_weight(i, m_SpectralUnmixingFilter);
275  }
276 
277 
278  m_SpectralUnmixingFilter->Update();
279 
280  auto output1 = m_SpectralUnmixingFilter->GetOutput(0);
281  auto output2 = m_SpectralUnmixingFilter->GetOutput(1);
282 
283  m_SpectralUnmixingFilter = nullptr;
284 
285  std::chrono::steady_clock::time_point _end(std::chrono::steady_clock::now());
286  myerrorfile << std::chrono::duration_cast<std::chrono::duration<double>>(_end - _start).count() << "\t";
287 
288  /*std::string unmixingOutputHbO2 = "E:/NHDATA/time/output/time_" + std::to_string(i) + ".nrrd";
289  std::string unmixingOutputHb = "E:/NHDATA/time/output/time_" + std::to_string(i) + ".nrrd";
290  mitk::IOUtil::Save(output1, unmixingOutputHbO2);
291  mitk::IOUtil::Save(output2, unmixingOutputHb);
292 
293  //auto m_sO2 = mitk::pa::SpectralUnmixingSO2::New();
294  //m_sO2->Verbose(false);
295  //auto output1 = m_SpectralUnmixingFilter->GetOutput(0);
296  //auto output2 = m_SpectralUnmixingFilter->GetOutput(1);
297 
298 
299  //std::string unmixingOutputHbO2 ="E:/NHDATA/time/input/time_" + std::to_string(i) + ".nrrd";
300  //std::string unmixingOutputHb = outputDir + "/SUOutput/" + "Hb_" + algorithms[alg] + "_" + str_ctr + ".nrrd";
301  //mitk::IOUtil::Save(output1, unmixingOutputHbO2);
302  //mitk::IOUtil::Save(output2, unmixingOutputHb);
303 
304  //m_sO2->SetInput(0, output1);
305  //m_sO2->SetInput(1, output2);
306 
307  //m_sO2->Update();
308 
309  //mitk::Image::Pointer sO2 = m_sO2->GetOutput(0);
310  //sO2->SetSpacing(output1->GetGeometry()->GetSpacing());
311 
312  //std::string outputSo2 = outputDir + "/So2/" + algorithms[alg] + "/So2_" + algorithms[alg] + "_" + str_ctr + ".nrrd";
313  //std::string outputSo2 = outputDir + "/" + algorithms[alg] + "_sel_" + str_ctr + ".nrrd";
314  //std::string outputSo2 = outputDir + "/" + algorithms[alg] + "_sel.nrrd";
315  //mitk::IOUtil::Save(sO2, outputSo2);
316 
317  //std::string outputSo2 = "E:/NHDATA/time/output/time_" + std::to_string(i) + algorithms[alg] + ".nrrd";
318  //mitk::IOUtil::Save(sO2, outputSo2);*/
319  }
320  myerrorfile << "\n";
321  }
322  myerrorfile.close();
323  }
324  MITK_INFO << "Spectral Unmixing DONE";
325 }
This filter is subclass of the spectral unmixing filter base. All algorithms in this class are based ...
#define MITK_INFO
Definition: mitkLogMacros.h:18
#define MITK_ERROR
Definition: mitkLogMacros.h:20
void setContributor(std::string contributor)
ValueType * any_cast(Any *operand)
Definition: usAny.h:377
void addArgument(const std::string &longarg, const std::string &shortarg, Type type, const std::string &argLabel, const std::string &argHelp=std::string(), const us::Any &defaultValue=us::Any(), bool optional=true, bool ignoreRest=false, bool deprecated=false, mitkCommandLineParser::Channel channel=mitkCommandLineParser::Channel::None)
std::map< std::string, us::Any > parseArguments(const StringContainerType &arguments, bool *ok=nullptr)
mitk::pa::SpectralUnmixingFilterBase::Pointer GetFilterInstance(std::string algorithm)
This filter is subclass of the spectral unmixing filter base. All algorithms in this class are based ...
InputParameters parseInput(int argc, char *argv[])
#define mitkThrow()
Definition: usAny.h:163
int main(int argc, char *argv[])
void setCategory(std::string category)
void setArgumentPrefix(const std::string &longPrefix, const std::string &shortPrefix)
void setTitle(std::string title)
void setDescription(std::string description)
void add_weight(int weights, mitk::pa::SpectralUnmixingFilterBase::Pointer m_SpectralUnmixingFilter)
void beginGroup(const std::string &description)