00001 #include "TPulseIsland.h"
00002
00003 #include <cmath>
00004 #include <sstream>
00005 #include <cstdlib>
00006 #include <algorithm>
00007
00008 #include "TF1.h"
00009
00010 using std::vector;
00011 using std::string;
00012
00013 TPulseIsland::TPulseIsland() : fSamples(), fTimeStamp(0), fBankName("") {
00014 }
00015
00016 TPulseIsland::TPulseIsland(int timestamp, const vector<int>::const_iterator& first,
00017 const vector<int>::const_iterator& last, string bank_name) :
00018 fSamples(first,last), fTimeStamp(timestamp), fBankName(bank_name) {
00019 }
00020
00021 TPulseIsland::TPulseIsland(int timestamp, const vector<int>& samples_vector, string bank_name) :
00022 fSamples(samples_vector), fTimeStamp(timestamp), fBankName(bank_name) {
00023 }
00024
00025 void TPulseIsland::Reset(Option_t* o)
00026 {
00027 fTimeStamp = 0;
00028 fSamples.clear();
00029 fBankName = "";
00030 }
00031
00032
00033
00034 double TPulseIsland::GetAmplitude() const {
00035
00036 if (TSetupData::Instance()->IsFast(fBankName))
00037 return GetFastPulseAmplitude();
00038 else
00039 return GetSlowPulseAmplitude();
00040
00041 }
00042
00043
00044
00045
00046 double TPulseIsland::GetFastPulseAmplitude() const {
00047
00048 double pedestal = GetPedestal(10);
00049 int peak_sample_element = GetPeakSample();
00050
00051 return ( GetTriggerPolarity()*(fSamples.at(peak_sample_element) - pedestal) );
00052 }
00053
00054 double TPulseIsland::GetSlowPulseAmplitude() const {
00055
00056 double pedestal = GetPedestal(10);
00057 int peak_sample_element = GetPeakSample();
00058
00059 return ( GetTriggerPolarity()*(fSamples.at(peak_sample_element) - pedestal) );
00060 }
00061
00062 double TPulseIsland::GetPulseHeight() const {
00063
00064 double pedestal = GetPedestal(10);
00065 int peak_sample_element = GetPeakSample();
00066
00067 return ( GetTriggerPolarity()*(fSamples.at(peak_sample_element) - pedestal) );
00068 }
00069
00070 double TPulseIsland::GetPulseTime() const {
00071
00072 return (fTimeStamp + GetPeakSample()) * GetClockTickInNs();
00073 }
00074
00075
00076
00077 TH1I* TPulseIsland::GetPulseWaveform(std::string histname, std::string histtitle) const {
00078
00079 TH1I* hWaveform = new TH1I(histname.c_str(), histtitle.c_str(), fSamples.size(),0,fSamples.size());
00080
00081
00082 for (std::vector<int>::const_iterator sampleIter = fSamples.begin(); sampleIter != fSamples.end(); sampleIter++) {
00083 hWaveform->Fill(sampleIter - fSamples.begin(), *sampleIter);
00084 }
00085
00086 return hWaveform;
00087 }
00088
00089
00090 int TPulseIsland::GetPeakSample() const {
00091
00092 std::vector<int>::const_iterator peak;
00093 if(GetTriggerPolarity() == 1)
00094 peak = std::max_element(fSamples.begin(), fSamples.end());
00095 else
00096 peak = std::min_element(fSamples.begin(), fSamples.end());
00097
00098 return peak - fSamples.begin();
00099 }
00100
00101 double TPulseIsland::GetPedestal(int nPedSamples) const {
00102 return TSetupData::Instance()->GetPedestal(fBankName);
00103 }