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
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 44 of file BTaggingSelectionTool.cxx.

45 : asg::AsgTool( name ), m_acceptinfo( "JetSelection" ), m_accessor_pb( "pb" ), m_accessor_pc( "pc" ), m_accessor_pu( "pu" ), m_accessor_ptau( "ptau" )
46{
47 m_initialised = false;
48}
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 458 of file BTaggingSelectionTool.cxx.

458 {
459
460 // Check if this is a jet:
461 if( p->type() != xAOD::Type::Jet ) {
462 ATH_MSG_ERROR( "accept(...) Function received a non-jet" );
463 return asg::AcceptData (&m_acceptinfo);
464 }
465
466 // Cast it to a jet:
467 const xAOD::Jet* jet = dynamic_cast< const xAOD::Jet* >( p );
468 if( ! jet ) {
469 ATH_MSG_FATAL( "accept(...) Failed to cast particle to jet" );
470 return asg::AcceptData (&m_acceptinfo);
471 }
472
473 // Let the specific function do the work:
474 return accept( *jet );
475}
#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 477 of file BTaggingSelectionTool.cxx.

477 {
478 asg::AcceptData acceptData (&m_acceptinfo);
479
480 if (! m_initialised) {
481 ATH_MSG_ERROR("BTaggingSelectionTool has not been initialised");
482 return acceptData;
483 }
484
485 double pT = jet.pt();
486 double eta = jet.eta();
487
488 if(m_continuous2D){
489 double taggerweight_b(-100);
490 double taggerweight_c(-100);
491 if( (getTaggerWeight( jet, taggerweight_b, false)!=CorrectionCode::Ok) ||
492 (getTaggerWeight( jet, taggerweight_c, true )!=CorrectionCode::Ok) )
493 return acceptData;
494
495 return accept(pT, eta, taggerweight_b,taggerweight_c);
496 }
497 else{ //if here, we are in 1D mode
498 double taggerweight(-100);
499 if( getTaggerWeight( jet ,taggerweight, m_useCTag)!=CorrectionCode::Ok)
500 return acceptData;
501
502 return accept(pT, eta, taggerweight);
503 }
504}
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 506 of file BTaggingSelectionTool.cxx.

507{
508
509 asg::AcceptData acceptData (&m_acceptinfo);
510
511 if (! m_initialised) {
512 ATH_MSG_ERROR("BTaggingSelectionTool has not been initialised");
513 return acceptData;
514 }
515
516 eta = std::abs(eta);
517 if (! checkRange(pT, eta, acceptData))
518 return acceptData;
519
520 // After initialization, either m_tagger.spline or m_tagger.constcut should be non-zero
521 // Else, the initialization was incorrect and should be revisited
522 if(m_continuous){
523 for(size_t bin : m_tagger.benchmarks){
524 if(bin == 0){
525 throw std::logic_error("bin == 0 in the list of tagged bins. you should not be here. Wrong convention");
526 } else if ( bin == 1 ) {
527 if ( tag_weight < m_continuouscuts.at(bin-1) ) {
528 acceptData.setCutResult( "WorkingPoint", true );
529 }
530 } else if (bin > 1 && bin <= m_continuouscuts.size()){
531 if ( tag_weight > m_continuouscuts.at(bin-2) && tag_weight < m_continuouscuts.at(bin-1) ) {
532 acceptData.setCutResult( "WorkingPoint", true );
533 }
534 } else {
535 if ( tag_weight > m_continuouscuts.at(bin-2) ) {
536 acceptData.setCutResult( "WorkingPoint", true );
537 }
538 }
539 }
540 }
541 else{ //FixedCut
542 double cutvalue(DBL_MAX);
543 if( getCutValue(pT, cutvalue )!=CorrectionCode::Ok ){
544 return acceptData;
545 }
546
547 if ( tag_weight < cutvalue ){
548 return acceptData;
549 }
550
551 acceptData.setCutResult( "WorkingPoint", true );
552 }
553
554 // Return the result:
555 return acceptData;
556}
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 558 of file BTaggingSelectionTool.cxx.

559{
560 asg::AcceptData acceptData (&m_acceptinfo);
561
562 if (! m_initialised) {
563 ATH_MSG_ERROR("BTaggingSelectionTool has not been initialised");
564 return acceptData;
565 }
566
567 eta = std::abs(eta);
568
569 if (! checkRange(pT, eta, acceptData))
570 return acceptData;
571
572 for(auto bin : m_tagger.benchmarks){
573
574 ATH_MSG_DEBUG("bin" <<bin <<" taggerWeight_c "
575 <<taggerWeight_c <<" taggerWeight_b "
576 <<taggerWeight_b);
577
578 ATH_MSG_DEBUG(" c-cuts : " <<m_tagger.get2DCutValue(bin,0) <<" "
579 <<m_tagger.get2DCutValue(bin,1) <<" b-cuts : "
580 <<m_tagger.get2DCutValue(bin,2) <<" "
581 <<m_tagger.get2DCutValue(bin,3));
582
583 if (taggerWeight_c > m_tagger.get2DCutValue(bin,0) && //ctag low
584 taggerWeight_c <= m_tagger.get2DCutValue(bin,1) && //ctag max
585 taggerWeight_b > m_tagger.get2DCutValue(bin,2) && //btag low
586 taggerWeight_b <= m_tagger.get2DCutValue(bin,3) ) //btag max
587 {
588 acceptData.setCutResult( "WorkingPoint", true ); // IF we arrived here, the jet is tagged
589 break;
590 }
591 } //for loop
592
593 // Return the result:
594 return acceptData;
595}
#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 597 of file BTaggingSelectionTool.cxx.

598{
599 if (m_tagger.name == "GN2v01" || m_tagger.name.find("GN3") != std::string::npos ){
600 asg::AcceptData acceptData (&m_acceptinfo);
601 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)");
602 return acceptData;
603 } else {
604 return accept(pT, eta, pb, pc, pu, 0.);
605 }
606}

◆ 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 608 of file BTaggingSelectionTool.cxx.

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

◆ 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 783 of file BTaggingSelectionTool.cxx.

784{
785 // Do the |eta| cut:
786 if( std::abs(eta) > m_maxEta ) {
787 return false;
788 }
789 acceptData.setCutResult( "Eta", true );
790
791 // Do the pT cut:
792 ATH_MSG_VERBOSE( "Jet pT: " << pT );
793 if( pT < m_minPt ) {
794 return false;
795 }
796 acceptData.setCutResult( "Pt", true );
797
798 return true;
799}
#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 243 of file BTaggingSelectionTool.cxx.

243 {
244
245 TString cutname = OP;
246
247 //set the name
248 tagger.name = taggerName;
249
250 if ("FlatBEff"==cutname(0,8) || "HybBEff"==cutname(0,7) ){
251 cutname = taggerName+"/"+m_jetAuthor+"/"+OP+"/cutprofile";
252 tagger.spline = dynamic_cast<TSpline3*> (m_inf->Get(cutname));
253 if (tagger.spline == nullptr){
254 ATH_MSG_ERROR( "Invalid operating point" );
255 return StatusCode::FAILURE;
256 }
257 tagger.constcut = nullptr;
258 }
259 else {
260 cutname = taggerName+"/"+m_jetAuthor+"/"+OP+"/cutvalue";
261 tagger.constcut = dynamic_cast<TVector*> (m_inf->Get(cutname));
262 if (tagger.constcut == nullptr){
263 ATH_MSG_ERROR( "Invalid operating point" );
264 return StatusCode::FAILURE;
265 }
266 tagger.spline = nullptr;
267 }
268
269 //retrieve the "fraction" used in the DL1 log likelihood from the CDI, if its not there, use the hard coded values
270 // (backwards compatibility)
272
273 double fraction_b = -1;
274 const TString basePath = taggerName + "/" + m_jetAuthor + "/" + OP;
275 TVector* fraction_b_data = dynamic_cast<TVector*>( m_inf->Get(basePath + "/fraction_b") );
276 if (fraction_b_data) {
277 fraction_b = (*fraction_b_data)(0);
278 }
279
280 TVector* fraction_c_data = dynamic_cast<TVector*>( m_inf->Get(basePath + "/fraction") );
281 if (!fraction_c_data) {
282 fraction_c_data = dynamic_cast<TVector*>( m_inf->Get(basePath + "/fraction_c") );
283 }
284 double fraction_c = -1;
285 if (fraction_c_data) {
286 fraction_c = (*fraction_c_data)(0);
287 } else{
288 if("DL1" ==taggerName){ fraction_c = 0.08; }
289 if("DL1mu" ==taggerName){ fraction_c = 0.08; }
290 if("DL1rnn" ==taggerName){ fraction_c = 0.03; }
291 else {
292 ATH_MSG_ERROR("Failed to retrieve fraction_c");
293 }
294 }
295
296 double fraction_tau = 0.;
297 double fraction_tau_cTag = 0.;
298 TVector* fraction_tau_data = dynamic_cast<TVector*>( m_inf->Get(basePath + "/fraction_tau") );
299 TVector* fraction_tau_cTag_data = dynamic_cast<TVector*>( m_inf->Get(basePath + "/fraction_tau_cTag") );
300 if (m_taggerEnum == Tagger::GN2 && !(taggerName.find("GN2v00") != std::string::npos)){
301 if( fraction_tau_data ) {
302 fraction_tau = fraction_tau_data[0](0);
303 }
304 if ( m_useCTag && !fraction_tau_cTag_data) {
305 ATH_MSG_ERROR("Runnint c-tagging WP, but failed to retrive fraction_tau_cTag");
306 return StatusCode::FAILURE;
307 }
308 fraction_tau_cTag = fraction_tau_cTag_data[0](0);
309 }
310
311 tagger.fraction_b = fraction_b;
312 tagger.fraction_c = fraction_c;
313 tagger.fraction_tau = fraction_tau;
314 tagger.fraction_tau_cTag = fraction_tau_cTag;
315
316 delete fraction_b_data;
317 delete fraction_c_data;
318 delete fraction_tau_data;
319 delete fraction_tau_cTag_data;
320 }
321 return StatusCode::SUCCESS;
322}
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 801 of file BTaggingSelectionTool.cxx.

802{
803 cutval = DBL_MAX;
804
805 // flat cut for out of range pTs
806 if (pT>m_maxRangePt)
808
810
811 if (tagger.spline != nullptr && tagger.constcut == nullptr) {
812 pT = pT/1000.0;
813 double maxsplinept = tagger.spline->GetXmax();
814 if (pT>maxsplinept){ pT = maxsplinept; }
815 cutval = tagger.spline->Eval(pT);
816 }
817
818 else if (tagger.constcut != nullptr && tagger.spline == nullptr) {
819 cutval = tagger.constcut[0](0);
820 }
821 else{
822 ATH_MSG_ERROR( "Bad cut configuration!" );
824 }
825
826
827 ATH_MSG_VERBOSE( "Cut value " << cutval );
828
829 return CorrectionCode::Ok;
830}
#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 649 of file BTaggingSelectionTool.cxx.

649 {
650 // Check if this is a jet:
651
652
653 if( p->type() != xAOD::Type::Jet ) {
654 ATH_MSG_ERROR( "accept(...) Function received a non-jet" );
655 return -1;
656 }
657
658 // Cast it to a jet:
659 const xAOD::Jet* jet = dynamic_cast< const xAOD::Jet* >( p );
660 if( ! jet ) {
661 ATH_MSG_FATAL( "accept(...) Failed to cast particle to jet" );
662 return -1;
663 }
664
665 // Let the specific function do the work:
666 return getQuantile( *jet );
667}
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 669 of file BTaggingSelectionTool.cxx.

669 {
670 double pT = jet.pt();
671 double eta = std::abs( jet.eta() );
672 int quantile = -1;
673
674 if (m_continuous2D){
675 double tag_weight_b(-100.);
676 double tag_weight_c(-100.);
677 if ( (getTaggerWeight(jet, tag_weight_b, false) == CP::CorrectionCode::Error) ||
678 (getTaggerWeight(jet, tag_weight_c, true ) == CP::CorrectionCode::Error) ){
679 ATH_MSG_WARNING("getQuantile: Failed to retrieve tag weight for Continuous2D!");
680 return -1;
681 }
682 quantile = getQuantile(pT, eta, tag_weight_b, tag_weight_c );
683 }
684 else{
685 // Retrieve the tagger weight which was assigned to the jet
686 double tag_weight(-100.);
687 if (getTaggerWeight(jet, tag_weight, m_useCTag)==CorrectionCode::Error){
688 ATH_MSG_WARNING("getQuantile: Failed to retrieve "+m_taggerName+" weight!");
689 return -1;
690 }
691 ATH_MSG_VERBOSE( m_taggerName << " " << tag_weight);
692 quantile = getQuantile(pT, eta, tag_weight);
693 }
694 return quantile;
695}
#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 698 of file BTaggingSelectionTool.cxx.

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

◆ 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 739 of file BTaggingSelectionTool.cxx.

740{
750
751 //More details here: https://indico.cern.ch/event/1116952/#4-mr49953-implements-the-conti
752
753 ATH_MSG_DEBUG("inside getQuantile 2D " <<pT <<" " <<eta <<" " <<tag_weight_b <<" " <<tag_weight_c);
754 int bin_index(-1);
755
756 asg::AcceptData acceptData (&m_acceptinfo);
757 if (! checkRange(pT, eta, acceptData)) return bin_index;
758
759 int ncuts = m_tagger.cuts2D->GetNrows();
760 ATH_MSG_VERBOSE("ncuts: " <<ncuts);
761
762 //loop over all the cuts
763 for(int i = 0; i < ncuts ; i++){
764 double c_cut_low = m_tagger.get2DCutValue(i,0);
765 double c_cut_hig = m_tagger.get2DCutValue(i,1);
766 double b_cut_low = m_tagger.get2DCutValue(i,2);
767 double b_cut_hig = m_tagger.get2DCutValue(i,3);
768
769 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);
770 if (tag_weight_c > c_cut_low &&
771 tag_weight_c <= c_cut_hig &&
772 tag_weight_b > b_cut_low &&
773 tag_weight_b <= b_cut_hig){
774 bin_index = i;
775 break;
776 }
777 }
778
779 ATH_MSG_VERBOSE("bin_index " <<bin_index);
780 return bin_index;
781}

◆ getTaggerWeight() [1/5]

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

Implements IBTaggingSelectionTool.

Definition at line 324 of file BTaggingSelectionTool.cxx.

324 {
325 return getTaggerWeight(jet, tagweight, m_useCTag);
326}

◆ getTaggerWeight() [2/5]

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

Implements IBTaggingSelectionTool.

Definition at line 328 of file BTaggingSelectionTool.cxx.

328 {
329
330 std::string taggerName = m_tagger.name;
331 // following taggerName change is needed given different name is used for GN2v00 in derivation and in CDI
332 if (taggerName == "GN2v00LegacyWP" || taggerName == "GN2v00NewAliasWP"){
333 taggerName = "GN2v00";
334 }
335
336 tagweight = -100.;
337
338 if(!m_continuous2D && (getCTagW != m_useCTag) ){
339 ATH_MSG_ERROR("Difference between initialisation and getTaggerWeight request! useCTagging property set to " <<m_useCTag <<" while getTaggerWeight use c-tag is set to " <<getCTagW <<".");
341 }
342
344
346
347 if ((!btag) || (!btag->MVx_discriminant(taggerName, tagweight))){
349 ATH_MSG_ERROR("Failed to retrieve "+taggerName+" weight!");
351 }else{
352 ATH_MSG_WARNING("Failed to retrieve "+taggerName+" weight!");
353 return CorrectionCode::Ok;
354 }
355 }
356 ATH_MSG_VERBOSE( taggerName << " " << tagweight );
357 return CorrectionCode::Ok;
358 } //MV2
359 else{
360 //DL1r or DL1 or GN2v01
361 double tagger_pb(-10.);
362 double tagger_pc(-10.);
363 double tagger_pu(-10.);
364 double tagger_ptau(0.);
365
366 const SG::AuxElement* btagInfo = &jet;
369
370 if(!btagInfo){
372 ATH_MSG_ERROR("Failed to retrieve "+taggerName+" weight!");
374 }else{
375 ATH_MSG_WARNING("Failed to retrieve "+taggerName+" weight!");
376 return CorrectionCode::Ok;
377 }
378 }
379
380 tagger_pb = m_accessor_pb(*btagInfo);
381 tagger_pc = m_accessor_pc(*btagInfo);
382 tagger_pu = m_accessor_pu(*btagInfo);
384 tagger_ptau = m_accessor_ptau(*btagInfo);
385 }
386
387 return getTaggerWeight(tagger_pb, tagger_pc, tagger_pu, tagweight, getCTagW, tagger_ptau);
388
389 }
390
391 //if we got here the tagger name is not configured properly
392 ATH_MSG_ERROR("BTaggingSelectionTool doesn't support tagger: "+m_taggerName);
394
395}
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 397 of file BTaggingSelectionTool.cxx.

397 {
398 if (m_tagger.name == "GN2v01"){
399 ATH_MSG_ERROR("For GN2v01 tagger, there is a new tau claass in the NN output. Please update your getTaggerWeight() to getTaggerWeight( double pb, double pc, double pu, double & tagweight, double ptau)");
401 } else {
402 return getTaggerWeight(pb, pc, pu, tagweight, m_useCTag, 0.);
403 }
404}

◆ getTaggerWeight() [4/5]

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

Implements IBTaggingSelectionTool.

Definition at line 406 of file BTaggingSelectionTool.cxx.

406 {
407 return getTaggerWeight(pb, pc, pu, tagweight, m_useCTag, ptau);
408}

◆ 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 410 of file BTaggingSelectionTool.cxx.

410 {
411
412 std::string taggerName = m_tagger.name;
413
414 if(!m_continuous2D && (getCTagW != m_useCTag) ){
415 ATH_MSG_ERROR("Difference between initialisation and getTaggerWeight request! useCTagging property set to " <<m_useCTag <<" while getTaggerWeight use c-tag is set to " <<getCTagW <<".");
417 }
418
419 tagweight = -100.;
421
422 bool valid_input = (!std::isnan(pu) && pb>=0 && pc>=0 && pu>=0 && ptau>=0);
423
424 if (!valid_input){
426 ATH_MSG_ERROR("Invalid inputs for "+taggerName+" pb " << pb << " pc " << pc << " pu " << pu << " ptau " << ptau << " ");
428 }else{
429 ATH_MSG_WARNING("Invalid inputs for "+taggerName+" pb " << pb << " pc " << pc << " pu " << pu << " ptau " << ptau << " ");
430 return CorrectionCode::Ok;
431 }
432 }
433
434 if(getCTagW){
435 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) );
436 }
437 else{
438 tagweight = log(pb / (m_tagger.fraction_c * pc + (1. - m_tagger.fraction_c - m_tagger.fraction_tau) * pu + m_tagger.fraction_tau * ptau) );
439 }
440
441 ATH_MSG_VERBOSE( "pb " << pb );
442 ATH_MSG_VERBOSE( "pc " << pc );
443 ATH_MSG_VERBOSE( "pu " << pu );
444 ATH_MSG_VERBOSE( "ptau" << ptau );
445 ATH_MSG_VERBOSE( "tagweight " << tagweight );
446
447 return CorrectionCode::Ok;
448 }
449
450 //if we got here the tagger name is not configured properly
451 ATH_MSG_ERROR("this call to getTaggerWeight only works for DL1/GNx taggers");
453
454}

◆ 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 50 of file BTaggingSelectionTool.cxx.

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

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

◆ split()

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

Definition at line 832 of file BTaggingSelectionTool.cxx.

832 {
833 std::vector<std::string> v;
834 std::istringstream buf(input);
835 for(std::string token; std::getline(buf, token, delimiter); )
836 v.push_back(token);
837 return v;
838}
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 >, AthCheckedComponent<::AthAlgTool >, and DerivationFramework::CfAthAlgTool.

◆ 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 76 of file BTaggingSelectionTool.h.

◆ m_accessor_pb

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

Definition at line 97 of file BTaggingSelectionTool.h.

◆ m_accessor_pc

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

Definition at line 98 of file BTaggingSelectionTool.h.

◆ m_accessor_ptau

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

Definition at line 100 of file BTaggingSelectionTool.h.

◆ m_accessor_pu

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

Definition at line 99 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 86 of file BTaggingSelectionTool.h.

86{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 95 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 82 of file BTaggingSelectionTool.h.

82{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 88 of file BTaggingSelectionTool.h.

88{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 94 of file BTaggingSelectionTool.h.

94{};

◆ 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 85 of file BTaggingSelectionTool.h.

85{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 79 of file BTaggingSelectionTool.h.

79{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 80 of file BTaggingSelectionTool.h.

80{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 78 of file BTaggingSelectionTool.h.

78{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 84 of file BTaggingSelectionTool.h.

84{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 92 of file BTaggingSelectionTool.h.

92{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 121 of file BTaggingSelectionTool.h.

◆ m_taggerEnum

Tagger BTaggingSelectionTool::m_taggerEnum {UNKNOWN}
private

Definition at line 124 of file BTaggingSelectionTool.h.

124{UNKNOWN};

◆ m_taggerName

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

Definition at line 83 of file BTaggingSelectionTool.h.

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

◆ 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 90 of file BTaggingSelectionTool.h.

90{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: