ROOT logo
/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 * @(#)root/roofitcore:$Id: RooMCIntegrator.cxx 24280 2008-06-15 20:57: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
// RooMCIntegrator implements an adaptive multi-dimensional Monte Carlo
// numerical integration, following the VEGAS algorithm originally described
// in G. P. Lepage, J. Comp. Phys. 27, 192(1978). This implementation is
// based on a C version from the 0.9 beta release of the GNU scientific library.
// END_HTML
//

#include "RooFit.h"
#include "Riostream.h"

#include "TMath.h"
#include "TClass.h"
#include "RooMCIntegrator.h"
#include "RooArgSet.h"
#include "RooNumber.h"
#include "RooAbsArg.h"
#include "RooNumIntFactory.h"
#include "RooRealVar.h"
#include "RooCategory.h"
#include "RooMsgService.h"

#include <math.h>
#include <assert.h>



ClassImp(RooMCIntegrator)
;

// Register this class with RooNumIntFactory


//_____________________________________________________________________________
void RooMCIntegrator::registerIntegrator(RooNumIntFactory& fact)
{
  // This function registers class RooMCIntegrator, its configuration options
  // and its capabilities with RooNumIntFactory
  
  RooCategory samplingMode("samplingMode","Sampling Mode") ;
  samplingMode.defineType("Importance",RooMCIntegrator::Importance) ;
  samplingMode.defineType("ImportanceOnly",RooMCIntegrator::ImportanceOnly) ;
  samplingMode.defineType("Stratified",RooMCIntegrator::Stratified) ;
  samplingMode.setIndex(RooMCIntegrator::Importance) ;

  RooCategory genType("genType","Generator Type") ;
  genType.defineType("QuasiRandom",RooMCIntegrator::QuasiRandom) ;
  genType.defineType("PseudoRandom",RooMCIntegrator::PseudoRandom) ;
  genType.setIndex(RooMCIntegrator::QuasiRandom) ;

  RooCategory verbose("verbose","Verbose flag") ;
  verbose.defineType("true",1) ;
  verbose.defineType("false",0) ;
  verbose.setIndex(0) ;

  RooRealVar alpha("alpha","Grid structure constant",1.5) ;
  RooRealVar nRefineIter("nRefineIter","Number of refining iterations",5) ;
  RooRealVar nRefinePerDim("nRefinePerDim","Number of refining samples (per dimension)",1000) ;
  RooRealVar nIntPerDim("nIntPerDim","Number of integration samples (per dimension)",5000) ;
  
  // Create prototype integrator
  RooMCIntegrator* proto = new RooMCIntegrator() ;

  // Register prototype and default config with factory
  fact.storeProtoIntegrator(proto,RooArgSet(samplingMode,genType,verbose,alpha,nRefineIter,nRefinePerDim,nIntPerDim)) ;

  // Make this method the default for all N>2-dim integrals
  RooNumIntConfig::defaultConfig().methodND().setLabel(proto->IsA()->GetName()) ;
}



//_____________________________________________________________________________
RooMCIntegrator::RooMCIntegrator()
{
  // Default constructor
}



//_____________________________________________________________________________
RooMCIntegrator::RooMCIntegrator(const RooAbsFunc& function, SamplingMode mode,
				 GeneratorType genType, Bool_t verbose) :
  RooAbsIntegrator(function), _grid(function), _verbose(verbose),
  _alpha(1.5),  _mode(mode), _genType(genType),
  _nRefineIter(5),_nRefinePerDim(1000),_nIntegratePerDim(5000)
{
  // Construct an integrator over 'function' with given sampling mode
  // and generator type.  The sampling mode can be 'Importance'
  // (default), 'ImportanceOnly' and 'Stratified'. The generator type
  // can be 'QuasiRandom' (default) and 'PseudoRandom'. Consult the original
  // VEGAS documentation on details of the mode and type parameters.


  if(!(_valid= _grid.isValid())) return;
  if(_verbose) _grid.Print();
} 



//_____________________________________________________________________________
RooMCIntegrator::RooMCIntegrator(const RooAbsFunc& function, const RooNumIntConfig& config) :
  RooAbsIntegrator(function), _grid(function)
{ 
  // Construct an integrator over 'function' where the configuration details
  // are taken from 'config'

  const RooArgSet& configSet = config.getConfigSection(IsA()->GetName()) ;
  _verbose = (Bool_t) configSet.getCatIndex("verbose",0) ;
  _alpha = configSet.getRealValue("alpha",1.5) ;
  _mode = (SamplingMode) configSet.getCatIndex("samplingMode",Importance) ;
  _genType = (GeneratorType) configSet.getCatIndex("genType",QuasiRandom) ;
  _nRefineIter = (Int_t) configSet.getRealValue("nRefineIter",5) ;
  _nRefinePerDim = (Int_t) configSet.getRealValue("nRefinePerDim",1000) ;
  _nIntegratePerDim = (Int_t) configSet.getRealValue("nIntPerDim",5000) ;

  // check that our grid initialized without errors
  if(!(_valid= _grid.isValid())) return;
  if(_verbose) _grid.Print();
} 



//_____________________________________________________________________________
RooAbsIntegrator* RooMCIntegrator::clone(const RooAbsFunc& function, const RooNumIntConfig& config) const
{
  // Return clone of this generator operating on given function with given configuration
  // Needed to support RooNumIntFactory

  return new RooMCIntegrator(function,config) ;
}



//_____________________________________________________________________________
RooMCIntegrator::~RooMCIntegrator() 
{
  // Destructor
}



//_____________________________________________________________________________
Bool_t RooMCIntegrator::checkLimits() const 
{
  // Check if we can integrate over the current domain. If return value
  // is kTRUE we cannot handle the current limits (e.g. where the domain
  // of one or more observables is open ended.
  
  return _grid.initialize(*integrand());
}



//_____________________________________________________________________________
Double_t RooMCIntegrator::integral(const Double_t* /*yvec*/) 
{
  // Evaluate the integral using a fixed number of calls to evaluate the integrand
  // equal to about 10k per dimension. Use the first 5k calls to refine the grid
  // over 5 iterations of 1k calls each, and the remaining 5k calls for a single
  // high statistics integration.

  _timer.Start(kTRUE);
  vegas(AllStages,_nRefinePerDim*_grid.getDimension(),_nRefineIter);
  Double_t ret = vegas(ReuseGrid,_nIntegratePerDim*_grid.getDimension(),1);
  return ret ;
}



//_____________________________________________________________________________
Double_t RooMCIntegrator::vegas(Stage stage, UInt_t calls, UInt_t iterations, Double_t *absError) 
{
  // Perform one step of Monte Carlo integration using the specified number of iterations
  // with (approximately) the specified number of integrand evaluation calls per iteration.
  // Use the VEGAS algorithm, starting from the specified stage. Returns the best estimate
  // of the integral. Also sets *absError to the estimated absolute error of the integral
  // estimate if absError is non-zero.

  //cout << "VEGAS stage = " << stage << " calls = " << calls << " iterations = " << iterations << endl ;

  // reset the grid to its initial state if we are starting from scratch
  if(stage == AllStages) _grid.initialize(*_function);

  // reset the results of previous calculations on this grid, but reuse the grid itself.
  if(stage <= ReuseGrid) {
    _wtd_int_sum = 0;
    _sum_wgts = 0;
    _chi_sum = 0;
    _it_num = 1;
    _samples = 0;
  }

  // refine the results of previous calculations on the current grid.
  if(stage <= RefineGrid) {
    UInt_t bins = RooGrid::maxBins;
    UInt_t boxes = 1;
    UInt_t dim(_grid.getDimension());

    // select the sampling mode for the next step
    if(_mode != ImportanceOnly) {
      // calculate the largest number of equal subdivisions ("boxes") along each
      // axis that results in an average of no more than 2 integrand calls per cell
      boxes = (UInt_t)floor(TMath::Power(calls/2.0,1.0/dim));
      // use stratified sampling if we are allowed enough calls (or equivalently,
      // if the dimension is low enough)
      _mode = Importance;
      if (2*boxes >= RooGrid::maxBins) {
	_mode = Stratified;
	// adjust the number of bins and boxes to give an integral number >= 1 of boxes per bin
	Int_t box_per_bin= (boxes > RooGrid::maxBins) ? boxes/RooGrid::maxBins : 1;
	bins= boxes/box_per_bin;
	if(bins > RooGrid::maxBins) bins= RooGrid::maxBins;
	boxes = box_per_bin * bins;	
	oocxcoutD((TObject*)0,Integration) << "RooMCIntegrator: using stratified sampling with " << bins << " bins and "
					 << box_per_bin << " boxes/bin" << endl;
      }
      else {
	oocxcoutD((TObject*)0,Integration) << "RooMCIntegrator: using importance sampling with " << bins << " bins and "
					 << boxes << " boxes" << endl;
      }
    }

    // calculate the total number of n-dim boxes for this step
    Double_t tot_boxes = TMath::Power((Double_t)boxes,(Double_t)dim);

    // increase the total number of calls to get at least 2 calls per box, if necessary
    _calls_per_box = (UInt_t)(calls/tot_boxes);
    if(_calls_per_box < 2) _calls_per_box= 2;
    calls= (UInt_t)(_calls_per_box*tot_boxes);

    // calculate the Jacobean factor: volume/(avg # of calls/bin)
    _jac = _grid.getVolume()*TMath::Power((Double_t)bins,(Double_t)dim)/calls;

    // setup our grid to use the calculated number of boxes and bins
    _grid.setNBoxes(boxes);
    if(bins != _grid.getNBins()) _grid.resize(bins);
  }

  // allocate memory for some book-keeping arrays
  UInt_t *box= _grid.createIndexVector();
  UInt_t *bin= _grid.createIndexVector();
  Double_t *x= _grid.createPoint();

  // loop over iterations for this step
  Double_t cum_int(0),cum_sig(0);
  _it_start = _it_num;
  _chisq = 0.0;
  for (UInt_t it = 0; it < iterations; it++) {
    Double_t intgrl(0),intgrl_sq(0),sig(0),jacbin(_jac);
    
    _it_num = _it_start + it;
    
    // reset the values associated with each grid cell
    _grid.resetValues();

    // loop over grid boxes
    _grid.firstBox(box);
    do {
      Double_t m(0),q(0);
      // loop over integrand evaluations within this grid box
      for(UInt_t k = 0; k < _calls_per_box; k++) {
	// generate a random point in this box
	Double_t bin_vol(0);
	_grid.generatePoint(box, x, bin, bin_vol, _genType == QuasiRandom ? kTRUE : kFALSE);
	// evaluate the integrand at the generated point
	Double_t fval= jacbin*bin_vol*integrand(x);	
	// update mean and variance calculations
	Double_t d = fval - m;
	m+= d / (k + 1.0);
	q+= d * d * (k / (k + 1.0));
	// accumulate the results of this evaluation (importance sampling only)
	if (_mode != Stratified) _grid.accumulate(bin, fval*fval);
      }
      intgrl += m * _calls_per_box;
      Double_t f_sq_sum = q * _calls_per_box ;
      sig += f_sq_sum ;

      // accumulate the results for this grid box (stratified sampling only)      
      if (_mode == Stratified) _grid.accumulate(bin, f_sq_sum);

      // print occasional progress messages
      if(_timer.RealTime() > 1) { // wait at least 1 sec since the last message
	oocoutW((TObject*)0,Integration) << "RooMCIntegrator: still working..." << endl;
	_timer.Start(kTRUE);
      }
      else {
	_timer.Start(kFALSE);
      }

    } while(_grid.nextBox(box));

    // compute final results for this iteration
    Double_t wgt;
    sig = sig / (_calls_per_box - 1.0)  ;    
    if (sig > 0) {
      wgt = 1.0 / sig;
    }
    else if (_sum_wgts > 0) {
      wgt = _sum_wgts / _samples;
    }
    else {
      wgt = 0.0;
    }
    intgrl_sq = intgrl * intgrl;
    _result = intgrl;
    _sigma  = sqrt(sig);
    
    if (wgt > 0.0) {
      _samples++ ;
      _sum_wgts += wgt;
      _wtd_int_sum += intgrl * wgt;
      _chi_sum += intgrl_sq * wgt;
      
      cum_int = _wtd_int_sum / _sum_wgts;
      cum_sig = sqrt (1 / _sum_wgts);
      
      if (_samples > 1) {
	_chisq = (_chi_sum - _wtd_int_sum * cum_int)/(_samples - 1.0);
      }
    }
    else {
      cum_int += (intgrl - cum_int) / (it + 1.0);
      cum_sig = 0.0;
    }         
    oocxcoutD((TObject*)0,Integration) << "=== Iteration " << _it_num << " : I = " << intgrl << " +/- " << sqrt(sig) << endl
				     << "    Cumulative : I = " << cum_int << " +/- " << cum_sig << "( chi2 = " << _chisq
				     << ")" << endl;
    // print the grid after the final iteration
    if (oodologD((TObject*)0,Integration)) {
      if(it + 1 == iterations) _grid.Print("V");
    }
    _grid.refine(_alpha);
  }

  // cleanup
  delete[] bin;
  delete[] box;
  delete[] x;

  if(absError) *absError = cum_sig;
  return cum_int;
}
 RooMCIntegrator.cxx:1
 RooMCIntegrator.cxx:2
 RooMCIntegrator.cxx:3
 RooMCIntegrator.cxx:4
 RooMCIntegrator.cxx:5
 RooMCIntegrator.cxx:6
 RooMCIntegrator.cxx:7
 RooMCIntegrator.cxx:8
 RooMCIntegrator.cxx:9
 RooMCIntegrator.cxx:10
 RooMCIntegrator.cxx:11
 RooMCIntegrator.cxx:12
 RooMCIntegrator.cxx:13
 RooMCIntegrator.cxx:14
 RooMCIntegrator.cxx:15
 RooMCIntegrator.cxx:16
 RooMCIntegrator.cxx:17
 RooMCIntegrator.cxx:18
 RooMCIntegrator.cxx:19
 RooMCIntegrator.cxx:20
 RooMCIntegrator.cxx:21
 RooMCIntegrator.cxx:22
 RooMCIntegrator.cxx:23
 RooMCIntegrator.cxx:24
 RooMCIntegrator.cxx:25
 RooMCIntegrator.cxx:26
 RooMCIntegrator.cxx:27
 RooMCIntegrator.cxx:28
 RooMCIntegrator.cxx:29
 RooMCIntegrator.cxx:30
 RooMCIntegrator.cxx:31
 RooMCIntegrator.cxx:32
 RooMCIntegrator.cxx:33
 RooMCIntegrator.cxx:34
 RooMCIntegrator.cxx:35
 RooMCIntegrator.cxx:36
 RooMCIntegrator.cxx:37
 RooMCIntegrator.cxx:38
 RooMCIntegrator.cxx:39
 RooMCIntegrator.cxx:40
 RooMCIntegrator.cxx:41
 RooMCIntegrator.cxx:42
 RooMCIntegrator.cxx:43
 RooMCIntegrator.cxx:44
 RooMCIntegrator.cxx:45
 RooMCIntegrator.cxx:46
 RooMCIntegrator.cxx:47
 RooMCIntegrator.cxx:48
 RooMCIntegrator.cxx:49
 RooMCIntegrator.cxx:50
 RooMCIntegrator.cxx:51
 RooMCIntegrator.cxx:52
 RooMCIntegrator.cxx:53
 RooMCIntegrator.cxx:54
 RooMCIntegrator.cxx:55
 RooMCIntegrator.cxx:56
 RooMCIntegrator.cxx:57
 RooMCIntegrator.cxx:58
 RooMCIntegrator.cxx:59
 RooMCIntegrator.cxx:60
 RooMCIntegrator.cxx:61
 RooMCIntegrator.cxx:62
 RooMCIntegrator.cxx:63
 RooMCIntegrator.cxx:64
 RooMCIntegrator.cxx:65
 RooMCIntegrator.cxx:66
 RooMCIntegrator.cxx:67
 RooMCIntegrator.cxx:68
 RooMCIntegrator.cxx:69
 RooMCIntegrator.cxx:70
 RooMCIntegrator.cxx:71
 RooMCIntegrator.cxx:72
 RooMCIntegrator.cxx:73
 RooMCIntegrator.cxx:74
 RooMCIntegrator.cxx:75
 RooMCIntegrator.cxx:76
 RooMCIntegrator.cxx:77
 RooMCIntegrator.cxx:78
 RooMCIntegrator.cxx:79
 RooMCIntegrator.cxx:80
 RooMCIntegrator.cxx:81
 RooMCIntegrator.cxx:82
 RooMCIntegrator.cxx:83
 RooMCIntegrator.cxx:84
 RooMCIntegrator.cxx:85
 RooMCIntegrator.cxx:86
 RooMCIntegrator.cxx:87
 RooMCIntegrator.cxx:88
 RooMCIntegrator.cxx:89
 RooMCIntegrator.cxx:90
 RooMCIntegrator.cxx:91
 RooMCIntegrator.cxx:92
 RooMCIntegrator.cxx:93
 RooMCIntegrator.cxx:94
 RooMCIntegrator.cxx:95
 RooMCIntegrator.cxx:96
 RooMCIntegrator.cxx:97
 RooMCIntegrator.cxx:98
 RooMCIntegrator.cxx:99
 RooMCIntegrator.cxx:100
 RooMCIntegrator.cxx:101
 RooMCIntegrator.cxx:102
 RooMCIntegrator.cxx:103
 RooMCIntegrator.cxx:104
 RooMCIntegrator.cxx:105
 RooMCIntegrator.cxx:106
 RooMCIntegrator.cxx:107
 RooMCIntegrator.cxx:108
 RooMCIntegrator.cxx:109
 RooMCIntegrator.cxx:110
 RooMCIntegrator.cxx:111
 RooMCIntegrator.cxx:112
 RooMCIntegrator.cxx:113
 RooMCIntegrator.cxx:114
 RooMCIntegrator.cxx:115
 RooMCIntegrator.cxx:116
 RooMCIntegrator.cxx:117
 RooMCIntegrator.cxx:118
 RooMCIntegrator.cxx:119
 RooMCIntegrator.cxx:120
 RooMCIntegrator.cxx:121
 RooMCIntegrator.cxx:122
 RooMCIntegrator.cxx:123
 RooMCIntegrator.cxx:124
 RooMCIntegrator.cxx:125
 RooMCIntegrator.cxx:126
 RooMCIntegrator.cxx:127
 RooMCIntegrator.cxx:128
 RooMCIntegrator.cxx:129
 RooMCIntegrator.cxx:130
 RooMCIntegrator.cxx:131
 RooMCIntegrator.cxx:132
 RooMCIntegrator.cxx:133
 RooMCIntegrator.cxx:134
 RooMCIntegrator.cxx:135
 RooMCIntegrator.cxx:136
 RooMCIntegrator.cxx:137
 RooMCIntegrator.cxx:138
 RooMCIntegrator.cxx:139
 RooMCIntegrator.cxx:140
 RooMCIntegrator.cxx:141
 RooMCIntegrator.cxx:142
 RooMCIntegrator.cxx:143
 RooMCIntegrator.cxx:144
 RooMCIntegrator.cxx:145
 RooMCIntegrator.cxx:146
 RooMCIntegrator.cxx:147
 RooMCIntegrator.cxx:148
 RooMCIntegrator.cxx:149
 RooMCIntegrator.cxx:150
 RooMCIntegrator.cxx:151
 RooMCIntegrator.cxx:152
 RooMCIntegrator.cxx:153
 RooMCIntegrator.cxx:154
 RooMCIntegrator.cxx:155
 RooMCIntegrator.cxx:156
 RooMCIntegrator.cxx:157
 RooMCIntegrator.cxx:158
 RooMCIntegrator.cxx:159
 RooMCIntegrator.cxx:160
 RooMCIntegrator.cxx:161
 RooMCIntegrator.cxx:162
 RooMCIntegrator.cxx:163
 RooMCIntegrator.cxx:164
 RooMCIntegrator.cxx:165
 RooMCIntegrator.cxx:166
 RooMCIntegrator.cxx:167
 RooMCIntegrator.cxx:168
 RooMCIntegrator.cxx:169
 RooMCIntegrator.cxx:170
 RooMCIntegrator.cxx:171
 RooMCIntegrator.cxx:172
 RooMCIntegrator.cxx:173
 RooMCIntegrator.cxx:174
 RooMCIntegrator.cxx:175
 RooMCIntegrator.cxx:176
 RooMCIntegrator.cxx:177
 RooMCIntegrator.cxx:178
 RooMCIntegrator.cxx:179
 RooMCIntegrator.cxx:180
 RooMCIntegrator.cxx:181
 RooMCIntegrator.cxx:182
 RooMCIntegrator.cxx:183
 RooMCIntegrator.cxx:184
 RooMCIntegrator.cxx:185
 RooMCIntegrator.cxx:186
 RooMCIntegrator.cxx:187
 RooMCIntegrator.cxx:188
 RooMCIntegrator.cxx:189
 RooMCIntegrator.cxx:190
 RooMCIntegrator.cxx:191
 RooMCIntegrator.cxx:192
 RooMCIntegrator.cxx:193
 RooMCIntegrator.cxx:194
 RooMCIntegrator.cxx:195
 RooMCIntegrator.cxx:196
 RooMCIntegrator.cxx:197
 RooMCIntegrator.cxx:198
 RooMCIntegrator.cxx:199
 RooMCIntegrator.cxx:200
 RooMCIntegrator.cxx:201
 RooMCIntegrator.cxx:202
 RooMCIntegrator.cxx:203
 RooMCIntegrator.cxx:204
 RooMCIntegrator.cxx:205
 RooMCIntegrator.cxx:206
 RooMCIntegrator.cxx:207
 RooMCIntegrator.cxx:208
 RooMCIntegrator.cxx:209
 RooMCIntegrator.cxx:210
 RooMCIntegrator.cxx:211
 RooMCIntegrator.cxx:212
 RooMCIntegrator.cxx:213
 RooMCIntegrator.cxx:214
 RooMCIntegrator.cxx:215
 RooMCIntegrator.cxx:216
 RooMCIntegrator.cxx:217
 RooMCIntegrator.cxx:218
 RooMCIntegrator.cxx:219
 RooMCIntegrator.cxx:220
 RooMCIntegrator.cxx:221
 RooMCIntegrator.cxx:222
 RooMCIntegrator.cxx:223
 RooMCIntegrator.cxx:224
 RooMCIntegrator.cxx:225
 RooMCIntegrator.cxx:226
 RooMCIntegrator.cxx:227
 RooMCIntegrator.cxx:228
 RooMCIntegrator.cxx:229
 RooMCIntegrator.cxx:230
 RooMCIntegrator.cxx:231
 RooMCIntegrator.cxx:232
 RooMCIntegrator.cxx:233
 RooMCIntegrator.cxx:234
 RooMCIntegrator.cxx:235
 RooMCIntegrator.cxx:236
 RooMCIntegrator.cxx:237
 RooMCIntegrator.cxx:238
 RooMCIntegrator.cxx:239
 RooMCIntegrator.cxx:240
 RooMCIntegrator.cxx:241
 RooMCIntegrator.cxx:242
 RooMCIntegrator.cxx:243
 RooMCIntegrator.cxx:244
 RooMCIntegrator.cxx:245
 RooMCIntegrator.cxx:246
 RooMCIntegrator.cxx:247
 RooMCIntegrator.cxx:248
 RooMCIntegrator.cxx:249
 RooMCIntegrator.cxx:250
 RooMCIntegrator.cxx:251
 RooMCIntegrator.cxx:252
 RooMCIntegrator.cxx:253
 RooMCIntegrator.cxx:254
 RooMCIntegrator.cxx:255
 RooMCIntegrator.cxx:256
 RooMCIntegrator.cxx:257
 RooMCIntegrator.cxx:258
 RooMCIntegrator.cxx:259
 RooMCIntegrator.cxx:260
 RooMCIntegrator.cxx:261
 RooMCIntegrator.cxx:262
 RooMCIntegrator.cxx:263
 RooMCIntegrator.cxx:264
 RooMCIntegrator.cxx:265
 RooMCIntegrator.cxx:266
 RooMCIntegrator.cxx:267
 RooMCIntegrator.cxx:268
 RooMCIntegrator.cxx:269
 RooMCIntegrator.cxx:270
 RooMCIntegrator.cxx:271
 RooMCIntegrator.cxx:272
 RooMCIntegrator.cxx:273
 RooMCIntegrator.cxx:274
 RooMCIntegrator.cxx:275
 RooMCIntegrator.cxx:276
 RooMCIntegrator.cxx:277
 RooMCIntegrator.cxx:278
 RooMCIntegrator.cxx:279
 RooMCIntegrator.cxx:280
 RooMCIntegrator.cxx:281
 RooMCIntegrator.cxx:282
 RooMCIntegrator.cxx:283
 RooMCIntegrator.cxx:284
 RooMCIntegrator.cxx:285
 RooMCIntegrator.cxx:286
 RooMCIntegrator.cxx:287
 RooMCIntegrator.cxx:288
 RooMCIntegrator.cxx:289
 RooMCIntegrator.cxx:290
 RooMCIntegrator.cxx:291
 RooMCIntegrator.cxx:292
 RooMCIntegrator.cxx:293
 RooMCIntegrator.cxx:294
 RooMCIntegrator.cxx:295
 RooMCIntegrator.cxx:296
 RooMCIntegrator.cxx:297
 RooMCIntegrator.cxx:298
 RooMCIntegrator.cxx:299
 RooMCIntegrator.cxx:300
 RooMCIntegrator.cxx:301
 RooMCIntegrator.cxx:302
 RooMCIntegrator.cxx:303
 RooMCIntegrator.cxx:304
 RooMCIntegrator.cxx:305
 RooMCIntegrator.cxx:306
 RooMCIntegrator.cxx:307
 RooMCIntegrator.cxx:308
 RooMCIntegrator.cxx:309
 RooMCIntegrator.cxx:310
 RooMCIntegrator.cxx:311
 RooMCIntegrator.cxx:312
 RooMCIntegrator.cxx:313
 RooMCIntegrator.cxx:314
 RooMCIntegrator.cxx:315
 RooMCIntegrator.cxx:316
 RooMCIntegrator.cxx:317
 RooMCIntegrator.cxx:318
 RooMCIntegrator.cxx:319
 RooMCIntegrator.cxx:320
 RooMCIntegrator.cxx:321
 RooMCIntegrator.cxx:322
 RooMCIntegrator.cxx:323
 RooMCIntegrator.cxx:324
 RooMCIntegrator.cxx:325
 RooMCIntegrator.cxx:326
 RooMCIntegrator.cxx:327
 RooMCIntegrator.cxx:328
 RooMCIntegrator.cxx:329
 RooMCIntegrator.cxx:330
 RooMCIntegrator.cxx:331
 RooMCIntegrator.cxx:332
 RooMCIntegrator.cxx:333
 RooMCIntegrator.cxx:334
 RooMCIntegrator.cxx:335
 RooMCIntegrator.cxx:336
 RooMCIntegrator.cxx:337
 RooMCIntegrator.cxx:338
 RooMCIntegrator.cxx:339
 RooMCIntegrator.cxx:340
 RooMCIntegrator.cxx:341
 RooMCIntegrator.cxx:342
 RooMCIntegrator.cxx:343
 RooMCIntegrator.cxx:344
 RooMCIntegrator.cxx:345
 RooMCIntegrator.cxx:346
 RooMCIntegrator.cxx:347
 RooMCIntegrator.cxx:348
 RooMCIntegrator.cxx:349
 RooMCIntegrator.cxx:350
 RooMCIntegrator.cxx:351
 RooMCIntegrator.cxx:352
 RooMCIntegrator.cxx:353
 RooMCIntegrator.cxx:354
 RooMCIntegrator.cxx:355
 RooMCIntegrator.cxx:356
 RooMCIntegrator.cxx:357
 RooMCIntegrator.cxx:358
 RooMCIntegrator.cxx:359
 RooMCIntegrator.cxx:360
 RooMCIntegrator.cxx:361