12 const std::string&
name,
const IInterface* ifc)
25 ATH_CHECK(m_lorentzAngleToolPixel.retrieve(EnableTool{m_useAthenaLorentzAngleTools}));
26 ATH_CHECK(m_lorentzAngleToolStrip.retrieve(EnableTool{m_useAthenaLorentzAngleTools}));
28 return StatusCode::SUCCESS;
34 if (correctionType < 0)
35 return StatusCode::SUCCESS;
42 if (m_useAthenaLorentzAngleTools) {
43 shift = m_lorentzAngleToolPixel->getLorentzShift(
hash, Gaudi::Hive::currentContext());
46 shift = getLorentzAngleShift(hit, correctionType);
48 if (m_shiftGlobalPosition) {
55 if (!
cell.isValid()) {
57 return StatusCode::FAILURE;
64 ATH_MSG_ERROR(
"Pixel new cell not valid for hitID " << hit_id <<
" with shift " << shift <<
" and localPosX " << localPos[
Trk::locX] <<
" and localPosY " << localPos[
Trk::locY] <<
" and stripIndex " << newCell.
phiIndex() <<
". Setting hit to module's edge.");
65 return StatusCode::FAILURE;
81 if (m_useAthenaLorentzAngleTools) {
82 shift = m_lorentzAngleToolStrip->getLorentzShift(
hash, Gaudi::Hive::currentContext());
85 shift = getLorentzAngleShift(hit, correctionType);
88 if (m_shiftGlobalPosition) {
104 return StatusCode::SUCCESS;
109 if (correctionType == 0) {
125 throw std::runtime_error( std::string(
typeid(*this).name()) +
": Invalid hit type: neither Pixel nor Strip.");
128 else if (correctionType == 1) {
144 throw std::runtime_error( std::string(
typeid(*this).name()) +
": Invalid hit type: neither Pixel nor Strip.");
147 else if (correctionType == 2) {
158 return getStripBarrelShift_v2(sielement->
isStereo());
163 throw std::runtime_error( std::string(
typeid(*this).name()) +
": Invalid hit type: neither Pixel nor Strip.");
167 throw std::runtime_error( std::string(
typeid(*this).name()) +
": Invalid correctionType = " +
std::to_string(correctionType));
172 const float endcapShiftTable[23][9] = {
174 {0.0, 0.0, -0.000006, 0.004646, -0.000112, 0.006308, -0.000151, 0.006828, -0.000189},
175 {0.0, 0.0, -0.000006, 0.004627, -0.000129, 0.006291, -0.000185, 0.006811, -0.000226},
176 {0.0, 0.0, -0.000007, 0.004601, -0.000151, 0.006268, -0.000233, 0.006789, -0.000275},
177 {0.0, 0.0, -0.000008, 0.004562, -0.000178, 0.006240, -0.000301, 0.006764, -0.000342},
178 {0.0, 0.0, -0.000009, 0.004503, -0.000212, 0.006202, -0.000394, 0.006731, -0.000432},
179 {0.0, 0.0, -0.000010, 0.004409, -0.000256, 0.006153, -0.000511, 0.006689, -0.000549},
180 {0.0, NAN, -0.000011, NAN, -0.000309, 0.006087, -0.000610, 0.006636, -0.000682},
181 {0.0, NAN, -0.000012, NAN, -0.000370, 0.005995, -0.000607, 0.006569, -0.000781},
182 {0.0, NAN, -0.000014, NAN, -0.000427, NAN, NAN, 0.006483, -0.000764},
183 {0.0, NAN, -0.000016, NAN, -0.000459, NAN, NAN, NAN, NAN},
184 {0.0, NAN, -0.000018, NAN, -0.000454, NAN, NAN, NAN, NAN},
185 {0.0, NAN, -0.000021, NAN, NAN, NAN, NAN, NAN, NAN},
186 {0.0, NAN, -0.000024, NAN, NAN, NAN, NAN, NAN, NAN},
187 {0.0, NAN, -0.000028, NAN, NAN, NAN, NAN, NAN, NAN},
188 {0.0, NAN, -0.000033, NAN, NAN, NAN, NAN, NAN, NAN},
189 {NAN, NAN, -0.000039, NAN, NAN, NAN, NAN, NAN, NAN},
190 {NAN, NAN, -0.000047, NAN, NAN, NAN, NAN, NAN, NAN},
191 {NAN, NAN, -0.000056, NAN, NAN, NAN, NAN, NAN, NAN},
192 {NAN, NAN, -0.000069, NAN, NAN, NAN, NAN, NAN, NAN},
193 {NAN, NAN, -0.000085, NAN, NAN, NAN, NAN, NAN, NAN},
194 {NAN, NAN, -0.000105, NAN, NAN, NAN, NAN, NAN, NAN},
195 {NAN, NAN, -0.000124, NAN, NAN, NAN, NAN, NAN, NAN},
196 {NAN, NAN, -0.000134, NAN, NAN, NAN, NAN, NAN, NAN}
198 if (etaModule > 22 || layerDisk > 8) {
199 throw std::domain_error(
"Pixel Endcap invalid layerDisk or etaModule value: " +
std::to_string(layerDisk) +
", " +
std::to_string(etaModule));
201 float shift = endcapShiftTable[etaModule][layerDisk];
202 if (std::isnan(shift)) {
203 throw std::domain_error(
"Pixel Endcap invalid shift value: NAN for layerDisk " +
std::to_string(layerDisk) +
" and etaModule " +
std::to_string(etaModule));
208 return evenPhi ? -shift : shift;
212 return evenPhi ? shift : -shift;
215 return evenPhi ? shift : -shift;
217 return evenPhi ? -shift : shift;
220 return evenPhi ? shift : -shift;
222 return evenPhi ? -shift : shift;
225 return evenPhi ? shift : -shift;
227 return evenPhi ? -shift : shift;
234 const float pixelBarrelShiftTable[25][5] = {
236 {0.0, NAN, NAN, NAN, NAN},
237 {0.0, NAN, NAN, NAN, NAN},
238 {0.0, NAN, NAN, NAN, NAN},
239 {0.0, NAN, -0.011976, -0.011982, -0.011989},
240 {0.0, NAN, -0.011989, -0.011995, -0.012002},
241 {0.0, NAN, -0.011998, -0.012004, -0.012011},
242 {0.0, -0.006069, -0.012008, -0.012013, -0.012020},
243 {0.0, -0.006073, -0.012015, -0.012021, -0.012027},
244 {0.0, -0.006076, -0.012021, -0.012026, -0.012033},
245 {0.0, -0.006078, -0.012026, -0.012031, -0.012038},
246 {0.0, -0.006080, -0.012029, -0.012034, -0.012041},
247 {0.0, -0.006081, -0.012030, -0.012036, -0.012042},
248 {NAN, NAN, NAN, NAN, NAN},
249 {0.0, -0.006081, -0.012030, -0.012036, -0.012042},
250 {0.0, -0.006080, -0.012029, -0.012034, -0.012041},
251 {0.0, -0.006078, -0.012026, -0.012031, -0.012038},
252 {0.0, -0.006076, -0.012021, -0.012026, -0.012033},
253 {0.0, -0.006073, -0.012015, -0.012021, -0.012027},
254 {0.0, -0.006069, -0.012008, -0.012013, -0.012020},
255 {0.0, NAN, -0.011998, -0.012004, -0.012011},
256 {0.0, NAN, -0.011989, -0.011995, -0.012002},
257 {0.0, NAN, -0.011976, -0.011982, -0.011989},
258 {0.0, NAN, NAN, NAN, NAN},
259 {0.0, NAN, NAN, NAN, NAN},
260 {0.0, NAN, NAN, NAN, NAN}
263 if (layerDisk >= 5 || std::abs(etaModule) >= 13 || std::isnan(pixelBarrelShiftTable[etaModule + 12][layerDisk])) {
264 throw std::domain_error(
"Invalid pixel barrel layerDisk or etaModule value: " +
std::to_string(layerDisk) +
", " +
std::to_string(etaModule));
267 return pixelBarrelShiftTable[etaModule + 12][layerDisk];
273 const float shiftTable[57][4] = {
275 {NAN, NAN, NAN, NAN},
276 {0.045516, 0.045631, 0.045813, 0.046054},
277 {0.045514, 0.045629, 0.045809, 0.046058},
278 {0.045512, 0.045628, 0.045803, 0.046068},
279 {0.045506, 0.045623, 0.045788, 0.046069},
280 {0.045501, 0.045618, 0.045770, 0.046068},
281 {0.045492, 0.045611, 0.045744, 0.046054},
282 {0.045481, 0.045600, 0.045715, 0.046040},
283 {0.045470, 0.045590, 0.045672, 0.046007},
284 {0.045459, 0.045580, 0.045627, 0.045975},
285 {0.045442, 0.045563, 0.045572, 0.045932},
286 {0.045423, 0.045547, 0.045509, 0.045879},
287 {0.045405, 0.045531, 0.045445, 0.045829},
288 {0.045387, 0.045514, 0.045361, 0.045756},
289 {0.045362, 0.045491, 0.045277, 0.045687},
290 {0.045334, 0.045466, 0.045177, 0.045602},
291 {0.045308, 0.045441, 0.045072, 0.045514},
292 {0.045279, 0.045414, 0.044956, 0.045417},
293 {0.045252, 0.045389, 0.044831, 0.045310},
294 {0.045217, 0.045357, 0.044694, 0.045193},
295 {0.045180, 0.045321, 0.044547, 0.045066},
296 {0.045140, 0.045285, 0.044390, 0.044928},
297 {0.045102, 0.045250, 0.044219, 0.044775},
298 {0.045063, 0.045214, 0.044038, 0.044615},
299 {0.045019, 0.045171, 0.043846, 0.044438},
300 {0.044968, 0.045123, 0.043635, 0.044247},
301 {0.044919, 0.045077, 0.043423, 0.044054},
302 {0.044869, 0.045031, 0.043186, 0.043849},
303 {0.044821, 0.044985, 0.042944, 0.043647},
304 {0.044757, 0.044925, NAN, NAN},
305 {0.044697, 0.044868, NAN, NAN},
306 {0.044636, 0.044811, NAN, NAN},
307 {0.044576, 0.044754, NAN, NAN},
308 {0.044508, 0.044689, NAN, NAN},
309 {0.044435, 0.044620, NAN, NAN},
310 {0.044362, 0.044551, NAN, NAN},
311 {0.044290, 0.044482, NAN, NAN},
312 {0.044212, 0.044408, NAN, NAN},
313 {0.044126, 0.044327, NAN, NAN},
314 {0.044041, 0.044246, NAN, NAN},
315 {0.043956, 0.044166, NAN, NAN},
316 {0.043866, 0.044082, NAN, NAN},
317 {0.043768, 0.043989, NAN, NAN},
318 {0.043670, 0.043895, NAN, NAN},
319 {0.043572, 0.043801, NAN, NAN},
320 {0.043467, 0.043703, NAN, NAN},
321 {0.043356, 0.043597, NAN, NAN},
322 {0.043244, 0.043492, NAN, NAN},
323 {0.043134, 0.043387, NAN, NAN},
324 {0.043007, 0.043268, NAN, NAN},
325 {0.042883, 0.043151, NAN, NAN},
326 {0.042760, 0.043033, NAN, NAN},
327 {0.042629, 0.042911, NAN, NAN},
328 {0.042485, 0.042775, NAN, NAN},
329 {0.042347, 0.042646, NAN, NAN},
330 {0.042205, 0.042511, NAN, NAN},
331 {0.042056, 0.042370, NAN, NAN},
334 if (layerDisk >= 4 || std::abs(etaModule) >= 57 || std::isnan(shiftTable[std::abs(etaModule)][layerDisk]) ) {
335 throw std::domain_error(
"Invalid strip layerDisk or etaModule value in barrel: " +
std::to_string(layerDisk) +
", " +
std::to_string(etaModule));
338 return isStereo ? -shiftTable[std::abs(etaModule)][layerDisk] : shiftTable[std::abs(etaModule)][layerDisk];
342 float shiftTable[18][6] = {
344 {0.001532, 0.001943, 0.002601, 0.003425, 0.004022, 0.003900},
345 {0.001611, 0.002046, 0.002741, 0.003622, 0.004256, 0.004117},
346 {0.001706, 0.002165, 0.002916, 0.003855, 0.004553, 0.004404},
347 {0.001813, 0.002305, 0.003109, 0.004136, 0.004905, 0.004738},
348 {0.001908, 0.002428, 0.003275, 0.004384, 0.005211, 0.005028},
349 {0.001990, 0.002529, 0.003421, 0.004591, 0.005480, 0.005278},
350 {0.002073, 0.002635, 0.003582, 0.004824, 0.005791, 0.005558},
351 {0.002143, 0.002732, 0.003699, 0.005004, 0.006037, 0.005801},
352 {0.002217, 0.002832, 0.003855, 0.005236, 0.006343, 0.006094},
353 {0.002317, 0.002960, 0.004039, 0.005527, 0.006743, 0.006465},
354 {0.002422, 0.003088, 0.004240, 0.005842, 0.007188, 0.006864},
355 {0.002510, 0.003202, 0.004413, 0.006121, 0.007592, 0.007247},
356 {0.002586, 0.003308, 0.004562, 0.006376, 0.007972, 0.007595},
357 {0.002671, 0.003424, 0.004734, 0.006648, 0.008408, 0.007988},
358 {0.002788, 0.003581, 0.004976, 0.007081, 0.009110, 0.008616},
359 {0.002927, 0.003757, 0.005252, 0.007604, 0.010043, 0.009421},
360 {0.003025, 0.003911, 0.005482, 0.008059, 0.010959, 0.010173},
361 {0.003139, 0.004051, 0.005707, 0.008498, 0.011985, 0.010993}
364 if (layerDisk >= 6 || etaModule >= 18 || etaModule<0 || std::isnan(shiftTable[etaModule][layerDisk]) ) {
365 throw std::domain_error(
"Invalid strip layerDisk or etaModule value on endcaps: " +
std::to_string(layerDisk) +
", " +
std::to_string(etaModule));
368 return z > 0.0 ? shiftTable[std::abs(etaModule)][layerDisk] : -shiftTable[std::abs(etaModule)][layerDisk];
372 const float endcapShiftTable[11][7] = {
374 {-0.000003, 0.004646, -0.000112, 0.006308, -0.000151, 0.006828, -0.000189},
375 {-0.000003, 0.004627, -0.000129, 0.006291, -0.000185, 0.006811, -0.000226},
376 {-0.000003, 0.004601, -0.000151, 0.006268, -0.000233, 0.006789, -0.000275},
377 {-0.000004, 0.004562, -0.000178, 0.006240, -0.000301, 0.006764, -0.000342},
378 {-0.000004, 0.004503, -0.000212, 0.006202, -0.000394, 0.006731, -0.000432},
379 {-0.000005, 0.004409, -0.000256, 0.006153, -0.000511, 0.006689, -0.000549},
380 {-0.000005, NAN, -0.000309, 0.006087, -0.000610, 0.006636, -0.000682},
381 {-0.000006, NAN, -0.000370, 0.005995, -0.000607, 0.006569, -0.000781},
382 {-0.000007, NAN, -0.000427, NAN, NAN, 0.006483, -0.000764},
383 {-0.000008, NAN, -0.000459, NAN, NAN, NAN, NAN},
384 {-0.000009, NAN, -0.000454, NAN, NAN, NAN, NAN},
387 const float endcapShiftTable2[12] = {
404 if (etaModule > 22 || layerDisk > 8) {
405 throw std::domain_error(
"Pixel Endcap invalid layerDisk or etaModule value: " +
std::to_string(layerDisk) +
", " +
std::to_string(etaModule));
407 else if (etaModule > 10 && etaModule < 23) {
408 shift = endcapShiftTable2[etaModule-11];
411 unsigned layerDisktoUse = ((layerDisk <= 2) ? 0 : (layerDisk - 2));
412 shift = endcapShiftTable[etaModule][layerDisktoUse];
415 if (std::isnan(shift)) {
416 throw std::domain_error(
"Pixel Endcap invalid shift value: NAN for layerDisk " +
std::to_string(layerDisk) +
" and etaModule " +
std::to_string(etaModule));
421 return evenPhi ? -shift : shift;
425 return evenPhi ? shift : -shift;
428 return evenPhi ? shift : -shift;
430 return evenPhi ? -shift : shift;
433 return evenPhi ? shift : -shift;
435 return evenPhi ? -shift : shift;
438 return evenPhi ? shift : -shift;
440 return evenPhi ? -shift : shift;
447 const float pixelBarrelShiftTable[9][5] = {
449 {0.0, -0.006081, -0.012030, -0.012036, -0.012042},
450 {0.0, -0.006080, -0.012029, -0.012034, -0.012041},
451 {0.0, -0.006078, -0.012026, -0.012031, -0.012038},
452 {0.0, -0.006076, -0.012021, -0.012026, -0.012033},
453 {0.0, -0.006073, -0.012015, -0.012021, -0.012027},
454 {0.0, -0.006069, -0.012008, -0.012013, -0.012020},
455 {0.0, NAN, -0.011998, -0.012004, -0.012011},
456 {0.0, NAN, -0.011989, -0.011995, -0.012002},
457 {0.0, NAN, -0.011976, -0.011982, -0.011989},
460 if (layerDisk >= 5 || std::abs(etaModule) >= 13) {
461 throw std::domain_error(
"Invalid pixel barrel layerDisk or etaModule value: " +
std::to_string(layerDisk) +
", " +
std::to_string(etaModule));
463 if (abs(etaModule) >= 10 || etaModule == 0)
return 0;
464 else return pixelBarrelShiftTable[abs(etaModule) - 1][layerDisk];
471 const float shiftTable[56] = {
530 if (std::abs(etaModule) >= 57 || etaModule == 0) {
531 throw std::domain_error(
"Invalid strip etaModule value in barrel: " +
std::to_string(etaModule));
534 return isStereo ? -shiftTable[std::abs(etaModule)-1] : shiftTable[std::abs(etaModule)-1];
538 float shiftTable[6][6] = {
540 {0.001611, 0.002046, 0.002741, 0.003622, 0.004256, 0.004117},
541 {0.001908, 0.002428, 0.003275, 0.004384, 0.005211, 0.005028},
542 {0.002143, 0.002732, 0.003699, 0.005004, 0.006037, 0.005801},
543 {0.002422, 0.003088, 0.004240, 0.005842, 0.007188, 0.006864},
544 {0.002671, 0.003424, 0.004734, 0.006648, 0.008408, 0.007988},
545 {0.003025, 0.003911, 0.005482, 0.008059, 0.010959, 0.010173},
548 if (layerDisk >= 6 || abs(etaModule) >= 18 || abs(etaModule)<0) {
549 throw std::domain_error(
"Invalid strip layerDisk or etaModule value on endcaps: " +
std::to_string(layerDisk) +
", " +
std::to_string(etaModule));
552 int etaModuleToUse = std::floor(abs(etaModule)/3);
553 return z > 0.0 ? shiftTable[std::abs(etaModuleToUse)][layerDisk] : -shiftTable[std::abs(etaModuleToUse)][layerDisk];
557 const float endcapShiftTable[5][7] = {
559 {-0.000003, 0.004636, -0.000120, 0.006300, -0.000168, 0.006820, -0.000208},
560 {-0.000004, 0.004582, -0.000164, 0.006258, -0.000267, 0.006776, -0.000309},
561 {-0.000005, 0.004456, -0.000234, 0.006178, -0.000453, 0.006710, -0.000491},
562 {-0.000006, NAN, -0.000340, 0.006041, -0.000608, 0.006603, -0.000731},
563 {-0.000008, NAN, -0.000447, NAN, NAN, 0.006483, -0.000764},
567 const float endcapShiftTable2[12] = {
584 if (etaModule > 22 || layerDisk > 8) {
585 throw std::domain_error(
"Pixel Endcap invalid layerDisk or etaModule value: " +
std::to_string(layerDisk) +
", " +
std::to_string(etaModule));
587 else if (etaModule > 10 && etaModule < 23) {
588 shift = endcapShiftTable2[etaModule-11];
591 unsigned layerDisktoUse = ((layerDisk <= 2) ? 0 : (layerDisk - 2));
592 unsigned etaModuleToUse = ((etaModule >= 8) ? 4 : std::floor(etaModule/2));
593 shift = endcapShiftTable[etaModuleToUse][layerDisktoUse];
596 if (std::isnan(shift)) {
597 throw std::domain_error(
"Pixel Endcap invalid shift value: NAN for layerDisk " +
std::to_string(layerDisk) +
" and etaModule " +
std::to_string(etaModule));
602 return evenPhi ? -shift : shift;
606 return evenPhi ? shift : -shift;
609 return evenPhi ? shift : -shift;
611 return evenPhi ? -shift : shift;
614 return evenPhi ? shift : -shift;
616 return evenPhi ? -shift : shift;
619 return evenPhi ? shift : -shift;
621 return evenPhi ? -shift : shift;
628 const float pixelBarrelShiftTable[3] = {
630 0.0, -0.006077, -0.012021
633 if (layerDisk >= 5) {
634 throw std::domain_error(
"Invalid pixel barrel layerDisk value: " +
std::to_string(layerDisk));
636 unsigned layerDiskToUse = ((layerDisk <= 2) ? layerDisk : 2);
637 return pixelBarrelShiftTable[layerDiskToUse];
645 const float shift = 0.0441;
646 return isStereo ? -shift : shift;
650 float shiftTable[6][6] = {
652 {0.001611, 0.002046, 0.002741, 0.003622, 0.004256, 0.004117},
653 {0.001908, 0.002428, 0.003275, 0.004384, 0.005211, 0.005028},
654 {0.002143, 0.002732, 0.003699, 0.005004, 0.006037, 0.005801},
655 {0.002422, 0.003088, 0.004240, 0.005842, 0.007188, 0.006864},
656 {0.002671, 0.003424, 0.004734, 0.006648, 0.008408, 0.007988},
657 {0.003025, 0.003911, 0.005482, 0.008059, 0.010959, 0.010173},
661 if (layerDisk >= 6 || abs(etaModule) >= 18 || abs(etaModule)<0) {
662 throw std::domain_error(
"Invalid strip layerDisk or etaModule value on endcaps: " +
std::to_string(layerDisk) +
", " +
std::to_string(etaModule));
665 int etaModuleToUse = std::floor(abs(etaModule)/3);
666 return z > 0.0 ? shiftTable[std::abs(etaModuleToUse)][layerDisk] : -shiftTable[std::abs(etaModuleToUse)][layerDisk];