From cc3bae7498220f99335f9fc1d9baf3abd1eee3b5 Mon Sep 17 00:00:00 2001 From: "Stephen A. Wood" <zviwood@gmail.com> Date: Wed, 7 Dec 2016 15:08:25 -0500 Subject: [PATCH] Raw hit changes to deal with flash ADC data Raw hit reports # of expected signals and their types (ADC vs TDC) Raw hit accept and deliver flash ADC sample, and pulse data (pulse integral, dynamic pedestal, time and peak) --- src/THcRawDCHit.h | 5 +++ src/THcRawHit.h | 10 ++++- src/THcRawHodoHit.cxx | 101 +++++++++++++++++++++++++++++++++++++++--- src/THcRawHodoHit.h | 45 ++++++++++++++++--- src/THcRawShowerHit.h | 4 ++ 5 files changed, 153 insertions(+), 12 deletions(-) diff --git a/src/THcRawDCHit.h b/src/THcRawDCHit.h index 592570f..1cd43f4 100644 --- a/src/THcRawDCHit.h +++ b/src/THcRawDCHit.h @@ -26,6 +26,11 @@ public: Int_t GetReference(Int_t signal); Bool_t HasReference(Int_t signal) {return fHasRef;} + Int_t GetNSignals() { return 1;} + ESignalType GetSignalType(Int_t signal) { + return(kTDC); + } + virtual Bool_t IsSortable () const {return kTRUE; } virtual Int_t Compare(const TObject* obj) const; diff --git a/src/THcRawHit.h b/src/THcRawHit.h index f1f33de..eb58d10 100644 --- a/src/THcRawHit.h +++ b/src/THcRawHit.h @@ -20,6 +20,8 @@ public: return *this; }; virtual ~THcRawHit() {} + + enum ESignalType { kUndefined, kTDC, kADC}; // This line causes problem // virtual void Clear( Option_t* opt="" )=0; @@ -28,8 +30,14 @@ public: // virtual Bool_t operator!=( const THcRawHit& ) = 0; virtual void SetData(Int_t signal, Int_t data) {}; + virtual void SetSample(Int_t signal, Int_t data) {}; + virtual void SetDataTimePedestalPeak(Int_t signal, Int_t data, + Int_t time, Int_t pedestal, Int_t peak) {}; virtual Int_t GetData(Int_t signal) {return 0;}; /* Ref time subtracted */ virtual Int_t GetRawData(Int_t signal) {return 0;} /* Ref time not subtracted */ + virtual ESignalType GetSignalType(Int_t signal) {return kUndefined;} + virtual Int_t GetNSignals() { return 1;} + virtual void SetReference(Int_t signal, Int_t reference) {}; virtual Bool_t HasReference(Int_t signal) {return kFALSE;}; virtual Int_t GetReference(Int_t signal) {return 0;}; @@ -42,7 +50,7 @@ public: Int_t fPlane; Int_t fCounter; - + private: ClassDef(THcRawHit,0) // Raw Hit Base Class diff --git a/src/THcRawHodoHit.cxx b/src/THcRawHodoHit.cxx index 5609f4c..4b8f955 100644 --- a/src/THcRawHodoHit.cxx +++ b/src/THcRawHodoHit.cxx @@ -23,26 +23,96 @@ using namespace std; void THcRawHodoHit::SetData(Int_t signal, Int_t data) { if(signal==0) { - if (fNRawHits[0] >= fMaxNSamplesADC) {throw std::runtime_error("Too many samples for `THcRawHodoHit` ADC+!");} + if (fNRawHits[0] >= fMaxNPulsesADC) {throw std::runtime_error("Too many samples for `THcRawHodoHit` ADC+!");} fADC_pos[fNRawHits[0]++] = data; } else if (signal==1) { - if (fNRawHits[1] >= fMaxNSamplesADC) {throw std::runtime_error("Too many samples for `THcRawHodoHit` ADC-!");} + if (fNRawHits[1] >= fMaxNPulsesADC) {throw std::runtime_error("Too many samples for `THcRawHodoHit` ADC-!");} fADC_neg[fNRawHits[1]++] = data; } else if(signal==2) { - if (fNRawHits[2] >= fMaxNSamplesTDC) {throw std::runtime_error("Too many samples for `THcRawHodoHit` TDC+!");} + if (fNRawHits[2] >= fMaxNHitsTDC) {throw std::runtime_error("Too many samples for `THcRawHodoHit` TDC+!");} fTDC_pos[fNRawHits[2]++] = data; } else if (signal==3) { - if (fNRawHits[3] >= fMaxNSamplesTDC) {throw std::runtime_error("Too many samples for `THcRawHodoHit` TDC-!");} + if (fNRawHits[3] >= fMaxNHitsTDC) {throw std::runtime_error("Too many samples for `THcRawHodoHit` TDC-!");} fTDC_neg[fNRawHits[3]++] = data; } } +void THcRawHodoHit::SetDataTimePedestalPeak(Int_t signal, Int_t data, Int_t time, + Int_t pedestal, Int_t peak) { + if(signal==0) { + if (fNRawHits[0] >= fMaxNPulsesADC) {throw std::runtime_error("Too many samples for `THcRawHodoHit` ADC+!");} + fADC_pos[fNRawHits[0]] = data; + fADC_Time_pos[fNRawHits[0]] = time; + fADC_Pedestal_pos[fNRawHits[0]] = pedestal; + fADC_Peak_pos[fNRawHits[0]++] = peak; + fHasMulti[signal]=kTRUE; + // cout << fPlane << "/" << fCounter << "+ " << fNRawHits[0] << " " << + // data << "/" << time << "/" << pedestal << "/" << peak << endl; + } else if (signal==1) { + if (fNRawHits[1] >= fMaxNPulsesADC) {throw std::runtime_error("Too many samples for `THcRawHodoHit` ADC-!");} + fADC_neg[fNRawHits[1]] = data; + fADC_Time_neg[fNRawHits[1]] = time; + fADC_Pedestal_neg[fNRawHits[1]] = pedestal; + fADC_Peak_neg[fNRawHits[1]++] = peak; + fHasMulti[signal]=kTRUE; + // cout << fPlane << "/" << fCounter << "- " << fNRawHits[0] << " " << + // data << "/" << time << "/" << pedestal << "/" << peak << endl; + } +} + +void THcRawHodoHit::SetSample(Int_t signal, Int_t data) { + if(signal==0) { + if (fNRawSamplesPos >= fMaxNSamplesADC) {throw std::runtime_error("Too many samples for `THcRawHodoHit` ADC+!");} + fADC_Samples_pos[fNRawSamplesPos++] = data; + } else if (signal==1) { + if (fNRawSamplesNeg >= fMaxNSamplesADC) {throw std::runtime_error("Too many samples for `THcRawHodoHit` ADC-!");} + fADC_Samples_neg[fNRawSamplesNeg++] = data; + } +} + +Int_t THcRawHodoHit::GetIntegralPos() { + Int_t sum=0; + for(UInt_t i=0;i<fNRawSamplesPos;i++) { + sum += fADC_Samples_pos[i]; + } + return(sum); +} + +Int_t THcRawHodoHit::GetIntegralNeg() { + Int_t sum=0; + for(UInt_t i=0;i<fNRawSamplesNeg;i++) { + sum += fADC_Samples_neg[i]; + } + return(sum); +} + +Int_t THcRawHodoHit::GetPedestalPos() { + if(fHasMulti[0] && fNRawHits[0]>0) { + return(fADC_Pedestal_pos[0]); + } else { + return(0); + } +} + +Int_t THcRawHodoHit::GetPedestalNeg() { + if(fHasMulti[1] && fNRawHits[1]>0) { + return(fADC_Pedestal_neg[0]); + } else { + return(0); + } +} + Int_t THcRawHodoHit::GetData(Int_t signal) { return(GetData(signal,0)); } Int_t THcRawHodoHit::GetData(Int_t signal, UInt_t ihit) { Int_t value; - if(ihit > 0 && ihit>= fNRawHits[signal]) { + if(ihit>= fNRawHits[signal]) { + if(ihit==0) { + // We were not doing this, before, so we could have been sending + // stale data for missing tdc or adc hits + return(0); + } cout << "THcRawHodoHit::GetData(): requested hit #" << ihit << " out of range: " << fNRawHits[signal] << endl; return(-1); @@ -109,6 +179,9 @@ Int_t THcRawHodoHit::GetReference(Int_t signal) { Bool_t THcRawHodoHit::HasReference(Int_t signal) { return(fHasRef[signal]); } +Bool_t THcRawHodoHit::HasMulti(Int_t signal) { + return(fHasMulti[signal]); +} // Do we use this? //_____________________________________________________________________________ @@ -116,18 +189,26 @@ THcRawHodoHit& THcRawHodoHit::operator=( const THcRawHodoHit& rhs ) { // Assignment operator. + cout << "operator=" << endl; THcRawHit::operator=(rhs); if ( this != &rhs ) { for(Int_t is=0;is<4;is++) { fReferenceTime[is] = rhs.fReferenceTime[is]; fNRawHits[is] = rhs.fNRawHits[is]; fHasRef[is] = rhs.fHasRef[is]; + fHasMulti[is] = rhs.fHasMulti[is]; } for(UInt_t ih=0;ih<fNRawHits[0];ih++) { fADC_pos[ih] = rhs.fADC_pos[ih]; + fADC_Time_pos[ih] = rhs.fADC_Time_pos[ih]; + fADC_Pedestal_pos[ih] = rhs.fADC_Pedestal_pos[ih]; + fADC_Peak_pos[ih] = rhs.fADC_Peak_pos[ih]; } for(UInt_t ih=0;ih<fNRawHits[1];ih++) { fADC_neg[ih] = rhs.fADC_neg[ih]; + fADC_Time_neg[ih] = rhs.fADC_Time_neg[ih]; + fADC_Pedestal_neg[ih] = rhs.fADC_Pedestal_neg[ih]; + fADC_Peak_neg[ih] = rhs.fADC_Peak_neg[ih]; } for(UInt_t ih=0;ih<fNRawHits[2];ih++) { fTDC_pos[ih] = rhs.fTDC_pos[ih]; @@ -135,6 +216,16 @@ THcRawHodoHit& THcRawHodoHit::operator=( const THcRawHodoHit& rhs ) for(UInt_t ih=0;ih<fNRawHits[3];ih++) { fTDC_neg[ih] = rhs.fTDC_neg[ih]; } + fNRawSamplesPos = rhs.fNRawSamplesPos; + fNRawSamplesNeg = rhs.fNRawSamplesNeg; + for(UInt_t is=0;is<fNRawSamplesPos;is++) { + fADC_Samples_pos[is] = rhs.fADC_Samples_pos[is]; + } + for(UInt_t is=0;is<fNRawSamplesNeg;is++) { + fADC_Samples_neg[is] = rhs.fADC_Samples_neg[is]; + } + + } return *this; } diff --git a/src/THcRawHodoHit.h b/src/THcRawHodoHit.h index a6d1480..c14ac31 100644 --- a/src/THcRawHodoHit.h +++ b/src/THcRawHodoHit.h @@ -13,8 +13,11 @@ class THcRawHodoHit : public THcRawHit { THcRawHodoHit(Int_t plane=0, Int_t counter=0) : THcRawHit(plane, counter) { for(Int_t i=0;i<4;i++) { fHasRef[i] = kFALSE; + fHasMulti[i] = kFALSE; fNRawHits[i] = 0; } + fNRawSamplesPos = 0; + fNRawSamplesNeg = 0; } THcRawHodoHit& operator=( const THcRawHodoHit& ); virtual ~THcRawHodoHit() {} @@ -22,10 +25,16 @@ class THcRawHodoHit : public THcRawHit { virtual void Clear( Option_t* opt="" ) { for(Int_t i=0;i<4;i++) { fHasRef[i] = kFALSE; + fHasMulti[i] = kFALSE; fNRawHits[i] = 0; } + fNRawSamplesPos = 0; + fNRawSamplesNeg = 0; } void SetData(Int_t signal, Int_t data); + void SetDataTimePedestalPeak(Int_t signal, Int_t data, Int_t time, + Int_t pedestal, Int_t peak); + void SetSample(Int_t signal, Int_t data); void SetReference(Int_t signal, Int_t reference); Int_t GetData(Int_t signal); Int_t GetData(Int_t signal, UInt_t ihit); @@ -33,6 +42,7 @@ class THcRawHodoHit : public THcRawHit { Int_t GetRawData(Int_t signal, UInt_t ihit); Int_t GetReference(Int_t signal); Bool_t HasReference(Int_t signal); + Bool_t HasMulti(Int_t signal); // virtual Bool_t IsSortable () const {return kTRUE; } // virtual Int_t Compare(const TObject* obj) const; @@ -42,20 +52,43 @@ class THcRawHodoHit : public THcRawHit { Int_t GetTDCPos() {return GetData(2, 0);} Int_t GetTDCNeg() {return GetData(3, 0);} - UInt_t GetMaxNSamplesTDC() {return fMaxNSamplesTDC;} + UInt_t GetMaxNSamplesTDC() {return fMaxNHitsTDC;} Int_t GetTDCPos(UInt_t ihit) {return GetData(2, ihit);} Int_t GetTDCNeg(UInt_t ihit) {return GetData(3, ihit);} + Int_t GetIntegralPos(); + Int_t GetIntegralNeg(); + Int_t GetPedestalPos(); + Int_t GetPedestalNeg(); + + Int_t GetNSignals() { return 4;} + ESignalType GetSignalType(Int_t signal) { + if(signal==0||signal==1) {return kADC;} + else {return kTDC;} + } + protected: static const UInt_t fMaxNSamplesADC = 160; - static const UInt_t fMaxNSamplesTDC = 16; - Int_t fADC_pos[fMaxNSamplesADC]; - Int_t fADC_neg[fMaxNSamplesADC]; - Int_t fTDC_pos[fMaxNSamplesTDC]; - Int_t fTDC_neg[fMaxNSamplesTDC]; + static const UInt_t fMaxNPulsesADC = 4; + static const UInt_t fMaxNHitsTDC = 16; + Int_t fADC_pos[fMaxNPulsesADC]; + Int_t fADC_neg[fMaxNPulsesADC]; + Int_t fTDC_pos[fMaxNHitsTDC]; + Int_t fTDC_neg[fMaxNHitsTDC]; + Int_t fADC_Time_pos[fMaxNPulsesADC]; + Int_t fADC_Time_neg[fMaxNPulsesADC]; + Int_t fADC_Pedestal_pos[fMaxNPulsesADC]; + Int_t fADC_Pedestal_neg[fMaxNPulsesADC]; + Int_t fADC_Peak_pos[fMaxNPulsesADC]; + Int_t fADC_Peak_neg[fMaxNPulsesADC]; + Int_t fADC_Samples_pos[fMaxNSamplesADC]; + Int_t fADC_Samples_neg[fMaxNSamplesADC]; Int_t fReferenceTime[4]; Bool_t fHasRef[4]; + Bool_t fHasMulti[4]; UInt_t fNRawHits[4]; + UInt_t fNRawSamplesPos; + UInt_t fNRawSamplesNeg; private: diff --git a/src/THcRawShowerHit.h b/src/THcRawShowerHit.h index 5a1102d..cc4b12e 100644 --- a/src/THcRawShowerHit.h +++ b/src/THcRawShowerHit.h @@ -28,6 +28,10 @@ class THcRawShowerHit : public THcRawHit { Double_t GetPedestal(Int_t signal, Int_t isamplow, Int_t isamphigh); Int_t GetNSamples(Int_t signal); + Int_t GetNSignals() { return 2;} + ESignalType GetSignalType(Int_t signal) { + return kADC; + } // virtual Bool_t IsSortable () const {return kTRUE; } // virtual Int_t Compare(const TObject* obj) const; -- GitLab