ATLAS Offline Software
Loading...
Searching...
No Matches
BTaggingSelectionTool Class Reference

#include <BTaggingSelectionTool.h>

Inheritance diagram for BTaggingSelectionTool:
Collaboration diagram for BTaggingSelectionTool:

Classes

struct  taggerproperties

Public Member Functions

 BTaggingSelectionTool (const std::string &name)
 Create a proper constructor for Athena.
StatusCode initialize () override
 Dummy implementation of the initialisation function.
virtual asg::AcceptData accept (const xAOD::IParticle *p) const override
 Get the decision using a generic IParticle pointer.
virtual asg::AcceptData accept (const xAOD::Jet &jet) const override
virtual asg::AcceptData accept (double, double, double) const override
 Get the decision using thet jet's pt and tag weight values.
virtual asg::AcceptData accept (double, double, double, double) const override
virtual asg::AcceptData accept (double, double, double, double, double) const override
virtual asg::AcceptData accept (double, double, double, double, double, double) const override
virtual int getQuantile (const xAOD::IParticle *) const override
 Decide in which quantile of the tag weight distribution the jet belongs (continuous tagging) The return value represents the bin index of the quantile distribution.
virtual int getQuantile (const xAOD::Jet &) const override
virtual int getQuantile (double, double, double) const override
virtual int getQuantile (double, double, double, double) const override
virtual CP::CorrectionCode getCutValue (double, double &cutval) const override
virtual CP::CorrectionCode getTaggerWeight (const xAOD::Jet &jet, double &tagweight) const override
virtual CP::CorrectionCode getTaggerWeight (double pb, double pc, double pu, double &tagweight) const override
virtual CP::CorrectionCode getTaggerWeight (double pb, double pc, double pu, double &tagweight, double ptau) const override
virtual CP::CorrectionCode getTaggerWeight (const xAOD::Jet &jet, double &weight, bool getCTagW) const override
virtual CP::CorrectionCode getTaggerWeight (double, double, double, double &weight, bool getCTagW, double=0.) const override
const asg::AcceptInfogetAcceptInfo () const override
 Declare the interface ID for this pure-virtual interface class to the Athena framework.
virtual void print () const
 Print the state of the tool.
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysInitialize () override
 Perform system initialization for an algorithm.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const
Additional helper functions, not directly mimicking Athena
template<class T>
const T * getProperty (const std::string &name) const
 Get one of the tool's properties.
const std::string & msg_level_name () const __attribute__((deprecated))
 A deprecated function for getting the message level's name.
const std::string & getName (const void *ptr) const
 Get the name of an object that is / should be in the event store.
SG::sgkey_t getKey (const void *ptr) const
 Get the (hashed) key of an object that is in the event store.

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

enum  Tagger {
  UNKNOWN , DL1 , GN1 , GN2 ,
  MV2c10 , GN3EPCLV01 , GN3PflowMuonsV00
}
typedef double(xAOD::BTagging::* tagWeight_member_t) () const
typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

virtual bool checkRange (double, double, asg::AcceptData &) const
 Helper function that decides whether a jet belongs to the correct jet selection for b-tagging.
void InitializeTaggerVariables (std::string taggerName, std::string OP, TSpline3 *spline, TVector *constcut, double &fraction)
Tagger SetTaggerEnum (const std::string &taggerName)
StatusCode ExtractTaggerProperties (taggerproperties &tagger, const std::string &taggerName, const std::string &OP)
std::vector< std::string > split (const std::string &input, const char &delimiter)
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

bool m_initialised = false
bool m_continuous = false
bool m_continuous2D = false
bool m_taggerWithTauFractions = true
asg::AcceptInfo m_acceptinfo
 Object used to store the last decision.
Gaudi::Property< double > m_minPt {this, "MinPt", 0 , "Minimum jet pT cut (in MeV)"}
Gaudi::Property< double > m_maxEta {this, "MaxEta", 2.5, "Maximum jet eta cut"}
Gaudi::Property< double > m_maxRangePt {this, "MaxRangePt", 3000000 , "Max pT range (in MeV)"}
Gaudi::Property< std::string > m_CutFileName {this, "FlvTagCutDefinitionsFileName", ftag::defaults::cdi_path, "name of the files containing official cut definitions (uses PathResolver)"}
Gaudi::Property< std::string > m_taggerName {this, "TaggerName", ftag::defaults::tagger, "tagging algorithm name"}
Gaudi::Property< std::string > m_OP {this, "OperatingPoint", "", "operating point"}
Gaudi::Property< std::string > m_jetAuthor {this, "JetAuthor", ftag::defaults::jet_collection, "jet collection"}
Gaudi::Property< std::string > m_ContinuousBenchmarks {this, "CutBenchmarksContinuousWP", "", "comma separated list of tag bins that will be accepted as tagged: 1,2,3 etc.. "}
Gaudi::Property< bool > m_ErrorOnTagWeightFailure {this, "ErrorOnTagWeightFailure", true, "optionally ignore cases where the tagweight cannot be retrieved. default behaviour is to give an error, switching to false will turn it into a warning"}
Gaudi::Property< bool > m_useCTag {this, "useCTagging", false, "Enabled only for FixedCut or Continuous WPs: define wether the cuts refer to b-tagging or c-tagging"}
Gaudi::Property< bool > m_readFromBTaggingObject {this, "readFromBTaggingObject", false, "Enabled to access btagging scores from xAOD::BTagging object; Can be disabled for GN2v01 to access the scores from the jet itself."}
TFile * m_inf {}
std::vector< double > m_continuouscuts
SG::AuxElement::ConstAccessor< float > m_accessor_pb
SG::AuxElement::ConstAccessor< float > m_accessor_pc
SG::AuxElement::ConstAccessor< float > m_accessor_pu
SG::AuxElement::ConstAccessor< float > m_accessor_ptau
taggerproperties m_tagger
Tagger m_taggerEnum {UNKNOWN}
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default).
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default).
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Definition at line 26 of file BTaggingSelectionTool.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< AlgTool > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

◆ tagWeight_member_t

typedef double(xAOD::BTagging::* BTaggingSelectionTool::tagWeight_member_t) () const
private

Definition at line 29 of file BTaggingSelectionTool.h.

Member Enumeration Documentation

◆ Tagger

Constructor & Destructor Documentation

◆ BTaggingSelectionTool()

BTaggingSelectionTool::BTaggingSelectionTool ( const std::string & name)

Create a proper constructor for Athena.

Create a constructor for standalone usage

Definition at line 43 of file BTaggingSelectionTool.cxx.

44 : asg::AsgTool( name ), m_acceptinfo( "JetSelection" ), m_accessor_pb( "pb" ), m_accessor_pc( "pc" ), m_accessor_pu( "pu" ), m_accessor_ptau( "ptau" )
45{
46 m_initialised = false;
47}
SG::AuxElement::ConstAccessor< float > m_accessor_pu
SG::AuxElement::ConstAccessor< float > m_accessor_ptau
SG::AuxElement::ConstAccessor< float > m_accessor_pc
asg::AcceptInfo m_acceptinfo
Object used to store the last decision.
SG::AuxElement::ConstAccessor< float > m_accessor_pb

Member Function Documentation

◆ accept() [1/6]

asg::AcceptData BTaggingSelectionTool::accept ( const xAOD::IParticle * p) const
overridevirtual

Get the decision using a generic IParticle pointer.

Implements IBTaggingSelectionTool.

Definition at line 467 of file BTaggingSelectionTool.cxx.

467 {
468
469 // Check if this is a jet:
470 if( p->type() != xAOD::Type::Jet ) {
471 ATH_MSG_ERROR( "accept(...) Function received a non-jet" );
472 return asg::AcceptData (&m_acceptinfo);
473 }
474
475 // Cast it to a jet:
476 const xAOD::Jet* jet = dynamic_cast< const xAOD::Jet* >( p );
477 if( ! jet ) {
478 ATH_MSG_FATAL( "accept(...) Failed to cast particle to jet" );
479 return asg::AcceptData (&m_acceptinfo);
480 }
481
482 // Let the specific function do the work:
483 return accept( *jet );
484}
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_FATAL(x,...)
virtual asg::AcceptData accept(const xAOD::IParticle *p) const override
Get the decision using a generic IParticle pointer.
@ Jet
The object is a jet.
Definition ObjectType.h:40
Jet_v1 Jet
Definition of the current "jet version".

◆ accept() [2/6]

asg::AcceptData BTaggingSelectionTool::accept ( const xAOD::Jet & jet) const
overridevirtual

Implements IBTaggingSelectionTool.

Definition at line 486 of file BTaggingSelectionTool.cxx.

486 {
487 asg::AcceptData acceptData (&m_acceptinfo);
488
489 if (! m_initialised) {
490 ATH_MSG_ERROR("BTaggingSelectionTool has not been initialised");
491 return acceptData;
492 }
493
494 double pT = jet.pt();
495 double eta = jet.eta();
496
497 if(m_continuous2D){
498 double taggerweight_b(-100);
499 double taggerweight_c(-100);
500 if( (getTaggerWeight( jet, taggerweight_b, false)!=CorrectionCode::Ok) ||
501 (getTaggerWeight( jet, taggerweight_c, true )!=CorrectionCode::Ok) )
502 return acceptData;
503
504 return accept(pT, eta, taggerweight_b,taggerweight_c);
505 }
506 else{ //if here, we are in 1D mode
507 double taggerweight(-100);
508 if( getTaggerWeight( jet ,taggerweight, m_useCTag)!=CorrectionCode::Ok)
509 return acceptData;
510
511 return accept(pT, eta, taggerweight);
512 }
513}
Scalar eta() const
pseudorapidity method
virtual CP::CorrectionCode getTaggerWeight(const xAOD::Jet &jet, double &tagweight) const override
Gaudi::Property< bool > m_useCTag
@ Ok
The correction was done successfully.
virtual double pt() const
The transverse momentum ( ) of the particle.
Definition Jet_v1.cxx:44
virtual double eta() const
The pseudorapidity ( ) of the particle.
Definition Jet_v1.cxx:49

◆ accept() [3/6]

asg::AcceptData BTaggingSelectionTool::accept ( double pT,
double eta,
double tag_weight ) const
overridevirtual

Get the decision using thet jet's pt and tag weight values.

Implements IBTaggingSelectionTool.

Definition at line 515 of file BTaggingSelectionTool.cxx.

516{
517
518 asg::AcceptData acceptData (&m_acceptinfo);
519
520 if (! m_initialised) {
521 ATH_MSG_ERROR("BTaggingSelectionTool has not been initialised");
522 return acceptData;
523 }
524
525 eta = std::abs(eta);
526 if (! checkRange(pT, eta, acceptData))
527 return acceptData;
528
529 // After initialization, either m_tagger.spline or m_tagger.constcut should be non-zero
530 // Else, the initialization was incorrect and should be revisited
531 if(m_continuous){
532 for(size_t bin : m_tagger.benchmarks){
533 if(bin == 0){
534 throw std::logic_error("bin == 0 in the list of tagged bins. you should not be here. Wrong convention");
535 } else if ( bin == 1 ) {
536 if ( tag_weight < m_continuouscuts.at(bin-1) ) {
537 acceptData.setCutResult( "WorkingPoint", true );
538 }
539 } else if (bin > 1 && bin <= m_continuouscuts.size()){
540 if ( tag_weight > m_continuouscuts.at(bin-2) && tag_weight < m_continuouscuts.at(bin-1) ) {
541 acceptData.setCutResult( "WorkingPoint", true );
542 }
543 } else {
544 if ( tag_weight > m_continuouscuts.at(bin-2) ) {
545 acceptData.setCutResult( "WorkingPoint", true );
546 }
547 }
548 }
549 }
550 else{ //FixedCut
551 double cutvalue(DBL_MAX);
552 if( getCutValue(pT, cutvalue )!=CorrectionCode::Ok ){
553 return acceptData;
554 }
555
556 if ( tag_weight < cutvalue ){
557 return acceptData;
558 }
559
560 acceptData.setCutResult( "WorkingPoint", true );
561 }
562
563 // Return the result:
564 return acceptData;
565}
virtual CP::CorrectionCode getCutValue(double, double &cutval) const override
std::vector< double > m_continuouscuts
virtual bool checkRange(double, double, asg::AcceptData &) const
Helper function that decides whether a jet belongs to the correct jet selection for b-tagging.

◆ accept() [4/6]

asg::AcceptData BTaggingSelectionTool::accept ( double pT,
double eta,
double taggerWeight_b,
double taggerWeight_c ) const
overridevirtual

Implements IBTaggingSelectionTool.

Definition at line 567 of file BTaggingSelectionTool.cxx.

568{
569 asg::AcceptData acceptData (&m_acceptinfo);
570
571 if (! m_initialised) {
572 ATH_MSG_ERROR("BTaggingSelectionTool has not been initialised");
573 return acceptData;
574 }
575
576 eta = std::abs(eta);
577
578 if (! checkRange(pT, eta, acceptData))
579 return acceptData;
580
581 for(auto bin : m_tagger.benchmarks){
582
583 ATH_MSG_DEBUG("bin" <<bin <<" taggerWeight_c "
584 <<taggerWeight_c <<" taggerWeight_b "
585 <<taggerWeight_b);
586
587 ATH_MSG_DEBUG(" c-cuts : " <<m_tagger.get2DCutValue(bin,0) <<" "
588 <<m_tagger.get2DCutValue(bin,1) <<" b-cuts : "
589 <<m_tagger.get2DCutValue(bin,2) <<" "
590 <<m_tagger.get2DCutValue(bin,3));
591
592 if (taggerWeight_c > m_tagger.get2DCutValue(bin,0) && //ctag low
593 taggerWeight_c <= m_tagger.get2DCutValue(bin,1) && //ctag max
594 taggerWeight_b > m_tagger.get2DCutValue(bin,2) && //btag low
595 taggerWeight_b <= m_tagger.get2DCutValue(bin,3) ) //btag max
596 {
597 acceptData.setCutResult( "WorkingPoint", true ); // IF we arrived here, the jet is tagged
598 break;
599 }
600 } //for loop
601
602 // Return the result:
603 return acceptData;
604}
#define ATH_MSG_DEBUG(x,...)

◆ accept() [5/6]

asg::AcceptData BTaggingSelectionTool::accept ( double pT,
double eta,
double pb,
double pc,
double pu ) const
overridevirtual

Implements IBTaggingSelectionTool.

Definition at line 606 of file BTaggingSelectionTool.cxx.

607{
609 asg::AcceptData acceptData (&m_acceptinfo);
610 ATH_MSG_ERROR("For GN2v01 and GN3 taggers, there is a new tau class in the NN output. Please update the accept() to accept(double pT, double eta, double pb, double pc, double pu, double ptau)");
611 return acceptData;
612 } else {
613 return accept(pT, eta, pb, pc, pu, 0.);
614 }
615}

◆ accept() [6/6]

asg::AcceptData BTaggingSelectionTool::accept ( double pT,
double eta,
double pb,
double pc,
double pu,
double ptau ) const
overridevirtual

Implements IBTaggingSelectionTool.

Definition at line 617 of file BTaggingSelectionTool.cxx.

618 {
619 asg::AcceptData acceptData (&m_acceptinfo);
620
621 if (! m_initialised) {
622 ATH_MSG_ERROR("BTaggingSelectionTool has not been initialised");
623 return acceptData;
624 }
625
626 eta = std::abs(eta);
627 if (! checkRange(pT, eta, acceptData))
628 return acceptData;
629
630 // After initialization, either m_tagger.spline or m_tagger.constcut should be non-zero
631 // Else, the initialization was incorrect and should be revisited
632 double cutvalue(DBL_MAX);
633
634 if( getCutValue(pT, cutvalue)!=CorrectionCode::Ok){
635 return acceptData;
636 };
637
638 if(m_continuous2D){
639 double tagger_weight_b(-100);
640 double tagger_weight_c(-100);
641 if( ( getTaggerWeight(pb, pc, pu, tagger_weight_b, false, ptau)!=CorrectionCode::Ok) ||
642 ( getTaggerWeight(pb, pc, pu, tagger_weight_c, true, ptau)!=CorrectionCode::Ok) )
643 return acceptData;
644 return accept(pT, eta, tagger_weight_b, tagger_weight_c);
645 }
646 else{
647 double tagger_weight(-100);
648 if( getTaggerWeight(pb, pc, pu, tagger_weight, m_useCTag, ptau)!=CorrectionCode::Ok)
649 return acceptData;
650 if ( tagger_weight < cutvalue )
651 return acceptData;
652 }
653 //if you made it here, the jet is tagged
654 acceptData.setCutResult( "WorkingPoint", true );
655 return acceptData;
656 }

◆ checkRange()

bool BTaggingSelectionTool::checkRange ( double pT,
double eta,
asg::AcceptData & acceptData ) const
privatevirtual

Helper function that decides whether a jet belongs to the correct jet selection for b-tagging.

Definition at line 792 of file BTaggingSelectionTool.cxx.

793{
794 // Do the |eta| cut:
795 if( std::abs(eta) > m_maxEta ) {
796 return false;
797 }
798 acceptData.setCutResult( "Eta", true );
799
800 // Do the pT cut:
801 ATH_MSG_VERBOSE( "Jet pT: " << pT );
802 if( pT < m_minPt ) {
803 return false;
804 }
805 acceptData.setCutResult( "Pt", true );
806
807 return true;
808}
#define ATH_MSG_VERBOSE(x,...)
Gaudi::Property< double > m_maxEta
Gaudi::Property< double > m_minPt
void setCutResult(const std::string &cutName, bool cutResult)
Set the result of a cut, based on the cut name (safer).
Definition AcceptData.h:135

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ ExtractTaggerProperties()

StatusCode BTaggingSelectionTool::ExtractTaggerProperties ( taggerproperties & tagger,
const std::string & taggerName,
const std::string & OP )
private

Definition at line 246 of file BTaggingSelectionTool.cxx.

246 {
247
248 TString cutname = OP;
249
250 //set the name
251 tagger.name = taggerName;
252
253 if ("FlatBEff"==cutname(0,8) || "HybBEff"==cutname(0,7) ){
254 cutname = taggerName+"/"+m_jetAuthor+"/"+OP+"/cutprofile";
255 tagger.spline = dynamic_cast<TSpline3*> (m_inf->Get(cutname));
256 if (tagger.spline == nullptr){
257 ATH_MSG_ERROR( "Invalid operating point" );
258 return StatusCode::FAILURE;
259 }
260 tagger.constcut = nullptr;
261 }
262 else {
263 cutname = taggerName+"/"+m_jetAuthor+"/"+OP+"/cutvalue";
264 tagger.constcut = dynamic_cast<TVector*> (m_inf->Get(cutname));
265 if (tagger.constcut == nullptr){
266 ATH_MSG_ERROR( "Invalid operating point" );
267 return StatusCode::FAILURE;
268 }
269 tagger.spline = nullptr;
270 }
271
272 //retrieve the "fraction" used in the DL1 log likelihood from the CDI, if its not there, use the hard coded values
273 // (backwards compatibility)
275
276 double fraction_b = -1;
277 const TString basePath = taggerName + "/" + m_jetAuthor + "/" + OP;
278 TVector* fraction_b_data = dynamic_cast<TVector*>( m_inf->Get(basePath + "/fraction_b") );
279 if (fraction_b_data) {
280 fraction_b = (*fraction_b_data)(0);
281 }
282
283 TVector* fraction_c_data = dynamic_cast<TVector*>( m_inf->Get(basePath + "/fraction") );
284 if (!fraction_c_data) {
285 fraction_c_data = dynamic_cast<TVector*>( m_inf->Get(basePath + "/fraction_c") );
286 }
287 double fraction_c = -1;
288 if (fraction_c_data) {
289 fraction_c = (*fraction_c_data)(0);
290 } else{
291 if("DL1" ==taggerName){ fraction_c = 0.08; }
292 if("DL1mu" ==taggerName){ fraction_c = 0.08; }
293 if("DL1rnn" ==taggerName){ fraction_c = 0.03; }
294 else {
295 ATH_MSG_ERROR("Failed to retrieve fraction_c");
296 }
297 }
298
299 double fraction_tau = 0.;
300 double fraction_tau_cTag = 0.;
301 TVector* fraction_tau_data = dynamic_cast<TVector*>( m_inf->Get(basePath + "/fraction_tau") );
302 TVector* fraction_tau_cTag_data = dynamic_cast<TVector*>( m_inf->Get(basePath + "/fraction_tau_cTag") );
304 if( fraction_tau_data ) {
305 fraction_tau = fraction_tau_data[0](0);
306 }
307 if ( m_useCTag && !fraction_tau_cTag_data) {
308 ATH_MSG_ERROR("Runnint c-tagging WP, but failed to retrive fraction_tau_cTag");
309 return StatusCode::FAILURE;
310 }
311 fraction_tau_cTag = fraction_tau_cTag_data[0](0);
312
313 if (!fraction_tau_data && !fraction_tau_cTag){
314 // For all recent taggers GN2v01 or above, the tau fraction(s) should be saved in the CDI file and retrieved/set within the BTaggingSelectionTool
315 // Hence raising error and failure here as at least one of those fractions should not be a null pointer
316 ATH_MSG_ERROR("Tau-fraction(s) should have been retrieved for taggerName=" << taggerName << " but both fraction_tau_data and fraction_tau_cTag are null pointers");
317 return StatusCode::FAILURE;
318 }
319 tagger.fraction_b = fraction_b;
320 tagger.fraction_c = fraction_c;
321 tagger.fraction_tau = fraction_tau;
322 tagger.fraction_tau_cTag = fraction_tau_cTag;
323
324 delete fraction_b_data;
325 delete fraction_c_data;
326 delete fraction_tau_data;
327 delete fraction_tau_cTag_data;
328 }
329 }
330 return StatusCode::SUCCESS;
331}
Gaudi::Property< std::string > m_jetAuthor
const std::string tagger

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ getAcceptInfo()

const asg::AcceptInfo & BTaggingSelectionTool::getAcceptInfo ( ) const
inlineoverridevirtual

Declare the interface ID for this pure-virtual interface class to the Athena framework.

Method to get the AcceptInfo to query what cuts are defined.

Implements IAsgSelectionTool.

Definition at line 65 of file BTaggingSelectionTool.h.

65{return m_acceptinfo;}

◆ getCutValue()

CorrectionCode BTaggingSelectionTool::getCutValue ( double pT,
double & cutval ) const
overridevirtual

Implements IBTaggingSelectionTool.

Definition at line 810 of file BTaggingSelectionTool.cxx.

811{
812 cutval = DBL_MAX;
813
814 // flat cut for out of range pTs
815 if (pT>m_maxRangePt)
817
819
820 if (tagger.spline != nullptr && tagger.constcut == nullptr) {
821 pT = pT/1000.0;
822 double maxsplinept = tagger.spline->GetXmax();
823 if (pT>maxsplinept){ pT = maxsplinept; }
824 cutval = tagger.spline->Eval(pT);
825 }
826
827 else if (tagger.constcut != nullptr && tagger.spline == nullptr) {
828 cutval = tagger.constcut[0](0);
829 }
830 else{
831 ATH_MSG_ERROR( "Bad cut configuration!" );
833 }
834
835
836 ATH_MSG_VERBOSE( "Cut value " << cutval );
837
838 return CorrectionCode::Ok;
839}
#define ATLAS_THREAD_SAFE
Gaudi::Property< double > m_maxRangePt
@ Error
Some error happened during the object correction.

◆ getKey()

SG::sgkey_t asg::AsgTool::getKey ( const void * ptr) const
inherited

Get the (hashed) key of an object that is in the event store.

This is a bit of a special one. StoreGateSvc and xAOD::Event both provide ways for getting the SG::sgkey_t key for an object that is in the store, based on a bare pointer. But they provide different interfaces for doing so.

In order to allow tools to efficiently perform this operation, they can use this helper function.

See also
asg::AsgTool::getName
Parameters
ptrThe bare pointer to the object that the event store should know about
Returns
The hashed key of the object in the store. If not found, an invalid (zero) key.

Definition at line 119 of file AsgTool.cxx.

119 {
120
121#ifdef XAOD_STANDALONE
122 // In case we use @c xAOD::Event, we have a direct function call
123 // for this.
124 return evtStore()->event()->getKey( ptr );
125#else
126 const SG::DataProxy* proxy = evtStore()->proxy( ptr );
127 return ( proxy == nullptr ? 0 : proxy->sgkey() );
128#endif // XAOD_STANDALONE
129 }
ServiceHandle< StoreGateSvc > & evtStore()

◆ getName()

const std::string & asg::AsgTool::getName ( const void * ptr) const
inherited

Get the name of an object that is / should be in the event store.

This is a bit of a special one. StoreGateSvc and xAOD::Event both provide ways for getting the std::string name for an object that is in the store, based on a bare pointer. But they provide different interfaces for doing so.

In order to allow tools to efficiently perform this operation, they can use this helper function.

See also
asg::AsgTool::getKey
Parameters
ptrThe bare pointer to the object that the event store should know about
Returns
The string name of the object in the store. If not found, an empty string.

Definition at line 106 of file AsgTool.cxx.

106 {
107
108#ifdef XAOD_STANDALONE
109 // In case we use @c xAOD::Event, we have a direct function call
110 // for this.
111 return evtStore()->event()->getName( ptr );
112#else
113 const SG::DataProxy* proxy = evtStore()->proxy( ptr );
114 static const std::string dummy = "";
115 return ( proxy == nullptr ? dummy : proxy->name() );
116#endif // XAOD_STANDALONE
117 }

◆ getProperty()

template<class T>
const T * asg::AsgTool::getProperty ( const std::string & name) const
inherited

Get one of the tool's properties.

◆ getQuantile() [1/4]

int BTaggingSelectionTool::getQuantile ( const xAOD::IParticle * p) const
overridevirtual

Decide in which quantile of the tag weight distribution the jet belongs (continuous tagging) The return value represents the bin index of the quantile distribution.

Implements IBTaggingSelectionTool.

Definition at line 658 of file BTaggingSelectionTool.cxx.

658 {
659 // Check if this is a jet:
660
661
662 if( p->type() != xAOD::Type::Jet ) {
663 ATH_MSG_ERROR( "accept(...) Function received a non-jet" );
664 return -1;
665 }
666
667 // Cast it to a jet:
668 const xAOD::Jet* jet = dynamic_cast< const xAOD::Jet* >( p );
669 if( ! jet ) {
670 ATH_MSG_FATAL( "accept(...) Failed to cast particle to jet" );
671 return -1;
672 }
673
674 // Let the specific function do the work:
675 return getQuantile( *jet );
676}
virtual int getQuantile(const xAOD::IParticle *) const override
Decide in which quantile of the tag weight distribution the jet belongs (continuous tagging) The retu...

◆ getQuantile() [2/4]

int BTaggingSelectionTool::getQuantile ( const xAOD::Jet & jet) const
overridevirtual

Implements IBTaggingSelectionTool.

Definition at line 678 of file BTaggingSelectionTool.cxx.

678 {
679 double pT = jet.pt();
680 double eta = std::abs( jet.eta() );
681 int quantile = -1;
682
683 if (m_continuous2D){
684 double tag_weight_b(-100.);
685 double tag_weight_c(-100.);
686 if ( (getTaggerWeight(jet, tag_weight_b, false) == CP::CorrectionCode::Error) ||
687 (getTaggerWeight(jet, tag_weight_c, true ) == CP::CorrectionCode::Error) ){
688 ATH_MSG_WARNING("getQuantile: Failed to retrieve tag weight for Continuous2D!");
689 return -1;
690 }
691 quantile = getQuantile(pT, eta, tag_weight_b, tag_weight_c );
692 }
693 else{
694 // Retrieve the tagger weight which was assigned to the jet
695 double tag_weight(-100.);
696 if (getTaggerWeight(jet, tag_weight, m_useCTag)==CorrectionCode::Error){
697 ATH_MSG_WARNING("getQuantile: Failed to retrieve "+m_taggerName+" weight!");
698 return -1;
699 }
700 ATH_MSG_VERBOSE( m_taggerName << " " << tag_weight);
701 quantile = getQuantile(pT, eta, tag_weight);
702 }
703 return quantile;
704}
#define ATH_MSG_WARNING(x,...)
Gaudi::Property< std::string > m_taggerName

◆ getQuantile() [3/4]

int BTaggingSelectionTool::getQuantile ( double pT,
double eta,
double tag_weight ) const
overridevirtual

Implements IBTaggingSelectionTool.

Definition at line 707 of file BTaggingSelectionTool.cxx.

708{
709 if (! m_initialised) {
710 ATH_MSG_ERROR("BTaggingSelectionTool has not been initialised");
711 }
713 // Cheatsheet:
714 // With n WPs, (from highest to lowest) A1 , A2, A3, ..., An
715 // return -1 if not in b-tagging acceptance
716 // return 1 if between 100% and A1 (untagged)
717 // return 2 if between A1 and A2 (tagged at the A1 WP)
718 // return 3 if between A2 and A3 (tagged at the A2 WP)
719 // ...
720 // return n if between An-1 and An (tagged at the An-1 WP)
721 // return n+1 if between An and 0% (tagged at the An WP)
723
724 int bin_index = -1;
725
726 // First, check if the jet is in acceptance
727 asg::AcceptData acceptData (&m_acceptinfo);
728 if (! checkRange(pT, eta,acceptData)) {
729 return bin_index;
730 }
731
732 // Now we need to check each threshold in the PCBT vector
733 // and return the maximum WP bin index (1,2,...,n).
734 // Instead of checking low<tag_weight<high for each bin,
735 // we simply check tag_weight<high and therefore range
736 // from vector indices 1 to vector.size()
737 bin_index = 1; // setting the ones that pass selection you have default as 1
738 for (std::size_t i=0; i<m_continuouscuts.size(); i++) {
739 if ( tag_weight > m_continuouscuts.at(i) ) {
740 bin_index++;
741 } else {
742 break;
743 }
744 }
745 return bin_index;
746}

◆ getQuantile() [4/4]

int BTaggingSelectionTool::getQuantile ( double pT,
double eta,
double tag_weight_b,
double tag_weight_c ) const
overridevirtual

Cheatsheet: returns 4 if pass B_tight (?) returns 3 if pass B_loose returns 2 if pass C_tight + fail B_loose returns 1 if pass C_loose + fail C_tight + fail B_loose returns 0 if fail C_loose + fail B_loose return -1 not in b-tagging acceptance

Implements IBTaggingSelectionTool.

Definition at line 748 of file BTaggingSelectionTool.cxx.

749{
759
760 //More details here: https://indico.cern.ch/event/1116952/#4-mr49953-implements-the-conti
761
762 ATH_MSG_DEBUG("inside getQuantile 2D " <<pT <<" " <<eta <<" " <<tag_weight_b <<" " <<tag_weight_c);
763 int bin_index(-1);
764
765 asg::AcceptData acceptData (&m_acceptinfo);
766 if (! checkRange(pT, eta, acceptData)) return bin_index;
767
768 int ncuts = m_tagger.cuts2D->GetNrows();
769 ATH_MSG_VERBOSE("ncuts: " <<ncuts);
770
771 //loop over all the cuts
772 for(int i = 0; i < ncuts ; i++){
773 double c_cut_low = m_tagger.get2DCutValue(i,0);
774 double c_cut_hig = m_tagger.get2DCutValue(i,1);
775 double b_cut_low = m_tagger.get2DCutValue(i,2);
776 double b_cut_hig = m_tagger.get2DCutValue(i,3);
777
778 ATH_MSG_DEBUG("bin " <<i <<" c_cut low " <<c_cut_low <<" c_cut hig " <<c_cut_hig <<" c_cut low " <<b_cut_low <<" b_ct hig" <<b_cut_hig);
779 if (tag_weight_c > c_cut_low &&
780 tag_weight_c <= c_cut_hig &&
781 tag_weight_b > b_cut_low &&
782 tag_weight_b <= b_cut_hig){
783 bin_index = i;
784 break;
785 }
786 }
787
788 ATH_MSG_VERBOSE("bin_index " <<bin_index);
789 return bin_index;
790}

◆ getTaggerWeight() [1/5]

CorrectionCode BTaggingSelectionTool::getTaggerWeight ( const xAOD::Jet & jet,
double & tagweight ) const
overridevirtual

Implements IBTaggingSelectionTool.

Definition at line 333 of file BTaggingSelectionTool.cxx.

333 {
334 return getTaggerWeight(jet, tagweight, m_useCTag);
335}

◆ getTaggerWeight() [2/5]

CorrectionCode BTaggingSelectionTool::getTaggerWeight ( const xAOD::Jet & jet,
double & weight,
bool getCTagW ) const
overridevirtual

Implements IBTaggingSelectionTool.

Definition at line 337 of file BTaggingSelectionTool.cxx.

337 {
338
339 std::string taggerName = m_tagger.name;
340 // following taggerName change is needed given different name is used for GN2v00 in derivation and in CDI
341 if (taggerName == "GN2v00LegacyWP" || taggerName == "GN2v00NewAliasWP"){
342 taggerName = "GN2v00";
343 }
344
345 tagweight = -100.;
346
347 if(!m_continuous2D && (getCTagW != m_useCTag) ){
348 ATH_MSG_ERROR("Difference between initialisation and getTaggerWeight request! useCTagging property set to " <<m_useCTag <<" while getTaggerWeight use c-tag is set to " <<getCTagW <<".");
350 }
351
353
355
356 if ((!btag) || (!btag->MVx_discriminant(taggerName, tagweight))){
358 ATH_MSG_ERROR("Failed to retrieve "+taggerName+" weight!");
360 }else{
361 ATH_MSG_WARNING("Failed to retrieve "+taggerName+" weight!");
362 return CorrectionCode::Ok;
363 }
364 }
365 ATH_MSG_VERBOSE( taggerName << " " << tagweight );
366 return CorrectionCode::Ok;
367 } //MV2
368 else{
369 //DL1r or DL1 or GN2v01
370 double tagger_pb(-10.);
371 double tagger_pc(-10.);
372 double tagger_pu(-10.);
373 double tagger_ptau(0.);
374
375 const SG::AuxElement* btagInfo = &jet;
378
379 if(!btagInfo){
381 ATH_MSG_ERROR("Failed to retrieve "+taggerName+" weight!");
383 }else{
384 ATH_MSG_WARNING("Failed to retrieve "+taggerName+" weight!");
385 return CorrectionCode::Ok;
386 }
387 }
388
389 tagger_pb = m_accessor_pb(*btagInfo);
390 tagger_pc = m_accessor_pc(*btagInfo);
391 tagger_pu = m_accessor_pu(*btagInfo);
393 tagger_ptau = m_accessor_ptau(*btagInfo);
394 }
395
396 return getTaggerWeight(tagger_pb, tagger_pc, tagger_pu, tagweight, getCTagW, tagger_ptau);
397
398 }
399
400 //if we got here the tagger name is not configured properly
401 ATH_MSG_ERROR("BTaggingSelectionTool doesn't support tagger: "+m_taggerName);
403
404}
Gaudi::Property< bool > m_readFromBTaggingObject
Gaudi::Property< bool > m_ErrorOnTagWeightFailure
bool MVx_discriminant(const std::string &taggername, double &value) const
AuxElement(SG::AuxVectorData *container, size_t index)
Base class for elements of a container that can have aux data.
const BTagging * getBTagging(const SG::AuxElement &part)
Access the default xAOD::BTagging object associated to an object.
BTagging_v1 BTagging
Definition of the current "BTagging version".
Definition BTagging.h:17

◆ getTaggerWeight() [3/5]

CorrectionCode BTaggingSelectionTool::getTaggerWeight ( double pb,
double pc,
double pu,
double & tagweight ) const
overridevirtual

Implements IBTaggingSelectionTool.

Definition at line 406 of file BTaggingSelectionTool.cxx.

406 {
408 ATH_MSG_ERROR("For GN2v01 or newer taggers, there is a new tau class in the NN output. Please update your getTaggerWeight() to getTaggerWeight( double pb, double pc, double pu, double & tagweight, double ptau)");
410 } else {
411 return getTaggerWeight(pb, pc, pu, tagweight, m_useCTag, 0.);
412 }
413}

◆ getTaggerWeight() [4/5]

CorrectionCode BTaggingSelectionTool::getTaggerWeight ( double pb,
double pc,
double pu,
double & tagweight,
double ptau ) const
overridevirtual

Implements IBTaggingSelectionTool.

Definition at line 415 of file BTaggingSelectionTool.cxx.

415 {
416 return getTaggerWeight(pb, pc, pu, tagweight, m_useCTag, ptau);
417}

◆ getTaggerWeight() [5/5]

CorrectionCode BTaggingSelectionTool::getTaggerWeight ( double pb,
double pc,
double pu,
double & weight,
bool getCTagW,
double ptau = 0. ) const
overridevirtual

Implements IBTaggingSelectionTool.

Definition at line 419 of file BTaggingSelectionTool.cxx.

419 {
420
421 std::string taggerName = m_tagger.name;
422
423 if(!m_continuous2D && (getCTagW != m_useCTag) ){
424 ATH_MSG_ERROR("Difference between initialisation and getTaggerWeight request! useCTagging property set to " <<m_useCTag <<" while getTaggerWeight use c-tag is set to " <<getCTagW <<".");
426 }
427
428 tagweight = -100.;
430
431 bool valid_input = (!std::isnan(pu) && pb>=0 && pc>=0 && pu>=0 && ptau>=0);
432
433 if (!valid_input){
435 ATH_MSG_ERROR("Invalid inputs for "+taggerName+" pb " << pb << " pc " << pc << " pu " << pu << " ptau " << ptau << " ");
437 }else{
438 ATH_MSG_WARNING("Invalid inputs for "+taggerName+" pb " << pb << " pc " << pc << " pu " << pu << " ptau " << ptau << " ");
439 return CorrectionCode::Ok;
440 }
441 }
442
443 if(getCTagW){
444 tagweight = log(pc / (m_tagger.fraction_b * pb + (1. - m_tagger.fraction_b - m_tagger.fraction_tau_cTag) * pu + m_tagger.fraction_tau_cTag * ptau) );
445 }
446 else{
447 tagweight = log(pb / (m_tagger.fraction_c * pc + (1. - m_tagger.fraction_c - m_tagger.fraction_tau) * pu + m_tagger.fraction_tau * ptau) );
448 }
449
450 ATH_MSG_VERBOSE( "pb " << pb );
451 ATH_MSG_VERBOSE( "pc " << pc );
452 ATH_MSG_VERBOSE( "pu " << pu );
453 ATH_MSG_VERBOSE( "ptau" << ptau );
454 ATH_MSG_VERBOSE( "tagweight " << tagweight );
455
456 return CorrectionCode::Ok;
457 }
458
459 //if we got here the tagger name is not configured properly
460 ATH_MSG_ERROR("this call to getTaggerWeight only works for DL1/GNx taggers");
462
463}

◆ initialize()

StatusCode BTaggingSelectionTool::initialize ( void )
overridevirtual

Dummy implementation of the initialisation function.

It's here to allow the dual-use tools to skip defining an initialisation function. Since many are doing so...

Reimplemented from asg::AsgTool.

Definition at line 49 of file BTaggingSelectionTool.cxx.

49 {
50 m_initialised = true;
51
52 if (m_OP == ""){
53 ATH_MSG_ERROR( "BTaggingSelectionTool wasn't given a working point name" );
54 return StatusCode::FAILURE;
55 }
56
57 TString pathtofile = PathResolverFindCalibFile(m_CutFileName);
58 m_inf = TFile::Open(pathtofile, "read");
59 if (0==m_inf) {
60 ATH_MSG_ERROR( "BTaggingSelectionTool couldn't access the CDI file" );
61 return StatusCode::FAILURE;
62 }
63
64 // check the CDI file for the selected tagger and jet collection
65 TString check_CDI = m_taggerName.value();
66 if(!m_inf->Get(check_CDI)){
67 ATH_MSG_ERROR( "Tagger: "+m_taggerName+" not found in this CDI file: "+m_CutFileName);
68 return StatusCode::FAILURE;
69 }
70 check_CDI = m_taggerName+"/"+m_jetAuthor;
71 if(!m_inf->Get(check_CDI)){
72 ATH_MSG_ERROR( "Tagger: "+m_taggerName+" and Jet Collection : "+m_jetAuthor+" not found in this CDI file: "+m_CutFileName);
73 return StatusCode::FAILURE;
74 }
75
76 //set taggerEnum to avid string comparison:
78
79 // For all recent taggers (GN2v01 or above), the tau fraction(s) should be saved in the CDI file and retrieved/set within the BTaggingSelectionTool
80 // This boolean allows the tool knowing if we expect tau fractions or no for the tagger the user wants to use
81 m_taggerWithTauFractions = (m_taggerEnum != Tagger::MV2c10 && m_taggerEnum != Tagger::DL1 && m_taggerEnum != Tagger::GN1 && !(m_taggerName.value().find("GN2v00") != std::string::npos));
82
83 // Change the minPt cut if the user didn't touch it
84 if (m_minPt < 0){
85 ATH_MSG_ERROR( "Tagger: "+m_taggerName+" and Jet Collection : "+m_jetAuthor+" do not have a minimum jet pT cut set.");
86 return StatusCode::FAILURE;
87 }
88
89 // Operating point reading
90 TString cutname = m_OP.value();
91 m_continuous = false;
92 m_continuous2D = false;
93
94 if(cutname.Contains("Continuous2D")){
95 ATH_MSG_INFO("Working with Continuous2D WP.");
96 m_continuous = true;
97 m_continuous2D = true;
98 m_useCTag = false; //important for backward compatibility in getTaggerWeight methods.
99 cutname = m_taggerName+"/"+m_jetAuthor+"/Continuous2D/cutvalue";
100 m_tagger.name = m_taggerName;
101 TMatrixD* matrix = dynamic_cast<TMatrixD*> (m_inf->Get(cutname));
102 m_tagger.cuts2D = matrix;
103
104 for (int bin = 0; bin < m_tagger.cuts2D->GetNrows(); bin++)
105 ATH_MSG_DEBUG("INITIALIZATION c-cuts : " <<m_tagger.get2DCutValue(bin,0) <<" "
106 <<m_tagger.get2DCutValue(bin,1) <<" b-cuts : "
107 <<m_tagger.get2DCutValue(bin,2) <<" "
108 <<m_tagger.get2DCutValue(bin,3));
109
110 if (m_tagger.cuts2D == nullptr){
111 ATH_MSG_ERROR( "Invalid operating point" );
112 return StatusCode::FAILURE;
113 }
114
115 m_tagger.spline = nullptr;
116
117 TString fraction_data_name = m_taggerName+"/"+m_jetAuthor+"/Continuous2D/fraction_b";
118 TVector *fraction_data = dynamic_cast<TVector*> (m_inf->Get(fraction_data_name));
119 if(fraction_data!=nullptr){
120 m_tagger.fraction_b = fraction_data[0](0);
121 }
122 else{
123 ATH_MSG_ERROR("Tagger fraction_b in Continuous2D WP not available");
124 return StatusCode::FAILURE;
125 }
126
127 //now the c-fraction:
128 fraction_data_name = m_taggerName+"/"+m_jetAuthor+"/Continuous2D/fraction_c";
129 fraction_data = dynamic_cast<TVector*> (m_inf->Get(fraction_data_name));
130 if(fraction_data!=nullptr){
131 m_tagger.fraction_c = fraction_data[0](0);}
132 else{
133 ATH_MSG_ERROR("Tagger fraction_c in Continuous2D WP not available");
134 return StatusCode::FAILURE;
135 }
136 //now the tau-fraction if the tagger is GN2* or GN3*:
138 fraction_data_name = m_taggerName+"/"+m_jetAuthor+"/Continuous2D/fraction_tau";
139 TString fraction_data_name_cTag = m_taggerName+"/"+m_jetAuthor+"/Continuous2D/fraction_tau_cTag";
140 fraction_data = dynamic_cast<TVector*> (m_inf->Get(fraction_data_name));
141 TVector *fraction_data_cTag = dynamic_cast<TVector*> (m_inf->Get(fraction_data_name_cTag));
142 if(fraction_data!=nullptr){
143 m_tagger.fraction_tau = fraction_data[0](0);
144 }else{
145 ATH_MSG_ERROR("Tagger fraction_tau in Continuous2D WP not available");
146 return StatusCode::FAILURE;
147 }
148 if(fraction_data_cTag!=nullptr){
149 m_tagger.fraction_tau_cTag = fraction_data_cTag[0](0);
150 }else{
151 ATH_MSG_ERROR("Tagger fraction_tau_cTag in Continuous2D WP not available");
152 return StatusCode::FAILURE;
153 }
154 delete fraction_data_cTag;
155 }
156 delete fraction_data;
157 } //Continuous2D
158 else if ("Continuous"==cutname(0,10)){ // For continuous tagging load all flat-cut WPs
159 if(m_useCTag)
160 ATH_MSG_WARNING( "Running in Continuous WP and using 1D c-tagging");
161 m_continuous = true;
162
163 std::string subDirName = m_taggerName + "/" + m_jetAuthor;
164 // Get directory containing the cuts information
165 TDirectoryFile *tmpDir = dynamic_cast<TDirectoryFile*>( m_inf->Get(subDirName.c_str()) );
166 if (!tmpDir){
167 // Raise error if could not retrieve subdirectory
168 ATH_MSG_ERROR( "CDI file does not contain sub-directory: " << subDirName );
169 return StatusCode::FAILURE;
170 }
171
172 // Now retrieve the name of the b-tagging fixed cut efficiency working points
173 static const std::string fixedBCutPrefix = "FixedCutBEff_";
174 std::vector<std::string> workingpoints;
175
176 // Loop over keys in the sub directory and select the ones corresponding to fixed cuts
177 TIter next(tmpDir->GetListOfKeys());
178 TKey *key;
179 while ((key = (TKey*)next())) {
180 std::string keyName = key->GetName();
181 // Check if key begins with prefix in that case it's one of the working point
182 // Also make sure the key is not already in the vector as
183 // the list of keys from GetListOfKeys() can contain several times the same name
184 // because there can be several cycle number per objects
185 // since here we check the entry is not already in the vector it's fine
186 // See
187 // https://root-forum.cern.ch/t/tkey-tobject-and-getlistofkeys-for-only-newest-ttrees/25928/3
188 // https://root-forum.cern.ch/t/tkey-tobject-and-getlistofkeys-for-only-newest-ttrees/25928/7
189 if (keyName.starts_with(fixedBCutPrefix) &&
190 std::find(workingpoints.begin(), workingpoints.end(), keyName) == workingpoints.end()){
191 // Add efficiency working point to the vector
192 workingpoints.push_back( keyName );
193 }
194 }
195
196 // After having retrieved all b-tagging working points
197 // Sort vector then set descending order i.e. loosest working point first
198 std::sort(workingpoints.begin(), workingpoints.end());
199 std::reverse(workingpoints.begin(), workingpoints.end()); // put in descending order
200 for(const std::string& wp : workingpoints){
201 cutname = subDirName + "/" + wp + "/cutvalue";
202 m_tagger.constcut = dynamic_cast<TVector*> (m_inf->Get(cutname));
203 if (m_tagger.constcut != nullptr) {
204 m_continuouscuts.push_back(m_tagger.constcut[0](0));
205 } else {
206 ATH_MSG_ERROR( "Continuous tagging is trying to use an invalid operating point: " + wp );
207 return StatusCode::FAILURE;
208 }
209 }
210
211 //The WP is not important. This is just to retrieve the c-fraction.
213
214 } else {
215 if(m_useCTag){
216 ATH_MSG_WARNING( "Running in FixedCut WP for c-tagging, make sure to use b-veto to select c-tagged jet properly.");
217 }
219 }
220
221 //set the accept working points, jets in these pseudo-continuous bins will be accepted
222 if(m_continuous){
223 std::vector<std::string> tag_benchmarks_names = split(m_ContinuousBenchmarks, ',');
224 std::vector<int> tag_benchmarks;
225 for (const std::string& tagbin : tag_benchmarks_names){
226 tag_benchmarks.push_back(std::atoi(tagbin.c_str()));
227 ATH_MSG_INFO("adding " <<tag_benchmarks.back() <<" as tagged bin ");
228 }
229 m_tagger.benchmarks = tag_benchmarks;
230 }
231
232 m_inf->Close();
233
234 m_acceptinfo.addCut( "Eta", "Selection of jets according to their pseudorapidity" );
235 m_acceptinfo.addCut( "Pt", "Selection of jets according to their transverse momentum" );
236 m_acceptinfo.addCut( "WorkingPoint", "Working point for flavour-tagging of jets according to their b-tagging weight" );
237
238 m_accessor_pb = SG::AuxElement::ConstAccessor<float>(m_taggerName+ "_pb");
239 m_accessor_pc = SG::AuxElement::ConstAccessor<float>(m_taggerName+ "_pc");
240 m_accessor_pu = SG::AuxElement::ConstAccessor<float>(m_taggerName+ "_pu");
241 m_accessor_ptau = SG::AuxElement::ConstAccessor<float>(m_taggerName+ "_ptau");
242
243 return StatusCode::SUCCESS;
244}
#define ATH_MSG_INFO(x,...)
#define ANA_CHECK(EXP)
check whether the given expression was successful
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Gaudi::Property< std::string > m_CutFileName
StatusCode ExtractTaggerProperties(taggerproperties &tagger, const std::string &taggerName, const std::string &OP)
Gaudi::Property< std::string > m_OP
Gaudi::Property< std::string > m_ContinuousBenchmarks
std::vector< std::string > split(const std::string &input, const char &delimiter)
Tagger SetTaggerEnum(const std::string &taggerName)
std::string find(const std::string &s)
return a remapped string
Definition hcg.cxx:140
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
void reverse(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of reverse for DataVector/List.

◆ InitializeTaggerVariables()

void BTaggingSelectionTool::InitializeTaggerVariables ( std::string taggerName,
std::string OP,
TSpline3 * spline,
TVector * constcut,
double & fraction )
private

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ msg()

MsgStream & AthCommonMsg< AlgTool >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msg_level_name()

const std::string & asg::AsgTool::msg_level_name ( ) const
inherited

A deprecated function for getting the message level's name.

Instead of using this, weirdly named function, user code should get the string name of the current minimum message level (in case they really need it...), with:

MSG::name( msg().level() )

This function's name doesn't follow the ATLAS coding rules, and as such will be removed in the not too distant future.

Returns
The string name of the current minimum message level that's printed

Definition at line 101 of file AsgTool.cxx.

101 {
102
103 return MSG::name( msg().level() );
104 }
MsgStream & msg() const
const std::string & name(Level lvl)
Convenience function for translating message levels to strings.
Definition MsgLevel.cxx:19

◆ msgLvl()

bool AthCommonMsg< AlgTool >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ print()

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ SetTaggerEnum()

Tagger BTaggingSelectionTool::SetTaggerEnum ( const std::string & taggerName)
inlineprivate

Definition at line 130 of file BTaggingSelectionTool.h.

130 {
131 if(taggerName.find("DL1") != std::string::npos) return Tagger::DL1;
132 else if(taggerName.find("GN1") != std::string::npos) return Tagger::GN1;
133 else if(taggerName.find("GN2") != std::string::npos) return Tagger::GN2;
134 else if(taggerName.find("GN3EPCLV01") != std::string::npos) return Tagger::GN3EPCLV01;
135 else if(taggerName.find("GN3PflowMuonsV00") != std::string::npos) return Tagger::GN3PflowMuonsV00;
136 else if(taggerName == "MV2c10") return Tagger::MV2c10;
137 else
138 ATH_MSG_ERROR("Tagger Name NOT supported.");
139 return Tagger::UNKNOWN;
140 };

◆ split()

std::vector< std::string > BTaggingSelectionTool::split ( const std::string & input,
const char & delimiter )
private

Definition at line 841 of file BTaggingSelectionTool.cxx.

841 {
842 std::vector<std::string> v;
843 std::istringstream buf(input);
844 for(std::string token; std::getline(buf, token, delimiter); )
845 v.push_back(token);
846 return v;
847}
static const std::string delimiter("/")

◆ sysInitialize()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysInitialize ( )
overridevirtualinherited

Perform system initialization for an algorithm.

We override this to declare all the elements of handle key arrays at the end of initialization. See comments on updateVHKA.

Reimplemented in asg::AsgMetadataTool, AthCheckedComponent< AthAlgTool >, and AthCheckedComponent<::AthAlgTool >.

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }
std::vector< SG::VarHandleKeyArray * > m_vhka

Member Data Documentation

◆ m_acceptinfo

asg::AcceptInfo BTaggingSelectionTool::m_acceptinfo
private

Object used to store the last decision.

Definition at line 80 of file BTaggingSelectionTool.h.

◆ m_accessor_pb

SG::AuxElement::ConstAccessor<float> BTaggingSelectionTool::m_accessor_pb
private

Definition at line 101 of file BTaggingSelectionTool.h.

◆ m_accessor_pc

SG::AuxElement::ConstAccessor<float> BTaggingSelectionTool::m_accessor_pc
private

Definition at line 102 of file BTaggingSelectionTool.h.

◆ m_accessor_ptau

SG::AuxElement::ConstAccessor<float> BTaggingSelectionTool::m_accessor_ptau
private

Definition at line 104 of file BTaggingSelectionTool.h.

◆ m_accessor_pu

SG::AuxElement::ConstAccessor<float> BTaggingSelectionTool::m_accessor_pu
private

Definition at line 103 of file BTaggingSelectionTool.h.

◆ m_continuous

bool BTaggingSelectionTool::m_continuous = false
private

Definition at line 73 of file BTaggingSelectionTool.h.

◆ m_continuous2D

bool BTaggingSelectionTool::m_continuous2D = false
private

Definition at line 74 of file BTaggingSelectionTool.h.

◆ m_ContinuousBenchmarks

Gaudi::Property<std::string> BTaggingSelectionTool::m_ContinuousBenchmarks {this, "CutBenchmarksContinuousWP", "", "comma separated list of tag bins that will be accepted as tagged: 1,2,3 etc.. "}
private

Definition at line 90 of file BTaggingSelectionTool.h.

90{this, "CutBenchmarksContinuousWP", "", "comma separated list of tag bins that will be accepted as tagged: 1,2,3 etc.. "};

◆ m_continuouscuts

std::vector<double> BTaggingSelectionTool::m_continuouscuts
private

Definition at line 99 of file BTaggingSelectionTool.h.

◆ m_CutFileName

Gaudi::Property<std::string> BTaggingSelectionTool::m_CutFileName {this, "FlvTagCutDefinitionsFileName", ftag::defaults::cdi_path, "name of the files containing official cut definitions (uses PathResolver)"}
private

Definition at line 86 of file BTaggingSelectionTool.h.

86{this, "FlvTagCutDefinitionsFileName", ftag::defaults::cdi_path, "name of the files containing official cut definitions (uses PathResolver)"};
const std::string cdi_path

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default).

Definition at line 393 of file AthCommonDataStore.h.

◆ m_ErrorOnTagWeightFailure

Gaudi::Property<bool> BTaggingSelectionTool::m_ErrorOnTagWeightFailure {this, "ErrorOnTagWeightFailure", true, "optionally ignore cases where the tagweight cannot be retrieved. default behaviour is to give an error, switching to false will turn it into a warning"}
private

Definition at line 92 of file BTaggingSelectionTool.h.

92{this, "ErrorOnTagWeightFailure", true, "optionally ignore cases where the tagweight cannot be retrieved. default behaviour is to give an error, switching to false will turn it into a warning"};

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default).

Definition at line 390 of file AthCommonDataStore.h.

◆ m_inf

TFile* BTaggingSelectionTool::m_inf {}
private

Definition at line 98 of file BTaggingSelectionTool.h.

98{};

◆ m_initialised

bool BTaggingSelectionTool::m_initialised = false
private

Definition at line 72 of file BTaggingSelectionTool.h.

◆ m_jetAuthor

Gaudi::Property<std::string> BTaggingSelectionTool::m_jetAuthor {this, "JetAuthor", ftag::defaults::jet_collection, "jet collection"}
private

Definition at line 89 of file BTaggingSelectionTool.h.

89{this, "JetAuthor", ftag::defaults::jet_collection, "jet collection"};
const std::string jet_collection

◆ m_maxEta

Gaudi::Property<double> BTaggingSelectionTool::m_maxEta {this, "MaxEta", 2.5, "Maximum jet eta cut"}
private

Definition at line 83 of file BTaggingSelectionTool.h.

83{this, "MaxEta", 2.5, "Maximum jet eta cut"};

◆ m_maxRangePt

Gaudi::Property<double> BTaggingSelectionTool::m_maxRangePt {this, "MaxRangePt", 3000000 , "Max pT range (in MeV)"}
private

Definition at line 84 of file BTaggingSelectionTool.h.

84{this, "MaxRangePt", 3000000 /*MeV*/, "Max pT range (in MeV)"};

◆ m_minPt

Gaudi::Property<double> BTaggingSelectionTool::m_minPt {this, "MinPt", 0 , "Minimum jet pT cut (in MeV)"}
private

Definition at line 82 of file BTaggingSelectionTool.h.

82{this, "MinPt", 0 /*MeV*/, "Minimum jet pT cut (in MeV)"};

◆ m_OP

Gaudi::Property<std::string> BTaggingSelectionTool::m_OP {this, "OperatingPoint", "", "operating point"}
private

Definition at line 88 of file BTaggingSelectionTool.h.

88{this, "OperatingPoint", "", "operating point"};

◆ m_readFromBTaggingObject

Gaudi::Property<bool> BTaggingSelectionTool::m_readFromBTaggingObject {this, "readFromBTaggingObject", false, "Enabled to access btagging scores from xAOD::BTagging object; Can be disabled for GN2v01 to access the scores from the jet itself."}
private

Definition at line 96 of file BTaggingSelectionTool.h.

96{this, "readFromBTaggingObject", false, "Enabled to access btagging scores from xAOD::BTagging object; Can be disabled for GN2v01 to access the scores from the jet itself."};

◆ m_tagger

taggerproperties BTaggingSelectionTool::m_tagger
private

Definition at line 125 of file BTaggingSelectionTool.h.

◆ m_taggerEnum

Tagger BTaggingSelectionTool::m_taggerEnum {UNKNOWN}
private

Definition at line 128 of file BTaggingSelectionTool.h.

128{UNKNOWN};

◆ m_taggerName

Gaudi::Property<std::string> BTaggingSelectionTool::m_taggerName {this, "TaggerName", ftag::defaults::tagger, "tagging algorithm name"}
private

Definition at line 87 of file BTaggingSelectionTool.h.

87{this, "TaggerName", ftag::defaults::tagger, "tagging algorithm name"};

◆ m_taggerWithTauFractions

bool BTaggingSelectionTool::m_taggerWithTauFractions = true
private

Definition at line 77 of file BTaggingSelectionTool.h.

◆ m_useCTag

Gaudi::Property<bool> BTaggingSelectionTool::m_useCTag {this, "useCTagging", false, "Enabled only for FixedCut or Continuous WPs: define wether the cuts refer to b-tagging or c-tagging"}
private

Definition at line 94 of file BTaggingSelectionTool.h.

94{this, "useCTagging", false, "Enabled only for FixedCut or Continuous WPs: define wether the cuts refer to b-tagging or c-tagging"};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< AlgTool > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.


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