diff --git a/CALIBRATION/shms_dc_calib/run_Cal.C b/CALIBRATION/shms_dc_calib/run_Cal.C
index f16ff2ddcbebb32e75532c3be2dcf63e6db0dd6d..eb209b2494f5fb2d3d16f48094996cc7e012b67f 100644
--- a/CALIBRATION/shms_dc_calib/run_Cal.C
+++ b/CALIBRATION/shms_dc_calib/run_Cal.C
@@ -60,6 +60,9 @@ void run_Cal()
  
   //execute code to update pdc parameter file
   // gSystem->Exec("root -l -q update_pdcparam.C");
+  
+  //execute code to update parameter file with new t0 values per wire
+  gSystem->Exec("root -l -q get_tzero_param.C");
 
   //execute code to get t0 corrected drift times
   gSystem->Exec("root -l -q get_pdc_time_histo_tzero_corrected.C");
diff --git a/CALIBRATION/shms_dc_calib/scripts/get_tzero_param.C b/CALIBRATION/shms_dc_calib/scripts/get_tzero_param.C
new file mode 100644
index 0000000000000000000000000000000000000000..6feff232833f4cba58bab84376d515c224c9cf12
--- /dev/null
+++ b/CALIBRATION/shms_dc_calib/scripts/get_tzero_param.C
@@ -0,0 +1,286 @@
+#include <iostream>
+#include <fstream>
+#include <math.h>
+#include <string>
+
+#define NPLANES 12
+
+
+void get_tzero_param()
+{
+
+ //read run number from input file
+  int run_NUM;
+  TString f0 = "input_RUN.txt";
+  ifstream infile(f0);
+  infile >> run_NUM;   
+
+  TString run = Form("run%d", run_NUM);
+
+
+TString planes[NPLANES] = {"1u1","1u2","1x1","1x2","1v1","1v2","2u1","2u2","2x1","2x2","2v1","2v2"};
+
+int fNWires[NPLANES] = {107, 107, 79, 79, 107, 107, 107, 107, 79, 79, 107, 107};
+int group_size[NPLANES] = {7, 7, 5, 5, 7, 7, 7, 7, 5, 5, 7, 7};
+
+int group;
+int sw;
+int ip;
+
+
+  
+//allocate space for calc. of  weighted avg of cable group
+Double_t *sum_NUM; 
+Double_t *sum_DEN; 
+Double_t *weighted_AVG;
+Double_t *weighted_AVG_err;
+
+Int_t *wire;
+Double_t *t0;
+Double_t *t0_err;
+Int_t *entries;
+
+Int_t **dc_group_min;
+Int_t **dc_group_max;
+
+//dynamic allocation of a 2d array in dim. of plane and groups, (depending on which plane, group size is 5 or 7)
+dc_group_min = new Int_t*[NPLANES];
+for (ip=0; ip<NPLANES; ip++){
+  dc_group_min[ip] = new Int_t[group_size[ip]];
+}
+
+
+//Fill the 2d array with 1st sensewire corresponding to each group in a given plane
+ for (ip=0; ip<NPLANES; ip++) {
+
+   dc_group_min[ip][0]=1;  //set initial array value to 1st sensewire in the group
+   for (group=1; group < group_size[ip]; group++){
+ 
+     if (ip==2 || ip==8){
+      //dc_group_min[ip][5] = {1, 17, 33, 49, 65};   //plane 2(1x1) or plane 8(2x1)
+       dc_group_min[ip][group] = dc_group_min[ip][group-1] + 16;
+     }     
+       
+     else if (ip==3 || ip==9){
+       //dc_group_min[ip][5] = {{1, 16, 32, 48, 64}};  //plane 3(1x2) or plane 9(2x2)
+       dc_group_min[ip][1]=16;
+       dc_group_min[ip][group+1] = dc_group_min[ip][group] + 16;
+     }
+          
+     else if(ip==0 || ip==4 || ip==6 || ip ==10){
+       // dc_group_min[ip][7] = {{1, 16, 32, 48, 64, 80, 96}}; //planes: 1u1, 1v1, 2u1, 2v1  
+       dc_group_min[ip][1]=16;
+       dc_group_min[ip][group+1] = dc_group_min[ip][group] + 16;
+     }
+     
+     else if(ip==1 || ip==5 || ip==7 || ip==11){
+       // dc_group_min[ip][7] = {{1, 13, 29, 45, 61, 77, 93}}; //planes 1u2, 1v2, 2u2, 2v2
+       dc_group_min[ip][1]=13;
+       dc_group_min[ip][group+1] = dc_group_min[ip][group] + 16;
+     }
+     
+   }//end loop over groups
+   
+   
+ }//end loop over planes
+
+ //****************************************
+
+ //dynamic allocation of a 2d array in dim. of plane and groups, (depending on which plane, group size is 5 or 7)
+dc_group_max = new Int_t*[NPLANES];
+for (ip=0; ip<NPLANES; ip++){
+  dc_group_max[ip] = new Int_t[group_size[ip]];
+}
+
+//Fill the 2d array with 1st sensewire corresponding to each group in a given plane
+ for (ip=0; ip<NPLANES; ip++) {
+
+   
+   for (group=1; group < group_size[ip]; group++){
+ 
+     if (ip==2 || ip==8){
+      //dc_group_max[ip][5] = {16, 32, 48, 64, 79};   //plane 2(1x1) or plane 8(2x1)
+       dc_group_max[ip][0]=16;
+       dc_group_max[ip][group] = dc_group_max[ip][group-1] + 16;
+     }     
+       
+     else if (ip==3 || ip==9){
+       //dc_group_max[ip][5] = {15, 31, 47, 63, 79}; //plane 3(1x2) or plane 9(2x2)
+       dc_group_max[ip][0]=15;
+       dc_group_max[ip][group] = dc_group_max[ip][group-1] + 16;
+     }
+          
+     else if(ip==0 || ip==4 || ip==6 || ip ==10){
+       // dc_group_max[ip][7] = {15, 31, 47, 63, 79, 95, 107}; //planes: 1u1, 1v1, 2u1, 2v1 
+       dc_group_max[ip][0]=15;
+       dc_group_max[ip][group] = dc_group_max[ip][group-1] + 16;
+     }
+     
+     else if(ip==1 || ip==5 || ip==7 || ip==11){
+       // dc_group_max[ip][7] = {12, 28, 44, 60, 76, 92, 107}; //planes 1u2, 1v2, 2u2, 2v2
+       dc_group_max[ip][0]=12;
+       dc_group_max[ip][group] = dc_group_max[ip][group-1] + 16;
+     }
+     
+   }//end loop over groups
+   
+   
+ }//end loop over planes
+
+
+
+
+
+ //*********************************
+ //sanity check to see if arrays were filled properly!
+ // for (int i=0; i<7; i++) {
+ // cout << dc_group_max[1][i] << endl;
+ // }
+ //note: some planes max values exceeded th ephysical max wire, 
+ //but does not pose any problems when setting the limits
+ //*********************************
+ 
+ 
+ 
+
+  //declare a 2d dynamic arrays to store weighted average per group
+  Double_t** weighted_avg = new Double_t*[NPLANES];
+  Double_t** weighted_avg_err = new Double_t*[NPLANES];
+ 
+ for (ip = 0; ip < NPLANES; ip++) {
+    weighted_avg[ip] = new Double_t[group_size[ip]];
+    weighted_avg_err[ip] = new Double_t[group_size[ip]];
+ }
+  
+  //initialize a 2d dynamic array
+ for (ip=0; ip<NPLANES; ip++) {
+   for (group=0; group<group_size[ip]; group++) {
+     weighted_avg[ip][group] = 0.0;
+     weighted_avg_err[ip][group] = 0.0;
+    }
+  }
+  
+
+//Loop over each plane
+ for(ip=0; ip<NPLANES; ip++) {
+
+
+      
+    wire = new Int_t[fNWires[ip]];
+    t0 = new Double_t[fNWires[ip]];
+    t0_err = new Double_t[fNWires[ip]];
+    entries = new Int_t[fNWires[ip]];
+
+    
+    //open and read each wire tzero file
+    ifstream ifs;
+    ifs.open(Form("../data_files/run%d/hdc_"+planes[ip]+"tzero_run%d_updated.txt", run_NUM, run_NUM ) );
+    
+
+
+    if (ifs.is_open()) {
+      //    cout << "File opened!" << endl;
+      ifs.ignore(50000, '\n');    //ignore the first line 
+      
+      for (sw=0; sw<fNWires[ip]; ++sw) {
+	ifs >> wire[sw] >> t0[sw] >> t0_err[sw] >> entries[sw];
+	//cout
+	//	  << "wire: " << wire[sw] << "  " << endl;
+	//  << "t0: " << t0[sw] << "  "
+	//  << "t0_err: " << t0_err[sw] << "  "
+	//  << "entries: " << entries[sw] << endl;
+      } 
+      ifs.close();
+    }  // ifstream condition
+    else {
+      // cout << "File not opened!" << endl;
+    }
+    
+    //Loop over each ribbon cable group of wires
+    for (group =0; group<group_size[ip]; group++) {
+      
+	//initialize variables
+	double sum_num = 0.0;
+	double sum_den = 0.0;
+	double w_avg = 0.0;
+	double w_avg_err = 0.0;
+
+      for (sw = 1; sw<=fNWires[ip]; sw++) {
+	
+	// compute the sums if the sense wires lie in a given group
+	if (sw >= dc_group_min[ip][group] && sw <= dc_group_max[ip][group] && t0[sw-1]!=0) {
+	  
+	  //calculate numerator and denominator of weighted average for each group
+	 
+	  sum_num = sum_num + t0[sw-1]/(t0_err[sw-1]*t0_err[sw-1]);
+	  sum_den = sum_den + 1.0/(t0_err[sw-1]*t0_err[sw-1]);  
+	 
+	  
+	}
+       
+      } // end loop over sensewires
+    
+      //compute weighted average per ribbon cable group
+      if (sum_den!=0.0) { 
+	w_avg = sum_num / sum_den;
+	w_avg_err = sqrt( 1.0 / sum_den ); 
+	
+	weighted_avg[ip][group] = w_avg; //write weighted average to an array
+	weighted_avg_err[ip][group] = w_avg_err;
+      }
+      
+    } //end loop over groups
+    
+ } //end loop over planes
+
+
+    
+  //Create an output file to store tzero values values 
+  ofstream ofs;
+  TString wire_tzero = Form("./pdc_tzero_per_wire_run%d.param", run_NUM);
+  ofs.open (wire_tzero);
+
+  //loop over planes
+  for (ip = 0; ip < NPLANES; ip++) 
+    {
+      //write plane headers
+      ofs << "ptzero"+planes[ip] << "=" << endl;
+      
+      //loop over group
+      for (group = 0; group < group_size[ip]; group++)
+	{
+	  
+	  //loop over sensewires
+	  for (sw = 1; sw<=fNWires[ip]; sw++) {
+	    
+	    if (sw >= dc_group_min[ip][group] && sw <= dc_group_max[ip][group]) 
+	      {
+	       
+		if (sw<fNWires[ip])
+		  {
+		    ofs << setprecision(7) << weighted_avg[ip][group] << ((sw+1) % 16 ? ", " : "\n") << fixed;
+		  }
+		else {
+		  ofs << setprecision(7) << weighted_avg[ip][group] << fixed << endl;
+		  ofs << endl;
+		}
+	      }
+	    
+	  } // end loop over sensewires
+	  
+	}// end loop over groups 
+    
+    }//end loop over planes
+}
+
+
+      
+      
+ 
+
+    
+    
+   
+
+  
+
diff --git a/CALIBRATION/shms_dc_calib/scripts/get_wire_tzero.C b/CALIBRATION/shms_dc_calib/scripts/get_wire_tzero.C
index 592d9e0653e6ddc354307ca0e0d514919191ff0b..4c31f0d11b67eb0fd9f026ea21305d3ba1bff487 100644
--- a/CALIBRATION/shms_dc_calib/scripts/get_wire_tzero.C
+++ b/CALIBRATION/shms_dc_calib/scripts/get_wire_tzero.C
@@ -8,10 +8,10 @@ a certain number of bins and this fit is extrapolated to y=0(x-axis). The extrap
 #include "TMath.h"
 
 #define NPLANES 12
-
+  using namespace std;
 void get_wire_tzero()
 {
-  using namespace std;
+ 
 
   int run_NUM;
   TString f0 = "input_RUN.txt";
@@ -297,8 +297,8 @@ void get_wire_tzero()
    sum_NUM = 0.0;
    sum_DEN = 0.0;
    
-   weighted_AVG;
-   weighted_AVG_err; 
+   weighted_AVG =0.0 ;
+   weighted_AVG_err= 0.0; 
    
    //read line bt line the t_zero_file
    while(getline(ifs, line)) {
@@ -328,6 +328,8 @@ void get_wire_tzero()
        
      }
      
+     else { ofs << sensewire << "        " << 0.0 << "       " << 0.0 << "        " << entries << endl;}
+     
    }