diff --git a/examples/DBASE/test.database b/examples/DBASE/test.database
index 577f1a66e1ecfb783d2e8d070499977634c70cd2..d4dae4a85cabfb629f2db613651b56e8804371cb 100644
--- a/examples/DBASE/test.database
+++ b/examples/DBASE/test.database
@@ -10,6 +10,11 @@ hpartmass = 0.13957
 52949
 g_ctp_parm_filename="PARAM/52949/general.param"
 g_decode_map_filename="MAPS/july04.map"
+# From DBASE/online04.kinematics_online.
+gpbeam    = 1.2048
+hpcentral = 0.811
+htheta_lab = 55.
+hpartmass = 0.00051099
 47000-48000
 g_ctp_parm_filename="PARAM/general.param"
 g_decode_map_filename="MAPS/jan03.map"
diff --git a/examples/PARAM/52949/hcana.param b/examples/PARAM/52949/hcana.param
deleted file mode 100644
index d49faaa41e6d7cb2de2eae66d474da35c8f4c7d1..0000000000000000000000000000000000000000
--- a/examples/PARAM/52949/hcana.param
+++ /dev/null
@@ -1,22 +0,0 @@
-;
-; Parameters that were built into Fortran analyzer that we want
-; to pass as parameters so that the resulting code can be more generic.
-;
-
-hhodo_num_planes = 4
-
-hcal_num_layers = 4
-
-hcal_fv_delta = 5.
-
-haero_num_pairs = 8
-
-# Names of planes so that parameter names can be constructed
-hdc_plane_names = "1x1 1y1 1u1 1v1 1y2 1x2 2x1 2y1 2u1 2v1 2y2 2x2"
-
-hcal_layer_names = "1pr 2ta 3ta 4ta"
-
-hhodo_plane_names = "1x 1y 2x 2y"
-
-hpcentral=0.811
-
diff --git a/examples/PARAM/52949/hcana.param b/examples/PARAM/52949/hcana.param
new file mode 120000
index 0000000000000000000000000000000000000000..7fd888b6ebf1fb22416f5b98f23bbabf7f0d745c
--- /dev/null
+++ b/examples/PARAM/52949/hcana.param
@@ -0,0 +1 @@
+../hcana.param
\ No newline at end of file
diff --git a/examples/PARAM/hcana.param b/examples/PARAM/hcana.param
index e4c572f1d41d44d467c1eae590fed24e889eff05..1f9e393f0b67fed0ccc4079beadd84ae881bd61b 100644
--- a/examples/PARAM/hcana.param
+++ b/examples/PARAM/hcana.param
@@ -8,7 +8,13 @@ hhodo_num_planes = 4
 hcal_num_layers = 4
 
 # Exclusion band width for the calorimeter's fiducial volume.
-hcal_fv_delta = 5.0
+hcal_fv_delta = 5.
+
+# Constants for the coordiante correction of the calorimeter energy depositions
+hcal_a_cor = 200.
+hcal_b_cor = 8000.
+hcal_c_cor = 64.36
+hcal_d_cor = 1.66
 
 haero_num_pairs = 8
 
diff --git a/src/THcShower.cxx b/src/THcShower.cxx
index 5dec1873d82efd31b45e5edd37b2188b58d6a09b..36fc4a52fe7fd310cd1c6c1757abb049eaa09b35 100644
--- a/src/THcShower.cxx
+++ b/src/THcShower.cxx
@@ -187,6 +187,23 @@ Int_t THcShower::ReadDatabase( const TDatime& date )
   cout << "Cluster debug flag          = " << fdbg_clusters_cal  << endl;
   cout << "Tracking debug flag         = " << fdbg_tracks_cal  << endl;
 
+  {
+    DBRequest list[]={
+      {"cal_a_cor", &fAcor, kDouble},
+      {"cal_b_cor", &fBcor, kDouble},
+      {"cal_c_cor", &fCcor, kDouble},
+      {"cal_d_cor", &fDcor, kDouble},
+      {0}
+    };
+    gHcParms->LoadParmValues((DBRequest*)&list, prefix);
+  }
+
+  cout << "HMS Calorimeter coordinate correction constants:" << endl;
+  cout << "    fAcor = " << fAcor << endl;
+  cout << "    fBcor = " << fBcor << endl;
+  cout << "    fCcor = " << fCcor << endl;
+  cout << "    fDcor = " << fDcor << endl;
+
   BlockThick = new Double_t [fNLayers];
   fNBlocks = new Int_t [fNLayers];
   fNLayerZPos = new Double_t [fNLayers];
@@ -623,9 +640,11 @@ Int_t THcShower::CoarseProcess( TClonesArray& tracks)
 	  fPlanes[j]->GetAneg(i) - fPlanes[j]->GetNegPed(i) >
 	  fPlanes[j]->GetNegThr(i) - fPlanes[j]->GetNegPed(i)) {    //hit
 	Double_t Edep = fPlanes[j]->GetEmean(i);
+	Double_t Epos = fPlanes[j]->GetEpos(i);
+	Double_t Eneg = fPlanes[j]->GetEneg(i);
 	Double_t x = XPos[j][i] + BlockThick[j]/2.;        //top + thick/2
 	Double_t z = fNLayerZPos[j] + BlockThick[j]/2.;    //front + thick/2
-	THcShowerHit* hit = new THcShowerHit(i,j,x,z,Edep);
+	THcShowerHit* hit = new THcShowerHit(i,j,x,z,Edep,Epos,Eneg);
 
 	HitList.push_back(hit);
 
@@ -656,7 +675,7 @@ Int_t THcShower::CoarseProcess( TClonesArray& tracks)
 
   //Print out the cluster list.
   //
-  fNclust = (*ClusterList).NbClusters();
+
   if (fdbg_clusters_cal) cout << "Cluster_list size: " << fNclust << endl;
 
     for (Int_t i=0; i!=fNclust; i++) {
diff --git a/src/THcShower.h b/src/THcShower.h
index 04a05797d6377f0b5dfe7bc1e4d2840fc98f0b48..28b710c43fe96aa5f28be7a8cf7d55e457f0fcb6 100644
--- a/src/THcShower.h
+++ b/src/THcShower.h
@@ -84,6 +84,10 @@ public:
     return fMult;
   }
 
+  Int_t GetNLayers() {
+    return fNLayers;
+  }
+
   THcShower();  // for ROOT I/O
 
 protected:
@@ -141,6 +145,11 @@ protected:
   Int_t fdbg_clusters_cal;
   Int_t fdbg_tracks_cal;
 
+  Double_t fAcor;               // Coordinate correction constants
+  Double_t fBcor;
+  Double_t fCcor;
+  Double_t fDcor;
+
   THcShowerPlane** fPlanes;     // [fNLayers] Shower Plane objects
 
   TClonesArray*  fTrackProj;    // projection of track onto plane
@@ -152,11 +161,14 @@ protected:
 
   void Setup(const char* name, const char* description);
 
+  // cluster to track association method.
+
   Int_t MatchCluster(THaTrack*, THcShowerClusterList*, Double_t&, Double_t&);
 
-  friend class THcShowerPlane;
+  friend class THcShowerPlane;   //to access debug flags.
+  //  friend class THcShowerCluster; //to access fNLayers
 
-  ClassDef(THcShower,0)         // Generic class
+  ClassDef(THcShower,0)          // Generic class
 };
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/src/THcShowerCluster.h b/src/THcShowerCluster.h
index 6516a4092c6f88a075ae86d6c573e45acad743da..9f0ff506d480946f2ddb22f4503f808740073a05 100644
--- a/src/THcShowerCluster.h
+++ b/src/THcShowerCluster.h
@@ -3,6 +3,7 @@
 
 //HMS calorimeter hit cluster, version 3.
 
+//#include "THcShower.h"
 #include "THcShowerHit.h"
 
 //HMS calorimeter hit cluster
@@ -87,17 +88,54 @@ class THcShowerCluster : THcShowerHitList {
     return Etot;
   }
 
-  //Energy deposition in the Preshower (1st layer) for a cluster
+  //Energy deposition in the Preshower (1st plane) for a cluster
   //
   Double_t clEpr() {
     Double_t Epr=0.;
     for (THcShowerHitIt it=THcShowerHitList::begin();
 	 it!=THcShowerHitList::end(); it++) {
-      if ((*it)->hitColumn() == 0) Epr += (*it)->hitE();
+      if ((*it)->hitColumn() == 0) {
+	Epr += (*it)->hitE();
+      }
     }
     return Epr;
   }
 
+  //Cluster energy deposition in plane iplane=0,..,3.
+  // side=0 -- from positive PMTs only
+  // side=1 -- from negative PMTs only
+  // side=2 -- from postive and negative PMTs
+  //
+
+  Double_t clEplane(Int_t iplane, Int_t side) {
+
+    if (side!=0&&side!=1||side!=2) {
+      cout << "*** Wrong Side in clEplane:" << side << " ***" << endl;
+      return -1;
+    }
+
+    Double_t Eplane=0.;
+    for (THcShowerHitIt it=THcShowerHitList::begin();
+	 it!=THcShowerHitList::end(); it++) {
+
+      if ((*it)->hitColumn() == iplane) 
+
+	switch (side) {
+	case 0 : Eplane += (*it)->hitEpos();
+	  break;
+	case 1 : Eplane += (*it)->hitEneg();
+	  break;
+	case 2 : Eplane += (*it)->hitE();
+	  break;
+	default : ;
+	}
+
+    }
+
+    return Eplane;
+  }
+
+
   //Cluster size (number of hits in the cluster).
   //
   UInt_t clSize() {
diff --git a/src/THcShowerHit.h b/src/THcShowerHit.h
index 7d31b060593683f807042eb2bd09ff0775927181..76f70d9082a2242b711907353d440082ce114e49 100644
--- a/src/THcShowerHit.h
+++ b/src/THcShowerHit.h
@@ -14,7 +14,9 @@ class THcShowerHit {       //HMS calorimeter hit class
 private:
   UInt_t fCol, fRow;       //hit colomn and row
   Double_t fX, fZ;         //hit X (vert.) and Z (along spect.axis) coordinates
-  Double_t fE;             //hit energy deposition
+  Double_t fE;             //hit mean energy deposition
+  Double_t fEpos;          //hit energy deposition from positive PMT
+  Double_t fEneg;          //hit energy deposition from negative PMT
   
 public:
 
@@ -22,15 +24,19 @@ public:
     fCol=fRow=0;
     fX=fZ=0.;
     fE=0.;
+    fEpos=0.;
+    fEneg=0.;
   }
 
   THcShowerHit(UInt_t hRow, UInt_t hCol, Double_t hX, Double_t hZ,
-	       Double_t hE) {
+	       Double_t hE, Double_t hEpos, Double_t hEneg) {
     fRow=hRow;
     fCol=hCol;
     fX=hX;
     fZ=hZ;
     fE=hE;
+    fEpos=hEpos;
+    fEneg=hEneg;
   }
 
   ~THcShowerHit() {
@@ -57,6 +63,14 @@ public:
     return fE;
   }
 
+  Double_t hitEpos() {
+    return fEpos;
+  }
+
+  Double_t hitEneg() {
+    return fEneg;
+  }
+
   // Decide if a hit is neighbouring the current hit.
   // Two hits are neighbours if share a side or a corner.
   //
@@ -69,8 +83,9 @@ public:
   //Print out hit information
   //
   void show() {
-    cout << "row=" << fRow << "  column=" << fCol << 
-      "  x=" << fX << "  z=" << fZ << "  E=" << fE << endl;
+    cout << "row=" << fRow << "  column=" << fCol 
+	 << "  x=" << fX << "  z=" << fZ 
+	 << "  E=" << fE << "  Epos=" << fEpos << "  Eneg=" << fEneg << endl;
   }
 
 };
diff --git a/src/THcShowerPlane.cxx b/src/THcShowerPlane.cxx
index edafce1319d3be9132c90a425e770bd996f3713a..b90f01d05e3aa9413d07273f9fa33120fb5339fb 100644
--- a/src/THcShowerPlane.cxx
+++ b/src/THcShowerPlane.cxx
@@ -209,6 +209,8 @@ Int_t THcShowerPlane::DefineVariables( EMode mode )
     {"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"},
     { 0 }
   };
 
@@ -296,6 +298,8 @@ Int_t THcShowerPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
   }
 
   fEplane = 0;
+  fEplane_pos = 0;
+  fEplane_neg = 0;
 
   Int_t nrawhits = rawhits->GetLast()+1;
 
@@ -348,6 +352,8 @@ Int_t THcShowerPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
 
     fEmean[hit->fCounter-1] += (fEpos[hit->fCounter-1] + fEneg[hit->fCounter-1]);
     fEplane += fEmean[hit->fCounter-1];
+    fEplane_pos += fEpos[hit->fCounter-1];
+    fEplane_neg += fEneg[hit->fCounter-1];
 
     ihit++;
   }
diff --git a/src/THcShowerPlane.h b/src/THcShowerPlane.h
index eb684108c7cea8c8f05ac04d2f86042b57715016..8b4de6f8e83fc478b16d116bf85ff1f1011033f4 100644
--- a/src/THcShowerPlane.h
+++ b/src/THcShowerPlane.h
@@ -54,10 +54,26 @@ public:
     return fEplane;
   };
 
+  Double_t GetEplane_pos() {
+    return fEplane_pos;
+  };
+
+  Double_t GetEplane_neg() {
+    return fEplane_neg;
+  };
+
   Double_t GetEmean(Int_t i) {
     return fEmean[i];
   };
 
+  Double_t GetEpos(Int_t i) {
+    return fEpos[i];
+  };
+
+  Double_t GetEneg(Int_t i) {
+    return fEneg[i];
+  };
+
   Double_t GetAposP(Int_t i) {
     return fA_Pos_p[i];
   };
@@ -101,6 +117,9 @@ protected:
   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
+  Double_t  fEplane_pos;   // Energy deposition in the plane from positive PMTs
+  Double_t  fEplane_neg;   // Energy deposition in the plane from negative PMTs
+
 
   TClonesArray* fPosADCHits;    // List of positive ADC hits
   TClonesArray* fNegADCHits;    // List of negative ADC hits