From 465e93d1a421b7d1dce176377ef3703a1916981b Mon Sep 17 00:00:00 2001
From: hallc-online <hallconline@gmail.com>
Date: Sat, 9 Dec 2017 00:28:06 -0500
Subject: [PATCH] Modify Aerogel, Cherenkov, ShowerArray and ShowerPlane

Add variable for the difference between the Hodoscope start time
and the ADC pulse time.

Select good adc hit based on window on this difference
---
 src/THcAerogel.cxx     | 25 +++++++++++++++++++++++--
 src/THcAerogel.h       |  4 ++++
 src/THcCherenkov.cxx   | 23 ++++++++++++++++++++---
 src/THcCherenkov.h     |  3 +++
 src/THcShowerArray.cxx | 16 +++++++++++++++-
 src/THcShowerArray.h   |  3 +++
 src/THcShowerPlane.cxx | 25 ++++++++++++++++++++++---
 src/THcShowerPlane.h   |  5 +++++
 8 files changed, 95 insertions(+), 9 deletions(-)

diff --git a/src/THcAerogel.cxx b/src/THcAerogel.cxx
index 3fa912a..475873c 100644
--- a/src/THcAerogel.cxx
+++ b/src/THcAerogel.cxx
@@ -6,6 +6,7 @@
 */
 
 #include "THcAerogel.h"
+#include "THcHodoscope.h"
 #include "TClonesArray.h"
 #include "THcSignalHit.h"
 #include "THaEvData.h"
@@ -23,6 +24,7 @@
 #include "TMath.h"
 #include "THaTrackProj.h"
 #include "THcRawAdcHit.h"
+#include "THcHallCSpectrometer.h"
 
 #include <cstring>
 #include <cstdio>
@@ -190,6 +192,13 @@ THaAnalysisObject::EStatus THcAerogel::Init( const TDatime& date )
   EStatus status;
   if( (status = THaNonTrackingDetector::Init( date )) )
     return fStatus=status;
+ 
+ THcHallCSpectrometer *app=dynamic_cast<THcHallCSpectrometer*>(GetApparatus());
+   if(  !app ||
+      !(fglHod = dynamic_cast<THcHodoscope*>(app->GetDetector("hod"))) ) {
+    static const char* const here = "ReadDatabase()";
+    Warning(Here(here),"Hodoscope \"%s\" not found. ","hod");
+  }
 
   fPresentP = 0;
   THaVar* vpresent = gHaVars->Find(Form("%s.present",GetApparatus()->GetName()));
@@ -274,11 +283,13 @@ Int_t THcAerogel::ReadDatabase( const TDatime& date )
   fGoodPosAdcPulseIntRaw = vector<Double_t> (fNelem, 0.0);
   fGoodPosAdcPulseAmp    = vector<Double_t> (fNelem, 0.0);
   fGoodPosAdcPulseTime   = vector<Double_t> (fNelem, 0.0);
+  fGoodPosAdcTdcDiffTime   = vector<Double_t> (fNelem, 0.0);
   fGoodNegAdcPed         = vector<Double_t> (fNelem, 0.0);
   fGoodNegAdcPulseInt    = vector<Double_t> (fNelem, 0.0);
   fGoodNegAdcPulseIntRaw = vector<Double_t> (fNelem, 0.0);
   fGoodNegAdcPulseAmp    = vector<Double_t> (fNelem, 0.0);
   fGoodNegAdcPulseTime   = vector<Double_t> (fNelem, 0.0);
+  fGoodNegAdcTdcDiffTime   = vector<Double_t> (fNelem, 0.0);
 
   // 6 GeV variables
   fPosTDCHits = new TClonesArray("THcSignalHit", fNelem*16);
@@ -452,12 +463,14 @@ Int_t THcAerogel::DefineVariables( EMode mode )
     {"goodPosAdcPulseIntRaw", "Good Negative ADC raw pulse integrals", "fGoodPosAdcPulseIntRaw"},
     {"goodPosAdcPulseAmp",    "Good Negative ADC pulse amplitudes",    "fGoodPosAdcPulseAmp"},
     {"goodPosAdcPulseTime",   "Good Negative ADC pulse times",         "fGoodPosAdcPulseTime"},
+    {"goodPosAdcTdcDiffTime",   "Good Positive hodo Start - ADC pulse times",         "fGoodPosAdcTdcDiffTime"},
 
     {"goodNegAdcPed",         "Good Negative ADC pedestals",           "fGoodNegAdcPed"},
     {"goodNegAdcPulseInt",    "Good Negative ADC pulse integrals",     "fGoodNegAdcPulseInt"},
     {"goodNegAdcPulseIntRaw", "Good Negative ADC raw pulse integrals", "fGoodNegAdcPulseIntRaw"},
     {"goodNegAdcPulseAmp",    "Good Negative ADC pulse amplitudes",    "fGoodNegAdcPulseAmp"},
     {"goodNegAdcPulseTime",   "Good Negative ADC pulse times",         "fGoodNegAdcPulseTime"},
+    {"goodNegAdcTdcDiffTime",   "Good Negative hodo Start - ADC pulse times",         "fGoodNegAdcTdcDiffTime"},
     { 0 }
   };
 
@@ -525,6 +538,7 @@ void THcAerogel::Clear(Option_t* opt)
     fGoodPosAdcPulseIntRaw.at(ielem) = 0.0;
     fGoodPosAdcPulseAmp.at(ielem)    = 0.0;
     fGoodPosAdcPulseTime.at(ielem)   = kBig;
+    fGoodPosAdcTdcDiffTime.at(ielem)   = kBig;
     fPosNpe.at(ielem)                = 0.0;
   }
   for (UInt_t ielem = 0; ielem < fGoodNegAdcPed.size(); ielem++) {
@@ -533,6 +547,7 @@ void THcAerogel::Clear(Option_t* opt)
     fGoodNegAdcPulseIntRaw.at(ielem) = 0.0;
     fGoodNegAdcPulseAmp.at(ielem)    = 0.0;
     fGoodNegAdcPulseTime.at(ielem)   = kBig;
+    fGoodNegAdcTdcDiffTime.at(ielem)   = kBig;
     fNegNpe.at(ielem)                = 0.0;
   }
 
@@ -657,6 +672,8 @@ Int_t THcAerogel::ApplyCorrections( void )
 //_____________________________________________________________________________
 Int_t THcAerogel::CoarseProcess( TClonesArray&  ) //tracks
 {
+  Double_t StartTime = 0.0;
+  if( fglHod ) StartTime = fglHod->GetStartTime();
 
     // Loop over the elements in the TClonesArray
     for(Int_t ielem = 0; ielem < frPosAdcPulseInt->GetEntries(); ielem++) {
@@ -667,8 +684,9 @@ Int_t THcAerogel::CoarseProcess( TClonesArray&  ) //tracks
       Double_t pulseIntRaw  = ((THcSignalHit*) frPosAdcPulseIntRaw->ConstructedAt(ielem))->GetData();
       Double_t pulseAmp     = ((THcSignalHit*) frPosAdcPulseAmp->ConstructedAt(ielem))->GetData();
       Double_t pulseTime    = ((THcSignalHit*) frPosAdcPulseTime->ConstructedAt(ielem))->GetData();
+      Double_t adctdcdiffTime = StartTime-pulseTime;
       Bool_t   errorFlag    = ((THcSignalHit*) fPosAdcErrorFlag->ConstructedAt(ielem))->GetData();
-      Bool_t   pulseTimeCut = pulseTime > fAdcTimeWindowMin && pulseTime < fAdcTimeWindowMax;
+      Bool_t   pulseTimeCut = adctdcdiffTime > fAdcTimeWindowMin && adctdcdiffTime < fAdcTimeWindowMax;
 
       // By default, the last hit within the timing cut will be considered "good"
       if (!errorFlag && pulseTimeCut) {
@@ -677,6 +695,7 @@ Int_t THcAerogel::CoarseProcess( TClonesArray&  ) //tracks
     	fGoodPosAdcPulseIntRaw.at(npmt) = pulseIntRaw;
     	fGoodPosAdcPulseAmp.at(npmt)    = pulseAmp;
     	fGoodPosAdcPulseTime.at(npmt)   = pulseTime;
+    	fGoodPosAdcTdcDiffTime.at(npmt)   = adctdcdiffTime;
 
     	fPosNpe.at(npmt) = fPosGain[npmt]*fGoodPosAdcPulseInt.at(npmt);
  	fPosNpeSum += fPosNpe.at(npmt);
@@ -696,8 +715,9 @@ Int_t THcAerogel::CoarseProcess( TClonesArray&  ) //tracks
       Double_t pulseIntRaw  = ((THcSignalHit*) frNegAdcPulseIntRaw->ConstructedAt(ielem))->GetData();
       Double_t pulseAmp     = ((THcSignalHit*) frNegAdcPulseAmp->ConstructedAt(ielem))->GetData();
       Double_t pulseTime    = ((THcSignalHit*) frNegAdcPulseTime->ConstructedAt(ielem))->GetData();
+      Double_t adctdcdiffTime = StartTime-pulseTime;
       Bool_t   errorFlag    = ((THcSignalHit*) fNegAdcErrorFlag->ConstructedAt(ielem))->GetData();
-      Bool_t   pulseTimeCut = pulseTime > fAdcTimeWindowMin && pulseTime < fAdcTimeWindowMax;
+      Bool_t   pulseTimeCut = adctdcdiffTime > fAdcTimeWindowMin && adctdcdiffTime < fAdcTimeWindowMax;
 
       // By default, the last hit within the timing cut will be considered "good"
       if (!errorFlag && pulseTimeCut) {
@@ -706,6 +726,7 @@ Int_t THcAerogel::CoarseProcess( TClonesArray&  ) //tracks
     	fGoodNegAdcPulseIntRaw.at(npmt) = pulseIntRaw;
     	fGoodNegAdcPulseAmp.at(npmt)    = pulseAmp;
     	fGoodNegAdcPulseTime.at(npmt)   = pulseTime;
+    	fGoodNegAdcTdcDiffTime.at(npmt)   = adctdcdiffTime;
 
     	fNegNpe.at(npmt) = fNegGain[npmt]*fGoodNegAdcPulseInt.at(npmt);
  	fNegNpeSum += fNegNpe.at(npmt);
diff --git a/src/THcAerogel.h b/src/THcAerogel.h
index 6fb8e40..b084123 100644
--- a/src/THcAerogel.h
+++ b/src/THcAerogel.h
@@ -11,6 +11,7 @@
 #include "THaNonTrackingDetector.h"
 #include "THcHitList.h"
 #include "THcAerogelHit.h"
+class THcHodoscope;
 
 class THcAerogel : public THaNonTrackingDetector, public THcHitList {
 
@@ -113,11 +114,13 @@ class THcAerogel : public THaNonTrackingDetector, public THcHitList {
   vector<Double_t> fGoodPosAdcPulseIntRaw;
   vector<Double_t> fGoodPosAdcPulseAmp;
   vector<Double_t> fGoodPosAdcPulseTime;
+  vector<Double_t> fGoodPosAdcTdcDiffTime;
   vector<Double_t> fGoodNegAdcPed;
   vector<Double_t> fGoodNegAdcPulseInt;
   vector<Double_t> fGoodNegAdcPulseIntRaw;
   vector<Double_t> fGoodNegAdcPulseAmp;
   vector<Double_t> fGoodNegAdcPulseTime;
+ vector<Double_t> fGoodNegAdcTdcDiffTime;
 
   // 6 GeV era variables
   Int_t     fAnalyzePedestals;
@@ -166,6 +169,7 @@ class THcAerogel : public THaNonTrackingDetector, public THcHitList {
 
   void Setup(const char* name, const char* description);
   virtual void  InitializePedestals( );
+ THcHodoscope* fglHod;		// Hodoscope to get start time
 
   ClassDef(THcAerogel,0)   // Generic aerogel class
 }
diff --git a/src/THcCherenkov.cxx b/src/THcCherenkov.cxx
index 27d081d..a8e4dc6 100644
--- a/src/THcCherenkov.cxx
+++ b/src/THcCherenkov.cxx
@@ -6,6 +6,7 @@
 */
 
 #include "THcCherenkov.h"
+#include "THcHodoscope.h"
 #include "TClonesArray.h"
 #include "THcSignalHit.h"
 #include "THaEvData.h"
@@ -22,6 +23,7 @@
 #include "TClonesArray.h"
 #include "TMath.h"
 #include "THaTrackProj.h"
+#include "THcHallCSpectrometer.h"
 
 #include <algorithm>
 #include <cstring>
@@ -31,6 +33,7 @@
 #include <string>
 #include <iomanip>
 
+
 using namespace std;
 
 using std::cout;
@@ -65,6 +68,7 @@ THcCherenkov::THcCherenkov( const char* name, const char* description,
   fGoodAdcPulseIntRaw = vector<Double_t> (MaxNumCerPmt, 0.0);
   fGoodAdcPulseAmp    = vector<Double_t> (MaxNumCerPmt, 0.0);
   fGoodAdcPulseTime   = vector<Double_t> (MaxNumCerPmt, 0.0);
+  fGoodAdcTdcDiffTime   = vector<Double_t> (MaxNumCerPmt, 0.0);
 
   InitArrays();
 }
@@ -152,6 +156,13 @@ THaAnalysisObject::EStatus THcCherenkov::Init( const TDatime& date )
   if((status = THaNonTrackingDetector::Init( date )))
     return fStatus=status;
 
+  THcHallCSpectrometer *app=dynamic_cast<THcHallCSpectrometer*>(GetApparatus());
+   if(  !app ||
+      !(fglHod = dynamic_cast<THcHodoscope*>(app->GetDetector("hod"))) ) {
+    static const char* const here = "ReadDatabase()";
+    Warning(Here(here),"Hodoscope \"%s\" not found. ","hod");
+  }
+
  fPresentP = 0;
   THaVar* vpresent = gHaVars->Find(Form("%s.present",GetApparatus()->GetName()));
   if(vpresent) {
@@ -290,7 +301,8 @@ Int_t THcCherenkov::DefineVariables( EMode mode )
     {"goodAdcPulseIntRaw",  "Good ADC raw pulse integrals", "fGoodAdcPulseIntRaw"},
     {"goodAdcPulseAmp",     "Good ADC pulse amplitudes",    "fGoodAdcPulseAmp"},
     {"goodAdcPulseTime",    "Good ADC pulse times",         "fGoodAdcPulseTime"},
-    { 0 }
+     {"goodAdcTdcDiffTime",    "Good Hodo Start - ADC pulse times",         "fGoodAdcTdcDiffTime"},
+   { 0 }
   };
 
   return DefineVarsFromList(vars, mode);
@@ -336,6 +348,7 @@ void THcCherenkov::Clear(Option_t* opt)
     fGoodAdcPulseIntRaw.at(ielem) = 0.0;
     fGoodAdcPulseAmp.at(ielem)    = 0.0;
     fGoodAdcPulseTime.at(ielem)   = kBig;
+    fGoodAdcTdcDiffTime.at(ielem)   = kBig;
     fNpe.at(ielem)                = 0.0;
   }
 
@@ -406,6 +419,8 @@ Int_t THcCherenkov::ApplyCorrections( void )
 //_____________________________________________________________________________
 Int_t THcCherenkov::CoarseProcess( TClonesArray&  )
 {
+  Double_t StartTime = 0.0;
+  if( fglHod ) StartTime = fglHod->GetStartTime();
 
   // Loop over the elements in the TClonesArray
   for(Int_t ielem = 0; ielem < frAdcPulseInt->GetEntries(); ielem++) {
@@ -416,8 +431,9 @@ Int_t THcCherenkov::CoarseProcess( TClonesArray&  )
     Double_t pulseIntRaw  = ((THcSignalHit*) frAdcPulseIntRaw->ConstructedAt(ielem))->GetData();
     Double_t pulseAmp     = ((THcSignalHit*) frAdcPulseAmp->ConstructedAt(ielem))->GetData();
     Double_t pulseTime    = ((THcSignalHit*) frAdcPulseTime->ConstructedAt(ielem))->GetData();
-    Bool_t   errorFlag    = ((THcSignalHit*) fAdcErrorFlag->ConstructedAt(ielem))->GetData();
-    Bool_t   pulseTimeCut = pulseTime > fAdcTimeWindowMin && pulseTime < fAdcTimeWindowMax;
+   Double_t adctdcdiffTime = StartTime-pulseTime;
+     Bool_t   errorFlag    = ((THcSignalHit*) fAdcErrorFlag->ConstructedAt(ielem))->GetData();
+    Bool_t   pulseTimeCut = adctdcdiffTime > fAdcTimeWindowMin && adctdcdiffTime < fAdcTimeWindowMax;
 
     // By default, the last hit within the timing cut will be considered "good"
     if (!errorFlag && pulseTimeCut) {
@@ -426,6 +442,7 @@ Int_t THcCherenkov::CoarseProcess( TClonesArray&  )
       fGoodAdcPulseIntRaw.at(npmt) = pulseIntRaw;
       fGoodAdcPulseAmp.at(npmt)    = pulseAmp;
       fGoodAdcPulseTime.at(npmt)   = pulseTime;
+      fGoodAdcTdcDiffTime.at(npmt)   = adctdcdiffTime;
 
       fNpe.at(npmt) = fGain[npmt]*fGoodAdcPulseInt.at(npmt);
       fNpeSum += fNpe.at(npmt);
diff --git a/src/THcCherenkov.h b/src/THcCherenkov.h
index 0c83a6c..3ea8c93 100644
--- a/src/THcCherenkov.h
+++ b/src/THcCherenkov.h
@@ -11,6 +11,7 @@
 #include "THaNonTrackingDetector.h"
 #include "THcHitList.h"
 #include "THcCherenkovHit.h"
+class THcHodoscope;
 
 class THcCherenkov : public THaNonTrackingDetector, public THcHitList {
 
@@ -65,6 +66,7 @@ class THcCherenkov : public THaNonTrackingDetector, public THcHitList {
   vector<Double_t> fGoodAdcPulseIntRaw;
   vector<Double_t> fGoodAdcPulseAmp;
   vector<Double_t> fGoodAdcPulseTime;
+  vector<Double_t> fGoodAdcTdcDiffTime;
   vector<Double_t> fNpe;
 
   Int_t     fNRegions;
@@ -110,6 +112,7 @@ class THcCherenkov : public THaNonTrackingDetector, public THcHitList {
 
   void Setup(const char* name, const char* description);
   virtual void  InitializePedestals( );
+ THcHodoscope* fglHod;		// Hodoscope to get start time
 
   ClassDef(THcCherenkov,0)        // Generic cherenkov class
 };
diff --git a/src/THcShowerArray.cxx b/src/THcShowerArray.cxx
index aca7f40..80a69bc 100644
--- a/src/THcShowerArray.cxx
+++ b/src/THcShowerArray.cxx
@@ -6,6 +6,7 @@
 */
 
 #include "THcShowerArray.h"
+#include "THcHodoscope.h"
 #include "TClonesArray.h"
 #include "THcSignalHit.h"
 #include "THcGlobals.h"
@@ -107,6 +108,12 @@ THaAnalysisObject::EStatus THcShowerArray::Init( const TDatime& date )
   // How to get information for parent
   //  if( GetParent() )
   //    fOrigin = GetParent()->GetOrigin();
+  THcHallCSpectrometer *app=dynamic_cast<THcHallCSpectrometer*>(GetApparatus());
+   if(  !app ||
+      !(fglHod = dynamic_cast<THcHodoscope*>(app->GetDetector("hod"))) ) {
+    static const char* const here = "ReadDatabase()";
+    Warning(Here(here),"Hodoscope \"%s\" not found. ","hod");
+  }
 
   EStatus status;
   if( (status=THaSubDetector::Init( date )) )
@@ -346,6 +353,7 @@ Int_t THcShowerArray::ReadDatabase( const TDatime& date )
   fGoodAdcPulseInt         = vector<Double_t> (fNelem, 0.0);
   fGoodAdcPulseAmp         = vector<Double_t> (fNelem, 0.0);
   fGoodAdcPulseTime        = vector<Double_t> (fNelem, 0.0);
+  fGoodAdcTdcDiffTime        = vector<Double_t> (fNelem, 0.0);
 
 
   fBlock_ClusterID = new Int_t[fNelem];
@@ -431,6 +439,7 @@ Int_t THcShowerArray::DefineVariables( EMode mode )
     {"goodAdcPulseInt", "Good ADC Pulse Integrals", "fGoodAdcPulseInt"},     //this is defined as pulseInt, which is the pedestal subtracted pulse integrals, and is defined if threshold is passed
     {"goodAdcPulseAmp", "Good ADC Pulse Amplitudes", "fGoodAdcPulseAmp"},
     {"goodAdcPulseTime", "Good ADC Pulse Times", "fGoodAdcPulseTime"},     //this is defined as pulseInt, which is the pedestal subtracted pulse integrals, and is defined if threshold is passed
+    {"goodAdcTdcDiffTime", "Good Hodo Starttime - ADC Pulse Times", "fGoodAdcTdcDiffTime"},     
 
 
     {"e", "Energy Depositions per block", "fE"},       //defined as fE = fA_p*fGain = pulseInt * Gain
@@ -484,6 +493,7 @@ void THcShowerArray::Clear( Option_t* )
     fGoodAdcPulseInt.at(ielem)         = 0.0;
     fGoodAdcPulseAmp.at(ielem)         = 0.0;
     fGoodAdcPulseTime.at(ielem)        = kBig;
+    fGoodAdcTdcDiffTime.at(ielem)        = kBig;
     fNumGoodAdcHits.at(ielem)          = 0.0;
     fE.at(ielem)                       = 0.0;
   }
@@ -849,6 +859,8 @@ void THcShowerArray::FillADC_Standard()
 //_____________________________________________________________________________
 void THcShowerArray::FillADC_DynamicPedestal()
 {
+  Double_t StartTime = 0.0;
+  if( fglHod ) StartTime = fglHod->GetStartTime();
   for (Int_t ielem=0;ielem<frAdcPulseInt->GetEntries();ielem++) {
     
     Int_t npad           = ((THcSignalHit*) frAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1;
@@ -857,8 +869,9 @@ void THcShowerArray::FillADC_DynamicPedestal()
     Double_t pulseInt    = ((THcSignalHit*) frAdcPulseInt->ConstructedAt(ielem))->GetData();
     Double_t pulseAmp    = ((THcSignalHit*) frAdcPulseAmp->ConstructedAt(ielem))->GetData();
     Double_t pulseTime   = ((THcSignalHit*) frAdcPulseTime->ConstructedAt(ielem))->GetData();
+    Double_t adctdcdiffTime = StartTime-pulseTime;
     Bool_t errorflag     = ((THcSignalHit*) frAdcErrorFlag->ConstructedAt(ielem))->GetData();
-    Bool_t pulseTimeCut  = (pulseTime > fAdcTimeWindowMin) &&  (pulseTime < fAdcTimeWindowMax);
+    Bool_t pulseTimeCut  = (adctdcdiffTime > fAdcTimeWindowMin) &&  (adctdcdiffTime < fAdcTimeWindowMax);
 
     if (!errorflag && pulseTimeCut) {
       
@@ -874,6 +887,7 @@ void THcShowerArray::FillADC_DynamicPedestal()
        fGoodAdcPed.at(npad) = pulsePed;
        fGoodAdcPulseAmp.at(npad) = pulseAmp;
        fGoodAdcPulseTime.at(npad) = pulseTime;
+       fGoodAdcTdcDiffTime.at(npad) = adctdcdiffTime;
 
        fNumGoodAdcHits.at(npad) = npad + 1;
       }
diff --git a/src/THcShowerArray.h b/src/THcShowerArray.h
index 8c7033d..40edca4 100644
--- a/src/THcShowerArray.h
+++ b/src/THcShowerArray.h
@@ -27,6 +27,7 @@
 
 class THaEvData;
 class THaSignalHit;
+class THcHodoscope;
 
 class THcShowerArray : public THaSubDetector {
 
@@ -113,6 +114,7 @@ protected:
   vector<Double_t>      fGoodAdcPulseInt;       // [fNelem] good pedestal subtracted pulse integrals
   vector<Double_t>      fGoodAdcPulseAmp;
   vector<Double_t>      fGoodAdcPulseTime;
+  vector<Double_t>      fGoodAdcTdcDiffTime;
 
   vector<Double_t>      fE;                    //[fNelem] energy deposition in shower blocks
 
@@ -208,6 +210,7 @@ protected:
 
   virtual Int_t  ReadDatabase( const TDatime& date );
   virtual Int_t  DefineVariables( EMode mode = kDefine );
+ THcHodoscope* fglHod;		// Hodoscope to get start time
   ClassDef(THcShowerArray,0); // Fly;s Eye calorimeter array
 };
 
diff --git a/src/THcShowerPlane.cxx b/src/THcShowerPlane.cxx
index be73ef5..6f75b54 100644
--- a/src/THcShowerPlane.cxx
+++ b/src/THcShowerPlane.cxx
@@ -6,6 +6,7 @@ One plane of shower blocks with side readout
 */
 
 #include "THcShowerPlane.h"
+#include "THcHodoscope.h"
 #include "TClonesArray.h"
 #include "THcSignalHit.h"
 #include "THcGlobals.h"
@@ -152,6 +153,12 @@ THaAnalysisObject::EStatus THcShowerPlane::Init( const TDatime& date )
     cout << "****** THcShowerPlane::Accumulate will be skipped ******" << endl;
   }
 
+  if(  !app ||
+      !(fglHod = dynamic_cast<THcHodoscope*>(app->GetDetector("hod"))) ) {
+    static const char* const here = "ReadDatabase()";
+    Warning(Here(here),"Hodoscope \"%s\" not found. ","hod");
+  }
+
   EStatus status;
   if( (status=THaSubDetector::Init( date )) )
     return fStatus = status;
@@ -253,11 +260,13 @@ Int_t THcShowerPlane::ReadDatabase( const TDatime& date )
   fGoodPosAdcPulseInt         = vector<Double_t> (fNelem, 0.0);
   fGoodPosAdcPulseAmp         = vector<Double_t> (fNelem, 0.0);
   fGoodPosAdcPulseTime        = vector<Double_t> (fNelem, 0.0);
+  fGoodPosAdcTdcDiffTime        = vector<Double_t> (fNelem, 0.0);
 
   fGoodNegAdcPed              = vector<Double_t> (fNelem, 0.0);
   fGoodNegAdcPulseInt         = vector<Double_t> (fNelem, 0.0);
   fGoodNegAdcPulseAmp         = vector<Double_t> (fNelem, 0.0);
   fGoodNegAdcPulseTime        = vector<Double_t> (fNelem, 0.0);
+  fGoodNegAdcTdcDiffTime        = vector<Double_t> (fNelem, 0.0);
 
   // Energy depositions per block (not corrected for track coordinate)
 
@@ -375,11 +384,13 @@ Int_t THcShowerPlane::DefineVariables( EMode mode )
     {"goodPosAdcPulseInt", "Good Positive ADC integrals",           "fGoodPosAdcPulseInt"},
     {"goodPosAdcPulseAmp", "Good Positive ADC amplitudes",          "fGoodPosAdcPulseAmp"},
     {"goodPosAdcPulseTime","Good Positive ADC times",               "fGoodPosAdcPulseTime"},
+    {"goodPosAdcTdcDiffTime","Good Positive Hodo Start time-ADC times",               "fGoodPosAdcTdcDiffTime"},
 
     {"goodNegAdcPed",      "Good Negative ADC pedestals",           "fGoodNegAdcPed"},
     {"goodNegAdcPulseInt", "Good Negative ADC integrals",           "fGoodNegAdcPulseInt"},
     {"goodNegAdcPulseAmp", "Good Negative ADC amplitudes",          "fGoodNegAdcPulseAmp"},
     {"goodNegAdcPulseTime","Good Negative ADC times",               "fGoodNegAdcPulseTime"},
+   {"goodNegAdcTdcDiffTime","Good Negative Hodo Start time-ADC times",               "fGoodNegAdcTdcDiffTime"},
 
     {"epos",       "Energy Depositions from Positive Side PMTs",    "fEpos"},
     {"eneg",       "Energy Depositions from Negative Side PMTs",    "fEneg"},
@@ -431,6 +442,7 @@ void THcShowerPlane::Clear( Option_t* )
     fGoodPosAdcPulseInt.at(ielem)         = 0.0;
     fGoodPosAdcPulseAmp.at(ielem)         = 0.0;
     fGoodPosAdcPulseTime.at(ielem)        = kBig;
+    fGoodPosAdcTdcDiffTime.at(ielem)        = kBig;
     fEpos.at(ielem)                       = 0.0;
     fNumGoodPosAdcHits.at(ielem)          = 0.0;
   }
@@ -441,6 +453,7 @@ void THcShowerPlane::Clear( Option_t* )
     fGoodNegAdcPulseInt.at(ielem)         = 0.0;
     fGoodNegAdcPulseAmp.at(ielem)         = 0.0;
     fGoodNegAdcPulseTime.at(ielem)        = kBig;
+    fGoodNegAdcTdcDiffTime.at(ielem)        = kBig;
     fEneg.at(ielem)                       = 0.0;
     fNumGoodNegAdcHits.at(ielem)          = 0.0;
   }
@@ -723,6 +736,8 @@ void THcShowerPlane::FillADC_Standard()
 //_____________________________________________________________________________
 void THcShowerPlane::FillADC_DynamicPedestal()
 {
+  Double_t StartTime = 0.0;
+  if( fglHod ) StartTime = fglHod->GetStartTime();
   Double_t AdcTimeWindowMin=static_cast<THcShower*>(fParent)->GetAdcTimeWindowMin();
   Double_t AdcTimeWindowMax=static_cast<THcShower*>(fParent)->GetAdcTimeWindowMax();
   for (Int_t ielem=0;ielem<frNegAdcPulseInt->GetEntries();ielem++) {
@@ -732,9 +747,10 @@ void THcShowerPlane::FillADC_DynamicPedestal()
     Double_t pulseAmp     = ((THcSignalHit*) frNegAdcPulseAmp->ConstructedAt(ielem))->GetData();
     Double_t pulseIntRaw  = ((THcSignalHit*) frNegAdcPulseIntRaw->ConstructedAt(ielem))->GetData();
     Double_t pulseTime    = ((THcSignalHit*) frNegAdcPulseTime->ConstructedAt(ielem))->GetData();
+    Double_t adctdcdiffTime = StartTime-pulseTime;
     Double_t threshold    = ((THcSignalHit*) frNegAdcThreshold->ConstructedAt(ielem))->GetData();
     Bool_t   errorflag    = ((THcSignalHit*) frNegAdcErrorFlag->ConstructedAt(ielem))->GetData();
-    Bool_t   pulseTimeCut = (pulseTime > AdcTimeWindowMin) && (pulseTime < AdcTimeWindowMax);
+    Bool_t   pulseTimeCut = (adctdcdiffTime > AdcTimeWindowMin) && (adctdcdiffTime < AdcTimeWindowMax);
     if (!errorflag && pulseTimeCut) {
       fGoodNegAdcPulseIntRaw.at(npad) =pulseIntRaw;
 
@@ -747,6 +763,7 @@ void THcShowerPlane::FillADC_DynamicPedestal()
 	fGoodNegAdcPed.at(npad) = pulsePed;
       fGoodNegAdcPulseAmp.at(npad) = pulseAmp;
       fGoodNegAdcPulseTime.at(npad) = pulseTime;
+      fGoodNegAdcTdcDiffTime.at(npad) = adctdcdiffTime;
 
       fTotNumGoodAdcHits++;
       fTotNumGoodNegAdcHits++;
@@ -765,8 +782,9 @@ void THcShowerPlane::FillADC_DynamicPedestal()
     Double_t pulseInt     = ((THcSignalHit*) frPosAdcPulseInt->ConstructedAt(ielem))->GetData();
     Double_t pulseIntRaw  = ((THcSignalHit*) frPosAdcPulseIntRaw->ConstructedAt(ielem))->GetData();
     Double_t pulseTime    = ((THcSignalHit*) frPosAdcPulseTime->ConstructedAt(ielem))->GetData();
-    Bool_t   errorflag    = ((THcSignalHit*) frPosAdcErrorFlag->ConstructedAt(ielem))->GetData();
-    Bool_t   pulseTimeCut = (pulseTime > AdcTimeWindowMin) &&  (pulseTime < AdcTimeWindowMax);
+     Double_t adctdcdiffTime = StartTime-pulseTime;
+   Bool_t   errorflag    = ((THcSignalHit*) frPosAdcErrorFlag->ConstructedAt(ielem))->GetData();
+    Bool_t   pulseTimeCut = (adctdcdiffTime > AdcTimeWindowMin) &&  (adctdcdiffTime < AdcTimeWindowMax);
     if (!errorflag && pulseTimeCut) {
       fGoodPosAdcPulseIntRaw.at(npad) = pulseIntRaw;
 
@@ -780,6 +798,7 @@ void THcShowerPlane::FillADC_DynamicPedestal()
 	fGoodPosAdcPed.at(npad) = pulsePed;
 	fGoodPosAdcPulseAmp.at(npad) = pulseAmp;
 	fGoodPosAdcPulseTime.at(npad) = pulseTime;
+	fGoodPosAdcTdcDiffTime.at(npad) = adctdcdiffTime;
 
 	fTotNumGoodAdcHits++;
 	fTotNumGoodPosAdcHits++;
diff --git a/src/THcShowerPlane.h b/src/THcShowerPlane.h
index ef68eca..29a06e6 100644
--- a/src/THcShowerPlane.h
+++ b/src/THcShowerPlane.h
@@ -24,6 +24,7 @@ using namespace std;
 
 class THaEvData;
 class THaSignalHit;
+class THcHodoscope;
 
 class THcShowerPlane : public THaSubDetector {
 
@@ -153,11 +154,13 @@ protected:
   vector<Double_t>      fGoodPosAdcPulseInt;
   vector<Double_t>      fGoodPosAdcPulseAmp;
   vector<Double_t>      fGoodPosAdcPulseTime;
+  vector<Double_t>      fGoodPosAdcTdcDiffTime;
 
   vector<Double_t>      fGoodNegAdcPed;
   vector<Double_t>      fGoodNegAdcPulseInt;
   vector<Double_t>      fGoodNegAdcPulseAmp;
   vector<Double_t>      fGoodNegAdcPulseTime;
+ vector<Double_t>       fGoodNegAdcTdcDiffTime;
 
   vector<Double_t>      fGoodPosAdcPulseIntRaw;
   vector<Double_t>      fGoodNegAdcPulseIntRaw;
@@ -237,6 +240,8 @@ protected:
   vector<Int_t> fStatNumHit;
   Int_t fTotStatNumTrk;
   Int_t fTotStatNumHit;
+
+ THcHodoscope* fglHod;		// Hodoscope to get start time
   
   ClassDef(THcShowerPlane,0); // Calorimeter bars in a plane
 };
-- 
GitLab