ROOT logo
/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 * @(#)root/roofitcore:$Id: RooDLLSignificanceMCSModule.cxx 26174 2008-11-13 08:25:25Z 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
// RooDLLSignificanceMCSModule is an add-on modules to RooMCStudy that
// calculates the significance of a signal by comparing the likelihood of
// a fit fit with a given parameter floating with a fit with that given
// parameter fixed to a nominal value (usually zero). The difference in
// the -log(L) of those two fits can be interpreted as the probability
// that a statistical background fluctation may result in a signal as large
// or larger than the signal observed. This interpretation is contingent
// on underlying normal sampling distributions and a MC study is a good way
// to test that assumption.
// END_HTML
//
//

#include "Riostream.h"

#include "RooDataSet.h"
#include "RooRealVar.h"
#include "TString.h"
#include "RooFit.h"
#include "RooFitResult.h"
#include "RooDLLSignificanceMCSModule.h"
#include "RooMsgService.h"



ClassImp(RooDLLSignificanceMCSModule)
  ;



//_____________________________________________________________________________
RooDLLSignificanceMCSModule::RooDLLSignificanceMCSModule(const RooRealVar& param, Double_t nullHypoValue) : 
  RooAbsMCStudyModule(Form("RooDLLSignificanceMCSModule_%s",param.GetName()),Form("RooDLLSignificanceMCSModule_%s",param.GetName())),
  _parName(param.GetName()), 
  _data(0), _nll0h(0), _dll0h(0), _sig0h(0), _nullValue(nullHypoValue)
{
  // Constructor of module with parameter to be interpreted as nSignal and the value of the
  // null hypothesis for nSignal (usually zero)
}



//_____________________________________________________________________________
RooDLLSignificanceMCSModule::RooDLLSignificanceMCSModule(const char* parName, Double_t nullHypoValue) :
  RooAbsMCStudyModule(Form("RooDLLSignificanceMCSModule_%s",parName),Form("RooDLLSignificanceMCSModule_%s",parName)),
  _parName(parName), 
  _data(0), _nll0h(0), _dll0h(0), _sig0h(0), _nullValue(nullHypoValue)
{
  // Constructor of module with parameter name to be interpreted as nSignal and the value of the
  // null hypothesis for nSignal (usually zero)
}



//_____________________________________________________________________________
RooDLLSignificanceMCSModule::RooDLLSignificanceMCSModule(const RooDLLSignificanceMCSModule& other) : 
  RooAbsMCStudyModule(other), 
  _parName(other._parName),
  _data(0), _nll0h(0), _dll0h(0), _sig0h(0), _nullValue(other._nullValue)
{
  // Copy constructor
}



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

  if (_nll0h) {
    delete _nll0h ;
  }    
  if (_dll0h) {
    delete _dll0h ;
  }    
  if (_sig0h) {
    delete _sig0h ;
  }
  if (_data) {
    delete _data ;
  }
}



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

  // Check that parameter is also present in fit parameter list of RooMCStudy object
  if (!fitParams()->find(_parName.c_str())) {
    coutE(InputArguments) << "RooDLLSignificanceMCSModule::initializeInstance:: ERROR: No parameter named " << _parName << " in RooMCStudy!" << endl ;
    return kFALSE ;
  }

  // Construct variable that holds -log(L) fit with null hypothesis for given parameter
  TString nll0hName = Form("nll_nullhypo_%s",_parName.c_str()) ;
  TString nll0hTitle = Form("-log(L) with null hypothesis for param %s",_parName.c_str()) ;
  _nll0h = new RooRealVar(nll0hName.Data(),nll0hTitle.Data(),0) ;

  // Construct variable that holds -log(L) fit with null hypothesis for given parameter
  TString dll0hName = Form("dll_nullhypo_%s",_parName.c_str()) ;
  TString dll0hTitle = Form("-log(L) difference w.r.t null hypo for param %s",_parName.c_str()) ;
  _dll0h = new RooRealVar(dll0hName.Data(),dll0hTitle.Data(),0) ;

  // Construct variable that holds significance corresponding to delta(-log(L)) w.r.t to null hypothesis for given parameter
  TString sig0hName = Form("significance_nullhypo_%s",_parName.c_str()) ;
  TString sig0hTitle = Form("Gaussian signficiance of Delta(-log(L)) w.r.t null hypo for param %s",_parName.c_str()) ;
  _sig0h = new RooRealVar(sig0hName.Data(),sig0hTitle.Data(),-10,100) ;

  // Create new dataset to be merged with RooMCStudy::fitParDataSet
  _data = new RooDataSet("DeltaLLSigData","Additional data for Delta(-log(L)) study",RooArgSet(*_nll0h,*_dll0h,*_sig0h)) ;

  return kTRUE ;
}



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

  _data->reset() ;
  return kTRUE ;
}



//_____________________________________________________________________________
RooDataSet* RooDLLSignificanceMCSModule::finalizeRun() 
{
  // Return auxiliary dataset with results of delta(-log(L))
  // calculations of this module so that it is merged with
  // RooMCStudy::fitParDataSet() by RooMCStudy

  return _data ;
}



//_____________________________________________________________________________
Bool_t RooDLLSignificanceMCSModule::processAfterFit(Int_t /*sampleNum*/)  
{
  // Save likelihood from nominal fit, fix chosen parameter to its
  // null hypothesis value and rerun fit Save difference in likelihood
  // and associated Gaussian significance in auxilary dataset

  RooRealVar* par = static_cast<RooRealVar*>(fitParams()->find(_parName.c_str())) ;
  par->setVal(_nullValue) ;
  par->setConstant(kTRUE) ;
  RooFitResult* frnull = refit() ;
  par->setConstant(kFALSE) ;
  
  _nll0h->setVal(frnull->minNll()) ;

  Double_t deltaLL = (frnull->minNll() - nllVar()->getVal()) ;
  Double_t signif = deltaLL>0 ? sqrt(2*deltaLL) : -sqrt(-2*deltaLL) ;
  _sig0h->setVal(signif) ;
  _dll0h->setVal(deltaLL) ;


  _data->add(RooArgSet(*_nll0h,*_dll0h,*_sig0h)) ;

  delete frnull ;

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