diff --git a/src/THcShowerPlane.cxx b/src/THcShowerPlane.cxx
index 53b1c824a05403dc7728917d71be62443a861be5..0eb653f36313b884fe221652f600ea4b117fd61a 100644
--- a/src/THcShowerPlane.cxx
+++ b/src/THcShowerPlane.cxx
@@ -24,6 +24,7 @@ One plane of shower blocks with side readout
 #include <iostream>
 
 #include <fstream>
+
 using namespace std;
 
 ClassImp(THcShowerPlane)
@@ -41,6 +42,7 @@ THcShowerPlane::THcShowerPlane( const char* name,
 
   frPosAdcErrorFlag = new TClonesArray("THcSignalHit", 16);
   frPosAdcPedRaw = new TClonesArray("THcSignalHit", 16);
+  frPosAdcThreshold = new TClonesArray("THcSignalHit", 16);
   frPosAdcPulseIntRaw = new TClonesArray("THcSignalHit", 16);
   frPosAdcPulseAmpRaw = new TClonesArray("THcSignalHit", 16);
   frPosAdcPulseTimeRaw = new TClonesArray("THcSignalHit", 16);
@@ -51,6 +53,7 @@ THcShowerPlane::THcShowerPlane( const char* name,
 
   frNegAdcErrorFlag = new TClonesArray("THcSignalHit", 16);
   frNegAdcPedRaw = new TClonesArray("THcSignalHit", 16);
+  frNegAdcThreshold = new TClonesArray("THcSignalHit", 16);
   frNegAdcPulseIntRaw = new TClonesArray("THcSignalHit", 16);
   frNegAdcPulseAmpRaw = new TClonesArray("THcSignalHit", 16);
   frNegAdcPulseTimeRaw = new TClonesArray("THcSignalHit", 16);
@@ -71,37 +74,52 @@ THcShowerPlane::THcShowerPlane( const char* name,
 THcShowerPlane::~THcShowerPlane()
 {
   // Destructor
-  delete fPosADCHits;
-  delete fNegADCHits;
-
-  frPosAdcErrorFlag = NULL;
-  frPosAdcPedRaw = NULL;
-  frPosAdcPulseIntRaw = NULL;
-  frPosAdcPulseAmpRaw = NULL;
-  frPosAdcPulseTimeRaw = NULL;
-
-  frPosAdcPed = NULL;
-  frPosAdcPulseInt = NULL;
-  frPosAdcPulseAmp = NULL;
-
-  frNegAdcErrorFlag = NULL;
-  frNegAdcPedRaw = NULL;
-  frNegAdcPulseIntRaw = NULL;
-  frNegAdcPulseAmpRaw = NULL;
-  frNegAdcPulseTimeRaw = NULL;
-
-  frNegAdcPed = NULL;
-  frNegAdcPulseInt = NULL;
-  frNegAdcPulseAmp = NULL;
-
-  delete [] fA_Pos;
-  delete [] fA_Neg;
-  delete [] fA_Pos_p;
-  delete [] fA_Neg_p;
-
-  delete [] fEpos;
-  delete [] fEneg;
-  delete [] fEmean;
+  delete fPosADCHits; fPosADCHits = NULL;
+  delete fNegADCHits; fNegADCHits = NULL;
+
+  delete  frPosAdcErrorFlag; frPosAdcErrorFlag = NULL;
+  delete  frPosAdcPedRaw; frPosAdcPedRaw = NULL;
+  delete  frPosAdcThreshold; frPosAdcThreshold = NULL;
+  delete  frPosAdcPulseIntRaw; frPosAdcPulseIntRaw = NULL;
+  delete  frPosAdcPulseAmpRaw; frPosAdcPulseAmpRaw = NULL;
+  delete  frPosAdcPulseTimeRaw; frPosAdcPulseTimeRaw = NULL;
+  
+  delete  frPosAdcPed; frPosAdcPed = NULL;
+  delete  frPosAdcPulseInt; frPosAdcPulseInt = NULL;
+  delete  frPosAdcPulseAmp; frPosAdcPulseAmp = NULL;
+  
+  delete  frNegAdcErrorFlag; frNegAdcErrorFlag = NULL;
+  delete  frNegAdcPedRaw; frNegAdcPedRaw = NULL;
+  delete  frNegAdcThreshold; frNegAdcThreshold = NULL;
+  delete  frNegAdcPulseIntRaw; frNegAdcPulseIntRaw = NULL;
+  delete  frNegAdcPulseAmpRaw; frNegAdcPulseAmpRaw = NULL;
+  delete  frNegAdcPulseTimeRaw; frNegAdcPulseTimeRaw = NULL;
+  
+  delete  frNegAdcPed; frNegAdcPed = NULL;
+  delete  frNegAdcPulseInt; frNegAdcPulseInt = NULL;
+  delete  frNegAdcPulseAmp; frNegAdcPulseAmp = NULL;
+
+  delete [] fPosPedSum;
+  delete [] fPosPedSum2;
+  delete [] fPosPedLimit;
+  delete [] fPosPedCount;
+
+  delete [] fNegPedSum;
+  delete [] fNegPedSum2;
+  delete [] fNegPedLimit;
+  delete [] fNegPedCount;  
+   
+  delete [] fPosPed;
+  delete [] fPosSig;
+  delete [] fPosThresh;
+
+  delete [] fNegPed;
+  delete [] fNegSig;
+  delete [] fNegThresh;  
+
+//  delete [] fEpos;
+  // delete [] fEneg;
+  // delete [] fEmean;
 }
 
 //_____________________________________________________________________________
@@ -147,8 +165,12 @@ Int_t THcShowerPlane::ReadDatabase( const TDatime& date )
     {"cal_ped_sample_high", &fPedSampHigh, kInt, 0, 1},
     {"cal_data_sample_low", &fDataSampLow, kInt, 0, 1},
     {"cal_data_sample_high", &fDataSampHigh, kInt, 0, 1},
+    {"cal_debug_adc", &fDebugAdc, kInt, 0, 1},
     {0}
   };
+
+    fDebugAdc   = 0; // Set ADC debug parameter to false unless set in parameter file
+
   gHcParms->LoadParmValues((DBRequest*)&list, prefix);
 
   // Retrieve more parameters we need from parent class
@@ -196,18 +218,30 @@ Int_t THcShowerPlane::ReadDatabase( const TDatime& date )
 
   InitializePedestals();
 
-  // ADC amplitudes per channel.
+  fNumGoodPosAdcHits          = vector<Int_t>    (fNelem, 0.0);
+  fNumGoodNegAdcHits          = vector<Int_t>    (fNelem, 0.0);
+
+  fGoodPosAdcPulseIntRaw      = vector<Double_t> (fNelem, 0.0);
+  fGoodNegAdcPulseIntRaw      = vector<Double_t> (fNelem, 0.0);
 
-  fA_Pos = new Double_t[fNelem];
-  fA_Neg = new Double_t[fNelem];
-  fA_Pos_p = new Double_t[fNelem];
-  fA_Neg_p = new Double_t[fNelem];
+  fGoodPosAdcPed              = vector<Double_t> (fNelem, 0.0);
+  fGoodPosAdcPulseInt         = vector<Double_t> (fNelem, 0.0);
+  fGoodPosAdcPulseAmp         = vector<Double_t> (fNelem, 0.0);
+  fGoodPosAdcPulseTime        = 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);
 
   // Energy depositions per block (not corrected for track coordinate)
 
-  fEpos = new Double_t[fNelem];
-  fEneg = new Double_t[fNelem];
-  fEmean= new Double_t[fNelem];
+  fEpos                       = vector<Double_t> (fNelem, 0.0);
+  fEneg                       = vector<Double_t> (fNelem, 0.0);
+  fEmean                      = vector<Double_t> (fNelem, 0.0);  
+  //  fEpos = new Double_t[fNelem];
+  // fEneg = new Double_t[fNelem];
+  // fEmean= new Double_t[fNelem];
 
   // Debug output.
 
@@ -245,58 +279,83 @@ Int_t THcShowerPlane::DefineVariables( EMode mode )
   fIsSetup = ( mode == kDefine );
 
   // Register variables in global list
-  RVarDef vars[] = {
-    {"posadchits", "List of Positive ADC hits","fPosADCHits.THcSignalHit.GetPaddleNumber()"},
-    {"negadchits", "List of Negative ADC hits","fNegADCHits.THcSignalHit.GetPaddleNumber()"},
-    {"apos",       "Raw Positive ADC Amplitudes",                   "fA_Pos"},
-    {"aneg",       "Raw Negative ADC Amplitudes",                   "fA_Neg"},
-    {"apos_p",     "Ped-subtracted Positive ADC Amplitudes",        "fA_Pos_p"},
-    {"aneg_p",     "Ped-subtracted Negative ADC Amplitudes",        "fA_Neg_p"},
-    {"epos",       "Energy Depositions from Positive Side PMTs",    "fEpos"},
-    {"eneg",       "Energy Depositions from Negative Side PMTs",    "fEneg"},
-    {"emean",      "Mean Energy Depositions",                       "fEmean"},
-    {"eplane",     "Energy Deposition per plane",                   "fEplane"},
-    {"eplane_pos", "Energy Deposition per plane from pos. PMTs","fEplane_pos"},
-    {"eplane_neg", "Energy Deposition per plane from neg. PMTs","fEplane_neg"},
-
-    {"posAdcCounter",      "List of positive ADC counter numbers.",      "frPosAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"},
-    {"negAdcCounter",      "List of negative ADC counter numbers.",      "frNegAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"},
-
-    {"posAdcErrorFlag",       "List of positive raw ADC Error Flags",         "frPosAdcErrorFlag.THcSignalHit.GetData()"},
-    {"posAdcPedRaw",       "List of positive raw ADC pedestals",         "frPosAdcPedRaw.THcSignalHit.GetData()"},
-    {"posAdcPulseIntRaw",  "List of positive raw ADC pulse integrals.",  "frPosAdcPulseIntRaw.THcSignalHit.GetData()"},
-    {"posAdcPulseAmpRaw",  "List of positive raw ADC pulse amplitudes.", "frPosAdcPulseAmpRaw.THcSignalHit.GetData()"},
-    {"posAdcPulseTimeRaw", "List of positive raw ADC pulse times.",      "frPosAdcPulseTimeRaw.THcSignalHit.GetData()"},
-
-    {"posAdcPed",          "List of positive ADC pedestals",             "frPosAdcPed.THcSignalHit.GetData()"},
-    {"posAdcPulseInt",     "List of positive ADC pulse integrals.",      "frPosAdcPulseInt.THcSignalHit.GetData()"},
-    {"posAdcPulseAmp",     "List of positive ADC pulse amplitudes.",     "frPosAdcPulseAmp.THcSignalHit.GetData()"},
-
-    {"negAdcErrorFlag",       "List of negative raw ADC Error Flag ",         "frNegAdcErrorFlag.THcSignalHit.GetData()"},
-    {"negAdcPedRaw",       "List of negative raw ADC pedestals",         "frNegAdcPedRaw.THcSignalHit.GetData()"},
-    {"negAdcPulseIntRaw",  "List of negative raw ADC pulse integrals.",  "frNegAdcPulseIntRaw.THcSignalHit.GetData()"},
-    {"negAdcPulseAmpRaw",  "List of negative raw ADC pulse amplitudes.", "frNegAdcPulseAmpRaw.THcSignalHit.GetData()"},
-    {"negAdcPulseTimeRaw", "List of negative raw ADC pulse times.",      "frNegAdcPulseTimeRaw.THcSignalHit.GetData()"},
-
-    {"negAdcPed",          "List of negative ADC pedestals",             "frNegAdcPed.THcSignalHit.GetData()"},
-    {"negAdcPulseInt",     "List of negative ADC pulse integrals.",      "frNegAdcPulseInt.THcSignalHit.GetData()"},
-    {"negAdcPulseAmp",     "List of negative ADC pulse amplitudes.",     "frNegAdcPulseAmp.THcSignalHit.GetData()"},
-
-    { 0 }
-  };
-
-  return DefineVarsFromList( vars, mode );
+  vector<RVarDef> vars;
+
+  vars.push_back(RVarDef{"posAdcErrorFlag",       "List of positive raw ADC Error Flags",         "frPosAdcErrorFlag.THcSignalHit.GetData()"});
+  vars.push_back(RVarDef{"negAdcErrorFlag",       "List of negative raw ADC Error Flags ",        "frNegAdcErrorFlag.THcSignalHit.GetData()"});
+
+  vars.push_back(RVarDef{"posAdcCounter",      "List of positive ADC counter numbers.",      "frPosAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"}); //PreSh+ raw occupancy
+  vars.push_back(RVarDef{"negAdcCounter",      "List of negative ADC counter numbers.",      "frNegAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"}); //PreSh- raw occupancy
+
+  vars.push_back(RVarDef{"totNumPosAdcHits", "Total Number of Positive ADC Hits",   "fTotNumPosAdcHits"}); // PreSh+ raw multiplicity
+  vars.push_back(RVarDef{"totNumNegAdcHits", "Total Number of Negative ADC Hits",   "fTotNumNegAdcHits"}); // PreSh+ raw multiplicity
+  vars.push_back(RVarDef{"totnumAdcHits",   "Total Number of ADC Hits Per PMT",      "fTotNumAdcHits"});    // PreSh raw multiplicity
+  
+  vars.push_back(RVarDef{"numGoodPosAdcHits",    "Number of Good Positive ADC Hits Per PMT", "fNumGoodPosAdcHits"});    // PreSh occupancy
+  vars.push_back(RVarDef{"numGoodNegAdcHits",    "Number of Good Negative ADC Hits Per PMT", "fNumGoodNegAdcHits"});    // PreSh occupancy
+  vars.push_back(RVarDef{"totNumGoodPosAdcHits", "Total Number of Good Positive ADC Hits",   "fTotNumGoodPosAdcHits"}); // PreSh multiplicity
+  vars.push_back(RVarDef{"totNumGoodNegAdcHits", "Total Number of Good Negative ADC Hits",   "fTotNumGoodNegAdcHits"}); // PreSh multiplicity
+  vars.push_back(RVarDef{"totnumGoodAdcHits",   "TotalNumber of Good ADC Hits Per PMT",      "fTotNumGoodAdcHits"});    // PreSh multiplicity
+
+  vars.push_back(RVarDef{"goodPosAdcPulseIntRaw",       "Good Positive Raw ADC Pulse Integrals",                   "fGoodPosAdcPulseIntRaw"});
+  vars.push_back(RVarDef{"goodNegAdcPulseIntRaw",       "Good Negative Raw ADC Pulse Integrals",                   "fGoodNegAdcPulseIntRaw"});
+
+  vars.push_back(RVarDef{"goodPosAdcPed",         "Good Positive ADC pedestals",           "fGoodPosAdcPed"});
+  vars.push_back(RVarDef{"goodPosAdcPulseInt",         "Good Positive ADC integrals",           "fGoodPosAdcPulseInt"});
+  vars.push_back(RVarDef{"goodPosAdcPulseAmp",         "Good Positive ADC amplitudes",           "fGoodPosAdcPulseAmp"});
+  vars.push_back(RVarDef{"goodPosAdcPulseTime",         "Good Positive ADC times",           "fGoodPosAdcPulseTime"});  
+  
+  vars.push_back(RVarDef{"goodNegAdcPed",         "Good Negative ADC pedestals",           "fGoodNegAdcPed"});
+  vars.push_back(RVarDef{"goodNegAdcPulseInt",         "Good Negative ADC integrals",           "fGoodNegAdcPulseInt"});
+  vars.push_back(RVarDef{"goodNegAdcPulseAmp",         "Good Negative ADC amplitudes",           "fGoodNegAdcPulseAmp"});
+  vars.push_back(RVarDef{"goodNegAdcPulseTime",         "Good Negative ADC times",           "fGoodNegAdcPulseTime"});  
+  
+  vars.push_back(RVarDef{"epos",       "Energy Depositions from Positive Side PMTs",    "fEpos"});
+  vars.push_back(RVarDef{"eneg",       "Energy Depositions from Negative Side PMTs",    "fEneg"});
+  vars.push_back(RVarDef{"emean",      "Mean Energy Depositions",                       "fEmean"});
+  vars.push_back(RVarDef{"eplane",     "Energy Deposition per plane",                   "fEplane"});
+  vars.push_back(RVarDef{"eplane_pos", "Energy Deposition per plane from pos. PMTs","fEplane_pos"});
+  vars.push_back(RVarDef{"eplane_neg", "Energy Deposition per plane from neg. PMTs","fEplane_neg"});
+  
+
+  if (fDebugAdc) {  
+  vars.push_back(RVarDef{"posAdcPedRaw",       "List of positive raw ADC pedestals",         "frPosAdcPedRaw.THcSignalHit.GetData()"});
+  vars.push_back(RVarDef{"posAdcPulseIntRaw",  "List of positive raw ADC pulse integrals.",  "frPosAdcPulseIntRaw.THcSignalHit.GetData()"});
+  vars.push_back(RVarDef{"posAdcPulseAmpRaw",  "List of positive raw ADC pulse amplitudes.", "frPosAdcPulseAmpRaw.THcSignalHit.GetData()"});
+  vars.push_back(RVarDef{"posAdcPulseTimeRaw", "List of positive raw ADC pulse times.",      "frPosAdcPulseTimeRaw.THcSignalHit.GetData()"});
+
+  vars.push_back(RVarDef{"posAdcPed",          "List of positive ADC pedestals",             "frPosAdcPed.THcSignalHit.GetData()"});
+  vars.push_back(RVarDef{"posAdcPulseInt",     "List of positive ADC pulse integrals.",      "frPosAdcPulseInt.THcSignalHit.GetData()"});
+  vars.push_back(RVarDef{"posAdcPulseAmp",     "List of positive ADC pulse amplitudes.",     "frPosAdcPulseAmp.THcSignalHit.GetData()"});
+  
+  vars.push_back(RVarDef{"negAdcPedRaw",       "List of negative raw ADC pedestals",         "frNegAdcPedRaw.THcSignalHit.GetData()"});
+  vars.push_back(RVarDef{"negAdcPulseIntRaw",  "List of negative raw ADC pulse integrals.",  "frNegAdcPulseIntRaw.THcSignalHit.GetData()"});
+  vars.push_back(RVarDef{"negAdcPulseAmpRaw",  "List of negative raw ADC pulse amplitudes.", "frNegAdcPulseAmpRaw.THcSignalHit.GetData()"});
+  vars.push_back(RVarDef{"negAdcPulseTimeRaw", "List of negative raw ADC pulse times.",      "frNegAdcPulseTimeRaw.THcSignalHit.GetData()"});
+
+  vars.push_back(RVarDef{"negAdcPed",          "List of negative ADC pedestals",             "frNegAdcPed.THcSignalHit.GetData()"});
+  vars.push_back(RVarDef{"negAdcPulseInt",     "List of negative ADC pulse integrals.",      "frNegAdcPulseInt.THcSignalHit.GetData()"});
+  vars.push_back(RVarDef{"negAdcPulseAmp",     "List of negative ADC pulse amplitudes.",     "frNegAdcPulseAmp.THcSignalHit.GetData()"});
+    
+   }
+
+  RVarDef end {0};
+  vars.push_back(end);
+
+  return DefineVarsFromList(vars.data(), mode);
 }
 
 //_____________________________________________________________________________
 void THcShowerPlane::Clear( Option_t* )
 {
   // Clears the hit lists
+ 
   fPosADCHits->Clear();
   fNegADCHits->Clear();
 
   frPosAdcErrorFlag->Clear();
   frPosAdcPedRaw->Clear();
+  frPosAdcThreshold->Clear();
   frPosAdcPulseIntRaw->Clear();
   frPosAdcPulseAmpRaw->Clear();
   frPosAdcPulseTimeRaw->Clear();
@@ -307,6 +366,7 @@ void THcShowerPlane::Clear( Option_t* )
 
   frNegAdcErrorFlag->Clear();
   frNegAdcPedRaw->Clear();
+  frNegAdcThreshold->Clear();
   frNegAdcPulseIntRaw->Clear();
   frNegAdcPulseAmpRaw->Clear();
   frNegAdcPulseTimeRaw->Clear();
@@ -315,7 +375,40 @@ void THcShowerPlane::Clear( Option_t* )
   frNegAdcPulseInt->Clear();
   frNegAdcPulseAmp->Clear();
 
-  // Debug output.
+ for (UInt_t ielem = 0; ielem < fGoodPosAdcPed.size(); ielem++) {
+   fGoodPosAdcPed.at(ielem)              = 0.0;
+   fGoodPosAdcPulseIntRaw.at(ielem)      = 0.0;   
+   fGoodPosAdcPulseInt.at(ielem)         = 0.0;
+   fGoodPosAdcPulseAmp.at(ielem)         = 0.0;
+   fGoodPosAdcPulseTime.at(ielem)        = 0.0;
+   fEpos.at(ielem)                       = 0.0;
+   fNumGoodPosAdcHits.at(ielem)          = 0.0;
+ }
+ 
+ for (UInt_t ielem = 0; ielem < fGoodNegAdcPed.size(); ielem++) {
+   fGoodNegAdcPed.at(ielem)              = 0.0;
+   fGoodNegAdcPulseIntRaw.at(ielem)      = 0.0;   
+   fGoodNegAdcPulseInt.at(ielem)         = 0.0;
+   fGoodNegAdcPulseAmp.at(ielem)         = 0.0;
+   fGoodNegAdcPulseTime.at(ielem)        = 0.0;
+   fEneg.at(ielem)                       = 0.0;
+   fNumGoodNegAdcHits.at(ielem)          = 0.0;
+ }
+
+ for (UInt_t ielem = 0; ielem < fEmean.size(); ielem++) {
+   fEmean.at(ielem)                                = 0.0;
+ }
+ 
+ fTotNumAdcHits       = 0;
+ fTotNumPosAdcHits    = 0;
+ fTotNumNegAdcHits    = 0; 
+ 
+ fTotNumGoodAdcHits       = 0;
+ fTotNumGoodPosAdcHits    = 0;
+ fTotNumGoodNegAdcHits    = 0; 
+
+
+ // Debug output.
   if ( ((THcShower*) GetParent())->fdbg_decoded_cal ) {
     cout << "---------------------------------------------------------------\n";
     cout << "Debug output from THcShowerPlane::Clear for "
@@ -374,6 +467,7 @@ Int_t THcShowerPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
 
   frPosAdcErrorFlag->Clear();
   frPosAdcPedRaw->Clear();
+  frPosAdcThreshold->Clear();
   frPosAdcPulseIntRaw->Clear();
   frPosAdcPulseAmpRaw->Clear();
   frPosAdcPulseTimeRaw->Clear();
@@ -384,6 +478,7 @@ Int_t THcShowerPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
 
   frNegAdcErrorFlag->Clear();
   frNegAdcPedRaw->Clear();
+  frNegAdcThreshold->Clear();
   frNegAdcPulseIntRaw->Clear();
   frNegAdcPulseAmpRaw->Clear();
   frNegAdcPulseTimeRaw->Clear();
@@ -392,15 +487,14 @@ Int_t THcShowerPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
   frNegAdcPulseInt->Clear();
   frNegAdcPulseAmp->Clear();
 
-  for(Int_t i=0;i<fNelem;i++) {
-    fA_Pos[i] = 0;
-    fA_Neg[i] = 0;
-    fA_Pos_p[i] = 0;
-    fA_Neg_p[i] = 0;
+  /*
+    for(Int_t i=0;i<fNelem;i++) {
+
     fEpos[i] = 0;
     fEneg[i] = 0;
     fEmean[i] = 0;
   }
+  */
 
   fEplane = 0;
   fEplane_pos = 0;
@@ -430,8 +524,7 @@ Int_t THcShowerPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
     THcRawAdcHit& rawPosAdcHit = hit->GetRawAdcHitPos();
     for (UInt_t thit=0; thit<rawPosAdcHit.GetNPulses(); ++thit) {
       ((THcSignalHit*) frPosAdcPedRaw->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.GetPedRaw());
-       fPosThresh[hit->fCounter -1]=rawPosAdcHit.GetPedRaw()*rawPosAdcHit.GetF250_PeakPedestalRatio()+fAdcPosThreshold;
-       
+      ((THcSignalHit*) frPosAdcThreshold->ConstructedAt(nrPosAdcHits))->Set(padnum,rawPosAdcHit.GetPedRaw()*rawPosAdcHit.GetF250_PeakPedestalRatio()+fAdcPosThreshold);
       ((THcSignalHit*) frPosAdcPed->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.GetPed());
 
       ((THcSignalHit*) frPosAdcPulseIntRaw->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.GetPulseIntRaw(thit));
@@ -447,11 +540,14 @@ Int_t THcShowerPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
 	((THcSignalHit*) frPosAdcErrorFlag->ConstructedAt(nrPosAdcHits))->Set(padnum,1);        
       }
       ++nrPosAdcHits;
+      fTotNumAdcHits++;
+      fTotNumPosAdcHits++;
+     
     }
     THcRawAdcHit& rawNegAdcHit = hit->GetRawAdcHitNeg();
     for (UInt_t thit=0; thit<rawNegAdcHit.GetNPulses(); ++thit) {
       ((THcSignalHit*) frNegAdcPedRaw->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.GetPedRaw());
-       fNegThresh[hit->fCounter -1]=rawNegAdcHit.GetPedRaw()*rawNegAdcHit.GetF250_PeakPedestalRatio()+fAdcNegThreshold;
+      ((THcSignalHit*) frNegAdcThreshold->ConstructedAt(nrNegAdcHits))->Set(padnum,rawNegAdcHit.GetPedRaw()*rawNegAdcHit.GetF250_PeakPedestalRatio()+fAdcNegThreshold);
       ((THcSignalHit*) frNegAdcPed->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.GetPed());
 
       ((THcSignalHit*) frNegAdcPulseIntRaw->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.GetPulseIntRaw(thit));
@@ -467,12 +563,13 @@ Int_t THcShowerPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
 	((THcSignalHit*) frNegAdcErrorFlag->ConstructedAt(nrNegAdcHits))->Set(padnum,1);
       }
       ++nrNegAdcHits;
+      fTotNumAdcHits++;
+      fTotNumNegAdcHits++;
+      
+    
     }
-
     ihit++;
   }
-
-
   return(ihit);
 }
 //_____________________________________________________________________________
@@ -552,23 +649,23 @@ void THcShowerPlane::FillADC_Standard()
   for (Int_t ielem=0;ielem<frNegAdcPulseIntRaw->GetEntries();ielem++) {
     Int_t npad = ((THcSignalHit*) frNegAdcPulseIntRaw->ConstructedAt(ielem))->GetPaddleNumber() - 1;
     Double_t pulseIntRaw = ((THcSignalHit*) frNegAdcPulseIntRaw->ConstructedAt(ielem))->GetData();
-      fA_Neg[npad] =pulseIntRaw;
-      if(fA_Neg[npad] >  fNegThresh[npad]) {
-       fA_Neg_p[npad] = pulseIntRaw-fNegPed[npad];
-       fEneg[npad] = fA_Neg_p[npad]*fParent->GetGain(npad,fLayerNum-1,1);
-       fEmean[npad] += fEneg[npad];
-       fEplane_neg += fEneg[npad];
+    fGoodNegAdcPulseIntRaw.at(npad) = pulseIntRaw;
+      if(fGoodNegAdcPulseIntRaw.at(npad) >  fNegThresh[npad]) {
+	fGoodNegAdcPulseInt.at(npad) = pulseIntRaw-fNegPed[npad];
+	fEneg.at(npad) = fGoodNegAdcPulseInt.at(npad)*fParent->GetGain(npad,fLayerNum-1,1);
+	fEmean.at(npad) += fEneg.at(npad);
+	fEplane_neg += fEneg.at(npad);
       }
   }
   for (Int_t ielem=0;ielem<frPosAdcPulseIntRaw->GetEntries();ielem++) {
     Int_t npad = ((THcSignalHit*) frPosAdcPulseIntRaw->ConstructedAt(ielem))->GetPaddleNumber() - 1;
     Double_t pulseIntRaw = ((THcSignalHit*) frPosAdcPulseIntRaw->ConstructedAt(ielem))->GetData();
-      fA_Pos[npad] =pulseIntRaw;
-      if(fA_Pos[npad] > fPosThresh[npad]) {
-       fA_Pos_p[npad] =pulseIntRaw-fPosPed[npad] ;
-       fEpos[npad] = fA_Pos_p[npad]*fParent->GetGain(npad,fLayerNum-1,0);
-       fEmean[npad] += fEpos[npad];
-       fEplane_pos += fEpos[npad];
+    fGoodPosAdcPulseIntRaw.at(npad) =pulseIntRaw;
+    if(fGoodPosAdcPulseIntRaw.at(npad) > fPosThresh[npad]) {
+      fGoodPosAdcPulseInt.at(npad) =pulseIntRaw-fPosPed[npad] ;
+      fEpos.at(npad) =fGoodPosAdcPulseInt.at(npad)*fParent->GetGain(npad,fLayerNum-1,0);
+      fEmean.at(npad) += fEpos.at(npad);
+      fEplane_pos += fEpos.at(npad);
       }
   }
     fEplane= fEplane_neg+fEplane_pos;
@@ -581,40 +678,68 @@ void THcShowerPlane::FillADC_DynamicPedestal()
   Double_t AdcTimeWindowMin=fParent->GetAdcTimeWindowMin();
   Double_t AdcTimeWindowMax=fParent->GetAdcTimeWindowMax();
   for (Int_t ielem=0;ielem<frNegAdcPulseInt->GetEntries();ielem++) {
-    Int_t npad = ((THcSignalHit*) frNegAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1;
-    Double_t pulseInt = ((THcSignalHit*) frNegAdcPulseInt->ConstructedAt(ielem))->GetData();
-    Double_t pulseIntRaw = ((THcSignalHit*) frNegAdcPulseIntRaw->ConstructedAt(ielem))->GetData();
-    Double_t pulseTime = ((THcSignalHit*) frNegAdcPulseTimeRaw->ConstructedAt(ielem))->GetData();
-    Double_t errorflag = ((THcSignalHit*) frNegAdcErrorFlag->ConstructedAt(ielem))->GetData();
-    Bool_t pulseTimeCut = (pulseTime > AdcTimeWindowMin) &&  (pulseTime < AdcTimeWindowMax);
-    if (errorflag==0 && pulseTimeCut) {
-      fA_Neg[npad] =pulseIntRaw;
-      if(fA_Neg[npad] >  fNegThresh[npad]) {
-       fA_Neg_p[npad] =pulseInt ;
-       fEneg[npad] = fA_Neg_p[npad]*fParent->GetGain(npad,fLayerNum-1,1);
-       fEmean[npad] += fEneg[npad];
-       fEplane_neg += fEneg[npad];
+    Int_t    npad         = ((THcSignalHit*) frNegAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1;
+    Double_t pulseInt     = ((THcSignalHit*) frNegAdcPulseInt->ConstructedAt(ielem))->GetData();
+    Double_t pulsePed     = ((THcSignalHit*) frNegAdcPed->ConstructedAt(ielem))->GetData(); 
+    Double_t pulseAmp     = ((THcSignalHit*) frNegAdcPulseAmp->ConstructedAt(ielem))->GetData(); 
+    Double_t pulseIntRaw  = ((THcSignalHit*) frNegAdcPulseIntRaw->ConstructedAt(ielem))->GetData();
+    Double_t pulseTime    = ((THcSignalHit*) frNegAdcPulseTimeRaw->ConstructedAt(ielem))->GetData();
+    Double_t threshold    = ((THcSignalHit*) frNegAdcThreshold->ConstructedAt(ielem))->GetData();
+    Bool_t   errorflag    = ((THcSignalHit*) frNegAdcErrorFlag->ConstructedAt(ielem))->GetData();
+    Bool_t   pulseTimeCut = (pulseTime > AdcTimeWindowMin) &&  (pulseTime < AdcTimeWindowMax);
+    if (!errorflag && pulseTimeCut) {
+      fGoodNegAdcPulseIntRaw.at(npad) =pulseIntRaw;
+                 
+      if(fGoodNegAdcPulseIntRaw.at(npad) >  threshold && fGoodNegAdcPulseInt.at(npad)==0) {
+        fGoodNegAdcPulseInt.at(npad) =pulseInt ;
+	fEneg.at(npad) =  fGoodNegAdcPulseInt.at(npad)*fParent->GetGain(npad,fLayerNum-1,1);
+	fEmean.at(npad) += fEneg.at(npad);
+	fEplane_neg += fEneg.at(npad);
+
+      fGoodNegAdcPed.at(npad) = pulsePed; 
+      fGoodNegAdcPulseAmp.at(npad) = pulseAmp; 
+      fGoodNegAdcPulseTime.at(npad) = pulseTime; 
+
+      fTotNumGoodAdcHits++;
+      fTotNumGoodNegAdcHits++;
+      fNumGoodNegAdcHits.at(npad)++;
+
       }
-     }        
-    }
+      
+    }        
+  }
   //
   for (Int_t ielem=0;ielem<frPosAdcPulseInt->GetEntries();ielem++) {
-    Int_t npad = ((THcSignalHit*) frPosAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1;
-    Double_t pulseInt = ((THcSignalHit*) frPosAdcPulseInt->ConstructedAt(ielem))->GetData();
-    Double_t pulseIntRaw = ((THcSignalHit*) frPosAdcPulseIntRaw->ConstructedAt(ielem))->GetData();
-    Double_t pulseTime = ((THcSignalHit*) frPosAdcPulseTimeRaw->ConstructedAt(ielem))->GetData();
-    Double_t errorflag = ((THcSignalHit*) frPosAdcErrorFlag->ConstructedAt(ielem))->GetData();
-    Bool_t pulseTimeCut = pulseTime > AdcTimeWindowMin &&  pulseTime < AdcTimeWindowMax;
-    if (errorflag==0 && pulseTimeCut) {
-      fA_Pos[npad] =pulseIntRaw;
-      if(fA_Pos[npad] >  fPosThresh[npad]) {
-       fA_Pos_p[npad] =pulseInt ;
-       fEpos[npad] = fA_Pos_p[npad]*fParent->GetGain(npad,fLayerNum-1,0);
-       fEmean[npad] += fEpos[npad];
-       fEplane_pos += fEpos[npad];
-      }
-     }        
+    Int_t    npad         = ((THcSignalHit*) frPosAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1;
+    Double_t pulsePed     = ((THcSignalHit*) frPosAdcPed->ConstructedAt(ielem))->GetData(); 
+    Double_t threshold    = ((THcSignalHit*) frPosAdcThreshold->ConstructedAt(ielem))->GetData();
+    Double_t pulseAmp     = ((THcSignalHit*) frPosAdcPulseAmp->ConstructedAt(ielem))->GetData(); 
+    Double_t pulseInt     = ((THcSignalHit*) frPosAdcPulseInt->ConstructedAt(ielem))->GetData();
+    Double_t pulseIntRaw  = ((THcSignalHit*) frPosAdcPulseIntRaw->ConstructedAt(ielem))->GetData();
+    Double_t pulseTime    = ((THcSignalHit*) frPosAdcPulseTimeRaw->ConstructedAt(ielem))->GetData();
+    Bool_t   errorflag    = ((THcSignalHit*) frPosAdcErrorFlag->ConstructedAt(ielem))->GetData();
+    Bool_t   pulseTimeCut = (pulseTime > AdcTimeWindowMin) &&  (pulseTime < AdcTimeWindowMax);
+    if (!errorflag && pulseTimeCut) {
+      fGoodPosAdcPulseIntRaw.at(npad) = pulseIntRaw;
+     
+      if(fGoodPosAdcPulseIntRaw.at(npad) >  threshold && fGoodPosAdcPulseInt.at(npad)==0) {
+       
+       	fGoodPosAdcPulseInt.at(npad) =pulseInt ;
+	fEpos.at(npad) = fGoodPosAdcPulseInt.at(npad)*fParent->GetGain(npad,fLayerNum-1,0);
+	fEmean.at(npad) += fEpos[npad];
+	fEplane_pos += fEpos.at(npad);
+
+      fGoodPosAdcPed.at(npad) = pulsePed; 
+      fGoodPosAdcPulseAmp.at(npad) = pulseAmp; 
+      fGoodPosAdcPulseTime.at(npad) = pulseTime;  
+
+      fTotNumGoodAdcHits++;
+      fTotNumGoodPosAdcHits++;
+      fNumGoodPosAdcHits.at(npad)++;
+
     }
+    }        
+  }
   //
     fEplane= fEplane_neg+fEplane_pos;
 
diff --git a/src/THcShowerPlane.h b/src/THcShowerPlane.h
index 1c84d1a4cb5a48764e83dda78deea3c67731bba8..967bd3e00faa452d903644849b321869aca9f360 100644
--- a/src/THcShowerPlane.h
+++ b/src/THcShowerPlane.h
@@ -16,9 +16,11 @@
 #include "TClonesArray.h"
 
 #include <iostream>
-
+#include <vector>
 #include <fstream>
 
+using namespace std;
+
 class THaEvData;
 class THaSignalHit;
 
@@ -76,19 +78,19 @@ public:
   };
 
   Double_t GetAposP(Int_t i) {
-    return fA_Pos_p[i];
+    return fGoodPosAdcPulseInt[i];
   };
 
   Double_t GetAnegP(Int_t i) {
-    return fA_Neg_p[i];
+    return fGoodNegAdcPulseInt[i];
   };
 
   Double_t GetApos(Int_t i) {
-    return fA_Pos[i];
+    return fGoodPosAdcPulseIntRaw[i];
   };
 
   Double_t GetAneg(Int_t i) {
-    return fA_Neg[i];
+    return fGoodNegAdcPulseIntRaw[i];
   };
 
   Double_t GetPosThr(Int_t i) {
@@ -118,24 +120,50 @@ protected:
   static const Int_t kADCDynamicPedestal=1;
   static const Int_t kADCSampleIntegral=2;
   static const Int_t kADCSampIntDynPed=3;
-   Int_t fPedSampLow;		// Sample range for
+  
+  Int_t fDebugAdc;              // fADC debug flag
+  Int_t fPedSampLow;		// Sample range for
   Int_t fPedSampHigh;		// dynamic pedestal
   Int_t fDataSampLow;		// Sample range for
   Int_t fDataSampHigh;		// sample integration
   Double_t fAdcNegThreshold;		// 
   Double_t fAdcPosThreshold;		// 
 
-  Double_t*   fA_Pos;         // [fNelem] ADC amplitudes of blocks
-  Double_t*   fA_Neg;         // [fNelem] ADC amplitudes of blocks
-  Double_t*   fA_Pos_p;	      // [fNelem] pedestal subtracted ADC amplitudes
-  Double_t*   fA_Neg_p;	      // [fNelem] pedestal subtracted ADC amplitudes
-
-  Double_t* fEpos;     // [fNelem] energy depositions seen by positive PMTs
-  Double_t* fEneg;     // [fNelem] energy depositions seen by negative PMTs
-  Double_t* fEmean;    // [fNelem] mean energy depositions (pos + neg)
-  Double_t  fEplane;   // Energy deposition in the plane
+  //counting variables
+  Int_t     fTotNumPosAdcHits;
+  Int_t     fTotNumNegAdcHits;
+  Int_t     fTotNumAdcHits;
+   
+  Int_t     fTotNumGoodPosAdcHits;
+  Int_t     fTotNumGoodNegAdcHits;
+  Int_t     fTotNumGoodAdcHits;
+
+   //individual pmt data objects
+  vector<Int_t>    fNumGoodPosAdcHits;
+  vector<Int_t>    fNumGoodNegAdcHits;
+
+  vector<Double_t>      fGoodPosAdcPed;
+  vector<Double_t>      fGoodPosAdcPulseInt;
+  vector<Double_t>      fGoodPosAdcPulseAmp;
+  vector<Double_t>      fGoodPosAdcPulseTime;
+  
+  vector<Double_t>      fGoodNegAdcPed;
+  vector<Double_t>      fGoodNegAdcPulseInt;
+  vector<Double_t>      fGoodNegAdcPulseAmp;
+  vector<Double_t>      fGoodNegAdcPulseTime;
+  
+  vector<Double_t>      fGoodPosAdcPulseIntRaw;
+  vector<Double_t>      fGoodNegAdcPulseIntRaw; 
+
+
+  vector<Double_t>      fEpos;        // [fNelem] energy depositions seen by positive PMTs
+  vector<Double_t>      fEneg;        // [fNelem] energy depositions seen by negative PMTs
+  vector<Double_t>      fEmean;        // [fNelem] mean energy depositions (pos + neg)
+
+ 
   Double_t  fEplane_pos;   // Energy deposition in the plane from positive PMTs
   Double_t  fEplane_neg;   // Energy deposition in the plane from negative PMTs
+  Double_t  fEplane;
 
   // These lists are not used actively for now.
   TClonesArray* fPosADCHits;    // List of positive ADC hits
@@ -163,6 +191,7 @@ protected:
 
   TClonesArray* frPosAdcErrorFlag;
   TClonesArray* frPosAdcPedRaw;
+  TClonesArray* frPosAdcThreshold;
   TClonesArray* frPosAdcPulseIntRaw;
   TClonesArray* frPosAdcPulseAmpRaw;
   TClonesArray* frPosAdcPulseTimeRaw;
@@ -173,6 +202,7 @@ protected:
 
   TClonesArray* frNegAdcErrorFlag;
   TClonesArray* frNegAdcPedRaw;
+  TClonesArray* frNegAdcThreshold;
   TClonesArray* frNegAdcPulseIntRaw;
   TClonesArray* frNegAdcPulseAmpRaw;
   TClonesArray* frNegAdcPulseTimeRaw;