diff --git a/SConscript.py b/SConscript.py index 75e8fe887f5fdec019afaee8f47a86d06ae7a193..d73fc0c82871abe0f4ea86de5f95e5799f8cbe57 100644 --- a/SConscript.py +++ b/SConscript.py @@ -23,7 +23,7 @@ src/THcGlobals.h src/THcDCTrack.h src/THcFormula.h src/THcRaster.h src/THcRasteredBeam.h src/THcRasterRawHit.h src/THcScalerEvtHandler.h src/THcHodoEff.h src/THcTrigApp.h src/THcTrigDet.h src/THcTrigRawHit.h -src/THcRawAdcHit.h +src/THcRawAdcHit.h src/THcRawTdcHit.h src/THcDummySpectrometer.h src/HallC_LinkDef.h """) diff --git a/src/HallC_LinkDef.h b/src/HallC_LinkDef.h index 038d603f4d02adba6f77e30316f256ae75bd32cd..2044547b5696dbd8bd3301cfa45ee00a3ebd4040 100644 --- a/src/HallC_LinkDef.h +++ b/src/HallC_LinkDef.h @@ -61,6 +61,7 @@ #pragma link C++ class THcTrigDet+; #pragma link C++ class THcTrigRawHit+; #pragma link C++ class THcRawAdcHit+; +#pragma link C++ class THcRawTdcHit+; #pragma link C++ class THcDummySpectrometer+; #endif diff --git a/src/SConscript.py b/src/SConscript.py index e78643521448f6b4a590f46c358e3a6de40805aa..ee3f6a5b861034f833eb58e451811f3557ad7567 100644 --- a/src/SConscript.py +++ b/src/SConscript.py @@ -28,7 +28,7 @@ THcFormula.cxx THcRaster.cxx THcRasteredBeam.cxx THcRasterRawHit.cxx THcScalerEvtHandler.cxx THcTrigApp.cxx THcTrigDet.cxx THcTrigRawHit.cxx -THcRawAdcHit.cxx +THcRawAdcHit.cxx THcRawTdcHit.cxx THcDummySpectrometer.cxx THcHodoEff.cxx """) diff --git a/src/THcRawAdcHit.cxx b/src/THcRawAdcHit.cxx index 3fc88ac0ee15daa22d143dcbef2c508b26564c87..93f8fdb6e140374dcf135002c51781de8353eebe 100644 --- a/src/THcRawAdcHit.cxx +++ b/src/THcRawAdcHit.cxx @@ -1,5 +1,5 @@ /** -\class THcTrigRawHit +\class THcRawAdcHit \ingroup DetSupport \brief Class representing a single raw ADC hit. @@ -16,6 +16,8 @@ It supports rich data from flash 250 ADC modules. THcRawAdcHit::THcRawAdcHit() : TObject(), + fNPedestalSamples(4), fNPeakSamples(10), + fPeakPedestalRatio(1.0*fNPeakSamples/fNPedestalSamples), fAdc(), fAdcTime(), fAdcPedestal(), fAdcPeak(), fAdcSample(), fHasMulti(kFALSE), fNPulses(0), fNSamples(0) {} @@ -49,15 +51,15 @@ 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 ; - //} + for (UInt_t i=0; i<fNPulses; ++i) { + fAdc[i] = 0; + fAdcTime[i] = 0; + fAdcPedestal[i] = 0; + fAdcPeak[i] = 0; + } + for (UInt_t i=0; i<fNSamples; ++i) { + fAdcSample[i] = 0 ; + } fHasMulti = kFALSE; fNPulses = 0; fNSamples = 0; @@ -246,4 +248,34 @@ Bool_t THcRawAdcHit::HasMulti() { } +Int_t THcRawAdcHit::GetPedRaw() { + return fAdcPedestal[0]; +} + + +Int_t THcRawAdcHit::GetPeakIntRaw(UInt_t iPulse) { + return fAdc[iPulse]; +} + + +Int_t THcRawAdcHit::GetPeakAmpRaw(UInt_t iPulse) { + return fAdcPeak[iPulse]; +} + + +Double_t THcRawAdcHit::GetPed() { + return 1.0 * fAdcPedestal[0]/fNPedestalSamples; +} + + +Double_t THcRawAdcHit::GetPeakInt(UInt_t iPulse) { + return fAdc[iPulse] - fAdcPedestal[0] * fPeakPedestalRatio; +} + + +Double_t THcRawAdcHit::GetPeakAmp(UInt_t iPulse) { + return fAdcPeak[iPulse] - 1.0 * fAdcPedestal[0]/fNPedestalSamples; +} + + ClassImp(THcRawAdcHit) diff --git a/src/THcRawAdcHit.h b/src/THcRawAdcHit.h index f5a2a5c98d626310cc16aedc09b9889b2cebb3b1..4fb94a7e720d1e490eca0d0b5c0d0466629e0cff 100644 --- a/src/THcRawAdcHit.h +++ b/src/THcRawAdcHit.h @@ -35,13 +35,28 @@ class THcRawAdcHit : public TObject { Bool_t HasMulti(); + Int_t GetPedRaw(); + Int_t GetPeakIntRaw(UInt_t iPulse=0); + Int_t GetPeakAmpRaw(UInt_t iPulse=0); + //Int_t GetPeakTimeRaw(UInt_t iPulse=0); // TODO: Figure out what to do with time. + + Double_t GetPed(); + Double_t GetPeakInt(UInt_t iPulse=0); + Double_t GetPeakAmp(UInt_t iPulse=0); + //Double_t GetPeakTime(UInt_t iPulse=0); + + protected: static const UInt_t fMaxNPulses = 4; static const UInt_t fMaxNSamples = 511; - Int_t fAdc[fMaxNPulses]; + Int_t fNPedestalSamples; // TODO: Get this from prestart event... + Int_t fNPeakSamples; + Double_t fPeakPedestalRatio; + + Int_t fAdc[fMaxNPulses]; // TODO: Rename these... Int_t fAdcTime[fMaxNPulses]; - Int_t fAdcPedestal[fMaxNPulses]; + Int_t fAdcPedestal[fMaxNPulses]; // TODO: There should only be 1 pedestal... Int_t fAdcPeak[fMaxNPulses]; Int_t fAdcSample[fMaxNSamples]; diff --git a/src/THcRawShowerHit.cxx b/src/THcRawShowerHit.cxx index 6fd0d279459d8e07537166b72f30187c3e3691dc..9068c1659ea6dcf90e8a927270625df0657378eb 100644 --- a/src/THcRawShowerHit.cxx +++ b/src/THcRawShowerHit.cxx @@ -15,7 +15,7 @@ THcRawShowerHit::THcRawShowerHit(Int_t plane, Int_t counter) : - fAdcPos(), fAdcNeg() + fAdcHits() {} @@ -23,8 +23,9 @@ THcRawShowerHit& THcRawShowerHit::operator=(const THcRawShowerHit& right) { THcRawHit::operator=(right); if (this != &right) { - fAdcPos = right.fAdcPos; - fAdcNeg = right.fAdcNeg; + for (UInt_t iAdcSig=0; iAdcSig<fNAdcSignals; ++iAdcSig) { + fAdcHits[iAdcSig] = right.fAdcHits[iAdcSig]; + } } return *this; @@ -37,17 +38,15 @@ THcRawShowerHit::~THcRawShowerHit() {} void THcRawShowerHit::Clear(Option_t* opt) { THcRawHit::Clear(opt); - fAdcPos.Clear(); - fAdcNeg.Clear(); + for (Int_t iAdcSig=0; iAdcSig<fNAdcSignals; ++iAdcSig) { + fAdcHits[iAdcSig].Clear(); + } } void THcRawShowerHit::SetData(Int_t signal, Int_t data) { - if (signal == 0) { - fAdcPos.SetData(data); - } - else if (signal == 1) { - fAdcNeg.SetData(data); + if (signal < fNAdcSignals) { + fAdcHits[signal].SetData(data); } else { throw std::out_of_range( @@ -58,11 +57,8 @@ void THcRawShowerHit::SetData(Int_t signal, Int_t data) { void THcRawShowerHit::SetSample(Int_t signal, Int_t data) { - if (signal == 0) { - fAdcPos.SetSample(data); - } - else if (signal == 1) { - fAdcNeg.SetSample(data); + if (signal < fNAdcSignals) { + fAdcHits[signal].SetSample(data); } else { throw std::out_of_range( @@ -75,11 +71,8 @@ void THcRawShowerHit::SetSample(Int_t signal, Int_t data) { void THcRawShowerHit::SetDataTimePedestalPeak( Int_t signal, Int_t data, Int_t time, Int_t pedestal, Int_t peak ) { - if (signal == 0) { - fAdcPos.SetDataTimePedestalPeak(data, time, pedestal, peak); - } - else if (signal == 1) { - fAdcNeg.SetDataTimePedestalPeak(data, time, pedestal, peak); + if (signal < fNAdcSignals) { + fAdcHits[signal].SetDataTimePedestalPeak(data, time, pedestal, peak); } else { throw std::out_of_range( @@ -99,11 +92,8 @@ void THcRawShowerHit::SetReference(Int_t signal, Int_t reference) { Int_t THcRawShowerHit::GetData(Int_t signal) { - if (signal == 0) { - return fAdcPos.GetRawData(); - } - else if (signal == 1) { - return fAdcNeg.GetRawData(); + if (signal < fNAdcSignals) { + return fAdcHits[signal].GetRawData(); } else { throw std::out_of_range( @@ -114,11 +104,8 @@ Int_t THcRawShowerHit::GetData(Int_t signal) { Int_t THcRawShowerHit::GetRawData(Int_t signal) { - if (signal == 0) { - return fAdcPos.GetRawData(); - } - else if (signal == 1) { - return fAdcNeg.GetRawData(); + if (signal < fNAdcSignals) { + return fAdcHits[signal].GetRawData(); } else { throw std::out_of_range( @@ -129,24 +116,30 @@ Int_t THcRawShowerHit::GetRawData(Int_t signal) { THcRawHit::ESignalType THcRawShowerHit::GetSignalType(Int_t signal) { - return kADC; + if (signal < fNAdcSignals) { + return kADC; + } + else { + throw std::out_of_range( + "`THcTrigRawHit::GetData`: only signals `0` and `1` available!" + ); + } } Int_t THcRawShowerHit::GetNSignals() { - return 2; + return fNAdcSignals; } THcRawAdcHit& THcRawShowerHit::GetRawAdcHitPos() { - return fAdcPos; + return fAdcHits[0]; } THcRawAdcHit& THcRawShowerHit::GetRawAdcHitNeg() { - return fAdcNeg; + return fAdcHits[1]; } - ClassImp(THcRawShowerHit) diff --git a/src/THcRawShowerHit.h b/src/THcRawShowerHit.h index 832d7586503bb9ccc0b848fc19404eb311f439d7..04d2c9e79bd0179f68f79024beac85e60bfe32a6 100644 --- a/src/THcRawShowerHit.h +++ b/src/THcRawShowerHit.h @@ -32,11 +32,12 @@ class THcRawShowerHit : public THcRawHit { THcRawAdcHit& GetRawAdcHitNeg(); protected: - THcRawAdcHit fAdcPos; - THcRawAdcHit fAdcNeg; + static const Int_t fNAdcSignals = 2; + + THcRawAdcHit fAdcHits[fNAdcSignals]; private: - ClassDef(THcRawShowerHit, 0); // Raw Shower counter hit + ClassDef(THcRawShowerHit, 0); // Raw Shower counter hit }; #endif diff --git a/src/THcRawTdcHit.cxx b/src/THcRawTdcHit.cxx new file mode 100644 index 0000000000000000000000000000000000000000..634cd4a1125771d40d808b0b44c3aec1603015cd --- /dev/null +++ b/src/THcRawTdcHit.cxx @@ -0,0 +1,115 @@ +/** +\class THcRawTdcHit +\ingroup DetSupport + +\brief Class representing a single raw TDC hit. +*/ + +#include "THcRawTdcHit.h" + +#include <stdexcept> + +#include <TString.h> + + +THcRawTdcHit::THcRawTdcHit() : + TObject(), + fTime(), fRefTime(0), fHasRefTime(kFALSE), fNHits(0) +{} + + +THcRawTdcHit& THcRawTdcHit::operator=(const THcRawTdcHit& right) { + TObject::operator=(right); + + if (this != &right) { + for (UInt_t iHit=0; iHit<fMaxNHits; ++iHit) { + fTime[iHit] = right.fTime[iHit]; + } + fRefTime = right.fRefTime; + fHasRefTime = right.fHasRefTime; + fNHits = right.fNHits; + } + + return *this; +} + + +THcRawTdcHit::~THcRawTdcHit() {} + + +void THcRawTdcHit::Clear(Option_t* opt) { + TObject::Clear(opt); + + for (UInt_t iHit=0; iHit<fNHits; ++iHit) { + fTime[iHit] = 0; + } + fRefTime = 0; + fHasRefTime = kFALSE; + fNHits = 0; +} + + +void THcRawTdcHit::SetTime(Int_t time) { + if (fNHits < fMaxNHits) { + fTime[fNHits] = time; + ++fNHits; + } + else { + TString msg = TString::Format( + "`THcRawTdcHit::SetTime`: Trying to set too many hits! Only %d slots available.", + fMaxNHits + ); + throw std::out_of_range(msg.Data()); + } +} + + +void THcRawTdcHit::SetRefTime(Int_t refTime) { + fRefTime = refTime; + fHasRefTime = kTRUE; +} + +Int_t THcRawTdcHit::GetTimeRaw(UInt_t iHit) const { + if (iHit < fNHits) { + return fTime[iHit]; + } + else if (iHit == 0) { + return 0; + } + else { + TString msg = TString::Format( + "`THcRawTdcHit::GetTimeRaw`: Trying to get hit %d where only %d hits available!", + iHit, fNHits + ); + throw std::out_of_range(msg.Data()); + } +} + + +Int_t THcRawTdcHit::GetTime(UInt_t iHit) const { + Int_t time = GetTimeRaw(iHit); + if (fHasRefTime) { + time -= fRefTime; + } + return time; +} + + +Int_t THcRawTdcHit::GetRefTime() const { + if (fHasRefTime) { + return fRefTime; + } + else { + TString msg = TString::Format( + "`THcRawTdcHit::GetRefTime`: Reference time not available!" + ); + throw std::runtime_error(msg.Data()); + } +} + +Int_t THcRawTdcHit::HasRefTime() const { + return fHasRefTime; +} + + +ClassImp(THcRawTdcHit) diff --git a/src/THcRawTdcHit.h b/src/THcRawTdcHit.h new file mode 100644 index 0000000000000000000000000000000000000000..7c3124fd1f2e9c0a9510c5d314ab388ae79d0728 --- /dev/null +++ b/src/THcRawTdcHit.h @@ -0,0 +1,38 @@ +#ifndef ROOT_THcRawTdcHit +#define ROOT_THcRawTdcHit + +#include "TObject.h" + + +class THcRawTdcHit : public TObject { + public: + THcRawTdcHit(); + THcRawTdcHit& operator=(const THcRawTdcHit& right); + virtual ~THcRawTdcHit(); + + virtual void Clear(Option_t* opt=""); + + void SetTime(Int_t time); + void SetRefTime(Int_t refTime); + + Int_t GetTimeRaw(UInt_t iHit=0) const; + Int_t GetTime(UInt_t iHit=0) const; + Int_t GetRefTime() const; + + Int_t HasRefTime() const; + + protected: + static const UInt_t fMaxNHits = 16; + + Int_t fTime[fMaxNHits]; + Int_t fRefTime; + + Bool_t fHasRefTime; + UInt_t fNHits; + + private: + ClassDef(THcRawTdcHit, 0) +}; + + +#endif // ROOT_THcRawTdcHit