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.

Member Enumeration Documentation

Enumerator
arbitrary 
symmetric 
antisymmetric 

Definition at line 24 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: