From c8a632365cbc5854c20514ff42a71d3af9fd71e3 Mon Sep 17 00:00:00 2001
From: Jure Bericic <bericic@jlab.org>
Date: Tue, 10 Jan 2017 18:39:02 -0500
Subject: [PATCH] Added new methods to the THcRawAdcHit. Added new class
 THcRawTdcHit. RawShowerHit update.

---
 SConscript.py           |   2 +-
 src/HallC_LinkDef.h     |   1 +
 src/SConscript.py       |   2 +-
 src/THcRawAdcHit.cxx    |  52 ++++++++++++++----
 src/THcRawAdcHit.h      |  19 ++++++-
 src/THcRawShowerHit.cxx |  63 ++++++++++------------
 src/THcRawShowerHit.h   |   7 +--
 src/THcRawTdcHit.cxx    | 115 ++++++++++++++++++++++++++++++++++++++++
 src/THcRawTdcHit.h      |  38 +++++++++++++
 9 files changed, 247 insertions(+), 52 deletions(-)
 create mode 100644 src/THcRawTdcHit.cxx
 create mode 100644 src/THcRawTdcHit.h

diff --git a/SConscript.py b/SConscript.py
index 75e8fe8..d73fc0c 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 038d603..2044547 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 e786435..ee3f6a5 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 3fc88ac..93f8fdb 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 f5a2a5c..4fb94a7 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 6fd0d27..9068c16 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 832d758..04d2c9e 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 0000000..634cd4a
--- /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 0000000..7c3124f
--- /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
-- 
GitLab