ObservationIO.cpp
Go to the documentation of this file.
1 // (C) Copyright Renaud Detry 2007-2015.
2 // Distributed under the GNU General Public License and under the
3 // BSD 3-Clause License (See accompanying file LICENSE.txt).
4 
5 /** @file */
6 
7 #include <nuklei/ObservationIO.h>
21 
22 namespace nuklei {
23 
24  ObservationReader::~ObservationReader()
25  {
26  if (!oc.empty())
27  NUKLEI_LOG("Input stats for reader `" << oc.type_ << "':\n " << oc);
28  }
29 
30  NUKLEI_UNIQUE_PTR<Observation> ObservationReader::readObservation()
31  {
32  NUKLEI_TRACE_BEGIN();
33  for (;;)
34  {
35  NUKLEI_UNIQUE_PTR<Observation> observation = readObservation_();
36  if (observation.get() == NULL) return observation;
37  oc.incLabel("input");
38  if (roi_ && !roi_->contains(observation->getKernel()->getLoc()))
39  continue;
40  oc.incLabel("inROI");
41  return observation;
42  }
43  NUKLEI_TRACE_END();
44  }
45 
46  NUKLEI_UNIQUE_PTR<KernelCollection> ObservationReader::readObservations()
47  {
48  NUKLEI_TRACE_BEGIN();
49  NUKLEI_UNIQUE_PTR<KernelCollection> kcp(new KernelCollection);
50  readObservations(*kcp);
51  return kcp;
52  NUKLEI_TRACE_END();
53  }
54 
55  void ObservationReader::readObservations(KernelCollection &kc)
56  {
57  NUKLEI_TRACE_BEGIN();
58  kc.clear();
59 
60  NUKLEI_UNIQUE_PTR<Observation> o;
61  while ( (o = readObservation()).get() != NULL )
62  {
63  kc.add(*o->getKernel());
64  }
65 
66  NUKLEI_TRACE_END();
67  }
68 
69 
70  std::ostream& operator<<(std::ostream &out, const ObservationReader::Counter &c)
71  {
72  NUKLEI_TRACE_BEGIN();
73  typedef ObservationReader::Counter Counter;
74  for (Counter::list_t::const_iterator i = c.labels_.begin();
75  i != c.labels_.end(); ++i)
76  {
77  out << *i << ": " << c.counts_.find(*i)->second << "; ";
78  }
79  return out;
80  NUKLEI_TRACE_END();
81  }
82 
83  void ObservationReader::Counter::incLabel(const std::string &label)
84  {
85  NUKLEI_TRACE_BEGIN();
86  map_t::iterator i;
87  if (counts_.count(label) == 0)
88  {
89  labels_.push_back(label);
90  i = counts_.insert(std::make_pair(label, unsigned(0))).first;
91  }
92  else i = counts_.find(label);
93  ++(i->second);
94  NUKLEI_TRACE_END();
95  }
96 
97  bool ObservationReader::Counter::empty() const
98  {
99  NUKLEI_TRACE_BEGIN();
100  return labels_.empty();
101  NUKLEI_TRACE_END();
102  }
103 
104  void ObservationReader::addRegionOfInterest(boost::shared_ptr<RegionOfInterest> roi)
105  {
106  NUKLEI_TRACE_BEGIN();
107  if (roi_)
108  roi_->enqueue(roi);
109  else
110  roi_ = roi;
111  NUKLEI_TRACE_END();
112  }
113 
114  NUKLEI_UNIQUE_PTR<ObservationReader>
115  ObservationReader::createReader(const std::string& arg)
116  {
117  NUKLEI_TRACE_BEGIN();
118  NUKLEI_UNIQUE_PTR<ObservationReader> reader;
119 
120  std::string errorsCat = std::string("Error in ObservationReader::createReader.") +
121  "\nErrors at each format attempt were:";
122 
123 #ifdef NUKLEI_USE_TICPP
124  try {
125  reader = createReader(arg, Observation::COVIS3D);
126  return reader;
127  } catch (ObservationIOError &e) {
128  errorsCat += "\n" + std::string(e.what());
129  }
130 #endif
131 
132  try {
133  reader = createReader(arg, Observation::NUKLEI);
134  return reader;
135  } catch (ObservationIOError &e) {
136  errorsCat += "\n" + std::string(e.what());
137  }
138 
139 #ifdef NUKLEI_USE_TICPP
140  try {
141  reader = createReader(arg, Observation::IIS);
142  return reader;
143  } catch (ObservationIOError &e) {
144  errorsCat += "\n" + std::string(e.what());
145  }
146 #endif
147 
148  try {
149  reader = createReader(arg, Observation::OSUTXT);
150  return reader;
151  } catch (ObservationIOError &e) {
152  errorsCat += "\n" + std::string(e.what());
153  }
154 
155  try {
156  reader = createReader(arg, Observation::PCD);
157  return reader;
158  } catch (ObservationIOError &e) {
159  errorsCat += "\n" + std::string(e.what());
160  }
161 
162  try {
163  reader = createReader(arg, Observation::PLY);
164  return reader;
165  } catch (ObservationIOError &e) {
166  errorsCat += "\n" + std::string(e.what());
167  }
168 
169  try {
170  reader = createReader(arg, Observation::RIF);
171  return reader;
172  } catch (ObservationIOError &e) {
173  errorsCat += "\n" + std::string(e.what());
174  }
175 
176  try {
177  reader = createReader(arg, Observation::SERIAL);
178  return reader;
179  } catch (ObservationIOError &e) {
180  errorsCat += "\n" + std::string(e.what());
181  }
182 
183  try {
184  reader = createReader(arg, Observation::CRD);
185  return reader;
186  } catch (ObservationIOError &e) {
187  errorsCat += "\n" + std::string(e.what());
188  }
189 
190  try {
191  reader = createReader(arg, Observation::OFF);
192  return reader;
193  } catch (ObservationIOError &e) {
194  errorsCat += "\n" + std::string(e.what());
195  }
196 
197  try {
198  reader = createReader(arg, Observation::BUILTINVTK);
199  return reader;
200  } catch (ObservationIOError &e) {
201  errorsCat += "\n" + std::string(e.what());
202  }
203 
204  try {
205  reader = createReader(arg, Observation::TXT);
206  return reader;
207  } catch (ObservationIOError &e) {
208  errorsCat += "\n" + std::string(e.what());
209  }
210 
211  throw ObservationIOError
212  ("Error loading observations with automatic type detection. "
213  "Maybe the filename `" + arg + "' is incorrect. "
214  "Else please try again with a defined type.");
215  return reader;
216  NUKLEI_TRACE_END();
217  }
218 
219  NUKLEI_UNIQUE_PTR<ObservationReader>
220  ObservationReader::createReader(const std::string& arg, const Observation::Type t)
221  {
222  NUKLEI_TRACE_BEGIN();
223  NUKLEI_UNIQUE_PTR<ObservationReader> reader;
224  switch (t)
225  {
226  case Observation::COVIS3D:
227  {
228  reader.reset(new CoViS3DReader(arg));
229  break;
230  }
231  case Observation::NUKLEI:
232  {
233  reader.reset(new NukleiReader(arg));
234  break;
235  }
236  case Observation::OSUTXT:
237  {
238  reader.reset(new OsuTxtReader(arg));
239  break;
240  }
241  case Observation::PCD:
242  {
243  reader.reset(new PCDReader(arg));
244  break;
245  }
246  case Observation::PLY:
247  {
248  reader.reset(new PLYReader(arg));
249  break;
250  }
251  case Observation::RIF:
252  {
253  reader.reset(new RIFReader(arg));
254  break;
255  }
256  case Observation::CRD:
257  {
258  reader.reset(new CrdReader(arg));
259  break;
260  }
261  case Observation::OFF:
262  {
263  reader.reset(new OffReader(arg));
264  break;
265  }
266  case Observation::SERIAL:
267  {
268  reader.reset(new KernelReader(arg));
269  break;
270  }
271  case Observation::BUILTINVTK:
272  {
273  reader.reset(new BuiltinVTKReader(arg));
274  break;
275  }
276  case Observation::TXT:
277  {
278  reader.reset(new TxtReader(arg));
279  break;
280  }
281  case Observation::IIS:
282  {
283  reader.reset(new IisReader(arg));
284  break;
285  }
286  default:
287  {
288  NUKLEI_THROW("Unknown format.");
289  break;
290  }
291  }
292  reader->init();
293  return reader;
294  NUKLEI_TRACE_END();
295  }
296 
297 
298  ObservationWriter::~ObservationWriter()
299  {
300  }
301 
302  void ObservationWriter::writeObservations(const KernelCollection &kc)
303  {
304  NUKLEI_TRACE_BEGIN();
305 
306  NUKLEI_UNIQUE_PTR<Observation> o = templateObservation();
307  for (KernelCollection::const_iterator i = kc.begin(); i != kc.end(); ++i)
308  {
309  o->setKernel(*i);
310  writeObservation(*o);
311  }
312 
313  NUKLEI_TRACE_END();
314  }
315 
316  NUKLEI_UNIQUE_PTR<ObservationWriter>
317  ObservationWriter::createWriter(const std::string& arg, const Observation::Type t)
318  {
319  NUKLEI_TRACE_BEGIN();
320  NUKLEI_UNIQUE_PTR<ObservationWriter> writer;
321  switch (t)
322  {
323  case Observation::COVIS3D:
324  {
325  writer.reset(new CoViS3DXMLWriter(arg));
326  break;
327  }
328  case Observation::NUKLEI:
329  {
330  writer.reset(new NukleiWriter(arg));
331  break;
332  }
333  case Observation::OSUTXT:
334  {
335  NUKLEI_THROW("Not implemented.");
336  //writer.reset(new OsuTxtWriter(arg));
337  break;
338  }
339  case Observation::PCD:
340  {
341  writer.reset(new PCDWriter(arg));
342  break;
343  }
344  case Observation::PLY:
345  {
346  writer.reset(new PLYWriter(arg));
347  break;
348  }
349  case Observation::RIF:
350  {
351  NUKLEI_THROW("Not implemented.");
352  //writer.reset(new OsuTxtWriter(arg));
353  break;
354  }
355  case Observation::CRD:
356  {
357  writer.reset(new CrdWriter(arg));
358  break;
359  }
360  case Observation::OFF:
361  {
362  writer.reset(new OffWriter(arg));
363  break;
364  }
365  case Observation::SERIAL:
366  {
367  writer.reset(new KernelWriter(arg));
368  break;
369  }
370  case Observation::BUILTINVTK:
371  {
372  NUKLEI_THROW("Not implemented.");
373  //writer.reset(new OsuTxtWriter(arg));
374  break;
375  }
376  case Observation::TXT:
377  {
378  writer.reset(new TxtWriter(arg));
379  break;
380  }
381  case Observation::IIS:
382  {
383  writer.reset(new IisWriter(arg));
384  break;
385  }
386  default:
387  {
388  NUKLEI_THROW("Unknown format.");
389  break;
390  }
391  }
392  writer->init();
393  return writer;
394  NUKLEI_TRACE_END();
395  }
396 
397  void readObservations(ObservationReader &r, KernelCollection &kc)
398  {
399  r.readObservations(kc);
400  }
401 
402  void readObservations(const std::string &s, KernelCollection &kc)
403  {
404  Observation::Type t;
405  readObservations(s, kc, t);
406  }
407 
408  void readObservations(const std::string &s, KernelCollection &kc,
409  Observation::Type& t)
410  {
411  NUKLEI_UNIQUE_PTR<ObservationReader> reader =
412  ObservationReader::createReader(s);
413  t = reader->type();
414  readObservations(*reader, kc);
415  }
416 
417  void readObservationsWithSpecificFormat(const std::string &s,
418  KernelCollection &kc,
419  const Observation::Type& t)
420  {
421  NUKLEI_UNIQUE_PTR<ObservationReader> reader =
422  ObservationReader::createReader(s, t);
423  readObservations(*reader, kc);
424  }
425 
426 
428  {
429  Observation::Type t;
430  return readSingleObservation(s, t);
431  }
432 
434  Observation::Type& t)
435  {
436  KernelCollection kc;
437  readObservations(s, kc, t);
438  if (kc.size() != 1)
439  NUKLEI_THROW("File `" << s << "' does not contain a single observation.");
440  return kc.front().clone();
441  }
442 
445  const Observation::Type& t)
446  {
447  KernelCollection kc;
449  if (kc.size() != 1)
450  NUKLEI_THROW("File `" << s << "' does not contain a single observation.");
451  return kc.front().clone();
452  }
453 
455  {
456  w.writeObservations(kc);
457  }
458 
459  void writeObservations(const std::string &s, const KernelCollection &kc,
460  const Observation::Type &t)
461  {
462  NUKLEI_UNIQUE_PTR<ObservationWriter> writer =
463  ObservationWriter::createWriter(s, t);
464  nuklei::writeObservations(*writer, kc);
465  writer->writeBuffer();
466  }
467 
468  void writeSingleObservation(const std::string &s, const kernel::base &k,
469  const Observation::Type &t)
470  {
471  KernelCollection kc;
472  kc.add(k);
473  writeObservations(s, kc, t);
474  }
475 
476 }
void add(const kernel::base &f)
Adds a copy of f.
Public namespace.
Definition: Color.cpp:9
Container::const_iterator const_iterator
KernelCollection iterator.
void writeObservations(ObservationWriter &w, const KernelCollection &kc)
Writes the content of kc using the provided writer w.
This class acts as a vector-like container for kernels. It also provides methods related to kernel de...
kernel::base::ptr readSingleObservationWithSpecificFormat(const std::string &s, const Observation::Type &t)
Reads a single observation from file s (no automatic type detection), and returns it.
Polymorphic kernel class.
Definition: Kernel.h:45
Container::reference front()
Returns the kernel at index 0.
NUKLEI_UNIQUE_PTR< kernel::base > ptr
NUKLEI_UNIQUE_PTR for kernel::base.
Definition: Kernel.h:50
Base class for kernel reader and point reader classes.
Definition: ObservationIO.h:34
Container::size_type size() const
Returns the number of kernels.
kernel::base::ptr readSingleObservation(const std::string &s)
Reads a single observation from file s (with automatic type detection), and returns it.
void readObservationsWithSpecificFormat(const std::string &s, KernelCollection &kc, const Observation::Type &t)
Reads the file s (no automatic type detection) and stores the read data into kc.
Base class for kernel writer and point writer classes.
void writeSingleObservation(const std::string &s, const kernel::base &k, const Observation::Type &t=Observation::NUKLEI)
Writes k to file s, using file format t.
#define NUKLEI_THROW(x)
Throws an Error.
Definition: Common.h:94
© Copyright 2007-2013 Renaud Detry.
Distributed under the terms of the GNU General Public License (GPL).
(See accompanying file LICENSE.txt or copy at http://www.gnu.org/copyleft/gpl.html.)
Revised Sun Sep 13 2020 19:10:06.