61 std::string
dbg (
const SampleHandler& obj,
unsigned verbosity)
64 result <<
"SampleHandler with " << obj.size() <<
" files";
65 if (verbosity % 10 > 0)
69 end = obj.end(); sample != end; ++ sample)
71 result <<
dbg (**sample, verbosity / 10) <<
"\n";
79 void swap (SampleHandler&
a, SampleHandler& b)
81 swap (
a.m_samples, b.m_samples);
82 swap (
a.m_named, b.m_named);
88 testInvariant ()
const
104 SampleHandler (
const SampleHandler& that)
105 : TObject (that), m_samples (that.m_samples), m_named (that.m_named)
120 SampleHandler& SampleHandler ::
121 operator = (
const SampleHandler& that)
124 SampleHandler tmp (that);
131 void SampleHandler ::
134 SamplePtr mysample (sample);
144 void SampleHandler ::
145 add (std::unique_ptr<Sample> sample)
148 add (SamplePtr (std::move (sample)));
153 void SampleHandler ::
154 add (SamplePtr& sample)
160 if (!sample->name().empty() && m_named.find (sample->name()) != m_named.end())
161 RCU_THROW_MSG (
"can't add sample of name " + sample->name() +
"\na sample with that name already exists\nold sample:\n" +
dbg (*m_named.find (sample->name())->second, 9999) +
"\nnew sample:\n" +
dbg (*sample, 9999));
165 m_samples.push_back (sample.get());
166 if (!sample->name().empty())
167 m_named[sample->name()] = sample;
170 if (m_samples.back() == sample.get())
171 m_samples.pop_back();
177 void SampleHandler ::
178 add (SamplePtr&& sample)
185 void SampleHandler ::
186 add (
const SampleHandler&
sh)
192 iter != end2; ++ iter)
200 void SampleHandler ::
201 addWithPrefix (
const SampleHandler&
sh,
const std::string& prefix)
207 iter != end2; ++ iter)
209 std::unique_ptr<Sample> sample (
dynamic_cast<Sample*
>((*iter)->Clone ()));
211 sample->name (prefix + (*iter)->name());
212 add (sample.release());
218 void SampleHandler ::
219 remove (
const std::string& name)
222 const Sample *sample =
get (name);
224 RCU_THROW_MSG (
"sample " + name +
" not found in SampleHandler");
230 void SampleHandler ::
231 remove (
const Sample *sample)
236 NamedMIter nameIter = m_named.find (sample->name());
237 if (nameIter == m_named.end())
238 RCU_THROW_MSG (
"sample " + sample->name() +
" not found in SampleHandler");
239 if (nameIter->second.get() != sample)
240 RCU_THROW_MSG (
"different sample of name " + sample->name() +
" found in SampleHandler");
241 std::erase (m_samples, sample);
242 m_named.erase (nameIter);
247 Sample *SampleHandler ::
248 get (
const std::string& name)
252 NamedIter iter = m_named.find (name);
253 if (iter != m_named.end())
254 return iter->second.get();
259 const Sample *SampleHandler ::
260 get (
const std::string& name)
const
264 auto iter = m_named.find (name);
265 if (iter != m_named.end())
266 return iter->second.get();
272 SampleHandler SampleHandler ::
273 find (
const std::string&
tags)
const
281 SampleHandler SampleHandler ::
282 find (
const TagList&
tags)
const
288 for (SamplesIter sample = m_samples.begin(),
289 end = m_samples.end(); sample != end; ++ sample)
293 end =
tags.end(); !use && iter != end; ++ iter)
294 use = (*sample)->tags().has (*iter);
303 Sample *SampleHandler ::
304 findBySource (
const std::string& name)
const
308 std::vector<Sample*>
result;
310 end2 = end(); sample != end2; ++ sample)
313 result.push_back ((*sample));
317 std::ostringstream message;
318 message <<
"multiple samples have " << name <<
" as a source:";
319 for (std::vector<Sample*>::const_iterator sample =
result.begin(),
320 end =
result.end(); sample != end; ++ sample)
321 message <<
" " << (*sample)->name();
331 SampleHandler SampleHandler ::
332 findByName (
const std::string& pattern)
const
336 std::regex expr (pattern);
337 for (
iterator iter = begin(), end = this->end(); iter != end; ++ iter)
347 void SampleHandler ::
351 std::cout <<
dbg (*
this, 9999) << std::endl;
356 void SampleHandler ::
357 printContent ()
const
365 void SampleHandler ::
366 save (
const std::string& directory)
const
372 gSystem->MakeDirectory (directory.c_str());
374 end = this->end(); iter != end; ++ iter)
376 TFile
file ((directory +
"/" + (*iter)->name() +
".root").c_str(),
"RECREATE");
377 (*iter)->Write (
"sample");
383 void SampleHandler ::
384 load (
const std::string& directory)
388 DiskListLocal mydir (directory);
391 const std::string
file = mydir.fileName();
393 if (
file.size() > 5 &&
394 file.rfind (
".root") ==
file.size() - 5)
396 TFile myfile (mydir.path().c_str(),
"READ");
397 Sample *
const sample =
dynamic_cast<Sample*
>(myfile.Get (
"sample"));
406 void SampleHandler ::
407 updateLocation (
const std::string& from,
const std::string& to)
413 end = this->end(); sample != end; ++ sample)
414 (*sample)->updateLocation (from, to);
419 void SampleHandler ::
420 fetch (
const SampleHandler& source)
425 end2 = end(); sample != end2; ++ sample)
427 const std::string name
429 const Sample *
const mysource = source.get (name);
431 (*sample)->meta()->fetch (*mysource->meta());
437 void SampleHandler ::
438 fetchDefaults (
const SampleHandler& source)
443 end2 = end(); sample != end2; ++ sample)
445 const std::string name
447 const Sample *
const mysource = source.get (name);
449 (*sample)->meta()->fetchDefaults (*mysource->meta());
455 bool SampleHandler ::
456 check_complete (
const SampleHandler& source)
const
460 std::set<std::string> names;
462 end2 = end(); sample != end2; ++ sample)
467 for (
iterator sample = source.begin(),
468 end2 = source.end(); sample != end2; ++ sample)
470 if (names.find ((*sample)->name()) == names.end())
478 void SampleHandler ::
479 setMetaDouble (
const std::string& name,
double value)
484 end2 = end(); sample != end2; ++ sample)
486 (*sample)->meta()->setDouble (name, value);
492 void SampleHandler ::
493 setMetaString (
const std::string& name,
const std::string& value)
498 end2 = end(); sample != end2; ++ sample)
500 (*sample)->meta()->setString (name, value);
506 void SampleHandler ::
507 setMetaDouble (
const std::string& pattern,
const std::string& name,
512 std::regex mypattern (pattern);
515 end2 = end(); sample != end2; ++ sample)
518 (*sample)->meta()->setDouble (name, value);
524 void SampleHandler ::
525 setMetaString (
const std::string& pattern,
const std::string& name,
526 const std::string& value)
530 std::regex mypattern (pattern);
533 end2 = end(); sample != end2; ++ sample)
536 (*sample)->meta()->setString (name, value);
546 return m_samples.begin();
555 return m_samples.end();
560 std::size_t SampleHandler ::
564 return m_samples.size();
569 Sample *SampleHandler ::
570 operator [] (std::size_t
index)
const
578 Sample *SampleHandler ::
579 at (std::size_t
index)
const
583 return m_samples[
index];
588 void SampleHandler ::
589 Streamer (TBuffer& b)
597 for (ULong_t iter = 0; iter !=
count; ++ iter)
607 ULong_t
count = m_samples.size(), count2 = 0;
608 b.WriteULong (
count);
609 for (SamplesIter iter = m_samples.begin(),
610 end = m_samples.end(); iter != end; ++ iter, ++ count2)
612 Sample *sample = *iter;