00001
00008 #ifndef __QOPTIMUMFILTER_HH__
00009 #define __QOPTIMUMFILTER_HH__
00010 #include <vector>
00011
00012
00013 #include "QVector.hh"
00014 #include "QVectorC.hh"
00015 #include "QError.hh"
00016 #include "cmath"
00017 using namespace std;
00018 using namespace Cuore;
00019
00020
00021 struct PulseInfo
00022 {
00023 int max_index;
00024 float amplitude,frac_delay,delay,second_amp,second_delay;
00025 };
00026
00027
00028
00029 class OptimumFilter {
00030
00031 public:
00032
00036 OptimumFilter();
00037
00038
00039 virtual ~OptimumFilter();
00040
00044 QError Compute();
00045
00050 QError Compute_d();
00055 QError SetFilters(const QVector &avg, const QVector &noise);
00059 QError SetFilters_d(const QVector &avg, const QVector &noise);
00063 float Amplitude(QVector &pSamples, float &) ;
00067 float PulseAmplitude(QVector &pSamples) ;
00071 float GetTVR();
00075 float GetTVL();
00079 float GetRT(){return RT;};
00080
00085 float GetDT(){return DT;}
00086
00090 float GetAdc2mV(){return pow(2.,-16.)*pow(10.,4);};
00094 float GetDelay(){return data.delay; };
00098 float GetFracDelay(){return data.frac_delay; };
00099
00103 void SetTriggerPos(int trigger) { fTriggerPos = trigger; };
00104
00105
00106
00107
00111 void ShapeParameters(QVector &SamplesFiltered);
00115 QVector PolFit(QVector &x,QVector& y);
00119 QError PowerSpectrum(const QVector &pSamples, QVector &samplesFiltered);
00123 QError Filter(const QVector &pSamples, QVector &samplesFiltered);
00127 QError Filter_d(const QVector &pSamples, QVector &samplesFiltered);
00131 QError FAmplitude(const QVector &pSamples, double &);
00132
00137 float MultiplePulseCorrection(QVector &, QVector & , QVector &,bool);
00138 float GetAmplitude(){return data.amplitude;};
00139 float GetSecondAmplitude(){return data.second_amp;};
00140 float GetSecondDelay(){return data.second_delay;};
00141 void CallPileUp(){ fMultiPulse = true; } ;
00145 void BiPol(QVector &, QVector &, QVector &);
00149 const QVector& averagePulse(){return AvgPulse;}
00153 const QVector& averagePulse_f(){return AvgPulse_f;}
00157 const QVector& noiseSpectrum(){return fPS;}
00158
00163 QVector ReconstructionFit(QVector & , QVector &, QVector &);
00164
00168 QVector GetReconstructedFit(){return fReconstructedPulse;};
00169
00170
00175 void Decay_and_Rise(const QVector &);
00176
00177
00182 QVector fShift(QVector &, float &);
00187 float GetBLS(){return fBS;};
00194 void SetPulseInfo(const QVector &);
00195
00196 private:
00197
00198
00199 PulseInfo data;
00200 QVector AvgPulse;
00201 int nSigPulses;
00202
00203
00204 QVector fPS;
00205 bool fMultiPulse;
00206 int nNoisePS;
00207 unsigned int avg_nmax,fTriggerPos;
00208
00209 int rms_left, rms_right,fMaxRange,fSize, fBaseLineStart,fBaseLineNpt;
00210
00211
00212 double conv,conv_d,fDelay;
00213
00214
00215 float tvl,tvr,RT,DT,fBS;
00216
00217
00218 QVectorC H;
00219
00220 QVector AvgPulse_f;
00221
00222 QVector fReconstructedPulse;
00223
00224 };
00225
00226 #endif
00227