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);