FairRoot/PandaRoot
Public Types | Public Member Functions | Private Attributes | List of all members
PndEmcFadcFilter Class Reference

FADC FIR (finite impulse response) filter. More...

#include <PndEmcFadcFilter.h>

Inheritance diagram for PndEmcFadcFilter:

Public Types

enum  type { arbitrary = 0, symmetric = 1, antisymmetric = -1 }
 

Public Member Functions

 PndEmcFadcFilter ()
 
virtual ~PndEmcFadcFilter ()
 
virtual void Filter (const std::vector< Double_t > &in, std::vector< Double_t > &out) const
 
void SetData (Double_t data[], Int_t i_size, Int_t i_offset)
 
Int_t MinIndex () const
 
Int_t MaxIndex () const
 
Int_t Size () const
 
void Convolute (const PndEmcFadcFilter &filt)
 
void Convolute (const PndEmcFadcFilter &lhs, const PndEmcFadcFilter &rhs)
 
void Clear ()
 
void SetupMA (Int_t i_width)
 
void SetupMWD (Int_t i_width, Double_t tau)
 
void SetupMatchedFilter (Int_t i_width, PndEmcAbsPulseshape *pulseshape, Double_t sampleRate)
 
void SetupBipolarTrapez (Int_t i_rise, Int_t i_flat, Int_t i_width)
 
void SetupTrapez (Int_t i_rise, Int_t i_flat)
 
void SetupBipolarTriangle (Int_t i_rise)
 
void SetupDifferentiator (Int_t i_lag=0, Int_t i_width=1)
 
void SetupDoubleDifferentiator (Int_t i_npos=1, Int_t i_nneg=1, Int_t i_nzero=0)
 
void SetupPZDifferentiator (Int_t i_lag=0, Double_t d_fac=1.)
 
void SetNormalizeFloating (Double_t d_norm=1.)
 
void SetNormalizeInteger (Int_t i_shift=0)
 
std::vector< Double_tGetWeights () const
 

Private Attributes

std::vector< Double_tfCoeff
 
Int_t fOffset
 
Int_t fType
 
Bool_t fIntegerize
 
Double_t fNormFactor
 
Int_t fShiftCount
 

Detailed Description

FADC FIR (finite impulse response) filter.

Definition at line 21 of file PndEmcFadcFilter.h.

Constructor & Destructor Documentation

PndEmcFadcFilter::PndEmcFadcFilter ( )

Definition at line 29 of file PndEmcFadcFilter.cxx.

References fCoeff.

29  :
30  fCoeff(),
31  fOffset(0),
33  fIntegerize(kFALSE),
34  fNormFactor(1.),
35  fShiftCount(0)
36 {
37  fCoeff.clear();
38 }
std::vector< Double_t > fCoeff
PndEmcFadcFilter::~PndEmcFadcFilter ( )
virtual

Definition at line 40 of file PndEmcFadcFilter.cxx.

41 {}

Member Function Documentation

void PndEmcFadcFilter::Clear ( )
void PndEmcFadcFilter::Convolute ( const PndEmcFadcFilter filt)

Definition at line 83 of file PndEmcFadcFilter.cxx.

84 {
85  PndEmcFadcFilter tmp(*this);
86  Convolute(tmp, filt);
87  return;
88 }
FADC FIR (finite impulse response) filter.
void Convolute(const PndEmcFadcFilter &filt)
void PndEmcFadcFilter::Convolute ( const PndEmcFadcFilter lhs,
const PndEmcFadcFilter rhs 
)

Definition at line 91 of file PndEmcFadcFilter.cxx.

References arbitrary, Clear(), Double_t, fCoeff, fIntegerize, fNormFactor, fOffset, fShiftCount, fType, i, and Size().

93 {
94  const Double_t* p_lhs = &lhs.fCoeff[0];
95  const Double_t* p_rhs = &rhs.fCoeff[0];
96  Int_t i_nlhs = lhs.Size();
97  Int_t i_nrhs = rhs.Size();
98  Int_t i_size = i_nlhs + i_nrhs - 1;
99 
100  Clear();
101  fCoeff.resize(i_size);
102 
103  for (Int_t i = 0; i < i_size; i++) {
104  Double_t f_sum = 0.;
105  for (Int_t j = 0; j < i_nlhs; j++) {
106  Int_t k = j - i + i_nrhs - 1;
107  Double_t f_rhs = (k >= 0 && k < i_nrhs) ? p_rhs[k] : 0.;
108  f_sum += p_lhs[j] * f_rhs;
109  }
110  fCoeff[i] = f_sum;
111  }
112 
113  fType = lhs.fType * rhs.fType;
114  if (fType == arbitrary) {
115  fOffset = (i_size)/2; // ???
116  } else {
117  fOffset = (i_size)/2;
118  }
119 
120  fIntegerize = lhs.fIntegerize & rhs.fIntegerize;
121  fShiftCount = (fIntegerize) ? lhs.fShiftCount + rhs.fShiftCount : 0;
122  fNormFactor = lhs.fNormFactor * rhs.fNormFactor;
123 
124  return;
125 }
Int_t i
Definition: run_full.C:25
Double_t
Int_t Size() const
std::vector< Double_t > fCoeff
void PndEmcFadcFilter::Filter ( const std::vector< Double_t > &  in,
std::vector< Double_t > &  out 
) const
virtual

Definition at line 44 of file PndEmcFadcFilter.cxx.

References Double_t, fCoeff, fIntegerize, fNormFactor, i, MaxIndex(), and MinIndex().

Referenced by PndEmcPSATrapDigiFilter::Process(), PndEmcPSAMatchedDigiFilter::Process(), and testFilter().

45 {
46  Int_t i_size = in.size();
47  if (i_size == 0) {
48  out.clear();
49  return;
50  }
51 
52  Int_t i_nlpad = -MinIndex();
53  Int_t i_nrpad = MaxIndex();
54  Int_t i_ntab = fCoeff.size();
55  std::vector<Double_t> temp(i_size + i_nlpad + i_nrpad);
56 
57  Double_t* p_data = &temp[0];
58  for (Int_t i = 0; i < i_nlpad; i++) *p_data++ = in[0];
59  for (Int_t i = 0; i < i_size; i++) *p_data++ = in[i];
60  for (Int_t i = 0; i < i_nrpad; i++) *p_data++ = in[i_size-1];
61 
62  out.resize(i_size);
63 
64  p_data = &temp[0];
65  for (Int_t i = 0; i < i_size; i++) {
66  const Double_t* p_d = p_data;
67  const Double_t* p_c = &fCoeff[0];
68  Double_t d_sum = 0.;
69 
70  for (Int_t j = 0; j < i_ntab; j++)
71  d_sum += *p_c++ * *p_d++;
72  p_data ++;
73 
74  d_sum *= fNormFactor;
75  if (fIntegerize) d_sum = floor(d_sum);
76  out[i] = d_sum;
77  }
78 
79  return;
80 }
Int_t i
Definition: run_full.C:25
Double_t
Int_t MinIndex() const
TFile * out
Definition: reco_muo.C:20
std::vector< Double_t > fCoeff
Int_t MaxIndex() const
std::vector<Double_t> PndEmcFadcFilter::GetWeights ( ) const
inline

Definition at line 58 of file PndEmcFadcFilter.h.

References fCoeff.

58 {return fCoeff;}
std::vector< Double_t > fCoeff
Int_t PndEmcFadcFilter::MaxIndex ( ) const

Definition at line 378 of file PndEmcFadcFilter.cxx.

References fCoeff, and fOffset.

Referenced by Filter().

379 {
380  return fCoeff.size() - 1 - fOffset;
381 }
std::vector< Double_t > fCoeff
Int_t PndEmcFadcFilter::MinIndex ( ) const

Definition at line 372 of file PndEmcFadcFilter.cxx.

References fOffset.

Referenced by Filter().

373 {
374  return -fOffset;
375 }
void PndEmcFadcFilter::SetData ( Double_t  data[],
Int_t  i_size,
Int_t  i_offset 
)

Definition at line 128 of file PndEmcFadcFilter.cxx.

References antisymmetric, arbitrary, Clear(), Double_t, fCoeff, fOffset, fType, i, and symmetric.

Referenced by testFilter().

129 {
130  Clear();
131  fCoeff.resize(i_size);
132  for (Int_t i = 0; i < i_size; i++) fCoeff[i] = data[i];
133 
134  if (i_size == 1) {
135  fType = symmetric;
136  } else {
137  Int_t i_nsym = 0;
138  Int_t i_nasym = 0;
139  Int_t i_size2 = i_size/2;
140  for (Int_t i = 0; i < i_size2; i++) {
141  Double_t f_left = data[i];
142  Double_t f_right = data[i_size-i-1];
143  if (f_left == f_right) i_nsym += 1;
144  if (f_left == -f_right) i_nasym += 1;
145  }
146  fType = arbitrary;
147  if (i_nsym == i_size2) fType = symmetric;
148  if (i_nasym == i_size2) fType = antisymmetric;
149  }
150 
151  if (fType != arbitrary || i_offset < 0)
152  i_offset = i_size/2;
153 
154  fOffset = i_offset;
155 
156  return;
157 }
Int_t i
Definition: run_full.C:25
Double_t
std::vector< Double_t > fCoeff
void PndEmcFadcFilter::SetNormalizeFloating ( Double_t  d_norm = 1.)

Definition at line 353 of file PndEmcFadcFilter.cxx.

References fIntegerize, fNormFactor, and fShiftCount.

354 {
355  fIntegerize = kFALSE;
356  fShiftCount = 0;
357  fNormFactor = d_norm;
358  return;
359 }
void PndEmcFadcFilter::SetNormalizeInteger ( Int_t  i_shift = 0)

Definition at line 362 of file PndEmcFadcFilter.cxx.

References fIntegerize, fNormFactor, fShiftCount, and i.

363 {
364  fIntegerize = kTRUE;
365  fShiftCount = i_shift;
366  fNormFactor = 1.;
367  for (Int_t i = 0; i < i_shift; i++) fNormFactor *= 0.5;
368  return;
369 }
Int_t i
Definition: run_full.C:25
void PndEmcFadcFilter::SetupBipolarTrapez ( Int_t  i_rise,
Int_t  i_flat,
Int_t  i_width 
)

Definition at line 217 of file PndEmcFadcFilter.cxx.

References Clear(), fCoeff, fType, i, and symmetric.

218 {
219  Int_t i_size = 2*i_rise + 2*i_flat+i_width+1;
220  Clear();
221 
222  fCoeff.resize(i_size);
223  fType = symmetric;
224 
225  for (Int_t i = 0; i < i_rise; i++) {
226  fCoeff[i] = i;
227  fCoeff[i_size-i-1] = -i;
228  }
229 
230  for (Int_t i = i_rise; i < (i_rise+i_flat); i++)
231  {
232  fCoeff[i] = i_rise;
233  fCoeff[i_flat+i_width+i+1] = -i_rise;
234  }
235 
236  for (Int_t i = (i_rise+i_flat); i <= (i_rise+i_flat+i_width); i++) {
237  fCoeff[i] = i_rise-2*i_rise/i_width*(i-i_rise-i_width);
238  }
239 
240  return;
241 }
Int_t i
Definition: run_full.C:25
std::vector< Double_t > fCoeff
void PndEmcFadcFilter::SetupBipolarTriangle ( Int_t  i_rise)

Definition at line 264 of file PndEmcFadcFilter.cxx.

References antisymmetric, Clear(), fCoeff, fOffset, fType, and i.

265 {
266  Int_t i_size = 4*i_rise + 1;
267  Clear();
268 
269  fOffset = 2*i_rise;
270  fCoeff.resize(i_size);
272 
273  for (Int_t i = 0; i <= i_rise; i++) {
274  fCoeff[i] = i;
275  fCoeff[fOffset-i] = i;
276  fCoeff[fOffset+i] = -i;
277  fCoeff[i_size-i-1] = -i;
278  }
279 
280  return;
281 }
Int_t i
Definition: run_full.C:25
std::vector< Double_t > fCoeff
void PndEmcFadcFilter::SetupDifferentiator ( Int_t  i_lag = 0,
Int_t  i_width = 1 
)

Definition at line 284 of file PndEmcFadcFilter.cxx.

References antisymmetric, Clear(), fCoeff, fOffset, fType, and i.

285 {
286  Int_t i_size = i_lag + 2*i_width;
287  Clear();
288 
289  fOffset = (i_size)/2;
290  fCoeff.resize(i_size);
292 
293  for (Int_t i = 0; i < i_size; i++) fCoeff[i] = 0;
294  for (Int_t i = 0; i < i_width; i++) {
295  fCoeff[i] = -1.;
296  fCoeff[i_size-i-1] = 1.;
297  }
298 
299  return;
300 }
Int_t i
Definition: run_full.C:25
std::vector< Double_t > fCoeff
void PndEmcFadcFilter::SetupDoubleDifferentiator ( Int_t  i_npos = 1,
Int_t  i_nneg = 1,
Int_t  i_nzero = 0 
)

Definition at line 303 of file PndEmcFadcFilter.cxx.

References Clear(), fCoeff, fOffset, fType, i, max(), and symmetric.

305 {
306  Int_t i_size = i_npos + 2*(i_nzero + i_nneg);
307  Clear();
308 
309  fOffset = (i_size)/2;
310  fCoeff.resize(i_size);
311  fType = symmetric;
312 
313  Int_t i_apos = 2*i_nneg;
314  Int_t i_aneg = i_npos;
315  Int_t i_div = 1;
316  for (Int_t i = 2; i < max(i_apos,i_aneg); i++) {
317  if (i_apos%i == 0 && i_aneg%i == 0) i_div = i;
318  }
319  i_apos /= i_div;
320  i_aneg /= i_div;
321 
322  for (Int_t i = 0; i < i_size; i++) fCoeff[i] = i_apos;
323  for (Int_t i = 0; i < i_nneg; i++) {
324  fCoeff[i] = -i_aneg;
325  fCoeff[i_size-i-1] = -i_aneg;
326  }
327  for (Int_t i = i_nneg; i < i_nneg+i_nzero; i++) {
328  fCoeff[i] = 0.;
329  fCoeff[i_size-i-1] = 0.;
330  }
331 
332  return;
333 }
Int_t i
Definition: run_full.C:25
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
Definition: P4_F32vec4.h:26
std::vector< Double_t > fCoeff
void PndEmcFadcFilter::SetupMA ( Int_t  i_width)

Definition at line 160 of file PndEmcFadcFilter.cxx.

References Clear(), fCoeff, fType, i, and symmetric.

161 {
162  Int_t i_size = i_width;
163  Clear();
164  fCoeff.resize(i_size);
165  fType = symmetric;
166 
167  for (Int_t i = 0; i < i_size; i++) {
168  fCoeff[i] = 1./i_width;
169  }
170 
171  return;
172 }
Int_t i
Definition: run_full.C:25
std::vector< Double_t > fCoeff
void PndEmcFadcFilter::SetupMatchedFilter ( Int_t  i_width,
PndEmcAbsPulseshape pulseshape,
Double_t  sampleRate 
)

Definition at line 193 of file PndEmcFadcFilter.cxx.

References arbitrary, Clear(), Double_t, fCoeff, fType, i, t, val, and PndEmcAbsPulseshape::value().

Referenced by PndEmcPSAMatchedDigiFilter::Process().

194 {
195  Int_t i_size = i_width;
196  Clear();
197  fCoeff.resize(i_size);
198  fType = arbitrary;
199 
200  Double_t amplitude=1.;
201  Double_t t;
202  Double_t val=0;
203 
204  for ( int i=0;i<i_size;i++)
205  {
206  t= i/sampleRate;
207  val=pulseshape->value(t,amplitude,0.);
208  fCoeff[i]=val;
209  }
210 
211  std::reverse(fCoeff.begin(), fCoeff.end());
212 
213  return;
214 
215 }
Int_t i
Definition: run_full.C:25
Double_t val[nBoxes][nFEBox]
Definition: createCalib.C:11
virtual double value(const double t, const double amp, const double toffset) const
Double_t
std::vector< Double_t > fCoeff
TTree * t
Definition: bump_analys.C:13
void PndEmcFadcFilter::SetupMWD ( Int_t  i_width,
Double_t  tau 
)

Definition at line 175 of file PndEmcFadcFilter.cxx.

References arbitrary, Clear(), fCoeff, fType, and i.

176 {
177  Int_t i_size = i_width;
178  Clear();
179  fCoeff.resize(i_size);
180  fType = arbitrary;
181 
182  fCoeff[0]=1;
183  fCoeff[i_size-1]=-(1-1./tau);
184 
185  for (Int_t i = 1; i < i_size-1; i++) {
186  fCoeff[i] = 1./tau;
187  }
188 
189  return;
190 }
Int_t i
Definition: run_full.C:25
std::vector< Double_t > fCoeff
void PndEmcFadcFilter::SetupPZDifferentiator ( Int_t  i_lag = 0,
Double_t  d_fac = 1. 
)

Definition at line 336 of file PndEmcFadcFilter.cxx.

References arbitrary, Clear(), fCoeff, fOffset, fType, and i.

337 {
338  Int_t i_size = i_lag + 2;
339  Clear();
340 
341  fOffset = (i_size)/2;
342  fCoeff.resize(i_size);
343  fType = arbitrary;
344 
345  for (Int_t i = 0; i < i_size; i++) fCoeff[i] = 0.;
346  fCoeff[0] = -d_fac;
347  fCoeff[i_size-1] = 1.;
348 
349  return;
350 }
Int_t i
Definition: run_full.C:25
std::vector< Double_t > fCoeff
void PndEmcFadcFilter::SetupTrapez ( Int_t  i_rise,
Int_t  i_flat 
)

Definition at line 244 of file PndEmcFadcFilter.cxx.

References Clear(), fCoeff, fOffset, fType, i, and symmetric.

Referenced by PndEmcPSATrapDigiFilter::Process(), and testFilter().

245 {
246  Int_t i_size = 2*i_rise + i_flat;
247  Clear();
248 
249  fOffset = (i_size)/2;
250  fCoeff.resize(i_size);
251  fType = symmetric;
252 
253  for (Int_t i = 0; i < i_size; i++) fCoeff[i] = i_rise+1;
254  for (Int_t i = 0; i < i_rise; i++) {
255  fCoeff[i] = i+1;
256  fCoeff[i_size-i-1] = i+1;
257  }
258 
259  return;
260 }
Int_t i
Definition: run_full.C:25
std::vector< Double_t > fCoeff
Int_t PndEmcFadcFilter::Size ( ) const

Definition at line 384 of file PndEmcFadcFilter.cxx.

References fCoeff.

Referenced by Convolute().

385 {
386  return fCoeff.size();
387 }
std::vector< Double_t > fCoeff

Member Data Documentation

std::vector<Double_t> PndEmcFadcFilter::fCoeff
private
Bool_t PndEmcFadcFilter::fIntegerize
private

Definition at line 64 of file PndEmcFadcFilter.h.

Referenced by Convolute(), Filter(), SetNormalizeFloating(), and SetNormalizeInteger().

Double_t PndEmcFadcFilter::fNormFactor
private

Definition at line 65 of file PndEmcFadcFilter.h.

Referenced by Convolute(), Filter(), SetNormalizeFloating(), and SetNormalizeInteger().

Int_t PndEmcFadcFilter::fOffset
private
Int_t PndEmcFadcFilter::fShiftCount
private

Definition at line 66 of file PndEmcFadcFilter.h.

Referenced by Convolute(), SetNormalizeFloating(), and SetNormalizeInteger().

Int_t PndEmcFadcFilter::fType
private

The documentation for this class was generated from the following files: