27   InDetTrackBiasingTool::InDetTrackBiasingTool(
const std::string& 
name) :
 
   28     InDetTrackSystematicsTool(
name)
 
   31 #ifndef XAOD_STANDALONE 
   32     declareInterface<IInDetTrackBiasingTool>(
this);
 
   35     declareProperty(
"biasD0", m_biasD0);
 
   36     declareProperty(
"biasZ0", m_biasZ0);
 
   37     declareProperty(
"biasQoverPsagitta", m_biasQoverPsagitta);
 
   38     declareProperty(
"runNumber", m_runNumber);
 
   39     declareProperty(
"isData", m_isData);
 
   40     declareProperty(
"isSimulation", m_isSimulation);
 
   42     declareProperty(
"calibFileData15", m_calibFileData15 = 
"InDetTrackSystematicsTools/CalibData_22.0_2022-v00/REL22_REPRO_2015.root");
 
   43     declareProperty(
"calibFileData16_1stPart", m_calibFileData16_1stPart = 
"InDetTrackSystematicsTools/CalibData_22.0_2022-v00/REL22_REPRO_2016_1stPart.root");
 
   44     declareProperty(
"calibFileData16_2ndPart", m_calibFileData16_2ndPart = 
"InDetTrackSystematicsTools/CalibData_22.0_2022-v00/REL22_REPRO_2016_2ndPart.root");
 
   45     declareProperty(
"calibFileData17_1stPart", m_calibFileData17_1stPart = 
"InDetTrackSystematicsTools/CalibData_22.0_2022-v00/REL22_REPRO_2017_1stPart.root");
 
   46     declareProperty(
"calibFileData17_2ndPart", m_calibFileData17_2ndPart = 
"InDetTrackSystematicsTools/CalibData_22.0_2022-v00/REL22_REPRO_2017_2ndPart.root");
 
   47     declareProperty(
"calibFileData18_1stPart", m_calibFileData18_1stPart = 
"InDetTrackSystematicsTools/CalibData_22.0_2022-v00/REL22_REPRO_2018_1stPart.root");
 
   48     declareProperty(
"calibFileData18_2stPart", m_calibFileData18_2ndPart = 
"InDetTrackSystematicsTools/CalibData_22.0_2022-v00/REL22_REPRO_2018_2ndPart.root");
 
   56     if (m_isData && m_isSimulation) {
 
   57       ATH_MSG_ERROR( 
"Cannot manually set for both data and simulation!" );
 
   58       return StatusCode::FAILURE;
 
   63         << 
" mm (not part of an official recommendation)" );
 
   67         << 
" mm (not part of an official recommendation)" );
 
   69     if (m_biasQoverPsagitta != 0.) {
 
   70       ATH_MSG_INFO( 
"overall QoverP sagitta bias added = " << m_biasQoverPsagitta
 
   71         << 
" TeV^-1 (not part of an official recommendation)" );
 
   74     if (m_runNumber > 0) {
 
   75       ATH_MSG_WARNING( 
"Using manually-set run number (" << m_runNumber << 
") to determine which calibration file to use." );
 
   82     return StatusCode::SUCCESS;
 
   85   InDetTrackBiasingTool::~InDetTrackBiasingTool() {
 
   91     [[maybe_unused]] 
static const bool firstTime = [&]() {
 
   92       if ( ! firstCall().isSuccess() ) { 
 
   93         throw std::runtime_error(
"Error calling InDetTrackBiasingTool::firstCall");
 
   99     TH2* biasD0Histogram = 
nullptr;
 
  100     TH2* biasZ0Histogram = 
nullptr;
 
  101     TH2* biasQoverPsagittaHistogram = 
nullptr;
 
  102     TH2* biasD0HistError = 
nullptr;
 
  103     TH2* biasZ0HistError = 
nullptr;
 
  104     TH2* biasQoverPsagittaHistError = 
nullptr;
 
  114     if (m_runNumber > 0) { 
 
  116     } 
else if (m_isSimulation && randomRunNumber.
isAvailable(*eventInfo)) { 
 
  117       runNumber = randomRunNumber(*(eventInfo));
 
  126       ATH_MSG_INFO( 
"Calibrating for 2015 HI and 5 TeV pp runs (286282 to 287931)." );
 
  127       ATH_MSG_ERROR( 
"The 5 TeV and heavy ion runs do not have biasing maps for release 22. " 
  128          "Contact the tracking CP group to discuss the derivation of these maps." );
 
  132         biasD0Histogram = m_data15_biasD0Histogram.get();
 
  133         biasZ0Histogram = m_data15_biasZ0Histogram.get();
 
  134         biasQoverPsagittaHistogram = m_data15_biasQoverPsagittaHistogram.get();
 
  135         biasD0HistError = m_data15_biasD0HistError.get();
 
  136         biasZ0HistError = m_data15_biasZ0HistError.get();
 
  137         biasQoverPsagittaHistError = m_data15_biasQoverPsagittaHistError.get();
 
  139         biasD0Histogram = m_data16_1stPart_biasD0Histogram.get();
 
  140         biasZ0Histogram = m_data16_1stPart_biasZ0Histogram.get();
 
  141         biasQoverPsagittaHistogram = m_data16_1stPart_biasQoverPsagittaHistogram.get();
 
  142         biasD0HistError = m_data16_1stPart_biasD0HistError.get();
 
  143         biasZ0HistError = m_data16_1stPart_biasZ0HistError.get();
 
  144         biasQoverPsagittaHistError = m_data16_1stPart_biasQoverPsagittaHistError.get();
 
  146         biasD0Histogram = m_data16_2ndPart_biasD0Histogram.get();
 
  147         biasZ0Histogram = m_data16_2ndPart_biasZ0Histogram.get();
 
  148         biasQoverPsagittaHistogram = m_data16_2ndPart_biasQoverPsagittaHistogram.get();
 
  149         biasD0HistError = m_data16_2ndPart_biasD0HistError.get();
 
  150         biasZ0HistError = m_data16_2ndPart_biasZ0HistError.get();
 
  151         biasQoverPsagittaHistError = m_data16_2ndPart_biasQoverPsagittaHistError.get();
 
  153         biasD0Histogram = m_data17_1stPart_biasD0Histogram.get();
 
  154         biasZ0Histogram = m_data17_1stPart_biasZ0Histogram.get();
 
  155         biasQoverPsagittaHistogram = m_data17_1stPart_biasQoverPsagittaHistogram.get();
 
  156         biasD0HistError = m_data17_1stPart_biasD0HistError.get();
 
  157         biasZ0HistError = m_data17_1stPart_biasZ0HistError.get();
 
  158         biasQoverPsagittaHistError = m_data17_1stPart_biasQoverPsagittaHistError.get();
 
  160         biasD0Histogram = m_data17_2ndPart_biasD0Histogram.get();
 
  161         biasZ0Histogram = m_data17_2ndPart_biasZ0Histogram.get();
 
  162         biasQoverPsagittaHistogram = m_data17_2ndPart_biasQoverPsagittaHistogram.get();
 
  163         biasD0HistError = m_data17_2ndPart_biasD0HistError.get();
 
  164         biasZ0HistError = m_data17_2ndPart_biasZ0HistError.get();
 
  165         biasQoverPsagittaHistError = m_data17_2ndPart_biasQoverPsagittaHistError.get();
 
  167         biasD0Histogram = m_data18_1stPart_biasD0Histogram.get();
 
  168         biasZ0Histogram = m_data18_1stPart_biasZ0Histogram.get();
 
  169         biasQoverPsagittaHistogram = m_data18_1stPart_biasQoverPsagittaHistogram.get();
 
  170         biasD0HistError = m_data18_1stPart_biasD0HistError.get();
 
  171         biasZ0HistError = m_data18_1stPart_biasZ0HistError.get();
 
  172         biasQoverPsagittaHistError = m_data18_1stPart_biasQoverPsagittaHistError.get();
 
  174         biasD0Histogram = m_data18_2ndPart_biasD0Histogram.get();
 
  175         biasZ0Histogram = m_data18_2ndPart_biasZ0Histogram.get();
 
  176         biasQoverPsagittaHistogram = m_data18_2ndPart_biasQoverPsagittaHistogram.get();
 
  177         biasD0HistError = m_data18_2ndPart_biasD0HistError.get();
 
  178         biasZ0HistError = m_data18_2ndPart_biasZ0HistError.get();
 
  179         biasQoverPsagittaHistError = m_data18_2ndPart_biasQoverPsagittaHistError.get();
 
  187     m_doD0Bias = biasD0Histogram != 
nullptr;
 
  188     m_doZ0Bias = biasZ0Histogram != 
nullptr;
 
  189     m_doQoverPBias = biasQoverPsagittaHistogram != 
nullptr;
 
  193     if (!m_doQoverPBias) 
ATH_MSG_WARNING( 
"Will not perform q/p sagitta bias." );
 
  205       bool d0WmActive = isActive( TRK_BIAS_D0_WM );
 
  206       if ( m_isData || d0WmActive ) {
 
  207         accD0( 
track ) += readHistogram(m_biasD0, biasD0Histogram, 
phi, 
eta);
 
  208         if ( m_isData && d0WmActive ) {
 
  209           accD0( 
track ) += readHistogram(0., biasD0HistError, 
phi, 
eta);
 
  214       bool z0WmActive = isActive( TRK_BIAS_Z0_WM );
 
  215       if ( m_isData || z0WmActive ) {
 
  216         accZ0( 
track ) += readHistogram(m_biasZ0, biasZ0Histogram, 
phi, 
eta);
 
  217         if ( m_isData && z0WmActive ) {
 
  218           accZ0( 
track ) += readHistogram(0., biasZ0HistError, 
phi, 
eta);
 
  222     if ( m_doQoverPBias ) {
 
  223       bool qOverPWmActive = isActive( TRK_BIAS_QOVERP_SAGITTA_WM );
 
  224       if ( m_isData || qOverPWmActive ) {
 
  225         auto sinTheta = 1.0/cosh(
eta);
 
  227         accQOverP( 
track ) += 1.e-6*sinTheta*readHistogram(m_biasQoverPsagitta, biasQoverPsagittaHistogram, 
phi, 
eta);
 
  228         if ( m_isData && qOverPWmActive ) {
 
  229           accQOverP( 
track ) += 1.e-6*sinTheta*readHistogram(0., biasQoverPsagittaHistError, 
phi, 
eta);
 
  241     ATH_CHECK ( initObject<TH2>(m_data15_biasD0Histogram, m_calibFileData15, m_d0_nominal_histName) );
 
  242     ATH_CHECK ( initObject<TH2>(m_data15_biasZ0Histogram, m_calibFileData15, m_z0_nominal_histName) );
 
  243     ATH_CHECK ( initObject<TH2>(m_data15_biasQoverPsagittaHistogram, m_calibFileData15, m_sagitta_nominal_histName) );
 
  244     ATH_CHECK ( initObject<TH2>(m_data15_biasD0HistError, m_calibFileData15, m_d0_uncertainty_histName) );
 
  245     ATH_CHECK ( initObject<TH2>(m_data15_biasZ0HistError, m_calibFileData15, m_z0_uncertainty_histName) );
 
  246     ATH_CHECK ( initObject<TH2>(m_data15_biasQoverPsagittaHistError, m_calibFileData15, m_sagitta_uncertainty_histName) );
 
  249     ATH_CHECK ( initObject<TH2>(m_data16_1stPart_biasD0Histogram, m_calibFileData16_1stPart, m_d0_nominal_histName) );
 
  250     ATH_CHECK ( initObject<TH2>(m_data16_1stPart_biasZ0Histogram, m_calibFileData16_1stPart, m_z0_nominal_histName) );
 
  251     ATH_CHECK ( initObject<TH2>(m_data16_1stPart_biasQoverPsagittaHistogram, m_calibFileData16_1stPart, m_sagitta_nominal_histName) );
 
  252     ATH_CHECK ( initObject<TH2>(m_data16_1stPart_biasD0HistError, m_calibFileData16_1stPart, m_d0_uncertainty_histName) );
 
  253     ATH_CHECK ( initObject<TH2>(m_data16_1stPart_biasZ0HistError, m_calibFileData16_1stPart, m_z0_uncertainty_histName) );
 
  254     ATH_CHECK ( initObject<TH2>(m_data16_1stPart_biasQoverPsagittaHistError, m_calibFileData16_1stPart, m_sagitta_uncertainty_histName) );
 
  257     ATH_CHECK ( initObject<TH2>(m_data16_2ndPart_biasD0Histogram, m_calibFileData16_2ndPart, m_d0_nominal_histName) );
 
  258     ATH_CHECK ( initObject<TH2>(m_data16_2ndPart_biasZ0Histogram, m_calibFileData16_2ndPart, m_z0_nominal_histName) );
 
  259     ATH_CHECK ( initObject<TH2>(m_data16_2ndPart_biasQoverPsagittaHistogram, m_calibFileData16_2ndPart, m_sagitta_nominal_histName) );
 
  260     ATH_CHECK ( initObject<TH2>(m_data16_2ndPart_biasD0HistError, m_calibFileData16_2ndPart, m_d0_uncertainty_histName) );
 
  261     ATH_CHECK ( initObject<TH2>(m_data16_2ndPart_biasZ0HistError, m_calibFileData16_2ndPart, m_z0_uncertainty_histName) );
 
  262     ATH_CHECK ( initObject<TH2>(m_data16_2ndPart_biasQoverPsagittaHistError, m_calibFileData16_2ndPart, m_sagitta_uncertainty_histName) );
 
  265     ATH_CHECK ( initObject<TH2>(m_data17_1stPart_biasD0Histogram, m_calibFileData17_1stPart, m_d0_nominal_histName) );
 
  266     ATH_CHECK ( initObject<TH2>(m_data17_1stPart_biasZ0Histogram, m_calibFileData17_1stPart, m_z0_nominal_histName) );
 
  267     ATH_CHECK ( initObject<TH2>(m_data17_1stPart_biasQoverPsagittaHistogram, m_calibFileData17_1stPart, m_sagitta_nominal_histName) );
 
  268     ATH_CHECK ( initObject<TH2>(m_data17_1stPart_biasD0HistError, m_calibFileData17_1stPart, m_d0_uncertainty_histName) );
 
  269     ATH_CHECK ( initObject<TH2>(m_data17_1stPart_biasZ0HistError, m_calibFileData17_1stPart, m_z0_uncertainty_histName) );
 
  270     ATH_CHECK ( initObject<TH2>(m_data17_1stPart_biasQoverPsagittaHistError, m_calibFileData17_1stPart, m_sagitta_uncertainty_histName) );
 
  273     ATH_CHECK ( initObject<TH2>(m_data17_2ndPart_biasD0Histogram, m_calibFileData17_2ndPart, m_d0_nominal_histName) );
 
  274     ATH_CHECK ( initObject<TH2>(m_data17_2ndPart_biasZ0Histogram, m_calibFileData17_2ndPart, m_z0_nominal_histName) );
 
  275     ATH_CHECK ( initObject<TH2>(m_data17_2ndPart_biasQoverPsagittaHistogram, m_calibFileData17_2ndPart, m_sagitta_nominal_histName) );
 
  276     ATH_CHECK ( initObject<TH2>(m_data17_2ndPart_biasD0HistError, m_calibFileData17_2ndPart, m_d0_uncertainty_histName) );
 
  277     ATH_CHECK ( initObject<TH2>(m_data17_2ndPart_biasZ0HistError, m_calibFileData17_2ndPart, m_z0_uncertainty_histName) );
 
  278     ATH_CHECK ( initObject<TH2>(m_data17_2ndPart_biasQoverPsagittaHistError, m_calibFileData17_2ndPart, m_sagitta_uncertainty_histName) );
 
  281     ATH_CHECK ( initObject<TH2>(m_data18_1stPart_biasD0Histogram, m_calibFileData18_1stPart, m_d0_nominal_histName) );
 
  282     ATH_CHECK ( initObject<TH2>(m_data18_1stPart_biasZ0Histogram, m_calibFileData18_1stPart, m_z0_nominal_histName) );
 
  283     ATH_CHECK ( initObject<TH2>(m_data18_1stPart_biasQoverPsagittaHistogram, m_calibFileData18_1stPart, m_sagitta_nominal_histName) );
 
  284     ATH_CHECK ( initObject<TH2>(m_data18_1stPart_biasD0HistError, m_calibFileData18_1stPart, m_d0_uncertainty_histName) );
 
  285     ATH_CHECK ( initObject<TH2>(m_data18_1stPart_biasZ0HistError, m_calibFileData18_1stPart, m_z0_uncertainty_histName) );
 
  286     ATH_CHECK ( initObject<TH2>(m_data18_1stPart_biasQoverPsagittaHistError, m_calibFileData18_1stPart, m_sagitta_uncertainty_histName) );
 
  289     ATH_CHECK ( initObject<TH2>(m_data18_2ndPart_biasD0Histogram, m_calibFileData18_2ndPart, m_d0_nominal_histName) );
 
  290     ATH_CHECK ( initObject<TH2>(m_data18_2ndPart_biasZ0Histogram, m_calibFileData18_2ndPart, m_z0_nominal_histName) );
 
  291     ATH_CHECK ( initObject<TH2>(m_data18_2ndPart_biasQoverPsagittaHistogram, m_calibFileData18_2ndPart, m_sagitta_nominal_histName) );
 
  292     ATH_CHECK ( initObject<TH2>(m_data18_2ndPart_biasD0HistError, m_calibFileData18_2ndPart, m_d0_uncertainty_histName) );
 
  293     ATH_CHECK ( initObject<TH2>(m_data18_2ndPart_biasZ0HistError, m_calibFileData18_2ndPart, m_z0_uncertainty_histName) );
 
  294     ATH_CHECK ( initObject<TH2>(m_data18_2ndPart_biasQoverPsagittaHistError, m_calibFileData18_2ndPart, m_sagitta_uncertainty_histName) );
 
  296     return StatusCode::SUCCESS;
 
  301     assert( ! (m_isData && m_isSimulation) );
 
  304     auto sc = evtStore()->retrieve( ei, 
"EventInfo" );
 
  305     if ( ! 
sc.isSuccess() ) {
 
  306       if (m_runNumber <= 0 || !(m_isData||m_isSimulation)) {
 
  307         ATH_MSG_ERROR( 
"Unable to retrieve from event store. Manually set data/simulation and/or run number." );
 
  308         return StatusCode::FAILURE;
 
  314         ATH_MSG_WARNING( 
"Manually set to data setting, but the type is detected as simulation." );
 
  317         m_isSimulation = 
true;
 
  320       if ( m_isSimulation ) {
 
  321         ATH_MSG_WARNING( 
"Manually set to simulation setting, but the type is detected as data." );
 
  327     assert( m_isData != m_isSimulation ); 
 
  328     if (m_isData) 
ATH_MSG_INFO( 
"Set to data. Will apply biases to correct those observed in data." );
 
  329     if (m_isSimulation) 
ATH_MSG_INFO( 
"Set to simulation. Will apply biases in direction that is observed in data." );
 
  333     if (m_isSimulation && !randomRunNumber.
isAvailable(*ei) && m_runNumber <= 0) {
 
  334       ATH_MSG_WARNING(
"Set to simulation with no run number provided, but RandomRunNumber not available. Will use default run number from EventInfo, " 
  335         "but biasing won't accurately reflect intervals of validity throughout the year. Run PileupReweightingTool first to pick up RandomRunNumber decorations.");
 
  337     return StatusCode::SUCCESS;
 
  340   float InDetTrackBiasingTool::readHistogram(
float fDefault, TH2* 
histogram, 
float phi, 
float eta)
 const {
 
  342       ATH_MSG_ERROR( 
"Configuration histogram is invalid. Check the run number and systematic configuration combination.");
 
  343       throw std::runtime_error( 
"invalid configuration" );
 
  347     if( 
eta>2.499 )  
eta= 2.499;
 
  348     if( 
eta<-2.499 ) 
eta=-2.499;
 
  352     if (m_isSimulation) 
f = -
f;
 
  361     return TrackCorrTool_t::correctedCopy(in, 
out);
 
  366     return TrackCorrTool_t::applyContainerCorrection(cont);
 
  371     return InDetTrackSystematicsTool::isAffectedBySystematic( syst );
 
  376     return BiasSystematics;
 
  381     return InDetTrackSystematicsTool::recommendedSystematics();
 
  386     return InDetTrackSystematicsTool::applySystematicVariation(systs);