53 std::string
dbg (
const SampleHandler& obj,
unsigned verbosity)
55 std::ostringstream result;
56 result <<
"SampleHandler with " << obj.size() <<
" files";
57 if (verbosity % 10 > 0)
61 end = obj.end(); sample != end; ++ sample)
63 result <<
dbg (**sample, verbosity / 10) <<
"\n";
71 void swap (SampleHandler&
a, SampleHandler& b)
73 swap (
a.m_samples, b.m_samples);
74 swap (
a.m_named, b.m_named);
80 testInvariant ()
const
96 SampleHandler (
const SampleHandler& that)
97 : TObject (that), m_samples (that.m_samples), m_named (that.m_named)
112 SampleHandler& SampleHandler ::
113 operator = (
const SampleHandler& that)
116 SampleHandler tmp (that);
123 void SampleHandler ::
124 add (
const Sample& sample)
127 std::unique_ptr<Sample> copy (
dynamic_cast<Sample*
> (sample.Clone()));
129 add (std::move (copy));
134 void SampleHandler ::
135 add (std::shared_ptr<Sample> sample)
141 if (!sample->name().empty() && m_named.find (sample->name()) != m_named.end())
142 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));
146 m_samples.push_back (sample);
147 if (!sample->name().empty())
150 m_named[sample->name()] = std::move (sample);
155 if (!m_samples.empty() && m_samples.back().get() == sample.get())
156 m_samples.pop_back();
163 void SampleHandler ::
164 add (
const SampleHandler&
sh)
169 for (
auto& sample :
sh.m_samples)
177 void SampleHandler ::
178 addWithPrefix (
const SampleHandler&
sh,
const std::string& prefix)
184 iter != end2; ++ iter)
186 std::unique_ptr<Sample> sample (
dynamic_cast<Sample*
>((*iter)->Clone ()));
188 sample->name (prefix + (*iter)->name());
189 add (std::move (sample));
195 void SampleHandler ::
196 remove (
const std::string& name)
199 const Sample *sample =
get (name);
201 RCU_THROW_MSG (
"sample " + name +
" not found in SampleHandler");
207 void SampleHandler ::
208 remove (
const Sample *sample)
213 auto nameIter = m_named.find (sample->name());
214 if (nameIter == m_named.end())
215 RCU_THROW_MSG (
"sample " + sample->name() +
" not found in SampleHandler");
216 if (nameIter->second.get() != sample)
217 RCU_THROW_MSG (
"different sample of name " + sample->name() +
" found in SampleHandler");
218 std::erase_if (m_samples, [sample] (
const std::shared_ptr<Sample>& p) {
return p.get() == sample; });
219 m_named.erase (nameIter);
224 Sample *SampleHandler ::
225 get (
const std::string& name)
229 auto iter = m_named.find (name);
230 if (iter != m_named.end())
231 return iter->second.get();
236 const Sample *SampleHandler ::
237 get (
const std::string& name)
const
241 auto iter = m_named.find (name);
242 if (iter != m_named.end())
243 return iter->second.get();
249 SampleHandler SampleHandler ::
250 find (
const std::string&
tags)
const
258 SampleHandler SampleHandler ::
259 find (
const TagList&
tags)
const
263 SampleHandler result;
265 for (
auto& sample : m_samples)
268 for (
auto iter =
tags.begin(),
269 end =
tags.end(); !use && iter != end; ++ iter)
270 use = sample->tags().has (*iter);
279 Sample *SampleHandler ::
280 findBySource (
const std::string& name)
const
284 std::vector<Sample*> result;
286 end2 = end(); sample != end2; ++ sample)
289 result.push_back ((*sample));
291 if (result.size() > 1)
293 std::ostringstream message;
294 message <<
"multiple samples have " << name <<
" as a source:";
295 for (std::vector<Sample*>::const_iterator sample = result.begin(),
296 end = result.end(); sample != end; ++ sample)
297 message <<
" " << (*sample)->name();
302 return result.front();
307 SampleHandler SampleHandler ::
308 findByName (
const std::string& pattern)
const
311 SampleHandler result;
312 std::regex expr (pattern);
313 for (
auto& sample : m_samples)
323 void SampleHandler ::
327 std::cout <<
dbg (*
this, 9999) << std::endl;
332 void SampleHandler ::
333 printContent ()
const
341 void SampleHandler ::
342 save (
const std::string& directory)
const
348 gSystem->MakeDirectory (directory.c_str());
350 end = this->end(); iter != end; ++ iter)
352 TFile
file ((directory +
"/" + (*iter)->name() +
".root").c_str(),
"RECREATE");
353 (*iter)->Write (
"sample");
359 void SampleHandler ::
360 load (
const std::string& directory)
364 DiskListLocal mydir (directory);
367 const std::string
file = mydir.fileName();
369 if (
file.size() > 5 &&
370 file.rfind (
".root") ==
file.size() - 5)
372 TFile myfile (mydir.path().c_str(),
"READ");
373 std::unique_ptr<Sample> sample {
dynamic_cast<Sample*
>(myfile.Get (
"sample"))};
375 add (std::move(sample));
382 void SampleHandler ::
383 updateLocation (
const std::string& from,
const std::string& to)
389 end = this->end(); sample != end; ++ sample)
390 (*sample)->updateLocation (from, to);
395 void SampleHandler ::
396 fetch (
const SampleHandler& source)
401 end2 = end(); sample != end2; ++ sample)
403 const std::string name
405 const Sample *
const mysource = source.get (name);
407 (*sample)->meta()->fetch (*mysource->meta());
413 void SampleHandler ::
414 fetchDefaults (
const SampleHandler& source)
419 end2 = end(); sample != end2; ++ sample)
421 const std::string name
423 const Sample *
const mysource = source.get (name);
425 (*sample)->meta()->fetchDefaults (*mysource->meta());
431 bool SampleHandler ::
432 check_complete (
const SampleHandler& source)
const
436 std::set<std::string> names;
438 end2 = end(); sample != end2; ++ sample)
443 for (
iterator sample = source.begin(),
444 end2 = source.end(); sample != end2; ++ sample)
446 if (names.find ((*sample)->name()) == names.end())
454 void SampleHandler ::
455 setMetaDouble (
const std::string& name,
double value)
460 end2 = end(); sample != end2; ++ sample)
462 (*sample)->meta()->setDouble (name, value);
468 void SampleHandler ::
469 setMetaString (
const std::string& name,
const std::string& value)
474 end2 = end(); sample != end2; ++ sample)
476 (*sample)->meta()->setString (name, value);
482 void SampleHandler ::
483 setMetaDouble (
const std::string& pattern,
const std::string& name,
488 std::regex mypattern (pattern);
491 end2 = end(); sample != end2; ++ sample)
494 (*sample)->meta()->setDouble (name, value);
500 void SampleHandler ::
501 setMetaString (
const std::string& pattern,
const std::string& name,
502 const std::string& value)
506 std::regex mypattern (pattern);
509 end2 = end(); sample != end2; ++ sample)
512 (*sample)->meta()->setString (name, value);
518 Sample *SampleHandler::SamplePtrToRawSample ::
519 operator () (
const std::shared_ptr<Sample>& p)
const
530 return boost::make_transform_iterator
531 (m_samples.begin(), SamplePtrToRawSample{});
540 return boost::make_transform_iterator
541 (m_samples.end(), SamplePtrToRawSample{});
546 std::size_t SampleHandler ::
550 return m_samples.size();
555 Sample *SampleHandler ::
556 operator [] (std::size_t
index)
const
564 Sample *SampleHandler ::
565 at (std::size_t
index)
const
569 return m_samples[
index].get();
574 std::span<std::shared_ptr<Sample>> SampleHandler ::
578 return std::span<std::shared_ptr<Sample>> (m_samples.data(), m_samples.size());
583 void SampleHandler ::
584 Streamer (TBuffer& b)
592 for (ULong_t iter = 0; iter !=
count; ++ iter)
596 sh.add (std::shared_ptr<Sample>(sample));
602 ULong_t
count = m_samples.size();
603 b.WriteULong (
count);
604 for (
auto iter = m_samples.begin(),
605 end = m_samples.end(); iter != end; ++ iter)
607 Sample *sample = iter->get();