rivet is hosted by Hepforge, IPPP Durham
Rivet  2.7.0
Percentile.hh
1 #ifndef PERCENTILE_HH
2 #define PERCENTILE_HH
3 
4 #include "Rivet/Event.hh"
5 #include "Rivet/Projections/CentralityProjection.hh"
6 #include "Rivet/ProjectionApplier.hh"
7 
8 namespace Rivet {
9 
10 
12 class Analysis;
13 
19 
20 public:
21 
27  PercentileBase(Analysis * ana, string projName)
28  : _ana(ana), _projName(projName) {}
29 
32 
38  void selectBins(const Event &);
39 
41  static bool inRange(double x, pair<float,float> range) {
42  return x >= range.first && ( x < range.second || ( x == 100.0 && x == range.second ) );
43  }
45  void copyFrom(const PercentileBase & other) {
46  _ana = other._ana;
47  _projName = other._projName;
48  _cent = other._cent;
49  }
50 
52  bool compatible(const PercentileBase & other) const {
53  return ( _ana == other._ana &&
54  _projName == other._projName &&
55  _cent == other._cent );
56  }
57 
62  const vector< pair<float, float> > & centralities() const {
63  return _cent;
64  }
65 
66 protected:
67 
69  Analysis * _ana;
70 
72  string _projName;
73 
76  vector<int> _activeBins;
77 
80  vector<pair<float, float> > _cent;
81 
82 };
83 
88 template<class T>
90 
91 public:
92 
94  typedef typename T::Ptr TPtr;
95 
101  PercentileTBase(Analysis * ana, string projName)
102  : PercentileBase(ana, projName), _histos() {}
103 
106 
109 
119  void add(shared_ptr<T> ao, CounterPtr cnt,
120  pair<float,float> cent = {0.0, 100.0} ) {
121  _cent.push_back(cent);
122  _histos.push_back( { ao, cnt } );
123  }
124 
130  bool add(const PercentileBase & other, const vector<TPtr> & tv) {
131  copyFrom(other);
132  if ( tv.size() != _cent.size() ) return false;
133  for ( auto t : tv )
134  _histos.push_back( { t, make_shared<Counter>() } );
135  return true;
136  }
137 
141  bool init(const Event & event) {
142  selectBins(event);
143  for (const auto bin : _activeBins)
144  _histos[bin].second->fill(event.weight());
145  return !_activeBins.empty();
146  }
147 
153  for (const auto &hist : _histos)
154  if ( hist.second->numEntries() > 0 && hist.first->numEntries() > 0)
155  hist.first->scaleW(1./hist.second->val());
156  }
157 
159  void scale(float scale) {
160  for (const auto hist : _histos)
161  hist.first->scaleW(scale);
162  }
163 
165  void exec(function<void(T&)> f) { for ( auto hist : _histos) f(hist); }
166 
173  const vector<pair<shared_ptr<T>, shared_ptr<Counter> > > &
175  return _histos;
176  }
177 
178 protected:
179 
184  vector<pair<shared_ptr<T>, shared_ptr<Counter> > > _histos;
185 
186 };
187 
196 template<class T>
197 class Percentile : public PercentileTBase<T> {
198 
199 public:
200 
206  Percentile(Analysis * ana, string projName)
207  : PercentileTBase<T>(ana, projName) {}
208 
211 
214 
217 
220 
223  template<typename... Args>
224  void fill(Args... args) {
225  for (const auto bin : _activeBins) {
226  _histos[bin].first->fill(args...);
227  }
228  }
229 
232  const int nCent = _histos.size();
233  for (int iCent = 0; iCent < nCent; ++iCent) {
234  *_histos[iCent].first -= *rhs._histos[iCent].first;
235  }
236  }
237 
240  const int nCent = _histos.size();
241  for (int iCent = 0; iCent < nCent; ++iCent) {
242  *_histos[iCent].first += *rhs._histos[iCent].first;
244  }
245  }
246 
248  Percentile<T> *operator->() { return this; }
249 
251  Percentile<T> &operator->*(function<void(T&)> f) { exec(f); return *this; }
252 
253 };
254 
269 template<class T>
270 class PercentileXaxis : public PercentileTBase<T> {
271 
272 public:
273 
279  PercentileXaxis(Analysis * ana, string projName)
280  : PercentileTBase<T>(ana, projName) {}
281 
284 
287 
290 
293 
296  template<typename... Args>
297  void fill(Args... args) {
298  for (const auto bin : _activeBins) {
299  _histos[bin].first->fill(bin, args...);
300  }
301  }
302 
305  const int nCent = _histos.size();
306  for (int iCent = 0; iCent < nCent; ++iCent) {
307  *_histos[iCent].first -= *rhs._histos[iCent].first;
308  }
309  }
310 
313  const int nCent = this->_histos.size();
314  for (int iCent = 0; iCent < nCent; ++iCent) {
315  *_histos[iCent].first += *rhs._histos[iCent].first;
316  }
317  }
318 
320  PercentileXaxis<T> *operator->() { return this; }
321 
323  PercentileXaxis<T> &operator->*(function<void(T&)> f) { exec(f); return *this; }
324 
325 };
326 
328 // the underlying AnalysisObjects: global operators
329 // @{
330 
331 template <typename T>
333 divide(const Percentile<T> numer, const Percentile<T> denom) {
334  typedef typename ReferenceTraits<T>::RefT ScatT;
335  Percentile<ScatT> ret;
336  vector<typename ScatT::Ptr> scatters;
337  assert( numer.compatible(denom) );
338  for ( int i = 0, N = numer.analysisObjects().size(); i < N; ++i )
339  scatters.push_back(make_shared<ScatT>(divide(*numer.analysisObjects()[i].first,
340  *denom.analysisObjects()[i].first)));
341  ret.add(numer, scatters);
342  return ret;
343 }
344 
345 template <typename T>
347 divide(const Percentile<T> numer,
348  const Percentile<typename ReferenceTraits<T>::RefT> denom) {
349  typedef typename ReferenceTraits<T>::RefT ScatT;
350  Percentile<ScatT> ret;
351  vector<typename ScatT::Ptr> scatters;
352  assert( numer.compatible(denom) );
353  for ( int i = 0, N = numer.analysisObjects().size(); i < N; ++i )
354  scatters.push_back(make_shared<ScatT>(divide(*numer.analysisObjects()[i].first,
355  *denom.analysisObjects()[i].first)));
356  ret.add(numer, scatters);
357  return ret;
358 }
359 
360 template <typename T>
362 divide(const Percentile<typename ReferenceTraits<T>::RefT> numer,
363  const Percentile<T> denom) {
364  typedef typename ReferenceTraits<T>::RefT ScatT;
366  vector<typename ScatT::Ptr> scatters;
367  assert( numer.compatible(denom) );
368  for ( int i = 0, N = numer.analysisObjects().size(); i < N; ++i )
369  scatters.push_back(make_shared<ScatT>(divide(*numer.analysisObjects()[i].first,
370  *denom.analysisObjects()[i].first)));
371  ret.add(numer, scatters);
372  return ret;
373 }
374 
375 template <typename T>
376 Percentile<T> add(const Percentile<T> pctla, const Percentile<T> pctlb) {
377  Percentile<T> ret;
378  vector<typename T::Ptr> aos;
379  assert( pctla.compatible(pctlb) );
380  for ( int i = 0, N = pctla.analysisObjects().size(); i < N; ++i )
381  aos.push_back(make_shared<T>(add(*pctla.analysisObjects()[i].first,
382  *pctlb.analysisObjects()[i].first)));
383  ret.add(pctla, aos);
384  return ret;
385 }
386 
387 template <typename T>
389 add(const Percentile<T> pctla,
390  const Percentile<typename ReferenceTraits<T>::RefT> pctlb) {
391  typedef typename ReferenceTraits<T>::RefT ScatT;
392  Percentile<ScatT> ret;
393  vector<typename ScatT::Ptr> scatters;
394  assert( pctla.compatible(pctlb) );
395  for ( int i = 0, N = pctla.analysisObjects().size(); i < N; ++i )
396  scatters.push_back(make_shared<ScatT>(add(*pctla.analysisObjects()[i].first,
397  *pctlb.analysisObjects()[i].first)));
398  ret.add(pctla, scatters);
399  return ret;
400 }
401 
402 template <typename T>
404 add(const Percentile<typename ReferenceTraits<T>::RefT> pctla,
405  const Percentile<T> pctlb) {
406  typedef typename ReferenceTraits<T>::RefT ScatT;
407  Percentile<ScatT> ret;
408  vector<typename ScatT::Ptr> scatters;
409  assert( pctla.compatible(pctlb) );
410  for ( int i = 0, N = pctla.analysisObjects().size(); i < N; ++i )
411  scatters.push_back(make_shared<ScatT>(add(*pctla.analysisObjects()[i].first,
412  *pctlb.analysisObjects()[i].first)));
413  ret.add(pctla, scatters);
414  return ret;
415 }
416 
417 template <typename T>
418 Percentile<T> subtract(const Percentile<T> pctla, const Percentile<T> pctlb) {
419  Percentile<T> ret;
420  vector<typename T::Ptr> aos;
421  assert( pctla.compatible(pctlb) );
422  for ( int i = 0, N = pctla.analysisObjects().size(); i < N; ++i )
423  aos.push_back(make_shared<T>(subtract(*pctla.analysisObjects()[i].first,
424  *pctlb.analysisObjects()[i].first)));
425  ret.add(pctla, aos);
426  return ret;
427 }
428 
429 template <typename T>
431 subtract(const Percentile<T> pctla,
432  const Percentile<typename ReferenceTraits<T>::RefT> pctlb) {
433  typedef typename ReferenceTraits<T>::RefT ScatT;
434  Percentile<ScatT> ret;
435  vector<typename ScatT::Ptr> scatters;
436  assert( pctla.compatible(pctlb) );
437  for ( int i = 0, N = pctla.analysisObjects().size(); i < N; ++i )
438  scatters.push_back(make_shared<ScatT>(subtract(*pctla.analysisObjects()[i].first,
439  *pctlb.analysisObjects()[i].first)));
440  ret.add(pctla, scatters);
441  return ret;
442 }
443 
444 template <typename T>
446 subtract(const Percentile<typename ReferenceTraits<T>::RefT> pctla,
447  const Percentile<T> pctlb) {
448  typedef typename ReferenceTraits<T>::RefT ScatT;
449  Percentile<ScatT> ret;
450  vector<typename ScatT::Ptr> scatters;
451  assert( pctla.compatible(pctlb) );
452  for ( int i = 0, N = pctla.analysisObjects().size(); i < N; ++i )
453  scatters.push_back(make_shared<ScatT>(subtract(*pctla.analysisObjects()[i].first,
454  *pctlb.analysisObjects()[i].first)));
455  ret.add(pctla, scatters);
456  return ret;
457 }
458 
459 template <typename T>
461 multiply(const Percentile<T> pctla,
462  const Percentile<typename ReferenceTraits<T>::RefT> pctlb) {
463  typedef typename ReferenceTraits<T>::RefT ScatT;
464  Percentile<ScatT> ret;
465  vector<typename ScatT::Ptr> scatters;
466  assert( pctla.compatible(pctlb) );
467  for ( int i = 0, N = pctla.analysisObjects().size(); i < N; ++i )
468  scatters.push_back(make_shared<ScatT>(multiply(*pctla.analysisObjects()[i].first,
469  *pctlb.analysisObjects()[i].first)));
470  ret.add(pctla, scatters);
471  return ret;
472 }
473 
474 template <typename T>
476 multiply(const Percentile<typename ReferenceTraits<T>::RefT> pctla,
477  const Percentile<T> pctlb) {
478  typedef typename ReferenceTraits<T>::RefT ScatT;
479  Percentile<ScatT> ret;
480  vector<typename ScatT::Ptr> scatters;
481  assert( pctla.compatible(pctlb) );
482  for ( int i = 0, N = pctla.analysisObjects().size(); i < N; ++i )
483  scatters.push_back(make_shared<ScatT>(multiply(*pctla.analysisObjects()[i].first,
484  *pctlb.analysisObjects()[i].first)));
485  ret.add(pctla, scatters);
486  return ret;
487 }
488 
489 
490 
491 
492 template <typename T>
494 divide(const PercentileXaxis<T> numer, const PercentileXaxis<T> denom) {
495  typedef typename ReferenceTraits<T>::RefT ScatT;
497  vector<typename ScatT::Ptr> scatters;
498  assert( numer.compatible(denom) );
499  for ( int i = 0, N = numer.analysisObjects().size(); i < N; ++i )
500  scatters.push_back(make_shared<ScatT>(divide(*numer.analysisObjects()[i].first,
501  *denom.analysisObjects()[i].first)));
502  ret.add(numer, scatters);
503  return ret;
504 }
505 
506 template <typename T>
508 divide(const PercentileXaxis<T> numer,
509  const PercentileXaxis<typename ReferenceTraits<T>::RefT> denom) {
510  typedef typename ReferenceTraits<T>::RefT ScatT;
512  vector<typename ScatT::Ptr> scatters;
513  assert( numer.compatible(denom) );
514  for ( int i = 0, N = numer.analysisObjects().size(); i < N; ++i )
515  scatters.push_back(make_shared<ScatT>(divide(*numer.analysisObjects()[i].first,
516  *denom.analysisObjects()[i].first)));
517  ret.add(numer, scatters);
518  return ret;
519 }
520 
521 template <typename T>
523 divide(const PercentileXaxis<typename ReferenceTraits<T>::RefT> numer,
524  const PercentileXaxis<T> denom) {
525  typedef typename ReferenceTraits<T>::RefT ScatT;
527  vector<typename ScatT::Ptr> scatters;
528  assert( numer.compatible(denom) );
529  for ( int i = 0, N = numer.analysisObjects().size(); i < N; ++i )
530  scatters.push_back(make_shared<ScatT>(divide(*numer.analysisObjects()[i].first,
531  *denom.analysisObjects()[i].first)));
532  ret.add(numer, scatters);
533  return ret;
534 }
535 
536 template <typename T>
537 PercentileXaxis<T> add(const PercentileXaxis<T> pctla, const PercentileXaxis<T> pctlb) {
538  PercentileXaxis<T> ret;
539  vector<typename T::Ptr> aos;
540  assert( pctla.compatible(pctlb) );
541  for ( int i = 0, N = pctla.analysisObjects().size(); i < N; ++i )
542  aos.push_back(make_shared<T>(add(*pctla.analysisObjects()[i].first,
543  *pctlb.analysisObjects()[i].first)));
544  ret.add(pctla, aos);
545  return ret;
546 }
547 
548 template <typename T>
550 add(const PercentileXaxis<T> pctla,
551  const PercentileXaxis<typename ReferenceTraits<T>::RefT> pctlb) {
552  typedef typename ReferenceTraits<T>::RefT ScatT;
554  vector<typename ScatT::Ptr> scatters;
555  assert( pctla.compatible(pctlb) );
556  for ( int i = 0, N = pctla.analysisObjects().size(); i < N; ++i )
557  scatters.push_back(make_shared<ScatT>(add(*pctla.analysisObjects()[i].first,
558  *pctlb.analysisObjects()[i].first)));
559  ret.add(pctla, scatters);
560  return ret;
561 }
562 
563 template <typename T>
565 add(const PercentileXaxis<typename ReferenceTraits<T>::RefT> pctla,
566  const PercentileXaxis<T> pctlb) {
567  typedef typename ReferenceTraits<T>::RefT ScatT;
569  vector<typename ScatT::Ptr> scatters;
570  assert( pctla.compatible(pctlb) );
571  for ( int i = 0, N = pctla.analysisObjects().size(); i < N; ++i )
572  scatters.push_back(make_shared<ScatT>(add(*pctla.analysisObjects()[i].first,
573  *pctlb.analysisObjects()[i].first)));
574  ret.add(pctla, scatters);
575  return ret;
576 }
577 
578 template <typename T>
579 PercentileXaxis<T> subtract(const PercentileXaxis<T> pctla, const PercentileXaxis<T> pctlb) {
580  PercentileXaxis<T> ret;
581  vector<typename T::Ptr> aos;
582  assert( pctla.compatible(pctlb) );
583  for ( int i = 0, N = pctla.analysisObjects().size(); i < N; ++i )
584  aos.push_back(make_shared<T>(subtract(*pctla.analysisObjects()[i].first,
585  *pctlb.analysisObjects()[i].first)));
586  ret.add(pctla, aos);
587  return ret;
588 }
589 
590 template <typename T>
592 subtract(const PercentileXaxis<T> pctla,
593  const PercentileXaxis<typename ReferenceTraits<T>::RefT> pctlb) {
594  typedef typename ReferenceTraits<T>::RefT ScatT;
596  vector<typename ScatT::Ptr> scatters;
597  assert( pctla.compatible(pctlb) );
598  for ( int i = 0, N = pctla.analysisObjects().size(); i < N; ++i )
599  scatters.push_back(make_shared<ScatT>(subtract(*pctla.analysisObjects()[i].first,
600  *pctlb.analysisObjects()[i].first)));
601  ret.add(pctla, scatters);
602  return ret;
603 }
604 
605 template <typename T>
607 subtract(const PercentileXaxis<typename ReferenceTraits<T>::RefT> pctla,
608  const PercentileXaxis<T> pctlb) {
609  typedef typename ReferenceTraits<T>::RefT ScatT;
611  vector<typename ScatT::Ptr> scatters;
612  assert( pctla.compatible(pctlb) );
613  for ( int i = 0, N = pctla.analysisObjects().size(); i < N; ++i )
614  scatters.push_back(make_shared<ScatT>(subtract(*pctla.analysisObjects()[i].first,
615  *pctlb.analysisObjects()[i].first)));
616  ret.add(pctla, scatters);
617  return ret;
618 }
619 
620 template <typename T>
622 multiply(const PercentileXaxis<T> pctla,
623  const PercentileXaxis<typename ReferenceTraits<T>::RefT> pctlb) {
624  typedef typename ReferenceTraits<T>::RefT ScatT;
626  vector<typename ScatT::Ptr> scatters;
627  assert( pctla.compatible(pctlb) );
628  for ( int i = 0, N = pctla.analysisObjects().size(); i < N; ++i )
629  scatters.push_back(make_shared<ScatT>(multiply(*pctla.analysisObjects()[i].first,
630  *pctlb.analysisObjects()[i].first)));
631  ret.add(pctla, scatters);
632  return ret;
633 }
634 
635 template <typename T>
637 multiply(const PercentileXaxis<typename ReferenceTraits<T>::RefT> pctla,
638  const PercentileXaxis<T> pctlb) {
639  typedef typename ReferenceTraits<T>::RefT ScatT;
641  vector<typename ScatT::Ptr> scatters;
642  assert( pctla.compatible(pctlb) );
643  for ( int i = 0, N = pctla.analysisObjects().size(); i < N; ++i )
644  scatters.push_back(make_shared<ScatT>(multiply(*pctla.analysisObjects()[i].first,
645  *pctlb.analysisObjects()[i].first)));
646  ret.add(pctla, scatters);
647  return ret;
648 }
649 
650 template <typename T>
652 operator+(const Percentile<T> pctla, const Percentile<T> pctlb) {
653  return add(pctla, pctlb);
654 }
655 
656 template <typename T>
658 operator-(const Percentile<T> pctla, const Percentile<T> pctlb) {
659  return subtract(pctla, pctlb);
660 }
661 
662 template <typename T>
664 operator/(const Percentile<T> numer, const Percentile<T> denom) {
665  return divide(numer, denom);
666 }
667 
668 template <typename T>
670 operator+(const PercentileXaxis<T> pctla, const PercentileXaxis<T> pctlb) {
671  return add(pctla, pctlb);
672 }
673 
674 template <typename T>
676 operator-(const PercentileXaxis<T> pctla, const PercentileXaxis<T> pctlb) {
677  return subtract(pctla, pctlb);
678 }
679 
680 template <typename T>
682 operator/(const PercentileXaxis<T> numer, const PercentileXaxis<T> denom) {
683  return divide(numer, denom);
684 }
685 
686 }
687 
688 #endif
Definition: ALICE_2010_I880049.cc:13
Percentile< T > & operator-=(const Percentile< T > &rhs)
Subtract the contents fro another Pecentile.
Definition: Percentile.hh:231
~Percentile()
Empty destructor.
Definition: Percentile.hh:213
void fill(Args... args)
Definition: Percentile.hh:297
bool add(const PercentileBase &other, const vector< TPtr > &tv)
Copy the information from an other Percentile object.
Definition: Percentile.hh:130
Percentile(Analysis *ana, string projName)
the main constructor
Definition: Percentile.hh:206
void exec(function< void(T &)> f)
Execute a function for each AnalysisObject.
Definition: Percentile.hh:165
void copyFrom(const PercentileBase &other)
Copy information from other PercentileBase.
Definition: Percentile.hh:45
void scale(float scale)
Simple scaling of each AnalysisObject.
Definition: Percentile.hh:159
static bool inRange(double x, pair< float, float > range)
Helper function to check if x is within range.
Definition: Percentile.hh:41
PercentileTBase(Analysis *ana, string projName)
the main constructor
Definition: Percentile.hh:101
void add(shared_ptr< T > ao, CounterPtr cnt, pair< float, float > cent={0.0, 100.0})
add a new percentile bin.
Definition: Percentile.hh:119
Definition: RivetYODA.hh:54
The Percentile class for centrality binning.
Definition: Percentile.hh:197
const vector< pair< float, float > > & centralities() const
Definition: Percentile.hh:62
PercentileBase(Analysis *ana, string projName)
the main constructor
Definition: Percentile.hh:27
Percentile()
Default constructor.
Definition: Percentile.hh:210
~PercentileXaxis()
Empty destructor.
Definition: Percentile.hh:286
PercentileTBase is the base class of all Percentile classes.
Definition: Percentile.hh:89
This is the base class of all analysis classes in Rivet.
Definition: Analysis.hh:52
Definition: Event.hh:22
T::Ptr TPtr
Convenient typedef.
Definition: Percentile.hh:94
PercentileBase()
Default constructor.
Definition: Percentile.hh:31
The PercentileXaxis class for centrality binning.
Definition: Percentile.hh:270
Percentile< T > & operator+=(const Percentile< T > &rhs)
Add the contents fro another Pecentile.
Definition: Percentile.hh:239
double weight() const
The generation weight associated with the event.
Definition: Event.cc:11
~PercentileTBase()
Empty destructor.
Definition: Percentile.hh:108
bool compatible(const PercentileBase &other) const
check if other PercentileBase is compatible with this.
Definition: Percentile.hh:52
PercentileXaxis< T > & operator-=(const PercentileXaxis< T > &rhs)
Subtract the contents fro another PecentileXaxis.
Definition: Percentile.hh:304
PercentileXaxis(Analysis *ana, string projName)
the main constructor
Definition: Percentile.hh:279
Percentile< T > * operator->()
Make this object look like a pointer.
Definition: Percentile.hh:248
PercentileXaxis()
Default constructor.
Definition: Percentile.hh:283
void normalizePerEvent()
Normalize each AnalysisObject.
Definition: Percentile.hh:152
const vector< pair< shared_ptr< T >, shared_ptr< Counter > > > & analysisObjects() const
Access the underlyng AnalysisObjects.
Definition: Percentile.hh:174
PercentileTBase()
Default constructor.
Definition: Percentile.hh:105
PercentileXaxis< T > * operator->()
Make this object look like a pointer.
Definition: Percentile.hh:320
void fill(Args... args)
Definition: Percentile.hh:224
PercentileXaxis< T > & operator+=(const PercentileXaxis< T > &rhs)
Add the contents fro another PecentileXaxis.
Definition: Percentile.hh:312
PercentileBase is the base class of all Percentile classes.
Definition: Percentile.hh:18
bool init(const Event &event)
initialize for a new event. Select which AnalysisObjects should be filled for this event...
Definition: Percentile.hh:141
void selectBins(const Event &)
Definition: Percentile.cc:9