ROOT logo
/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 * @(#)root/roofitcore:$Id: RooRealBinding.cxx 28259 2009-04-16 16:21:16Z 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
// Lightweight interface adaptor that binds a RooAbsReal object to a subset
// of its servers and present it as a simple array oriented interface.
// END_HTML
//


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

#include "RooRealBinding.h"
#include "RooAbsReal.h"
#include "RooArgSet.h"
#include "RooAbsRealLValue.h"
#include "RooNameReg.h"
#include "RooMsgService.h"

#include <assert.h>



ClassImp(RooRealBinding)
;


//_____________________________________________________________________________
RooRealBinding::RooRealBinding(const RooAbsReal& func, const RooArgSet &vars, const RooArgSet* nset, Bool_t clipInvalid, const TNamed* rangeName) :
  RooAbsFunc(vars.getSize()), _func(&func), _vars(0), _nset(nset), _clipInvalid(clipInvalid), _xsave(0), _rangeName(rangeName)
{
  // Construct a lightweight function binding of RooAbsReal func to
  // variables 'vars'.  Use the provided nset as normalization set to
  // be passed to RooAbsReal::getVal() If rangeName is not null, use
  // the range of with that name as range associated with the
  // variables of this function binding. If clipInvalid is true,
  // values requested to the function binding that are outside the
  // defined range of the variables are clipped to fit in the defined
  // range.

  // allocate memory
  _vars= new RooAbsRealLValue*[getDimension()];
  if(0 == _vars) {
    _valid= kFALSE;
    return;
  }
  // check that all of the arguments are real valued and store them
  RooAbsArg *var = 0;
  TIterator* iter = vars.createIterator() ;
  Int_t index(0) ;
  while((var=(RooAbsArg*)iter->Next())) {
    _vars[index]= dynamic_cast<RooAbsRealLValue*>(var);
    if(0 == _vars[index]) {
      oocoutE((TObject*)0,InputArguments) << "RooRealBinding: cannot bind to " << var->GetName() << endl ;
      _valid= kFALSE;
    }
    index++ ;
  }
  delete iter ;
}


//_____________________________________________________________________________
RooRealBinding::RooRealBinding(const RooRealBinding& other, const RooArgSet* nset) :
  RooAbsFunc(other), _func(other._func), _nset(nset?nset:other._nset), _xvecValid(other._xvecValid),
  _clipInvalid(other._clipInvalid), _xsave(0), _rangeName(other._rangeName)
{
  // Construct a lightweight function binding of RooAbsReal func to
  // variables 'vars'.  Use the provided nset as normalization set to
  // be passed to RooAbsReal::getVal() If rangeName is not null, use
  // the range of with that name as range associated with the
  // variables of this function binding. If clipInvalid is true,
  // values requested to the function binding that are outside the
  // defined range of the variables are clipped to fit in the defined
  // range.

  // allocate memory
  _vars= new RooAbsRealLValue*[getDimension()];

  for(unsigned int index=0 ; index<getDimension() ; index++) {
    _vars[index]= other._vars[index] ;
  }
}


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

  if(0 != _vars) delete[] _vars;
  if (_xsave) delete[] _xsave ;
}



//_____________________________________________________________________________
void RooRealBinding::saveXVec() const
{
  // Save value of all variables

  if (!_xsave) {
    _xsave = new Double_t[getDimension()] ;    
    for (UInt_t i=0 ; i<getDimension() ; i++) {
      _xsave[i] = _vars[i]->getVal() ;
    }
  }
}


//_____________________________________________________________________________
void RooRealBinding::restoreXVec() const
{
  // Restore value of all variables to previously
  // saved values by saveXVec()

  if (!_xsave) {
    return ;
  }
  for (UInt_t i=0 ; i<getDimension() ; i++) {
   _vars[i]->setVal(_xsave[i]) ;
  }
}



//_____________________________________________________________________________
void RooRealBinding::loadValues(const Double_t xvector[]) const 
{
  // Load the vector of variable values into the RooRealVars associated
  // as variables with the bound RooAbsReal function

  _xvecValid = kTRUE ;
  for(UInt_t index= 0; index < _dimension; index++) {
    if (_clipInvalid && !_vars[index]->isValidReal(xvector[index])) {
      _xvecValid = kFALSE ;
    } else {
      _vars[index]->setVal(xvector[index],RooNameReg::instance().constStr(_rangeName));
    }
  }
}  


//_____________________________________________________________________________
Double_t RooRealBinding::operator()(const Double_t xvector[]) const 
{
  // Evaluate the bound RooAbsReal at the variable values provided in xvector

  assert(isValid());
  _ncall++ ;
  loadValues(xvector);
  //cout << getName() << "(x=" << xvector[0] << ")=" << _func->getVal(_nset) << " (nset = " << (_nset? *_nset:RooArgSet()) << ")" << endl ;
  return _xvecValid ? _func->getVal(_nset) : 0. ;
}


//_____________________________________________________________________________
Double_t RooRealBinding::getMinLimit(UInt_t index) const 
{
  // Return lower limit on i-th variable 
  assert(isValid());

  return _vars[index]->getMin(RooNameReg::str(_rangeName));
}


//_____________________________________________________________________________
Double_t RooRealBinding::getMaxLimit(UInt_t index) const 
{
  // Return upper limit on i-th variable 

  assert(isValid());
  return _vars[index]->getMax(RooNameReg::str(_rangeName));
}


//_____________________________________________________________________________
const char* RooRealBinding::getName() const 
{ 
  // Return name of function

  return _func->GetName() ; 
} 


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