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