32{
33 namespace
34 {
35
36
37
38
39
40
41
42
43
44
45
46
47 }
48
49
50
51 std::string
dbg (
const SampleHandler& obj,
unsigned verbosity)
52 {
54 result <<
"SampleHandler with " <<
obj.size() <<
" samples";
55 if (verbosity % 10 > 0)
56 {
58 for (auto *sample : obj)
59 {
60 result <<
dbg (*sample, verbosity / 10) <<
"\n";
61 }
62 }
64 }
65
66
67
68 void swap (SampleHandler&
a, SampleHandler& b)
69 {
70 swap (
a.m_samples,
b.m_samples);
71 swap (
a.m_named,
b.m_named);
72 }
73
74
75
76 void SampleHandler ::
77 testInvariant () const
78 {
79 }
80
81
82
83 SampleHandler ::
84 SampleHandler ()
85 {
87 }
88
89
90
91 SampleHandler ::
92 SampleHandler (const SampleHandler& that)
93 : TObject (that), m_samples (that.m_samples), m_named (that.m_named)
94 {
96 }
97
98
99
100 SampleHandler ::
101 ~SampleHandler ()
102 {
104 }
105
106
107
108 SampleHandler& SampleHandler ::
109 operator = (const SampleHandler& that)
110 {
111
112 SampleHandler
tmp (that);
114 return *this;
115 }
116
117
118
119 void SampleHandler ::
120 add (const Sample& sample)
121 {
122
123 std::unique_ptr<Sample>
copy (
dynamic_cast<Sample*
> (
sample.Clone()));
125 add (std::move (copy));
126 }
127
128
129
130 void SampleHandler ::
131 add (std::shared_ptr<Sample> sample)
132 {
136
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));
139
140 m_samples.push_back (sample);
141 if (!
sample->name().empty())
142 {
143 try
144 {
146 } catch (...)
147 {
148 m_samples.pop_back();
149 throw;
150 }
151
152
153
155 }
156 }
157
158
159
160 void SampleHandler ::
161 add (
const SampleHandler&
sh)
162 {
163
165
166 for (
auto& sample :
sh.m_samples)
167 {
169 }
170 }
171
172
173
174 void SampleHandler ::
175 addWithPrefix (
const SampleHandler&
sh,
const std::string& prefix)
176 {
177
179
180 for (
auto *source :
sh)
181 {
182 std::unique_ptr<Sample>
sample (
dynamic_cast<Sample*
>(
source->Clone ()));
185 add (std::move (sample));
186 }
187 }
188
189
190
191 void SampleHandler ::
192 remove (const std::string& name)
193 {
194
196 if (sample == nullptr)
197 throw std::runtime_error ("sample " + name + " not found in SampleHandler");
199 }
200
201
202
203 void SampleHandler ::
204 remove (const Sample *sample)
205 {
208
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);
216 }
217
218
219
220 Sample *SampleHandler ::
221 get (const std::string& name)
222 {
224
225 auto iter = m_named.find (name);
226 if (iter != m_named.end())
227 return iter->second.get();
228 return nullptr;
229 }
230
231
232 const Sample *SampleHandler ::
233 get (const std::string& name) const
234 {
236
237 auto iter = m_named.find (name);
238 if (iter != m_named.end())
239 return iter->second.get();
240 return nullptr;
241 }
242
243
244
245 SampleHandler SampleHandler ::
246 find (
const std::string&
tags)
const
247 {
248
250 }
251
252
253
254 SampleHandler SampleHandler ::
255 find (
const TagList&
tags)
const
256 {
258
260
261 for (auto& sample : m_samples)
262 {
263 bool use = false;
264 for (
auto iter =
tags.begin(),
265 end =
tags.end(); !use && iter != end; ++ iter)
266 use =
sample->tags().has (*iter);
267 if (use)
269 }
271 }
272
273
274
275 Sample *SampleHandler ::
276 findBySource (const std::string& name) const
277 {
279
280 std::vector<Sample*>
result;
281 for (auto *sample : *this)
282 {
283 if (name ==
sample->meta()->castString (MetaFields::sourceSample,
sample->name()))
284 result.push_back (sample);
285 }
287 {
289 message <<
"multiple samples have " <<
name <<
" as a source:";
290 for (auto *sample : result)
292 throw std::runtime_error (
message.str());
293 }
295 return nullptr;
297 }
298
299
300
301 SampleHandler SampleHandler ::
302 findByName (const std::string& pattern) const
303 {
306 std::regex expr (pattern);
307 for (auto& sample : m_samples)
308 {
311 }
313 }
314
315
316
317 void SampleHandler ::
318 print () const
319 {
321 std::cout <<
dbg (*
this, 9999) << std::endl;
322 }
323
324
325
326 void SampleHandler ::
327 printContent () const
328 {
329
331 }
332
333
334
335 void SampleHandler ::
336 save (const std::string& directory) const
337 {
339
340
341
342 gSystem->MakeDirectory (
directory.c_str());
343 for (auto *sample : *this)
344 {
345 TFile
file ((directory +
"/" +
sample->name() +
".root").c_str(),
"RECREATE");
347 }
348 }
349
350
351
352 void SampleHandler ::
353 load (const std::string& directory)
354 {
356
357 DiskListLocal
mydir (directory);
359 {
360 const std::string
file =
mydir.fileName();
361
362 if (
file.size() > 5 &&
file.rfind (
".root") ==
file.size() - 5)
363 {
364 TFile myfile (
mydir.path().c_str(),
"READ");
365 std::unique_ptr<Sample>
sample {
dynamic_cast<Sample*
>(myfile.Get (
"sample"))};
366 if (sample != 0)
367 add (std::move(sample));
368 }
369 }
370 }
371
372
373
374 void SampleHandler ::
375 updateLocation (const std::string& from, const std::string& to)
376 {
377
380 for (auto *sample : *this)
381 sample->updateLocation (from, to);
382 }
383
384
385
386 void SampleHandler ::
387 fetch (const SampleHandler& source)
388 {
389
390
391 for (auto *sample : *this)
392 {
393 const std::string
name
394 =
sample->meta()->castString (MetaFields::sourceSample,
sample->name());
395 const Sample *
const mysource =
source.get (name);
396 if (mysource)
397 sample->meta()->fetch (*mysource->meta());
398 }
399 }
400
401
402
403 void SampleHandler ::
404 fetchDefaults (const SampleHandler& source)
405 {
406
407
408 for (auto *sample : *this)
409 {
410 const std::string
name
411 =
sample->meta()->castString (MetaFields::sourceSample,
sample->name());
412 const Sample *
const mysource =
source.get (name);
413 if (mysource)
414 sample->meta()->fetchDefaults (*mysource->meta());
415 }
416 }
417
418
419
420 bool SampleHandler ::
421 check_complete (const SampleHandler& source) const
422 {
423
424
425 std::set<std::string>
names;
426 for (auto *sample : *this)
427 {
428 names.insert (
sample->meta()->castString (MetaFields::sourceSample,
sample->name()));
429 }
430
431 for (auto *sample : source)
432 {
434 return false;
435 }
436 return true;
437 }
438
439
440
441 void SampleHandler ::
442 setMetaDouble (const std::string& name, double value)
443 {
444
445
446 for (auto *sample : *this)
447 {
448 sample->meta()->setDouble (name, value);
449 }
450 }
451
452
453
454 void SampleHandler ::
455 setMetaString (const std::string& name, const std::string& value)
456 {
457
458
459 for (auto *sample : *this)
460 {
461 sample->meta()->setString (name, value);
462 }
463 }
464
465
466
467 void SampleHandler ::
468 setMetaDouble (const std::string& pattern, const std::string& name,
469 double value)
470 {
471
472
473 std::regex mypattern (pattern);
474
475 for (auto *sample : *this)
476 {
478 sample->meta()->setDouble (name, value);
479 }
480 }
481
482
483
484 void SampleHandler ::
485 setMetaString (const std::string& pattern, const std::string& name,
486 const std::string& value)
487 {
488
489
490 std::regex mypattern (pattern);
491
492 for (auto *sample : *this)
493 {
495 sample->meta()->setString (name, value);
496 }
497 }
498
499
500
501 Sample *SampleHandler::SamplePtrToRawSample ::
502 operator () (const std::shared_ptr<Sample>& p) const
503 {
505 }
506
507
508
509 SampleHandler::iterator SampleHandler ::
510 begin () const
511 {
513 return boost::make_transform_iterator
514 (m_samples.begin(), SamplePtrToRawSample{});
515 }
516
517
518
519 SampleHandler::iterator SampleHandler ::
520 end () const
521 {
523 return boost::make_transform_iterator
524 (m_samples.end(), SamplePtrToRawSample{});
525 }
526
527
528
529 std::size_t SampleHandler ::
530 size () const
531 {
533 return m_samples.size();
534 }
535
536
537
538 Sample *SampleHandler ::
539 operator [] (std::size_t
index)
const
540 {
541
543 }
544
545
546
547 Sample *SampleHandler ::
548 at (std::size_t
index)
const
549 {
552 return m_samples[
index].get();
553 }
554
555
556
557 std::span<const std::shared_ptr<Sample>> SampleHandler ::
558 samples () const
559 {
561 return std::span<const std::shared_ptr<Sample>> (m_samples.data(), m_samples.size());
562 }
563
564
565
566 void SampleHandler ::
567 Streamer (TBuffer& b)
568 {
570 {
576 {
579 sh.add (std::shared_ptr<Sample>(sample));
580 }
582 } else
583 {
585 ULong_t
count = m_samples.size();
587 for (const auto& sample_ptr : m_samples)
588 {
589 Sample *
sample = sample_ptr.get();
591 }
592 }
593 }
594}
#define RCU_DESTROY_INVARIANT(x)
#define RCU_CHANGE_INVARIANT(x)
#define RCU_NEW_INVARIANT(x)
#define RCU_REQUIRE_SOFT(x)
#define RCU_READ_INVARIANT(x)
void swap(DataVector< T > &a, DataVector< T > &b)
See DataVector<T, BASE>::swap().
size_t size() const
Number of registered mappings.
void print(char *figname, TCanvas *c1)
bool add(const std::string &hname, TKey *tobj)
std::vector< std::string > tags
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
std::string find(const std::string &s)
return a remapped string
int count(std::string s, const std::string ®x)
count how many occurances of a regx are in a string
mapped_type at(key_type key) const
Look up an element in the map.
bool match_expr(const std::regex &expr, std::string_view str)
returns: whether we can match the entire string with the regular expression guarantee: strong failure...
std::size_t erase_if(T_container &container, T_Func pred)