From 36ccc00c35490e82e02e2bc92eb3bde328c76993 Mon Sep 17 00:00:00 2001
From: Jure Bericic <bericic@jlab.org>
Date: Thu, 12 Jan 2017 09:34:04 -0500
Subject: [PATCH] Modified THcRawHodoHit to use THcRawAdcHit and THcRawTdcHit.

This makes the code nicer and with less duplication in logic.

Along with that I had to correct all the call sites to the RawHodoHit in all the
classes that use it.
---
 src/THcAerogel.cxx           |  25 ++-
 src/THcCherenkov.cxx         |  15 +-
 src/THcHodoscope.cxx         |   8 +-
 src/THcRawAdcHit.cxx         |  22 ++-
 src/THcRawAdcHit.h           |   2 +
 src/THcRawHodoHit.cxx        | 350 +++++++++++++++--------------------
 src/THcRawHodoHit.h          | 112 ++++-------
 src/THcRawShowerHit.cxx      |  28 +--
 src/THcRawShowerHit.h        |   1 +
 src/THcRawTdcHit.cxx         |   7 +
 src/THcRawTdcHit.h           |   2 +
 src/THcScintillatorPlane.cxx |  45 +++--
 12 files changed, 276 insertions(+), 341 deletions(-)

diff --git a/src/THcAerogel.cxx b/src/THcAerogel.cxx
index 8883d02..9417c16 100644
--- a/src/THcAerogel.cxx
+++ b/src/THcAerogel.cxx
@@ -335,27 +335,27 @@ Int_t THcAerogel::Decode( const THaEvData& evdata )
     Int_t tdc_pos=-1;
     Int_t tdc_neg=-1;
    // TDC positive hit
-    if(hit->fNRawHits[2] >  0) {
+    if(hit->GetRawTdcHitPos().GetNHits() >  0) {
       THcSignalHit *sighit = (THcSignalHit*) fPosTDCHits->ConstructedAt(nPosTDCHits++);
-      tdc_pos = hit->GetTDCPos()+fTdcOffset;
+      tdc_pos = hit->GetRawTdcHitPos().GetTime()+fTdcOffset;
       sighit->Set(hit->fCounter, tdc_pos);
     }
 
     // TDC negative hit
-    if(hit->fNRawHits[3] >  0) {
+    if(hit->GetRawTdcHitNeg().GetNHits() >  0) {
       THcSignalHit *sighit = (THcSignalHit*) fNegTDCHits->ConstructedAt(nNegTDCHits++);
-      tdc_neg = hit->GetTDCNeg()+fTdcOffset;
+      tdc_neg = hit->GetRawTdcHitNeg().GetTime()+fTdcOffset;
       sighit->Set(hit->fCounter, tdc_neg);
     }
 
     // ADC positive hit
-    if((adc_pos = hit->GetADCPos()) > 0) {
+    if((adc_pos = hit->GetRawAdcHitPos().GetPeakInt()) > 0) {
       THcSignalHit *sighit = (THcSignalHit*) fPosADCHits->ConstructedAt(nPosADCHits++);
       sighit->Set(hit->fCounter, adc_pos);
     }
 
     // ADC negative hit
-    if((adc_neg = hit->GetADCNeg()) > 0) {
+    if((adc_neg = hit->GetRawAdcHitNeg().GetPeakInt()) > 0) {
       THcSignalHit *sighit = (THcSignalHit*) fNegADCHits->ConstructedAt(nNegADCHits++);
       sighit->Set(hit->fCounter, adc_neg);
     }
@@ -363,15 +363,15 @@ Int_t THcAerogel::Decode( const THaEvData& evdata )
     // For each TDC, identify the first hit that is positive.
     tdc_pos = -1;
     tdc_neg = -1;
-    for(UInt_t thit=0; thit<hit->fNRawHits[2]; thit++) {
-      Int_t tdc = hit->GetTDCPos(thit);
+    for(UInt_t thit=0; thit<hit->GetRawTdcHitPos().GetNHits(); thit++) {
+      Int_t tdc = hit->GetRawTdcHitPos().GetTime(thit);
       if(tdc >=0 ) {
 	tdc_pos = tdc;
 	break;
       }
     }
-    for(UInt_t thit=0; thit<hit->fNRawHits[3]; thit++) {
-      Int_t tdc = hit->GetTDCNeg(thit);
+    for(UInt_t thit=0; thit<hit->GetRawTdcHitNeg().GetNHits(); thit++) {
+      Int_t tdc = hit->GetRawTdcHitNeg().GetTime(thit);
       if(tdc >= 0) {
 	tdc_neg = tdc;
 	break;
@@ -532,8 +532,8 @@ void THcAerogel::AccumulatePedestals(TClonesArray* rawhits)
     THcAerogelHit* hit = (THcAerogelHit *) rawhits->At(ihit);
 
     Int_t element = hit->fCounter - 1;
-    Int_t adcpos = hit->GetADCPos();
-    Int_t adcneg = hit->GetADCNeg();
+    Int_t adcpos = hit->GetRawAdcHitPos().GetPeakInt();
+    Int_t adcneg = hit->GetRawAdcHitNeg().GetPeakInt();
     if(adcpos <= fPosPedLimit[element]) {
       fPosPedSum[element] += adcpos;
       fPosPedSum2[element] += adcpos*adcpos;
@@ -608,4 +608,3 @@ void THcAerogel::Print( const Option_t* opt) const {
 
 ClassImp(THcAerogel)
 ////////////////////////////////////////////////////////////////////////////////
-
diff --git a/src/THcCherenkov.cxx b/src/THcCherenkov.cxx
index f5d5c95..0a22560 100644
--- a/src/THcCherenkov.cxx
+++ b/src/THcCherenkov.cxx
@@ -293,9 +293,9 @@ Int_t THcCherenkov::Decode( const THaEvData& evdata )
     THcCherenkovHit* hit = (THcCherenkovHit *) fRawHitList->At(ihit);
 
     // ADC hit
-    if(hit->GetADCPos() >  0) {
+    if(hit->GetRawAdcHitPos().GetPeakIntRaw() >  0) {
       THcSignalHit *sighit = (THcSignalHit*) fADCHits->ConstructedAt(nADCHits++);
-      sighit->Set(hit->fCounter, hit->GetADCPos());
+      sighit->Set(hit->fCounter, hit->GetRawAdcHitPos().GetPeakIntRaw());
     }
 
     ihit++;
@@ -329,13 +329,13 @@ Int_t THcCherenkov::CoarseProcess( TClonesArray&  ) //tracks
       cout << "ihit != npmt " << endl;
 
     fNPMT[npmt] = hit->fCounter;
-    fADC[npmt] = hit->GetADCPos();
-    fADC_P[npmt] = hit->GetADCPos() - fPedMean[npmt];
+    fADC[npmt] = hit->GetRawAdcHitPos().GetPeakIntRaw();
+    fADC_P[npmt] = hit->GetRawAdcHitPos().GetPeakIntRaw() - fPedMean[npmt];
 
-    if ( ( fADC_P[npmt] > fCerWidth[npmt] ) && ( hit->GetADCPos() < 8000 ) ) {
+    if ( ( fADC_P[npmt] > fCerWidth[npmt] ) && ( hit->GetRawAdcHitPos().GetPeakIntRaw() < 8000 ) ) {
       fNPE[npmt] = fGain[npmt]*fADC_P[npmt];
       fNCherHit ++;
-    } else if (  hit->GetADCPos() > 8000 ) {
+    } else if (  hit->GetRawAdcHitPos().GetPeakIntRaw() > 8000 ) {
       fNPE[npmt] = 100.0;
     } else {
       fNPE[npmt] = 0.0;
@@ -432,7 +432,7 @@ void THcCherenkov::AccumulatePedestals(TClonesArray* rawhits)
     THcCherenkovHit* hit = (THcCherenkovHit *) rawhits->At(ihit);
 
     Int_t element = hit->fCounter - 1;
-    Int_t nadc = hit->GetADCPos();
+    Int_t nadc = hit->GetRawAdcHitPos().GetPeakIntRaw();
     if(nadc <= fPedLimit[element]) {
       fPedSum[element] += nadc;
       fPedSum2[element] += nadc*nadc;
@@ -508,4 +508,3 @@ Double_t THcCherenkov::GetCerNPE() {
 
 ClassImp(THcCherenkov)
 ////////////////////////////////////////////////////////////////////////////////
-
diff --git a/src/THcHodoscope.cxx b/src/THcHodoscope.cxx
index eadc24e..7a5fcb8 100644
--- a/src/THcHodoscope.cxx
+++ b/src/THcHodoscope.cxx
@@ -620,10 +620,10 @@ Int_t THcHodoscope::Decode( const THaEvData& evdata )
   if (fdebugprintscinraw == 1) {
     cout << " Event number = " << evdata.GetEvNum()<<endl;
   for(UInt_t ihit = 0; ihit < fNRawHits ; ihit++) {
-    THcRawHodoHit* hit = (THcRawHodoHit *) fRawHitList->At(ihit);
-    cout << ihit << " : " << hit->fPlane << ":" << hit->fCounter << " : "
-	 << hit->fADC_pos << " " << hit->fADC_neg << " "  <<  hit->fTDC_pos
-	 << " " <<  hit->fTDC_neg << endl;
+//    THcRawHodoHit* hit = (THcRawHodoHit *) fRawHitList->At(ihit);
+//    cout << ihit << " : " << hit->fPlane << ":" << hit->fCounter << " : "
+//	 << hit->fADC_pos << " " << hit->fADC_neg << " "  <<  hit->fTDC_pos
+//	 << " " <<  hit->fTDC_neg << endl;
   }
   cout << endl;
   }
diff --git a/src/THcRawAdcHit.cxx b/src/THcRawAdcHit.cxx
index 93f8fdb..8a4c275 100644
--- a/src/THcRawAdcHit.cxx
+++ b/src/THcRawAdcHit.cxx
@@ -97,9 +97,9 @@ void THcRawAdcHit::SetDataTimePedestalPeak(
     );
   }
   fAdc[fNPulses] = data;
-  fAdcTime[fNPulses] = data;
-  fAdcPedestal[fNPulses] = data;
-  fAdcPeak[fNPulses] = data;
+  fAdcTime[fNPulses] = time;
+  fAdcPedestal[fNPulses] = pedestal;
+  fAdcPeak[fNPulses] = peak;
   fHasMulti = kTRUE;
   ++fNPulses;
 }
@@ -278,4 +278,20 @@ Double_t THcRawAdcHit::GetPeakAmp(UInt_t iPulse) {
 }
 
 
+Int_t THcRawAdcHit::GetSampleIntRaw() {
+  Int_t integral = 0;
+
+  for (UInt_t iSample=0; iSample<fNSamples; ++iSample) {
+    integral += fAdcSample[iSample];
+  }
+
+  return integral;
+}
+
+
+Double_t THcRawAdcHit::GetSampleInt() {
+  return GetSampleIntRaw() - GetPed()*fNSamples;
+}
+
+
 ClassImp(THcRawAdcHit)
diff --git a/src/THcRawAdcHit.h b/src/THcRawAdcHit.h
index 4fb94a7..83a09e8 100644
--- a/src/THcRawAdcHit.h
+++ b/src/THcRawAdcHit.h
@@ -45,6 +45,8 @@ class THcRawAdcHit : public TObject {
     Double_t GetPeakAmp(UInt_t iPulse=0);
     //Double_t GetPeakTime(UInt_t iPulse=0);
 
+    Int_t GetSampleIntRaw();
+    Double_t GetSampleInt();
 
   protected:
     static const UInt_t fMaxNPulses = 4;
diff --git a/src/THcRawHodoHit.cxx b/src/THcRawHodoHit.cxx
index 7051cbc..df78910 100644
--- a/src/THcRawHodoHit.cxx
+++ b/src/THcRawHodoHit.cxx
@@ -1,247 +1,201 @@
-/** \class THcRawHodoHit
-    \ingroup DetSupport
-
-Raw Hodoscope Hit Info
-
-Class representing a single raw hit for a hodoscope paddle
-
- Contains plane, counter and pos/neg adc and tdc values
+/**
+\class THcRawHodoHit
+\ingroup DetSupport
 
+\brief Class representing a single raw hit for a hodoscope paddle.
 
+  - `signal 0` is ADC pos
+  - `signal 1` is ADC neg
+  - `signal 2` is TDC pos
+  - `signal 3` is TDC neg
 */
 
-#include <cstring>
-#include <cstdio>
-#include <cstdlib>
+#include "THcRawHodoHit.h"
+
 #include <iostream>
-#include <cassert>
 #include <stdexcept>
 
-#include "TString.h"
 
-#include "THcRawHodoHit.h"
+THcRawHodoHit::THcRawHodoHit(Int_t plane, Int_t counter) :
+  fAdcHits(), fTdcHits()
+{}
 
-using namespace std;
 
-void THcRawHodoHit::SetData(Int_t signal, Int_t data) {
-  if(signal==0) {
-    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] >= fMaxNPulsesADC) {throw std::runtime_error("Too many samples for `THcRawHodoHit` ADC-!");}
-    fADC_neg[fNRawHits[1]++] = data;
-  } else if(signal==2) {
-    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] >= 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;
+THcRawHodoHit& THcRawHodoHit::operator=(const THcRawHodoHit& right) {
+  THcRawHit::operator=(right);
+
+  if (this != &right) {
+    for (Int_t iAdcSig=0; iAdcSig<fNAdcSignals; ++iAdcSig) {
+      fAdcHits[iAdcSig] = right.fAdcHits[iAdcSig];
+    }
+    for (Int_t iTdcSig=0; iTdcSig<fNTdcSignals; ++iTdcSig) {
+      fTdcHits[iTdcSig] = right.fTdcHits[iTdcSig];
+    }
   }
+
+  return *this;
 }
 
-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;
+
+THcRawHodoHit::~THcRawHodoHit() {}
+
+
+void THcRawHodoHit::Clear(Option_t* opt) {
+  THcRawHit::Clear(opt);
+
+  for (Int_t iAdcSig=0; iAdcSig<fNAdcSignals; ++iAdcSig) {
+    fAdcHits[iAdcSig].Clear();
+  }
+  for (Int_t iTdcSig=0; iTdcSig<fNTdcSignals; ++iTdcSig) {
+    fTdcHits[iTdcSig].Clear();
   }
 }
 
-Int_t THcRawHodoHit::GetIntegralPos() {
-  Int_t sum=0;
-  for(UInt_t i=0;i<fNRawSamplesPos;i++) {
-    sum += fADC_Samples_pos[i];
+
+void THcRawHodoHit::SetData(Int_t signal, Int_t data) {
+  if (0 <= signal && signal < fNAdcSignals) {
+    fAdcHits[signal].SetData(data);
+  }
+  else if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
+    fTdcHits[signal-fNAdcSignals].SetTime(data);
+  }
+  else {
+    throw std::out_of_range(
+      "`THcRawHodoHit::SetData`: only signals `0` to `3` available!"
+    );
   }
-  return(sum);
 }
 
-Int_t THcRawHodoHit::GetIntegralNeg() {
-  Int_t sum=0;
-  for(UInt_t i=0;i<fNRawSamplesNeg;i++) {
-    sum += fADC_Samples_neg[i];
+
+void THcRawHodoHit::SetSample(Int_t signal, Int_t data) {
+  if (0 <= signal && signal < fNAdcSignals) {
+    fAdcHits[signal].SetSample(data);
+  }
+  else {
+    throw std::out_of_range(
+      "`THcRawHodoHit::SetSample`: only signals `0` and `1` available!"
+    );
   }
-  return(sum);
 }
 
-Int_t THcRawHodoHit::GetPedestalPos() {
-  if(fHasMulti[0] && fNRawHits[0]>0) {
-    return(fADC_Pedestal_pos[0]);
-  } else {
-    return(0);
+
+void THcRawHodoHit::SetDataTimePedestalPeak(
+  Int_t signal, Int_t data, Int_t time, Int_t pedestal, Int_t peak
+) {
+  if (0 <= signal && signal < fNAdcSignals) {
+    fAdcHits[signal].SetDataTimePedestalPeak(data, time, pedestal, peak);
+  }
+  else {
+    throw std::out_of_range(
+      "`THcRawHodoHit::SetDataTimePedestalPeak`: only signals `0` and `1` available!"
+    );
   }
 }
 
-Int_t THcRawHodoHit::GetPedestalNeg() {
-  if(fHasMulti[1] && fNRawHits[1]>0) {
-    return(fADC_Pedestal_neg[0]);
-  } else {
-    return(0);
+
+void THcRawHodoHit::SetReference(Int_t signal, Int_t reference) {
+  if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
+    fTdcHits[signal-fNAdcSignals].SetRefTime(reference);
+  }
+  else {
+    throw std::out_of_range(
+      "`THcRawHodoHit::SetReference`: only signals `2` and `3` available!"
+    );
   }
 }
 
+
 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>= 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);
-  }
-  if(signal==0) {
-    value = fADC_pos[ihit];
-  } else if (signal==1) {
-    value = fADC_neg[ihit];
-  } else if (signal==2) {
-    value = fTDC_pos[ihit];
-  } else if (signal==3) {
-    value = fTDC_neg[ihit];
-  } else {
-    TString msg = TString::Format(
-      "THcRawHodoHit::GetData(): requested invalid signal #%d.",
-      signal
-    );
-    throw std::out_of_range(msg.Data());
+  if (0 <= signal && signal < fNAdcSignals) {
+    return fAdcHits[signal].GetPeakInt();
   }
-  if(fHasRef[signal] && (signal == 2 || signal == 3)) {
-    value -= fReferenceTime[signal];
+  else if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
+    return fTdcHits[signal-fNAdcSignals].GetTime();
+  }
+  else {
+    throw std::out_of_range(
+      "`THcRawHodoHit::GetData`: only signals `0` to `3` available!"
+    );
   }
-  return(value);
 }
 
+
 Int_t THcRawHodoHit::GetRawData(Int_t signal) {
-  return(GetRawData(signal,0));
-}
-
-// Return a requested raw hit
-Int_t THcRawHodoHit::GetRawData(Int_t signal, UInt_t ihit) {
-  if(ihit>= fNRawHits[signal]) {
-    cout << "THcRawHodoHit::GetRawData(): requested hit #" << ihit << " out of "
-	 << fNRawHits[signal] << endl;
-    return(-1);
-  }
-  if(signal==0) {
-    return(fADC_pos[ihit]);
-  } else if (signal==1) {
-    return(fADC_neg[ihit]);
-  } else if (signal==2) {
-    return(fTDC_pos[ihit]);
-  } else if (signal==3) {
-    return(fTDC_neg[ihit]);
-  } else {
-    TString msg = TString::Format(
-      "THcRawHodoHit::GetRawData(): requested invalid signal #%d.",
-      signal
+  if (0 <= signal && signal < fNAdcSignals) {
+    return fAdcHits[signal].GetPeakIntRaw();
+  }
+  else if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
+    return fTdcHits[signal-fNAdcSignals].GetTimeRaw();
+  }
+  else {
+    throw std::out_of_range(
+      "`THcRawHodoHit::GetRawData`: only signals `0` to `3` available!"
     );
-    throw std::out_of_range(msg.Data());
   }
 }
 
-// Set the reference time
-void THcRawHodoHit::SetReference(Int_t signal, Int_t reference) {
-  if (signal == 2 || signal == 3) {
-    fReferenceTime[signal] = reference;
-    fHasRef[signal] = kTRUE;
-  } else if (signal == 0 || signal == 1) {
-    std::cerr
-      << "Warning:"
-      << " THcRawHodoHit::SetReference():"
-      << " signals 0 and 1 (ADC) should not have reference time!"
-      << " Check map file!";
+
+Int_t THcRawHodoHit::GetReference(Int_t signal) {
+  if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
+    return fTdcHits[signal-fNAdcSignals].GetRefTime();
+  }
+  else {
+    throw std::out_of_range(
+      "`THcRawHodoHit::GetReference`: only signals `2` and `3` available!"
+    );
   }
 }
-Int_t THcRawHodoHit::GetReference(Int_t signal) {
-  if(fHasRef[signal]) {
-    return(fReferenceTime[signal]);
-  } else {
-    return(0);
+
+
+THcRawHit::ESignalType THcRawHodoHit::GetSignalType(Int_t signal) {
+  if (0 <= signal && signal < fNAdcSignals) {
+    return kADC;
+  }
+  else if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
+    return kTDC;
+  }
+  else {
+    throw std::out_of_range(
+      "`THcRawHodoHit::GetSignalType`: only signals `0` to `3` available!"
+    );
   }
 }
-Bool_t THcRawHodoHit::HasReference(Int_t signal) {
-  return(fHasRef[signal]);
-}
-Bool_t THcRawHodoHit::HasMulti(Int_t signal) {
-  return(fHasMulti[signal]);
-}
-
-  // Do we use this?
-//_____________________________________________________________________________
-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];
-    }
-    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];
-    }
 
 
+Int_t THcRawHodoHit::GetNSignals() {
+  return fNAdcSignals + fNTdcSignals;
+}
+
+Bool_t THcRawHodoHit::HasReference(Int_t signal) {
+  if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
+    return fTdcHits[signal-fNAdcSignals].HasRefTime();
   }
-  return *this;
+  else {
+    throw std::out_of_range(
+      "`THcRawHodoHit::HasReference`: only signals `2` and `3` available!"
+    );
+  }
+}
+
+
+THcRawAdcHit& THcRawHodoHit::GetRawAdcHitPos() {
+  return fAdcHits[0];
+}
+
+
+THcRawAdcHit& THcRawHodoHit::GetRawAdcHitNeg() {
+  return fAdcHits[1];
+}
+
+
+THcRawTdcHit& THcRawHodoHit::GetRawTdcHitPos() {
+  return fTdcHits[0];
+}
+
+
+THcRawTdcHit& THcRawHodoHit::GetRawTdcHitNeg() {
+  return fTdcHits[1];
 }
 
 
-//////////////////////////////////////////////////////////////////////////
 ClassImp(THcRawHodoHit)
diff --git a/src/THcRawHodoHit.h b/src/THcRawHodoHit.h
index 786bf28..679d36f 100644
--- a/src/THcRawHodoHit.h
+++ b/src/THcRawHodoHit.h
@@ -1,98 +1,54 @@
 #ifndef ROOT_THcRawHodoHit
 #define ROOT_THcRawHodoHit
 
+#include "THcRawAdcHit.h"
 #include "THcRawHit.h"
+#include "THcRawTdcHit.h"
 
-class THcRawHodoHit : public THcRawHit {
 
- public:
+class THcRawHodoHit : public THcRawHit {
   friend class THcScintillatorPlane;
   friend class THcHodoscope;
   friend class THcHodoHit;
 
-  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() {}
+  public:
 
-  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);
-  Int_t GetRawData(Int_t signal);
-  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);
+    THcRawHodoHit(Int_t plane=0, Int_t counter=0);
+    THcRawHodoHit& operator=(const THcRawHodoHit& right);
+    virtual ~THcRawHodoHit();
 
-  //  virtual Bool_t  IsSortable () const {return kTRUE; }
-  //  virtual Int_t   Compare(const TObject* obj) const;
-  UInt_t GetMaxNSamplesADC() {return fMaxNSamplesADC;}
-  Int_t GetADCPos() {return GetData(0, 0);}
-  Int_t GetADCNeg() {return GetData(1, 0);}
-  Int_t GetTDCPos() {return GetData(2, 0);}
-  Int_t GetTDCNeg() {return GetData(3, 0);}
+    virtual void Clear(Option_t* opt="");
 
-  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);}
+    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 void SetReference(Int_t signal, Int_t reference);
 
-  Int_t GetIntegralPos();
-  Int_t GetIntegralNeg();
-  Int_t GetPedestalPos();
-  Int_t GetPedestalNeg();
+    virtual Int_t GetData(Int_t signal);
+    virtual Int_t GetRawData(Int_t signal);
+    virtual Int_t GetReference(Int_t signal);
+    virtual ESignalType GetSignalType(Int_t signal);
+    virtual Int_t GetNSignals();
 
-  Int_t GetNSignals() { return 4;}
-  ESignalType GetSignalType(Int_t signal) {
-    if(signal==0||signal==1) {return kADC;}
-    else {return kTDC;}
-  }
+    virtual Bool_t HasReference(Int_t signal);
 
- protected:
-  static const UInt_t fMaxNSamplesADC = 511;
-  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;
+    THcRawAdcHit& GetRawAdcHitPos();
+    THcRawAdcHit& GetRawAdcHitNeg();
+    THcRawTdcHit& GetRawTdcHitPos();
+    THcRawTdcHit& GetRawTdcHitNeg();
 
- private:
+  protected:
+    static const Int_t fNAdcSignals = 2;
+    static const Int_t fNTdcSignals = 2;
 
-  ClassDef(THcRawHodoHit, 0);	// Raw Hodoscope hit
+    THcRawAdcHit fAdcHits[fNAdcSignals];
+    THcRawTdcHit fTdcHits[fNTdcSignals];
+
+  private:
+    ClassDef(THcRawHodoHit, 0);  // Raw Hodoscope hit
 };
 
-#endif
+
+#endif  // ROOT_THcRawHodoHit
diff --git a/src/THcRawShowerHit.cxx b/src/THcRawShowerHit.cxx
index 9068c16..165a749 100644
--- a/src/THcRawShowerHit.cxx
+++ b/src/THcRawShowerHit.cxx
@@ -2,7 +2,7 @@
 \class THcRawShowerHit
 \ingroup DetSupport
 
-\brief Class representing a single raw hit for a hodoscope paddle.
+\brief Class representing a single raw hit for a shower paddle.
 
   - `signal 0` is ADC pos
   - `signal 1` is ADC neg
@@ -23,7 +23,7 @@ THcRawShowerHit& THcRawShowerHit::operator=(const THcRawShowerHit& right) {
   THcRawHit::operator=(right);
 
   if (this != &right) {
-    for (UInt_t iAdcSig=0; iAdcSig<fNAdcSignals; ++iAdcSig) {
+    for (Int_t iAdcSig=0; iAdcSig<fNAdcSignals; ++iAdcSig) {
       fAdcHits[iAdcSig] = right.fAdcHits[iAdcSig];
     }
   }
@@ -45,24 +45,24 @@ void THcRawShowerHit::Clear(Option_t* opt) {
 
 
 void THcRawShowerHit::SetData(Int_t signal, Int_t data) {
-  if (signal < fNAdcSignals) {
+  if (0 <= signal && signal < fNAdcSignals) {
     fAdcHits[signal].SetData(data);
   }
   else {
     throw std::out_of_range(
-      "`THcTrigRawHit::GetData`: only signals `0` and `1` available!"
+      "`THcRawShowerHit::SetData`: only signals `0` and `1` available!"
     );
   }
 }
 
 
 void THcRawShowerHit::SetSample(Int_t signal, Int_t data) {
-  if (signal < fNAdcSignals) {
+  if (0 <= signal && signal < fNAdcSignals) {
     fAdcHits[signal].SetSample(data);
   }
   else {
     throw std::out_of_range(
-      "`THcTrigRawHit::GetData`: only signals `0` and `1` available!"
+      "`THcRawShowerHit::SetSample`: only signals `0` and `1` available!"
     );
   }
 }
@@ -71,12 +71,12 @@ 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 < fNAdcSignals) {
+  if (0 <= signal && signal < fNAdcSignals) {
     fAdcHits[signal].SetDataTimePedestalPeak(data, time, pedestal, peak);
   }
   else {
     throw std::out_of_range(
-      "`THcTrigRawHit::GetData`: only signals `0` and `1` available!"
+      "`THcRawShowerHit::SetDataTimePedestalPeak`: only signals `0` and `1` available!"
     );
   }
 }
@@ -92,36 +92,36 @@ void THcRawShowerHit::SetReference(Int_t signal, Int_t reference) {
 
 
 Int_t THcRawShowerHit::GetData(Int_t signal) {
-  if (signal < fNAdcSignals) {
+  if (0 <= signal && signal < fNAdcSignals) {
     return fAdcHits[signal].GetRawData();
   }
   else {
     throw std::out_of_range(
-      "`THcTrigRawHit::GetData`: only signals `0` and `1` available!"
+      "`THcRawShowerHit::GetData`: only signals `0` and `1` available!"
     );
   }
 }
 
 
 Int_t THcRawShowerHit::GetRawData(Int_t signal) {
-  if (signal < fNAdcSignals) {
+  if (0 <= signal && signal < fNAdcSignals) {
     return fAdcHits[signal].GetRawData();
   }
   else {
     throw std::out_of_range(
-      "`THcTrigRawHit::GetData`: only signals `0` and `1` available!"
+      "`THcRawShowerHit::GetRawData`: only signals `0` and `1` available!"
     );
   }
 }
 
 
 THcRawHit::ESignalType THcRawShowerHit::GetSignalType(Int_t signal) {
-  if (signal < fNAdcSignals) {
+  if (0 <= signal && signal < fNAdcSignals) {
     return kADC;
   }
   else {
     throw std::out_of_range(
-      "`THcTrigRawHit::GetData`: only signals `0` and `1` available!"
+      "`THcRawShowerHit::GetSignalType`: only signals `0` and `1` available!"
     );
   }
 }
diff --git a/src/THcRawShowerHit.h b/src/THcRawShowerHit.h
index 04d2c9e..a70af83 100644
--- a/src/THcRawShowerHit.h
+++ b/src/THcRawShowerHit.h
@@ -40,4 +40,5 @@ class THcRawShowerHit : public THcRawHit {
     ClassDef(THcRawShowerHit, 0);  // Raw Shower counter hit
 };
 
+
 #endif
diff --git a/src/THcRawTdcHit.cxx b/src/THcRawTdcHit.cxx
index 634cd4a..8fa1937 100644
--- a/src/THcRawTdcHit.cxx
+++ b/src/THcRawTdcHit.cxx
@@ -69,6 +69,7 @@ void THcRawTdcHit::SetRefTime(Int_t refTime) {
   fHasRefTime = kTRUE;
 }
 
+
 Int_t THcRawTdcHit::GetTimeRaw(UInt_t iHit) const {
   if (iHit < fNHits) {
     return fTime[iHit];
@@ -107,9 +108,15 @@ Int_t THcRawTdcHit::GetRefTime() const {
   }
 }
 
+
 Int_t THcRawTdcHit::HasRefTime() const {
   return fHasRefTime;
 }
 
 
+UInt_t THcRawTdcHit::GetNHits() const {
+  return fNHits;
+}
+
+
 ClassImp(THcRawTdcHit)
diff --git a/src/THcRawTdcHit.h b/src/THcRawTdcHit.h
index 7c3124f..e04dad3 100644
--- a/src/THcRawTdcHit.h
+++ b/src/THcRawTdcHit.h
@@ -21,6 +21,8 @@ class THcRawTdcHit : public TObject {
 
     Int_t HasRefTime() const;
 
+    UInt_t GetNHits() const;
+
   protected:
     static const UInt_t fMaxNHits = 16;
 
diff --git a/src/THcScintillatorPlane.cxx b/src/THcScintillatorPlane.cxx
index 9bbaef6..9b511f9 100644
--- a/src/THcScintillatorPlane.cxx
+++ b/src/THcScintillatorPlane.cxx
@@ -384,10 +384,10 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
 
     Int_t index=padnum-1;
     // Need to be finding first hit in TDC range, not the first hit overall
-    if (hit->fNRawHits[2] > 0)
-      ((THcSignalHit*) frPosTDCHits->ConstructedAt(nrPosTDCHits++))->Set(padnum, hit->GetTDCPos()+fTdcOffset);
-    if (hit->fNRawHits[3] > 0)
-      ((THcSignalHit*) frNegTDCHits->ConstructedAt(nrNegTDCHits++))->Set(padnum, hit->GetTDCNeg()+fTdcOffset);
+    if (hit->GetRawTdcHitPos().GetNHits() > 0)
+      ((THcSignalHit*) frPosTDCHits->ConstructedAt(nrPosTDCHits++))->Set(padnum, hit->GetRawTdcHitPos().GetTime()+fTdcOffset);
+    if (hit->GetRawTdcHitNeg().GetNHits() > 0)
+      ((THcSignalHit*) frNegTDCHits->ConstructedAt(nrNegTDCHits++))->Set(padnum, hit->GetRawTdcHitNeg().GetTime()+fTdcOffset);
     // For making hit maps, we use >= 50 cut
     // For making raw hists, we don't want the cut
     // We can use a flag to turn on and off these without 50 cut
@@ -395,29 +395,29 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
     Double_t adc_pos;
     Double_t adc_neg;
     if(fADCMode == kADCDynamicPedestal) {
-      adc_pos = hit->GetADCPos()-hit->GetPedestalPos()*fADCPedScaleFactor;
-      adc_neg = hit->GetADCNeg()-hit->GetPedestalNeg()*fADCPedScaleFactor;
+			adc_pos = hit->GetRawAdcHitPos().GetPeakInt();
+			adc_neg = hit->GetRawAdcHitNeg().GetPeakInt();
     } else if (fADCMode == kADCSampleIntegral) {
-      adc_pos = hit->GetIntegralPos()-fPosPed[index];
-      adc_neg = hit->GetIntegralNeg()-fNegPed[index];
+			adc_pos = hit->GetRawAdcHitPos().GetSampleIntRaw() - fPosPed[index];
+			adc_neg = hit->GetRawAdcHitNeg().GetSampleIntRaw() - fNegPed[index];
     } else if (fADCMode == kADCSampIntDynPed) {
-      adc_pos = hit->GetIntegralPos()-hit->GetPedestalPos()*fADCPedScaleFactor;
-      adc_neg = hit->GetIntegralNeg()-hit->GetPedestalNeg()*fADCPedScaleFactor;
+      adc_pos = hit->GetRawAdcHitPos().GetSampleInt();
+      adc_neg = hit->GetRawAdcHitNeg().GetSampleInt();
     } else {
-      adc_pos = hit->GetADCPos()-fPosPed[index];
-      adc_neg = hit->GetADCNeg()-fNegPed[index];
+      adc_pos = hit->GetRawAdcHitPos().GetPeakIntRaw()-fPosPed[index];
+      adc_neg = hit->GetRawAdcHitNeg().GetPeakIntRaw()-fNegPed[index];
     }
     if (adc_pos >= fADCDiagCut) {
       ((THcSignalHit*) frPosADCHits->ConstructedAt(nrPosADCHits))->Set(padnum, adc_pos);
-      Double_t samplesum=hit->GetIntegralPos();
-      Double_t pedestal=hit->GetPedestalPos();
+      Double_t samplesum=hit->GetRawAdcHitPos().GetSampleIntRaw();
+      Double_t pedestal=hit->GetRawAdcHitPos().GetPedRaw();
       ((THcSignalHit*) frPosADCSums->ConstructedAt(nrPosADCHits))->Set(padnum, samplesum);
       ((THcSignalHit*) frPosADCPeds->ConstructedAt(nrPosADCHits++))->Set(padnum, pedestal);
     }
     if (adc_neg >= fADCDiagCut) {
       ((THcSignalHit*) frNegADCHits->ConstructedAt(nrNegADCHits))->Set(padnum, adc_neg);
-      Double_t samplesum=hit->GetIntegralNeg();
-      Double_t pedestal=hit->GetPedestalNeg();
+			Double_t samplesum=hit->GetRawAdcHitNeg().GetSampleIntRaw();
+      Double_t pedestal=hit->GetRawAdcHitNeg().GetPedRaw();
       ((THcSignalHit*) frNegADCSums->ConstructedAt(nrNegADCHits))->Set(padnum, samplesum);
       ((THcSignalHit*) frNegADCPeds->ConstructedAt(nrNegADCHits++))->Set(padnum, pedestal);
     }
@@ -427,15 +427,15 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
     Int_t tdc_pos=-99;
     Int_t tdc_neg=-99;
     // Find first in range hit from multihit tdc
-    for(UInt_t thit=0; thit<hit->fNRawHits[2]; thit++) {
-      tdc_pos = hit->GetTDCPos(thit)+fTdcOffset;
+    for(UInt_t thit=0; thit<hit->GetRawTdcHitPos().GetNHits(); thit++) {
+      tdc_pos = hit->GetRawTdcHitPos().GetTime(thit)+fTdcOffset;
       if(tdc_pos >= fScinTdcMin && tdc_pos <= fScinTdcMax) {
 	btdcraw_pos = kTRUE;
 	break;
       }
     }
-    for(UInt_t thit=0; thit<hit->fNRawHits[3]; thit++) {
-      tdc_neg = hit->GetTDCNeg(thit)+fTdcOffset;
+    for(UInt_t thit=0; thit<hit->GetRawTdcHitNeg().GetNHits(); thit++) {
+      tdc_neg = hit->GetRawTdcHitNeg().GetTime(thit)+fTdcOffset;
       if(tdc_neg >= fScinTdcMin && tdc_neg <= fScinTdcMax) {
 	btdcraw_neg = kTRUE;
 	break;
@@ -525,8 +525,8 @@ Int_t THcScintillatorPlane::AccumulatePedestals(TClonesArray* rawhits, Int_t nex
       break;
     }
     Int_t element = hit->fCounter - 1; // Should check if in range
-    Int_t adcpos = hit->GetADCPos();
-    Int_t adcneg = hit->GetADCNeg();
+    Int_t adcpos = hit->GetRawAdcHitPos().GetPeakIntRaw();
+    Int_t adcneg = hit->GetRawAdcHitNeg().GetPeakIntRaw();
 
     if(adcpos <= fPosPedLimit[element]) {
       fPosPedSum[element] += adcpos;
@@ -613,4 +613,3 @@ void THcScintillatorPlane::InitializePedestals( )
 //____________________________________________________________________________
 ClassImp(THcScintillatorPlane)
 ////////////////////////////////////////////////////////////////////////////////
-
-- 
GitLab