From 162dcb1e416a5de763418924e71441462e7d98e3 Mon Sep 17 00:00:00 2001
From: Jure Bericic <bericic@jlab.org>
Date: Mon, 6 Feb 2017 14:12:37 -0500
Subject: [PATCH] Trig stack update for f250.

`THcTrigRawHit` now uses raw ADC and TDC classes.
Added new leaves to the `THcTrigDet` Root output.
---
 src/THcTrigDet.cxx    | 189 ++++++++++++++----
 src/THcTrigDet.h      |  16 +-
 src/THcTrigRawHit.cxx | 438 ++++++++++--------------------------------
 src/THcTrigRawHit.h   |  38 +---
 4 files changed, 271 insertions(+), 410 deletions(-)

diff --git a/src/THcTrigDet.cxx b/src/THcTrigDet.cxx
index eb44c82..71769cb 100644
--- a/src/THcTrigDet.cxx
+++ b/src/THcTrigDet.cxx
@@ -11,15 +11,23 @@ comming from a specific source, like HMS.
 Can hold up to 100 ADC and TDC channels, though the limit can be changed if
 needed. It just seemed like a reasonable starting value.
 
+Only outputs the first hit for each channel to the Root tree leaf.
+
 # Defined variables
 
 For ADC channels it defines:
-  - ADC value: `var_adc`
-  - pedestal: `var_adcPed`
+  - raw pedestal: `var_adcPedRaw`
+  - raw pulse integral: `var_adcPulseIntRaw`
+  - raw pulse amplitude: `var_adcPulseAmpRaw`
+  - raw pulse time: `var_adcPulseTimeRaw`
+  - single sample pedestal value: `var_adcPed`
+  - pedestal subtracted pulse integral: `var_adcPulseInt`
+  - pedestal subtracted pulse amplitude: `var_adcPulseAmp`
   - multiplicity: `var_adcMult`
 
 For TDC channels it defines:
-  - TDC value: `var_tdc`
+  - raw TDC time: `var_tdcTimeRaw`
+  - refence time subtracted TDC time: `var_tdcTime`
   - multiplicity: `var_tdcMult`
 
 # Parameter file variables
@@ -102,6 +110,8 @@ Use only with THcTrigApp class.
 #include "THcDetectorMap.h"
 #include "THcGlobals.h"
 #include "THcParmList.h"
+#include "THcRawAdcHit.h"
+#include "THcRawTdcHit.h"
 #include "THcTrigApp.h"
 #include "THcTrigRawHit.h"
 
@@ -115,8 +125,10 @@ THcTrigDet::THcTrigDet(
   THaDetector(name, description, app), THcHitList(),
   fKwPrefix(""),
   fNumAdc(0), fNumTdc(0), fAdcNames(), fTdcNames(),
-  fAdcVal(), fAdcPedestal(), fAdcMultiplicity(),
-  fTdcVal(), fTdcMultiplicity()
+  fTdcTimeRaw(), fTdcTime(),
+  fAdcPedRaw(), fAdcPulseIntRaw(), fAdcPulseAmpRaw(), fAdcPulseTimeRaw(),
+  fAdcPed(), fAdcPulseInt(), fAdcPulseAmp(),
+  fTdcMultiplicity(), fAdcMultiplicity()
 {}
 
 
@@ -128,8 +140,21 @@ THaAnalysisObject::EStatus THcTrigDet::Init(const TDatime& date) {
   Setup(GetName(), GetTitle());
 
   // Initialize all variables.
-  for (int i=0; i<fMaxAdcChannels; ++i) fAdcVal[i] = -1.0;
-  for (int i=0; i<fMaxTdcChannels; ++i) fTdcVal[i] = -1.0;
+  for (int i=0; i<fMaxAdcChannels; ++i) {
+    fAdcPedRaw[i] = 0;
+    fAdcPulseIntRaw[i] = 0;
+    fAdcPulseAmpRaw[i] = 0;
+    fAdcPulseTimeRaw[i] = 0;
+    fAdcPed[i] = 0.0;
+    fAdcPulseInt[i] = 0.0;
+    fAdcPulseAmp[i] = 0.0;
+    fAdcMultiplicity[i] = 0;
+  };
+  for (int i=0; i<fMaxTdcChannels; ++i) {
+    fTdcTimeRaw[i] = 0;
+    fTdcTime[i] = 0.0;
+    fTdcMultiplicity[i] = 0;
+  };
 
   // Call initializer for base class.
   // This also calls `ReadDatabase` and `DefineVariables`.
@@ -160,8 +185,21 @@ void THcTrigDet::Clear(Option_t* opt) {
   THaAnalysisObject::Clear(opt);
 
   // Reset all data.
-  for (int i=0; i<fNumAdc; ++i) fAdcVal[i] = 0.0;
-  for (int i=0; i<fNumTdc; ++i) fTdcVal[i] = 0.0;
+  for (int i=0; i<fNumAdc; ++i) {
+    fAdcPedRaw[i] = 0;
+    fAdcPulseIntRaw[i] = 0;
+    fAdcPulseAmpRaw[i] = 0;
+    fAdcPulseTimeRaw[i] = 0;
+    fAdcPed[i] = 0.0;
+    fAdcPulseInt[i] = 0.0;
+    fAdcPulseAmp[i] = 0.0;
+    fAdcMultiplicity[i] = 0;
+  };
+  for (int i=0; i<fNumTdc; ++i) {
+    fTdcTimeRaw[i] = 0;
+    fTdcTime[i] = 0.0;
+    fTdcMultiplicity[i] = 0;
+  };
 }
 
 
@@ -174,14 +212,28 @@ Int_t THcTrigDet::Decode(const THaEvData& evData) {
   while (iHit < numHits) {
     THcTrigRawHit* hit = dynamic_cast<THcTrigRawHit*>(fRawHitList->At(iHit));
 
+    Int_t cnt = hit->fCounter-1;
     if (hit->fPlane == 1) {
-      fAdcVal[hit->fCounter-1] = hit->GetData(0, 0);
-      fAdcPedestal[hit->fCounter-1] = hit->GetAdcPedestal(0);
-      fAdcMultiplicity[hit->fCounter-1] = hit->GetMultiplicity(0);
+      THcRawAdcHit rawAdcHit = hit->GetRawAdcHit();
+
+      fAdcPedRaw[cnt] = rawAdcHit.GetPedRaw();
+      fAdcPulseIntRaw[cnt] = rawAdcHit.GetPulseIntRaw();
+      fAdcPulseAmpRaw[cnt] = rawAdcHit.GetPulseAmpRaw();
+      fAdcPulseTimeRaw[cnt] = rawAdcHit.GetPulseTimeRaw();
+
+      fAdcPed[cnt] = rawAdcHit.GetPed();
+      fAdcPulseInt[cnt] = rawAdcHit.GetPulseInt();
+      fAdcPulseAmp[cnt] = rawAdcHit.GetPulseAmp();
+
+      fAdcMultiplicity[cnt] = rawAdcHit.GetNPulses();
     }
     else if (hit->fPlane == 2) {
-      fTdcVal[hit->fCounter-1] = hit->GetData(1, 0);
-      fTdcMultiplicity[hit->fCounter-1] = hit->GetMultiplicity(1);
+      THcRawTdcHit rawTdcHit = hit->GetRawTdcHit();
+
+      fTdcTimeRaw[cnt] = rawTdcHit.GetTimeRaw();
+      fTdcTime[cnt] = rawTdcHit.GetTime();
+
+      fTdcMultiplicity[cnt] = rawTdcHit.GetNHits();
     }
     else {
       throw std::out_of_range(
@@ -231,60 +283,121 @@ Int_t THcTrigDet::DefineVariables(THaAnalysisObject::EMode mode) {
   std::vector<RVarDef> vars;
 
   //Push the variable names for ADC channels.
-  std::vector<TString> adcValTitle(fNumAdc), adcValVar(fNumAdc);
-  std::vector<TString> adcPedestalTitle(fNumAdc), adcPedestalVar(fNumAdc);
+  std::vector<TString> adcPedRawTitle(fNumAdc), adcPedRawVar(fNumAdc);
+  std::vector<TString> adcPulseIntRawTitle(fNumAdc), adcPulseIntRawVar(fNumAdc);
+  std::vector<TString> adcPulseAmpRawTitle(fNumAdc), adcPulseAmpRawVar(fNumAdc);
+  std::vector<TString> adcPulseTimeRawTitle(fNumAdc), adcPulseTimeRawVar(fNumAdc);
+  std::vector<TString> adcPedTitle(fNumAdc), adcPedVar(fNumAdc);
+  std::vector<TString> adcPulseIntTitle(fNumAdc), adcPulseIntVar(fNumAdc);
+  std::vector<TString> adcPulseAmpTitle(fNumAdc), adcPulseAmpVar(fNumAdc);
   std::vector<TString> adcMultiplicityTitle(fNumAdc), adcMultiplicityVar(fNumAdc);
 
   for (int i=0; i<fNumAdc; ++i) {
-    adcValTitle.at(i) = fAdcNames.at(i) + "_adc";
-    adcValVar.at(i) = TString::Format("fAdcVal[%d]", i);
+    adcPedRawTitle.at(i) = fAdcNames.at(i) + "_adcPedRaw";
+    adcPedRawVar.at(i) = TString::Format("fAdcPedRaw[%d]", i);
     RVarDef entry1 {
-      adcValTitle.at(i).Data(),
-      adcValTitle.at(i).Data(),
-      adcValVar.at(i).Data()
+      adcPedRawTitle.at(i).Data(),
+      adcPedRawTitle.at(i).Data(),
+      adcPedRawVar.at(i).Data()
     };
     vars.push_back(entry1);
 
-    adcPedestalTitle.at(i) = fAdcNames.at(i) + "_adcPed";
-    adcPedestalVar.at(i) = TString::Format("fAdcPedestal[%d]", i);
+    adcPulseIntRawTitle.at(i) = fAdcNames.at(i) + "_adcPulseIntRaw";
+    adcPulseIntRawVar.at(i) = TString::Format("fAdcPulseIntRaw[%d]", i);
     RVarDef entry2 {
-      adcPedestalTitle.at(i).Data(),
-      adcPedestalTitle.at(i).Data(),
-      adcPedestalVar.at(i).Data()
+      adcPulseIntRawTitle.at(i).Data(),
+      adcPulseIntRawTitle.at(i).Data(),
+      adcPulseIntRawVar.at(i).Data()
     };
     vars.push_back(entry2);
 
-    adcMultiplicityTitle.at(i) = fAdcNames.at(i) + "_adcMult";
-    adcMultiplicityVar.at(i) = TString::Format("fAdcMultiplicity[%d]", i);
+    adcPulseAmpRawTitle.at(i) = fAdcNames.at(i) + "_adcPulseAmpRaw";
+    adcPulseAmpRawVar.at(i) = TString::Format("fAdcPulseAmpRaw[%d]", i);
     RVarDef entry3 {
+      adcPulseAmpRawTitle.at(i).Data(),
+      adcPulseAmpRawTitle.at(i).Data(),
+      adcPulseAmpRawVar.at(i).Data()
+    };
+    vars.push_back(entry3);
+
+    adcPulseTimeRawTitle.at(i) = fAdcNames.at(i) + "_adcPulseTimeRaw";
+    adcPulseTimeRawVar.at(i) = TString::Format("fAdcPulseTimeRaw[%d]", i);
+    RVarDef entry4 {
+      adcPulseTimeRawTitle.at(i).Data(),
+      adcPulseTimeRawTitle.at(i).Data(),
+      adcPulseTimeRawVar.at(i).Data()
+    };
+    vars.push_back(entry4);
+
+    adcPedTitle.at(i) = fAdcNames.at(i) + "_adcPed";
+    adcPedVar.at(i) = TString::Format("fAdcPed[%d]", i);
+    RVarDef entry5 {
+      adcPedTitle.at(i).Data(),
+      adcPedTitle.at(i).Data(),
+      adcPedVar.at(i).Data()
+    };
+    vars.push_back(entry5);
+
+    adcPulseIntTitle.at(i) = fAdcNames.at(i) + "_adcPulseInt";
+    adcPulseIntVar.at(i) = TString::Format("fAdcPulseInt[%d]", i);
+    RVarDef entry6 {
+      adcPulseIntTitle.at(i).Data(),
+      adcPulseIntTitle.at(i).Data(),
+      adcPulseIntVar.at(i).Data()
+    };
+    vars.push_back(entry6);
+
+    adcPulseAmpTitle.at(i) = fAdcNames.at(i) + "_adcPulseAmp";
+    adcPulseAmpVar.at(i) = TString::Format("fAdcPulseAmp[%d]", i);
+    RVarDef entry7 {
+      adcPulseAmpTitle.at(i).Data(),
+      adcPulseAmpTitle.at(i).Data(),
+      adcPulseAmpVar.at(i).Data()
+    };
+    vars.push_back(entry7);
+
+    adcMultiplicityTitle.at(i) = fAdcNames.at(i) + "_adcMultiplicity";
+    adcMultiplicityVar.at(i) = TString::Format("fAdcMultiplicity[%d]", i);
+    RVarDef entry8 {
       adcMultiplicityTitle.at(i).Data(),
       adcMultiplicityTitle.at(i).Data(),
       adcMultiplicityVar.at(i).Data()
     };
-    vars.push_back(entry3);
+    vars.push_back(entry8);
   }
 
   // Push the variable names for TDC channels.
-  std::vector<TString> tdcValTitle(fNumTdc), tdcValVar(fNumTdc);
+  std::vector<TString> tdcTimeRawTitle(fNumTdc), tdcTimeRawVar(fNumTdc);
+  std::vector<TString> tdcTimeTitle(fNumTdc), tdcTimeVar(fNumTdc);
   std::vector<TString> tdcMultiplicityTitle(fNumTdc), tdcMultiplicityVar(fNumTdc);
+
   for (int i=0; i<fNumTdc; ++i) {
-    tdcValTitle.at(i) = fTdcNames.at(i) + "_tdc";
-    tdcValVar.at(i) = TString::Format("fTdcVal[%d]", i);
+    tdcTimeRawTitle.at(i) = fTdcNames.at(i) + "_tdcTimeRaw";
+    tdcTimeRawVar.at(i) = TString::Format("fTdcTimeRaw[%d]", i);
     RVarDef entry1 {
-      tdcValTitle.at(i).Data(),
-      tdcValTitle.at(i).Data(),
-      tdcValVar.at(i).Data()
+      tdcTimeRawTitle.at(i).Data(),
+      tdcTimeRawTitle.at(i).Data(),
+      tdcTimeRawVar.at(i).Data()
     };
     vars.push_back(entry1);
 
-    tdcMultiplicityTitle.at(i) = fTdcNames.at(i) + "_tdcMult";
-    tdcMultiplicityVar.at(i) = TString::Format("fTdcMultiplicity[%d]", i);
+    tdcTimeTitle.at(i) = fTdcNames.at(i) + "_tdcTime";
+    tdcTimeVar.at(i) = TString::Format("fTdcTime[%d]", i);
     RVarDef entry2 {
+      tdcTimeTitle.at(i).Data(),
+      tdcTimeTitle.at(i).Data(),
+      tdcTimeVar.at(i).Data()
+    };
+    vars.push_back(entry2);
+
+    tdcMultiplicityTitle.at(i) = fTdcNames.at(i) + "_tdcMultiplicity";
+    tdcMultiplicityVar.at(i) = TString::Format("fTdcMultiplicity[%d]", i);
+    RVarDef entry3 {
       tdcMultiplicityTitle.at(i).Data(),
       tdcMultiplicityTitle.at(i).Data(),
       tdcMultiplicityVar.at(i).Data()
     };
-    vars.push_back(entry2);
+    vars.push_back(entry3);
   }
 
   RVarDef end {0};
diff --git a/src/THcTrigDet.h b/src/THcTrigDet.h
index ee6ac5a..b527c4e 100644
--- a/src/THcTrigDet.h
+++ b/src/THcTrigDet.h
@@ -42,12 +42,20 @@ class THcTrigDet : public THaDetector, public THcHitList {
     static const int fMaxAdcChannels = 100;
     static const int fMaxTdcChannels = 100;
 
-    Int_t fAdcVal[fMaxAdcChannels];
-    Int_t fAdcPedestal[fMaxAdcChannels];
-    Int_t fAdcMultiplicity[fMaxAdcChannels];
+    Int_t fTdcTimeRaw[fMaxTdcChannels];
+    Double_t fTdcTime[fMaxTdcChannels];
+
+    Int_t fAdcPedRaw[fMaxAdcChannels];
+    Int_t fAdcPulseIntRaw[fMaxAdcChannels];
+    Int_t fAdcPulseAmpRaw[fMaxAdcChannels];
+    Int_t fAdcPulseTimeRaw[fMaxAdcChannels];
+
+    Double_t fAdcPed[fMaxAdcChannels];
+    Double_t fAdcPulseInt[fMaxAdcChannels];
+    Double_t fAdcPulseAmp[fMaxAdcChannels];
 
-    Int_t fTdcVal[fMaxTdcChannels];
     Int_t fTdcMultiplicity[fMaxTdcChannels];
+    Int_t fAdcMultiplicity[fMaxAdcChannels];
 
   private:
     THcTrigDet();
diff --git a/src/THcTrigRawHit.cxx b/src/THcTrigRawHit.cxx
index 738b310..d0dbd47 100644
--- a/src/THcTrigRawHit.cxx
+++ b/src/THcTrigRawHit.cxx
@@ -1,7 +1,6 @@
 /**
 \class THcTrigRawHit
 \ingroup DetSupport
-
 \brief Class representing a single raw hit for the THcTrigDet.
 
   - `signal 0` is ADC
@@ -12,9 +11,7 @@ It supports rich data from flash 250 ADC modules.
 
 /**
 \fn THcTrigRawHit::THcTrigRawHit(Int_t plane=0, Int_t counter=0)
-
 \brief A constructor.
-
 \param[in] plane Internal plane number of the hit. Should be `1` for ADC and
   `2` for TDC.
 \param[in] counter Internal bar number of the hit.
@@ -22,197 +19,106 @@ It supports rich data from flash 250 ADC modules.
 
 /**
 \fn THcTrigRawHit& THcTrigRawHit::operator=(const THcTrigRawHit& right)
-
 \brief Assignment operator.
-
 \param[in] right Raw hit to be assigned.
 */
 
 /**
 \fn THcTrigRawHit::~THcTrigRawHit()
-
 \brief A destructor.
 */
 
 /**
 \fn void THcTrigRawHit::Clear(Option_t* opt="")
-
 \brief Clears variables before next event.
-
-\param[in] opt Maybe used in base clas... Not sure.
+\param[in] opt Maybe used in base class... Not sure.
 
 */
 
 /**
 \fn void THcTrigRawHit::SetData(Int_t signal, Int_t data)
-
 \brief Sets next data value.
-
 \param[in] signal ADC or TDC.
 \param[in] data Value to be set.
+\throw std::out_of_range Tried to set wrong signal.
 */
 
 /**
 \fn void THcTrigRawHit::SetSample(Int_t signal, Int_t data)
-
 \brief Sets next waveform sample value.
-
-\param[in] signal ADC or TDC.
+\param[in] signal ADC.
 \param[in] data Sample value to be set.
+\throw std::out_of_range Tried to set wrong signal.
 */
 
 /**
 \fn void THcTrigRawHit::SetDataTimePedestalPeak(
   Int_t signal, Int_t data, Int_t time, Int_t pedestal, Int_t peak)
-
 \brief Sets multiple bits of data from flash 250 ADC modules.
-
-\param[in] signal Usually ADC.
+\param[in] signal ADC.
 \param[in] data ADC sum value to be set.
 \param[in] time Time of the peak.
 \param[in] pedestal Pedestal value.
 \param[in] peak Sample ADC value at peak.
+\throw std::out_of_range Tried to set wrong signal.
 */
 
 /**
 \fn void THcTrigRawHit::SetReference(Int_t signal, Int_t reference)
-
 \brief Sets reference time.
-
-\param[in] signal ADC or TDC.
+\param[in] signal TDC.
 \param[in] reference Reference time to be set.
+\throw std::out_of_range Tried to set wrong signal.
 */
 
 /**
 \fn Int_t THcTrigRawHit::GetData(Int_t signal)
-
 \brief Gets data for first hit of signal.
-
-\param[in] signal ADC or TDC.
-
-Read also GetData(Int_t signal, UInt_t iHit).
-*/
-
-/**
-\fn Int_t THcTrigRawHit::GetData(Int_t signal, UInt_t iHit)
-
-\brief Gets data for specific hit of signal.
-
 \param[in] signal ADC or TDC.
-\param[in] iHit Sequential number of wanted hit.
-
-If the signal is TDC, the returned value is corrected for reference time, if
-available.
-
-Read also GetRawData(Int_t signal, UInt_t iHit)
+\throw std::out_of_range Tried to get wrong signal.
 */
 
 /**
 \fn Int_t THcTrigRawHit::GetRawData(Int_t signal)
-
 \brief Gets raw data for first hit of signal.
-
-\param[in] signal ADC or TDC.
-
-Read also GetRawData(Int_t signal, UInt_t iHit).
-*/
-
-/**
-\fn Int_t THcTrigRawHit::GetRawData(Int_t signal, UInt_t iHit)
-
-\brief Gets raw data for specific hit of signal.
-
 \param[in] signal ADC or TDC.
-\param[in] iHit Sequential number of wanted hit.
-
-If requesting the first hit where it does not exist, `0` is returned.
+\throw std::out_of_range Tried to get wrong signal.
 */
 
 /**
-\fn Int_t THcTrigRawHit::GetAdcTime(UInt_t iHit)
-
-\brief Gets reference time subtracted time of ADC peak.
-
-\param[in] iHit Sequential number of wanted hit.
-
-If requesting the first hit where it does not exist or if time is not
-available, `0` is returned.
-*/
-
-/**
-\fn Int_t THcTrigRawHit::GetAdcPedestal(UInt_t iHit)
-
-\brief Gets the ADC pedestal value.
-
-\param[in] iHit Sequential number of wanted hit.
-
-The pedestal value is usually a sum of `N` samples, where `N` is defined in
-ADC module settings.
-
-If requesting the first hit where it does not exist or if pedestal is not
-available, `0` is returned.
-*/
-
-/**
-\fn Int_t THcTrigRawHit::GetAdcPulse(UInt_t iHit)
-
-\brief Gets the position of ADC peak.
-
-\param[in] iHit Sequential number of wanted hit.
-
-If requesting the first hit where it does not exist or if peak is not
-available, `0` is returned.
-*/
-
-/**
-\fn Int_t THcTrigRawHit::GetNSignals()
-
-\brief Returns number of signal handled by this class, i.e., `2`.
+\fn Int_t THcTrigRawHit::GetReference(Int_t signal)
+\brief Returns reference time.
+\param[in] signal TDC.
+\throw std::out_of_range Tried to get wrong signal.
 */
 
 /**
 \fn THcRawHit::ESignalType THcTrigRawHit::GetSignalType(Int_t signal)
-
 \brief Returns the signal type.
-
 \param[in] signal ADC or TDC.
+\throw std::out_of_range Tried to get wrong signal.
 */
 
 /**
-\fn Int_t THcTrigRawHit::GetReference(Int_t signal)
-
-\brief Returns reference time.
-
-\param[in] signal ADC or TDC.
-
-Returns `0` if reference time is not available.
+\fn Int_t THcTrigRawHit::GetNSignals()
+\brief Returns number of signal handled by this class, i.e., `2`.
 */
 
 /**
-\fn Int_t THcTrigRawHit::GetMultiplicity(Int_t signal)
-
-\brief Gets the number of hits for this event.
-
-\param[in] signal ADC or TDC.
-
+\fn Bool_t THcTrigRawHit::HasReference(Int_t signal)
+\brief Checks if reference time is available.
+\param[in] signal TDC.
+\throw std::out_of_range Tried to get wrong signal.
 */
 
 /**
-\fn Bool_t THcTrigRawHit::HasMulti(Int_t signal)
-
-\brief Checks if rich data is available.
-
-\param[in] signal ADC or TDC.
-
+\fn THcRawAdcHit& THcTrigRawHit::GetRawAdcHit()
+\brief Gets reference to THcRawAdcHit.
 */
 
 /**
-\fn Bool_t THcTrigRawHit::HasReference(Int_t signal)
-
-\brief Checks if reference time is available.
-
-\param[in] signal ADC or TDC.
-
+\fn THcRawTdcHit& THcTrigRawHit::GetRawTdcHit()
+\brief Gets reference to THcRawTdcHit.
 */
 
 // TODO: Check if signal matches plane.
@@ -229,11 +135,7 @@ Returns `0` if reference time is not available.
 
 THcTrigRawHit::THcTrigRawHit(
   Int_t plane, Int_t counter
-) :
-  THcRawHit(plane, counter),
-  fAdc(), fAdcTime(), fAdcPedestal(), fAdcPulse(), fAdcSamples(), fTdc(),
-  fReferenceTime(), fHasReference(), fHasMulti(), fNRawHits(), fNRawSamples(0)
-{}
+) : THcRawHit(plane, counter), fAdcHits(), fTdcHits() {}
 
 
 THcTrigRawHit& THcTrigRawHit::operator=(const THcTrigRawHit& right) {
@@ -241,25 +143,12 @@ THcTrigRawHit& THcTrigRawHit::operator=(const THcTrigRawHit& right) {
   THcRawHit::operator=(right);
 
   if (this != &right) {
-    for (UInt_t i=0; i<fMaxNPulsesAdc; ++i) {
-      fAdc[i] = right.fAdc[i];
-      fAdcTime[i] = right.fAdcTime[i];
-      fAdcPedestal[i] = right.fAdcPedestal[i];
-      fAdcPulse[i] = right.fAdcPulse[i];
-    }
-    for (UInt_t i=0; i<fMaxNSamplesAdc; ++i) {
-      fAdcSamples[i] = right.fAdcSamples[i];
+    for (Int_t iAdcSig=0; iAdcSig<fNAdcSignals; ++iAdcSig) {
+      fAdcHits[iAdcSig] = right.fAdcHits[iAdcSig];
     }
-    for (UInt_t i=0; i<fMaxNHitsTdc; ++i) {
-      fTdc[i] = right.fTdc[i];
+    for (Int_t iTdcSig=0; iTdcSig<fNTdcSignals; ++iTdcSig) {
+      fTdcHits[iTdcSig] = right.fTdcHits[iTdcSig];
     }
-    for (UInt_t i=0; i<fNPlanes; ++i) {
-      fReferenceTime[i] = right.fReferenceTime[i];
-      fHasReference[i] = right.fHasReference[i];
-      fHasMulti[i] = right.fHasMulti[i];
-      fNRawHits[i] = right.fNRawHits[i];
-    }
-    fNRawSamples = right.fNRawSamples;
   }
 
   return *this;
@@ -270,228 +159,119 @@ THcTrigRawHit::~THcTrigRawHit() {}
 
 
 void THcTrigRawHit::Clear(Option_t* opt) {
-  TObject::Clear(opt);
+  THcRawHit::Clear(opt);
 
-  for (UInt_t i=0; i<fNPlanes; ++i) {
-    fHasReference[i] = kFALSE;
-    fHasMulti[i] = kFALSE;
-    fNRawHits[i] = 0;
+  for (Int_t iAdcSig=0; iAdcSig<fNAdcSignals; ++iAdcSig) {
+    fAdcHits[iAdcSig].Clear();
+  }
+  for (Int_t iTdcSig=0; iTdcSig<fNTdcSignals; ++iTdcSig) {
+    fTdcHits[iTdcSig].Clear();
   }
-  fNRawSamples = 0;
 }
 
 
 void THcTrigRawHit::SetData(Int_t signal, Int_t data) {
-  // Signal 0 is ADC; signal 1 is TDC.
-  if (signal == 0) {
-    if (fNRawHits[signal] >= fMaxNPulsesAdc) {
-      throw std::out_of_range(
-        "`THcTrigRawHit::SetData`: too many pulses for ADC signal!"
-      );
-    }
-    fAdc[fNRawHits[signal]] = data;
-    ++fNRawHits[signal];
+  if (0 <= signal && signal < fNAdcSignals) {
+    fAdcHits[signal].SetData(data);
   }
-  // Signal 1 is TDC.
-  else if (signal == 1) {
-    if (fNRawHits[signal] >= fMaxNHitsTdc) {
-      throw std::out_of_range(
-        "`THcTrigRawHit::SetData`: too many hits for TDC signal!"
-      );
-    }
-    fTdc[fNRawHits[signal]] = data;
-    ++fNRawHits[signal];
+  else if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
+    fTdcHits[signal-fNAdcSignals].SetTime(data);
+  }
+  else {
+    throw std::out_of_range(
+      "`THcTrigRawHit::SetData`: only signals `0` and `1` available!"
+    );
   }
-  else throw std::out_of_range(
-    "`THcTrigRawHit::SetData`: only signals `0` (ADC) and `1` (TDC) available!"
-  );
 }
 
 
 void THcTrigRawHit::SetSample(Int_t signal, Int_t data) {
-  if (signal == 0) {
-    if (fNRawSamples >= fMaxNSamplesAdc) {
-      throw std::out_of_range(
-        "`THcTrigRawHit::SetData`: too many samples for ADC signal!"
-      );
-    }
-    fAdcSamples[fNRawSamples] = data;
-    ++fNRawSamples;
+  if (0 <= signal && signal < fNAdcSignals) {
+    fAdcHits[signal].SetSample(data);
+  }
+  else {
+    throw std::out_of_range(
+      "`THcTrigRawHit::SetSample`: only signal `0` available!"
+    );
   }
-  else throw std::out_of_range(
-    "`THcTrigRawHit::SetSample`: only signal `0` (ADC) support samples!"
-  );
 }
 
 
 void THcTrigRawHit::SetDataTimePedestalPeak(
   Int_t signal, Int_t data, Int_t time, Int_t pedestal, Int_t peak
 ) {
-  if (signal == 0) {
-    if (fNRawHits[signal] >= fMaxNPulsesAdc) {
-      throw std::out_of_range(
-        "`THcTrigRawHit::SetData`: too many pulses for ADC signal!"
-      );
-    }
-    fAdc[fNRawHits[signal]] = data;
-    fAdcTime[fNRawHits[signal]] = time;
-    fAdcPedestal[fNRawHits[signal]] = pedestal;
-    fAdcPulse[fNRawHits[signal]] = peak;
-    fHasMulti[signal] = kTRUE;
-    ++fNRawHits[signal];
+  if (0 <= signal && signal < fNAdcSignals) {
+    fAdcHits[signal].SetDataTimePedestalPeak(data, time, pedestal, peak);
+  }
+  else {
+    throw std::out_of_range(
+      "`THcTrigRawHit::SetDataTimePedestalPeak`: only signal `0` available!"
+    );
   }
-  else throw std::out_of_range(
-    "`THcTrigRawHit::SetDataTimePedestalPeak`: only signal `0` (ADC) support rich data!"
-  );
 }
 
 
 void THcTrigRawHit::SetReference(Int_t signal, Int_t reference) {
-  if (signal == 0) {
-    std::cerr
-      << "Warning:"
-      << " `THcTrigRawHit::SetReference`:"
-      << " signal 0 (ADC) should not have reference time!"
-      << " Check map file!"
-      << std::endl;
-  }
-  else if (signal == 1) {
-    fReferenceTime[signal] = reference;
-    fHasReference[signal] = kTRUE;
+  if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
+    fTdcHits[signal-fNAdcSignals].SetRefTime(reference);
   }
   else {
     throw std::out_of_range(
-      "`THcTrigRawHit::SetReference`: only signals `0` and `1` available!"
+      "`THcTrigRawHit::SetReference`: only signal `1` available!"
     );
   }
 }
 
 
 Int_t THcTrigRawHit::GetData(Int_t signal) {
-  return GetData(signal, 0);
-}
-
-
-Int_t THcTrigRawHit::GetData(Int_t signal, UInt_t iHit) {
-  Int_t value = GetRawData(signal, iHit);
-
-  if (signal == 1 && fHasReference[signal]) value -= fReferenceTime[signal];
-
-  return value;
-}
-
-
-Int_t THcTrigRawHit::GetRawData(Int_t signal) {
-  return GetRawData(signal, 0);
-}
-
-
-Int_t THcTrigRawHit::GetRawData(Int_t signal, UInt_t iHit) {
-  Int_t value = 0;
-
-  if (iHit >= fNRawHits[signal] && iHit != 0) {
-    TString msg = TString::Format(
-      "`THcTrigRawHit::GetRawData`: requested hit %d for signal %d where only %d hit available!",
-      iHit, signal, fNRawHits[signal]
-    );
-    throw std::out_of_range(msg.Data());
+  if (0 <= signal && signal < fNAdcSignals) {
+    return fAdcHits[signal].GetPulseInt();
   }
-  else if (iHit >= fNRawHits[signal] && iHit == 0) {
-    value = 0;
+  else if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
+    return fTdcHits[signal-fNAdcSignals].GetTime();
   }
   else {
-    if (signal == 0) value = fAdc[iHit];
-    else if (signal == 1) value = fTdc[iHit];
-    else {
-      throw std::out_of_range(
-        "`THcTrigRawHit::GetRawData`: only signals `0` and `1` available!"
-      );
-    }
-  }
-
-  return value;
-}
-
-
-Int_t THcTrigRawHit::GetAdcTime(UInt_t iHit) {
-  Int_t value = 0;
-  Int_t signal = 0;
-
-  if (iHit >= fNRawHits[signal] && iHit != 0) {
-    TString msg = TString::Format(
-      "`THcTrigRawHit::GetAdcTime`: requested hit %d for signal %d where only %d hit available!",
-      iHit, signal, fNRawHits[signal]
+    throw std::out_of_range(
+      "`THcTrigRawHit::GetData`: only signals `0` and `1` available!"
     );
-    throw std::out_of_range(msg.Data());
   }
-  else if (iHit >= fNRawHits[signal] && iHit == 0) {
-    value = 0;
-  }
-  else {
-    if (fHasMulti[0]) value = fAdcTime[iHit];
-    else value = 0;
-  }
-
-  if (fHasReference[signal]) value -= fReferenceTime[signal];
-
-  return value;
 }
 
 
-Int_t THcTrigRawHit::GetAdcPedestal(UInt_t iHit) {
-  Int_t value = 0;
-  Int_t signal = 0;
-
-  if (iHit >= fNRawHits[signal] && iHit != 0) {
-    TString msg = TString::Format(
-      "`THcTrigRawHit::GetAdcPedestal`: requested hit %d for signal %d where only %d hit available!",
-      iHit, signal, fNRawHits[signal]
-    );
-    throw std::out_of_range(msg.Data());
+Int_t THcTrigRawHit::GetRawData(Int_t signal) {
+  if (0 <= signal && signal < fNAdcSignals) {
+    return fAdcHits[signal].GetPulseIntRaw();
   }
-  else if (iHit >= fNRawHits[signal] && iHit == 0) {
-    value = 0;
+  else if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
+    return fTdcHits[signal-fNAdcSignals].GetTimeRaw();
   }
   else {
-    if (fHasMulti[0]) value = fAdcPedestal[iHit];
-    else value = 0;
+    throw std::out_of_range(
+      "`THcTrigRawHit::GetRawData`: only signals `0` and `1` available!"
+    );
   }
-
-  return value;
 }
 
 
-Int_t THcTrigRawHit::GetAdcPulse(UInt_t iHit) {
-  Int_t value = 0;
-  Int_t signal = 0;
-
-  if (iHit >= fNRawHits[signal] && iHit != 0) {
-    TString msg = TString::Format(
-      "`THcTrigRawHit::GetAdcPulse`: requested hit %d for signal %d where only %d hit available!",
-      iHit, signal, fNRawHits[signal]
-    );
-    throw std::out_of_range(msg.Data());
-  }
-  else if (iHit >= fNRawHits[signal] && iHit == 0) {
-    value = 0;
+Int_t THcTrigRawHit::GetReference(Int_t signal) {
+  if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
+    return fTdcHits[signal-fNAdcSignals].GetRefTime();
   }
   else {
-    if (fHasMulti[0]) value = fAdcPulse[iHit];
-    else value = 0;
+    throw std::out_of_range(
+      "`THcTrigRawHit::GetReference`: only signal `1` available!"
+    );
   }
-
-  return value;
-}
-
-
-Int_t THcTrigRawHit::GetNSignals() {
-  return 2;
 }
 
 
 THcRawHit::ESignalType THcTrigRawHit::GetSignalType(Int_t signal) {
-  if (signal == 0) return kADC;
-  else if (signal == 1) return kTDC;
+  if (0 <= signal && signal < fNAdcSignals) {
+    return kADC;
+  }
+  else if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
+    return kTDC;
+  }
   else {
     throw std::out_of_range(
       "`THcTrigRawHit::GetSignalType`: only signals `0` and `1` available!"
@@ -500,52 +280,30 @@ THcRawHit::ESignalType THcTrigRawHit::GetSignalType(Int_t signal) {
 }
 
 
-Int_t THcTrigRawHit::GetReference(Int_t signal) {
-  if (signal == 0 || signal == 1) {
-    if (fHasReference[signal]) return fReferenceTime[signal];
-    else return 0;
-  }
-  else {
-    throw std::out_of_range(
-      "`THcTrigRawHit::GetReference`: only signals `0` and `1` available!"
-    );
-  }
+Int_t THcTrigRawHit::GetNSignals() {
+  return fNAdcSignals + fNTdcSignals;
 }
 
 
-Int_t THcTrigRawHit::GetMultiplicity(Int_t signal) {
-  if (signal == 0 || signal == 1) {
-    return fNRawHits[signal];
+Bool_t THcTrigRawHit::HasReference(Int_t signal) {
+  if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
+    return fTdcHits[signal-fNAdcSignals].HasRefTime();
   }
   else {
     throw std::out_of_range(
-      "`THcTrigRawHit::GetMultiplicity`: only signals `0` and `1` available!"
+      "`THcTrigRawHit::HasReference`: only signal `1` available!"
     );
   }
 }
 
 
-Bool_t THcTrigRawHit::HasMulti(Int_t signal) {
-  if (signal == 0 || signal == 1) {
-    return fHasMulti[signal];
-  }
-  else {
-    throw std::out_of_range(
-      "`THcTrigRawHit::HasMulti`: only signals `0` and `1` available!"
-    );
-  }
+THcRawAdcHit& THcTrigRawHit::GetRawAdcHit() {
+  return fAdcHits[0];
 }
 
 
-Bool_t THcTrigRawHit::HasReference(Int_t signal) {
-  if (signal == 0 || signal == 1) {
-    return fHasReference[signal];
-  }
-  else {
-    throw std::out_of_range(
-      "`THcTrigRawHit::HasReference`: only signals `0` and `1` available!"
-    );
-  }
+THcRawTdcHit& THcTrigRawHit::GetRawTdcHit() {
+  return fTdcHits[0];
 }
 
 
diff --git a/src/THcTrigRawHit.h b/src/THcTrigRawHit.h
index a6e0bce..762cac7 100644
--- a/src/THcTrigRawHit.h
+++ b/src/THcTrigRawHit.h
@@ -3,6 +3,8 @@
 
 
 #include "THcRawHit.h"
+#include "THcRawAdcHit.h"
+#include "THcRawTdcHit.h"
 
 
 class THcTrigRawHit : public THcRawHit {
@@ -21,42 +23,22 @@ class THcTrigRawHit : public THcRawHit {
     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 GetAdcTime(UInt_t iHit);
-    Int_t GetAdcPedestal(UInt_t iHit);
-    Int_t GetAdcPulse(UInt_t iHit);
-    Int_t GetNSignals();
-    ESignalType GetSignalType(Int_t signal);
     Int_t GetReference(Int_t signal);
-    Int_t GetMultiplicity(Int_t signal);
+    ESignalType GetSignalType(Int_t signal);
+    Int_t GetNSignals();
 
-    Bool_t HasMulti(Int_t signal);
     Bool_t HasReference(Int_t signal);
 
+    THcRawAdcHit& GetRawAdcHit();
+    THcRawTdcHit& GetRawTdcHit();
 
   protected:
-    static const UInt_t fMaxNPulsesAdc = 4;
-    static const UInt_t fMaxNSamplesAdc = 511;
-    static const UInt_t fMaxNHitsTdc = 16;
-    static const UInt_t fNPlanes = 2;
-
-    Int_t fAdc[fMaxNPulsesAdc];
-    Int_t fAdcTime[fMaxNPulsesAdc];
-    Int_t fAdcPedestal[fMaxNPulsesAdc];
-    Int_t fAdcPulse[fMaxNPulsesAdc];
-
-    Int_t fAdcSamples[fMaxNSamplesAdc];
-
-    Int_t fTdc[fMaxNHitsTdc];
-
-    Int_t fReferenceTime[fNPlanes];
-    Bool_t fHasReference[fNPlanes];
-    Bool_t fHasMulti[fNPlanes];
-    UInt_t fNRawHits[fNPlanes];
+    static const Int_t fNAdcSignals = 1;
+    static const Int_t fNTdcSignals = 1;
 
-    UInt_t fNRawSamples;
+    THcRawAdcHit fAdcHits[fNAdcSignals];
+    THcRawTdcHit fTdcHits[fNTdcSignals];
 
   private:
     ClassDef(THcTrigRawHit, 0);
-- 
GitLab