Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
RooSegmentedIntegrator2D.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 RooSegmentedIntegrator2D.cxx
19 \class RooSegmentedIntegrator2D
20 \ingroup Roofitcore
21 
22 RooSegmentedIntegrator2D implements an adaptive one-dimensional
23 numerical integration algorithm.
24 **/
25 
26 
27 #include "RooFit.h"
28 #include "Riostream.h"
29 
30 #include "TClass.h"
32 #include "RooArgSet.h"
33 #include "RooIntegratorBinding.h"
34 #include "RooRealVar.h"
35 #include "RooNumber.h"
36 #include "RooNumIntFactory.h"
37 #include "RooMsgService.h"
38 
39 #include <assert.h>
40 
41 
42 
43 using namespace std;
44 
45 ClassImp(RooSegmentedIntegrator2D);
46 ;
47 
48 
49 ////////////////////////////////////////////////////////////////////////////////
50 /// Register RooSegmentedIntegrator2D, its parameters, dependencies and capabilities with RooNumIntFactory
51 
52 void RooSegmentedIntegrator2D::registerIntegrator(RooNumIntFactory& fact)
53 {
54  fact.storeProtoIntegrator(new RooSegmentedIntegrator2D(),RooArgSet(),RooSegmentedIntegrator1D::Class()->GetName()) ;
55 }
56 
57 
58 
59 ////////////////////////////////////////////////////////////////////////////////
60 /// Default constructor
61 
62 RooSegmentedIntegrator2D::RooSegmentedIntegrator2D() :
63  _xIntegrator(0), _xint(0)
64 {
65 }
66 
67 
68 ////////////////////////////////////////////////////////////////////////////////
69 /// Constructor of integral on given function binding and with given configuration. The
70 /// integration limits are taken from the definition in the function binding
71 
72 RooSegmentedIntegrator2D::RooSegmentedIntegrator2D(const RooAbsFunc& function, const RooNumIntConfig& config) :
73  RooSegmentedIntegrator1D(*(_xint=new RooIntegratorBinding(*(_xIntegrator=new RooSegmentedIntegrator1D(function,config)))),config)
74 {
75 }
76 
77 
78 ////////////////////////////////////////////////////////////////////////////////
79 /// Constructor integral on given function binding, with given configuration and
80 /// explicit definition of integration range
81 
82 RooSegmentedIntegrator2D::RooSegmentedIntegrator2D(const RooAbsFunc& function, Double_t xmin, Double_t xmax,
83  Double_t ymin, Double_t ymax,
84  const RooNumIntConfig& config) :
85  RooSegmentedIntegrator1D(*(_xint=new RooIntegratorBinding(*(_xIntegrator=new RooSegmentedIntegrator1D(function,ymin,ymax,config)))),xmin,xmax,config)
86 {
87 }
88 
89 
90 ////////////////////////////////////////////////////////////////////////////////
91 /// Virtual constructor with given function and configuration. Needed by RooNumIntFactory
92 
93 RooAbsIntegrator* RooSegmentedIntegrator2D::clone(const RooAbsFunc& function, const RooNumIntConfig& config) const
94 {
95  return new RooSegmentedIntegrator2D(function,config) ;
96 }
97 
98 
99 
100 ////////////////////////////////////////////////////////////////////////////////
101 /// Destructor
102 
103 RooSegmentedIntegrator2D::~RooSegmentedIntegrator2D()
104 {
105  delete _xint ;
106  delete _xIntegrator ;
107 }
108 
109 
110 
111 ////////////////////////////////////////////////////////////////////////////////
112 /// Check that our integration range is finite and otherwise return kFALSE.
113 /// Update the limits from the integrand if requested.
114 
115 Bool_t RooSegmentedIntegrator2D::checkLimits() const
116 {
117  if(_useIntegrandLimits) {
118  assert(0 != integrand() && integrand()->isValid());
119  _xmin= integrand()->getMinLimit(0);
120  _xmax= integrand()->getMaxLimit(0);
121  }
122  _range= _xmax - _xmin;
123  if(_range <= 0) {
124  oocoutE((TObject*)0,InputArguments) << "RooIntegrator1D::checkLimits: bad range with min >= max" << endl;
125  return kFALSE;
126  }
127  Bool_t ret = (RooNumber::isInfinite(_xmin) || RooNumber::isInfinite(_xmax)) ? kFALSE : kTRUE;
128 
129  // Adjust component integrators, if already created
130  if (_array && ret) {
131  Double_t segSize = (_xmax - _xmin) / _nseg ;
132  Int_t i ;
133  for (i=0 ; i<_nseg ; i++) {
134  _array[i]->setLimits(_xmin+i*segSize,_xmin+(i+1)*segSize) ;
135  }
136  }
137 
138  return ret ;
139 }
140 
141 
142