diff --git a/src/THcShower.cxx b/src/THcShower.cxx
index 6c7d1204714b23d30f5402db3c0e8b91fdbd50a4..60fc502245cc358e27f4cbc122b1442e4eb0aa1a 100644
--- a/src/THcShower.cxx
+++ b/src/THcShower.cxx
@@ -209,9 +209,12 @@ Int_t THcShower::ReadDatabase( const TDatime& date )
   {
     DBRequest list[]={
       {"cal_num_neg_columns", &fNegCols, kInt, 0, 1},
-      {"cal_slop", &fSlop, kDouble},
+      {"cal_slop", &fSlop, kDouble,0,1},
       {"cal_fv_test", &fvTest, kInt,0,1},
-      {"cal_fv_delta", &fvDelta, kDouble},
+      {"cal_fv_delta", &fvDelta, kDouble,0,1},
+      {"cal_ADCMode", &fADCMode, kInt, 0, 1},
+      {"cal_AdcTimeWindowMin", &fAdcTimeWindowMin, kDouble, 0, 1},
+      {"cal_AdcTimeWindowMax", &fAdcTimeWindowMax, kDouble, 0, 1},
       {"dbg_raw_cal", &fdbg_raw_cal, kInt, 0, 1},
       {"dbg_decoded_cal", &fdbg_decoded_cal, kInt, 0, 1},
       {"dbg_sparsified_cal", &fdbg_sparsified_cal, kInt, 0, 1},
@@ -227,7 +230,9 @@ Int_t THcShower::ReadDatabase( const TDatime& date )
     fdbg_clusters_cal = 0;
     fdbg_tracks_cal = 0;
     fdbg_init_cal = 0;
-
+    fAdcTimeWindowMin=0;
+    fAdcTimeWindowMax=10000;
+    fADCMode=kADCDynamicPedestal;
     gHcParms->LoadParmValues((DBRequest*)&list, prefix);
   }
 
@@ -343,6 +348,10 @@ Int_t THcShower::ReadDatabase( const TDatime& date )
   //Pedestal limits from hcal.param.
   fShPosPedLimit = new Int_t [fNTotBlocks];
   fShNegPedLimit = new Int_t [fNTotBlocks];
+  for (UInt_t i;i<fNTotBlocks;i++) {
+    fShPosPedLimit[i]=0.;
+    fShNegPedLimit[i]=0.;
+  }
 
   //Calibration constants
   fPosGain = new Double_t [fNTotBlocks];
@@ -350,31 +359,22 @@ Int_t THcShower::ReadDatabase( const TDatime& date )
 
   //Read in parameters from hcal.param
   Double_t hcal_pos_cal_const[fNTotBlocks];
-  //  Double_t hcal_pos_gain_ini[fNTotBlocks];     not used
-  //  Double_t hcal_pos_gain_cur[fNTotBlocks];     not used
-  //  Int_t    hcal_pos_ped_limit[fNTotBlocks];    not used
   Double_t hcal_pos_gain_cor[fNTotBlocks];
 
   Double_t hcal_neg_cal_const[fNTotBlocks];
-  //  Double_t hcal_neg_gain_ini[fNTotBlocks];     not used
-  //  Double_t hcal_neg_gain_cur[fNTotBlocks];     not used
-  //  Int_t    hcal_neg_ped_limit[fNTotBlocks];    not used
   Double_t hcal_neg_gain_cor[fNTotBlocks];
 
   DBRequest list[]={
     {"cal_pos_cal_const", hcal_pos_cal_const, kDouble, fNTotBlocks},
-    //    {"cal_pos_gain_ini",  hcal_pos_gain_ini,  kDouble, fNTotBlocks},
-    //    {"cal_pos_gain_cur",  hcal_pos_gain_cur,  kDouble, fNTotBlocks},
-    {"cal_pos_ped_limit", fShPosPedLimit, kInt,    fNTotBlocks},
+    {"cal_pos_ped_limit", fShPosPedLimit, kInt,    fNTotBlocks,1},
     {"cal_pos_gain_cor",  hcal_pos_gain_cor,  kDouble, fNTotBlocks},
     {"cal_neg_cal_const", hcal_neg_cal_const, kDouble, fNTotBlocks},
-    //    {"cal_neg_gain_ini",  hcal_neg_gain_ini,  kDouble, fNTotBlocks},
-    //    {"cal_neg_gain_cur",  hcal_neg_gain_cur,  kDouble, fNTotBlocks},
-    {"cal_neg_ped_limit", fShNegPedLimit, kInt,    fNTotBlocks},
+    {"cal_neg_ped_limit", fShNegPedLimit, kInt,    fNTotBlocks,1},
     {"cal_neg_gain_cor",  hcal_neg_gain_cor,  kDouble, fNTotBlocks},
-    {"cal_min_peds", &fShMinPeds, kInt},
+    {"cal_min_peds", &fShMinPeds, kInt,0,1},
     {0}
   };
+  fShMinPeds=0.;
   gHcParms->LoadParmValues((DBRequest*)&list, prefix);
 
   // Debug output.
@@ -507,9 +507,13 @@ Int_t THcShower::DefineVariables( EMode mode )
   RVarDef vars[] = {
     { "nhits", "Number of hits",                                 "fNhits" },
     { "nclust", "Number of clusters",                            "fNclust" },
+    { "nclusttrack", "Number of cluster which matched best track","fNclustTrack" },
+    { "xclusttrack", "X pos of cluster which matched best track","fXclustTrack" },
+    { "xtrack", "X pos of track which matched cluster", "fXTrack" },
     { "etot", "Total energy",                                    "fEtot" },
     { "etotnorm", "Total energy divided by Central Momentum",    "fEtotNorm" },
     { "etrack", "Track energy",                                  "fEtrack" },
+    { "etracknorm", "Total energy divided by track momentum",    "fEtrackNorm" },
     { "ntracks", "Number of shower tracks",                      "fNtracks" },
     { 0 }
   };
@@ -560,10 +564,14 @@ void THcShower::Clear(Option_t* opt)
 
   fNhits = 0;
   fNclust = 0;
+  fNclustTrack = -2;
+  fXclustTrack = -1000;
+  fXTrack = -1000;
   fNtracks = 0;
   fEtot = 0.;
   fEtotNorm = 0.;
   fEtrack = 0.;
+  fEtrackNorm = 0.;
 
   // Purge cluster list
 
@@ -584,7 +592,7 @@ Int_t THcShower::Decode( const THaEvData& evdata )
 
   // Get the Hall C style hitlist (fRawHitList) for this event
   Int_t nhits = DecodeToHitList(evdata);
-
+  
   fEvent = evdata.GetEvNum();
 
   if(gHaCuts->Result("Pedestal_event")) {
@@ -612,14 +620,10 @@ Int_t THcShower::Decode( const THaEvData& evdata )
   Int_t nexthit = 0;
   for(UInt_t ip=0;ip<fNLayers;ip++) {
     nexthit = fPlanes[ip]->ProcessHits(fRawHitList, nexthit);
-    fEtot += fPlanes[ip]->GetEplane();
   }
   if(fHasArray) {
     nexthit = fArray->ProcessHits(fRawHitList, nexthit);
-    fEtot += fArray->GetEarray();
   }
-  THcHallCSpectrometer *app = static_cast<THcHallCSpectrometer*>(GetApparatus());
-  fEtotNorm=fEtot/(app->GetPcentral());
 
   return nhits;
 }
@@ -637,27 +641,25 @@ Int_t THcShower::CoarseProcess( TClonesArray& tracks)
   //
 
   // Fill set of unclustered hits.
-
+  for(UInt_t ip=0;ip<fNLayers;ip++) {
+    fPlanes[ip]->CoarseProcessHits();
+    fEtot += fPlanes[ip]->GetEplane();
+  }
+  if(fHasArray) {
+    fArray->CoarseProcessHits();
+    fEtot += fArray->GetEarray();
+  }
+  THcHallCSpectrometer *app = static_cast<THcHallCSpectrometer*>(GetApparatus());
+  fEtotNorm=fEtot/(app->GetPcentral());
+  //
   THcShowerHitSet HitSet;
 
   for(UInt_t j=0; j < fNLayers; j++) {
 
     for (UInt_t i=0; i<fNBlocks[j]; i++) {
 
-      //May be should be done this way.
-      //
-      //      Double_t Edep = fPlanes[j]->GetEmean(i);
-      //      if (Edep > 0.) {                                 //hit
-      //	Double_t x = fYPos[j][i] + BlockThick[j]/2.;    //top + thick/2
-      //	Double_t z = fLayerZPos[j] + BlockThick[j]/2.;//front + thick/2
-      //      	THcShowerHit* hit = new THcShowerHit(i,j,x,z,Edep);
-
-      //ENGINE way.
       //
-      if (fPlanes[j]->GetApos(i) - fPlanes[j]->GetPosPed(i) >
-	  fPlanes[j]->GetPosThr(i) - fPlanes[j]->GetPosPed(i) ||
-	  fPlanes[j]->GetAneg(i) - fPlanes[j]->GetNegPed(i) >
-	  fPlanes[j]->GetNegThr(i) - fPlanes[j]->GetNegPed(i)) {    //hit
+      if (fPlanes[j]->GetAposP(i) > 0  || fPlanes[j]->GetAnegP(i) >0) {    //hit
 
 	Double_t Edep = fPlanes[j]->GetEmean(i);
 	Double_t Epos = fPlanes[j]->GetEpos(i);
@@ -682,6 +684,7 @@ Int_t THcShower::CoarseProcess( TClonesArray& tracks)
     cout << "Debug output from THcShower::CoarseProcess for "
 	 << GetApparatus()->GetName() << endl;
 
+    cout << " event = " << fEvent << endl;
     cout << "  List of unclustered hits. Total hits:     " << fNhits << endl;
     THcShowerHitIt it = HitSet.begin();    //<set> version
     for (Int_t i=0; i!=fNhits; i++) {
@@ -700,7 +703,7 @@ Int_t THcShower::CoarseProcess( TClonesArray& tracks)
 
   if (fdbg_clusters_cal) {
 
-    cout << "  Clustered hits. Number of clusters: " << fNclust << endl;
+    cout << " event = " << fEvent << "  Clustered hits. Number of clusters: " << fNclust << endl;
 
     UInt_t i = 0;
     for (THcShowerClusterListIt ppcl = (*fClusterList).begin();
@@ -729,7 +732,18 @@ Int_t THcShower::CoarseProcess( TClonesArray& tracks)
   // Do same for Array.
 
   if(fHasArray) fArray->CoarseProcess(tracks);
+  //  
+  Int_t Ntracks = tracks.GetLast()+1;   // Number of reconstructed tracks
+  Double_t save_energy=0;
+ for (Int_t itrk=0; itrk<Ntracks; itrk++) {
 
+    THaTrack* theTrack = static_cast<THaTrack*>( tracks[itrk] );
+     save_energy = GetShEnergy(theTrack);
+      if (fHasArray) save_energy += fArray->GetShEnergy(theTrack);
+    theTrack->SetEnergy(save_energy);
+  }       //over tracks
+
+  //
   return 0;
 }
 
@@ -761,7 +775,6 @@ void THcShower::ClusterHits(THcShowerHitSet& HitSet,
 	     k++) {
 
 	  if ((**i).isNeighbour(*k)) {
-
 	    (*cluster).insert(*i);      //If the hit #i is neighbouring a hit
 	    HitSet.erase(i);            //in the cluster, then move it
 	                                //into the cluster.
@@ -945,7 +958,7 @@ Int_t THcShower::MatchCluster(THaTrack* Track,
       Double_t dx = TMath::Abs( clX(cluster) - XTrFront );
 
       if (dx <= (0.5*BlockThick[0] + fSlop)) {
-	fNtracks++;  // number of shower tracks (Consistent with engine)
+	fNtracks++;  // lumber of shower tracks (Consistent with engine)
 	if (dx < deltaX) {
 	  mclust = i;
 	  deltaX = dx;
@@ -960,6 +973,7 @@ Int_t THcShower::MatchCluster(THaTrack* Track,
     cout << "---------------------------------------------------------------\n";
     cout << "Debug output from THcShower::MatchCluster for "
 	 << GetApparatus()->GetName() << endl;
+    cout << " event = " << fEvent << endl;
 
     cout << "  Track at DC:"
 	 << "  X = " << Track->GetX()
@@ -1026,6 +1040,7 @@ Float_t THcShower::GetShEnergy(THaTrack* Track) {
 	corneg = 0.;
       }
 
+      // cout << ip << " clust energy pos = " <<  clEplane(cluster,ip,0)<< " clust energy pos = " <<  clEplane(cluster,ip,1) << endl;
       Etrk += clEplane(cluster,ip,0) * corpos;
       Etrk += clEplane(cluster,ip,1) * corneg;
 
@@ -1039,6 +1054,7 @@ Float_t THcShower::GetShEnergy(THaTrack* Track) {
     cout << "---------------------------------------------------------------\n";
     cout << "Debug output from THcShower::GetShEnergy for "
 	 << GetApparatus()->GetName() << endl;
+    cout << " event = " << fEvent << endl;
 
     cout << "  Track at the calorimeter: X = " << Xtr << "  Y = " << Ytr;
     if (mclust >= 0)
@@ -1061,15 +1077,23 @@ Int_t THcShower::FineProcess( TClonesArray& tracks )
   //
 
   Int_t Ntracks = tracks.GetLast()+1;   // Number of reconstructed tracks
-
   for (Int_t itrk=0; itrk<Ntracks; itrk++) {
-
     THaTrack* theTrack = static_cast<THaTrack*>( tracks[itrk] );
-
-    fEtrack = GetShEnergy(theTrack);
-    if (fHasArray) fEtrack += fArray->GetShEnergy(theTrack);
-    theTrack->SetEnergy(fEtrack);
-
+    if (theTrack->GetIndex()==0) {
+    fEtrack=theTrack->GetEnergy();
+    fEtrackNorm=fEtrack/theTrack->GetP();
+     
+     Double_t Xtr = -100.;
+     Double_t Ytr = -100.;
+    fNclustTrack = MatchCluster(theTrack, Xtr, Ytr);
+    fXTrack=Xtr;
+    if (fNclustTrack>=0) {
+    THcShowerCluster* cluster = *(fClusterList->begin()+fNclustTrack);
+    Double_t dx = TMath::Abs( clX(cluster) - Xtr );
+    fXclustTrack=clX(cluster);
+    //cout << fNclustTrack << " " << Xtr << " " << clX(cluster) << " " << dx << " " << Ytr << " " << fEtrack<< endl;
+    }
+    }
   }       //over tracks
 
   //Debug output.
@@ -1078,7 +1102,7 @@ Int_t THcShower::FineProcess( TClonesArray& tracks )
     cout << "---------------------------------------------------------------\n";
     cout << "Debug output from THcShower::FineProcess for "
 	 << GetApparatus()->GetName() << endl;
-
+    cout << " event = " << fEvent << endl;
     cout << "  Number of tracks = " << Ntracks << endl;
 
     for (Int_t itrk=0; itrk<Ntracks; itrk++) {
@@ -1088,7 +1112,8 @@ Int_t THcShower::FineProcess( TClonesArray& tracks )
 	   << "  Y = " << theTrack->GetY()
 	   << "  Theta = " << theTrack->GetTheta()
 	   << "  Phi = " << theTrack->GetPhi()
-	   << "  Energy = " << theTrack->GetEnergy() << endl;
+	   << "  Energy = " << theTrack->GetEnergy() 
+	   << "  Energy/Ptrack = " <<  fEtrackNorm << endl;
     }
 
     cout << "---------------------------------------------------------------\n";
diff --git a/src/THcShower.h b/src/THcShower.h
index b4ad6aa74a1d423f7546efa18731d8250a8d10fe..5770cb497761bfcc5b9854ec689b2e1420703559 100644
--- a/src/THcShower.h
+++ b/src/THcShower.h
@@ -71,6 +71,15 @@ public:
     return ( Side == 0 ? fPosGain[nelem] : fNegGain[nelem]);
   }
 
+  Int_t GetADCMode() {
+    return fADCMode;
+  }
+  Double_t GetAdcTimeWindowMin() {
+    return fAdcTimeWindowMin;
+  }
+  Double_t GetAdcTimeWindowMax() {
+    return fAdcTimeWindowMax;
+  }
   Int_t GetMinPeds() {
     return fShMinPeds;
   }
@@ -78,6 +87,9 @@ public:
   Int_t GetNLayers() {
     return fNLayers;
   }
+  Int_t GetNBlocks(Int_t layer) {
+    return fNBlocks[layer];
+  }
 
   //Coordinate correction for single PMT modules.
   //PMT attached at right (positive) side.
@@ -109,6 +121,16 @@ public:
 protected:
 
   Int_t fEvent;
+  Int_t fADCMode;		//   != 0 if using FADC 
+   //  1 == Use the pulse int - pulse ped
+    //  2 == Use the sample integral - known ped
+    //  3 == Use the sample integral - sample ped
+  static const Int_t kADCStandard=0;
+  static const Int_t kADCDynamicPedestal=1;
+  static const Int_t kADCSampleIntegral=2;
+  static const Int_t kADCSampIntDynPed=3;
+  Double_t fAdcTimeWindowMin;
+  Double_t fAdcTimeWindowMax;
 
   Int_t fAnalyzePedestals;   // Flag for pedestal analysis.
 
@@ -124,11 +146,15 @@ protected:
 
   Int_t fNhits;              // Total number of hits
   Int_t fNclust;             // Number of clusters
+  Int_t fNclustTrack;             // NUmber of cluster that match best track
+  Double_t fXclustTrack;             // X pos of cluster that match best track
+  Double_t fXTrack;             // X pos of best track that match cluster
   Int_t fNtracks;            // Number of shower tracks, i.e. number of
                              // cluster-to-track association
   Double_t fEtot;            // Total energy
   Double_t fEtotNorm;        // Total energy divided by spec central momentum
-  Double_t fEtrack;          // Cluster energy associated to the last track
+  Double_t fEtrack;          // Cluster energy associated to the best track
+  Double_t fEtrackNorm;          // Cluster energy associated to the best track
 
   THcShowerClusterList* fClusterList;   // List of hit clusters
 
diff --git a/src/THcShowerArray.cxx b/src/THcShowerArray.cxx
index da4257281a27931d590bfcb4e033bacb37a8d460..63e53574f0b190c6a34ed29b0adbf4cba353c486 100644
--- a/src/THcShowerArray.cxx
+++ b/src/THcShowerArray.cxx
@@ -39,7 +39,8 @@ THcShowerArray::THcShowerArray( const char* name,
   fADCHits = new TClonesArray("THcSignalHit",100);
   fLayerNum = layernum;
 
-	frAdcPedRaw = new TClonesArray("THcSignalHit", 16);
+  frAdcPedRaw = new TClonesArray("THcSignalHit", 16);
+  frAdcErrorFlag = new TClonesArray("THcSignalHit", 16);
   frAdcPulseIntRaw = new TClonesArray("THcSignalHit", 16);
   frAdcPulseAmpRaw = new TClonesArray("THcSignalHit", 16);
   frAdcPulseTimeRaw = new TClonesArray("THcSignalHit", 16);
@@ -61,6 +62,7 @@ THcShowerArray::~THcShowerArray()
   delete fADCHits;
 
   delete frAdcPedRaw; frAdcPedRaw = NULL;
+  delete frAdcErrorFlag; frAdcErrorFlag = NULL;
   delete frAdcPulseIntRaw; frAdcPulseIntRaw = NULL;
   delete frAdcPulseAmpRaw; frAdcPulseAmpRaw = NULL;
   delete frAdcPulseTimeRaw; frAdcPulseTimeRaw = NULL;
@@ -123,6 +125,9 @@ Int_t THcShowerArray::ReadDatabase( const TDatime& date )
     {"cal_arr_ystep", &fYStep, kDouble},
     {"cal_arr_zsize", &fZSize, kDouble},
     {"cal_using_fadc", &fUsingFADC, kInt, 0, 1},
+    {"cal_arr_ADCMode", &fADCMode, kInt, 0, 1},
+    {"cal_arr_AdcTimeWindowMin", &fAdcTimeWindowMin, kDouble, 0, 1},
+    {"cal_arr_AdcTimeWindowMax", &fAdcTimeWindowMax, kDouble, 0, 1},
     {"cal_ped_sample_low", &fPedSampLow, kInt, 0, 1},
     {"cal_ped_sample_high", &fPedSampHigh, kInt, 0, 1},
     {"cal_data_sample_low", &fDataSampLow, kInt, 0, 1},
@@ -130,7 +135,9 @@ Int_t THcShowerArray::ReadDatabase( const TDatime& date )
     {0}
   };
   gHcParms->LoadParmValues((DBRequest*)&list, prefix);
-
+  fADCMode=kADCDynamicPedestal;
+  fAdcTimeWindowMin=0;
+  fAdcTimeWindowMax=10000;
   fNelem = fNRows*fNColumns;
 
   fXPos = new Double_t* [fNRows];
@@ -216,10 +223,9 @@ Int_t THcShowerArray::ReadDatabase( const TDatime& date )
   Double_t cal_arr_gain_cor[fNelem];
 
   DBRequest list1[]={
-    {"cal_arr_ped_limit", fPedLimit, kInt, static_cast<UInt_t>(fNelem)},
+    {"cal_arr_ped_limit", fPedLimit, kInt, static_cast<UInt_t>(fNelem),1},
     {"cal_arr_cal_const", cal_arr_cal_const, kDouble, static_cast<UInt_t>(fNelem)},
     {"cal_arr_gain_cor",  cal_arr_gain_cor,  kDouble, static_cast<UInt_t>(fNelem)},
-    //    {"cal_min_peds", &fShMinPeds, kInt},
     {0}
   };
   gHcParms->LoadParmValues((DBRequest*)&list1, prefix);
@@ -261,7 +267,7 @@ Int_t THcShowerArray::ReadDatabase( const TDatime& date )
 
   // Calibration constants (GeV / ADC channel).
   fGain = new Double_t [fNelem];
-  for (UInt_t i=0; i<fNelem; i++) {
+  for (Int_t i=0; i<fNelem; i++) {
     fGain[i] = cal_arr_cal_const[i] *  cal_arr_gain_cor[i];
   }
 
@@ -328,6 +334,7 @@ Int_t THcShowerArray::DefineVariables( EMode mode )
     {"p", "Dynamic ADC Pedestal", "fP"},
     {"a_p", "Sparsified, ped-subtracted ADC Amplitudes", "fA_p"},
     { "nhits", "Number of hits", "fNhits" },
+    { "nghits", "Number of good hits ( pass threshold on raw ADC)", "fNgoodhits" },
     { "nclust", "Number of clusters", "fNclust" },
     {"e", "Energy Depositions per block", "fE"},
     {"earray", "Energy Deposition in array", "fEarray"},
@@ -336,6 +343,7 @@ Int_t THcShowerArray::DefineVariables( EMode mode )
     {"adcCounter",      "List of ADC counter numbers.",      "frAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"},
 
     {"adcPedRaw",       "List of raw ADC pedestals",         "frAdcPedRaw.THcSignalHit.GetData()"},
+    {"adcErrorFlag",       "List of raw ADC pedestals",      "frAdcErrorFlag.THcSignalHit.GetData()"},
     {"adcPulseIntRaw",  "List of raw ADC pulse integrals.",  "frAdcPulseIntRaw.THcSignalHit.GetData()"},
     {"adcPulseAmpRaw",  "List of raw ADC pulse amplitudes.", "frAdcPulseAmpRaw.THcSignalHit.GetData()"},
     {"adcPulseTimeRaw", "List of raw ADC pulse times.",      "frAdcPulseTimeRaw.THcSignalHit.GetData()"},
@@ -357,6 +365,7 @@ void THcShowerArray::Clear( Option_t* )
   fADCHits->Clear();
 
   fNhits = 0;
+  fNgoodhits = 0;
   fNclust = 0;
   fNtracks = 0;
 
@@ -368,6 +377,7 @@ void THcShowerArray::Clear( Option_t* )
   fClusterList->clear();
 
   frAdcPedRaw->Clear();
+  frAdcErrorFlag->Clear();
   frAdcPulseIntRaw->Clear();
   frAdcPulseAmpRaw->Clear();
   frAdcPulseTimeRaw->Clear();
@@ -413,9 +423,6 @@ Int_t THcShowerArray::CoarseProcess( TClonesArray& tracks )
       k++;
     }
   }
-
-  fNhits = HitSet.size();
-
   //Debug output, print out hits before clustering.
 
   THcShower* fParent = (THcShower*) GetParent();
@@ -427,7 +434,7 @@ Int_t THcShowerArray::CoarseProcess( TClonesArray& tracks )
 
     cout << "  List of unclustered hits. Total hits:     " << fNhits << endl;
     THcShowerHitIt it = HitSet.begin();    //<set> version
-    for (Int_t i=0; i!=fNhits; i++) {
+    for (Int_t i=0; i!=fNgoodhits; i++) {
       cout << "  hit " << i << ": ";
       (*(it++))->show();
     }
@@ -643,6 +650,96 @@ Int_t THcShowerArray::FineProcess( TClonesArray& tracks )
   return 0;
 }
 
+//_____________________________________________________________________________
+Int_t THcShowerArray::CoarseProcessHits()
+{
+  THcShower* fParent;
+  fParent = (THcShower*) GetParent();
+    Int_t ADCMode=fParent->GetADCMode();
+    if(ADCMode == kADCDynamicPedestal) {
+      FillADC_DynamicPedestal();
+    } else if (ADCMode == kADCSampleIntegral) {
+      FillADC_SampleIntegral();
+    } else if (ADCMode == kADCSampIntDynPed) {
+      FillADC_SampIntDynPed();
+        } else {
+      FillADC_Standard();
+    }
+    //
+  if (fParent->fdbg_decoded_cal) {
+
+    cout << "---------------------------------------------------------------\n";
+    cout << "Debug output from THcShowerArray::ProcessHits for "
+    	 << fParent->GetPrefix() << ":" << endl;
+
+    cout << "  Sparsified hits for shower array, plane #" << fLayerNum
+	 << ", " << GetName() << ":" << endl;
+
+    Int_t nspar = 0;
+    Int_t k=0;
+    for(UInt_t j=0; j < fNColumns; j++) {
+    for (UInt_t i=0; i<fNRows; i++) {
+     if(fA[k] > fThresh[k]) {
+	cout << "  counter =  " << k
+	     << "  E = " << fE[k]
+	     << endl;
+	nspar++;
+      }
+       k++;
+    }
+    }
+
+    if (nspar == 0) cout << "  No hits\n";
+
+    cout << "  Earray = " << fEarray << endl;
+    cout << "---------------------------------------------------------------\n";
+  }
+  //
+  return 1;
+}
+//_____________________________________________________________________________
+void THcShowerArray::FillADC_SampIntDynPed()
+{
+  //    adc_pos = hit->GetRawAdcHitPos().GetSampleInt();
+  //    adc_neg = hit->GetRawAdcHitNeg().GetSampleInt();
+  //   adc_pos_pedsub = hit->GetRawAdcHitPos().GetSampleIntRaw();
+  //   adc_neg_pedsub = hit->GetRawAdcHitNeg().GetSampleIntRaw();
+  // Need to create
+}
+//_____________________________________________________________________________
+void THcShowerArray::FillADC_SampleIntegral()
+{
+  ///			adc_pos_pedsub = hit->GetRawAdcHitPos().GetSampleIntRaw() - fPosPed[hit->fCounter -1];
+  //			adc_neg_pedsub = hit->GetRawAdcHitNeg().GetSampleIntRaw() - fNegPed[hit->fCounter -1];
+  //			adc_pos = hit->GetRawAdcHitPos().GetSampleIntRaw();
+  //			adc_neg = hit->GetRawAdcHitNeg().GetSampleIntRaw();
+  // need to create
+}
+//_____________________________________________________________________________
+void THcShowerArray::FillADC_Standard()
+{
+}
+//_____________________________________________________________________________
+void THcShowerArray::FillADC_DynamicPedestal()
+{
+  for (Int_t ielem=0;ielem<frAdcPulseInt->GetEntries();ielem++) {
+    Int_t npad = ((THcSignalHit*) frAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1;
+    Double_t pulseInt = ((THcSignalHit*) frAdcPulseInt->ConstructedAt(ielem))->GetData();
+    Double_t pulseIntRaw = ((THcSignalHit*) frAdcPulseIntRaw->ConstructedAt(ielem))->GetData();
+    Double_t pulseTime = ((THcSignalHit*) frAdcPulseTimeRaw->ConstructedAt(ielem))->GetData();
+    Double_t errorflag = ((THcSignalHit*) frAdcErrorFlag->ConstructedAt(ielem))->GetData();
+    Bool_t pulseTimeCut = (pulseTime > fAdcTimeWindowMin) &&  (pulseTime < fAdcTimeWindowMax);
+    if (errorflag==0 && pulseTimeCut) {
+      fA[npad] =pulseIntRaw;
+      if(fA[npad] >  fThresh[npad]) {
+       fA_p[npad] =pulseInt ;
+       fE[npad] = fA_p[npad]*fGain[npad];
+       fEarray += fE[npad];
+      }
+     }        
+   }
+  //
+}
 //_____________________________________________________________________________
 Int_t THcShowerArray::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
 {
@@ -656,6 +753,7 @@ Int_t THcShowerArray::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
   fADCHits->Clear();
 
   frAdcPedRaw->Clear();
+  frAdcErrorFlag->Clear();
   frAdcPulseIntRaw->Clear();
   frAdcPulseAmpRaw->Clear();
   frAdcPulseTimeRaw->Clear();
@@ -679,9 +777,6 @@ Int_t THcShowerArray::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
 
   Int_t ihit = nexthit;
 
-  Int_t ngood = 0;
-  Int_t threshold = 100;
-
   UInt_t nrAdcHits = 0;
 
   while(ihit < nrawhits) {
@@ -692,11 +787,12 @@ Int_t THcShowerArray::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
     }
 
     Int_t padnum = hit->fCounter;
-
     THcRawAdcHit& rawAdcHit = hit->GetRawAdcHitPos();
+    //
     for (UInt_t thit=0; thit<rawAdcHit.GetNPulses(); ++thit) {
       ((THcSignalHit*) frAdcPedRaw->ConstructedAt(nrAdcHits))->Set(padnum, rawAdcHit.GetPedRaw());
-      ((THcSignalHit*) frAdcPed->ConstructedAt(nrAdcHits))->Set(padnum, rawAdcHit.GetPed());
+        fThresh[padnum]=rawAdcHit.GetPedRaw()*rawAdcHit.GetF250_PeakPedestalRatio()+250.;
+     ((THcSignalHit*) frAdcPed->ConstructedAt(nrAdcHits))->Set(padnum, rawAdcHit.GetPed());
 
       ((THcSignalHit*) frAdcPulseIntRaw->ConstructedAt(nrAdcHits))->Set(padnum, rawAdcHit.GetPulseIntRaw(thit));
       ((THcSignalHit*) frAdcPulseInt->ConstructedAt(nrAdcHits))->Set(padnum, rawAdcHit.GetPulseInt(thit));
@@ -705,48 +801,18 @@ Int_t THcShowerArray::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
       ((THcSignalHit*) frAdcPulseAmp->ConstructedAt(nrAdcHits))->Set(padnum, rawAdcHit.GetPulseAmp(thit));
 
       ((THcSignalHit*) frAdcPulseTimeRaw->ConstructedAt(nrAdcHits))->Set(padnum, rawAdcHit.GetPulseTimeRaw(thit));
-
+      if (rawAdcHit.GetPulseAmp(thit)>0&&rawAdcHit.GetPulseIntRaw(thit)>0) {
+	((THcSignalHit*) frAdcErrorFlag->ConstructedAt(nrAdcHits))->Set(padnum,0);
+      } else {
+	((THcSignalHit*) frAdcErrorFlag->ConstructedAt(nrAdcHits))->Set(padnum,1);
+      }
       ++nrAdcHits;
     }
-    fADCMode=kADCDynamicPedestal;
-    Double_t adc;
-    Double_t adc_pedsub;
-    if(fADCMode == kADCDynamicPedestal) {
-			adc_pedsub = hit->GetRawAdcHitPos().GetPulseInt();
-			adc= hit->GetRawAdcHitPos().GetPulseIntRaw();
-    } else if (fADCMode == kADCSampleIntegral) {
-			adc_pedsub = hit->GetRawAdcHitPos().GetSampleIntRaw() - fPed[hit->fCounter -1];
-			adc = hit->GetRawAdcHitPos().GetSampleIntRaw();
-    } else if (fADCMode == kADCSampIntDynPed) {
-      adc = hit->GetRawAdcHitPos().GetSampleInt();
-      adc_pedsub = hit->GetRawAdcHitPos().GetSampleIntRaw();
-    } else {
-      adc_pedsub = hit->GetRawAdcHitPos().GetPulseIntRaw()-fPed[hit->fCounter -1];
-      adc = hit->GetRawAdcHitPos().GetPulseIntRaw();
-    }
-
-    fA[hit->fCounter-1] = adc;
-    threshold=hit->GetRawAdcHitPos().GetPedRaw()+100;
-    if(fA[hit->fCounter-1] > threshold) {
-      ngood++;
-    }
-
-    // Sparsify hits, fill the hit list, compute the energy depostion.
-    fThresh[hit->fCounter -1] = hit->GetRawAdcHitPos().GetPedRaw()+100;
-    if(fA[hit->fCounter-1] >  fThresh[hit->fCounter -1]) {
-	fA_p[hit->fCounter-1] = adc_pedsub;
-      fE[hit->fCounter-1] += fA_p[hit->fCounter-1] * fGain[hit->fCounter-1];
-    }
-
-    // Accumulate energies in the plane.
-
-    fEarray += fE[hit->fCounter-1];
-
     ihit++;
   }
 
 #if 0
-  if(ngood > 0) {
+  if(fNgoodhits > 0) {
     cout << "+";
     for(Int_t column=0;column<fNColumns;column++) {
       cout << "-";
@@ -767,7 +833,7 @@ Int_t THcShowerArray::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
   }
 #endif
 #ifdef HITPIC
-  if(ngood > 0) {
+  if(fNgoodhits > 0) {
     for(Int_t row=0;row<fNRows;row++) {
       if(piccolumn==0) {
 	hitpic[row][0] = '|';
@@ -803,37 +869,6 @@ Int_t THcShowerArray::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
 
   //Debug output.
 
-  if (fParent->fdbg_decoded_cal) {
-
-    cout << "---------------------------------------------------------------\n";
-    cout << "Debug output from THcShowerArray::ProcessHits for "
-    	 << fParent->GetPrefix() << ":" << endl;
-
-    cout << "  nrawhits =  " << nrawhits << "  nexthit =  " << nexthit << endl;
-    cout << "  Sparsified hits for shower array, plane #" << fLayerNum
-	 << ", " << GetName() << ":" << endl;
-
-    Int_t nspar = 0;
-    for (Int_t jhit = nexthit; jhit < nrawhits; jhit++) {
-
-      THcRawShowerHit* hit = (THcRawShowerHit *) rawhits->At(jhit);
-      if(hit->fPlane != fLayerNum) {
-	break;
-      }
-
-      if(fA[hit->fCounter-1] > fThresh[hit->fCounter -1]) {
-	cout << "  counter =  " << hit->fCounter
-	     << "  E = " << fE[hit->fCounter-1]
-	     << endl;
-	nspar++;
-      }
-    }
-
-    if (nspar == 0) cout << "  No hits\n";
-
-    cout << "  Earray = " << fEarray << endl;
-    cout << "---------------------------------------------------------------\n";
-  }
 
   return(ihit);
 }
diff --git a/src/THcShowerArray.h b/src/THcShowerArray.h
index ad0167030189296b445014c8880208e9f00f461a..4b178cbcf9c43ff304b32b7bce40ce3d286ee9e2 100644
--- a/src/THcShowerArray.h
+++ b/src/THcShowerArray.h
@@ -45,10 +45,15 @@ public:
   virtual Bool_t   IsPid()      { return kFALSE; }
 
   virtual Int_t ProcessHits(TClonesArray* rawhits, Int_t nexthit);
+  virtual Int_t CoarseProcessHits();
   virtual Int_t AccumulatePedestals(TClonesArray* rawhits, Int_t nexthit);
   virtual void  CalculatePedestals( );
   virtual void  InitializePedestals( );
-
+  virtual void  FillADC_DynamicPedestal( );
+  virtual void  FillADC_SampleIntegral( );
+  virtual void  FillADC_SampIntDynPed( );
+  virtual void  FillADC_Standard( );
+ 
   // Cluster to track association method.
   Int_t MatchCluster(THaTrack*, Double_t&, Double_t&);
 
@@ -106,7 +111,9 @@ 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
+  Double_t fAdcTimeWindowMin ;
+  Double_t fAdcTimeWindowMax ;
+Int_t fPedSampLow;		// Sample range for
   Int_t fPedSampHigh;		// dynamic pedestal
   Int_t fDataSampLow;		// Sample range for
   Int_t fDataSampHigh;		// sample integration
@@ -137,6 +144,7 @@ protected:
   Double_t  fEarray;         // Total Energy deposition in the array.
 
   Int_t fNhits;              // Total number of hits
+  Int_t fNgoodhits;              // Total number of good hits (pass threshold)
   Int_t fNclust;             // Number of hit clusters
   Int_t fNtracks;            // Number of shower tracks, i.e. number of
                              // cluster-to-track associations
@@ -144,6 +152,7 @@ protected:
   THcShowerClusterList* fClusterList;   // List of hit clusters
 
   TClonesArray* frAdcPedRaw;
+  TClonesArray* frAdcErrorFlag;
   TClonesArray* frAdcPulseIntRaw;
   TClonesArray* frAdcPulseAmpRaw;
   TClonesArray* frAdcPulseTimeRaw;
diff --git a/src/THcShowerHit.cxx b/src/THcShowerHit.cxx
index 574d05646a1c4b567ec69ca4bac4f14298dfdaaa..e7bc7bf88428e0cafacfe7ce954ec8189cf76773 100644
--- a/src/THcShowerHit.cxx
+++ b/src/THcShowerHit.cxx
@@ -44,7 +44,7 @@ bool THcShowerHit::isNeighbour(THcShowerHit* hit1) {
 //Print out hit information
 //
 void THcShowerHit::show() {
-  cout << "row=" << fRow << "  column=" << fCol
+  cout << "row=" << fRow+1 << "  column=" << fCol+1
        << "  x=" << fX << "  z=" << fZ
        << "  E=" << fE << "  Epos=" << fEpos << "  Eneg=" << fEneg << endl;
 }
diff --git a/src/THcShowerPlane.cxx b/src/THcShowerPlane.cxx
index 44eba1a16fea009b9fb5a524d01e0277ad622d4c..0a9452d50ab57599e3a35bcd45242ecb2c193fae 100644
--- a/src/THcShowerPlane.cxx
+++ b/src/THcShowerPlane.cxx
@@ -39,6 +39,7 @@ THcShowerPlane::THcShowerPlane( const char* name,
   fPosADCHits = new TClonesArray("THcSignalHit",fNelem);
   fNegADCHits = new TClonesArray("THcSignalHit",fNelem);
 
+  frPosAdcErrorFlag = new TClonesArray("THcSignalHit", 16);
   frPosAdcPedRaw = new TClonesArray("THcSignalHit", 16);
   frPosAdcPulseIntRaw = new TClonesArray("THcSignalHit", 16);
   frPosAdcPulseAmpRaw = new TClonesArray("THcSignalHit", 16);
@@ -48,6 +49,7 @@ THcShowerPlane::THcShowerPlane( const char* name,
   frPosAdcPulseInt = new TClonesArray("THcSignalHit", 16);
   frPosAdcPulseAmp = new TClonesArray("THcSignalHit", 16);
 
+  frNegAdcErrorFlag = new TClonesArray("THcSignalHit", 16);
   frNegAdcPedRaw = new TClonesArray("THcSignalHit", 16);
   frNegAdcPulseIntRaw = new TClonesArray("THcSignalHit", 16);
   frNegAdcPulseAmpRaw = new TClonesArray("THcSignalHit", 16);
@@ -72,6 +74,7 @@ THcShowerPlane::~THcShowerPlane()
   delete fPosADCHits;
   delete fNegADCHits;
 
+  frPosAdcErrorFlag = NULL;
   frPosAdcPedRaw = NULL;
   frPosAdcPulseIntRaw = NULL;
   frPosAdcPulseAmpRaw = NULL;
@@ -81,6 +84,7 @@ THcShowerPlane::~THcShowerPlane()
   frPosAdcPulseInt = NULL;
   frPosAdcPulseAmp = NULL;
 
+  frNegAdcErrorFlag = NULL;
   frNegAdcPedRaw = NULL;
   frNegAdcPulseIntRaw = NULL;
   frNegAdcPulseAmpRaw = NULL;
@@ -256,6 +260,7 @@ Int_t THcShowerPlane::DefineVariables( EMode mode )
     {"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()"},
@@ -265,6 +270,7 @@ Int_t THcShowerPlane::DefineVariables( EMode mode )
     {"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()"},
@@ -287,6 +293,7 @@ void THcShowerPlane::Clear( Option_t* )
   fPosADCHits->Clear();
   fNegADCHits->Clear();
 
+  frPosAdcErrorFlag->Clear();
   frPosAdcPedRaw->Clear();
   frPosAdcPulseIntRaw->Clear();
   frPosAdcPulseAmpRaw->Clear();
@@ -296,6 +303,7 @@ void THcShowerPlane::Clear( Option_t* )
   frPosAdcPulseInt->Clear();
   frPosAdcPulseAmp->Clear();
 
+  frNegAdcErrorFlag->Clear();
   frNegAdcPedRaw->Clear();
   frNegAdcPulseIntRaw->Clear();
   frNegAdcPulseAmpRaw->Clear();
@@ -365,6 +373,7 @@ Int_t THcShowerPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
   fPosADCHits->Clear();
   fNegADCHits->Clear();
 
+  frPosAdcErrorFlag->Clear();
   frPosAdcPedRaw->Clear();
   frPosAdcPulseIntRaw->Clear();
   frPosAdcPulseAmpRaw->Clear();
@@ -374,6 +383,7 @@ Int_t THcShowerPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
   frPosAdcPulseInt->Clear();
   frPosAdcPulseAmp->Clear();
 
+  frNegAdcErrorFlag->Clear();
   frNegAdcPedRaw->Clear();
   frNegAdcPulseIntRaw->Clear();
   frNegAdcPulseAmpRaw->Clear();
@@ -421,6 +431,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()+250.;
       ((THcSignalHit*) frPosAdcPed->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.GetPed());
 
       ((THcSignalHit*) frPosAdcPulseIntRaw->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.GetPulseIntRaw(thit));
@@ -430,12 +441,17 @@ Int_t THcShowerPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
       ((THcSignalHit*) frPosAdcPulseAmp->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.GetPulseAmp(thit));
 
       ((THcSignalHit*) frPosAdcPulseTimeRaw->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.GetPulseTimeRaw(thit));
-
+      if (rawPosAdcHit.GetPulseAmp(thit)>0&&rawPosAdcHit.GetPulseIntRaw(thit)>0) {
+	((THcSignalHit*) frPosAdcErrorFlag->ConstructedAt(nrPosAdcHits))->Set(padnum,0);        
+      } else {
+	((THcSignalHit*) frPosAdcErrorFlag->ConstructedAt(nrPosAdcHits))->Set(padnum,1);        
+      }
       ++nrPosAdcHits;
     }
     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()+250.;
       ((THcSignalHit*) frNegAdcPed->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.GetPed());
 
       ((THcSignalHit*) frNegAdcPulseIntRaw->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.GetPulseIntRaw(thit));
@@ -445,107 +461,54 @@ Int_t THcShowerPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
       ((THcSignalHit*) frNegAdcPulseAmp->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.GetPulseAmp(thit));
 
       ((THcSignalHit*) frNegAdcPulseTimeRaw->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.GetPulseTimeRaw(thit));
-
+      if (rawNegAdcHit.GetPulseAmp(thit)>0&&rawNegAdcHit.GetPulseIntRaw(thit)>0) {
+	((THcSignalHit*) frNegAdcErrorFlag->ConstructedAt(nrNegAdcHits))->Set(padnum,0);
+      } else {
+	((THcSignalHit*) frNegAdcErrorFlag->ConstructedAt(nrNegAdcHits))->Set(padnum,1);
+      }
       ++nrNegAdcHits;
     }
 
-    fADCMode=kADCDynamicPedestal;
-    Double_t adc_pos;
-    Double_t adc_neg;
-    Double_t adc_pos_pedsub;
-    Double_t adc_neg_pedsub;
-    if(fADCMode == kADCDynamicPedestal) {
-			adc_pos_pedsub = hit->GetRawAdcHitPos().GetPulseInt();
-			adc_neg_pedsub = hit->GetRawAdcHitNeg().GetPulseInt();
-			adc_pos = hit->GetRawAdcHitPos().GetPulseIntRaw();
-			adc_neg = hit->GetRawAdcHitNeg().GetPulseIntRaw();
-    } else if (fADCMode == kADCSampleIntegral) {
-			adc_pos_pedsub = hit->GetRawAdcHitPos().GetSampleIntRaw() - fPosPed[hit->fCounter -1];
-			adc_neg_pedsub = hit->GetRawAdcHitNeg().GetSampleIntRaw() - fNegPed[hit->fCounter -1];
-			adc_pos = hit->GetRawAdcHitPos().GetSampleIntRaw();
-			adc_neg = hit->GetRawAdcHitNeg().GetSampleIntRaw();
-    } else if (fADCMode == kADCSampIntDynPed) {
-      adc_pos = hit->GetRawAdcHitPos().GetSampleInt();
-      adc_neg = hit->GetRawAdcHitNeg().GetSampleInt();
-      adc_pos_pedsub = hit->GetRawAdcHitPos().GetSampleIntRaw();
-      adc_neg_pedsub = hit->GetRawAdcHitNeg().GetSampleIntRaw();
-    } else {
-      adc_pos_pedsub = hit->GetRawAdcHitPos().GetPulseIntRaw()-fPosPed[hit->fCounter -1];
-      adc_neg_pedsub = hit->GetRawAdcHitNeg().GetPulseIntRaw()-fNegPed[hit->fCounter -1];
-      adc_pos = hit->GetRawAdcHitPos().GetPulseIntRaw();
-      adc_neg = hit->GetRawAdcHitNeg().GetPulseIntRaw();
-    }
-    //
-    // Sparsify positive side hits, fill the hit list, compute the
-    // energy depostion from positive side for the counter.
-			fA_Pos[hit->fCounter-1] =adc_pos;
-			fA_Neg[hit->fCounter-1] =adc_neg;
-
-    Double_t thresh_pos = fPosThresh[hit->fCounter -1];
-    thresh_pos =0;
-    if(fA_Pos[hit->fCounter-1] >  thresh_pos) {
-
-      fA_Pos_p[hit->fCounter-1] =adc_pos_pedsub ;
-
-      //      cout << " pos " << hit->fCounter << " " << fA_Pos_p[hit->fCounter-1] << " " <<  fA_Pos[hit->fCounter-1] << " " << fPosPed[hit->fCounter -1] << "" << frNegAdcPulseAmp->ConstructedAt(nrNegAdcHits-1))->Get(padnum)<< endl;
-      fEpos[hit->fCounter-1] += fA_Pos_p[hit->fCounter-1]*
-	fParent->GetGain(hit->fCounter-1,fLayerNum-1,0);
-    }
-
-    // Sparsify negative side hits, fill the hit list, compute the
-    // energy depostion from negative side for the counter.
-
-    Double_t thresh_neg = fNegThresh[hit->fCounter -1];
-    thresh_neg=0;
-    if(fA_Neg[hit->fCounter-1] >  thresh_neg) {
-
-
-      fA_Neg_p[hit->fCounter-1] =adc_neg_pedsub ;
-
-      fEneg[hit->fCounter-1] += fA_Neg_p[hit->fCounter-1]*
-	fParent->GetGain(hit->fCounter-1,fLayerNum-1,1);
-    }
-
-    // Mean energy in the counter.
-
-    fEmean[hit->fCounter-1] += (fEpos[hit->fCounter-1] + fEneg[hit->fCounter-1]);
-
-    // Accumulate energies in the plane.
-
-    fEplane += fEmean[hit->fCounter-1];
-    fEplane_pos += fEpos[hit->fCounter-1];
-    fEplane_neg += fEneg[hit->fCounter-1];
-
     ihit++;
   }
 
-  //Debug output.
 
+  return(ihit);
+}
+//_____________________________________________________________________________
+Int_t THcShowerPlane::CoarseProcessHits()
+{
+  THcShower* fParent;
+  fParent = (THcShower*) GetParent();
+    Int_t ADCMode=fParent->GetADCMode();
+    if(ADCMode == kADCDynamicPedestal) {
+      FillADC_DynamicPedestal();
+    } else if (ADCMode == kADCSampleIntegral) {
+      FillADC_SampleIntegral();
+    } else if (ADCMode == kADCSampIntDynPed) {
+      FillADC_SampIntDynPed();
+        } else {
+      FillADC_Standard();
+    }
+    //
   if (fParent->fdbg_decoded_cal) {
 
     cout << "---------------------------------------------------------------\n";
     cout << "Debug output from THcShowerPlane::ProcessHits for "
     	 << fParent->GetPrefix() << ":" << endl;
 
-    cout << "  nrawhits =  " << nrawhits << "  nexthit =  " << nexthit << endl;
     cout << "  Sparsified hits for HMS calorimeter plane #" << fLayerNum
 	 << ", " << GetName() << ":" << endl;
 
     Int_t nspar = 0;
-    for (Int_t jhit = nexthit; jhit < nrawhits; jhit++) {
 
-      THcRawShowerHit* hit = (THcRawShowerHit *) rawhits->At(jhit);
-      if(hit->fPlane > fLayerNum) {
-	break;
-      }
+    for (UInt_t i=0; i<fParent->GetNBlocks(fLayerNum-1); i++) {
 
-      if(fA_Pos[hit->fCounter-1] > fPosThresh[hit->fCounter -1] ||
-	 fA_Neg[hit->fCounter-1] > fNegThresh[hit->fCounter -1]) {
-	cout << "  plane =  " << hit->fPlane
-	     << "  counter =  " << hit->fCounter
-	     << "  Emean = " << fEmean[hit->fCounter-1]
-	     << "  Epos = " << fEpos[hit->fCounter-1]
-	     << "  Eneg = " << fEneg[hit->fCounter-1]
+      if (GetAposP(i) > 0  || GetAnegP(i) >0) {    //hit
+	cout << "  counter =  " << i
+	     << "  Emean = " << fEmean[i]
+	     << "  Epos = " << fEpos[i]
+	     << "  Eneg = " << fEneg[i]
 	     << endl;
 	nspar++;
       }
@@ -559,10 +522,103 @@ Int_t THcShowerPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
 	 << endl;
     cout << "---------------------------------------------------------------\n";
   }
-
-  return(ihit);
+  //
+  return 1;
+    //
+}
+//_____________________________________________________________________________
+void THcShowerPlane::FillADC_SampIntDynPed()
+{
+  //    adc_pos = hit->GetRawAdcHitPos().GetSampleInt();
+  //    adc_neg = hit->GetRawAdcHitNeg().GetSampleInt();
+  //   adc_pos_pedsub = hit->GetRawAdcHitPos().GetSampleIntRaw();
+  //   adc_neg_pedsub = hit->GetRawAdcHitNeg().GetSampleIntRaw();
+  // Need to create
 }
+//_____________________________________________________________________________
+void THcShowerPlane::FillADC_SampleIntegral()
+{
+  ///			adc_pos_pedsub = hit->GetRawAdcHitPos().GetSampleIntRaw() - fPosPed[hit->fCounter -1];
+  //			adc_neg_pedsub = hit->GetRawAdcHitNeg().GetSampleIntRaw() - fNegPed[hit->fCounter -1];
+  //			adc_pos = hit->GetRawAdcHitPos().GetSampleIntRaw();
+  //			adc_neg = hit->GetRawAdcHitNeg().GetSampleIntRaw();
+  // need to create
+}
+//_____________________________________________________________________________
+void THcShowerPlane::FillADC_Standard()
+{
+  THcShower* fParent;
+  fParent = (THcShower*) GetParent();
+  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];
+      }
+  }
+  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];
+      }
+  }
+    fEplane= fEplane_neg+fEplane_pos;
+}
+//_____________________________________________________________________________
+void THcShowerPlane::FillADC_DynamicPedestal()
+{
+  THcShower* fParent;
+  fParent = (THcShower*) GetParent();
+  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];
+      }
+     }        
+    }
+  //
+  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];
+      }
+     }        
+    }
+  //
+    fEplane= fEplane_neg+fEplane_pos;
 
+}
 //_____________________________________________________________________________
 Int_t THcShowerPlane::AccumulatePedestals(TClonesArray* rawhits, Int_t nexthit)
 {
diff --git a/src/THcShowerPlane.h b/src/THcShowerPlane.h
index 8cb4346aa21ab3dd609d91ed79556275d0fb4332..fe00766d7e3c1fa6dfe81a52bf934a40b400f147 100644
--- a/src/THcShowerPlane.h
+++ b/src/THcShowerPlane.h
@@ -39,6 +39,7 @@ public:
   virtual Bool_t   IsPid()      { return kFALSE; }
 
   virtual Int_t ProcessHits(TClonesArray* rawhits, Int_t nexthit);
+  virtual Int_t CoarseProcessHits();
   virtual Int_t AccumulatePedestals(TClonesArray* rawhits, Int_t nexthit);
   virtual void  CalculatePedestals( );
 
@@ -110,7 +111,6 @@ protected:
 
   // Flash ADC parameters
   Int_t fUsingFADC;		// != 0 if using FADC in sample mode
-  Int_t fADCMode;		//    
    //  1 == Use the pulse int - pulse ped
     //  2 == Use the sample integral - known ped
     //  3 == Use the sample integral - sample ped
@@ -159,6 +159,7 @@ protected:
   Float_t *fNegSig;
   Float_t *fNegThresh;
 
+  TClonesArray* frPosAdcErrorFlag;
   TClonesArray* frPosAdcPedRaw;
   TClonesArray* frPosAdcPulseIntRaw;
   TClonesArray* frPosAdcPulseAmpRaw;
@@ -168,6 +169,7 @@ protected:
   TClonesArray* frPosAdcPulseInt;
   TClonesArray* frPosAdcPulseAmp;
 
+  TClonesArray* frNegAdcErrorFlag;
   TClonesArray* frNegAdcPedRaw;
   TClonesArray* frNegAdcPulseIntRaw;
   TClonesArray* frNegAdcPulseAmpRaw;
@@ -180,6 +182,10 @@ protected:
   virtual Int_t  ReadDatabase( const TDatime& date );
   virtual Int_t  DefineVariables( EMode mode = kDefine );
   virtual void  InitializePedestals( );
+  virtual void  FillADC_DynamicPedestal( );
+  virtual void  FillADC_SampleIntegral( );
+  virtual void  FillADC_SampIntDynPed( );
+  virtual void  FillADC_Standard( );
   ClassDef(THcShowerPlane,0); // Calorimeter bars in a plane
 };
 #endif