/** \class THcDCLookupTTDConv
    \ingroup DetSupport

    \brief Drift time to distance conversion via lookup table.

*/
#include "THcDCLookupTTDConv.h"
#include <cstring>
#include <cassert>
ClassImp(THcDCLookupTTDConv)


//______________________________________________________________________________
THcDCLookupTTDConv::THcDCLookupTTDConv(Double_t T0, Double_t MaxDriftDistance,
				       Double_t BinSize, Int_t NumBins,
				       Double_t* Table) :
fT0(T0), fMaxDriftDistance(MaxDriftDistance), fBinSize(BinSize),
  fNumBins(NumBins)
{
  //Normal constructor

  assert( fNumBins > 0 );
  fTable = new Double_t[fNumBins];
  memcpy( fTable, Table, fNumBins*sizeof(Double_t) );
}

//______________________________________________________________________________
THcDCLookupTTDConv::~THcDCLookupTTDConv()
{
  // Destructor

  delete [] fTable;
}

//______________________________________________________________________________
Double_t THcDCLookupTTDConv::ConvertTimeToDist(Double_t time)
{
  /**
     Convert drift time to a distance from the wire by looking up in a table.
  */
  Int_t ib = (time-fT0)/fBinSize;
  Double_t frac = 0;
  if(ib >= 0 && ib+1 < fNumBins) {
    Double_t tfrac = (time - (ib*fBinSize + fT0)) / fBinSize;
    frac = fTable[ib]*(1-tfrac) + fTable[ib+1]*tfrac;
  } else if (ib+1 >= fNumBins) {
    frac = 1.0;
  }

  Double_t drift_distance = fMaxDriftDistance * frac;


  return(drift_distance);
}

////////////////////////////////////////////////////////////////////////////////