ROOT logo
/*****************************************************************************

 *****************************************************************************/

//////////////////////////////////////////////////////////////////////////////
// 
// BEGIN_HTML
// PiecewiseInterpolation 
// END_HTML
//


#include "RooFit.h"

#include "Riostream.h"
#include "Riostream.h"
#include <math.h>

#include "RooStats/HistFactory/PiecewiseInterpolation.h"
#include "RooAbsReal.h"
#include "RooAbsPdf.h"
#include "RooErrorHandler.h"
#include "RooArgSet.h"
#include "RooNLLVar.h"
#include "RooChi2Var.h"
#include "RooMsgService.h"

ClassImp(PiecewiseInterpolation)
;


//_____________________________________________________________________________
PiecewiseInterpolation::PiecewiseInterpolation()
{
  _lowIter = _lowSet.createIterator() ;
  _highIter = _highSet.createIterator() ;
  _paramIter = _paramSet.createIterator() ;
}



//_____________________________________________________________________________
PiecewiseInterpolation::PiecewiseInterpolation(const char* name, const char* title, const RooAbsReal& nominal,
					       const RooArgList& lowSet, 
					       const RooArgList& highSet,
					       const RooArgList& paramSet,
					       Bool_t takeOwnership) :
  RooAbsReal(name, title),
  _nominal("!nominal","nominal value", this, (RooAbsReal&)nominal),
  _lowSet("!lowSet","low-side variation",this),
  _highSet("!highSet","high-side variation",this),
  _paramSet("!paramSet","high-side variation",this)
{
  // Constructor with two set of RooAbsReals. The value of the function will be
  //
  //  A = sum_i lowSet(i)*highSet(i) 
  //
  // If takeOwnership is true the PiecewiseInterpolation object will take ownership of the arguments in sumSet

  _lowIter = _lowSet.createIterator() ;
  _highIter = _highSet.createIterator() ;
  _paramIter = _paramSet.createIterator() ;

  // KC: check both sizes
  if (lowSet.getSize() != highSet.getSize()) {
    coutE(InputArguments) << "PiecewiseInterpolation::ctor(" << GetName() << ") ERROR: input lists should be of equal length" << endl ;
    RooErrorHandler::softAbort() ;    
  }

  TIterator* inputIter1 = lowSet.createIterator() ;
  RooAbsArg* comp ;
  while((comp = (RooAbsArg*)inputIter1->Next())) {
    if (!dynamic_cast<RooAbsReal*>(comp)) {
      coutE(InputArguments) << "PiecewiseInterpolation::ctor(" << GetName() << ") ERROR: component " << comp->GetName() 
			    << " in first list is not of type RooAbsReal" << endl ;
      RooErrorHandler::softAbort() ;
    }
    _lowSet.add(*comp) ;
    if (takeOwnership) {
      _ownedList.addOwned(*comp) ;
    }
  }
  delete inputIter1 ;


  TIterator* inputIter2 = highSet.createIterator() ;
  while((comp = (RooAbsArg*)inputIter2->Next())) {
    if (!dynamic_cast<RooAbsReal*>(comp)) {
      coutE(InputArguments) << "PiecewiseInterpolation::ctor(" << GetName() << ") ERROR: component " << comp->GetName() 
			    << " in first list is not of type RooAbsReal" << endl ;
      RooErrorHandler::softAbort() ;
    }
    _highSet.add(*comp) ;
    if (takeOwnership) {
      _ownedList.addOwned(*comp) ;
    }
  }
  delete inputIter2 ;


  TIterator* inputIter3 = paramSet.createIterator() ;
  while((comp = (RooAbsArg*)inputIter3->Next())) {
    if (!dynamic_cast<RooAbsReal*>(comp)) {
      coutE(InputArguments) << "PiecewiseInterpolation::ctor(" << GetName() << ") ERROR: component " << comp->GetName() 
			    << " in first list is not of type RooAbsReal" << endl ;
      RooErrorHandler::softAbort() ;
    }
    _paramSet.add(*comp) ;
    if (takeOwnership) {
      _ownedList.addOwned(*comp) ;
    }
  }
  delete inputIter3 ;
}



//_____________________________________________________________________________
PiecewiseInterpolation::PiecewiseInterpolation(const PiecewiseInterpolation& other, const char* name) :
  RooAbsReal(other, name), 
  _nominal("!nominal",this,other._nominal),
  _lowSet("!lowSet",this,other._lowSet),
  _highSet("!highSet",this,other._highSet),
  _paramSet("!paramSet",this,other._paramSet)
{
  // Copy constructor

  _lowIter = _lowSet.createIterator() ;
  _highIter = _highSet.createIterator() ;
  _paramIter = _paramSet.createIterator() ;
  
  // Member _ownedList is intentionally not copy-constructed -- ownership is not transferred
}



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

  if (_lowIter) delete _lowIter ;
  if (_highIter) delete _highIter ;
  if (_paramIter) delete _paramIter ;
}




//_____________________________________________________________________________
Double_t PiecewiseInterpolation::evaluate() const 
{
  // Calculate and return current value of self

  ///////////////////
  Double_t nominal = _nominal;
  Double_t sum(nominal) ;
  _lowIter->Reset() ;
  _highIter->Reset() ;
  _paramIter->Reset() ;
  

  RooAbsReal* param ;
  RooAbsReal* high ;
  RooAbsReal* low ;
  //  const RooArgSet* nset = _paramList.nset() ;
  int i=0;

  while((param=(RooAbsReal*)_paramIter->Next())) {
    low = (RooAbsReal*)_lowIter->Next() ;
    high = (RooAbsReal*)_highIter->Next() ;

    
    if(param->getVal()>0)
      sum += param->getVal()*(high->getVal() - nominal );
    else
      sum += param->getVal()*(nominal - low->getVal());

    ++i;
  }

  return sum;

}

/*
//_____________________________________________________________________________
void PiecewiseInterpolation::printMetaArgs(ostream& os) const 
{
  // Customized printing of arguments of a PiecewiseInterpolation to more intuitively reflect the contents of the
  // product operator construction

  _lowIter->Reset() ;
  if (_highIter) {
    _highIter->Reset() ;
  }

  Bool_t first(kTRUE) ;
    
  RooAbsArg* arg1, *arg2 ;
  if (_highSet.getSize()!=0) { 

    while((arg1=(RooAbsArg*)_lowIter->Next())) {
      if (!first) {
	os << " + " ;
      } else {
	first = kFALSE ;
      }
      arg2=(RooAbsArg*)_highIter->Next() ;
      os << arg1->GetName() << " * " << arg2->GetName() ;
    }

  } else {
    
    while((arg1=(RooAbsArg*)_lowIter->Next())) {
      if (!first) {
	os << " + " ;
      } else {
	first = kFALSE ;
      }
      os << arg1->GetName() ; 
    }  

  }

  os << " " ;    
}

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