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() ;
  _positiveDefinite=false;
}



//_____________________________________________________________________________
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),
  _positiveDefinite(false)
{
  // 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),
  _positiveDefinite(other._positiveDefinite)
{
  // 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;
  }

  if(_positiveDefinite && (sum<0)){
     sum = 1e-6;
  }
  return sum;

}


//_____________________________________________________________________________
Int_t PiecewiseInterpolation::getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& analVars, 
						      const RooArgSet* normSet, const char* /*rangeName*/) const 
{
  // Advertise that all integrals can be handled internally.

  /*
  cout << "---------------------------\nin PiecewiseInterpolation get analytic integral " <<endl;
  cout << "all vars = "<<endl;
  allVars.Print("v");
  cout << "anal vars = "<<endl;
  analVars.Print("v");
  cout << "normset vars = "<<endl;
  if(normSet2)
    normSet2->Print("v");
  */


  // Handle trivial no-integration scenario
  if (allVars.getSize()==0) return 0 ;
  if (_forceNumInt) return 0 ;


  // Select subset of allVars that are actual dependents
  analVars.add(allVars) ;
  //  RooArgSet* normSet = normSet2 ? getObservables(normSet2) : 0 ;
  //  RooArgSet* normSet = getObservables();
  //  RooArgSet* normSet = 0;


  // Check if this configuration was created before
  Int_t sterileIdx(-1) ;
  CacheElem* cache = (CacheElem*) _normIntMgr.getObj(normSet,&analVars,&sterileIdx,0) ;
  if (cache) {
    return _normIntMgr.lastIndex()+1 ;
  }
  
  // Create new cache element
  cache = new CacheElem ;

  // Make list of function projection and normalization integrals 
  RooAbsReal* param ;
  RooAbsReal *func ;
  //  const RooArgSet* nset = _paramList.nset() ;

  // do nominal
  func = (RooAbsReal*)(&_nominal.arg()) ;
  RooAbsReal* funcInt = func->createIntegral(analVars) ;
  cache->_funcIntList.addOwned(*funcInt) ;

  // do variations
  _lowIter->Reset() ;
  _highIter->Reset() ;
  _paramIter->Reset() ;
  int i=0;
  while((param=(RooAbsReal*)_paramIter->Next())) {
    func = (RooAbsReal*)_lowIter->Next() ;
    funcInt = func->createIntegral(analVars) ;
    cache->_lowIntList.addOwned(*funcInt) ;

    func = (RooAbsReal*)_highIter->Next() ;
    funcInt = func->createIntegral(analVars) ;
    cache->_highIntList.addOwned(*funcInt) ;

    ++i;
  }

  // Store cache element
  Int_t code = _normIntMgr.setObj(normSet,&analVars,(RooAbsCacheElement*)cache,0) ;

  return code+1 ; 
}




//_____________________________________________________________________________
Double_t PiecewiseInterpolation::analyticalIntegralWN(Int_t code, const RooArgSet* /*normSet2*/,const char* /*rangeName*/) const 
{
  // Implement analytical integrations by doing appropriate weighting from  component integrals
  // functions to integrators of components

  CacheElem* cache = (CacheElem*) _normIntMgr.getObjByIndex(code-1) ;

  TIterator* funcIntIter = cache->_funcIntList.createIterator() ;
  TIterator* lowIntIter = cache->_lowIntList.createIterator() ;
  TIterator* highIntIter = cache->_highIntList.createIterator() ;
  RooAbsReal *funcInt(0), *low(0), *high(0), *param(0) ;
  Double_t value(0) ;
  Double_t nominal(0);

  // get nominal 
  int i=0;
  while(( funcInt = (RooAbsReal*)funcIntIter->Next())) {
    value += funcInt->getVal() ;
    nominal = value;
    i++;
  }
  if(i==0 || i>1)
    cout << "problem, wrong number of nominal functions"<<endl;

  // now get low/high variations
  i = 0;
  _paramIter->Reset() ;
  while((param=(RooAbsReal*)_paramIter->Next())) {
    low = (RooAbsReal*)lowIntIter->Next() ;
    high = (RooAbsReal*)highIntIter->Next() ;

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

    ++i;
  }

  return value;

}


/*
//_____________________________________________________________________________
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
 PiecewiseInterpolation.cxx:230
 PiecewiseInterpolation.cxx:231
 PiecewiseInterpolation.cxx:232
 PiecewiseInterpolation.cxx:233
 PiecewiseInterpolation.cxx:234
 PiecewiseInterpolation.cxx:235
 PiecewiseInterpolation.cxx:236
 PiecewiseInterpolation.cxx:237
 PiecewiseInterpolation.cxx:238
 PiecewiseInterpolation.cxx:239
 PiecewiseInterpolation.cxx:240
 PiecewiseInterpolation.cxx:241
 PiecewiseInterpolation.cxx:242
 PiecewiseInterpolation.cxx:243
 PiecewiseInterpolation.cxx:244
 PiecewiseInterpolation.cxx:245
 PiecewiseInterpolation.cxx:246
 PiecewiseInterpolation.cxx:247
 PiecewiseInterpolation.cxx:248
 PiecewiseInterpolation.cxx:249
 PiecewiseInterpolation.cxx:250
 PiecewiseInterpolation.cxx:251
 PiecewiseInterpolation.cxx:252
 PiecewiseInterpolation.cxx:253
 PiecewiseInterpolation.cxx:254
 PiecewiseInterpolation.cxx:255
 PiecewiseInterpolation.cxx:256
 PiecewiseInterpolation.cxx:257
 PiecewiseInterpolation.cxx:258
 PiecewiseInterpolation.cxx:259
 PiecewiseInterpolation.cxx:260
 PiecewiseInterpolation.cxx:261
 PiecewiseInterpolation.cxx:262
 PiecewiseInterpolation.cxx:263
 PiecewiseInterpolation.cxx:264
 PiecewiseInterpolation.cxx:265
 PiecewiseInterpolation.cxx:266
 PiecewiseInterpolation.cxx:267
 PiecewiseInterpolation.cxx:268
 PiecewiseInterpolation.cxx:269
 PiecewiseInterpolation.cxx:270
 PiecewiseInterpolation.cxx:271
 PiecewiseInterpolation.cxx:272
 PiecewiseInterpolation.cxx:273
 PiecewiseInterpolation.cxx:274
 PiecewiseInterpolation.cxx:275
 PiecewiseInterpolation.cxx:276
 PiecewiseInterpolation.cxx:277
 PiecewiseInterpolation.cxx:278
 PiecewiseInterpolation.cxx:279
 PiecewiseInterpolation.cxx:280
 PiecewiseInterpolation.cxx:281
 PiecewiseInterpolation.cxx:282
 PiecewiseInterpolation.cxx:283
 PiecewiseInterpolation.cxx:284
 PiecewiseInterpolation.cxx:285
 PiecewiseInterpolation.cxx:286
 PiecewiseInterpolation.cxx:287
 PiecewiseInterpolation.cxx:288
 PiecewiseInterpolation.cxx:289
 PiecewiseInterpolation.cxx:290
 PiecewiseInterpolation.cxx:291
 PiecewiseInterpolation.cxx:292
 PiecewiseInterpolation.cxx:293
 PiecewiseInterpolation.cxx:294
 PiecewiseInterpolation.cxx:295
 PiecewiseInterpolation.cxx:296
 PiecewiseInterpolation.cxx:297
 PiecewiseInterpolation.cxx:298
 PiecewiseInterpolation.cxx:299
 PiecewiseInterpolation.cxx:300
 PiecewiseInterpolation.cxx:301
 PiecewiseInterpolation.cxx:302
 PiecewiseInterpolation.cxx:303
 PiecewiseInterpolation.cxx:304
 PiecewiseInterpolation.cxx:305
 PiecewiseInterpolation.cxx:306
 PiecewiseInterpolation.cxx:307
 PiecewiseInterpolation.cxx:308
 PiecewiseInterpolation.cxx:309
 PiecewiseInterpolation.cxx:310
 PiecewiseInterpolation.cxx:311
 PiecewiseInterpolation.cxx:312
 PiecewiseInterpolation.cxx:313
 PiecewiseInterpolation.cxx:314
 PiecewiseInterpolation.cxx:315
 PiecewiseInterpolation.cxx:316
 PiecewiseInterpolation.cxx:317
 PiecewiseInterpolation.cxx:318
 PiecewiseInterpolation.cxx:319
 PiecewiseInterpolation.cxx:320
 PiecewiseInterpolation.cxx:321
 PiecewiseInterpolation.cxx:322
 PiecewiseInterpolation.cxx:323
 PiecewiseInterpolation.cxx:324
 PiecewiseInterpolation.cxx:325
 PiecewiseInterpolation.cxx:326
 PiecewiseInterpolation.cxx:327
 PiecewiseInterpolation.cxx:328
 PiecewiseInterpolation.cxx:329
 PiecewiseInterpolation.cxx:330
 PiecewiseInterpolation.cxx:331
 PiecewiseInterpolation.cxx:332
 PiecewiseInterpolation.cxx:333
 PiecewiseInterpolation.cxx:334
 PiecewiseInterpolation.cxx:335
 PiecewiseInterpolation.cxx:336
 PiecewiseInterpolation.cxx:337
 PiecewiseInterpolation.cxx:338
 PiecewiseInterpolation.cxx:339
 PiecewiseInterpolation.cxx:340
 PiecewiseInterpolation.cxx:341
 PiecewiseInterpolation.cxx:342
 PiecewiseInterpolation.cxx:343
 PiecewiseInterpolation.cxx:344
 PiecewiseInterpolation.cxx:345
 PiecewiseInterpolation.cxx:346
 PiecewiseInterpolation.cxx:347
 PiecewiseInterpolation.cxx:348
 PiecewiseInterpolation.cxx:349
 PiecewiseInterpolation.cxx:350
 PiecewiseInterpolation.cxx:351
 PiecewiseInterpolation.cxx:352
 PiecewiseInterpolation.cxx:353
 PiecewiseInterpolation.cxx:354
 PiecewiseInterpolation.cxx:355
 PiecewiseInterpolation.cxx:356
 PiecewiseInterpolation.cxx:357
 PiecewiseInterpolation.cxx:358