diff --git a/PhysicsAnalysis/TrackingID/InDetTrackSystematicsTools/InDetTrackSystematicsTools/InDetTrackSmearingTool.h b/PhysicsAnalysis/TrackingID/InDetTrackSystematicsTools/InDetTrackSystematicsTools/InDetTrackSmearingTool.h
index e9b231a4f35446e549e55b039c4dafb4053a86d9..60f9afd514678192585265106ff76bf00ed3c903 100644
--- a/PhysicsAnalysis/TrackingID/InDetTrackSystematicsTools/InDetTrackSystematicsTools/InDetTrackSmearingTool.h
+++ b/PhysicsAnalysis/TrackingID/InDetTrackSystematicsTools/InDetTrackSystematicsTools/InDetTrackSmearingTool.h
@@ -64,6 +64,10 @@ namespace InDet {
     virtual CP::SystematicCode applySystematicVariation( const CP::SystematicSet& );
 
   private:
+
+    StatusCode initHistograms(int runNumber);
+    StatusCode firstCall();
+
     /// Get smearing widths to add to IPs
     float GetSmearD0Sigma(const xAOD::TrackParticle&);
     float GetSmearZ0Sigma(const xAOD::TrackParticle&);
@@ -100,8 +104,9 @@ namespace InDet {
     std::string m_calibFileZ0Dead;
     
     std::string m_calibFileIP_lowpt;
-    std::string m_calibFileIP_highpt;
-    std::string m_MCSubcampaign;
+    std::string m_calibFileIP_highpt_Data16;
+    std::string m_calibFileIP_highpt_Data17;
+    uint32_t m_runNumber = 0;
      
   }; /// class InDetTrackSmearingTool
 
diff --git a/PhysicsAnalysis/TrackingID/InDetTrackSystematicsTools/Root/InDetTrackSmearingTool.cxx b/PhysicsAnalysis/TrackingID/InDetTrackSystematicsTools/Root/InDetTrackSmearingTool.cxx
index 0d5ff79cff54dcae909495f61d5252b0241efdf7..ea31ddcbbe72dfc7ff8d1586a5cf04f80f99b155 100644
--- a/PhysicsAnalysis/TrackingID/InDetTrackSystematicsTools/Root/InDetTrackSmearingTool.cxx
+++ b/PhysicsAnalysis/TrackingID/InDetTrackSystematicsTools/Root/InDetTrackSmearingTool.cxx
@@ -62,8 +62,9 @@ namespace InDet {
     declareProperty("calibFileZ0Dead", m_calibFileZ0Dead = "InDetTrackSystematicsTools/CalibData_21.2_2018-v18/res_diff_z0_vs_pt.hist.root");
 
     declareProperty("calibFileIP_lowpt", m_calibFileIP_lowpt = "InDetTrackSystematicsTools/CalibData_21.2_2018-v18/trackIPAlign_dec2017.root");
-    declareProperty("calibFileIP_highpt", m_calibFileIP_highpt = "");
-    declareProperty("MCSubcampaign", m_MCSubcampaign = "MC16a");
+    declareProperty("calibFileIP_highpt_Data16", m_calibFileIP_highpt_Data16 = "InDetTrackSystematicsTools/CalibData_21.2_2018-v18/trackIPAlignTight.root");
+    declareProperty("calibFileIP_highpt_Data17", m_calibFileIP_highpt_Data17 = "InDetTrackSystematicsTools/CalibData_21.2_2018-v19/trackIPAlignTight_data2017.root");
+    declareProperty("runNumber", m_runNumber);
   }
     
 
@@ -71,35 +72,6 @@ namespace InDet {
 
     // Greet the user:
     ATH_MSG_INFO( "Initializing..." );
-    
-    // use a different highpt smearing map depending on the MC sub-campaign
-    if (m_MCSubcampaign == "MC16a" && m_calibFileIP_highpt == "") {
-      ATH_MSG_INFO( "Using default MC16a smearing map configuration for pT > 15 GeV" );
-      m_calibFileIP_highpt = "InDetTrackSystematicsTools/CalibData_21.2_2018-v18/trackIPAlignTight.root";
-    } else if ((m_MCSubcampaign == "MC16c" || m_MCSubcampaign == "MC16d") && m_calibFileIP_highpt == "") {
-      ATH_MSG_INFO( "Using default MC16c/d smearing map configuration for pT > 15 GeV" );
-      m_calibFileIP_highpt = "InDetTrackSystematicsTools/CalibData_21.2_2018-v19/trackIPAlignTight_data2017.root";
-    } else {
-      ATH_MSG_ERROR( "Unrecognized MCSubcampaign" );
-      return StatusCode::FAILURE;
-    }
-
-    ATH_CHECK( initObject<TH1>(m_smearD0Dead, m_calibFileD0Dead, "res_pt_d0_0") );
-    ATH_CHECK( initObject<TH1>(m_smearZ0Dead, m_calibFileZ0Dead, "res_pt_z0_0") );
-
-    ATH_CHECK( initObject<TH2>(m_smearD0_lowpt, m_calibFileIP_lowpt, "d0quaddiff_comb_Pt_Eta" ) );
-    ATH_CHECK( initObject<TH2>(m_smearZ0_lowpt, m_calibFileIP_lowpt, "z0quaddiff_comb_Pt_Eta" ) );
-    ATH_CHECK( initObject<TH2>(m_smearD0_lowpt_sys_up, m_calibFileIP_lowpt, "d0quaddiff_comb_Pt_Eta_sys_up" ) );
-    ATH_CHECK( initObject<TH2>(m_smearZ0_lowpt_sys_up, m_calibFileIP_lowpt, "z0quaddiff_comb_Pt_Eta_sys_up" ) );
-    ATH_CHECK( initObject<TH2>(m_smearD0_lowpt_sys_dw, m_calibFileIP_lowpt, "d0quaddiff_comb_Pt_Eta_sys_dw" ) );
-    ATH_CHECK( initObject<TH2>(m_smearZ0_lowpt_sys_dw, m_calibFileIP_lowpt, "z0quaddiff_comb_Pt_Eta_sys_dw" ) );
-
-    ATH_CHECK( initObject<TH2>(m_smearD0_highpt, m_calibFileIP_highpt, "quad_diff/d0quaddiff_comb_Pt_Eta" ) );
-    ATH_CHECK( initObject<TH2>(m_smearZ0_highpt, m_calibFileIP_highpt, "quad_diff/z0quaddiff_comb_Pt_Eta" ) );
-    ATH_CHECK( initObject<TH2>(m_smearD0_highpt_sys_up, m_calibFileIP_highpt, "quad_diff/d0quaddiff_comb_Pt_Eta_sys_up" ) );
-    ATH_CHECK( initObject<TH2>(m_smearZ0_highpt_sys_up, m_calibFileIP_highpt, "quad_diff/z0quaddiff_comb_Pt_Eta_sys_up" ) );
-    ATH_CHECK( initObject<TH2>(m_smearD0_highpt_sys_dw, m_calibFileIP_highpt, "quad_diff/d0quaddiff_comb_Pt_Eta_sys_dw" ) );
-    ATH_CHECK( initObject<TH2>(m_smearZ0_highpt_sys_dw, m_calibFileIP_highpt, "quad_diff/z0quaddiff_comb_Pt_Eta_sys_dw" ) );
 
     ATH_MSG_INFO( "Using seed of " << m_seed << " to initialize RNG" );
     m_rnd = make_unique<TRandom3>(m_seed);
@@ -107,7 +79,8 @@ namespace InDet {
     ATH_MSG_INFO( "Using for TRK_RES_D0_DEAD case the calibration file " << PathResolverFindCalibFile(m_calibFileD0Dead) );
     ATH_MSG_INFO( "Using for TRK_RES_Z0_DEAD case the calibration file " << PathResolverFindCalibFile(m_calibFileZ0Dead) );
     ATH_MSG_INFO( "Using for all other cases the low pT (< 15 GeV) calibration file " << PathResolverFindCalibFile(m_calibFileIP_lowpt) );
-    ATH_MSG_INFO( "Using for all other cases the high pT (> 15 GeV) calibration file " << PathResolverFindCalibFile(m_calibFileIP_highpt) );
+    ATH_MSG_INFO( "Using for all other cases the high pT (> 15 GeV) Data16 calibration file " << PathResolverFindCalibFile(m_calibFileIP_highpt_Data16) );
+    ATH_MSG_INFO( "Using for all other cases the high pT (> 15 GeV) Data17 calibration file " << PathResolverFindCalibFile(m_calibFileIP_highpt_Data17) );
 
     // do common initialization (at time of writing, register affecting systematics)
     ATH_CHECK( InDetTrackSystematicsTool::initialize() );
@@ -257,6 +230,15 @@ namespace InDet {
   }
  
   CP::CorrectionCode InDetTrackSmearingTool::applyCorrection( xAOD::TrackParticle& track ) {
+
+    static bool firstTime = true;
+    if (firstTime) {
+      firstTime = false; // don't try to do this again
+      if ( ! firstCall().isSuccess() ) { // this will check the run number
+        return CP::CorrectionCode::Error;
+      }
+    }
+
     float sigmaD0 = GetSmearD0Sigma( track );
     float sigmaZ0 = GetSmearZ0Sigma( track );
 
@@ -270,6 +252,69 @@ namespace InDet {
     return CP::CorrectionCode::Ok;
   }
 
+  StatusCode InDetTrackSmearingTool::initHistograms(int runNumber)
+  {
+
+    // For now, the Dead and lowpt histograms can be initialized without knowing the run number
+    ATH_CHECK( initObject<TH1>(m_smearD0Dead, m_calibFileD0Dead, "res_pt_d0_0") );
+    ATH_CHECK( initObject<TH1>(m_smearZ0Dead, m_calibFileZ0Dead, "res_pt_z0_0") );
+
+    ATH_CHECK( initObject<TH2>(m_smearD0_lowpt, m_calibFileIP_lowpt, "d0quaddiff_comb_Pt_Eta" ) );
+    ATH_CHECK( initObject<TH2>(m_smearZ0_lowpt, m_calibFileIP_lowpt, "z0quaddiff_comb_Pt_Eta" ) );
+    ATH_CHECK( initObject<TH2>(m_smearD0_lowpt_sys_up, m_calibFileIP_lowpt, "d0quaddiff_comb_Pt_Eta_sys_up" ) );
+    ATH_CHECK( initObject<TH2>(m_smearZ0_lowpt_sys_up, m_calibFileIP_lowpt, "z0quaddiff_comb_Pt_Eta_sys_up" ) );
+    ATH_CHECK( initObject<TH2>(m_smearD0_lowpt_sys_dw, m_calibFileIP_lowpt, "d0quaddiff_comb_Pt_Eta_sys_dw" ) );
+    ATH_CHECK( initObject<TH2>(m_smearZ0_lowpt_sys_dw, m_calibFileIP_lowpt, "z0quaddiff_comb_Pt_Eta_sys_dw" ) );
+
+    string rootfileName_highpt;
+    if (runNumber <= 0) {
+      ATH_MSG_WARNING( "Run number not set." );
+    }
+    if (runNumber >= 311481 && runNumber <= 341649) {
+      ATH_MSG_INFO( "Using the Data17 smearing maps for highpt" );
+      rootfileName_highpt = m_calibFileIP_highpt_Data17;
+    } else {
+      ATH_MSG_INFO( "Using the Data16 smearing maps for highpt" );
+      rootfileName_highpt = m_calibFileIP_highpt_Data16;
+    }
+
+    ATH_CHECK( initObject<TH2>(m_smearD0_highpt, rootfileName_highpt, "quad_diff/d0quaddiff_comb_Pt_Eta" ) );
+    ATH_CHECK( initObject<TH2>(m_smearZ0_highpt, rootfileName_highpt, "quad_diff/z0quaddiff_comb_Pt_Eta" ) );
+    ATH_CHECK( initObject<TH2>(m_smearD0_highpt_sys_up, rootfileName_highpt, "quad_diff/d0quaddiff_comb_Pt_Eta_sys_up" ) );
+    ATH_CHECK( initObject<TH2>(m_smearZ0_highpt_sys_up, rootfileName_highpt, "quad_diff/z0quaddiff_comb_Pt_Eta_sys_up" ) );
+    ATH_CHECK( initObject<TH2>(m_smearD0_highpt_sys_dw, rootfileName_highpt, "quad_diff/d0quaddiff_comb_Pt_Eta_sys_dw" ) );
+    ATH_CHECK( initObject<TH2>(m_smearZ0_highpt_sys_dw, rootfileName_highpt, "quad_diff/z0quaddiff_comb_Pt_Eta_sys_dw" ) );
+
+    return StatusCode::SUCCESS;
+  }
+
+  StatusCode InDetTrackSmearingTool::firstCall()
+  {
+
+    const xAOD::EventInfo* ei = nullptr;
+    auto sc = evtStore()->retrieve( ei, "EventInfo" );
+    if ( ! sc.isSuccess() ) {
+      if (m_runNumber <= 0) {
+        ATH_MSG_ERROR( "Unable to retrieve from event store. Manually set run number." );
+        return CP::CorrectionCode::Error;
+      }
+    }
+
+    auto runNumber = ei->runNumber();
+    if (m_runNumber > 0) {
+      if ( m_runNumber != runNumber ) {
+        ATH_MSG_WARNING( "Manually-set run number (" << m_runNumber <<
+                         ") does not match that from the event store (" << runNumber << ")." );
+        ATH_MSG_WARNING( "Will use the manually set run number, but you must make sure this is the desired behaviour!" );
+      }
+      runNumber = m_runNumber;
+    }
+    if ( ! initHistograms( runNumber ).isSuccess() ) {
+      return StatusCode::FAILURE;
+    }
+    return StatusCode::SUCCESS;
+  }
+
   CP::CorrectionCode InDetTrackSmearingTool::correctedCopy( const xAOD::TrackParticle& in,
 							    xAOD::TrackParticle*& out )
   {