51 std::string
dbg (
const SampleHandler& obj,
unsigned verbosity)
53 std::ostringstream result;
54 result <<
"SampleHandler with " << obj.size() <<
" samples";
55 if (verbosity % 10 > 0)
58 for (
auto *sample : obj)
60 result <<
dbg (*sample, verbosity / 10) <<
"\n";
68 void swap (SampleHandler&
a, SampleHandler& b)
70 swap (
a.m_samples, b.m_samples);
71 swap (
a.m_named, b.m_named);
77 testInvariant ()
const
92 SampleHandler (
const SampleHandler& that)
93 : TObject (that), m_samples (that.m_samples), m_named (that.m_named)
108 SampleHandler& SampleHandler ::
109 operator = (
const SampleHandler& that)
112 SampleHandler tmp (that);
119 void SampleHandler ::
120 add (
const Sample& sample)
123 std::unique_ptr<Sample> copy (
dynamic_cast<Sample*
> (sample.Clone()));
125 add (std::move (copy));
130 void SampleHandler ::
131 add (std::shared_ptr<Sample> sample)
137 if (!sample->name().empty() && m_named.find (sample->name()) != m_named.end())
138 throw std::runtime_error (
"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));
140 m_samples.push_back (sample);
141 if (!sample->name().empty())
145 m_named[sample->name()] = sample;
148 m_samples.pop_back();
160 void SampleHandler ::
161 add (
const SampleHandler&
sh)
166 for (
auto& sample :
sh.m_samples)
174 void SampleHandler ::
175 addWithPrefix (
const SampleHandler&
sh,
const std::string& prefix)
180 for (
auto *source :
sh)
182 std::unique_ptr<Sample> sample (
dynamic_cast<Sample*
>(source->Clone ()));
184 sample->name (prefix + source->name());
185 add (std::move (sample));
191 void SampleHandler ::
192 remove (
const std::string& name)
195 const Sample *sample =
get (name);
196 if (sample ==
nullptr)
197 throw std::runtime_error (
"sample " + name +
" not found in SampleHandler");
203 void SampleHandler ::
204 remove (
const Sample *sample)
209 auto nameIter = m_named.find (sample->name());
210 if (nameIter == m_named.end())
211 throw std::runtime_error (
"sample " + sample->name() +
" not found in SampleHandler");
212 if (nameIter->second.get() != sample)
213 throw std::runtime_error (
"different sample of name " + sample->name() +
" found in SampleHandler");
214 std::erase_if (m_samples, [sample] (
const std::shared_ptr<Sample>& p) {
return p.get() == sample; });
215 m_named.erase (nameIter);
220 Sample *SampleHandler ::
221 get (
const std::string& name)
225 auto iter = m_named.find (name);
226 if (iter != m_named.end())
227 return iter->second.get();
232 const Sample *SampleHandler ::
233 get (
const std::string& name)
const
237 auto iter = m_named.find (name);
238 if (iter != m_named.end())
239 return iter->second.get();
245 SampleHandler SampleHandler ::
246 find (
const std::string&
tags)
const
254 SampleHandler SampleHandler ::
255 find (
const TagList&
tags)
const
259 SampleHandler result;
261 for (
auto& sample : m_samples)
264 for (
auto iter =
tags.begin(),
265 end =
tags.end(); !use && iter != end; ++ iter)
266 use = sample->tags().has (*iter);
275 Sample *SampleHandler ::
276 findBySource (
const std::string& name)
const
280 std::vector<Sample*> result;
281 for (
auto *sample : *
this)
284 result.push_back (sample);
286 if (result.size() > 1)
288 std::ostringstream message;
289 message <<
"multiple samples have " << name <<
" as a source:";
290 for (
auto *sample : result)
291 message <<
" " << sample->name();
292 throw std::runtime_error (message.str());
296 return result.front();
301 SampleHandler SampleHandler ::
302 findByName (
const std::string& pattern)
const
305 SampleHandler result;
306 std::regex expr (pattern);
307 for (
auto& sample : m_samples)
317 void SampleHandler ::
321 std::cout <<
dbg (*
this, 9999) << std::endl;
326 void SampleHandler ::
327 printContent ()
const
335 void SampleHandler ::
336 save (
const std::string& directory)
const
342 gSystem->MakeDirectory (directory.c_str());
343 for (
auto *sample : *
this)
345 TFile
file ((directory +
"/" + sample->name() +
".root").c_str(),
"RECREATE");
346 sample->Write (
"sample");
352 void SampleHandler ::
353 load (
const std::string& directory)
357 DiskListLocal mydir (directory);
360 const std::string
file = mydir.fileName();
362 if (
file.size() > 5 &&
file.rfind (
".root") ==
file.size() - 5)
364 TFile myfile (mydir.path().c_str(),
"READ");
365 std::unique_ptr<Sample> sample {
dynamic_cast<Sample*
>(myfile.Get (
"sample"))};
367 add (std::move(sample));
374 void SampleHandler ::
375 updateLocation (
const std::string& from,
const std::string& to)
380 for (
auto *sample : *
this)
381 sample->updateLocation (from, to);
386 void SampleHandler ::
387 fetch (
const SampleHandler& source)
391 for (
auto *sample : *
this)
393 const std::string name
395 const Sample *
const mysource = source.get (name);
397 sample->meta()->fetch (*mysource->meta());
403 void SampleHandler ::
404 fetchDefaults (
const SampleHandler& source)
408 for (
auto *sample : *
this)
410 const std::string name
412 const Sample *
const mysource = source.get (name);
414 sample->meta()->fetchDefaults (*mysource->meta());
420 bool SampleHandler ::
421 check_complete (
const SampleHandler& source)
const
425 std::set<std::string> names;
426 for (
auto *sample : *
this)
431 for (
auto *sample : source)
433 if (names.find (sample->name()) == names.end())
441 void SampleHandler ::
442 setMetaDouble (
const std::string& name,
double value)
446 for (
auto *sample : *
this)
448 sample->meta()->setDouble (name, value);
454 void SampleHandler ::
455 setMetaString (
const std::string& name,
const std::string& value)
459 for (
auto *sample : *
this)
461 sample->meta()->setString (name, value);
467 void SampleHandler ::
468 setMetaDouble (
const std::string& pattern,
const std::string& name,
473 std::regex mypattern (pattern);
475 for (
auto *sample : *
this)
478 sample->meta()->setDouble (name, value);
484 void SampleHandler ::
485 setMetaString (
const std::string& pattern,
const std::string& name,
486 const std::string& value)
490 std::regex mypattern (pattern);
492 for (
auto *sample : *
this)
495 sample->meta()->setString (name, value);
501 Sample *SampleHandler::SamplePtrToRawSample ::
502 operator () (
const std::shared_ptr<Sample>& p)
const
513 return boost::make_transform_iterator
514 (m_samples.begin(), SamplePtrToRawSample{});
523 return boost::make_transform_iterator
524 (m_samples.end(), SamplePtrToRawSample{});
529 std::size_t SampleHandler ::
533 return m_samples.size();
538 Sample *SampleHandler ::
539 operator [] (std::size_t
index)
const
547 Sample *SampleHandler ::
548 at (std::size_t
index)
const
552 return m_samples[
index].get();
557 std::span<const std::shared_ptr<Sample>> SampleHandler ::
561 return std::span<const std::shared_ptr<Sample>> (m_samples.data(), m_samples.size());
566 void SampleHandler ::
567 Streamer (TBuffer& b)
575 for (ULong_t iter = 0; iter !=
count; ++ iter)
577 Sample *sample =
nullptr;
579 sh.add (std::shared_ptr<Sample>(sample));
585 ULong_t
count = m_samples.size();
586 b.WriteULong (
count);
587 for (
const auto& sample_ptr : m_samples)
589 Sample *sample = sample_ptr.get();