ATLAS Offline Software
Loading...
Searching...
No Matches
Root::TElectronLikelihoodTool Class Reference

#include <TElectronLikelihoodTool.h>

Inheritance diagram for Root::TElectronLikelihoodTool:
Collaboration diagram for Root::TElectronLikelihoodTool:

Public Member Functions

 TElectronLikelihoodTool (const char *name="TElectronLikelihoodTool")
 Standard constructor.
StatusCode initialize ()
 Initialize this class.
const asg::AcceptInfogetAcceptInfo () const
 accesss to the accept info object
asg::AcceptData accept (LikeEnum::LHAcceptVars_t &vars_struct) const
 The main accept method: the actual cuts are applied here.
asg::AcceptData accept (double likelihood, double eta, double eT, int nSiHitsPlusDeadSensors, int nPixHitsPlusDeadSensors, bool passBLayerRequirement, uint8_t ambiguityBit, double d0, double deltaEta, double deltaphires, double wstot, double EoverP, double ip) const
asg::AcceptData accept () const
 Return dummy accept with only info.
double calculate (LikeEnum::LHCalcVars_t &vars_struct) const
double calculate (double eta, double eT, double f3, double rHad, double rHad1, double Reta, double w2, double f1, double eratio, double deltaEta, double d0, double d0sigma, double rphi, double deltaPoverP, double deltaphires, double TRT_PID, double ip) const
void setPDFFileName (const std::string &val)
 Add an input file that holds the PDFs.
void setVariableNames (const std::string &val)
 Define the variable names.
int loadVarHistograms (const std::string &vstr, TFile *pdfFile, unsigned int varIndex)
 Load the variable histograms from the pdf file.
void setBinning (const std::string &val)
 Define the binning.
unsigned int getBitmask (void) const
void setBitmask (unsigned int val)
void setLevel (MSG::Level lvl)
 Change the current logging level.
Functions providing the same interface as AthMessaging
bool msgLvl (const MSG::Level lvl) const
 Test the output level of the object.
MsgStream & msg () const
 The standard message stream.
MsgStream & msg (const MSG::Level lvl) const
 The standard message stream.

Public Attributes

std::vector< int > m_cutBL
 cut min on b-layer hits
std::vector< int > m_cutPi
 cut min on pixel hits
std::vector< int > m_cutSi
 cut min on precision hits
std::vector< double > m_cutA0
 cut max on track d0 bit
std::vector< double > m_cutDeltaEta
 do cut on delta eta bit
std::vector< double > m_cutDeltaPhiRes
 do cut on delta phi bit
std::vector< int > m_cutAmbiguity
 do cut on ambiguity bit
bool m_doRemoveF3AtHighEt
 do remove f3 variable from likelihood at high Et (>80 GeV)
bool m_doRemoveTRTPIDAtHighEt
 do remove TRTPID variable from likelihood at high Et (>80 GeV)
bool m_doSmoothBinInterpolation
 do smooth interpolation between bins
bool m_useOneExtraHighETLHBin
 use one extra bin for high ET LH
double m_highETBinThreshold
 ET threshold for using high ET cuts and bin.
std::vector< double > m_cutWstotAtHighET
 do cut on wstot above HighETBinThreshold bit
std::vector< double > m_cutEoverPAtHighET
 do cut on EoverP above HighETBinThreshold bit
bool m_doPileupTransform
 do pileup-dependent transform on discriminant value
bool m_doCentralityTransform
 do centrality-dependent transform on discriminant value
std::vector< double > m_cutLikelihood
 cut on likelihood output
std::vector< double > m_cutLikelihoodPileupCorrection
 pileup correction factor for cut on likelihood output
std::vector< double > m_cutLikelihood4GeV
 cut on likelihood output, 4 GeV bin
std::vector< double > m_cutLikelihoodPileupCorrection4GeV
 pileup correction factor for cut on likelihood output, 4 GeV bin
std::vector< double > m_discHardCutForPileupTransform
 reference disc for very hard cut; used by pileup transform
std::vector< double > m_discHardCutSlopeForPileupTransform
 reference slope on disc for very hard cut; used by pileup transform
std::vector< double > m_discHardCutQuadForPileupTransform
 reference quadratic apr on disc for very hard cut; used by centrality transform
std::vector< double > m_discLooseForPileupTransform
 reference disc for a pileup independent loose menu; used by pileup transform
std::vector< double > m_discHardCutForPileupTransform4GeV
 reference disc for very hard cut; used by pileup transform - 4-7 GeV
std::vector< double > m_discHardCutSlopeForPileupTransform4GeV
 reference slope on disc for very hard cut; used by pileup transform
std::vector< double > m_discHardCutQuadForPileupTransform4GeV
 reference quadratic par on disc for very hard cut; used by centrality transform - 4-7 GeV
std::vector< double > m_discLooseForPileupTransform4GeV
 reference disc for a pileup independent loose menu; used by pileup transform - 4-7 GeV
double m_discMaxForPileupTransform
 max discriminant for which pileup transform is to be used
double m_pileupMaxForPileupTransform
 max nvtx or mu to be used in pileup transform
std::string m_variableNames
 variables to use in the LH
std::string m_pdfFileName
 Name of the pdf file.

Private Member Functions

double evaluateLikelihood (const std::vector< double > &varVector, double et, double eta, double ip=0) const
double evaluateLikelihood (const std::vector< float > &varVector, double et, double eta, double ip=0) const
unsigned int getLikelihoodBitmask (const std::string &vars) const
double InterpolateCuts (const std::vector< double > &cuts, const std::vector< double > &cuts_4gev, double et, double eta) const
double InterpolatePdfs (unsigned int s_or_b, unsigned int ipbin, double et, double eta, int bin, unsigned int var) const
double TransformLikelihoodOutput (double ps, double pb, double ip, double et, double eta) const
 Apply a transform to zoom into the LH output peaks.
unsigned int getLikelihoodEtDiscBin (double eT, const bool isLHbinning) const
 Fine Et binning. Used for the likelihood discriminant cuts.
void initMessaging () const
 Initialize our message level and MessageSvc.

Static Private Member Functions

static unsigned int getLikelihoodEtaBin (double eta)
 Eta binning for pdfs and discriminant cuts.
static unsigned int getLikelihoodEtHistBin (double eT)
 Coarse Et binning. Used for the likelihood pdfs.
static unsigned int getIpBin (double ip)
static std::string getBinName (int etbin, int etabin, int ipbin, const std::string &iptype)

Private Attributes

std::string m_name
 tool name
asg::AcceptInfo m_acceptInfo
 Accept info.
unsigned int m_variableBitMask
 The bitmask corresponding to the variables in the likelihood.
std::string m_ipBinning
 Deprecated.
int m_cutPosition_kinematic
 The position of the kinematic cut bit in the AcceptInfo return object.
int m_cutPosition_NSilicon
 The position of the NSilicon cut bit in the AcceptInfo return object.
int m_cutPosition_NPixel
 The position of the NPixel cut bit in the AcceptInfo return object.
int m_cutPosition_NBlayer
 The position of the NBlayer cut bit in the AcceptInfo return object.
int m_cutPosition_ambiguity
 The position of the ambiguity cut bit in the AcceptInfo return object.
int m_cutPosition_LH
 The position of the likelihood cut bit in the AcceptInfo return object.
int m_cutPositionTrackA0
 The position of the d0 cut bit in the AcceptInfo return object.
int m_cutPositionTrackMatchEta
 The position of the deltaeta cut bit in the AcceptInfo return object.
int m_cutPositionTrackMatchPhiRes
 The position of the deltaphi cut bit in the AcceptInfo return object.
int m_cutPositionWstotAtHighET
 The position of the high ET wstot cut bit in the AcceptInfo return object.
int m_cutPositionEoverPAtHighET
 The position of the high ET EoverP cut bit in the AcceptInfo return object.
std::unique_ptr< EGSelectors::SafeTH1m_fPDFbins [2][IP_BINS][s_fnEtBinsHist][s_fnEtaBins][s_fnVariables]
std::string m_nm
 Message source name.
boost::thread_specific_ptr< MsgStream > m_msg_tls
 MsgStream instance (a std::cout like with print-out levels).
std::atomic< IMessageSvc * > m_imsg { nullptr }
 MessageSvc pointer.
std::atomic< MSG::Level > m_lvl { MSG::NIL }
 Current logging level.
std::atomic_flag m_initialized ATLAS_THREAD_SAFE = ATOMIC_FLAG_INIT
 Messaging initialized (initMessaging).

Static Private Attributes

static constexpr double s_fIpBounds [IP_BINS+1] = { 0., 500. }
static constexpr unsigned int s_fnEtBinsHist = 7
static constexpr unsigned int s_fnDiscEtBins = 9
static constexpr unsigned int s_fnDiscEtBinsOneExtra = 10
static constexpr unsigned int s_fnEtaBins = 10
static constexpr unsigned int s_fnVariables = 13
static const std::string s_fVariables [s_fnVariables]

Detailed Description

Definition at line 78 of file TElectronLikelihoodTool.h.

Constructor & Destructor Documentation

◆ TElectronLikelihoodTool()

Root::TElectronLikelihoodTool::TElectronLikelihoodTool ( const char * name = "TElectronLikelihoodTool")

Standard constructor.

Author : Kurt Brendlinger kurb@.nosp@m.sas..nosp@m.upenn.nosp@m..edu Please see TElectronLikelihoodTool.h for usage.

Definition at line 27 of file TElectronLikelihoodTool.cxx.

28 : asg::AsgMessaging(std::string(name))
34 , m_doPileupTransform(false)
38 , m_variableNames("")
39 , m_pdfFileName("")
40 , m_name(name)
42 , m_ipBinning("")
54{
55}
int m_cutPosition_NPixel
The position of the NPixel cut bit in the AcceptInfo return object.
int m_cutPositionTrackMatchEta
The position of the deltaeta cut bit in the AcceptInfo return object.
bool m_useOneExtraHighETLHBin
use one extra bin for high ET LH
double m_highETBinThreshold
ET threshold for using high ET cuts and bin.
int m_cutPosition_ambiguity
The position of the ambiguity cut bit in the AcceptInfo return object.
int m_cutPositionTrackA0
The position of the d0 cut bit in the AcceptInfo return object.
int m_cutPosition_NBlayer
The position of the NBlayer cut bit in the AcceptInfo return object.
std::string m_variableNames
variables to use in the LH
bool m_doRemoveTRTPIDAtHighEt
do remove TRTPID variable from likelihood at high Et (>80 GeV)
int m_cutPosition_kinematic
The position of the kinematic cut bit in the AcceptInfo return object.
std::string m_pdfFileName
Name of the pdf file.
double m_discMaxForPileupTransform
max discriminant for which pileup transform is to be used
int m_cutPosition_LH
The position of the likelihood cut bit in the AcceptInfo return object.
int m_cutPositionWstotAtHighET
The position of the high ET wstot cut bit in the AcceptInfo return object.
bool m_doRemoveF3AtHighEt
do remove f3 variable from likelihood at high Et (>80 GeV)
int m_cutPositionEoverPAtHighET
The position of the high ET EoverP cut bit in the AcceptInfo return object.
unsigned int m_variableBitMask
The bitmask corresponding to the variables in the likelihood.
bool m_doCentralityTransform
do centrality-dependent transform on discriminant value
double m_pileupMaxForPileupTransform
max nvtx or mu to be used in pileup transform
int m_cutPosition_NSilicon
The position of the NSilicon cut bit in the AcceptInfo return object.
int m_cutPositionTrackMatchPhiRes
The position of the deltaphi cut bit in the AcceptInfo return object.
bool m_doPileupTransform
do pileup-dependent transform on discriminant value
bool m_doSmoothBinInterpolation
do smooth interpolation between bins

Member Function Documentation

◆ accept() [1/3]

asg::AcceptData Root::TElectronLikelihoodTool::accept ( ) const
inline

Return dummy accept with only info.

Definition at line 109 of file TElectronLikelihoodTool.h.

109{ return asg::AcceptData(&m_acceptInfo); }
asg::AcceptInfo m_acceptInfo
Accept info.

◆ accept() [2/3]

asg::AcceptData Root::TElectronLikelihoodTool::accept ( double likelihood,
double eta,
double eT,
int nSiHitsPlusDeadSensors,
int nPixHitsPlusDeadSensors,
bool passBLayerRequirement,
uint8_t ambiguityBit,
double d0,
double deltaEta,
double deltaphires,
double wstot,
double EoverP,
double ip ) const

Definition at line 400 of file TElectronLikelihoodTool.cxx.

413{
414 LikeEnum::LHAcceptVars_t vars{};
415 vars.likelihood = likelihood;
416 vars.eta = eta;
417 vars.eT = eT;
418 vars.nSiHitsPlusDeadSensors = nSiHitsPlusDeadSensors;
421 vars.ambiguityBit = ambiguityBit;
422 vars.d0 = d0;
423 vars.deltaEta = deltaEta;
424 vars.deltaphires = deltaphires;
425 vars.wstot = wstot;
426 vars.EoverP = EoverP;
427 vars.ip = ip;
428
429 return accept(vars);
430}
Scalar eta() const
pseudorapidity method
asg::AcceptData accept() const
Return dummy accept with only info.
bool passBLayerRequirement(const xAOD::TrackParticle &tp)
return true if effective number of BL hits + outliers is at least one
float eT(const U &p)
Accessor utility function for getting the value of Tranverse energy.
double deltaEta(const I4Momentum &p1, const I4Momentum &p2)
Computes efficiently .
Definition P4Helpers.h:66
setEt setPhi setE277 setWeta2 setEta1 setE2tsts1 wstot

◆ accept() [3/3]

asg::AcceptData Root::TElectronLikelihoodTool::accept ( LikeEnum::LHAcceptVars_t & vars_struct) const

The main accept method: the actual cuts are applied here.

Definition at line 435 of file TElectronLikelihoodTool.cxx.

437{
438 // Setup return accept with AcceptInfo
439 asg::AcceptData acceptData(&m_acceptInfo);
440
441 // Set up the individual cuts
442 bool passKine(true);
443 bool passNSilicon(true);
444 bool passNPixel(true);
445 bool passNBlayer(true);
446 bool passAmbiguity(true);
447 bool passLH(true);
448 bool passTrackA0(true);
449 bool passDeltaEta(true);
450 bool passDeltaPhiRes(true);
451 bool passWstotAtHighET(true);
452 bool passEoverPAtHighET(true);
453
454 if (std::abs(vars_struct.eta) > 2.47) {
455 ATH_MSG_DEBUG("This electron is std::abs(eta)>2.47 Returning False.");
456 passKine = false;
457 }
458
459 unsigned int etbinLH = getLikelihoodEtDiscBin(vars_struct.eT, true);
460 unsigned int etbinOther = getLikelihoodEtDiscBin(vars_struct.eT, false);
461 unsigned int etabin = getLikelihoodEtaBin(vars_struct.eta);
462
463 // sanity
464 if (etbinLH >= s_fnDiscEtBinsOneExtra) {
465 ATH_MSG_WARNING("Cannot evaluate likelihood for Et "
466 << vars_struct.eT << ". Returning false..");
467 passKine = false;
468 }
469 // sanity
470 if (etbinOther >= s_fnDiscEtBins) {
471 ATH_MSG_WARNING("Cannot evaluate likelihood for Et "
472 << vars_struct.eT << ". Returning false..");
473 passKine = false;
474 }
475
476 // Return if the kinematic requirements are not fulfilled
477 acceptData.setCutResult(m_cutPosition_kinematic, passKine);
478 if (!passKine) {
479 return acceptData;
480 }
481
482 // ambiguity bit
483 if (!m_cutAmbiguity.empty()) {
486 m_cutAmbiguity[etabin])) {
487 ATH_MSG_DEBUG("Likelihood macro: ambiguity Bit Failed.");
488 passAmbiguity = false;
489 }
490 }
491
492 // blayer cut
493 if (!m_cutBL.empty()) {
494 if (m_cutBL[etabin] == 1 && !vars_struct.passBLayerRequirement) {
495 ATH_MSG_DEBUG("Likelihood macro: Blayer cut failed.");
496 passNBlayer = false;
497 }
498 }
499 // pixel cut
500 if (!m_cutPi.empty()) {
501 if (vars_struct.nPixHitsPlusDeadSensors < m_cutPi[etabin]) {
502 ATH_MSG_DEBUG("Likelihood macro: Pixels Failed.");
503 passNPixel = false;
504 }
505 }
506 // silicon cut
507 if (!m_cutSi.empty()) {
508 if (vars_struct.nSiHitsPlusDeadSensors < m_cutSi[etabin]) {
509 ATH_MSG_DEBUG("Likelihood macro: Silicon Failed.");
510 passNSilicon = false;
511 }
512 }
513
514 double cutDiscriminant;
515 unsigned int ibin_combinedLH =
516 etbinLH * s_fnEtaBins + etabin; // Must change if number of eta bins
517 // changes!. Also starts from 7-10 GeV bin.
518 unsigned int ibin_combinedOther =
519 etbinOther * s_fnEtaBins +
520 etabin; // Must change if number of eta bins changes!. Also
521 // starts from 7-10 GeV bin.
522
523 if (!m_cutLikelihood.empty()) {
524 // To protect against a binning mismatch, which should never happen
525 if (ibin_combinedLH >= m_cutLikelihood.size()) {
526 ATH_MSG_ERROR("The desired eta/pt bin "
527 << ibin_combinedLH
528 << " is outside of the range specified by the input"
529 << m_cutLikelihood.size() << "This should never happen!");
530 return acceptData;
531 }
532
534 cutDiscriminant = InterpolateCuts(
535 m_cutLikelihood, m_cutLikelihood4GeV, vars_struct.eT, vars_struct.eta);
538 cutDiscriminant +=
541 vars_struct.eT,
542 vars_struct.eta);
543 } else {
544 if (vars_struct.eT > 7000. || m_cutLikelihood4GeV.empty()) {
545 cutDiscriminant = m_cutLikelihood[ibin_combinedLH];
546 // If doPileupTransform, then correct the discriminant itself instead of
547 // the cut value
549 cutDiscriminant +=
550 vars_struct.ip * m_cutLikelihoodPileupCorrection[ibin_combinedLH];
551 }
552 } else {
553 cutDiscriminant = m_cutLikelihood4GeV[etabin];
554 if (!m_doPileupTransform &&
556 cutDiscriminant +=
557 vars_struct.ip * m_cutLikelihoodPileupCorrection4GeV[etabin];
558 }
559 }
560
561 // Determine if the calculated likelihood value passes the cut
562 ATH_MSG_DEBUG("Likelihood macro: Discriminant: ");
563 if (vars_struct.likelihood < cutDiscriminant) {
564 ATH_MSG_DEBUG("Likelihood macro: Disciminant Cut Failed.");
565 passLH = false;
566 }
567 }
568
569 // d0 cut
570 if (!m_cutA0.empty()) {
571 if (std::abs(vars_struct.d0) > m_cutA0[ibin_combinedOther]) {
572 ATH_MSG_DEBUG("Likelihood macro: D0 Failed.");
573 passTrackA0 = false;
574 }
575 }
576
577 // deltaEta cut
578 if (!m_cutDeltaEta.empty()) {
579 if (std::abs(vars_struct.deltaEta) > m_cutDeltaEta[ibin_combinedOther]) {
580 ATH_MSG_DEBUG("Likelihood macro: deltaEta Failed.");
581 passDeltaEta = false;
582 }
583 }
584
585 // deltaPhiRes cut
586 if (!m_cutDeltaPhiRes.empty()) {
587 if (std::abs(vars_struct.deltaphires) >
588 m_cutDeltaPhiRes[ibin_combinedOther]) {
589 ATH_MSG_DEBUG("Likelihood macro: deltaphires Failed.");
590 passDeltaPhiRes = false;
591 }
592 }
593
594 // Only do this above HighETBinThreshold [in GeV]
595 if (vars_struct.eT > m_highETBinThreshold * 1000) {
596 // wstot cut
597 if (!m_cutWstotAtHighET.empty()) {
598 if (std::abs(vars_struct.wstot) > m_cutWstotAtHighET[etabin]) {
599 ATH_MSG_DEBUG("Likelihood macro: wstot Failed.");
600 passWstotAtHighET = false;
601 }
602 }
603
604 // EoverP cut
605 if (!m_cutEoverPAtHighET.empty()) {
606 if (std::abs(vars_struct.EoverP) > m_cutEoverPAtHighET[etabin]) {
607 ATH_MSG_DEBUG("Likelihood macro: EoverP Failed.");
608 passEoverPAtHighET = false;
609 }
610 }
611 }
612
613 // Set the individual cut bits in the return object
614 acceptData.setCutResult(m_cutPosition_NSilicon, passNSilicon);
615 acceptData.setCutResult(m_cutPosition_NPixel, passNPixel);
616 acceptData.setCutResult(m_cutPosition_NBlayer, passNBlayer);
617 acceptData.setCutResult(m_cutPosition_ambiguity, passAmbiguity);
618 acceptData.setCutResult(m_cutPosition_LH, passLH);
619 acceptData.setCutResult(m_cutPositionTrackA0, passTrackA0);
620 acceptData.setCutResult(m_cutPositionTrackMatchEta, passDeltaEta);
621 acceptData.setCutResult(m_cutPositionTrackMatchPhiRes, passDeltaPhiRes);
622 acceptData.setCutResult(m_cutPositionWstotAtHighET, passWstotAtHighET);
623 acceptData.setCutResult(m_cutPositionEoverPAtHighET, passEoverPAtHighET);
624 return acceptData;
625}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
static constexpr unsigned int s_fnDiscEtBinsOneExtra
static constexpr unsigned int s_fnDiscEtBins
std::vector< int > m_cutSi
cut min on precision hits
double InterpolateCuts(const std::vector< double > &cuts, const std::vector< double > &cuts_4gev, double et, double eta) const
std::vector< int > m_cutBL
cut min on b-layer hits
std::vector< int > m_cutAmbiguity
do cut on ambiguity bit
std::vector< int > m_cutPi
cut min on pixel hits
std::vector< double > m_cutLikelihoodPileupCorrection4GeV
pileup correction factor for cut on likelihood output, 4 GeV bin
std::vector< double > m_cutA0
cut max on track d0 bit
std::vector< double > m_cutEoverPAtHighET
do cut on EoverP above HighETBinThreshold bit
std::vector< double > m_cutLikelihood4GeV
cut on likelihood output, 4 GeV bin
std::vector< double > m_cutWstotAtHighET
do cut on wstot above HighETBinThreshold bit
static unsigned int getLikelihoodEtaBin(double eta)
Eta binning for pdfs and discriminant cuts.
std::vector< double > m_cutDeltaPhiRes
do cut on delta phi bit
std::vector< double > m_cutLikelihoodPileupCorrection
pileup correction factor for cut on likelihood output
std::vector< double > m_cutLikelihood
cut on likelihood output
unsigned int getLikelihoodEtDiscBin(double eT, const bool isLHbinning) const
Fine Et binning. Used for the likelihood discriminant cuts.
static constexpr unsigned int s_fnEtaBins
std::vector< double > m_cutDeltaEta
do cut on delta eta bit
bool passAmbiguity(xAOD::AmbiguityTool::AmbiguityType type, const uint16_t criterion)
return true if the ambiguity type is one of several that are stored in a bitmask

◆ calculate() [1/2]

double Root::TElectronLikelihoodTool::calculate ( double eta,
double eT,
double f3,
double rHad,
double rHad1,
double Reta,
double w2,
double f1,
double eratio,
double deltaEta,
double d0,
double d0sigma,
double rphi,
double deltaPoverP,
double deltaphires,
double TRT_PID,
double ip ) const

Definition at line 628 of file TElectronLikelihoodTool.cxx.

645{
646
647 LikeEnum::LHCalcVars_t vars{};
648
649 vars.eta = eta;
650 vars.eT = eT;
651 vars.f3 = f3;
652 vars.rHad = rHad;
653 vars.rHad1 = rHad1;
654 vars.Reta = Reta;
655 vars.w2 = w2;
656 vars.f1 = f1;
657 vars.eratio = eratio;
658 vars.deltaEta = deltaEta;
659 vars.d0 = d0;
660 vars.d0sigma = d0sigma;
661 vars.rphi = rphi;
662 vars.deltaPoverP = deltaPoverP;
663 vars.deltaphires = deltaphires;
664 vars.TRT_PID = TRT_PID;
665 vars.ip = ip;
666
667 return calculate(vars);
668}
double calculate(LikeEnum::LHCalcVars_t &vars_struct) const
@ f3
fraction of energy reconstructed in 3rd sampling
Definition EgammaEnums.h:55
setCharge setNTRTHiThresholdHits eratio

◆ calculate() [2/2]

double Root::TElectronLikelihoodTool::calculate ( LikeEnum::LHCalcVars_t & vars_struct) const

Definition at line 672 of file TElectronLikelihoodTool.cxx.

674{
675 // Reset the results to defaul values
676 double result = -999;
677
678 unsigned int etabin = getLikelihoodEtaBin(vars_struct.eta);
679 double rhad_corr;
680 if (etabin == 3 || etabin == 4) {
681 rhad_corr = vars_struct.rHad;
682 } else {
683 rhad_corr = vars_struct.rHad1;
684 }
685 double d0significance = vars_struct.d0sigma == 0
686 ? 0.
687 : std::abs(vars_struct.d0) / vars_struct.d0sigma;
688
689 std::vector<double> vec = {
690 d0significance, vars_struct.eratio, vars_struct.deltaEta,
691 vars_struct.f1, vars_struct.f3, vars_struct.Reta,
692 rhad_corr, vars_struct.rphi, vars_struct.d0,
693 vars_struct.w2, vars_struct.deltaPoverP, vars_struct.deltaphires,
694 vars_struct.TRT_PID
695 };
696 // Calculate the actual likelihood value and fill the return object
698 vec, vars_struct.eT, vars_struct.eta, vars_struct.ip);
699
700 return result;
701}
std::vector< size_t > vec
double evaluateLikelihood(const std::vector< double > &varVector, double et, double eta, double ip=0) const

◆ evaluateLikelihood() [1/2]

double Root::TElectronLikelihoodTool::evaluateLikelihood ( const std::vector< double > & varVector,
double et,
double eta,
double ip = 0 ) const
private

Definition at line 719 of file TElectronLikelihoodTool.cxx.

724{
725
726 const double GeV = 1000;
727 unsigned int etbin = getLikelihoodEtHistBin(et); // hist binning
728 unsigned int etabin = getLikelihoodEtaBin(eta);
729 unsigned int ipbin = getIpBin(ip);
730
731 ATH_MSG_DEBUG("et: " << et << " eta: " << eta << " etbin: " << etbin
732 << " etabin: " << etabin);
733
734 if (etbin >= s_fnEtBinsHist) {
735 ATH_MSG_WARNING("skipping etbin " << etbin << ", et " << et);
736 return -999.;
737 }
738 if (etabin >= s_fnEtaBins) {
739 ATH_MSG_WARNING("skipping etabin " << etabin << ", eta " << eta);
740 return -999.;
741 }
742
743 if (varVector.size() != s_fnVariables) {
744 ATH_MSG_WARNING("Error! Variable vector size mismatch! Check your vector!");
745 }
746
747 double SigmaS = 1.;
748 double SigmaB = 1.;
749
750 // define some string constants
751 const std::string TRT_string = "TRT";
752 const std::string el_f3_string = "el_f3";
753 const std::string el_TRT_PID_string = "el_TRT_PID";
754
755 for (unsigned int var = 0; var < s_fnVariables; var++) {
756
757 const std::string& varstr = s_fVariables[var];
758
759 // Skip variables that are masked off (not used) in the likelihood
760 if (!(m_variableBitMask & (0x1 << var))) {
761 continue;
762 }
763 // Don't use TRT for outer eta bins (2.01,2.37)
764 if (((etabin == 8) || (etabin == 9)) &&
765 (varstr.find(TRT_string) != std::string::npos)) {
766 continue;
767 }
768 // Don't use f3 for outer eta bin (2.37)
769 if ((etabin == 9) && (varstr.find(el_f3_string) != std::string::npos)) {
770 continue;
771 }
772 // Don't use f3 for high et (>80 GeV)
773 if (m_doRemoveF3AtHighEt && (et > 80 * GeV) &&
774 (varstr.find(el_f3_string) != std::string::npos)) {
775 continue;
776 }
777 // Don't use TRTPID for high et (>80 GeV)
778 if (m_doRemoveTRTPIDAtHighEt && (et > 80 * GeV) &&
779 (varstr.find(el_TRT_PID_string) != std::string::npos)) {
780 continue;
781 }
782 for (unsigned int s_or_b = 0; s_or_b < 2; s_or_b++) {
783
784 int bin =
785 m_fPDFbins[s_or_b][ipbin][etbin][etabin][var]->FindBin(varVector[var]);
786
787 double prob = 0;
789 prob = InterpolatePdfs(s_or_b, ipbin, et, eta, bin, var);
790 } else {
791 double integral =
792 double(m_fPDFbins[s_or_b][ipbin][etbin][etabin][var]->Integral());
793 if (integral == 0) {
794 ATH_MSG_WARNING("Error! PDF integral == 0!");
795 return -1.35;
796 }
797
798 prob =
799 double(
800 m_fPDFbins[s_or_b][ipbin][etbin][etabin][var]->GetBinContent(bin)) /
801 integral;
802 }
803
804 if (s_or_b == 0) {
805 SigmaS *= prob;
806 } else if (s_or_b == 1) {
807 SigmaB *= prob;
808 }
809 }
810 }
811
812 return TransformLikelihoodOutput(SigmaS, SigmaB, ip, et, eta);
813}
float et(const xAOD::jFexSRJetRoI *j)
std::unique_ptr< EGSelectors::SafeTH1 > m_fPDFbins[2][IP_BINS][s_fnEtBinsHist][s_fnEtaBins][s_fnVariables]
static constexpr unsigned int s_fnEtBinsHist
static const std::string s_fVariables[s_fnVariables]
static unsigned int getIpBin(double ip)
static unsigned int getLikelihoodEtHistBin(double eT)
Coarse Et binning. Used for the likelihood pdfs.
static constexpr unsigned int s_fnVariables
double InterpolatePdfs(unsigned int s_or_b, unsigned int ipbin, double et, double eta, int bin, unsigned int var) const
double TransformLikelihoodOutput(double ps, double pb, double ip, double et, double eta) const
Apply a transform to zoom into the LH output peaks.
double integral(TH1 *h)
Definition computils.cxx:59

◆ evaluateLikelihood() [2/2]

double Root::TElectronLikelihoodTool::evaluateLikelihood ( const std::vector< float > & varVector,
double et,
double eta,
double ip = 0 ) const
private

Definition at line 704 of file TElectronLikelihoodTool.cxx.

709{
710 std::vector<double> vec;
711 vec.reserve(s_fnVariables);
712for (unsigned int var = 0; var < s_fnVariables; var++) {
713 vec.push_back(varVector[var]);
714 }
715 return evaluateLikelihood(vec, et, eta, ip);
716}

◆ getAcceptInfo()

const asg::AcceptInfo & Root::TElectronLikelihoodTool::getAcceptInfo ( ) const
inline

accesss to the accept info object

Definition at line 91 of file TElectronLikelihoodTool.h.

91{ return m_acceptInfo; }

◆ getBinName()

std::string Root::TElectronLikelihoodTool::getBinName ( int etbin,
int etabin,
int ipbin,
const std::string & iptype )
staticprivate

Definition at line 1063 of file TElectronLikelihoodTool.cxx.

1067{
1068 const double eta_bounds[9] = { 0.0, 0.6, 0.8, 1.15, 1.37, 1.52, 1.81, 2.01, 2.37 };
1069 const int et_bounds[s_fnEtBinsHist] = { 4, 7, 10, 15, 20, 30, 40 };
1070 if (!iptype.empty()) {
1071 return std::format("{}{}et{:02}eta{:.2f}",
1072 iptype, int(s_fIpBounds[ipbin]),
1073 et_bounds[etbin], eta_bounds[etabin]);
1074 } else {
1075 return std::format("et{}eta{:.2f}",
1076 et_bounds[etbin], eta_bounds[etabin]);
1077 }
1078}
static constexpr double s_fIpBounds[IP_BINS+1]

◆ getBitmask()

unsigned int Root::TElectronLikelihoodTool::getBitmask ( void ) const
inline

Definition at line 148 of file TElectronLikelihoodTool.h.

148{ return m_variableBitMask; }

◆ getIpBin()

unsigned int Root::TElectronLikelihoodTool::getIpBin ( double ip)
staticprivate

Definition at line 976 of file TElectronLikelihoodTool.cxx.

977{
978 for (unsigned int ipBin = 0; ipBin < IP_BINS; ++ipBin) {
979 if (ip < s_fIpBounds[ipBin + 1])
980 return ipBin;
981 }
982 return 0;
983}

◆ getLikelihoodBitmask()

unsigned int Root::TElectronLikelihoodTool::getLikelihoodBitmask ( const std::string & vars) const
private

Definition at line 1081 of file TElectronLikelihoodTool.cxx.

1083{
1084 unsigned int mask = 0x0;
1085 ATH_MSG_DEBUG("Variables to be used: ");
1086 for (unsigned int var = 0; var < s_fnVariables; var++) {
1087 if (vars.find(s_fVariables[var]) != std::string::npos) {
1089 mask = mask | 0x1 << var;
1090 }
1091 }
1092 ATH_MSG_DEBUG("mask: " << mask);
1093 return mask;
1094}

◆ getLikelihoodEtaBin()

unsigned int Root::TElectronLikelihoodTool::getLikelihoodEtaBin ( double eta)
staticprivate

Eta binning for pdfs and discriminant cuts.

Definition at line 988 of file TElectronLikelihoodTool.cxx.

989{
990 const unsigned int nEtaBins = s_fnEtaBins;
991 const double etaBins[nEtaBins] = { 0.1, 0.6, 0.8, 1.15, 1.37,
992 1.52, 1.81, 2.01, 2.37, 2.47 };
993
994 for (unsigned int etaBin = 0; etaBin < nEtaBins; ++etaBin) {
995 if (std::abs(eta) < etaBins[etaBin])
996 return etaBin;
997 }
998
999 return 9;
1000}
constexpr unsigned nEtaBins
setSAddress setEtaMS setDirPhiMS setDirZMS setBarrelRadius setEndcapAlpha setEndcapRadius setInterceptInner setEtaMap etaBin

◆ getLikelihoodEtDiscBin()

unsigned int Root::TElectronLikelihoodTool::getLikelihoodEtDiscBin ( double eT,
const bool isLHbinning ) const
private

Fine Et binning. Used for the likelihood discriminant cuts.

Definition at line 1024 of file TElectronLikelihoodTool.cxx.

1027{
1028 const double GeV = 1000;
1029
1030 if (m_useOneExtraHighETLHBin && isLHbinning) {
1031 const unsigned int nEtBins = s_fnDiscEtBinsOneExtra;
1032 const double eTBins[nEtBins] = {
1033 10 * GeV, 15 * GeV, 20 * GeV,
1034 25 * GeV, 30 * GeV, 35 * GeV,
1035 40 * GeV, 45 * GeV, m_highETBinThreshold * GeV,
1036 6000 * GeV
1037 };
1038
1039 for (unsigned int eTBin = 0; eTBin < nEtBins; ++eTBin) {
1040 if (eT < eTBins[eTBin])
1041 return eTBin;
1042 }
1043
1044 return nEtBins - 1; // Return the last bin if > the last bin.
1045 }
1046
1047 const unsigned int nEtBins = s_fnDiscEtBins;
1048 const double eTBins[nEtBins] = { 10 * GeV, 15 * GeV, 20 * GeV,
1049 25 * GeV, 30 * GeV, 35 * GeV,
1050 40 * GeV, 45 * GeV, 50 * GeV };
1051
1052 for (unsigned int eTBin = 0; eTBin < nEtBins; ++eTBin) {
1053 if (eT < eTBins[eTBin])
1054 return eTBin;
1055 }
1056
1057 return nEtBins - 1; // Return the last bin if > the last bin.
1058}

◆ getLikelihoodEtHistBin()

unsigned int Root::TElectronLikelihoodTool::getLikelihoodEtHistBin ( double eT)
staticprivate

Coarse Et binning. Used for the likelihood pdfs.

Definition at line 1004 of file TElectronLikelihoodTool.cxx.

1005{
1006 const double GeV = 1000;
1007
1008 const unsigned int nEtBins = s_fnEtBinsHist;
1009 const double eTBins[nEtBins] = { 7 * GeV, 10 * GeV, 15 * GeV, 20 * GeV,
1010 30 * GeV, 40 * GeV, 50 * GeV };
1011
1012 for (unsigned int eTBin = 0; eTBin < nEtBins; ++eTBin) {
1013 if (eT < eTBins[eTBin]) {
1014 return eTBin;
1015 }
1016 }
1017
1018 return nEtBins - 1; // Return the last bin if > the last bin.
1019}

◆ initialize()

StatusCode Root::TElectronLikelihoodTool::initialize ( )

Initialize this class.

Definition at line 58 of file TElectronLikelihoodTool.cxx.

59{
60 ATH_MSG_DEBUG("TElectronLikelihoodTool initialize.");
61
62 // use an int as a StatusCode
63 StatusCode sc(StatusCode::SUCCESS);
64
65 // Check that all needed variables are setup
66 if (m_pdfFileName.empty()) {
67 ATH_MSG_WARNING("You need to specify the input PDF file name before you "
68 "call initialize() with "
69 "setPDFFileName('your/file/name.root') ");
70 sc = StatusCode::FAILURE;
71 }
72
73 unsigned int number_of_expected_bin_combinedLH;
75 number_of_expected_bin_combinedLH = s_fnDiscEtBinsOneExtra * s_fnEtaBins;
76 else
77 number_of_expected_bin_combinedLH = s_fnDiscEtBins * s_fnEtaBins;
78 unsigned int number_of_expected_bin_combinedOther =
80
81 if (m_cutLikelihood.size() != number_of_expected_bin_combinedLH) {
82 ATH_MSG_ERROR("Configuration issue : cutLikelihood expected size "
83 << number_of_expected_bin_combinedLH << " input size "
84 << m_cutLikelihood.size());
85 sc = StatusCode::FAILURE;
86 }
87
90 number_of_expected_bin_combinedLH) {
92 "Configuration issue : DiscHardCutForPileupTransform expected size "
93 << number_of_expected_bin_combinedLH << " input size "
95 sc = StatusCode::FAILURE;
96 }
97 }
100 number_of_expected_bin_combinedLH) {
101 ATH_MSG_ERROR("Configuration issue : "
102 "DiscHardCutSlopeForPileupTransform expected size "
103 << number_of_expected_bin_combinedLH << " input size "
105 sc = StatusCode::FAILURE;
106 }
107 }
108 if (!m_discLooseForPileupTransform.empty()) {
110 number_of_expected_bin_combinedLH) {
112 "Configuration issue : DiscLooseForPileupTransform expected size "
113 << number_of_expected_bin_combinedLH << " input size "
115 sc = StatusCode::FAILURE;
116 }
117 }
118
119 // d0 cut
120 if (!m_cutA0.empty()) {
121 if (m_cutA0.size() != number_of_expected_bin_combinedOther) {
122 ATH_MSG_ERROR("Configuration issue : CutA0 expected size "
123 << number_of_expected_bin_combinedOther << " input size "
124 << m_cutA0.size());
125 sc = StatusCode::FAILURE;
126 }
127 }
128
129 // deltaEta cut
130 if (!m_cutDeltaEta.empty()) {
131 if (m_cutDeltaEta.size() != number_of_expected_bin_combinedOther) {
132 ATH_MSG_ERROR("Configuration issue : CutDeltaEta expected size "
133 << number_of_expected_bin_combinedOther << " input size "
134 << m_cutDeltaEta.size());
135 sc = StatusCode::FAILURE;
136 }
137 }
138
139 // deltaPhiRes cut
140 if (!m_cutDeltaPhiRes.empty()) {
141 if (m_cutDeltaPhiRes.size() != number_of_expected_bin_combinedOther) {
142 ATH_MSG_ERROR("Configuration issue : CutDeltaPhiRes expected size "
143 << number_of_expected_bin_combinedOther << " input size "
144 << m_cutDeltaPhiRes.size());
145 sc = StatusCode::FAILURE;
146 }
147 }
148 if (sc == StatusCode::FAILURE) {
150 "Could NOT initialize! Please fix the errors mentioned above...");
151 return sc;
152 }
153
154 // --------------------------------------------------------------------------
155 // Register the cuts and check that the registration worked:
156 // NOTE: THE ORDER IS IMPORTANT!!! Cut0 corresponds to bit 0, Cut1 to bit
157 // 1,... Cut position for the kineatic pre-selection
158 m_cutPosition_kinematic = m_acceptInfo.addCut("kinematic", "pass kinematic");
159 if (m_cutPosition_kinematic < 0) {
160 sc = StatusCode::FAILURE;
161 }
162
163 // NSilicon
164 m_cutPosition_NSilicon = m_acceptInfo.addCut("NSilicon", "pass NSilicon");
165 if (m_cutPosition_NSilicon < 0) {
166 sc = StatusCode::FAILURE;
167 }
168
169 // NPixel
170 m_cutPosition_NPixel = m_acceptInfo.addCut("NPixel", "pass NPixel");
171 if (m_cutPosition_NPixel < 0) {
172 sc = StatusCode::FAILURE;
173 }
174
175 // NBlayer
176 m_cutPosition_NBlayer = m_acceptInfo.addCut("NBlayer", "pass NBlayer");
177 if (m_cutPosition_NBlayer < 0) {
178 sc = StatusCode::FAILURE;
179 }
180
181 // Ambiguity
182 m_cutPosition_ambiguity = m_acceptInfo.addCut("ambiguity", "pass ambiguity");
183 if (m_cutPosition_ambiguity < 0) {
184 sc = StatusCode::FAILURE;
185 }
186
187 // Cut position for the likelihood selection - DO NOT CHANGE ORDER!
188 m_cutPosition_LH = m_acceptInfo.addCut("passLH", "pass Likelihood");
189 if (m_cutPosition_LH < 0) {
190 sc = StatusCode::FAILURE;
191 }
192
193 // D0
195 m_acceptInfo.addCut("TrackA0", "A0 (aka d0) wrt beam spot < Cut");
196 if (m_cutPositionTrackA0 < 0) {
197 sc = StatusCode::FAILURE;
198 }
199
200 // deltaeta
202 "TrackMatchEta", "Track match deta in 1st sampling < Cut");
204 sc = StatusCode::FAILURE;
205 }
206
207 // deltaphi
209 "TrackMatchPhiRes", "Track match dphi in 2nd sampling, rescaled < Cut");
211 sc = StatusCode::FAILURE;
212 }
213
214 // Wstot
216 "WstotAtHighET", "Above HighETBinThreshold, Wstot < Cut");
218 sc = StatusCode::FAILURE;
219 }
220
221 // EoverP
223 "EoverPAtHighET", "Above HighETBinThreshold, EoverP < Cut");
225 sc = StatusCode::FAILURE;
226 }
227
228 // Check that we got everything OK
229 if (sc == StatusCode::FAILURE) {
231 "! Something went wrong with the setup of the decision objects...");
232 return sc;
233 }
234
235 // ----------------------------------
236 // Get the correct bit mask for the current likelihood operating point
238
239 //----------File/Histo operation------------------------------------
240 // Load the ROOT file containing the PDFs
241 TString tmpString(m_pdfFileName);
242 gSystem->ExpandPathName(tmpString);
243 std::string fname(tmpString.Data());
244 auto pdfFile = std::unique_ptr<TFile>(TFile::Open(fname.c_str(), "READ"));
245 // Check that we could load the ROOT file
246 if (!pdfFile) {
247 ATH_MSG_ERROR(" No ROOT file found here: " << m_pdfFileName);
248 return StatusCode::FAILURE;
249 }
250
251 // Load the histograms
252 for (unsigned int varIndex = 0; varIndex < s_fnVariables; varIndex++) {
253 const std::string& vstr = s_fVariables[varIndex];
254 // Skip the loading of PDFs for variables we don't care about for this
255 // operating point. If the string is empty (which is true in the default
256 // 2012 case), load all of them.
257 if (m_variableNames.find(vstr) == std::string::npos &&
258 !m_variableNames.empty()) {
259 continue;
260 }
261 loadVarHistograms(vstr, pdfFile.get(), varIndex);
262 }
263
264 // TFile close does not free the memory
265 pdfFile->Close();
266 //----------End File/Histo operation------------------------------------
267
268 ATH_MSG_DEBUG("Initialization complete for a LH tool with these specs:"
269 << "\n - pdfFileName : "
271 << "\n - Variable bitmask : "
273
274 ATH_MSG_DEBUG("\n - VariableNames : "
276 << "\n - (bool)CutBL (yes/no) : "
277 << (!m_cutBL.empty() ? "yes" : "no")
278 << "\n - (bool)CutPi (yes/no) : "
279 << (!m_cutPi.empty() ? "yes" : "no")
280 << "\n - (bool)CutSi (yes/no) : "
281 << (!m_cutSi.empty() ? "yes" : "no")
282 << "\n - (bool)CutAmbiguity (yes/no) : "
283 << (!m_cutAmbiguity.empty() ? "yes" : "no")
284 << "\n - (bool)doRemoveF3AtHighEt (yes/no) : "
285 << (m_doRemoveF3AtHighEt ? "yes" : "no")
286 << "\n - (bool)doRemoveTRTPIDAtHighEt (yes/no) : "
287 << (m_doRemoveTRTPIDAtHighEt ? "yes" : "no")
288 << "\n - (bool)doSmoothBinInterpolation (yes/no) : "
289 << (m_doSmoothBinInterpolation ? "yes" : "no")
290 << "\n - (bool)useOneExtraHighETLHBin(yes/no) : "
291 << (m_useOneExtraHighETLHBin ? "yes" : "no")
292 << "\n - (double)HighETBinThreshold : "
294 << "\n - (bool)doPileupTransform (yes/no) : "
295 << (m_doPileupTransform ? "yes" : "no")
296 << "\n - (bool)doCentralityTransform (yes/no) : "
297 << (m_doCentralityTransform ? "yes" : "no")
298 << "\n - (bool)CutLikelihood (yes/no) : "
299 << (!m_cutLikelihood.empty() ? "yes" : "no")
300 << "\n - (bool)CutLikelihoodPileupCorrection (yes/no) : "
301 << (!m_cutLikelihoodPileupCorrection.empty() ? "yes" : "no")
302 << "\n - (bool)CutA0 (yes/no) : "
303 << (!m_cutA0.empty() ? "yes" : "no")
304 << "\n - (bool)CutDeltaEta (yes/no) : "
305 << (!m_cutDeltaEta.empty() ? "yes" : "no")
306 << "\n - (bool)CutDeltaPhiRes (yes/no) : "
307 << (!m_cutDeltaPhiRes.empty() ? "yes" : "no")
308 << "\n - (bool)CutWstotAtHighET (yes/no) : "
309 << (!m_cutWstotAtHighET.empty() ? "yes" : "no")
310 << "\n - (bool)CutEoverPAtHighET (yes/no) : "
311 << (!m_cutEoverPAtHighET.empty() ? "yes" : "no"));
312 return sc;
313}
static Double_t sc
std::vector< double > m_discHardCutForPileupTransform
reference disc for very hard cut; used by pileup transform
std::vector< double > m_discHardCutSlopeForPileupTransform
reference slope on disc for very hard cut; used by pileup transform
std::vector< double > m_discLooseForPileupTransform
reference disc for a pileup independent loose menu; used by pileup transform
int loadVarHistograms(const std::string &vstr, TFile *pdfFile, unsigned int varIndex)
Load the variable histograms from the pdf file.
unsigned int getLikelihoodBitmask(const std::string &vars) const
::StatusCode StatusCode
StatusCode definition for legacy code.

◆ initMessaging()

void AthMessaging::initMessaging ( ) const
privateinherited

Initialize our message level and MessageSvc.

This method should only be called once.

Definition at line 39 of file AthMessaging.cxx.

40{
42 // If user did not set an explicit level, set a default
43 if (m_lvl == MSG::NIL) {
44 m_lvl = m_imsg ?
45 static_cast<MSG::Level>( m_imsg.load()->outputLevel(m_nm) ) :
46 MSG::INFO;
47 }
48}
std::string m_nm
Message source name.
std::atomic< IMessageSvc * > m_imsg
MessageSvc pointer.
std::atomic< MSG::Level > m_lvl
Current logging level.
IMessageSvc * getMessageSvc(bool quiet=false)

◆ InterpolateCuts()

double Root::TElectronLikelihoodTool::InterpolateCuts ( const std::vector< double > & cuts,
const std::vector< double > & cuts_4gev,
double et,
double eta ) const
private

Definition at line 1100 of file TElectronLikelihoodTool.cxx.

1105{
1106
1107
1108 //get the value of the cut
1109 unsigned int etbinLH = getLikelihoodEtDiscBin(et, true);
1110 unsigned int etabin = getLikelihoodEtaBin(eta);
1111 unsigned int ibin_combinedLH = etbinLH * s_fnEtaBins + etabin;
1112 double cut = cuts.at(ibin_combinedLH);
1113
1114 //Special low pt cuts
1115 if (!cuts_4gev.empty()) {
1116 if (et < 7000.) {
1117 cut = cuts_4gev.at(etabin);
1118 }
1119 // Below 6 GeV we do not interpolate
1120 if (et < 6000) {
1121 return cut;
1122 }
1123 } else {// No special low Et cuts
1124 // and below 8500 we do not interpolate
1125 if (et < 8500.) {
1126 return cut;
1127 }
1128 }
1129 // We interpolate until 47500 (last bin)
1130 // size of array is s_fnDiscEtBins
1131 if (et > 47500. || !(etbinLH < s_fnDiscEtBins)) {
1132 return cut;
1133 }
1134 // Interpolate
1135 double bin_width = 5000.;
1136 if (7000. < et && et < 10000.) {
1137 bin_width = 3000.;
1138 }
1139 if (et < 7000.) {
1140 bin_width = 2000.;
1141 }
1142 const double GeV = 1000;
1143 const double eTBins[s_fnDiscEtBins] = { 8.5 * GeV, 12.5 * GeV, 17.5 * GeV,
1144 22.5 * GeV, 27.5 * GeV, 32.5 * GeV,
1145 37.5 * GeV, 42.5 * GeV, 47.5 * GeV };
1146 double bin_center = eTBins[etbinLH];
1147 if (et > bin_center) {
1148 double cut_next = cut;
1149 if (etbinLH + 1 <= 8)
1150 cut_next = cuts.at((etbinLH + 1) * s_fnEtaBins + etabin);
1151 return cut + (cut_next - cut) * (et - bin_center) / (bin_width);
1152 }
1153 // or else if et < bin_center :
1154 double cut_before = cut;
1155 if (etbinLH >= 1) {
1156 cut_before = cuts.at((etbinLH - 1) * s_fnEtaBins + etabin);
1157 } else if (etbinLH == 0 && !cuts_4gev.empty()) {
1158 cut_before = cuts_4gev.at(etabin);
1159 }
1160
1161 return cut - (cut - cut_before) * (bin_center - et) / (bin_width);
1162}

◆ InterpolatePdfs()

double Root::TElectronLikelihoodTool::InterpolatePdfs ( unsigned int s_or_b,
unsigned int ipbin,
double et,
double eta,
int bin,
unsigned int var ) const
private

Definition at line 1168 of file TElectronLikelihoodTool.cxx.

1174{
1175 // histograms exist for the following bins: 4, 7, 10, 15, 20, 30, 40.
1176 // Interpolation between histograms must follow fairly closely the
1177 // interpolation scheme between cuts - so be careful!
1178 int etbin = getLikelihoodEtHistBin(et); // hist binning
1179 int etabin = getLikelihoodEtaBin(eta);
1180 double integral =
1181 double(m_fPDFbins[s_or_b][ipbin][etbin][etabin][var]->Integral());
1182 double prob =
1183 double(m_fPDFbins[s_or_b][ipbin][etbin][etabin][var]->GetBinContent(bin)) /
1184 integral;
1185
1186 int Nbins = m_fPDFbins[s_or_b][ipbin][etbin][etabin][var]->GetNbinsX();
1187 if (et > 42500.) {
1188 return prob; // interpolation stops here.
1189 }
1190 if (et < 6000.) {
1191 return prob; // interpolation stops here.
1192 }
1193 if (22500. < et && et < 27500.) {
1194 return prob; // region of non-interpolation for pdfs
1195 }
1196 if (32500. < et && et < 37500.) {
1197 return prob; // region of non-interpolation for pdfs
1198 }
1199 double bin_width = 5000.;
1200 if (7000. < et && et < 10000.) {
1201 bin_width = 3000.;
1202 }
1203 if (et < 7000.) {
1204 bin_width = 2000.;
1205 }
1206 const double GeV = 1000;
1207 const double eTHistBins[s_fnEtBinsHist] = { 6. * GeV, 8.5 * GeV,
1208 12.5 * GeV, 17.5 * GeV,
1209 22.5 * GeV, 32.5 * GeV,
1210 42.5 * GeV };
1211 double bin_center = eTHistBins[etbin];
1212 if (etbin == 4 && et >= 27500.) {
1213 bin_center = 27500.; // special: interpolate starting from 27.5 here
1214 }
1215 if (etbin == 5 && et >= 37500.) {
1216 bin_center = 37500.; // special: interpolate starting from 37.5 here
1217 }
1218 if (et > bin_center) {
1219 double prob_next = prob;
1220 if (etbin + 1 <= 6) {
1221 // account for potential histogram bin inequalities
1222 int NbinsPlus =
1223 m_fPDFbins[s_or_b][ipbin][etbin + 1][etabin][var]->GetNbinsX();
1224 int binplus = bin;
1225 if (Nbins < NbinsPlus) {
1226 binplus = int(round(bin * (Nbins / NbinsPlus)));
1227 } else if (Nbins > NbinsPlus) {
1228 binplus = int(round(bin * (NbinsPlus / Nbins)));
1229 }
1230 // do interpolation
1231 double integral_next =
1232 double(m_fPDFbins[s_or_b][ipbin][etbin + 1][etabin][var]->Integral());
1233 prob_next =
1234 double(m_fPDFbins[s_or_b][ipbin][etbin + 1][etabin][var]->GetBinContent(
1235 binplus)) /
1236 integral_next;
1237 return prob + (prob_next - prob) * (et - bin_center) / (bin_width);
1238 }
1239 }
1240 // or else if et < bin_center :
1241 double prob_before = prob;
1242 if (etbin - 1 >= 0) {
1243 // account for potential histogram bin inequalities
1244 int NbinsMinus =
1245 m_fPDFbins[s_or_b][ipbin][etbin - 1][etabin][var]->GetNbinsX();
1246 int binminus = bin;
1247 if (Nbins < NbinsMinus) {
1248 binminus = int(round(bin * (Nbins / NbinsMinus)));
1249 } else if (Nbins > NbinsMinus) {
1250 binminus = int(round(bin * (NbinsMinus / Nbins)));
1251 }
1252 double integral_before =
1253 double(m_fPDFbins[s_or_b][ipbin][etbin - 1][etabin][var]->Integral());
1254 prob_before =
1255 double(m_fPDFbins[s_or_b][ipbin][etbin - 1][etabin][var]->GetBinContent(
1256 binminus)) /
1257 integral_before;
1258 }
1259 return prob - (prob - prob_before) * (bin_center - et) / (bin_width);
1260}
float round(const float toRound, const unsigned int decimals)
Definition Mdt.cxx:27

◆ loadVarHistograms()

int Root::TElectronLikelihoodTool::loadVarHistograms ( const std::string & vstr,
TFile * pdfFile,
unsigned int varIndex )

Load the variable histograms from the pdf file.

Definition at line 316 of file TElectronLikelihoodTool.cxx.

319{
320 for (unsigned int s_or_b = 0; s_or_b < 2; ++s_or_b) {
321 for (unsigned int ip = 0; ip < IP_BINS; ++ip) {
322 for (unsigned int et = 0; et < s_fnEtBinsHist; ++et) {
323 for (unsigned int eta = 0; eta < s_fnEtaBins; ++eta) {
324
325 std::string sig_bkg = (s_or_b == 0) ? "sig" : "bkg";
326 // Because eta bins in the root file don't match up exactly with cut
327 // menu definitions, the second eta bin is an exact copy of the first,
328 // and all subsequent eta bins are pushed back by one.
329 unsigned int eta_tmp = (eta > 0) ? eta - 1 : eta;
330 // The 7-10 GeV, crack bin uses the 10-15 Gev pdfs. WE DO NOT DO THIS
331 // ANYMORE! unsigned int et_tmp = (eta == 5 && et == 1) ? 1 : et;
332 unsigned int et_tmp = et;
333 std::string binname = getBinName(et_tmp, eta_tmp, ip, m_ipBinning);
334
335 if (((std::string(binname).find("2.37") != std::string::npos)) &&
336 (vstr.find("el_f3") != std::string::npos)) {
337 continue;
338 }
339
340 if (((std::string(binname).find("2.01") != std::string::npos) ||
341 (std::string(binname).find("2.37") != std::string::npos)) &&
342 (vstr.find("TRT") != std::string::npos)) {
343 continue;
344 }
345
346 const std::string pdfdir = std::format("{}/{}", vstr, sig_bkg);
347
348 std::string pdf = std::format("{}_{}_smoothed_hist_from_KDE_{}",
349 vstr, sig_bkg, binname);
350
351 std::string pdf_newname = std::format("{}_{}_{}_LHtool_copy_{}",
352 m_name, vstr, sig_bkg, binname);
353
354 if (!pdfFile->GetListOfKeys()->Contains(vstr.c_str())) {
355 ATH_MSG_INFO("Warning: skipping variable "
356 << vstr << " because the folder does not exist.");
357 return 1;
358 }
359 if (!((TDirectory*)pdfFile->Get(vstr.c_str()))
360 ->GetListOfKeys()
361 ->Contains(sig_bkg.c_str())) {
362 ATH_MSG_INFO("Warning: skipping variable "
363 << vstr << " because the folder does not exist.");
364 return 1;
365 }
366
367 // If the 0th et bin (4-7 GeV) histogram does not exist in the root
368 // file, then just use the 7-10 GeV bin histogram. This should
369 // preserve backward compatibility
370 if (et == 0 && !((TDirectory*)pdfFile->Get(pdfdir.c_str()))
371 ->GetListOfKeys()
372 ->Contains(pdf.c_str())) {
373 binname = getBinName(et_tmp + 1, eta_tmp, ip, m_ipBinning);
374
375 pdf = std::format("{}_{}_smoothed_hist_from_KDE_{}",
376 vstr, sig_bkg, binname);
377
378 pdf_newname = std::format("{}_{}_{}_LHtool_copy4GeV_{}",
379 m_name, vstr, sig_bkg, binname);
380 }
381 if (((TDirectory*)pdfFile->Get(pdfdir.c_str()))
382 ->GetListOfKeys()
383 ->Contains(pdf.c_str())) {
384 TH1F* hist = (TH1F*)(((TDirectory*)pdfFile->Get(pdfdir.c_str()))->Get(pdf.c_str()));
385 m_fPDFbins[s_or_b][ip][et][eta][varIndex] =
386 std::make_unique<EGSelectors::SafeTH1>(hist);
387 } else {
388 ATH_MSG_INFO("Warning: Object " << pdf << " does not exist.");
389 ATH_MSG_INFO("Skipping all other histograms with this variable.");
390 return 1;
391 }
392 }
393 }
394 }
395 }
396 return 1;
397}
#define ATH_MSG_INFO(x)
static std::string getBinName(int etbin, int etabin, int ipbin, const std::string &iptype)
std::string find(const std::string &s)
return a remapped string
Definition hcg.cxx:140
TH1F(name, title, nxbins, bins_par2, bins_par3=None, path='', **kwargs)

◆ msg() [1/2]

MsgStream & asg::AsgMessaging::msg ( ) const
inherited

The standard message stream.

Returns
A reference to the default message stream of this object.

Definition at line 49 of file AsgMessaging.cxx.

49 {
50#ifndef XAOD_STANDALONE
51 return ::AthMessaging::msg();
52#else // not XAOD_STANDALONE
53 return m_msg;
54#endif // not XAOD_STANDALONE
55 }

◆ msg() [2/2]

MsgStream & asg::AsgMessaging::msg ( const MSG::Level lvl) const
inherited

The standard message stream.

Parameters
lvlThe message level to set the stream to
Returns
A reference to the default message stream, set to level "lvl"

Definition at line 57 of file AsgMessaging.cxx.

57 {
58#ifndef XAOD_STANDALONE
59 return ::AthMessaging::msg( lvl );
60#else // not XAOD_STANDALONE
61 m_msg << lvl;
62 return m_msg;
63#endif // not XAOD_STANDALONE
64 }

◆ msgLvl()

bool asg::AsgMessaging::msgLvl ( const MSG::Level lvl) const
inherited

Test the output level of the object.

Parameters
lvlThe message level to test against
Returns
boolean Indicting if messages at given level will be printed
true If messages at level "lvl" will be printed

Definition at line 41 of file AsgMessaging.cxx.

41 {
42#ifndef XAOD_STANDALONE
43 return ::AthMessaging::msgLvl( lvl );
44#else // not XAOD_STANDALONE
45 return m_msg.msgLevel( lvl );
46#endif // not XAOD_STANDALONE
47 }

◆ setBinning()

void Root::TElectronLikelihoodTool::setBinning ( const std::string & val)
inline

Define the binning.

Definition at line 146 of file TElectronLikelihoodTool.h.

◆ setBitmask()

void Root::TElectronLikelihoodTool::setBitmask ( unsigned int val)
inline

Definition at line 149 of file TElectronLikelihoodTool.h.

◆ setLevel()

void AthMessaging::setLevel ( MSG::Level lvl)
inherited

Change the current logging level.

Use this rather than msg().setLevel() for proper operation with MT.

Definition at line 28 of file AthMessaging.cxx.

29{
30 m_lvl = lvl;
31}

◆ setPDFFileName()

void Root::TElectronLikelihoodTool::setPDFFileName ( const std::string & val)
inline

Add an input file that holds the PDFs.

Definition at line 131 of file TElectronLikelihoodTool.h.

131{ m_pdfFileName = val; }

◆ setVariableNames()

void Root::TElectronLikelihoodTool::setVariableNames ( const std::string & val)
inline

Define the variable names.

Definition at line 134 of file TElectronLikelihoodTool.h.

◆ TransformLikelihoodOutput()

double Root::TElectronLikelihoodTool::TransformLikelihoodOutput ( double ps,
double pb,
double ip,
double et,
double eta ) const
private

Apply a transform to zoom into the LH output peaks.

Optionally do pileup correction too

Definition at line 817 of file TElectronLikelihoodTool.cxx.

822{
823 // returns transformed or non-transformed output
824 // (Taken mostly from TMVA likelihood code)
825 double fEpsilon = 1e-99;
826 // If both signal and bkg are 0, we want it to fail.
827 if (ps < fEpsilon)
828 ps = 0;
829 if (pb < fEpsilon)
830 pb = fEpsilon;
831 double disc = ps / double(ps + pb);
832
833 if (disc >= 1.0) {
834 disc = 1. - 1.e-15;
835 } else if (disc <= 0.0) {
836 disc = fEpsilon;
837 }
838
839 double tau = 15.0;
840 disc = -std::log(1.0 / disc - 1.0) * (1. / double(tau));
841
842 // Linearly transform the discriminant as a function of pileup, rather than
843 // the old scheme of changing the cut value based on pileup. This is simpler
844 // for the tuning, as well as ensuring subsets / making discriminants more
845 // transparent. In the HI case, a quadratic centrality transform is applied
846 // instead.
848
849 // The variables used by the transform:
850 //
851 // - hard_cut_ref = extremely tight discriminant cut as reference to ensure
852 // pileup correction for looser menus is less than for tighter menus.
853 // - loose_ref = a loose menu with no pileup correction. Any tighter
854 // menu with same inputs will necessarily have pileup dependence built in
855 // - disc_max = max disc value for which pileup correction is desired.
856 // - pileup_max = max nvtx or mu for calculating the transform. Any larger
857 // pileup values will use this maximum value in the transform.
858
863 "Vectors needed for pileup-dependent transform not correctly filled! "
864 "Skipping the transform.");
865 return disc;
866 }
867
870 ATH_MSG_WARNING("Vectors needed for centrality-dependent transform not "
871 "correctly filled! "
872 "Skipping the transform.");
873 return disc;
874 }
875
876 unsigned int etabin = getLikelihoodEtaBin(eta);
877
878 double disc_hard_cut_ref = 0;
879 double disc_hard_cut_ref_slope = 0;
880 double disc_hard_cut_ref_quad =
881 0; // only used for heavy ion implementation of the LH
882 double disc_loose_ref = 0;
883 double disc_max = m_discMaxForPileupTransform;
884 double pileup_max = m_pileupMaxForPileupTransform;
885
889 et,
890 eta);
891 disc_hard_cut_ref_slope =
894 et,
895 eta);
897 disc_hard_cut_ref_quad =
900 et,
901 eta);
904 et,
905 eta);
906 } else {
907 // default situation, in the case where 4-7 GeV bin is not defined
908 if (et > 7000. || m_discHardCutForPileupTransform4GeV.empty()) {
909 unsigned int etfinebinLH = getLikelihoodEtDiscBin(et, true);
910 unsigned int ibin_combined = etfinebinLH * s_fnEtaBins + etabin;
911 disc_hard_cut_ref = m_discHardCutForPileupTransform[ibin_combined];
912 disc_hard_cut_ref_slope =
915 disc_hard_cut_ref_quad =
917 disc_loose_ref = m_discLooseForPileupTransform[ibin_combined];
918 } else {
922 ATH_MSG_WARNING("Vectors needed for pileup-dependent transform not "
923 "correctly filled for 4-7 GeV "
924 "bin! Skipping the transform.");
925 return disc;
926 }
929 ATH_MSG_WARNING("Vectors needed for centrality-dependent transform "
930 "not correctly filled for 4-7 "
931 "GeV bin! Skipping the transform.");
932 return disc;
933 }
934 disc_hard_cut_ref = m_discHardCutForPileupTransform4GeV[etabin];
935 disc_hard_cut_ref_slope =
938 disc_hard_cut_ref_quad =
940 disc_loose_ref = m_discLooseForPileupTransform4GeV[etabin];
941 }
942 }
943
944 double ip_for_corr =
945 std::min(ip, pileup_max); // turn off correction for values > pileup_max
946 double disc_hard_cut_ref_prime =
947 disc_hard_cut_ref + disc_hard_cut_ref_slope * ip_for_corr +
948 disc_hard_cut_ref_quad * ip_for_corr * ip_for_corr;
949
950 if (disc <= disc_loose_ref) {
951 // Below threshold for applying pileup correction
952 } else if (disc <= disc_hard_cut_ref_prime) {
953 // Between the loose and hard cut reference points for pileup correction
954 double denom = double(disc_hard_cut_ref_prime - disc_loose_ref);
955 if (denom < 0.001)
956 denom = 0.001;
957 disc = disc_loose_ref + (disc - disc_loose_ref) *
958 (disc_hard_cut_ref - disc_loose_ref) / denom;
959 } else if (disc_hard_cut_ref_prime < disc && disc <= disc_max) {
960 // Between the hard cut and max reference points for pileup correction
961 double denom = double(disc_max - disc_hard_cut_ref_prime);
962 if (denom < 0.001)
963 denom = 0.001;
964 disc = disc_hard_cut_ref + (disc - disc_hard_cut_ref_prime) *
965 (disc_max - disc_hard_cut_ref) / denom;
966 }
967 }
968
969 ATH_MSG_DEBUG("disc is " << disc);
970 return disc;
971}
std::vector< double > m_discHardCutQuadForPileupTransform
reference quadratic apr on disc for very hard cut; used by centrality transform
std::vector< double > m_discLooseForPileupTransform4GeV
reference disc for a pileup independent loose menu; used by pileup transform - 4-7 GeV
std::vector< double > m_discHardCutQuadForPileupTransform4GeV
reference quadratic par on disc for very hard cut; used by centrality transform - 4-7 GeV
std::vector< double > m_discHardCutForPileupTransform4GeV
reference disc for very hard cut; used by pileup transform - 4-7 GeV
std::vector< double > m_discHardCutSlopeForPileupTransform4GeV
reference slope on disc for very hard cut; used by pileup transform

Member Data Documentation

◆ ATLAS_THREAD_SAFE

std::atomic_flag m_initialized AthMessaging::ATLAS_THREAD_SAFE = ATOMIC_FLAG_INIT
mutableprivateinherited

Messaging initialized (initMessaging).

Definition at line 141 of file AthMessaging.h.

◆ m_acceptInfo

asg::AcceptInfo Root::TElectronLikelihoodTool::m_acceptInfo
private

Accept info.

Definition at line 277 of file TElectronLikelihoodTool.h.

◆ m_cutA0

std::vector<double> Root::TElectronLikelihoodTool::m_cutA0

cut max on track d0 bit

Definition at line 187 of file TElectronLikelihoodTool.h.

◆ m_cutAmbiguity

std::vector<int> Root::TElectronLikelihoodTool::m_cutAmbiguity

do cut on ambiguity bit

Definition at line 193 of file TElectronLikelihoodTool.h.

◆ m_cutBL

std::vector<int> Root::TElectronLikelihoodTool::m_cutBL

cut min on b-layer hits

Definition at line 181 of file TElectronLikelihoodTool.h.

◆ m_cutDeltaEta

std::vector<double> Root::TElectronLikelihoodTool::m_cutDeltaEta

do cut on delta eta bit

Definition at line 189 of file TElectronLikelihoodTool.h.

◆ m_cutDeltaPhiRes

std::vector<double> Root::TElectronLikelihoodTool::m_cutDeltaPhiRes

do cut on delta phi bit

Definition at line 191 of file TElectronLikelihoodTool.h.

◆ m_cutEoverPAtHighET

std::vector<double> Root::TElectronLikelihoodTool::m_cutEoverPAtHighET

do cut on EoverP above HighETBinThreshold bit

Definition at line 207 of file TElectronLikelihoodTool.h.

◆ m_cutLikelihood

std::vector<double> Root::TElectronLikelihoodTool::m_cutLikelihood

cut on likelihood output

Definition at line 213 of file TElectronLikelihoodTool.h.

◆ m_cutLikelihood4GeV

std::vector<double> Root::TElectronLikelihoodTool::m_cutLikelihood4GeV

cut on likelihood output, 4 GeV bin

Definition at line 217 of file TElectronLikelihoodTool.h.

◆ m_cutLikelihoodPileupCorrection

std::vector<double> Root::TElectronLikelihoodTool::m_cutLikelihoodPileupCorrection

pileup correction factor for cut on likelihood output

Definition at line 215 of file TElectronLikelihoodTool.h.

◆ m_cutLikelihoodPileupCorrection4GeV

std::vector<double> Root::TElectronLikelihoodTool::m_cutLikelihoodPileupCorrection4GeV

pileup correction factor for cut on likelihood output, 4 GeV bin

Definition at line 219 of file TElectronLikelihoodTool.h.

◆ m_cutPi

std::vector<int> Root::TElectronLikelihoodTool::m_cutPi

cut min on pixel hits

Definition at line 183 of file TElectronLikelihoodTool.h.

◆ m_cutPosition_ambiguity

int Root::TElectronLikelihoodTool::m_cutPosition_ambiguity
private

The position of the ambiguity cut bit in the AcceptInfo return object.

Definition at line 299 of file TElectronLikelihoodTool.h.

◆ m_cutPosition_kinematic

int Root::TElectronLikelihoodTool::m_cutPosition_kinematic
private

The position of the kinematic cut bit in the AcceptInfo return object.

Definition at line 287 of file TElectronLikelihoodTool.h.

◆ m_cutPosition_LH

int Root::TElectronLikelihoodTool::m_cutPosition_LH
private

The position of the likelihood cut bit in the AcceptInfo return object.

Definition at line 302 of file TElectronLikelihoodTool.h.

◆ m_cutPosition_NBlayer

int Root::TElectronLikelihoodTool::m_cutPosition_NBlayer
private

The position of the NBlayer cut bit in the AcceptInfo return object.

Definition at line 296 of file TElectronLikelihoodTool.h.

◆ m_cutPosition_NPixel

int Root::TElectronLikelihoodTool::m_cutPosition_NPixel
private

The position of the NPixel cut bit in the AcceptInfo return object.

Definition at line 293 of file TElectronLikelihoodTool.h.

◆ m_cutPosition_NSilicon

int Root::TElectronLikelihoodTool::m_cutPosition_NSilicon
private

The position of the NSilicon cut bit in the AcceptInfo return object.

Definition at line 290 of file TElectronLikelihoodTool.h.

◆ m_cutPositionEoverPAtHighET

int Root::TElectronLikelihoodTool::m_cutPositionEoverPAtHighET
private

The position of the high ET EoverP cut bit in the AcceptInfo return object.

Definition at line 319 of file TElectronLikelihoodTool.h.

◆ m_cutPositionTrackA0

int Root::TElectronLikelihoodTool::m_cutPositionTrackA0
private

The position of the d0 cut bit in the AcceptInfo return object.

Definition at line 305 of file TElectronLikelihoodTool.h.

◆ m_cutPositionTrackMatchEta

int Root::TElectronLikelihoodTool::m_cutPositionTrackMatchEta
private

The position of the deltaeta cut bit in the AcceptInfo return object.

Definition at line 308 of file TElectronLikelihoodTool.h.

◆ m_cutPositionTrackMatchPhiRes

int Root::TElectronLikelihoodTool::m_cutPositionTrackMatchPhiRes
private

The position of the deltaphi cut bit in the AcceptInfo return object.

Definition at line 311 of file TElectronLikelihoodTool.h.

◆ m_cutPositionWstotAtHighET

int Root::TElectronLikelihoodTool::m_cutPositionWstotAtHighET
private

The position of the high ET wstot cut bit in the AcceptInfo return object.

Definition at line 315 of file TElectronLikelihoodTool.h.

◆ m_cutSi

std::vector<int> Root::TElectronLikelihoodTool::m_cutSi

cut min on precision hits

Definition at line 185 of file TElectronLikelihoodTool.h.

◆ m_cutWstotAtHighET

std::vector<double> Root::TElectronLikelihoodTool::m_cutWstotAtHighET

do cut on wstot above HighETBinThreshold bit

Definition at line 205 of file TElectronLikelihoodTool.h.

◆ m_discHardCutForPileupTransform

std::vector<double> Root::TElectronLikelihoodTool::m_discHardCutForPileupTransform

reference disc for very hard cut; used by pileup transform

Definition at line 221 of file TElectronLikelihoodTool.h.

◆ m_discHardCutForPileupTransform4GeV

std::vector<double> Root::TElectronLikelihoodTool::m_discHardCutForPileupTransform4GeV

reference disc for very hard cut; used by pileup transform - 4-7 GeV

Definition at line 233 of file TElectronLikelihoodTool.h.

◆ m_discHardCutQuadForPileupTransform

std::vector<double> Root::TElectronLikelihoodTool::m_discHardCutQuadForPileupTransform

reference quadratic apr on disc for very hard cut; used by centrality transform

Definition at line 227 of file TElectronLikelihoodTool.h.

◆ m_discHardCutQuadForPileupTransform4GeV

std::vector<double> Root::TElectronLikelihoodTool::m_discHardCutQuadForPileupTransform4GeV

reference quadratic par on disc for very hard cut; used by centrality transform - 4-7 GeV

Definition at line 239 of file TElectronLikelihoodTool.h.

◆ m_discHardCutSlopeForPileupTransform

std::vector<double> Root::TElectronLikelihoodTool::m_discHardCutSlopeForPileupTransform

reference slope on disc for very hard cut; used by pileup transform

Definition at line 224 of file TElectronLikelihoodTool.h.

◆ m_discHardCutSlopeForPileupTransform4GeV

std::vector<double> Root::TElectronLikelihoodTool::m_discHardCutSlopeForPileupTransform4GeV

reference slope on disc for very hard cut; used by pileup transform

  • 4-7 GeV

Definition at line 236 of file TElectronLikelihoodTool.h.

◆ m_discLooseForPileupTransform

std::vector<double> Root::TElectronLikelihoodTool::m_discLooseForPileupTransform

reference disc for a pileup independent loose menu; used by pileup transform

Definition at line 230 of file TElectronLikelihoodTool.h.

◆ m_discLooseForPileupTransform4GeV

std::vector<double> Root::TElectronLikelihoodTool::m_discLooseForPileupTransform4GeV

reference disc for a pileup independent loose menu; used by pileup transform - 4-7 GeV

Definition at line 242 of file TElectronLikelihoodTool.h.

◆ m_discMaxForPileupTransform

double Root::TElectronLikelihoodTool::m_discMaxForPileupTransform

max discriminant for which pileup transform is to be used

Definition at line 244 of file TElectronLikelihoodTool.h.

◆ m_doCentralityTransform

bool Root::TElectronLikelihoodTool::m_doCentralityTransform

do centrality-dependent transform on discriminant value

Definition at line 211 of file TElectronLikelihoodTool.h.

◆ m_doPileupTransform

bool Root::TElectronLikelihoodTool::m_doPileupTransform

do pileup-dependent transform on discriminant value

Definition at line 209 of file TElectronLikelihoodTool.h.

◆ m_doRemoveF3AtHighEt

bool Root::TElectronLikelihoodTool::m_doRemoveF3AtHighEt

do remove f3 variable from likelihood at high Et (>80 GeV)

Definition at line 195 of file TElectronLikelihoodTool.h.

◆ m_doRemoveTRTPIDAtHighEt

bool Root::TElectronLikelihoodTool::m_doRemoveTRTPIDAtHighEt

do remove TRTPID variable from likelihood at high Et (>80 GeV)

Definition at line 197 of file TElectronLikelihoodTool.h.

◆ m_doSmoothBinInterpolation

bool Root::TElectronLikelihoodTool::m_doSmoothBinInterpolation

do smooth interpolation between bins

Definition at line 199 of file TElectronLikelihoodTool.h.

◆ m_fPDFbins

std::unique_ptr<EGSelectors::SafeTH1> Root::TElectronLikelihoodTool::m_fPDFbins[2][IP_BINS][s_fnEtBinsHist][s_fnEtaBins][s_fnVariables]
private

Definition at line 335 of file TElectronLikelihoodTool.h.

◆ m_highETBinThreshold

double Root::TElectronLikelihoodTool::m_highETBinThreshold

ET threshold for using high ET cuts and bin.

Definition at line 203 of file TElectronLikelihoodTool.h.

◆ m_imsg

std::atomic<IMessageSvc*> AthMessaging::m_imsg { nullptr }
mutableprivateinherited

MessageSvc pointer.

Definition at line 135 of file AthMessaging.h.

135{ nullptr };

◆ m_ipBinning

std::string Root::TElectronLikelihoodTool::m_ipBinning
private

Deprecated.

Definition at line 284 of file TElectronLikelihoodTool.h.

◆ m_lvl

std::atomic<MSG::Level> AthMessaging::m_lvl { MSG::NIL }
mutableprivateinherited

Current logging level.

Definition at line 138 of file AthMessaging.h.

138{ MSG::NIL };

◆ m_msg_tls

boost::thread_specific_ptr<MsgStream> AthMessaging::m_msg_tls
mutableprivateinherited

MsgStream instance (a std::cout like with print-out levels).

Definition at line 132 of file AthMessaging.h.

◆ m_name

std::string Root::TElectronLikelihoodTool::m_name
private

tool name

Definition at line 274 of file TElectronLikelihoodTool.h.

◆ m_nm

std::string AthMessaging::m_nm
privateinherited

Message source name.

Definition at line 129 of file AthMessaging.h.

◆ m_pdfFileName

std::string Root::TElectronLikelihoodTool::m_pdfFileName

Name of the pdf file.

Definition at line 250 of file TElectronLikelihoodTool.h.

◆ m_pileupMaxForPileupTransform

double Root::TElectronLikelihoodTool::m_pileupMaxForPileupTransform

max nvtx or mu to be used in pileup transform

Definition at line 246 of file TElectronLikelihoodTool.h.

◆ m_useOneExtraHighETLHBin

bool Root::TElectronLikelihoodTool::m_useOneExtraHighETLHBin

use one extra bin for high ET LH

Definition at line 201 of file TElectronLikelihoodTool.h.

◆ m_variableBitMask

unsigned int Root::TElectronLikelihoodTool::m_variableBitMask
private

The bitmask corresponding to the variables in the likelihood.

For internal use.

Definition at line 281 of file TElectronLikelihoodTool.h.

◆ m_variableNames

std::string Root::TElectronLikelihoodTool::m_variableNames

variables to use in the LH

Definition at line 248 of file TElectronLikelihoodTool.h.

◆ s_fIpBounds

double Root::TElectronLikelihoodTool::s_fIpBounds[IP_BINS+1] = { 0., 500. }
staticconstexprprivate

Definition at line 321 of file TElectronLikelihoodTool.h.

321{ 0., 500. };

◆ s_fnDiscEtBins

unsigned int Root::TElectronLikelihoodTool::s_fnDiscEtBins = 9
staticconstexprprivate

Definition at line 328 of file TElectronLikelihoodTool.h.

◆ s_fnDiscEtBinsOneExtra

unsigned int Root::TElectronLikelihoodTool::s_fnDiscEtBinsOneExtra = 10
staticconstexprprivate

Definition at line 331 of file TElectronLikelihoodTool.h.

◆ s_fnEtaBins

unsigned int Root::TElectronLikelihoodTool::s_fnEtaBins = 10
staticconstexprprivate

Definition at line 332 of file TElectronLikelihoodTool.h.

◆ s_fnEtBinsHist

unsigned int Root::TElectronLikelihoodTool::s_fnEtBinsHist = 7
staticconstexprprivate

Definition at line 325 of file TElectronLikelihoodTool.h.

◆ s_fnVariables

unsigned int Root::TElectronLikelihoodTool::s_fnVariables = 13
staticconstexprprivate

Definition at line 333 of file TElectronLikelihoodTool.h.

◆ s_fVariables

const std::string Root::TElectronLikelihoodTool::s_fVariables
staticprivate
Initial value:
= {
"el_d0significance",
"el_eratio",
"el_deltaeta1",
"el_f1",
"el_f3",
"el_reta",
"el_rhad",
"el_rphi",
"el_trackd0pvunbiased",
"el_weta2",
"el_DeltaPoverP",
"el_deltaphiRescaled",
"el_TRT_PID"
}

Definition at line 1265 of file TElectronLikelihoodTool.h.

1297 {
1298constexpr unsigned int IP_BINS = 1;
1299}
1300namespace LikeEnum {
1301
1302struct LHAcceptVars_t
1303{
1304 double likelihood;
1305 double eta;
1306 double eT;
1307 int nSiHitsPlusDeadSensors;
1310 uint8_t ambiguityBit;
1311 double d0;
1312 double deltaEta;
1313 double deltaphires;
1314 double wstot;
1315 double EoverP;
1316 double ip;
1317};
1318
1319struct LHCalcVars_t
1320{
1321 double eta;
1322 double eT;
1323 double f3;
1324 double rHad;
1325 double rHad1;
1326 double Reta;
1327 double w2;
1328 double f1;
1329 double eratio;
1330 double deltaEta;
1331 double d0;
1332 double d0sigma;
1333 double rphi;
1334 double deltaPoverP;
1335 double deltaphires;
1336 double TRT_PID;
1337 double ip;
1338};
1339}
1340
1341namespace Root {
1342class TElectronLikelihoodTool : public asg::AsgMessaging
1343{
1344
1345public:
1347 TElectronLikelihoodTool(const char* name = "TElectronLikelihoodTool");
1348
1349 // Main methods
1350public:
1353
1355 const asg::AcceptInfo& getAcceptInfo() const { return m_acceptInfo; }
1356
1358 asg::AcceptData accept(LikeEnum::LHAcceptVars_t& vars_struct) const;
1359 asg::AcceptData accept(double likelihood,
1360 double eta,
1361 double eT,
1362 int nSiHitsPlusDeadSensors,
1363 int nPixHitsPlusDeadSensors,
1364 bool passBLayerRequirement,
1365 uint8_t ambiguityBit,
1366 double d0,
1367 double deltaEta,
1368 double deltaphires,
1369 double wstot,
1370 double EoverP,
1371 double ip) const;
1373 asg::AcceptData accept() const { return asg::AcceptData(&m_acceptInfo); }
1374
1375 double calculate(LikeEnum::LHCalcVars_t& vars_struct) const;
1376 double calculate(double eta,
1377 double eT,
1378 double f3,
1379 double rHad,
1380 double rHad1,
1381 double Reta,
1382 double w2,
1383 double f1,
1384 double eratio,
1385 double deltaEta,
1386 double d0,
1387 double d0sigma,
1388 double rphi,
1389 double deltaPoverP,
1390 double deltaphires,
1391 double TRT_PID,
1392 double ip) const;
1393
1395 inline void setPDFFileName(const std::string& val) { m_pdfFileName = val; }
1396
1398 inline void setVariableNames(const std::string& val)
1399 {
1402 }
1403
1405 int loadVarHistograms(const std::string& vstr,
1406 TFile* pdfFile,
1407 unsigned int varIndex);
1408
1410 inline void setBinning(const std::string& val) { m_ipBinning = val; }
1411
1412 unsigned int getBitmask(void) const { return m_variableBitMask; }
1413 inline void setBitmask(unsigned int val) { m_variableBitMask = val; };
1414
1415 // Private methods
1416private:
1417 // For every input "varVector", make sure elements of vector are
1418 // in the same order as prescribed in fVariables
1419
1420 double evaluateLikelihood(const std::vector<double>& varVector,
1421 double et,
1422 double eta,
1423 double ip = 0) const;
1424
1425 double evaluateLikelihood(const std::vector<float>& varVector,
1426 double et,
1427 double eta,
1428 double ip = 0) const;
1429
1430 unsigned int getLikelihoodBitmask(const std::string& vars) const;
1431
1432 double InterpolateCuts(const std::vector<double>& cuts,
1433 const std::vector<double>& cuts_4gev,
1434 double et,
1435 double eta) const;
1436 double InterpolatePdfs(unsigned int s_or_b,
1437 unsigned int ipbin,
1438 double et,
1439 double eta,
1440 int bin,
1441 unsigned int var) const;
1442
1443public:
1445 std::vector<int> m_cutBL;
1447 std::vector<int> m_cutPi;
1449 std::vector<int> m_cutSi;
1451 std::vector<double> m_cutA0;
1453 std::vector<double> m_cutDeltaEta;
1454 // /** @brief do cut on delta phi bit*/
1455 std::vector<double> m_cutDeltaPhiRes;
1457 std::vector<int> m_cutAmbiguity;
1467 double m_highETBinThreshold;
1468 // /** @brief do cut on wstot above HighETBinThreshold bit*/
1469 std::vector<double> m_cutWstotAtHighET;
1470 // /** @brief do cut on EoverP above HighETBinThreshold bit*/
1471 std::vector<double> m_cutEoverPAtHighET;
1477 std::vector<double> m_cutLikelihood;
1479 std::vector<double> m_cutLikelihoodPileupCorrection;
1481 std::vector<double> m_cutLikelihood4GeV;
1483 std::vector<double> m_cutLikelihoodPileupCorrection4GeV;
1485 std::vector<double> m_discHardCutForPileupTransform;
1488 std::vector<double> m_discHardCutSlopeForPileupTransform;
1491 std::vector<double> m_discHardCutQuadForPileupTransform;
1494 std::vector<double> m_discLooseForPileupTransform;
1497 std::vector<double> m_discHardCutForPileupTransform4GeV;
1500 std::vector<double> m_discHardCutSlopeForPileupTransform4GeV;
1503 std::vector<double> m_discHardCutQuadForPileupTransform4GeV;
1506 std::vector<double> m_discLooseForPileupTransform4GeV;
1512 std::string m_variableNames;
1514 std::string m_pdfFileName;
1515
1516 // Private methods
1517private:
1520 double TransformLikelihoodOutput(double ps,
1521 double pb,
1522 double ip,
1523 double et,
1524 double eta) const;
1525
1527 static unsigned int getLikelihoodEtaBin(double eta) ;
1528
1530 static unsigned int getLikelihoodEtHistBin(double eT) ;
1531
1533 unsigned int getLikelihoodEtDiscBin(double eT, const bool isLHbinning) const;
1534
1535 // Private member variables
1536private:
1538 std::string m_name;
1539
1541 asg::AcceptInfo m_acceptInfo;
1542
1545 unsigned int m_variableBitMask;
1546
1548 std::string m_ipBinning;
1549
1552
1555
1558
1561
1564
1566 int m_cutPosition_LH;
1567
1570
1573
1576
1580
1584
1585 static constexpr double s_fIpBounds[IP_BINS + 1] = { 0., 500. };
1586
1587 // number of hists stored for original LH, including 4GeV bin (for backwards
1588 // compatibility)
1589 static constexpr unsigned int s_fnEtBinsHist = 7;
1590 // number of discs stored for original LH, excluding 4GeV bin (for
1591 // backwards compatibility)
1592 static constexpr unsigned int s_fnDiscEtBins = 9;
1593 // number of discs stored for original LH plus one for
1594 // HighETBinThreshold (useOneExtraHighETLHBin), excluding 4GeV bin
1595 static constexpr unsigned int s_fnDiscEtBinsOneExtra = 10;
1596 static constexpr unsigned int s_fnEtaBins = 10;
1597 static constexpr unsigned int s_fnVariables = 13;
1598 // 5D array of unique_ptr to SafeTH1 // [sig(0)/bkg(1)][ip][et][eta][variable]
1599 std::unique_ptr<EGSelectors::SafeTH1> m_fPDFbins[2][IP_BINS][s_fnEtBinsHist][s_fnEtaBins][s_fnVariables];
1600 static const std::string s_fVariables[s_fnVariables];
1601
1602 static unsigned int getIpBin(double ip) ;
1603 static std::string getBinName(int etbin,
1604 int etabin,
1605 int ipbin,
1606 const std::string& iptype) ;
1607};
1608
1609} // End: namespace Root
1610
1611#endif
void setBinning(const std::string &val)
Define the binning.
StatusCode initialize()
Initialize this class.
const asg::AcceptInfo & getAcceptInfo() const
accesss to the accept info object
TElectronLikelihoodTool(const char *name="TElectronLikelihoodTool")
Standard constructor.
void setPDFFileName(const std::string &val)
Add an input file that holds the PDFs.
void setVariableNames(const std::string &val)
Define the variable names.

The documentation for this class was generated from the following files: