ROOT logo
/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 * @(#)root/roofitcore:$Id: RooChi2MCSModule.cxx 28963 2009-06-12 15:47:45Z wouter $
 * Authors:                                                                  *
 *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
 *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
 *                                                                           *
 * Copyright (c) 2000-2005, Regents of the University of California          *
 *                          and Stanford University. All rights reserved.    *
 *                                                                           *
 * Redistribution and use in source and binary forms,                        *
 * with or without modification, are permitted according to the terms        *
 * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
 *****************************************************************************/

//////////////////////////////////////////////////////////////////////////////
// 
// BEGIN_HTML
// RooChi2MCSModule is an add-on modules to RooMCStudy that
// calculates the chi-squared of fitted p.d.f with respect to a binned
// version of the data. For each fit the chi-squared, the reduced chi-squared
// the number of degrees of freedom and the probability of the chi-squared
// is store in the summary dataset
// END_HTML
//
//

#include "Riostream.h"

#include "RooDataSet.h"
#include "RooRealVar.h"
#include "TString.h"
#include "RooFit.h"
#include "RooFitResult.h"
#include "RooChi2MCSModule.h"
#include "RooMsgService.h"
#include "RooChi2Var.h"
#include "RooDataHist.h"
#include "TMath.h"
#include "RooGlobalFunc.h"



ClassImp(RooChi2MCSModule)
  ;



//_____________________________________________________________________________
RooChi2MCSModule::RooChi2MCSModule() : 
  RooAbsMCStudyModule("RooChi2MCSModule","RooChi2Module"),
  _data(0), _chi2(0), _ndof(0), _chi2red(0), _prob(0)

{
  // Constructor of module 
}




//_____________________________________________________________________________
RooChi2MCSModule::RooChi2MCSModule(const RooChi2MCSModule& other) : 
  RooAbsMCStudyModule(other), 
  _data(0), _chi2(0), _ndof(0), _chi2red(0), _prob(0)
{
  // Copy constructor
}



//_____________________________________________________________________________
RooChi2MCSModule:: ~RooChi2MCSModule() 
{
  // Destructor

  if (_chi2) {
    delete _chi2 ;
  }
  if (_ndof) {
    delete _ndof ;
  }
  if (_chi2red) {
    delete _chi2red ;
  }
  if (_prob) {
    delete _prob ;
  }
  if (_data) {
    delete _data ;
  }
}



//_____________________________________________________________________________
Bool_t RooChi2MCSModule::initializeInstance()
{
  // Initialize module after attachment to RooMCStudy object

  // Construct variable that holds -log(L) fit with null hypothesis for given parameter
  _chi2     = new RooRealVar("chi2","chi^2",0) ;
  _ndof     = new RooRealVar("ndof","number of degrees of freedom",0) ;   
  _chi2red  = new RooRealVar("chi2red","reduced chi^2",0) ; 
  _prob     = new RooRealVar("prob","prob(chi2,ndof)",0) ;

  // Create new dataset to be merged with RooMCStudy::fitParDataSet
  _data = new RooDataSet("Chi2Data","Additional data for Chi2 study",RooArgSet(*_chi2,*_ndof,*_chi2red,*_prob)) ;

  return kTRUE ;
}



//_____________________________________________________________________________
Bool_t RooChi2MCSModule::initializeRun(Int_t /*numSamples*/) 
{
  // Initialize module at beginning of RooCMStudy run

  _data->reset() ;
  return kTRUE ;
}



//_____________________________________________________________________________
RooDataSet* RooChi2MCSModule::finalizeRun() 
{
  // Return auxiliary dataset with results of chi2 analysis
  // calculations of this module so that it is merged with
  // RooMCStudy::fitParDataSet() by RooMCStudy

  return _data ;
}



//_____________________________________________________________________________
Bool_t RooChi2MCSModule::processAfterFit(Int_t /*sampleNum*/)  
{
  // Bin dataset and calculate chi2 of p.d.f w.r.t binned dataset

  RooAbsData* data = genSample() ;
  RooDataHist* binnedData = dynamic_cast<RooDataHist*>(data) ;
  Bool_t deleteData(kFALSE) ;
  if (!binnedData) {
    deleteData = kTRUE ;
    binnedData = ((RooDataSet*)data)->binnedClone() ;
  }

  RooChi2Var chi2Var("chi2Var","chi2Var",*fitModel(),*binnedData,RooFit::Extended(extendedGen()),RooFit::DataError(RooAbsData::SumW2)) ;

  RooArgSet* floatPars = (RooArgSet*) fitParams()->selectByAttrib("Constant",kFALSE) ;  

  _chi2->setVal(chi2Var.getVal()) ;
  _ndof->setVal(binnedData->numEntries()-floatPars->getSize()-1) ; 
  _chi2red->setVal(_chi2->getVal()/_ndof->getVal()) ;
  _prob->setVal(TMath::Prob(_chi2->getVal(),static_cast<int>(_ndof->getVal()))) ;

  _data->add(RooArgSet(*_chi2,*_ndof,*_chi2red,*_prob)) ;

  if (deleteData) {
    delete binnedData ;
  }
  delete floatPars ;

  return kTRUE ;
}
 RooChi2MCSModule.cxx:1
 RooChi2MCSModule.cxx:2
 RooChi2MCSModule.cxx:3
 RooChi2MCSModule.cxx:4
 RooChi2MCSModule.cxx:5
 RooChi2MCSModule.cxx:6
 RooChi2MCSModule.cxx:7
 RooChi2MCSModule.cxx:8
 RooChi2MCSModule.cxx:9
 RooChi2MCSModule.cxx:10
 RooChi2MCSModule.cxx:11
 RooChi2MCSModule.cxx:12
 RooChi2MCSModule.cxx:13
 RooChi2MCSModule.cxx:14
 RooChi2MCSModule.cxx:15
 RooChi2MCSModule.cxx:16
 RooChi2MCSModule.cxx:17
 RooChi2MCSModule.cxx:18
 RooChi2MCSModule.cxx:19
 RooChi2MCSModule.cxx:20
 RooChi2MCSModule.cxx:21
 RooChi2MCSModule.cxx:22
 RooChi2MCSModule.cxx:23
 RooChi2MCSModule.cxx:24
 RooChi2MCSModule.cxx:25
 RooChi2MCSModule.cxx:26
 RooChi2MCSModule.cxx:27
 RooChi2MCSModule.cxx:28
 RooChi2MCSModule.cxx:29
 RooChi2MCSModule.cxx:30
 RooChi2MCSModule.cxx:31
 RooChi2MCSModule.cxx:32
 RooChi2MCSModule.cxx:33
 RooChi2MCSModule.cxx:34
 RooChi2MCSModule.cxx:35
 RooChi2MCSModule.cxx:36
 RooChi2MCSModule.cxx:37
 RooChi2MCSModule.cxx:38
 RooChi2MCSModule.cxx:39
 RooChi2MCSModule.cxx:40
 RooChi2MCSModule.cxx:41
 RooChi2MCSModule.cxx:42
 RooChi2MCSModule.cxx:43
 RooChi2MCSModule.cxx:44
 RooChi2MCSModule.cxx:45
 RooChi2MCSModule.cxx:46
 RooChi2MCSModule.cxx:47
 RooChi2MCSModule.cxx:48
 RooChi2MCSModule.cxx:49
 RooChi2MCSModule.cxx:50
 RooChi2MCSModule.cxx:51
 RooChi2MCSModule.cxx:52
 RooChi2MCSModule.cxx:53
 RooChi2MCSModule.cxx:54
 RooChi2MCSModule.cxx:55
 RooChi2MCSModule.cxx:56
 RooChi2MCSModule.cxx:57
 RooChi2MCSModule.cxx:58
 RooChi2MCSModule.cxx:59
 RooChi2MCSModule.cxx:60
 RooChi2MCSModule.cxx:61
 RooChi2MCSModule.cxx:62
 RooChi2MCSModule.cxx:63
 RooChi2MCSModule.cxx:64
 RooChi2MCSModule.cxx:65
 RooChi2MCSModule.cxx:66
 RooChi2MCSModule.cxx:67
 RooChi2MCSModule.cxx:68
 RooChi2MCSModule.cxx:69
 RooChi2MCSModule.cxx:70
 RooChi2MCSModule.cxx:71
 RooChi2MCSModule.cxx:72
 RooChi2MCSModule.cxx:73
 RooChi2MCSModule.cxx:74
 RooChi2MCSModule.cxx:75
 RooChi2MCSModule.cxx:76
 RooChi2MCSModule.cxx:77
 RooChi2MCSModule.cxx:78
 RooChi2MCSModule.cxx:79
 RooChi2MCSModule.cxx:80
 RooChi2MCSModule.cxx:81
 RooChi2MCSModule.cxx:82
 RooChi2MCSModule.cxx:83
 RooChi2MCSModule.cxx:84
 RooChi2MCSModule.cxx:85
 RooChi2MCSModule.cxx:86
 RooChi2MCSModule.cxx:87
 RooChi2MCSModule.cxx:88
 RooChi2MCSModule.cxx:89
 RooChi2MCSModule.cxx:90
 RooChi2MCSModule.cxx:91
 RooChi2MCSModule.cxx:92
 RooChi2MCSModule.cxx:93
 RooChi2MCSModule.cxx:94
 RooChi2MCSModule.cxx:95
 RooChi2MCSModule.cxx:96
 RooChi2MCSModule.cxx:97
 RooChi2MCSModule.cxx:98
 RooChi2MCSModule.cxx:99
 RooChi2MCSModule.cxx:100
 RooChi2MCSModule.cxx:101
 RooChi2MCSModule.cxx:102
 RooChi2MCSModule.cxx:103
 RooChi2MCSModule.cxx:104
 RooChi2MCSModule.cxx:105
 RooChi2MCSModule.cxx:106
 RooChi2MCSModule.cxx:107
 RooChi2MCSModule.cxx:108
 RooChi2MCSModule.cxx:109
 RooChi2MCSModule.cxx:110
 RooChi2MCSModule.cxx:111
 RooChi2MCSModule.cxx:112
 RooChi2MCSModule.cxx:113
 RooChi2MCSModule.cxx:114
 RooChi2MCSModule.cxx:115
 RooChi2MCSModule.cxx:116
 RooChi2MCSModule.cxx:117
 RooChi2MCSModule.cxx:118
 RooChi2MCSModule.cxx:119
 RooChi2MCSModule.cxx:120
 RooChi2MCSModule.cxx:121
 RooChi2MCSModule.cxx:122
 RooChi2MCSModule.cxx:123
 RooChi2MCSModule.cxx:124
 RooChi2MCSModule.cxx:125
 RooChi2MCSModule.cxx:126
 RooChi2MCSModule.cxx:127
 RooChi2MCSModule.cxx:128
 RooChi2MCSModule.cxx:129
 RooChi2MCSModule.cxx:130
 RooChi2MCSModule.cxx:131
 RooChi2MCSModule.cxx:132
 RooChi2MCSModule.cxx:133
 RooChi2MCSModule.cxx:134
 RooChi2MCSModule.cxx:135
 RooChi2MCSModule.cxx:136
 RooChi2MCSModule.cxx:137
 RooChi2MCSModule.cxx:138
 RooChi2MCSModule.cxx:139
 RooChi2MCSModule.cxx:140
 RooChi2MCSModule.cxx:141
 RooChi2MCSModule.cxx:142
 RooChi2MCSModule.cxx:143
 RooChi2MCSModule.cxx:144
 RooChi2MCSModule.cxx:145
 RooChi2MCSModule.cxx:146
 RooChi2MCSModule.cxx:147
 RooChi2MCSModule.cxx:148
 RooChi2MCSModule.cxx:149
 RooChi2MCSModule.cxx:150
 RooChi2MCSModule.cxx:151
 RooChi2MCSModule.cxx:152
 RooChi2MCSModule.cxx:153
 RooChi2MCSModule.cxx:154
 RooChi2MCSModule.cxx:155
 RooChi2MCSModule.cxx:156
 RooChi2MCSModule.cxx:157
 RooChi2MCSModule.cxx:158
 RooChi2MCSModule.cxx:159
 RooChi2MCSModule.cxx:160
 RooChi2MCSModule.cxx:161
 RooChi2MCSModule.cxx:162
 RooChi2MCSModule.cxx:163
 RooChi2MCSModule.cxx:164
 RooChi2MCSModule.cxx:165
 RooChi2MCSModule.cxx:166
 RooChi2MCSModule.cxx:167
 RooChi2MCSModule.cxx:168