4#include "Rivet/Event.hh"
5#include "Rivet/ProjectionApplier.hh"
6#include "Rivet/Projections/CentralityProjection.hh"
28 : _ana(ana), _projName(projName) { }
41 static bool inRange(
double x, pair<float, float> range) {
42 return x >= range.first && (x < range.second || (x == 100.0 && x == range.second));
48 _projName = other._projName;
54 return (_ana == other._ana && _projName == other._projName && _cent == other._cent);
76 vector<int> _activeBins;
80 vector<pair<float, float>> _cent;
118 void add(
TPtr ao, CounterPtr cnt, pair<float, float> cent = {0.0, 100.0}) {
119 _cent.push_back(cent);
120 _histos.push_back({ao, cnt});
130 if (tv.size() != _cent.size())
return false;
131 for (
auto t : tv) _histos.push_back({t, CounterPtr()});
140 for (
const auto bin : _activeBins) _histos[bin].second->fill();
141 return !_activeBins.empty();
149 for (
const auto& hist : _histos)
150 if (hist.second->numEntries() > 0 && hist.first->numEntries() > 0)
151 hist.first->scaleW(1. / hist.second->val());
156 for (
const auto hist : _histos) hist.first->scaleW(
scale);
160 void exec(function<
void(T&)> f) {
161 for (
auto hist : _histos) f(hist);
181 vector<pair<TPtr, CounterPtr>> _histos;
219 template <
typename... Args>
221 for (
const auto bin : _activeBins) {
222 _histos[bin].first->fill(args...);
228 const int nCent = _histos.size();
229 for (
int iCent = 0; iCent < nCent; ++iCent) {
230 *_histos[iCent].first -= *rhs._histos[iCent].first;
236 const int nCent = _histos.size();
237 for (
int iCent = 0; iCent < nCent; ++iCent) {
238 *_histos[iCent].first += *rhs._histos[iCent].first;
296 template <
typename... Args>
298 for (
const auto bin : _activeBins) {
299 _histos[bin].first->fill(bin, args...);
305 const int nCent = _histos.size();
306 for (
int iCent = 0; iCent < nCent; ++iCent) {
307 *_histos[iCent].first -= *rhs._histos[iCent].first;
313 const int nCent = this->_histos.size();
314 for (
int iCent = 0; iCent < nCent; ++iCent) {
315 *_histos[iCent].first += *rhs._histos[iCent].first;
337 template <
typename T>
338 Percentile<typename ReferenceTraits<T>::RefT> divide(
const Percentile<T> numer,
const Percentile<T> denom) {
339 typedef typename ReferenceTraits<T>::RefT ScatT;
340 Percentile<ScatT> ret;
342 assert(numer.compatible(denom));
343 for (
int i = 0, N = numer.analysisObjects().size(); i < N; ++i)
345 make_shared<ScatT>(divide(*numer.analysisObjects()[i].first, *denom.analysisObjects()[i].first)));
346 ret.add(numer, scatters);
350 template <
typename T>
353 const Percentile<
typename ReferenceTraits<T>::RefT> denom) {
354 typedef typename ReferenceTraits<T>::RefT ScatT;
356 vector<typename ScatT::Ptr> scatters;
357 assert(numer.compatible(denom));
358 for (
int i = 0, N = numer.analysisObjects().size(); i < N; ++i)
360 make_shared<ScatT>(divide(*numer.analysisObjects()[i].first, *denom.analysisObjects()[i].first)));
361 ret.add(numer, scatters);
365 template <
typename T>
367 const Percentile<
typename ReferenceTraits<T>::RefT> numer,
369 typedef typename ReferenceTraits<T>::RefT ScatT;
371 vector<typename ScatT::Ptr> scatters;
372 assert(numer.compatible(denom));
373 for (
int i = 0, N = numer.analysisObjects().size(); i < N; ++i)
375 make_shared<ScatT>(divide(*numer.analysisObjects()[i].first, *denom.analysisObjects()[i].first)));
376 ret.add(numer, scatters);
380 template <
typename T>
383 vector<typename T::Ptr> aos;
384 assert(pctla.compatible(pctlb));
385 for (
int i = 0, N = pctla.analysisObjects().size(); i < N; ++i)
387 make_shared<T>(
add(*pctla.analysisObjects()[i].first, *pctlb.analysisObjects()[i].first)));
392 template <
typename T>
395 const Percentile<
typename ReferenceTraits<T>::RefT> pctlb) {
396 typedef typename ReferenceTraits<T>::RefT ScatT;
398 vector<typename ScatT::Ptr> scatters;
399 assert(pctla.compatible(pctlb));
400 for (
int i = 0, N = pctla.analysisObjects().size(); i < N; ++i)
402 make_shared<ScatT>(
add(*pctla.analysisObjects()[i].first, *pctlb.analysisObjects()[i].first)));
403 ret.add(pctla, scatters);
407 template <
typename T>
410 typedef typename ReferenceTraits<T>::RefT ScatT;
412 vector<typename ScatT::Ptr> scatters;
413 assert(pctla.compatible(pctlb));
414 for (
int i = 0, N = pctla.analysisObjects().size(); i < N; ++i)
416 make_shared<ScatT>(
add(*pctla.analysisObjects()[i].first, *pctlb.analysisObjects()[i].first)));
417 ret.add(pctla, scatters);
421 template <
typename T>
424 vector<typename T::Ptr> aos;
425 assert(pctla.compatible(pctlb));
426 for (
int i = 0, N = pctla.analysisObjects().size(); i < N; ++i)
428 make_shared<T>(
subtract(*pctla.analysisObjects()[i].first, *pctlb.analysisObjects()[i].first)));
433 template <
typename T>
436 const Percentile<
typename ReferenceTraits<T>::RefT> pctlb) {
437 typedef typename ReferenceTraits<T>::RefT ScatT;
439 vector<typename ScatT::Ptr> scatters;
440 assert(pctla.compatible(pctlb));
441 for (
int i = 0, N = pctla.analysisObjects().size(); i < N; ++i)
443 make_shared<ScatT>(
subtract(*pctla.analysisObjects()[i].first, *pctlb.analysisObjects()[i].first)));
444 ret.add(pctla, scatters);
448 template <
typename T>
450 const Percentile<
typename ReferenceTraits<T>::RefT> pctla,
452 typedef typename ReferenceTraits<T>::RefT ScatT;
454 vector<typename ScatT::Ptr> scatters;
455 assert(pctla.compatible(pctlb));
456 for (
int i = 0, N = pctla.analysisObjects().size(); i < N; ++i)
458 make_shared<ScatT>(
subtract(*pctla.analysisObjects()[i].first, *pctlb.analysisObjects()[i].first)));
459 ret.add(pctla, scatters);
463 template <
typename T>
466 const Percentile<
typename ReferenceTraits<T>::RefT> pctlb) {
467 typedef typename ReferenceTraits<T>::RefT ScatT;
469 vector<typename ScatT::Ptr> scatters;
470 assert(pctla.compatible(pctlb));
471 for (
int i = 0, N = pctla.analysisObjects().size(); i < N; ++i)
473 make_shared<ScatT>(multiply(*pctla.analysisObjects()[i].first, *pctlb.analysisObjects()[i].first)));
474 ret.add(pctla, scatters);
478 template <
typename T>
480 const Percentile<
typename ReferenceTraits<T>::RefT> pctla,
482 typedef typename ReferenceTraits<T>::RefT ScatT;
484 vector<typename ScatT::Ptr> scatters;
485 assert(pctla.compatible(pctlb));
486 for (
int i = 0, N = pctla.analysisObjects().size(); i < N; ++i)
488 make_shared<ScatT>(multiply(*pctla.analysisObjects()[i].first, *pctlb.analysisObjects()[i].first)));
489 ret.add(pctla, scatters);
494 template <
typename T>
497 typedef typename ReferenceTraits<T>::RefT ScatT;
499 vector<typename ScatT::Ptr> scatters;
500 assert(numer.compatible(denom));
501 for (
int i = 0, N = numer.analysisObjects().size(); i < N; ++i)
503 make_shared<ScatT>(divide(*numer.analysisObjects()[i].first, *denom.analysisObjects()[i].first)));
504 ret.add(numer, scatters);
508 template <
typename T>
512 typedef typename ReferenceTraits<T>::RefT ScatT;
514 vector<typename ScatT::Ptr> scatters;
515 assert(numer.compatible(denom));
516 for (
int i = 0, N = numer.analysisObjects().size(); i < N; ++i)
518 make_shared<ScatT>(divide(*numer.analysisObjects()[i].first, *denom.analysisObjects()[i].first)));
519 ret.add(numer, scatters);
523 template <
typename T>
527 typedef typename ReferenceTraits<T>::RefT ScatT;
529 vector<typename ScatT::Ptr> scatters;
530 assert(numer.compatible(denom));
531 for (
int i = 0, N = numer.analysisObjects().size(); i < N; ++i)
533 make_shared<ScatT>(divide(*numer.analysisObjects()[i].first, *denom.analysisObjects()[i].first)));
534 ret.add(numer, scatters);
538 template <
typename T>
541 vector<typename T::Ptr> aos;
542 assert(pctla.compatible(pctlb));
543 for (
int i = 0, N = pctla.analysisObjects().size(); i < N; ++i)
545 make_shared<T>(
add(*pctla.analysisObjects()[i].first, *pctlb.analysisObjects()[i].first)));
550 template <
typename T>
554 typedef typename ReferenceTraits<T>::RefT ScatT;
556 vector<typename ScatT::Ptr> scatters;
557 assert(pctla.compatible(pctlb));
558 for (
int i = 0, N = pctla.analysisObjects().size(); i < N; ++i)
560 make_shared<ScatT>(
add(*pctla.analysisObjects()[i].first, *pctlb.analysisObjects()[i].first)));
561 ret.add(pctla, scatters);
565 template <
typename T>
569 typedef typename ReferenceTraits<T>::RefT ScatT;
571 vector<typename ScatT::Ptr> scatters;
572 assert(pctla.compatible(pctlb));
573 for (
int i = 0, N = pctla.analysisObjects().size(); i < N; ++i)
575 make_shared<ScatT>(
add(*pctla.analysisObjects()[i].first, *pctlb.analysisObjects()[i].first)));
576 ret.add(pctla, scatters);
580 template <
typename T>
583 vector<typename T::Ptr> aos;
584 assert(pctla.compatible(pctlb));
585 for (
int i = 0, N = pctla.analysisObjects().size(); i < N; ++i)
587 make_shared<T>(
subtract(*pctla.analysisObjects()[i].first, *pctlb.analysisObjects()[i].first)));
592 template <
typename T>
596 typedef typename ReferenceTraits<T>::RefT ScatT;
598 vector<typename ScatT::Ptr> scatters;
599 assert(pctla.compatible(pctlb));
600 for (
int i = 0, N = pctla.analysisObjects().size(); i < N; ++i)
602 make_shared<ScatT>(
subtract(*pctla.analysisObjects()[i].first, *pctlb.analysisObjects()[i].first)));
603 ret.add(pctla, scatters);
607 template <
typename T>
611 typedef typename ReferenceTraits<T>::RefT ScatT;
613 vector<typename ScatT::Ptr> scatters;
614 assert(pctla.compatible(pctlb));
615 for (
int i = 0, N = pctla.analysisObjects().size(); i < N; ++i)
617 make_shared<ScatT>(
subtract(*pctla.analysisObjects()[i].first, *pctlb.analysisObjects()[i].first)));
618 ret.add(pctla, scatters);
622 template <
typename T>
626 typedef typename ReferenceTraits<T>::RefT ScatT;
628 vector<typename ScatT::Ptr> scatters;
629 assert(pctla.compatible(pctlb));
630 for (
int i = 0, N = pctla.analysisObjects().size(); i < N; ++i)
632 make_shared<ScatT>(multiply(*pctla.analysisObjects()[i].first, *pctlb.analysisObjects()[i].first)));
633 ret.add(pctla, scatters);
637 template <
typename T>
641 typedef typename ReferenceTraits<T>::RefT ScatT;
643 vector<typename ScatT::Ptr> scatters;
644 assert(pctla.compatible(pctlb));
645 for (
int i = 0, N = pctla.analysisObjects().size(); i < N; ++i)
647 make_shared<ScatT>(multiply(*pctla.analysisObjects()[i].first, *pctlb.analysisObjects()[i].first)));
648 ret.add(pctla, scatters);
652 template <
typename T>
654 return add(pctla, pctlb);
657 template <
typename T>
662 template <
typename T>
665 return divide(numer, denom);
668 template <
typename T>
670 return add(pctla, pctlb);
673 template <
typename T>
678 template <
typename T>
681 return divide(numer, denom);
This is the base class of all analysis classes in Rivet.
Definition Analysis.hh:69
Representation of a HepMC event, and enabler of Projection caching.
Definition Event.hh:22
Definition RivetYODA.hh:1376
void selectBins(const Event &)
Initialize the PercentileBase for a new event.
static bool inRange(double x, pair< float, float > range)
Helper function to check if x is within range.
Definition Percentile.hh:41
PercentileBase(Analysis *ana, string projName)
Constructor.
Definition Percentile.hh:27
bool compatible(const PercentileBase &other) const
check if other PercentileBase is compatible with this.
Definition Percentile.hh:53
void copyFrom(const PercentileBase &other)
Copy information from other PercentileBase.
Definition Percentile.hh:46
const vector< pair< float, float > > & centralities() const
return the list of centrality bins.
Definition Percentile.hh:61
PercentileBase()
Default constructor.
Definition Percentile.hh:31
PercentileTBase is the base class of all Percentile classes.
Definition Percentile.hh:89
const vector< pair< TPtr, CounterPtr > > & analysisObjects() const
Access the underlyng AnalysisObjects.
Definition Percentile.hh:170
void normalizePerEvent()
Normalize each AnalysisObject.
Definition Percentile.hh:148
bool init(const Event &event)
Initialize for a new event. Select which AnalysisObjects should be filled for this event....
Definition Percentile.hh:138
bool add(const PercentileBase &other, const vector< TPtr > &tv)
Copy the information from an other Percentile object.
Definition Percentile.hh:128
~PercentileTBase()
Empty destructor.
Definition Percentile.hh:107
MultiplexPtr< Multiplexer< T > > TPtr
Convenient typedef.
Definition Percentile.hh:93
void scale(float scale)
Simple scaling of each AnalysisObject.
Definition Percentile.hh:155
void add(TPtr ao, CounterPtr cnt, pair< float, float > cent={0.0, 100.0})
Add a new percentile bin.
Definition Percentile.hh:118
void exec(function< void(T &)> f)
Execute a function for each AnalysisObject.
Definition Percentile.hh:160
PercentileTBase(Analysis *ana, string projName)
Main constructor.
Definition Percentile.hh:100
PercentileTBase()
Default constructor.
Definition Percentile.hh:104
The PercentileXaxis class for centrality binning.
Definition Percentile.hh:271
PercentileXaxis< T > & operator-=(const PercentileXaxis< T > &rhs)
Subtract the contents from another PercentileXaxis.
Definition Percentile.hh:304
void fill(Args... args)
Definition Percentile.hh:297
PercentileXaxis< T > & operator+=(const PercentileXaxis< T > &rhs)
Add the contents from another PercentileXaxis.
Definition Percentile.hh:312
PercentileXaxis(Analysis *ana, string projName)
Main constructor.
Definition Percentile.hh:279
PercentileXaxis()
Default constructor.
Definition Percentile.hh:283
PercentileXaxis< T > & operator->*(function< void(T &)> f)
Pointer to member operator.
Definition Percentile.hh:325
~PercentileXaxis()
Empty destructor.
Definition Percentile.hh:286
PercentileXaxis< T > * operator->()
Make this object look like a pointer.
Definition Percentile.hh:320
The Percentile class for centrality binning.
Definition Percentile.hh:194
void fill(Args... args)
Definition Percentile.hh:220
Percentile< T > & operator->*(function< void(T &)> f)
Pointer to member operator.
Definition Percentile.hh:249
Percentile< T > & operator-=(const Percentile< T > &rhs)
Subtract the contents fro another Pecentile.
Definition Percentile.hh:227
~Percentile()
Empty destructor.
Definition Percentile.hh:209
Percentile< T > & operator+=(const Percentile< T > &rhs)
Add the contents fro another Pecentile.
Definition Percentile.hh:235
Percentile(Analysis *ana, string projName)
Main constructor.
Definition Percentile.hh:202
Percentile()
Default constructor.
Definition Percentile.hh:206
Percentile< T > * operator->()
Make this object look like a pointer.
Definition Percentile.hh:244
Definition LHCbCommon.hh:9
double subtract(double a, double b, double tolerance=1e-5)
Subtract two numbers with FP fuzziness.
Definition MathUtils.hh:242
double add(double a, double b, double tolerance=1e-5)
Add two numbers with FP fuzziness.
Definition MathUtils.hh:248