// $Header: LookUp2d.cxx $
// two dimensional lookup table
// Version 1.0 7-Jan-1999 Richard creation

#include "LookUp2d.h"
#include "TMath.h"

//______________________________________________________________________
//
// LookUp2d
//
// utility class which reads a 2-d table and uses it for interpolation

ClassImp(LookUp2d)
 LookUp2d::LookUp2d(TString name, Float_t* key1, Float_t* key2, Float_t* mat, 
		   Int_t numBins1, Int_t numBins2) :
  m_name(name), m_key1(key1), m_key2(key2), m_matrix(mat), 
  m_numBins1(numBins1), m_numBins2(numBins2) {
};

 LookUp2d::~LookUp2d() {};


 Float_t LookUp2d::interpolateVal(Float_t val1, Float_t val2, Int_t* rc) {
  // interpolates table given input val1, val2

  int badVal1LowerBound = 1,
      badVal1UpperBound = 2,
      badVal2LowerBound = 3,
      badVal2UpperBound = 4,
      goodBounds = 0;
    
    
  if (val1 > m_key1[m_numBins1-1] ) {
    *rc = badVal1UpperBound;
    return 0.;
  };
    
  if (val2 > m_key2[m_numBins2-1] ) {
    *rc = badVal2UpperBound;
    return 0.;
  };
    
  Int_t index1 = TMath::BinarySearch(m_numBins1,m_key1,val1);
  index1 = ( index1 < 0 ) ? 0 : index1;
  Int_t index2 = TMath::BinarySearch(m_numBins2,m_key2,val2);
  index2 = ( index2 < 0 ) ? 0 : index2;
  
  Float_t t = (val1 - m_key1[index1]) / (m_key1[index1+1] - 
					 m_key1[index1]);
  
  Float_t u = (val2 - m_key2[index2]) / (m_key2[index2+1] - 
					 m_key2[index2]);
  
  Float_t y1 = m_matrix[index1*m_numBins2+index2];
  Float_t y2 = m_matrix[(index1+1)*m_numBins2+index2];
  Float_t y3 = m_matrix[(index1+1)*m_numBins2+index2+1];
  Float_t y4 = m_matrix[index1*m_numBins2+index2+1];
  
  Float_t yNew = (1.-t)*(1.-u)*y1 + t*(1.-u)*y2 + t*u*y3 + (1.-t)*u*y4;
  
  *rc = goodBounds;
  return yNew;
};


ROOT page - Class index - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.