/** \class THcTrigRawHit \ingroup DetSupport \brief Class representing a single raw ADC hit. It supports rich data from flash 250 ADC modules. */ #include "THcRawAdcHit.h" #include <stdexcept> #include "TString.h" THcRawAdcHit::THcRawAdcHit() : TObject(), fAdc(), fAdcTime(), fAdcPedestal(), fAdcPeak(), fAdcSample(), fHasMulti(kFALSE), fNPulses(0), fNSamples(0) {} THcRawAdcHit& THcRawAdcHit::operator=(const THcRawAdcHit& right) { TObject::operator=(right); if (this != &right) { for (UInt_t i=0; i<fMaxNPulses; ++i) { fAdc[i] = right.fAdc[i]; fAdcTime[i] = right.fAdcTime[i]; fAdcPedestal[i] = right.fAdcPedestal[i]; fAdcPeak[i] = right.fAdcPeak[i]; } for (UInt_t i=0; i<fMaxNSamples; ++i) { fAdcSample[i] = right.fAdcSample[i]; } fHasMulti = right.fHasMulti; fNPulses = right.fNPulses; fNSamples = right.fNSamples; } return *this; } THcRawAdcHit::~THcRawAdcHit() {} void THcRawAdcHit::Clear(Option_t* opt) { TObject::Clear(opt); //for (UInt_t i=0; i<fMaxNPulses; ++i) { // fAdc[i] = 0; // fAdcTime[i] = 0; // fAdcPedestal[i] = 0; // fAdcPeak[i] = 0; //} //for (UInt_t i=0; i<fMaxNSamples; ++i) { // fAdcSample[i] = 0 ; //} fHasMulti = kFALSE; fNPulses = 0; fNSamples = 0; } void THcRawAdcHit::SetData(Int_t data) { if (fNPulses >= fMaxNPulses) { throw std::out_of_range( "`THcRawAdcHit::SetData`: too many pulses!" ); } fAdc[fNPulses] = data; ++fNPulses; } void THcRawAdcHit::SetSample(Int_t data) { if (fNSamples >= fMaxNSamples) { throw std::out_of_range( "`THcRawAdcHit::SetSample`: too many samples!" ); } fAdcSample[fNSamples] = data; ++fNSamples; } void THcRawAdcHit::SetDataTimePedestalPeak( Int_t data, Int_t time, Int_t pedestal, Int_t peak ) { if (fNPulses >= fMaxNPulses) { throw std::out_of_range( "`THcRawAdcHit::SetData`: too many pulses!" ); } fAdc[fNPulses] = data; fAdcTime[fNPulses] = data; fAdcPedestal[fNPulses] = data; fAdcPeak[fNPulses] = data; fHasMulti = kTRUE; ++fNPulses; } Int_t THcRawAdcHit::GetRawData(UInt_t iPulse) { if (iPulse >= fNPulses && iPulse != 0) { TString msg = TString::Format( "`THcRawAdcHit::GetRawData`: requested pulse %d where only %d pulses available!", iPulse, fNPulses ); throw std::out_of_range(msg.Data()); } else if (iPulse >= fNPulses && iPulse == 0) { return 0; } else { return fAdc[iPulse]; } } Int_t THcRawAdcHit::GetAdcTime(UInt_t iPulse) { if (iPulse >= fNPulses && iPulse != 0) { TString msg = TString::Format( "`THcRawAdcHit::GetAdcTime`: requested pulse %d where only %d pulses available!", iPulse, fNPulses ); throw std::out_of_range(msg.Data()); } else if (fHasMulti) { return fAdcTime[iPulse]; } else { return 0; } } Int_t THcRawAdcHit::GetAdcPedestal(UInt_t iPulse) { if (iPulse >= fNPulses && iPulse != 0) { TString msg = TString::Format( "`THcRawAdcHit::GetAdcPedestal`: requested pulse %d where only %d pulses available!", iPulse, fNPulses ); throw std::out_of_range(msg.Data()); } else if (fHasMulti) { return fAdcPedestal[iPulse]; } else { return 0; } } Int_t THcRawAdcHit::GetAdcPeak(UInt_t iPulse) { if (iPulse >= fNPulses && iPulse != 0) { TString msg = TString::Format( "`THcRawAdcHit::GetAdcPeak`: requested pulse %d where only %d pulses available!", iPulse, fNPulses ); throw std::out_of_range(msg.Data()); } else if (fHasMulti) { return fAdcPeak[iPulse]; } else { return 0; } } Int_t THcRawAdcHit::GetSample(UInt_t iSample) { if (iSample >= fNSamples && iSample != 0) { TString msg = TString::Format( "`THcRawAdcHit::GetSample`: requested sample %d where only %d sample available!", iSample, fNSamples ); throw std::out_of_range(msg.Data()); } else if (iSample >= fNSamples && iSample == 0) { return 0; } else { return fAdcSample[iSample]; } } Double_t THcRawAdcHit::GetAverage(UInt_t iSampleLow, UInt_t iSampleHigh) { if (iSampleHigh >= fNSamples || iSampleLow >= fNSamples) { TString msg = TString::Format( "`THcRawAdcHit::GetAverage`: not this many samples available!" ); throw std::out_of_range(msg.Data()); } else { Double_t average = 0.0; for (UInt_t i=iSampleLow; i<=iSampleHigh; ++i) { average += fAdcSample[i]; } return average / (iSampleHigh - iSampleLow + 1); } } Int_t THcRawAdcHit::GetIntegral(UInt_t iSampleLow, UInt_t iSampleHigh) { if (iSampleHigh >= fNSamples || iSampleLow >= fNSamples) { TString msg = TString::Format( "`THcRawAdcHit::GetAverage`: not this many samples available!" ); throw std::out_of_range(msg.Data()); } else { Int_t integral = 0; for (UInt_t i=iSampleLow; i<=iSampleHigh; ++i) { integral += fAdcSample[i]; } return integral; } } Double_t THcRawAdcHit::GetData( UInt_t iPedLow, UInt_t iPedHigh, UInt_t iIntLow, UInt_t iIntHigh ) { return GetIntegral(iIntLow, iIntHigh) - GetAverage(iPedHigh, iPedLow) * (iIntHigh - iIntLow + 1); } UInt_t THcRawAdcHit::GetNPulses() { return fNPulses; } UInt_t THcRawAdcHit::GetNSamples() { return fNSamples; } Bool_t THcRawAdcHit::HasMulti() { return fHasMulti; } ClassImp(THcRawAdcHit)