// @(#)root/roostats:$Id$
// Author: Kyle Cranmer, Lorenzo Moneta, Gregory Schott, Wouter Verkerke
/*************************************************************************
 * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOSTATS_NumEventsTestStat
#define ROOSTATS_NumEventsTestStat

//_________________________________________________
/*
BEGIN_HTML
<p>
NumEventsTestStat is a simple implementation of the TestStatistic interface used for simple number counting.
It should probably support simple cuts as well.
</p>
END_HTML
*/
//

#ifndef ROOT_Rtypes
#include "Rtypes.h"
#endif


#ifndef ROO_REAL_VAR
#include "RooRealVar.h"
#endif

#ifndef ROO_ABS_DATA
#include "RooAbsData.h"
#endif

#ifndef ROO_ABS_PDF
#include "RooAbsPdf.h"
#endif

#ifndef ROOSTATS_TestStatistic
#include "RooStats/TestStatistic.h"
#endif


//#include "RooStats/DistributionCreator.h"


namespace RooStats {

  class NumEventsTestStat : public TestStatistic{

   public:
     NumEventsTestStat() : fPdf(0) { }
     NumEventsTestStat(RooAbsPdf& pdf) {
       fPdf = &pdf;
     }
     virtual ~NumEventsTestStat() {
       //       delete fRand;
       //       delete fTestStatistic;
     }
    
     // Main interface to evaluate the test statistic on a dataset
     virtual Double_t Evaluate(RooAbsData& data, RooArgSet& /*paramsOfInterest*/)  {       
      
         if(data.isWeighted()) {
            return data.sumEntries();
         }
 
         // if no pdf is given in the constructor, we assume by default it can be extended
         if (!fPdf || fPdf->canBeExtended()) {
            return data.numEntries();
         } 
          
         // data is not weighted as pdf cannot be extended 
         if(data.numEntries() == 1) { 

            const RooArgSet *obsSet = data.get(0);
            RooLinkedListIter iter = obsSet->iterator();

            RooRealVar *obs = NULL; Double_t numEvents = 0.0;
            while((obs = (RooRealVar *)iter.Next()) != NULL) {
               numEvents += obs->getValV();
            }
            return numEvents;
         }

         std::cout << "Data set is invalid" << std::endl;
         return 0;
     }

      // Get the TestStatistic
      virtual const RooAbsArg* GetTestStatistic()  const {return fPdf;}  

      virtual const TString GetVarName() const {return "Number of events";}
    
      
   private:
      RooAbsPdf* fPdf;

   protected:
      ClassDef(NumEventsTestStat,1)   
   };

}


#endif
 NumEventsTestStat.h:1
 NumEventsTestStat.h:2
 NumEventsTestStat.h:3
 NumEventsTestStat.h:4
 NumEventsTestStat.h:5
 NumEventsTestStat.h:6
 NumEventsTestStat.h:7
 NumEventsTestStat.h:8
 NumEventsTestStat.h:9
 NumEventsTestStat.h:10
 NumEventsTestStat.h:11
 NumEventsTestStat.h:12
 NumEventsTestStat.h:13
 NumEventsTestStat.h:14
 NumEventsTestStat.h:15
 NumEventsTestStat.h:16
 NumEventsTestStat.h:17
 NumEventsTestStat.h:18
 NumEventsTestStat.h:19
 NumEventsTestStat.h:20
 NumEventsTestStat.h:21
 NumEventsTestStat.h:22
 NumEventsTestStat.h:23
 NumEventsTestStat.h:24
 NumEventsTestStat.h:25
 NumEventsTestStat.h:26
 NumEventsTestStat.h:27
 NumEventsTestStat.h:28
 NumEventsTestStat.h:29
 NumEventsTestStat.h:30
 NumEventsTestStat.h:31
 NumEventsTestStat.h:32
 NumEventsTestStat.h:33
 NumEventsTestStat.h:34
 NumEventsTestStat.h:35
 NumEventsTestStat.h:36
 NumEventsTestStat.h:37
 NumEventsTestStat.h:38
 NumEventsTestStat.h:39
 NumEventsTestStat.h:40
 NumEventsTestStat.h:41
 NumEventsTestStat.h:42
 NumEventsTestStat.h:43
 NumEventsTestStat.h:44
 NumEventsTestStat.h:45
 NumEventsTestStat.h:46
 NumEventsTestStat.h:47
 NumEventsTestStat.h:48
 NumEventsTestStat.h:49
 NumEventsTestStat.h:50
 NumEventsTestStat.h:51
 NumEventsTestStat.h:52
 NumEventsTestStat.h:53
 NumEventsTestStat.h:54
 NumEventsTestStat.h:55
 NumEventsTestStat.h:56
 NumEventsTestStat.h:57
 NumEventsTestStat.h:58
 NumEventsTestStat.h:59
 NumEventsTestStat.h:60
 NumEventsTestStat.h:61
 NumEventsTestStat.h:62
 NumEventsTestStat.h:63
 NumEventsTestStat.h:64
 NumEventsTestStat.h:65
 NumEventsTestStat.h:66
 NumEventsTestStat.h:67
 NumEventsTestStat.h:68
 NumEventsTestStat.h:69
 NumEventsTestStat.h:70
 NumEventsTestStat.h:71
 NumEventsTestStat.h:72
 NumEventsTestStat.h:73
 NumEventsTestStat.h:74
 NumEventsTestStat.h:75
 NumEventsTestStat.h:76
 NumEventsTestStat.h:77
 NumEventsTestStat.h:78
 NumEventsTestStat.h:79
 NumEventsTestStat.h:80
 NumEventsTestStat.h:81
 NumEventsTestStat.h:82
 NumEventsTestStat.h:83
 NumEventsTestStat.h:84
 NumEventsTestStat.h:85
 NumEventsTestStat.h:86
 NumEventsTestStat.h:87
 NumEventsTestStat.h:88
 NumEventsTestStat.h:89
 NumEventsTestStat.h:90
 NumEventsTestStat.h:91
 NumEventsTestStat.h:92
 NumEventsTestStat.h:93
 NumEventsTestStat.h:94
 NumEventsTestStat.h:95
 NumEventsTestStat.h:96
 NumEventsTestStat.h:97
 NumEventsTestStat.h:98
 NumEventsTestStat.h:99
 NumEventsTestStat.h:100
 NumEventsTestStat.h:101
 NumEventsTestStat.h:102
 NumEventsTestStat.h:103
 NumEventsTestStat.h:104
 NumEventsTestStat.h:105
 NumEventsTestStat.h:106
 NumEventsTestStat.h:107
 NumEventsTestStat.h:108
 NumEventsTestStat.h:109