ROOT logo
///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// TimeToDistConv                                                            //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include "TimeToDistConv.h"
#include "TMath.h"

ClassImp(TreeSearch::TimeToDistConv)
ClassImp(TreeSearch::LinearTTD)
ClassImp(TreeSearch::TanhFitTTD)

namespace TreeSearch {

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// LinearTTD                                                                 //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

//_____________________________________________________________________________
LinearTTD::LinearTTD() : TimeToDistConv(1), fDriftVel(kBig)
{
  // Constructor.
}

//_____________________________________________________________________________
Double_t LinearTTD::GetParameter( UInt_t i ) const
{
  // Get i-th parameter

  return (i==0) ? GetDriftVel() : kBig;
}

//_____________________________________________________________________________
Int_t LinearTTD::SetParameters( const vector<double>& parameters )
{
  // Set parameters. The first element of parameter array is interpreted as
  // the drift velocity in m/s. Further elements are ignored.

  if( parameters.empty() )
    return -1;

  fDriftVel = parameters[0];
  return 0;
}

//_____________________________________________________________________________
Double_t LinearTTD::ConvertTimeToDist( Double_t time, Double_t slope ) const
{
  // Time in s. Return distance in m. slope is used to project the distance
  // of closest approach onto the wire plane (1/cos correction).
  
  if( time <= 0.0 )
    return 0.0;

  // Don't bother with very small slopes
  if( TMath::Abs(slope) < 1e-2 )
    return fDriftVel * time;
  
  // NB: 1/cos = sqrt(1+tan^2)
  return fDriftVel * time *  TMath::Sqrt( 1.0 + slope*slope );
}


///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// TanhFitTTD                                                                //
//                                                                           //
// Fit from S. Riordan's Ph.D. thesis, CMU, 2008                             //
// d = c0 * tanh( (v*(t-t0) + c2*(t-t0)^2)/c0 )                              //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

//_____________________________________________________________________________
TanhFitTTD::TanhFitTTD()
  : TimeToDistConv(4), 
    fDriftVel(kBig), fC0(kBig), fC2(kBig), fT0(kBig), fInvC0(0)
			   
{
  // Constructor.
}

//_____________________________________________________________________________
Double_t TanhFitTTD::GetParameter( UInt_t i ) const
{
  // Get i-th parameter

  switch(i) {
  case 0:
    return fDriftVel;
  case 1:
    return fC0;
  case 2:
    return fC2;
  case 3:
    return fT0;
  }
  return kBig;
}

//_____________________________________________________________________________
Int_t TanhFitTTD::SetParameters( const vector<double>& parameters )
{
  // Set parameters of the tanh fit:
  // 0: drift velocity (m/s)
  // 1: c0 (m)
  // 2: c2 (m/s^2)
  // 3: t0 (s)

  if( (UInt_t)parameters.size() < fNparam )
    return -1;

  fDriftVel = parameters[0];
  fC0       = parameters[1];
  fC2       = parameters[2];
  fT0       = parameters[3];
  fInvC0    = 1.0/fC0;
  return 0;
}

//_____________________________________________________________________________
Double_t TanhFitTTD::ConvertTimeToDist( Double_t time, Double_t slope ) const
{
  // Convert time (s) to distance (m) using fit to tanh function.
  // Slope is used to project the distance of closest approach onto the wire
  // plane (1/cos correction).

  Double_t t = time - fT0;
  if( t <= 0.0 )
    return 0.0;
  Double_t d = fC0 * TMath::TanH( (fDriftVel*t +  fC2*t*t) * fInvC0 );
  // NB: 1/cos = sqrt(1+tan^2)
  return d * TMath::Sqrt( 1.0 + slope*slope );
}


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

}  // end namespace TreeSearch
 TimeToDistConv.cxx:1
 TimeToDistConv.cxx:2
 TimeToDistConv.cxx:3
 TimeToDistConv.cxx:4
 TimeToDistConv.cxx:5
 TimeToDistConv.cxx:6
 TimeToDistConv.cxx:7
 TimeToDistConv.cxx:8
 TimeToDistConv.cxx:9
 TimeToDistConv.cxx:10
 TimeToDistConv.cxx:11
 TimeToDistConv.cxx:12
 TimeToDistConv.cxx:13
 TimeToDistConv.cxx:14
 TimeToDistConv.cxx:15
 TimeToDistConv.cxx:16
 TimeToDistConv.cxx:17
 TimeToDistConv.cxx:18
 TimeToDistConv.cxx:19
 TimeToDistConv.cxx:20
 TimeToDistConv.cxx:21
 TimeToDistConv.cxx:22
 TimeToDistConv.cxx:23
 TimeToDistConv.cxx:24
 TimeToDistConv.cxx:25
 TimeToDistConv.cxx:26
 TimeToDistConv.cxx:27
 TimeToDistConv.cxx:28
 TimeToDistConv.cxx:29
 TimeToDistConv.cxx:30
 TimeToDistConv.cxx:31
 TimeToDistConv.cxx:32
 TimeToDistConv.cxx:33
 TimeToDistConv.cxx:34
 TimeToDistConv.cxx:35
 TimeToDistConv.cxx:36
 TimeToDistConv.cxx:37
 TimeToDistConv.cxx:38
 TimeToDistConv.cxx:39
 TimeToDistConv.cxx:40
 TimeToDistConv.cxx:41
 TimeToDistConv.cxx:42
 TimeToDistConv.cxx:43
 TimeToDistConv.cxx:44
 TimeToDistConv.cxx:45
 TimeToDistConv.cxx:46
 TimeToDistConv.cxx:47
 TimeToDistConv.cxx:48
 TimeToDistConv.cxx:49
 TimeToDistConv.cxx:50
 TimeToDistConv.cxx:51
 TimeToDistConv.cxx:52
 TimeToDistConv.cxx:53
 TimeToDistConv.cxx:54
 TimeToDistConv.cxx:55
 TimeToDistConv.cxx:56
 TimeToDistConv.cxx:57
 TimeToDistConv.cxx:58
 TimeToDistConv.cxx:59
 TimeToDistConv.cxx:60
 TimeToDistConv.cxx:61
 TimeToDistConv.cxx:62
 TimeToDistConv.cxx:63
 TimeToDistConv.cxx:64
 TimeToDistConv.cxx:65
 TimeToDistConv.cxx:66
 TimeToDistConv.cxx:67
 TimeToDistConv.cxx:68
 TimeToDistConv.cxx:69
 TimeToDistConv.cxx:70
 TimeToDistConv.cxx:71
 TimeToDistConv.cxx:72
 TimeToDistConv.cxx:73
 TimeToDistConv.cxx:74
 TimeToDistConv.cxx:75
 TimeToDistConv.cxx:76
 TimeToDistConv.cxx:77
 TimeToDistConv.cxx:78
 TimeToDistConv.cxx:79
 TimeToDistConv.cxx:80
 TimeToDistConv.cxx:81
 TimeToDistConv.cxx:82
 TimeToDistConv.cxx:83
 TimeToDistConv.cxx:84
 TimeToDistConv.cxx:85
 TimeToDistConv.cxx:86
 TimeToDistConv.cxx:87
 TimeToDistConv.cxx:88
 TimeToDistConv.cxx:89
 TimeToDistConv.cxx:90
 TimeToDistConv.cxx:91
 TimeToDistConv.cxx:92
 TimeToDistConv.cxx:93
 TimeToDistConv.cxx:94
 TimeToDistConv.cxx:95
 TimeToDistConv.cxx:96
 TimeToDistConv.cxx:97
 TimeToDistConv.cxx:98
 TimeToDistConv.cxx:99
 TimeToDistConv.cxx:100
 TimeToDistConv.cxx:101
 TimeToDistConv.cxx:102
 TimeToDistConv.cxx:103
 TimeToDistConv.cxx:104
 TimeToDistConv.cxx:105
 TimeToDistConv.cxx:106
 TimeToDistConv.cxx:107
 TimeToDistConv.cxx:108
 TimeToDistConv.cxx:109
 TimeToDistConv.cxx:110
 TimeToDistConv.cxx:111
 TimeToDistConv.cxx:112
 TimeToDistConv.cxx:113
 TimeToDistConv.cxx:114
 TimeToDistConv.cxx:115
 TimeToDistConv.cxx:116
 TimeToDistConv.cxx:117
 TimeToDistConv.cxx:118
 TimeToDistConv.cxx:119
 TimeToDistConv.cxx:120
 TimeToDistConv.cxx:121
 TimeToDistConv.cxx:122
 TimeToDistConv.cxx:123
 TimeToDistConv.cxx:124
 TimeToDistConv.cxx:125
 TimeToDistConv.cxx:126
 TimeToDistConv.cxx:127
 TimeToDistConv.cxx:128
 TimeToDistConv.cxx:129
 TimeToDistConv.cxx:130
 TimeToDistConv.cxx:131
 TimeToDistConv.cxx:132
 TimeToDistConv.cxx:133
 TimeToDistConv.cxx:134
 TimeToDistConv.cxx:135
 TimeToDistConv.cxx:136
 TimeToDistConv.cxx:137
 TimeToDistConv.cxx:138
 TimeToDistConv.cxx:139
 TimeToDistConv.cxx:140
 TimeToDistConv.cxx:141