31 static_assert(std::numeric_limits<double>::has_quiet_NaN,
32 "no NaN defined, but we require one");
34 const int INT_MISSING = -1;
35 double nan_if_placeholder(
int);
41 m_MultivariateTaggerHandleArray(this)
61 return StatusCode::FAILURE;
66 return StatusCode::FAILURE;
76 ATH_MSG_WARNING(
"Retrieving in the initialization of MultivariateTagManager failed.");
77 return StatusCode::FAILURE;
81 ATH_MSG_INFO(
" #BTAG# Initialization of MultivariateTagManager successfull" );
82 return StatusCode::SUCCESS;
91 const std::string &jetName)
const
95 if ( jetName.empty() ) {
97 " No likelihood value given back. ");
100 double jetpT = jetToTag.
pt();
101 double jeteta = jetToTag.
eta();
105 inputs[btagvar::JET_ETA] = jeteta;
106 inputs[btagvar::JET_ABS_ETA] = std::fabs(jeteta);
107 inputs[btagvar::JET_PT] = jetpT;
126 itr->assignProbability(&
BTag,
inputs, jetName);
131 return StatusCode::SUCCESS;
136 float sm_mu_pt = NAN;
138 float sm_qOverPratio = NAN;
139 float sm_mombalsignif = NAN;
140 float sm_scatneighsignif = NAN;
141 float sm_pTrel = NAN;
142 float sm_mu_d0 = NAN;
143 float sm_mu_z0 = NAN;
144 float sm_ID_qOverP = NAN;
147 if(!std::isnan(sm_mu_pt) && sm_mu_pt>0){
160 inputs[btagvar::SM_MU_PT] = sm_mu_pt;
161 inputs[btagvar::SM_DR] = sm_dR;
162 inputs[btagvar::SM_QOVERP] = sm_qOverPratio;
163 inputs[btagvar::SM_MOMBALSIG] = sm_mombalsignif;
164 inputs[btagvar::SM_SCATNEIGH] = sm_scatneighsignif;
165 inputs[btagvar::SM_PTREL] = sm_pTrel;
166 inputs[btagvar::SM_MU_D0] = sm_mu_d0;
167 inputs[btagvar::SM_MU_Z0] = sm_mu_z0;
168 inputs[btagvar::SM_ID_QOVERP] = sm_ID_qOverP;
173 float trkSum_ntrk = NAN;
174 float trkSum_sPt = NAN;
175 float trkSum_vPt = NAN;
176 float trkSum_vAbsEta =NAN;
183 if (!std::isnan(trkSum_ntrk)){
190 inputs[btagvar::TRKSUM_NTRK] = trkSum_ntrk;
191 inputs[btagvar::TRKSUM_SPT] = trkSum_sPt;
192 inputs[btagvar::TRKSUM_VPT] = trkSum_vPt;
193 inputs[btagvar::TRKSUM_ABSETA] = trkSum_vAbsEta;
199 int jf_nvtx = INT_MISSING;
200 int jf_nvtx1t = INT_MISSING;
201 int jf_ntrkAtVx = INT_MISSING;
202 int jf_n2tv = INT_MISSING;
206 float jf_dR_flight = NAN;
209 float jf_mass_uncor = NAN;
210 float jf_sig3d = NAN;
213 int jf_nvtx_tmp(INT_MISSING), jf_nvtx1t_tmp(INT_MISSING);
214 bool jfitter_ok(
false);
215 std::vector< ElementLink< xAOD::BTagVertexContainer > > jf_vertices;
216 BTag.variable<std::vector<ElementLink<xAOD::BTagVertexContainer> > >(
m_jftNN_infosource,
"JFvertices", jf_vertices);
226 if(!jf_vertices.empty() && jf_vertices[0].isValid() &&
227 (jf_nvtx_tmp > 0 || jf_nvtx1t_tmp > 0)) jfitter_ok =
true;
256 jf_dR = std::hypot(jf_dphi,jf_deta);
262 inputs[btagvar::JF_NVTX] = nan_if_placeholder(jf_nvtx);
263 inputs[btagvar::JF_NVTX1T] = nan_if_placeholder(jf_nvtx1t);
264 inputs[btagvar::JF_NTRKV] = nan_if_placeholder(jf_ntrkAtVx);
265 inputs[btagvar::JF_EFRC] = jf_efrc;
266 inputs[btagvar::JF_MASS] = jf_mass;
267 inputs[btagvar::JF_MASS_UNCOR] = jf_mass_uncor;
268 inputs[btagvar::JF_N2TV] = nan_if_placeholder(jf_n2tv);
269 inputs[btagvar::JF_SIG3D] = jf_sig3d;
270 inputs[btagvar::JF_DR] = jf_dR;
271 inputs[btagvar::JF_DR_FLIGHT]= jf_dR_flight;
272 inputs[btagvar::JF_DPHI] = jf_dphi;
273 inputs[btagvar::JF_DETA] = jf_deta;
289 float ip2_c_nan = NAN;
290 float ip2_cu_nan= NAN;
292 std::vector<float> weightBofTracksIP2D;
294 if(!weightBofTracksIP2D.empty()) {
297 ip2d_pb =
BTag.IP2D_pb();
298 ip2d_pc =
BTag.IP2D_pc();
299 ip2d_pu =
BTag.IP2D_pu();
307 ip2 =
BTag.calcLLR(ip2d_pb,ip2d_pu);
308 ip2_c =
BTag.calcLLR(ip2d_pb,ip2d_pc);
309 ip2_cu =
BTag.calcLLR(ip2d_pc,ip2d_pu);
311 if(ip2d_pb<=0. or ip2d_pu<=0. or ip2d_pb==NAN or ip2d_pu==NAN) {
314 ip2_nan =
log(ip2d_pb/ip2d_pu);
317 if(ip2d_pb<=0. or ip2d_pc<=0. or ip2d_pb==NAN or ip2d_pc==NAN) {
320 ip2_c_nan =
log(ip2d_pb/ip2d_pc);
323 if(ip2d_pc<=0. or ip2d_pu<=0. or ip2d_pc==NAN or ip2d_pu==NAN) {
326 ip2_cu_nan =
log(ip2d_pc/ip2d_pu);
331 inputs[btagvar::IP2D_PB] = ip2d_pb;
332 inputs[btagvar::IP2D_PC] = ip2d_pc;
333 inputs[btagvar::IP2D_PU] = ip2d_pu;
334 inputs[btagvar::IP2] = ip2;
335 inputs[btagvar::IP2_C] = ip2_c;
336 inputs[btagvar::IP2_CU] = ip2_cu;
337 inputs[btagvar::IP2_NAN] = ip2_nan;
338 inputs[btagvar::IP2_C_NAN] = ip2_c_nan;
339 inputs[btagvar::IP2_CU_NAN] = ip2_cu_nan;
354 float ip3_c_nan = NAN;
355 float ip3_cu_nan = NAN;
357 std::vector<float> weightBofTracksIP3D;
359 if(!weightBofTracksIP3D.empty()) {
361 ip3d_pb =
BTag.IP3D_pb();
362 ip3d_pc =
BTag.IP3D_pc();
363 ip3d_pu =
BTag.IP3D_pu();
371 ip3 =
BTag.calcLLR(ip3d_pb,ip3d_pu);
372 ip3_c =
BTag.calcLLR(ip3d_pb,ip3d_pc);
373 ip3_cu =
BTag.calcLLR(ip3d_pc,ip3d_pu);
375 if(ip3d_pb<=0. or ip3d_pu<=0. or ip3d_pb==NAN or ip3d_pu==NAN) {
378 ip3_nan =
log(ip3d_pb/ip3d_pu);
381 if(ip3d_pb<=0. or ip3d_pc<=0. or ip3d_pb==NAN or ip3d_pc==NAN) {
384 ip3_c_nan =
log(ip3d_pb/ip3d_pc);
387 if(ip3d_pc<=0. or ip3d_pu<=0. or ip3d_pc==NAN or ip3d_pu==NAN) {
390 ip3_cu_nan =
log(ip3d_pc/ip3d_pu);
395 inputs[btagvar::IP3D_PB] = ip3d_pb;
396 inputs[btagvar::IP3D_PC] = ip3d_pc;
397 inputs[btagvar::IP3D_PU] = ip3d_pu;
398 inputs[btagvar::IP3] = ip3;
399 inputs[btagvar::IP3_C] = ip3_c;
400 inputs[btagvar::IP3_CU] = ip3_cu;
401 inputs[btagvar::IP3_NAN] = ip3_nan;
402 inputs[btagvar::IP3_C_NAN] = ip3_c_nan;
403 inputs[btagvar::IP3_CU_NAN] = ip3_cu_nan;
412 int sv0_n2t = INT_MISSING;
413 int sv0_ntrkv = INT_MISSING;
414 float sv0_efrc = NAN;
415 float sv0_mass = NAN;
416 float sv0_radius = NAN;
417 float sv0_sig3d = NAN;
418 float sv0_pv_x = NAN, sv0_pv_y = NAN;
422 std::vector< ElementLink< xAOD::VertexContainer > > myVertices_SV0;
423 BTag.variable<std::vector<ElementLink<xAOD::VertexContainer> > >(
m_sv1_infosource,
"vertices", myVertices_SV0);
425 if ( !myVertices_SV0.empty() && myVertices_SV0[0].isValid() ) {
447 sv0_radius = sqrt(
pow(sv0_pv_x,2)+
pow(sv0_pv_y,2));
451 inputs[btagvar::SV0_MASS] = sv0_mass;
452 inputs[btagvar::SV0_EFRC] = sv0_efrc;
453 inputs[btagvar::SV0_N2T] = nan_if_placeholder(sv0_n2t);
454 inputs[btagvar::SV0_NTRKV] = nan_if_placeholder(sv0_ntrkv);
455 inputs[btagvar::SV0_SIG3D] = sv0_sig3d;
456 inputs[btagvar::SV0_RADIUS] = sv0_radius;
462 float sv1_pb = NAN, sv1_pc = NAN, sv1_pu = NAN;
463 float sv1 = NAN, sv1_c = NAN, sv1_cu = NAN;
464 float sv1_nan = NAN, sv1_c_nan = NAN, sv1_cu_nan = NAN;
466 int sv1_n2t = INT_MISSING;
467 int sv1_ntrkv = INT_MISSING;
468 float sv1_efrc = NAN;
469 float sv1_mass = NAN;
472 float sv1_sig3d = NAN;
474 float sv1_distmatlay = NAN;
478 std::vector< ElementLink< xAOD::VertexContainer > > myVertices_SV1;
479 BTag.variable<std::vector<ElementLink<xAOD::VertexContainer> > >(
m_sv1_infosource,
"vertices", myVertices_SV1);
480 if ( !myVertices_SV1.empty() && myVertices_SV1[0].isValid() ) {
487 sv1_pb=
BTag.SV1_pb();
488 sv1_pu=
BTag.SV1_pu();
489 sv1_pc=
BTag.SV1_pc();
513 sv1 =
BTag.calcLLR(sv1_pb,sv1_pu);
514 sv1_c =
BTag.calcLLR(sv1_pb,sv1_pc);
515 sv1_cu =
BTag.calcLLR(sv1_pc,sv1_pu);
517 if(sv1_pb<=0. or sv1_pu<=0. or sv1_pb==NAN or sv1_pu==NAN) {
520 sv1_nan =
log(sv1_pb/sv1_pu);
523 if(sv1_pb<=0. or sv1_pc<=0. or sv1_pb==NAN or sv1_pc==NAN) {
526 sv1_c_nan =
log(sv1_pb/sv1_pc);
529 if(sv1_pc<=0. or sv1_pu<=0. or sv1_pc==NAN or sv1_pu==NAN) {
532 sv1_cu_nan =
log(sv1_pc/sv1_pu);
537 inputs[btagvar::SV1_PB] = sv1_pb;
538 inputs[btagvar::SV1_PC] = sv1_pc;
539 inputs[btagvar::SV1_PU] = sv1_pu;
540 inputs[btagvar::SV1] = sv1;
541 inputs[btagvar::SV1_C] = sv1_c;
542 inputs[btagvar::SV1_CU] = sv1_cu;
543 inputs[btagvar::SV1_NAN] = sv1_nan;
544 inputs[btagvar::SV1_C_NAN] = sv1_c_nan;
545 inputs[btagvar::SV1_CU_NAN] = sv1_cu_nan;
547 inputs[btagvar::SV1_EFRC] = sv1_efrc;
548 inputs[btagvar::SV1_MASS] = sv1_mass;
549 inputs[btagvar::SV1_N2T] = nan_if_placeholder(sv1_n2t);
550 inputs[btagvar::SV1_NTRKV] = nan_if_placeholder(sv1_ntrkv);
551 inputs[btagvar::SV1_LXY] = sv1_Lxy;
552 inputs[btagvar::SV1_L3D] = sv1_L3d;
553 inputs[btagvar::SV1_SIG3D] = sv1_sig3d;
554 inputs[btagvar::SV1_DR] = sv1_dR;
555 inputs[btagvar::SV1_DISTMATLAY] = sv1_distmatlay;
568 std::string valid_key =
key +
"IsValid";
573 " tagger inputs may be incomplete");
576 " may be interperated incorrectly");
578 }
else if (!valid_keyAcc(
BTag)) {
591 double nan_if_placeholder(
int in) {
592 if (in == INT_MISSING)
return NAN;