Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
RooDataWeightedAverage.cxx
Go to the documentation of this file.
1 /*****************************************************************************
2  * Project: RooFit *
3  * Package: RooFitCore *
4  * @(#)root/roofitcore:$Id$
5  * Authors: *
6  * WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu *
7  * DK, David Kirkby, UC Irvine, dkirkby@uci.edu *
8  * *
9  * Copyright (c) 2000-2005, Regents of the University of California *
10  * and Stanford University. All rights reserved. *
11  * *
12  * Redistribution and use in source and binary forms, *
13  * with or without modification, are permitted according to the terms *
14  * listed in LICENSE (http://roofit.sourceforge.net/license.txt) *
15  *****************************************************************************/
16 
17 /**
18 \file RooDataWeightedAverage.cxx
19 \class RooDataWeightedAverage
20 \ingroup Roofitcore
21 
22 Class RooDataWeightedAverage calculate a weighted
23 average of a function or p.d.f given a dataset with observable
24 values, i.e. DWA(f(x),D(x)) = sum_i f(x_i) where x_i is draw from
25 D(i). This class is an implementation of RooAbsOptTestStatistics
26 can make use of the optimization and parallization infrastructure
27 of that base class. The main use of RooDataWeightedAverage is
28 to calculate curves in RooPlots that are added with ProjWData()
29 plot option.
30 
31 **/
32 
33 #include "RooFit.h"
34 #include "Riostream.h"
35 
36 #include "RooDataWeightedAverage.h"
37 #include "RooAbsData.h"
38 #include "RooAbsPdf.h"
39 #include "RooCmdConfig.h"
40 #include "RooMsgService.h"
41 #include "RooAbsDataStore.h"
42 
43 
44 
45 using namespace std;
46 
47 ClassImp(RooDataWeightedAverage);
48 ;
49 
50 
51 ////////////////////////////////////////////////////////////////////////////////
52 /// Constructor of data weighted average of given p.d.f over given data. If nCPU>1 the calculation is parallelized
53 /// over multuple processes. If showProgress is true a progress indicator printing a single dot for each evaluation
54 /// is shown. If interleave is true, the dataset split over multiple processes is done with an interleave pattern
55 /// rather than a bulk-split pattern.
56 
57 RooDataWeightedAverage::RooDataWeightedAverage(const char *name, const char *title, RooAbsReal& pdf, RooAbsData& indata,
58  const RooArgSet& projdeps, Int_t nCPU, RooFit::MPSplit interleave, Bool_t showProgress, Bool_t verbose) :
59  RooAbsOptTestStatistic(name,title,pdf,indata,projdeps,0,0,nCPU,interleave,verbose,kFALSE),
60  _showProgress(showProgress)
61 {
62  if (_showProgress) {
63  coutI(Plotting) << "RooDataWeightedAverage::ctor(" << GetName() << ") constructing data weighted average of function " << pdf.GetName()
64  << " over " << indata.numEntries() << " data points of " << *(indata.get()) << " with a total weight of " << indata.sumEntries() << endl ;
65  }
66  _sumWeight = indata.sumEntries() ;
67 }
68 
69 
70 ////////////////////////////////////////////////////////////////////////////////
71 /// Copy constructor
72 
73 RooDataWeightedAverage::RooDataWeightedAverage(const RooDataWeightedAverage& other, const char* name) :
74  RooAbsOptTestStatistic(other,name),
75  _sumWeight(other._sumWeight),
76  _showProgress(other._showProgress)
77 {
78 }
79 
80 
81 
82 ////////////////////////////////////////////////////////////////////////////////
83 /// Destructor
84 
85 RooDataWeightedAverage::~RooDataWeightedAverage()
86 {
87 }
88 
89 
90 
91 ////////////////////////////////////////////////////////////////////////////////
92 /// Return global normalization term by which raw (combined) test statistic should
93 /// be defined to obtain final test statistic. For a data weighted avarage this
94 /// the the sum of all weights
95 
96 Double_t RooDataWeightedAverage::globalNormalization() const
97 {
98  return _sumWeight ;
99 }
100 
101 
102 
103 ////////////////////////////////////////////////////////////////////////////////
104 /// Calculate the data weighted average for events [firstEVent,lastEvent] with step size stepSize
105 
106 Double_t RooDataWeightedAverage::evaluatePartition(std::size_t firstEvent, std::size_t lastEvent, std::size_t stepSize) const
107 {
108  Double_t result(0) ;
109 
110  _dataClone->store()->recalculateCache( _projDeps, firstEvent, lastEvent, stepSize,kFALSE) ;
111 
112  if (setNum()==0 && _showProgress) {
113  ccoutP(Plotting) << "." ;
114  cout.flush() ;
115  }
116 
117  for (auto i=firstEvent ; i<lastEvent ; i+=stepSize) {
118 
119  // get the data values for this event
120  _dataClone->get(i);
121  if (_dataClone->weight()==0) continue ;
122 
123  Double_t term = _dataClone->weight() * _funcClone->getVal(_normSet);
124  result += term;
125  }
126 
127  return result ;
128 }
129 
130 
131