00001 #include "TAPAlgorithms.h"
00002 #include "TSetupData.h"
00003 #include "SetupNavigator.h"
00004
00005 #include <iostream>
00006 #include <algorithm>
00007 #include <numeric>
00008 #include <cmath>
00009 #include <numeric>
00010 #include <stdexcept>
00011
00012 double Algorithm::MaxBinAmplitude::operator() (const TPulseIsland* tpi) const {
00013
00014
00015 const std::vector<int>& pulseSamples = tpi->GetSamples();
00016 std::vector<int>::const_iterator peak_sample_pos;
00017
00018
00019 if (trigger_polarity == 1)
00020 peak_sample_pos = std::max_element(pulseSamples.begin(), pulseSamples.end());
00021 else if (trigger_polarity == -1)
00022 peak_sample_pos = std::min_element(pulseSamples.begin(), pulseSamples.end());
00023
00024
00025 amplitude = trigger_polarity*(*peak_sample_pos - pedestal);
00026 time = peak_sample_pos- pulseSamples.begin();
00027
00028 return amplitude;
00029 }
00030
00031 double Algorithm::MaxBinTime::operator() (const TPulseIsland* tpi) const {
00032
00033
00034 std::vector<int> pulseSamples = tpi->GetSamples();
00035 std::vector<int>::iterator peak_sample_pos;
00036
00037
00038 if (trigger_polarity == 1)
00039 peak_sample_pos = std::max_element(pulseSamples.begin(), pulseSamples.end());
00040 else if (trigger_polarity == -1)
00041 peak_sample_pos = std::min_element(pulseSamples.begin(), pulseSamples.end());
00042
00043
00044 double time = ((tpi->GetTimeStamp() + (peak_sample_pos - pulseSamples.begin())) * clock_tick_in_ns) - time_shift;
00045
00046 return time;
00047 }
00048
00049 double Algorithm::ConstantFractionTime::operator() (const TPulseIsland* tpi) const {
00050
00051 const std::vector<int>& samps = tpi->GetSamples();
00052 const std::vector<int>::const_iterator b = samps.begin(), e = samps.end();
00053
00054 std::vector<int>::const_iterator m = trigger_polarity > 0 ? std::max_element(b, e) : std::min_element(b, e);
00055 const int amp = *m;
00056 const unsigned int cf = trigger_polarity > 0 ?
00057 (unsigned int)(constant_fraction*(double)(amp-pedestal)) + pedestal :
00058 (unsigned int)((double)(pedestal-amp)*(1.-constant_fraction) + amp);
00059 while (m != b && (trigger_polarity > 0 ? *--m > (int)cf : *--m < (int)cf));
00060 double dx = (double)(m-b);
00061 if (*(m+1) != *m)
00062 dx += (double)((int)cf - *m)/(double)(*(m+1) - *m);
00063
00064 return (dx + (double)tpi->GetTimeStamp()) * clock_tick_in_ns - time_shift;
00065 }
00066
00067 double Algorithm::SimpleIntegral::operator() (const TPulseIsland* tpi)const {
00068 const std::vector<int>& samples = tpi->GetSamples();
00069
00070 double length = samples.size();
00071 typedef std::vector<int> SampleVector;
00072 SampleVector::const_iterator begin=samples.begin()+start;
00073 if(start > length
00074 || ( stop>0 && stop<start )
00075 || (stop<0 && length+stop <start) ){
00076 throw std::out_of_range("Algorithm::SimpleIntegral::operator() bad integral range" );
00077 }
00078 SampleVector::const_iterator end=(stop>0?samples.begin():samples.end())+stop;
00079 double tempint=std::accumulate(begin,end,0);
00080
00081 double integral = trigger_polarity * (tempint - (pedestal * (end-begin)));
00082
00083 return integral;
00084 }
00085
00086 void Algorithm::IntegralRatio::SetPedestalToMinimum(const TPulseIsland* tpi){
00087 SetPedestal(*std::min_element(tpi->GetSamples().begin(), tpi->GetSamples().end()));
00088 }
00089
00090 double Algorithm::IntegralRatio::operator() (const TPulseIsland* tpi){
00091 fHead=fHeadIntegrator(tpi);
00092 fTail=fTailIntegrator(tpi);
00093 return GetRatio();
00094 }
00095