Tomato
TomatoOptions.hxx
Go to the documentation of this file.
1 
7 #ifndef Tomato_TomatoOPTIONS_HXX
8 #define Tomato_TomatoOPTIONS_HXX
9 
10 #include "TomatoParser.h"
11 
12 #include "KWUtil.h"
13 #include "KWUtilYaml.h"
14 
15 #define YAML_BUFFER_SIZE 65536
16 
17 namespace Ox {
18 
22  template< typename MeasureType >
25  init();
26  }
27 
28  template< typename MeasureType >
30  ::TomatoOptions(const std::string& filePath) {
31 #ifndef USE_YAML
32  throw std::runtime_error("Yaml parser not available");
33 #else
34  init();
35 
36  Ox::TomatoParser<MeasureType> parser;
37  parser._filePath = filePath;
38  parser._sequences["files_magnitude"];
39  parser._sequences["files_phase"];
40  parser._scalars["dir_magnitude"];
41  parser._scalars["dir_phase"];
42  parser._scalars["dir_output_map"];
43  parser._scalars["dir_output_fitparams"];
44  parser._scalars["dir_output_magSignRecov"];
45 
46  parser._scalars["parameter_to_map"];
47  parser._scalars["fitting_method"];
48  parser._scalars["model_type"];
49  parser._scalars["sign_calc_method"];
50  parser._scalars["start_point_calc_method"];
51 
52  parser._scalars["fTolerance"];
53  parser._scalars["max_function_evals"];
54  parser._scalars["use_gradient"];
55 
56  parser._sequences["inversion_times"];
57  parser._sequences["echo_times"];
58  parser._sequences["start_point"];
59  parser._sequences["noise"];
60 
61  parser._scalars["mean_cut_off"];
62  parser._scalars["map_scale_factor"];
63  parser._scalars["use_colorbar"];
64  parser._scalars["number_of_threads"];
65 
66  parser._scalars["output_map_series_instance_uid"];
67  parser._scalars["output_fitparams_series_instance_uid"];
68  parser._scalars["output_magSignRecov_series_instance_uid"];
69  parser._scalars["output_map_series_number"];
70  parser._scalars["output_fitparams_series_number"];
71  parser._scalars["output_magSignRecov_series_number"];
72 
73  parser.parse();
74 
75  // input
76  files_magnitude = parser._sequences["files_magnitude"];
77  files_phase = parser._sequences["files_phase"];
78  dir_magnitude = parser._scalars["dir_magnitude"];
79  dir_phase = parser._scalars["dir_phase"];
80 
81  // output
82  dir_output_map = parser._scalars["dir_output_map"];
83  dir_output_fitparams = parser._scalars["dir_output_fitparams"];
84  dir_output_magSignRecov = parser._scalars["dir_output_magSignRecov"];
85 
86  output_map_series_instance_uid = parser._scalars["output_map_series_instance_uid"];
87  output_fitparams_series_instance_uid = parser._scalars["output_fitparams_series_instance_uid"];
88  output_magSignRecov_series_instance_uid = parser._scalars["output_magSignRecov_series_instance_uid"];
89  if (!parser._scalars["output_map_series_number"].empty())
90  output_map_series_number = KWUtil::StringToNumber<MeasureType>(parser._scalars["output_map_series_number"]);
91  if (!parser._scalars["output_fitparams_series_number"].empty())
92  output_fitparams_series_number = KWUtil::StringToNumber<MeasureType>(parser._scalars["output_fitparams_series_number"]);
93  if (!parser._scalars["output_magSignRecov_series_number"].empty())
94  output_magSignRecov_series_number = KWUtil::StringToNumber<MeasureType>(parser._scalars["output_magSignRecov_series_number"]);
95 
96  // calc options
97  if (!parser._scalars["parameter_to_map"].empty())
98  parameter_to_map = (calculatorsType_t) findInArray(lastCalculatorType+1, calculatorsTypeNames, parser._scalars["parameter_to_map"]);
99  parameter_type = (paramType_t)calculatorsParamsToCalculate[(int)parameter_to_map];
100  if (!parser._scalars["fitting_method"].empty())
101  fitting_method = (fittersType_t) findInArray(lastFitterType+1, fittersTypeNames, parser._scalars["fitting_method"]);
102  if (!parser._scalars["model_type"].empty())
103  model_type = (modelType_t) findInArray(lastFunctorType + 1, modelTypeNames, parser._scalars["model_type"]);
104  if (!parser._scalars["sign_calc_method"].empty())
105  sign_calc_method = (signCalculatorsType_t) findInArray(lastSignCalculatorType+1, signCalculatorsTypeNames, parser._scalars["sign_calc_method"]);
106  if (!parser._scalars["start_point_calc_method"].empty())
107  start_point_calc_method = (startPointCalculatorsType_t) findInArray(lastStartPointCalculatorType+1, startPointCalculatorsTypeNames, parser._scalars["start_point_calc_method"]);
108 
109  if (!parser._scalars["fTolerance"].empty())
110  fTolerance = KWUtil::StringToNumber<MeasureType>(parser._scalars["fTolerance"]);
111  if (!parser._scalars["max_function_evals"].empty())
112  max_function_evals = KWUtil::StringToNumber<MeasureType>(parser._scalars["max_function_evals"]);
113  if (!parser._scalars["use_gradient"].empty())
114  use_gradient = (bool)KWUtil::StringToNumber<MeasureType>(parser._scalars["use_gradient"]);
115 
116  copyStrVectorToMemberVector(parser._sequences["inversion_times"], inversion_times);
117  copyStrVectorToMemberVector(parser._sequences["echo_times"], echo_times);
118  copyStrVectorToMemberVector(parser._sequences["start_point"], start_point);
119  copyStrVectorToMemberVector(parser._sequences["noise"], noise);
120 
121  if (!parser._scalars["mean_cut_off"].empty())
122  mean_cut_off = KWUtil::StringToNumber<MeasureType>(parser._scalars["mean_cut_off"]);
123  if (!parser._scalars["map_scale_factor"].empty())
124  map_scale_factor = KWUtil::StringToNumber<MeasureType>(parser._scalars["map_scale_factor"]);
125  if (!parser._scalars["use_colorbar"].empty())
126  use_colorbar = KWUtil::StringToNumber<MeasureType>(parser._scalars["use_colorbar"]);
127  if (!parser._scalars["number_of_threads"].empty())
128  number_of_threads = KWUtil::StringToNumber<MeasureType>(parser._scalars["number_of_threads"]);
129 #endif
130  }
131 
132  template< typename MeasureType >
135  }
136 
137  template< typename MeasureType >
138  int
140  ::findInArray(int size, const char *nameArray[], std::string name){
141  for (int i = 0; i < size; ++i){
142  std::string nameFromArray(nameArray[i]);
143  if (nameFromArray.compare(name) == 0){
144  return i;
145  }
146  }
147  std::string errorMessage = "Option \"" + name + "\" not found";
148  throw std::runtime_error(errorMessage);
149  }
150 
151  template< typename MeasureType >
152  void
154  ::copyStrVectorToMemberVector(std::vector<std::string> strVector, std::vector<MeasureType> &memberVector) {
155 
156  for (unsigned int i = 0; i < strVector.size(); ++i) {
157  memberVector.push_back(KWUtil::StringToNumber<MeasureType>(strVector[i]));
158  }
159  }
160 
161  template< typename MeasureType >
162  void
165  printf("\n");
166  printf("#############################################\n");
167  printf(" TOMATO %d.%d.%d CURRENTLY SELECTED options: \n", Tomato_VERSION_MAJOR, Tomato_VERSION_MINOR, Tomato_VERSION_PATCH);
168  printf("#############################################\n");
169  KWUtil::printVectorNewline(" files_magnitude: ", files_magnitude);
170  KWUtil::printVectorNewline(" files_phase: ", files_phase);
171  KWUtil::printVector(" signal_magnitude: ", signal_magnitude);
172  KWUtil::printVector(" signal_phase: ", signal_phase);
173  printf( " dir_magnitude: %s ", dir_magnitude.c_str());
174  printf("\n dir_phase: %s ", dir_phase.c_str());
175  printf("\n dir_output_map: %s ", dir_output_map.c_str());
176  printf("\n dir_output_fitparams: %s ", dir_output_fitparams.c_str());
177  printf("\n dir_output_magSignRecov: %s ", dir_output_magSignRecov.c_str());
178  printf("\n output_map_series_instance_uid: %s ", output_map_series_instance_uid.c_str());
179  printf("\n output_fitparams_series_instance_uid: %s ", output_fitparams_series_instance_uid.c_str());
180  printf("\n output_magSignRecov_series_instance_uid: %s ", output_magSignRecov_series_instance_uid.c_str());
181  printf("\n output_map_series_number: %d ", output_map_series_number);
182  printf("\n output_fitparams_series_number: %d ", output_fitparams_series_number);
183  printf("\n output_magSignRecov_series_number: %d ", output_magSignRecov_series_number);
184  printf("\n");
185  printf("\n");
186  Ox::FactoryOfCalculators<double>::disp(parameter_to_map);
187  Ox::FactoryOfFitters<double>::disp(fitting_method);
190  Ox::FactoryOfStartPointCalculators<double>::disp(start_point_calc_method);
191  printf("\n fTolerance: %.2e", fTolerance);
192  //printf("xTolerance: %.2e ", xTolerance);
193  printf("\n max_function_evals: %d", max_function_evals);
194  printf("\n use_gradient: %s", use_gradient ? "1" : "0");
195  printf("\n");
196  KWUtil::printVector(" inversion_times: ", inversion_times);
197  KWUtil::printVector(" echo_times: ", echo_times);
198  KWUtil::printVector(" start_point: ", start_point);
199  KWUtil::printVector(" noise: ", noise);
200  printf("\n mean_cut_off: %.2f", mean_cut_off);
201  printf("\n map_scale_factor: %.2f", map_scale_factor);
202  printf("\n use_colorbar: %s", use_colorbar ? "1" : "0");
203  //printf("fittingCutOff: %.2f ", fittingCutOff);
204  printf("\n number_of_threads: %d", number_of_threads);
205  if (calculation_time > 0) {
206  printf("\n calculation time: %.2fs", calculation_time);
207  }
208 
209  printf("\n\n");
210  }
211 
212  template< typename MeasureType >
213  int
216 #ifndef USE_YAML
217  throw std::runtime_error("Yaml parser not available");
218 #else
219  if (dir_output_map.length() > 0){
220  std::string filePath = dir_output_map + KWUtil::PathSeparator() + "tomato_output_config.yaml";
221  exportToYaml(filePath);
222  }
223 
224  if (dir_output_fitparams.length() > 0){
225  std::string filePath = dir_output_fitparams + KWUtil::PathSeparator() + "tomato_output_config.yaml";
226  exportToYaml(filePath);
227  }
228 
229  if (dir_output_magSignRecov.length() > 0){
230  std::string filePath = dir_output_magSignRecov + KWUtil::PathSeparator() + "tomato_output_config.yaml";
231  exportToYaml(filePath);
232  }
233 
234  return 0; // EXIT_SUCCESS
235 #endif
236  }
237 
238  template< typename MeasureType >
239  int
241  ::exportToYaml(std::string filePath){
242 #ifndef USE_YAML
243  throw std::runtime_error("Yaml parser not available");
244 #else
245  yaml_document_t document;
246  yaml_emitter_t emitter;
247  size_t written = 0;
248 
249  yaml_document_initialize(&document, NULL, NULL, NULL, 1, 1);
250 
251  yaml_document_add_mapping(&document, (yaml_char_t*)YAML_DEFAULT_MAPPING_TAG, YAML_ANY_MAPPING_STYLE);
252  int mapping_node_number = (int)(document.nodes.top - document.nodes.start);
253 
254  KWUtilYaml::addSequence(&document, mapping_node_number, "files_magnitude", files_magnitude);
255  KWUtilYaml::addSequence(&document, mapping_node_number, "files_phase", files_phase);
256  KWUtilYaml::addMapping(&document, mapping_node_number, "dir_magnitude", dir_magnitude);
257  KWUtilYaml::addMapping(&document, mapping_node_number, "dir_phase", dir_phase);
258  KWUtilYaml::addMapping(&document, mapping_node_number, "dir_output_map", dir_output_map);
259  KWUtilYaml::addMapping(&document, mapping_node_number, "dir_output_fitparams", dir_output_fitparams);
260  KWUtilYaml::addMapping(&document, mapping_node_number, "dir_output_magSignRecov", dir_output_magSignRecov);
261  KWUtilYaml::addMapping(&document, mapping_node_number, "output_map_series_instance_uid", output_map_series_instance_uid);
262  KWUtilYaml::addMapping(&document, mapping_node_number, "output_fitparams_series_instance_uid", output_fitparams_series_instance_uid);
263  KWUtilYaml::addMapping(&document, mapping_node_number, "output_magSignRecov_series_instance_uid", output_magSignRecov_series_instance_uid);
264  KWUtilYaml::addMapping(&document, mapping_node_number, "output_map_series_number", KWUtil::NumberToString(output_map_series_number));
265  KWUtilYaml::addMapping(&document, mapping_node_number, "output_fitparams_series_number", KWUtil::NumberToString(output_fitparams_series_number));
266  KWUtilYaml::addMapping(&document, mapping_node_number, "output_magSignRecov_series_number", KWUtil::NumberToString(output_magSignRecov_series_number));
267 
268  KWUtilYaml::addMapping(&document, mapping_node_number, "parameter_to_map", calculatorsTypeNames[parameter_to_map]);
269  KWUtilYaml::addMapping(&document, mapping_node_number, "fitting_method", fittersTypeNames[fitting_method]);
270  KWUtilYaml::addMapping(&document, mapping_node_number, "model_type", modelTypeNames[model_type]);
271  KWUtilYaml::addMapping(&document, mapping_node_number, "sign_calc_method" , signCalculatorsTypeNames[sign_calc_method]);
272  KWUtilYaml::addMapping(&document, mapping_node_number, "start_point_calc_method", startPointCalculatorsTypeNames[start_point_calc_method]);
273 
274  KWUtilYaml::addMapping(&document, mapping_node_number, "fTolerance", KWUtil::NumberToString(fTolerance));
275  KWUtilYaml::addMapping(&document, mapping_node_number, "max_function_evals", KWUtil::NumberToString(max_function_evals));
276  KWUtilYaml::addMapping(&document, mapping_node_number, "use_gradient", use_gradient ? "1" : "0");
277 
278  KWUtilYaml::addSequenceOfNumbers(&document, mapping_node_number, "inversion_times", inversion_times);
279  KWUtilYaml::addSequenceOfNumbers(&document, mapping_node_number, "echo_times", echo_times);
280  KWUtilYaml::addSequenceOfNumbers(&document, mapping_node_number, "start_point", start_point);
281  KWUtilYaml::addSequenceOfNumbers(&document, mapping_node_number, "noise", noise);
282 
283  KWUtilYaml::addMapping(&document, mapping_node_number, "mean_cut_off", KWUtil::NumberToString(mean_cut_off));
284  KWUtilYaml::addMapping(&document, mapping_node_number, "map_scale_factor", KWUtil::NumberToString(map_scale_factor));
285  KWUtilYaml::addMapping(&document, mapping_node_number, "use_colorbar", use_colorbar ? "1" : "0");
286  KWUtilYaml::addMapping(&document, mapping_node_number, "number_of_threads", KWUtil::NumberToString(number_of_threads));
287  KWUtilYaml::addMapping(&document, mapping_node_number, "calculation_time", KWUtil::NumberToString(calculation_time));
288 
289  std::string tomato_version = "v" + KWUtil::NumberToString(Tomato_VERSION_MAJOR) + "." + KWUtil::NumberToString(Tomato_VERSION_MINOR);
290  KWUtilYaml::addMapping(&document, mapping_node_number, "tomato_version", tomato_version);
291 
292  unsigned char buffer[YAML_BUFFER_SIZE+1];
293  memset(buffer, 0, YAML_BUFFER_SIZE+1);
294 
295  yaml_emitter_initialize(&emitter);
296  yaml_emitter_set_output_string(&emitter, buffer, YAML_BUFFER_SIZE, &written);
297  yaml_emitter_open(&emitter);
298  yaml_emitter_dump(&emitter, &document);
299  yaml_emitter_flush(&emitter);
300  yaml_emitter_close(&emitter);
301 
302  FILE *file = fopen(filePath.c_str(), "wb");
303  fprintf(file, "%s", buffer);
304  fclose(file);
305 
306  return 0; // EXIT_SUCCESS
307 #endif
308  }
309 
310 } // namespace Ox
311 
312 #undef YAML_BUFFER_SIZE
313 
314 #endif //Tomato_TomatoOPTIONS_HXX
Definition: OxFactoryOfSignCalculators.h:43
Definition: OxFactoryOfModels.h:60
void printCurrent()
Definition: TomatoOptions.hxx:164
static void printVectorNewline(const std::string &name, const std::vector< TYPE > vector)
Definition: KWUtil.hxx:44
Definition: OxFactoryOfCalculators.h:76
int exportToYaml()
Definition: TomatoOptions.hxx:215
Definition: OxFactoryOfStartPointCalculators.h:40
Definition: OxFactoryOfFitters.h:73
int findInArray(int size, const char *nameArray[], std::string name)
Definition: TomatoOptions.hxx:140
static void printVector(const std::string &name, const std::vector< TYPE > vector)
Definition: KWUtil.hxx:35
Definition: OxFactoryOfCalculators.h:17
TomatoOptions()
Definition: TomatoOptions.hxx:24
Definition: OxCalculator.h:19
~TomatoOptions()
Definition: TomatoOptions.hxx:134