diff --git a/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZDCDataAnalyzer.cxx b/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZDCDataAnalyzer.cxx
index 8b2ad613a2f6296611e39a5915660bd2b4ec2155..e4f6d1a12ab4c90d742c4496381bdc91e4aa7ded 100644
--- a/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZDCDataAnalyzer.cxx
+++ b/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZDCDataAnalyzer.cxx
@@ -141,6 +141,24 @@ void ZDCDataAnalyzer::enableRepass(const ZDCModuleFloatArray& peak2ndDerivMinRep
   }
 }
 
+void ZDCDataAnalyzer::SetGainFactorsHGLG(float gainFactorHG, float gainFactorLG)
+{
+  for (size_t side : {0, 1}) {
+    for (size_t module : {0, 1, 2, 3}) {
+      m_moduleAnalyzers[side][module]->SetGainFactorsHGLG(gainFactorHG, gainFactorLG);
+    }
+  }
+}
+
+void ZDCDataAnalyzer::SetGainFactorsHGLG(const ZDCModuleFloatArray& gainFactorsHG, const ZDCModuleFloatArray& gainFactorsLG)
+{
+  for (size_t side : {0, 1}) {
+    for (size_t module : {0, 1, 2, 3}) {
+      m_moduleAnalyzers[side][module]->SetGainFactorsHGLG(gainFactorsHG[side][module], gainFactorsLG[side][module]);
+    }
+  }
+}
+
 void ZDCDataAnalyzer::SetPeak2ndDerivMinTolerances(size_t tolerance) {
   for (size_t side : {0, 1}) {
     for (size_t module : {0, 1, 2, 3}) {
diff --git a/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZDCPulseAnalyzer.cxx b/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZDCPulseAnalyzer.cxx
index e094f6fb386520977e30bba8545653d96c8936dd..aec2d62f0f1ff1f787ea2cf468da67039a724dfa 100644
--- a/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZDCPulseAnalyzer.cxx
+++ b/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZDCPulseAnalyzer.cxx
@@ -158,6 +158,11 @@ void ZDCPulseAnalyzer::SetDefaults()
   m_HGUnderflowADC = 20;
   m_LGOverflowADC  = 1000;
 
+  // Default values for the gain factors uswed to match low and high gain
+  //
+  m_gainFactorLG = m_gainHG;
+  m_gainFactorHG = 1;
+
   m_2ndDerivStep = 2;
 
   m_noiseSigHG = 1;
@@ -299,10 +304,14 @@ void ZDCPulseAnalyzer::Reset(bool repass)
   m_samplesDeriv2nd.clear();
 }
 
-void ZDCPulseAnalyzer::SetFitMinMaxAmp(float minAmpHG, float minAmpLG, float maxAmpHG, float maxAmpLG)
+void ZDCPulseAnalyzer::SetGainFactorsHGLG(float gainFactorHG, float gainFactorLG)
 {
-  std::cout << "Setting fit min,max amp values " << minAmpHG << ", " << maxAmpHG << std::endl;
+  m_gainFactorHG = gainFactorHG;
+  m_gainFactorLG = gainFactorLG;
+}
 
+void ZDCPulseAnalyzer::SetFitMinMaxAmp(float minAmpHG, float minAmpLG, float maxAmpHG, float maxAmpLG)
+{
   m_fitAmpMinHG = minAmpHG;
   m_fitAmpMinLG = minAmpLG;
 
@@ -484,7 +493,7 @@ bool ZDCPulseAnalyzer::LoadAndAnalyzeData(const std::vector<float>& ADCSamplesHG
     if (ADCLG > m_LGOverflowADC) {
       m_LGOverflow = true;
       m_fail = true;
-      m_amplitude = m_LGOverflowADC * m_gainHG; // Give a vale here even though we know it's wrong because
+      m_amplitude = m_LGOverflowADC * m_gainFactorLG; // Give a vale here even though we know it's wrong because
       //   the user may not check the return value and we know that
       //   amplitude is bigger than this
     }
@@ -560,7 +569,7 @@ bool ZDCPulseAnalyzer::LoadAndAnalyzeData(const std::vector<float>& ADCSamplesHG
     if (ADCLG > m_LGOverflowADC) {
       m_LGOverflow = true;
       m_fail       = true;
-      m_amplitude  = m_LGOverflowADC * m_gainHG; // Give a value here even though we know it's wrong because
+      m_amplitude  = m_LGOverflowADC * m_gainFactorLG; // Give a value here even though we know it's wrong because
       //   the user may not check the return value and we know that
       //   amplitude is bigger than this
     }
@@ -572,7 +581,7 @@ bool ZDCPulseAnalyzer::LoadAndAnalyzeData(const std::vector<float>& ADCSamplesHG
     if (ADCLGDelay > m_LGOverflowADC) {
       m_LGOverflow = true;
       m_fail       = true;
-      m_amplitude  = 1024 * m_gainHG; // Give a value here even though we know it's wrong because
+      m_amplitude  = 1024 * m_gainFactorLG; // Give a value here even though we know it's wrong because
       //   the user may not check the return value and we know that
       //   amplitude is bigger than this
     }
@@ -683,16 +692,16 @@ bool ZDCPulseAnalyzer::DoAnalysis(bool repass)
       //
       // Multiply amplitude by gain factor
       //
-      m_amplitude     = m_fitAmplitude * m_gainHG;
-      m_ampError      = m_fitAmpError  * m_gainHG;
-      m_preSampleAmp  = m_preSample    * m_gainHG;
-      m_preAmplitude  = m_fitPreAmp    * m_gainHG;
-      m_postAmplitude = m_fitPostAmp   * m_gainHG;
-      m_expAmplitude  = m_fitExpAmp    * m_gainHG;
+      m_amplitude     = m_fitAmplitude * m_gainFactorLG;
+      m_ampError      = m_fitAmpError  * m_gainFactorLG;
+      m_preSampleAmp  = m_preSample    * m_gainFactorLG;
+      m_preAmplitude  = m_fitPreAmp    * m_gainFactorLG;
+      m_postAmplitude = m_fitPostAmp   * m_gainFactorLG;
+      m_expAmplitude  = m_fitExpAmp    * m_gainFactorLG;
 
       // BAC: also scale up the 2nd derivative so low and high gain can be treated on the same footing
       //
-      m_minDeriv2nd *= m_gainHG;
+      m_minDeriv2nd *= m_gainFactorLG;
     }
 
     return result;
@@ -713,12 +722,14 @@ bool ZDCPulseAnalyzer::DoAnalysis(bool repass)
         }
       }
 
-      m_preSampleAmp = m_preSample;
-      m_amplitude = m_fitAmplitude;
-      m_ampError = m_fitAmpError;
-      m_preAmplitude  = m_fitPreAmp;
-      m_postAmplitude = m_fitPostAmp;
-      m_expAmplitude  = m_fitExpAmp;
+      m_preSampleAmp = m_preSample  * m_gainFactorHG;
+      m_amplitude = m_fitAmplitude  * m_gainFactorHG;
+      m_ampError = m_fitAmpError    * m_gainFactorHG;
+      m_preAmplitude  = m_fitPreAmp * m_gainFactorHG;
+      m_postAmplitude = m_fitPostAmp* m_gainFactorHG;
+      m_expAmplitude  = m_fitExpAmp * m_gainFactorHG;
+
+      m_minDeriv2nd *= m_gainFactorHG;
 
       //  If we have a non-linear correction, apply it here
       //
diff --git a/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZdcAnalysisTool.cxx b/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZdcAnalysisTool.cxx
index 2ae74c23fd4a4e4847b5ea95642deab6d3842cd5..2b389640b9db8ad006fb4d27d16a8556420e972c 100644
--- a/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZdcAnalysisTool.cxx
+++ b/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZdcAnalysisTool.cxx
@@ -196,26 +196,32 @@ std::unique_ptr<ZDCDataAnalyzer> ZdcAnalysisTool::initializeLHCf2022()
   m_deltaTSample = 3.125;
   m_numSample = 24;
 
-  ZDCDataAnalyzer::ZDCModuleFloatArray tau1, tau2, peak2ndDerivMinSamples, t0;
+  ZDCDataAnalyzer::ZDCModuleFloatArray peak2ndDerivMinSamples;
   ZDCDataAnalyzer::ZDCModuleFloatArray peak2ndDerivMinThresholdsHG, peak2ndDerivMinThresholdsLG;
   ZDCDataAnalyzer::ZDCModuleFloatArray deltaT0CutLow, deltaT0CutHigh, chisqDivAmpCut;
   ZDCDataAnalyzer::ZDCModuleBoolArray fixTau1Arr, fixTau2Arr;
   
+  ZDCDataAnalyzer::ZDCModuleFloatArray tau1 = {0, 1.3, 0.9, 1.0,
+  					       0, 1.2, 1.3, 1.35};
+
+  ZDCDataAnalyzer::ZDCModuleFloatArray tau2 = {4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5};
+
+  ZDCDataAnalyzer::ZDCModuleFloatArray t0HG = {0, 26.3, 26.5, 26.8, 32, 32, 32, 32};
+					       
+  ZDCDataAnalyzer::ZDCModuleFloatArray t0LG = {0, 26.3, 26.5, 26.8, 0, 26.6, 26.3, 25.3};
+
   for (size_t side : {0, 1}) {
     for (size_t module : {0, 1, 2, 3}) {
-      fixTau1Arr[side][module] = false;
+      fixTau1Arr[side][module] = true;
       fixTau2Arr[side][module] = false;
-      tau1[side][module] = 1;
-      tau2[side][module] = 4.5;
       
       peak2ndDerivMinSamples[side][module] = 10;
-      peak2ndDerivMinThresholdsHG[side][module] = -12;
-      peak2ndDerivMinThresholdsLG[side][module] = -10;
+      peak2ndDerivMinThresholdsHG[side][module] = -35;
+      peak2ndDerivMinThresholdsLG[side][module] = -20;
       
-      t0[side][module] = 32;
-      deltaT0CutLow[side][module] = -100;
-      deltaT0CutHigh[side][module] = 100;
-      chisqDivAmpCut[side][module] = 500;
+      deltaT0CutLow[side][module] = -10;
+      deltaT0CutHigh[side][module] = 10;
+      chisqDivAmpCut[side][module] = 50;
     }
   }
   
@@ -225,20 +231,41 @@ std::unique_ptr<ZDCDataAnalyzer> ZdcAnalysisTool::initializeLHCf2022()
   ZDCDataAnalyzer::ZDCModuleFloatArray HGUnderFlowADC = {{{{1, 1, 1, 1}}, {{1, 1, 1, 1}}}};
   ZDCDataAnalyzer::ZDCModuleFloatArray LGOverFlowADC = {{{{4000, 4000, 4000, 4000}}, {{4000, 4000, 4000, 4000}}}};
   
+  // For the LHCf run, use low gain samples 
+  //
+  m_lowGainOnly = true;
+
   //  Construct the data analyzer
   //
   std::unique_ptr<ZDCDataAnalyzer> zdcDataAnalyzer (new ZDCDataAnalyzer(MakeMessageFunction(),
 									m_numSample, m_deltaTSample, 
-									m_presample, "FermiExp", 
+									m_presample, "FermiExpRun3", 
 									peak2ndDerivMinSamples,
 									peak2ndDerivMinThresholdsHG, 
 									peak2ndDerivMinThresholdsLG, 
-									m_lowGainOnly)); // last parameter is lowGainOnly
+									m_lowGainOnly)); 
+
   zdcDataAnalyzer->SetPeak2ndDerivMinTolerances(4);
   zdcDataAnalyzer->SetADCOverUnderflowValues(HGOverFlowADC, HGUnderFlowADC, LGOverFlowADC);
-  zdcDataAnalyzer->SetTauT0Values(fixTau1Arr, fixTau2Arr, tau1, tau2, t0, t0);
+  zdcDataAnalyzer->SetTauT0Values(fixTau1Arr, fixTau2Arr, tau1, tau2, t0HG, t0LG);
   zdcDataAnalyzer->SetCutValues(chisqDivAmpCut, chisqDivAmpCut, deltaT0CutLow, deltaT0CutHigh, deltaT0CutLow, deltaT0CutHigh);
 
+  zdcDataAnalyzer->SetGainFactorsHGLG(0.1, 1); // a gain adjustment of unity applied to LG ADC, 0.1 to HG ADC values
+
+  ZDCDataAnalyzer::ZDCModuleFloatArray noiseSigmasLG = {2, 2, 2, 2, 2, 2, 2, 2};
+  ZDCDataAnalyzer::ZDCModuleFloatArray noiseSigmasHG = {20, 20, 20, 20, 20, 20, 20, 20};
+
+  zdcDataAnalyzer->SetNoiseSigmas(noiseSigmasHG, noiseSigmasLG);
+
+  // Enable two-pass analysis
+  // 
+  ZDCDataAnalyzer::ZDCModuleFloatArray peak2ndDerivMinRepassHG = {-10, -10, -10, -10,
+								  -10, -10, -10, -10};
+
+  ZDCDataAnalyzer::ZDCModuleFloatArray peak2ndDerivMinRepassLG = {-6, -6, -6, -6,
+								  -6, -6, -6, -6};
+
+  zdcDataAnalyzer->enableRepass(peak2ndDerivMinRepassHG, peak2ndDerivMinRepassLG);
 
   // Set the amplitude fit range limits
   //
@@ -1093,6 +1120,7 @@ StatusCode ZdcAnalysisTool::recoZdcModules(const xAOD::ZdcModuleContainer& modul
             zdcModule->auxdecor<float>("PreSampleAmp" + m_auxSuffix) = pulseAna_p->GetPreSampleAmp();
             zdcModule->auxdecor<float>("Presample" + m_auxSuffix) = pulseAna_p->GetPresample();
             zdcModule->auxdecor<float>("MinDeriv2nd" + m_auxSuffix) = pulseAna_p->GetMinDeriv2nd();
+            zdcModule->auxdecor<float>("MaxADC" + m_auxSuffix) = pulseAna_p->GetMaxADC();
 
         }
         ATH_MSG_DEBUG ("side = " << side << " module=" << zdcModule->zdcModule() << " CalibEnergy=" << zdcModule->auxdecor<float>("CalibEnergy")
@@ -1105,7 +1133,7 @@ StatusCode ZdcAnalysisTool::recoZdcModules(const xAOD::ZdcModuleContainer& modul
 
     for (const auto zdc_sum: moduleSumContainer)
       {
-	int iside = zdc_sum->zdcSide();
+	    int iside = (zdc_sum->zdcSide()==-1) ? 0 : 1;
 
         float calibEnergy = getCalibModuleSum(iside);
         zdc_sum->auxdecor<float>("CalibEnergy"+m_auxSuffix) = calibEnergy;
diff --git a/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/ZDCDataAnalyzer.h b/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/ZDCDataAnalyzer.h
index e0d3e222dc1d969f9f58b72477208c89f19ef66b..a73c6c33d05d752f878022700193610f827d8155 100644
--- a/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/ZDCDataAnalyzer.h
+++ b/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/ZDCDataAnalyzer.h
@@ -122,6 +122,10 @@ public:
 
   bool disableModule(size_t side, size_t module);
 
+  void SetGainFactorsHGLG(float gainFactorHG, float gainFactorLG);
+
+  void SetGainFactorsHGLG(const ZDCModuleFloatArray& gainFactorsHG, const ZDCModuleFloatArray& gainFactorsLG); 
+
   void SetPeak2ndDerivMinTolerances(size_t tolerance);
 
   void SetFitTimeMax(float tmax);
diff --git a/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/ZDCPulseAnalyzer.h b/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/ZDCPulseAnalyzer.h
index f0c2ace1d5005c0649573794f794f53d2ea8575e..78fdf5e60f48899c3eb88e6cc52043ce1da331a2 100644
--- a/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/ZDCPulseAnalyzer.h
+++ b/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/ZDCPulseAnalyzer.h
@@ -362,6 +362,8 @@ public:
     m_noiseSigLG = noiseSigLG;
   }
 
+  void SetGainFactorsHGLG(float gainFactorHG, float gainFactorLG); 
+
   void SetFitMinMaxAmp(float minAmpHG, float minAmpLG, float maxAmpHG, float maxAmpLG);
 
   void SetTauT0Values(bool fixTau1, bool fixTau2, float tau1, float tau2, float t0HG, float t0LG);
diff --git a/ForwardDetectors/ZDC/ZdcRec/src/ZdcRecChannelToolLucrod.cxx b/ForwardDetectors/ZDC/ZdcRec/src/ZdcRecChannelToolLucrod.cxx
index c1332abfd6383d47760417508325ce4482f9781c..30a15edbeaad751062da115a88428b080a95ba44 100644
--- a/ForwardDetectors/ZDC/ZdcRec/src/ZdcRecChannelToolLucrod.cxx
+++ b/ForwardDetectors/ZDC/ZdcRec/src/ZdcRecChannelToolLucrod.cxx
@@ -157,7 +157,7 @@ int ZdcRecChannelToolLucrod::convertLucrod2ZM(const ZdcLucrodDataContainer* lucr
 	    {
 	      xAOD::ZdcModule* new_sum = new xAOD::ZdcModule();
 	      zdcSums->push_back(xAOD::ZdcModuleContainer::unique_type(new_sum));
-	      new_sum->setZdcSide(iside);
+	      new_sum->setZdcSide((iside==0) ? -1 : 1);
 	      new_sum->auxdata<uint16_t>("LucrodTriggerSideAmp") = (iside==0) ? zld->GetTrigAvgC() : zld->GetTrigAvgA();
 	    }
 	}