52 std::string
dbg (
const SampleHandler& obj,
unsigned verbosity)
54 std::ostringstream result;
55 result <<
"SampleHandler with " << obj.size() <<
" files";
56 if (verbosity % 10 > 0)
60 end = obj.end(); sample != end; ++ sample)
62 result <<
dbg (**sample, verbosity / 10) <<
"\n";
70 void swap (SampleHandler&
a, SampleHandler& b)
72 swap (
a.m_samples, b.m_samples);
73 swap (
a.m_named, b.m_named);
79 testInvariant ()
const
94 SampleHandler (
const SampleHandler& that)
95 : TObject (that), m_samples (that.m_samples), m_named (that.m_named)
110 SampleHandler& SampleHandler ::
111 operator = (
const SampleHandler& that)
114 SampleHandler tmp (that);
121 void SampleHandler ::
122 add (
const Sample& sample)
125 std::unique_ptr<Sample> copy (
dynamic_cast<Sample*
> (sample.Clone()));
127 add (std::move (copy));
132 void SampleHandler ::
133 add (std::shared_ptr<Sample> sample)
139 if (!sample->name().empty() && m_named.find (sample->name()) != m_named.end())
140 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));
144 m_samples.push_back (sample);
145 if (!sample->name().empty())
148 m_named[sample->name()] = std::move (sample);
153 if (!m_samples.empty() && m_samples.back().get() == sample.get())
154 m_samples.pop_back();
161 void SampleHandler ::
162 add (
const SampleHandler&
sh)
167 for (
auto& sample :
sh.m_samples)
175 void SampleHandler ::
176 addWithPrefix (
const SampleHandler&
sh,
const std::string& prefix)
182 iter != end2; ++ iter)
184 std::unique_ptr<Sample> sample (
dynamic_cast<Sample*
>((*iter)->Clone ()));
186 sample->name (prefix + (*iter)->name());
187 add (std::move (sample));
193 void SampleHandler ::
194 remove (
const std::string& name)
197 const Sample *sample =
get (name);
199 throw std::runtime_error (
"sample " + name +
" not found in SampleHandler");
205 void SampleHandler ::
206 remove (
const Sample *sample)
211 auto nameIter = m_named.find (sample->name());
212 if (nameIter == m_named.end())
213 throw std::runtime_error (
"sample " + sample->name() +
" not found in SampleHandler");
214 if (nameIter->second.get() != sample)
215 throw std::runtime_error (
"different sample of name " + sample->name() +
" found in SampleHandler");
216 std::erase_if (m_samples, [sample] (
const std::shared_ptr<Sample>& p) {
return p.get() == sample; });
217 m_named.erase (nameIter);
222 Sample *SampleHandler ::
223 get (
const std::string& name)
227 auto iter = m_named.find (name);
228 if (iter != m_named.end())
229 return iter->second.get();
234 const Sample *SampleHandler ::
235 get (
const std::string& name)
const
239 auto iter = m_named.find (name);
240 if (iter != m_named.end())
241 return iter->second.get();
247 SampleHandler SampleHandler ::
248 find (
const std::string&
tags)
const
256 SampleHandler SampleHandler ::
257 find (
const TagList&
tags)
const
261 SampleHandler result;
263 for (
auto& sample : m_samples)
266 for (
auto iter =
tags.begin(),
267 end =
tags.end(); !use && iter != end; ++ iter)
268 use = sample->tags().has (*iter);
277 Sample *SampleHandler ::
278 findBySource (
const std::string& name)
const
282 std::vector<Sample*> result;
284 end2 = end(); sample != end2; ++ sample)
287 result.push_back ((*sample));
289 if (result.size() > 1)
291 std::ostringstream message;
292 message <<
"multiple samples have " << name <<
" as a source:";
293 for (std::vector<Sample*>::const_iterator sample = result.begin(),
294 end = result.end(); sample != end; ++ sample)
295 message <<
" " << (*sample)->name();
296 throw std::runtime_error (message.str());
300 return result.front();
305 SampleHandler SampleHandler ::
306 findByName (
const std::string& pattern)
const
309 SampleHandler result;
310 std::regex expr (pattern);
311 for (
auto& sample : m_samples)
321 void SampleHandler ::
325 std::cout <<
dbg (*
this, 9999) << std::endl;
330 void SampleHandler ::
331 printContent ()
const
339 void SampleHandler ::
340 save (
const std::string& directory)
const
346 gSystem->MakeDirectory (directory.c_str());
348 end = this->end(); iter != end; ++ iter)
350 TFile
file ((directory +
"/" + (*iter)->name() +
".root").c_str(),
"RECREATE");
351 (*iter)->Write (
"sample");
357 void SampleHandler ::
358 load (
const std::string& directory)
362 DiskListLocal mydir (directory);
365 const std::string
file = mydir.fileName();
367 if (
file.size() > 5 &&
368 file.rfind (
".root") ==
file.size() - 5)
370 TFile myfile (mydir.path().c_str(),
"READ");
371 std::unique_ptr<Sample> sample {
dynamic_cast<Sample*
>(myfile.Get (
"sample"))};
373 add (std::move(sample));
380 void SampleHandler ::
381 updateLocation (
const std::string& from,
const std::string& to)
387 end = this->end(); sample != end; ++ sample)
388 (*sample)->updateLocation (from, to);
393 void SampleHandler ::
394 fetch (
const SampleHandler& source)
399 end2 = end(); sample != end2; ++ sample)
401 const std::string name
403 const Sample *
const mysource = source.get (name);
405 (*sample)->meta()->fetch (*mysource->meta());
411 void SampleHandler ::
412 fetchDefaults (
const SampleHandler& source)
417 end2 = end(); sample != end2; ++ sample)
419 const std::string name
421 const Sample *
const mysource = source.get (name);
423 (*sample)->meta()->fetchDefaults (*mysource->meta());
429 bool SampleHandler ::
430 check_complete (
const SampleHandler& source)
const
434 std::set<std::string> names;
436 end2 = end(); sample != end2; ++ sample)
441 for (
iterator sample = source.begin(),
442 end2 = source.end(); sample != end2; ++ sample)
444 if (names.find ((*sample)->name()) == names.end())
452 void SampleHandler ::
453 setMetaDouble (
const std::string& name,
double value)
458 end2 = end(); sample != end2; ++ sample)
460 (*sample)->meta()->setDouble (name, value);
466 void SampleHandler ::
467 setMetaString (
const std::string& name,
const std::string& value)
472 end2 = end(); sample != end2; ++ sample)
474 (*sample)->meta()->setString (name, value);
480 void SampleHandler ::
481 setMetaDouble (
const std::string& pattern,
const std::string& name,
486 std::regex mypattern (pattern);
489 end2 = end(); sample != end2; ++ sample)
492 (*sample)->meta()->setDouble (name, value);
498 void SampleHandler ::
499 setMetaString (
const std::string& pattern,
const std::string& name,
500 const std::string& value)
504 std::regex mypattern (pattern);
507 end2 = end(); sample != end2; ++ sample)
510 (*sample)->meta()->setString (name, value);
516 Sample *SampleHandler::SamplePtrToRawSample ::
517 operator () (
const std::shared_ptr<Sample>& p)
const
528 return boost::make_transform_iterator
529 (m_samples.begin(), SamplePtrToRawSample{});
538 return boost::make_transform_iterator
539 (m_samples.end(), SamplePtrToRawSample{});
544 std::size_t SampleHandler ::
548 return m_samples.size();
553 Sample *SampleHandler ::
554 operator [] (std::size_t
index)
const
562 Sample *SampleHandler ::
563 at (std::size_t
index)
const
567 return m_samples[
index].get();
572 std::span<std::shared_ptr<Sample>> SampleHandler ::
576 return std::span<std::shared_ptr<Sample>> (m_samples.data(), m_samples.size());
581 void SampleHandler ::
582 Streamer (TBuffer& b)
590 for (ULong_t iter = 0; iter !=
count; ++ iter)
594 sh.add (std::shared_ptr<Sample>(sample));
600 ULong_t
count = m_samples.size();
601 b.WriteULong (
count);
602 for (
auto iter = m_samples.begin(),
603 end = m_samples.end(); iter != end; ++ iter)
605 Sample *sample = iter->get();