Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
TissueBatchGenerator.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 <mitkCommon.h>
14 #include <chrono>
16 #include <mitkPATissueGenerator.h>
17 #include <mitkIOUtil.h>
18 #include <mitkCommandLineParser.h>
19 #include <mitkUIDGenerator.h>
20 #include <mitkException.h>
21 
22 #include <itksys/SystemTools.hxx>
23 
24 using namespace mitk::pa;
25 
26 TissueGeneratorParameters::Pointer CreateMultiHB_13_02_18_Parameters()
27 {
28  auto returnParameters = TissueGeneratorParameters::New();
29  returnParameters->SetAirThicknessInMillimeters(1.8);
30  returnParameters->SetMinBackgroundAbsorption(0.001);
31  returnParameters->SetMaxBackgroundAbsorption(0.2);
32  returnParameters->SetBackgroundAnisotropy(0.9);
33  returnParameters->SetBackgroundScattering(15);
34  returnParameters->SetCalculateNewVesselPositionCallback(&VesselMeanderStrategy::CalculateNewRandomlyDivergingDirectionVector);
35  returnParameters->SetDoPartialVolume(true);
36  returnParameters->SetMinNumberOfVessels(1);
37  returnParameters->SetMaxNumberOfVessels(7);
38  returnParameters->SetMinVesselAbsorption(1);
39  returnParameters->SetMaxVesselAbsorption(12);
40  returnParameters->SetMinVesselAnisotropy(0.9);
41  returnParameters->SetMaxVesselAnisotropy(0.9);
42  returnParameters->SetMinVesselBending(0);
43  returnParameters->SetMaxVesselBending(0.2);
44  returnParameters->SetMinVesselRadiusInMillimeters(0.5);
45  returnParameters->SetMaxVesselRadiusInMillimeters(6);
46  returnParameters->SetMinVesselScattering(15);
47  returnParameters->SetMaxVesselScattering(15);
48  returnParameters->SetMinVesselZOrigin(1);
49  returnParameters->SetMaxVesselZOrigin(3);
50  returnParameters->SetVesselBifurcationFrequency(5000);
51  returnParameters->SetRandomizePhysicalProperties(false);
52  returnParameters->SetSkinThicknessInMillimeters(0);
53  returnParameters->SetUseRngSeed(false);
54  returnParameters->SetVoxelSpacingInCentimeters(0.06);
55  returnParameters->SetXDim(70);
56  returnParameters->SetYDim(100);
57  returnParameters->SetZDim(100);
58  returnParameters->SetMCflag(4);
59  return returnParameters;
60 }
61 
62 TissueGeneratorParameters::Pointer CreateBaselineHB_13_02_18_Parameters()
63 {
64  auto returnParameters = TissueGeneratorParameters::New();
65  returnParameters->SetAirThicknessInMillimeters(1.8);
66  returnParameters->SetMinBackgroundAbsorption(0.001);
67  returnParameters->SetMaxBackgroundAbsorption(0.2);
68  returnParameters->SetBackgroundAnisotropy(0.9);
69  returnParameters->SetBackgroundScattering(15);
70  returnParameters->SetCalculateNewVesselPositionCallback(&VesselMeanderStrategy::CalculateNewRandomlyDivergingDirectionVector);
71  returnParameters->SetDoPartialVolume(true);
72  returnParameters->SetMinNumberOfVessels(1);
73  returnParameters->SetMaxNumberOfVessels(1);
74  returnParameters->SetMinVesselAbsorption(4.73);
75  returnParameters->SetMaxVesselAbsorption(4.73);
76  returnParameters->SetMinVesselAnisotropy(0.9);
77  returnParameters->SetMaxVesselAnisotropy(0.9);
78  returnParameters->SetMinVesselBending(0);
79  returnParameters->SetMaxVesselBending(0.2);
80  returnParameters->SetMinVesselRadiusInMillimeters(3);
81  returnParameters->SetMaxVesselRadiusInMillimeters(3);
82  returnParameters->SetMinVesselScattering(15);
83  returnParameters->SetMaxVesselScattering(15);
84  returnParameters->SetMinVesselZOrigin(1);
85  returnParameters->SetMaxVesselZOrigin(3);
86  returnParameters->SetVesselBifurcationFrequency(5000);
87  returnParameters->SetRandomizePhysicalProperties(false);
88  returnParameters->SetSkinThicknessInMillimeters(0);
89  returnParameters->SetUseRngSeed(false);
90  returnParameters->SetVoxelSpacingInCentimeters(0.06);
91  returnParameters->SetXDim(70);
92  returnParameters->SetYDim(100);
93  returnParameters->SetZDim(100);
94  returnParameters->SetMCflag(4);
95  return returnParameters;
96 }
97 
99 {
100  auto returnParameters = TissueGeneratorParameters::New();
101  returnParameters->SetAirThicknessInMillimeters(1.8);
102  returnParameters->SetMinBackgroundAbsorption(0.001);
103  returnParameters->SetMaxBackgroundAbsorption(0.2);
104  returnParameters->SetBackgroundAnisotropy(0.9);
105  returnParameters->SetBackgroundScattering(15);
106  returnParameters->SetCalculateNewVesselPositionCallback(&VesselMeanderStrategy::CalculateNewRandomlyDivergingDirectionVector);
107  returnParameters->SetDoPartialVolume(true);
108  returnParameters->SetMinNumberOfVessels(1);
109  returnParameters->SetMaxNumberOfVessels(1);
110  returnParameters->SetMinVesselAbsorption(1);
111  returnParameters->SetMaxVesselAbsorption(12);
112  returnParameters->SetMinVesselAnisotropy(0.9);
113  returnParameters->SetMaxVesselAnisotropy(0.9);
114  returnParameters->SetMinVesselBending(0);
115  returnParameters->SetMaxVesselBending(0.2);
116  returnParameters->SetMinVesselRadiusInMillimeters(0.5);
117  returnParameters->SetMaxVesselRadiusInMillimeters(6);
118  returnParameters->SetMinVesselScattering(15);
119  returnParameters->SetMaxVesselScattering(15);
120  returnParameters->SetMinVesselZOrigin(1);
121  returnParameters->SetMaxVesselZOrigin(3);
122  returnParameters->SetVesselBifurcationFrequency(5000);
123  returnParameters->SetRandomizePhysicalProperties(false);
124  returnParameters->SetSkinThicknessInMillimeters(0);
125  returnParameters->SetUseRngSeed(false);
126  returnParameters->SetVoxelSpacingInCentimeters(0.06);
127  returnParameters->SetXDim(70);
128  returnParameters->SetYDim(100);
129  returnParameters->SetZDim(100);
130  returnParameters->SetMCflag(4);
131  return returnParameters;
132 }
133 
134 TissueGeneratorParameters::Pointer CreateMultivessel_19_12_17_Parameters()
135 {
136  auto returnParameters = TissueGeneratorParameters::New();
137  returnParameters->SetAirThicknessInMillimeters(12);
138  returnParameters->SetMinBackgroundAbsorption(0.1);
139  returnParameters->SetMaxBackgroundAbsorption(0.1);
140  returnParameters->SetBackgroundAnisotropy(0.9);
141  returnParameters->SetBackgroundScattering(15);
142  returnParameters->SetCalculateNewVesselPositionCallback(&VesselMeanderStrategy::CalculateNewRandomlyDivergingDirectionVector);
143  returnParameters->SetDoPartialVolume(true);
144  returnParameters->SetMinNumberOfVessels(1);
145  returnParameters->SetMaxNumberOfVessels(7);
146  returnParameters->SetMinVesselAbsorption(2);
147  returnParameters->SetMaxVesselAbsorption(8);
148  returnParameters->SetMinVesselAnisotropy(0.9);
149  returnParameters->SetMaxVesselAnisotropy(0.9);
150  returnParameters->SetMinVesselBending(0.1);
151  returnParameters->SetMaxVesselBending(0.3);
152  returnParameters->SetMinVesselRadiusInMillimeters(0.5);
153  returnParameters->SetMaxVesselRadiusInMillimeters(4);
154  returnParameters->SetMinVesselScattering(15);
155  returnParameters->SetMaxVesselScattering(15);
156  returnParameters->SetMinVesselZOrigin(2.2);
157  returnParameters->SetMaxVesselZOrigin(4);
158  returnParameters->SetVesselBifurcationFrequency(5000);
159  returnParameters->SetRandomizePhysicalProperties(false);
160  returnParameters->SetSkinThicknessInMillimeters(0);
161  returnParameters->SetUseRngSeed(false);
162  returnParameters->SetVoxelSpacingInCentimeters(0.06);
163  returnParameters->SetXDim(70);
164  returnParameters->SetYDim(100);
165  returnParameters->SetZDim(100);
166  return returnParameters;
167 }
168 
169 TissueGeneratorParameters::Pointer CreateMultivessel_19_10_17_Parameters()
170 {
171  auto returnParameters = TissueGeneratorParameters::New();
172  returnParameters->SetAirThicknessInMillimeters(12);
173  returnParameters->SetMinBackgroundAbsorption(0.1);
174  returnParameters->SetMaxBackgroundAbsorption(0.1);
175  returnParameters->SetBackgroundAnisotropy(0.9);
176  returnParameters->SetBackgroundScattering(15);
177  returnParameters->SetCalculateNewVesselPositionCallback(&VesselMeanderStrategy::CalculateNewRandomlyDivergingDirectionVector);
178  returnParameters->SetDoPartialVolume(true);
179  returnParameters->SetMinNumberOfVessels(1);
180  returnParameters->SetMaxNumberOfVessels(7);
181  returnParameters->SetMinVesselAbsorption(2);
182  returnParameters->SetMaxVesselAbsorption(8);
183  returnParameters->SetMinVesselAnisotropy(0.9);
184  returnParameters->SetMaxVesselAnisotropy(0.9);
185  returnParameters->SetMinVesselBending(0.1);
186  returnParameters->SetMaxVesselBending(0.3);
187  returnParameters->SetMinVesselRadiusInMillimeters(0.5);
188  returnParameters->SetMaxVesselRadiusInMillimeters(4);
189  returnParameters->SetMinVesselScattering(15);
190  returnParameters->SetMaxVesselScattering(15);
191  returnParameters->SetMinVesselZOrigin(2.2);
192  returnParameters->SetMaxVesselZOrigin(4);
193  returnParameters->SetVesselBifurcationFrequency(5000);
194  returnParameters->SetRandomizePhysicalProperties(false);
195  returnParameters->SetSkinThicknessInMillimeters(0);
196  returnParameters->SetUseRngSeed(false);
197  returnParameters->SetVoxelSpacingInCentimeters(0.03);
198  returnParameters->SetXDim(140);
199  returnParameters->SetYDim(200);
200  returnParameters->SetZDim(180);
201  return returnParameters;
202 }
203 
204 TissueGeneratorParameters::Pointer CreateSinglevessel_19_10_17_Parameters()
205 {
206  auto returnParameters = TissueGeneratorParameters::New();
207  returnParameters->SetAirThicknessInMillimeters(12);
208  returnParameters->SetMinBackgroundAbsorption(0.1);
209  returnParameters->SetMaxBackgroundAbsorption(0.1);
210  returnParameters->SetBackgroundAnisotropy(0.9);
211  returnParameters->SetBackgroundScattering(15);
212  returnParameters->SetCalculateNewVesselPositionCallback(&VesselMeanderStrategy::CalculateNewRandomlyDivergingDirectionVector);
213  returnParameters->SetDoPartialVolume(true);
214  returnParameters->SetMinNumberOfVessels(1);
215  returnParameters->SetMaxNumberOfVessels(1);
216  returnParameters->SetMinVesselAbsorption(2);
217  returnParameters->SetMaxVesselAbsorption(8);
218  returnParameters->SetMinVesselAnisotropy(0.9);
219  returnParameters->SetMaxVesselAnisotropy(0.9);
220  returnParameters->SetMinVesselBending(0.1);
221  returnParameters->SetMaxVesselBending(0.3);
222  returnParameters->SetMinVesselRadiusInMillimeters(0.5);
223  returnParameters->SetMaxVesselRadiusInMillimeters(4);
224  returnParameters->SetMinVesselScattering(15);
225  returnParameters->SetMaxVesselScattering(15);
226  returnParameters->SetMinVesselZOrigin(2.2);
227  returnParameters->SetMaxVesselZOrigin(4);
228  returnParameters->SetVesselBifurcationFrequency(5000);
229  returnParameters->SetRandomizePhysicalProperties(false);
230  returnParameters->SetSkinThicknessInMillimeters(0);
231  returnParameters->SetUseRngSeed(false);
232  returnParameters->SetVoxelSpacingInCentimeters(0.03);
233  returnParameters->SetXDim(140);
234  returnParameters->SetYDim(200);
235  returnParameters->SetZDim(180);
236  return returnParameters;
237 }
238 
239 struct InputParameters
240 {
241  std::string saveFolderPath;
242  std::string identifyer;
243  std::string exePath;
244  std::string probePath;
245  bool verbose;
246 };
247 
248 InputParameters parseInput(int argc, char* argv[])
249 {
250  MITK_INFO << "Paring arguments...";
251  mitkCommandLineParser parser;
252  // set general information
253  parser.setCategory("MITK-Photoacoustics");
254  parser.setTitle("Mitk Tissue Batch Generator");
255  parser.setDescription("Creates in silico tissue in batch processing and automatically calculates fluence values for the central slice of the volume.");
256  parser.setContributor("Computer Assisted Medical Interventions, DKFZ");
257 
258  // how should arguments be prefixed
259  parser.setArgumentPrefix("--", "-");
260  // add each argument, unless specified otherwise each argument is optional
261  // see mitkCommandLineParser::addArgument for more information
262  parser.beginGroup("Required parameters");
263  parser.addArgument(
264  "savePath", "s", mitkCommandLineParser::Directory,
265  "Input save folder (directory)", "input save folder",
266  us::Any(), false, false, false, mitkCommandLineParser::Input);
267  parser.addArgument(
268  "mitkMcxyz", "m", mitkCommandLineParser::File,
269  "MitkMcxyz binary (file)", "path to the MitkMcxyz binary",
270  us::Any(), false, false, false, mitkCommandLineParser::Output);
271  parser.endGroup();
272  parser.beginGroup("Optional parameters");
273  parser.addArgument(
274  "probe", "p", mitkCommandLineParser::File,
275  "xml probe file (file)", "file to the definition of the used probe (*.xml)",
276  us::Any(), true, false, false, mitkCommandLineParser::Output);
277  parser.addArgument(
278  "verbose", "v", mitkCommandLineParser::Bool,
279  "Verbose Output", "Whether to produce verbose, or rather debug output");
280  parser.addArgument(
281  "identifyer", "i", mitkCommandLineParser::String,
282  "Generator identifyer (string)", "A unique identifyer for the calculation instance");
283 
284  InputParameters input;
285 
286  std::map<std::string, us::Any> parsedArgs = parser.parseArguments(argc, argv);
287  if (parsedArgs.size() == 0)
288  exit(-1);
289 
290  if (parsedArgs.count("verbose"))
291  {
292  MITK_INFO << "verbose";
293  input.verbose = us::any_cast<bool>(parsedArgs["verbose"]);
294  }
295  else
296  {
297  input.verbose = false;
298  }
299 
300  if (parsedArgs.count("savePath"))
301  {
302  MITK_INFO << "savePath";
303  input.saveFolderPath = us::any_cast<std::string>(parsedArgs["savePath"]);
304  }
305 
306  if (parsedArgs.count("mitkMcxyz"))
307  {
308  MITK_INFO << "mitkMcxyz";
309  input.exePath = us::any_cast<std::string>(parsedArgs["mitkMcxyz"]);
310  }
311 
312  if (parsedArgs.count("probe"))
313  {
314  MITK_INFO << "probe";
315  input.probePath = us::any_cast<std::string>(parsedArgs["probe"]);
316  }
317 
318  if (parsedArgs.count("identifyer"))
319  {
320  MITK_INFO << "identifyer";
321  input.identifyer = us::any_cast<std::string>(parsedArgs["identifyer"]);
322  }
323  else
324  {
325  MITK_INFO << "generating identifyer";
326  auto uid = mitk::UIDGenerator("", 8);
327  input.identifyer = uid.GetUID();
328  }
329  MITK_INFO << "Paring arguments...[Done]";
330  return input;
331 }
332 
333 int main(int argc, char * argv[])
334 {
335  auto input = parseInput(argc, argv);
336  unsigned int iterationNumber = 0;
337 
338  while (true)
339  {
340  auto parameters = CreateBaselineHB_13_02_18_Parameters();
341  MITK_INFO(input.verbose) << "Generating tissue..";
342  auto resultTissue = InSilicoTissueGenerator::GenerateInSilicoData(parameters);
343  MITK_INFO(input.verbose) << "Generating tissue..[Done]";
344 
345  auto inputfolder = std::string(input.saveFolderPath + "input/");
346  auto outputfolder = std::string(input.saveFolderPath + "output/");
347  if (!itksys::SystemTools::FileIsDirectory(inputfolder))
348  {
349  itksys::SystemTools::MakeDirectory(inputfolder);
350  }
351  if (!itksys::SystemTools::FileIsDirectory(outputfolder))
352  {
353  itksys::SystemTools::MakeDirectory(outputfolder);
354  }
355 
356  std::string savePath = input.saveFolderPath + "input/BaselineHB_" + input.identifyer +
357  "_" + std::to_string(iterationNumber) + ".nrrd";
358  mitk::IOUtil::Save(resultTissue->ConvertToMitkImage(), savePath);
359  std::string outputPath = input.saveFolderPath + "output/BaselineHB_" + input.identifyer +
360  "_" + std::to_string(iterationNumber) + "/";
361 
362  if (!itksys::SystemTools::FileIsDirectory(outputPath))
363  {
364  itksys::SystemTools::MakeDirectory(outputPath);
365  }
366 
367  outputPath = outputPath + "Fluence_BaselineHB_" + input.identifyer + "_" + std::to_string(iterationNumber);
368 
369  MITK_INFO(input.verbose) << "Simulating fluence..";
370  for(double yo = -1.8; yo <= 1.81; yo=yo+0.12)
371  {
372  std::string yo_string = std::to_string(round(yo*100)/100.0);
373  int result = -4;
374  if(!input.probePath.empty())
375  result = std::system(std::string(input.exePath + " -i " + savePath + " -o " +
376  (outputPath + "_yo" + yo_string + ".nrrd") +
377  " -yo " + yo_string + " -p " + input.probePath +
378  " -n 100000000").c_str());
379  else
380  result = std::system(std::string(input.exePath + " -i " + savePath + " -o " +
381  (outputPath + "_yo" + yo_string + ".nrrd") +
382  " -yo " + yo_string + " -n 100000000").c_str());
383  MITK_INFO << "yo: " << yo_string << ": " << result;
384  }
385 
386  MITK_INFO(input.verbose) << "Simulating fluence..[Done]";
387 
388  iterationNumber++;
389  }
390 }
void CalculateNewRandomlyDivergingDirectionVector(Vector::Pointer direction, double bendingFactor, std::mt19937 *rng)
CalculateRandomlyDivergingPosition calculates the new position by modifying the direction vector rand...
Generated unique IDs.
#define MITK_INFO
Definition: mitkLogMacros.h:18
void setContributor(std::string contributor)
ValueType * any_cast(Any *operand)
Definition: usAny.h:377
TissueGeneratorParameters::Pointer CreateMultiHB_13_02_18_Parameters()
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)
static InSilicoTissueVolume::Pointer GenerateInSilicoData(TissueGeneratorParameters::Pointer parameters)
GenerateInSilicoData This method will return a InSilicoTissueVolume created in terms of the given par...
TissueGeneratorParameters::Pointer CreateMultivessel_19_12_17_Parameters()
bool verbose(false)
Definition: usAny.h:163
TissueGeneratorParameters::Pointer CreateSinglevessel_19_10_17_Parameters()
void setCategory(std::string category)
int main(int argc, char *argv[])
void setArgumentPrefix(const std::string &longPrefix, const std::string &shortPrefix)
TissueGeneratorParameters::Pointer CreateSingleVesselHeterogeneousBackground_08_02_18_Parameters()
InputParameters parseInput(int argc, char *argv[])
static void Save(const mitk::BaseData *data, const std::string &path, bool setPathProperty=false)
Save a mitk::BaseData instance.
Definition: mitkIOUtil.cpp:774
TissueGeneratorParameters::Pointer CreateBaselineHB_13_02_18_Parameters()
void setTitle(std::string title)
void setDescription(std::string description)
TissueGeneratorParameters::Pointer CreateMultivessel_19_10_17_Parameters()
void beginGroup(const std::string &description)