#include "AdcSample.h" #include ////////////////////////////////////////////////////////////////////////////////////////////////// ////// container for single channel sample: ////////////////////////////////////////// AdcSample::AdcSample () { Reset (); } void AdcSample::Reset () { fBaselineDone=false; fPeakfindDone=false; fMinValue = 0; fMaxValue = 0; fSample.clear(); //fSample.resize(AWAGS_ADC_SAMPLEVALUES); fBaselineStart=0; fBaselineStop=AWAGS_ADC_SAMPLEVALUES; fMean=AWAGS_NOVALUE; fSigma=AWAGS_NOVALUE; fPeaks.clear(); fPeakDelta=0; fHeightDelta=0; fNegative=false; } bool AdcSample::IsValid() { return (fSample.size()>0 && fBaselineDone && fPeakfindDone); } void AdcSample::AddSample (uint16_t value) { fSample.push_back(value); fBaselineStop=fSample.size(); // use full sample for baseline mean and sigma evaluation by default if (fMinValue == 0 || value < fMinValue) fMinValue = value; if (value > fMaxValue) fMaxValue = value; } uint16_t AdcSample::GetSample (int index) { if (index < 0 || index >= fSample.size()) return 0; return (fSample[index]); } void AdcSample::CalculateMeanAndSigma() { fMean = 0.; fSigma=0.; double sum = 0;; double start=fBaselineStart; double stop=fBaselineStop; if(start<0) start=0; if(stop>fSample.size()) stop=fSample.size(); double num=stop-start; for (int i = start; i < stop; ++i) { fMean += fSample[i]; } if(num) fMean /= num; for (int i = start; i < stop; ++i) { sum += pow ((fSample[i] - fMean), 2); } if(num) fSigma= sqrt (sum / num); fBaselineDone=true; //std::cout<<"AdcSample::CalculateMeanAndSigma - start:"<= GetNumPeaks()) return AWAGS_NOVALUE; AdcPeak pk=fPeaks[num]; return pk.fHeight; } int AdcSample::GetPeakPosition(int num) { if(!IsValid() || num >= GetNumPeaks()) return AWAGS_NOVALUE; AdcPeak pk=fPeaks[num]; return pk.fPosition; } int AdcSample::GetNumPeaks() { return fPeaks.size(); } void AdcSample::FindPeaks(double deltaratio, double falldistance, bool negative) { int peak[AWAGS_ADC_NUMMAXIMA]; int pos[AWAGS_ADC_NUMMAXIMA]; int deltanextpeak=fSample.size()*deltaratio; // minimum distance to next peak. scaled by sample size(200 or 8000) int falldelta=falldistance; // stop peak finding if we decrease down such number of counts //std::cout<< "FindPeaks has deltaratio:"<peak[p]) { peak[p]=val; pos[p]=i; } if(val< peak[p] - falldelta) break; // stop peak search if we are on falling edge. } // for i //if(pos[p]==0) break; if(negative) peak[p]*=-1.0; // flip back to original value AddPeak(pos[p], peak[p]); // add in order of appereance. sort later //std::cout<<"FindPeaks added peak"<