Loading [MathJax]/extensions/tex2jax.js
 |
ATLAS Offline Software
|
Implements Hypo selection on triggering displaced vertex.
More...
#include <TrigHitDVHypoAlg.h>
|
| TrigHitDVHypoAlg (const std::string &name, ISvcLocator *pSvcLocator) |
|
virtual StatusCode | initialize () override |
|
virtual StatusCode | execute (const EventContext &context) const override |
|
virtual StatusCode | sysInitialize () override |
| initialise this base class More...
|
|
virtual bool | isClonable () const override |
| Specify if the algorithm is clonable. More...
|
|
virtual unsigned int | cardinality () const override |
| Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant. More...
|
|
virtual StatusCode | sysExecute (const EventContext &ctx) override |
| Execute an algorithm. More...
|
|
virtual const DataObjIDColl & | extraOutputDeps () const override |
| Return the list of extra output dependencies. More...
|
|
virtual bool | filterPassed (const EventContext &ctx) const |
|
virtual void | setFilterPassed (bool state, const EventContext &ctx) const |
|
ServiceHandle< StoreGateSvc > & | evtStore () |
| The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc . More...
|
|
const ServiceHandle< StoreGateSvc > & | evtStore () const |
| The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc . More...
|
|
const ServiceHandle< StoreGateSvc > & | detStore () const |
| The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc . More...
|
|
virtual StatusCode | sysStart () override |
| Handle START transition. More...
|
|
virtual std::vector< Gaudi::DataHandle * > | inputHandles () const override |
| Return this algorithm's input handles. More...
|
|
virtual std::vector< Gaudi::DataHandle * > | outputHandles () const override |
| Return this algorithm's output handles. More...
|
|
Gaudi::Details::PropertyBase & | declareProperty (Gaudi::Property< T > &t) |
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, SG::VarHandleKey &hndl, const std::string &doc, const SG::VarHandleKeyType &) |
| Declare a new Gaudi property. More...
|
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, SG::VarHandleBase &hndl, const std::string &doc, const SG::VarHandleType &) |
| Declare a new Gaudi property. More...
|
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, SG::VarHandleKeyArray &hndArr, const std::string &doc, const SG::VarHandleKeyArrayType &) |
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, T &property, const std::string &doc, const SG::NotHandleType &) |
| Declare a new Gaudi property. More...
|
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, T &property, const std::string &doc="none") |
| Declare a new Gaudi property. More...
|
|
void | updateVHKA (Gaudi::Details::PropertyBase &) |
|
MsgStream & | msg () const |
|
MsgStream & | msg (const MSG::Level lvl) const |
|
bool | msgLvl (const MSG::Level lvl) const |
|
|
StatusCode | doMonitor (const xAOD::TrigCompositeContainer *) const |
|
float | deltaR2 (float, float, float, float) const |
|
int | getSPLayer (int, float) const |
|
StatusCode | findSPSeeds (const EventContext &, const std::vector< HitDVSpacePoint > &, std::vector< float > &, std::vector< float > &) const |
|
StatusCode | findJetSeeds (const xAOD::JetContainer *, const float, const float, std::vector< float > &, std::vector< float > &, std::vector< float > &) const |
|
StatusCode | selectSeedsNearby (const std::vector< HitDVSeed > &hitDVSeedsContainer, std::vector< float > &jetSeeds_eta, std::vector< float > &jetSeeds_phi, std::vector< float > &jetSeeds_pt) const |
|
StatusCode | calculateBDT (const std::vector< HitDVSpacePoint > &, const std::vector< HitDVTrk > &, const std::vector< float > &, const std::vector< float > &, const std::vector< float > &, const float &, const int, xAOD::TrigCompositeContainer *, int &) const |
|
StatusCode | findSPSeeds (const EventContext &ctx, const std::vector< float > &v_sp_eta, const std::vector< float > &v_sp_phi, const std::vector< int > &v_sp_layer, const std::vector< int > &v_sp_usedTrkId, std::vector< float > &seeds_eta, std::vector< float > &seeds_phi) const |
|
StatusCode | findHitDV (const EventContext &ctx, const std::vector< TrigSiSpacePointBase > &convertedSpacePoints, const DataVector< Trk::Track > &tracks, std::vector< HitDVSeed > &hitDVSeedsContainer, std::vector< HitDVTrk > &hitDVTrksContainer, std::vector< HitDVSpacePoint > &hitDVSPContainer) const |
|
StatusCode | printDebugInformation (SG::WriteHandle< TrigCompositeUtils::DecisionContainer > &outputHandle, MSG::Level lvl) const |
| Common base function to print information on chains passed by objects considered in the hypo. More...
|
|
Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleKeyType &) |
| specialization for handling Gaudi::Property<SG::VarHandleKey> More...
|
|
Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleKeyArrayType &) |
| specialization for handling Gaudi::Property<SG::VarHandleKeyArray> More...
|
|
Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleType &) |
| specialization for handling Gaudi::Property<SG::VarHandleBase> More...
|
|
Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T > &t, const SG::NotHandleType &) |
| specialization for handling everything that's not a Gaudi::Property<SG::VarHandleKey> or a <SG::VarHandleKeyArray> More...
|
|
|
ToolHandle< ITrigSpacePointConversionTool > | m_spacePointTool {this, "SpacePointProviderTool", "TrigSpacePointConversionTool"} |
|
ToolHandleArray< TrigHitDVHypoTool > | m_hypoTools {this, "HypoTools", {}, "Tools to perform selection"} |
|
SG::ReadHandleKey< xAOD::JetContainer > | m_jetsKey {this, "Jets", "HLT_AntiKt4EMTopoJets_subjesIS", ""} |
|
SG::WriteHandleKey< xAOD::TrigCompositeContainer > | m_hitDVKey {this, "HitDV", "HLT_HitDV", ""} |
|
SG::ReadHandleKey< TrackCollection > | m_tracksKey {this, "HitDVTracks", "HLT_IDTrkTrack_FS_FTF", ""} |
|
ToolHandle< ILumiBlockMuTool > | m_lumiBlockMuTool |
|
SG::ReadCondHandleKey< LuminosityCondData > | m_lumiDataKey {this, "LuminosityCondDataKey", "LuminosityCondData", ""} |
|
Gaudi::Property< bool > | m_isMC {this, "isMC", false, "Real data or MC"} |
|
Gaudi::Property< float > | m_jetSeed_ptMin {this, "jetSeed_ptMin", 50.0, "Minimum pT for jet seed"} |
|
Gaudi::Property< float > | m_jetSeed_etaMax {this, "jetSeed_etaMin", 2.0, "Maximum eta for jet seed"} |
|
Gaudi::Property< std::string > | m_hitDVLinkName {this, "hitDVLinkName", "HitDVSeedLink", "Name of the link to HitDVContainer. Used by ViewCreatorROITool."} |
|
ToolHandle< GenericMonitoringTool > | m_monTool { this, "MonTool", "", "Monitoring tool" } |
|
std::unique_ptr< MVAUtils::BDT > | m_bdt_eta [2] |
|
int | m_tools_lowest_jetEt = 1000 |
|
int | m_tools_loosest_wp = 0 |
|
bool | m_useBeamSpot = true |
|
bool | m_doHitDV_Seeding = true |
|
SG::ReadHandleKey< xAOD::jFexSRJetRoIContainer > | m_jetRoiCollectionKey {this, "jFexSRJetRoI", "", ""} |
|
SG::ReadCondHandleKey< InDet::BeamSpotData > | m_beamSpotKey { this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot" } |
|
SG::ReadHandleKey< TrigCompositeUtils::DecisionContainer > | m_input { this, "HypoInputDecisions", "UNSPECIFIED_INPUT", "Input Decision (implicit)" } |
| input decisions More...
|
|
SG::WriteHandleKey< TrigCompositeUtils::DecisionContainer > | m_output { this, "HypoOutputDecisions", "UNSPECIFIED_OUTPUT", "Ouput Decision" } |
| output decisions More...
|
|
Gaudi::Property< bool > | m_runtimeValidation { this, "RuntimeValidation", false, "Enable detailed runtime validation of HypoAlg output, and upstream Decisions." } |
| Enabling of detailed validation checks for use during development. More...
|
|
DataObjIDColl | m_extendedExtraObjects |
| Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks. More...
|
|
StoreGateSvc_t | m_evtStore |
| Pointer to StoreGate (event store by default) More...
|
|
StoreGateSvc_t | m_detStore |
| Pointer to StoreGate (detector store by default) More...
|
|
std::vector< SG::VarHandleKeyArray * > | m_vhka |
|
bool | m_varHandleArraysDeclared |
|
|
|
enum | LogicalFlowCheckMode { kRequireOne,
kRequireAll
} |
|
static StatusCode | validateHasLinks (const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg) |
| Ensure all Decisions have the named ElementLink graph edges which they are required to by spec. More...
|
|
static StatusCode | validateLogicalFlow (const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg, const LogicalFlowCheckMode mode) |
| Ensure that all DecisionIDs have propagated correctly from their parent. More...
|
|
static StatusCode | validateDuplicatedDecisionID (const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg) |
| Ensure that no space is being wasted by duplicated DecisionIDs in any Decision objects. More...
|
|
static StatusCode | validateDecisionIDs (const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg) |
| Ensure that all present IDs correspond to configured chains. More...
|
|
static StatusCode | validateParentLinking (const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg, bool runTwoConversion) |
| Ensure that the Decision has at least one valid parent, unless it is a initial Decision from the HLTSeeding. More...
|
|
static StatusCode | recursiveValidateGraph (const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg, bool onlyValidateOneStep, bool runTwoConversion, size_t callDepth, std::set< const TrigCompositeUtils::Decision * > &fullyExploredFrom) |
| Execute all checks on one node in the graph, d, then recursive call self on all parent nodes up to L1. More...
|
|
static void | printBangs (MsgStream &msg) |
| Print header line. More...
|
|
static void | printErrorHeader (const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg) |
| A problem was found, print common output data. More...
|
|
Implements Hypo selection on triggering displaced vertex.
- Author
- Kunihiro Nagano kunih.nosp@m.iro..nosp@m.nagan.nosp@m.o@ce.nosp@m.rn.ch - KEK
Definition at line 63 of file TrigHitDVHypoAlg.h.
◆ SeedType
◆ StoreGateSvc_t
◆ LogicalFlowCheckMode
Enumerator |
---|
kRequireOne | Require all DecisionIDs to be present in at least one of my parent Decision objects.
|
kRequireAll | |
Definition at line 52 of file HypoBase.h.
◆ TrigHitDVHypoAlg()
TrigHitDVHypoAlg::TrigHitDVHypoAlg |
( |
const std::string & |
name, |
|
|
ISvcLocator * |
pSvcLocator |
|
) |
| |
◆ calculateBDT()
Definition at line 555 of file TrigHitDVHypoAlg.cxx.
562 if( seeds_eta.size() != seeds_phi.size() )
return StatusCode::SUCCESS;
565 for(
unsigned int iseed=0; iseed<seeds_eta.size(); iseed++) {
567 float seed_eta = seeds_eta[iseed];
568 float seed_phi = seeds_phi[iseed];
570 ATH_MSG_VERBOSE(
"+++++ seed eta: " << seed_eta <<
", phi:" << seed_phi <<
" +++++");
574 const float DR_SQUARED_TO_REF_CUT = 0.16;
577 int n_sp_injet_usedByTrk = 0;
579 int v_n_sp_injet_usedByTrk[
N_LAYER];
580 for(
int i=0;
i<
N_LAYER;
i++) { v_n_sp_injet[
i]=0; v_n_sp_injet_usedByTrk[
i]=0; }
582 for (
const auto & spData : spsContainer ) {
584 float sp_eta = spData.eta;
585 float sp_phi = spData.phi;
586 float dR2 =
deltaR2(sp_eta,sp_phi,seed_eta,seed_phi);
587 if( dR2 > DR_SQUARED_TO_REF_CUT )
continue;
590 int sp_layer = (
int)spData.layer;
591 int sp_trkid = (
int)spData.usedTrkId;
592 bool isUsedByTrk = (sp_trkid != -1);
598 v_n_sp_injet[ilayer]++;
600 n_sp_injet_usedByTrk++;
601 v_n_sp_injet_usedByTrk[ilayer]++;
605 ATH_MSG_VERBOSE(
"nr of SPs in jet: usedByTrk / all = " << n_sp_injet_usedByTrk <<
" / " << n_sp_injet);
609 if( v_n_sp_injet[
i] > 0 )
frac = 1.0 -
static_cast<float>(v_n_sp_injet_usedByTrk[
i]) /
static_cast<float>(v_n_sp_injet[
i]);
610 v_ly_sp_frac[
i] =
frac;
611 ATH_MSG_VERBOSE(
"Layer " <<
i <<
": frac=" << v_ly_sp_frac[
i] <<
", n used / all = " << v_n_sp_injet_usedByTrk[
i] <<
" / " << v_n_sp_injet[
i]);
615 const float TRK_PT_GEV_CUT = 2.0;
617 unsigned int n_qtrk_injet = 0;
618 for (
const auto& trk : trksContainer ) {
619 float trk_ptGeV = trk.pt;
621 if( trk_ptGeV < TRK_PT_GEV_CUT )
continue;
622 float dR2 =
deltaR2(trk.eta,trk.phi,seed_eta,seed_phi);
623 if( dR2 > DR_SQUARED_TO_REF_CUT )
continue;
626 ATH_MSG_DEBUG(
"nr of all / quality tracks matched = " << trksContainer.size() <<
" / " << n_qtrk_injet);
629 bool isSeedOutOfRange =
false;
630 if( n_qtrk_injet == 0 ) {
631 isSeedOutOfRange =
true;
633 if( std::fabs(v_ly_sp_frac[
i]) > 1
e-3 ) {
634 isSeedOutOfRange =
false;
break;
638 float bdt_score = -2.0;
639 if( ! isSeedOutOfRange ) {
640 const std::vector<float> input_values = {
641 static_cast<float>(n_qtrk_injet),
651 if ( std::abs(seed_eta) < 1 ) {
652 bdt_score =
m_bdt_eta[0]->GetClassification(input_values);
653 }
else if ( std::abs(seed_eta) < 2 ) {
654 bdt_score =
m_bdt_eta[1]->GetClassification(input_values);
659 if( bdt_score < cutBDTthreshold )
continue;
667 dv->makePrivateStore();
671 if ( seed_type == SeedType::HLTJet ) seed_pt = seeds_pt[iseed];
672 dv->setDetail<
float>(
"hitDV_seed_pt", seed_pt);
673 dv->setDetail<
float>(
"hitDV_seed_eta", seed_eta);
674 dv->setDetail<
float>(
"hitDV_seed_phi", seed_phi);
675 dv->setDetail<
int> (
"hitDV_seed_type", seed_type);
676 dv->setDetail<
int> (
"hitDV_n_track_qual", n_qtrk_injet);
677 dv->setDetail<
float>(
"hitDV_ly0_sp_frac", v_ly_sp_frac[0]);
678 dv->setDetail<
float>(
"hitDV_ly1_sp_frac", v_ly_sp_frac[1]);
679 dv->setDetail<
float>(
"hitDV_ly2_sp_frac", v_ly_sp_frac[2]);
680 dv->setDetail<
float>(
"hitDV_ly3_sp_frac", v_ly_sp_frac[3]);
681 dv->setDetail<
float>(
"hitDV_ly4_sp_frac", v_ly_sp_frac[4]);
682 dv->setDetail<
float>(
"hitDV_ly5_sp_frac", v_ly_sp_frac[5]);
683 dv->setDetail<
float>(
"hitDV_ly6_sp_frac", v_ly_sp_frac[6]);
684 dv->setDetail<
float>(
"hitDV_ly7_sp_frac", v_ly_sp_frac[7]);
685 dv->setDetail<
float>(
"hitDV_bdt_score", bdt_score);
692 return StatusCode::SUCCESS;
◆ cardinality()
Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.
Override this to return 0 for reentrant algorithms.
Override this to return 0 for reentrant algorithms.
Definition at line 75 of file AthCommonReentrantAlgorithm.cxx.
◆ decisionInput()
methods for derived classes to access handles of the base class input other read/write handles may be implemented by derived classes
Definition at line 16 of file HypoBase.cxx.
◆ decisionOutput()
methods for derived classes to access handles of the base class output other read/write handles may be implemented by derived classes
Definition at line 20 of file HypoBase.cxx.
◆ declareGaudiProperty() [1/4]
specialization for handling Gaudi::Property<SG::VarHandleKeyArray>
Definition at line 170 of file AthCommonDataStore.h.
175 hndl.documentation());
◆ declareGaudiProperty() [2/4]
specialization for handling Gaudi::Property<SG::VarHandleKey>
Definition at line 156 of file AthCommonDataStore.h.
161 hndl.documentation());
◆ declareGaudiProperty() [3/4]
specialization for handling Gaudi::Property<SG::VarHandleBase>
Definition at line 184 of file AthCommonDataStore.h.
189 hndl.documentation());
◆ declareGaudiProperty() [4/4]
◆ declareProperty() [1/6]
Declare a new Gaudi property.
- Parameters
-
name | Name of the property. |
hndl | Object holding the property value. |
doc | Documentation string for the property. |
This is the version for types that derive from SG::VarHandleBase
. The property value object is put on the input and output lists as appropriate; then we forward to the base class.
Definition at line 245 of file AthCommonDataStore.h.
250 this->declare(hndl.
vhKey());
251 hndl.
vhKey().setOwner(
this);
◆ declareProperty() [2/6]
Declare a new Gaudi property.
- Parameters
-
name | Name of the property. |
hndl | Object holding the property value. |
doc | Documentation string for the property. |
This is the version for types that derive from SG::VarHandleKey
. The property value object is put on the input and output lists as appropriate; then we forward to the base class.
Definition at line 221 of file AthCommonDataStore.h.
◆ declareProperty() [3/6]
◆ declareProperty() [4/6]
Declare a new Gaudi property.
- Parameters
-
name | Name of the property. |
property | Object holding the property value. |
doc | Documentation string for the property. |
This is the generic version, for types that do not derive from SG::VarHandleKey
. It just forwards to the base class version of declareProperty
.
Definition at line 333 of file AthCommonDataStore.h.
◆ declareProperty() [5/6]
Declare a new Gaudi property.
- Parameters
-
name | Name of the property. |
property | Object holding the property value. |
doc | Documentation string for the property. |
This dispatches to either the generic declareProperty
or the one for VarHandle/Key/KeyArray.
Definition at line 352 of file AthCommonDataStore.h.
◆ declareProperty() [6/6]
◆ deltaR2()
float TrigHitDVHypoAlg::deltaR2 |
( |
float |
eta_1, |
|
|
float |
phi_1, |
|
|
float |
eta_2, |
|
|
float |
phi_2 |
|
) |
| const |
|
private |
◆ detStore()
◆ doMonitor()
Definition at line 456 of file TrigHitDVHypoAlg.cxx.
458 std::vector<float> mnt_eta1_ly0_spfr;
459 std::vector<float> mnt_eta1_ly1_spfr;
460 std::vector<float> mnt_eta1_ly2_spfr;
461 std::vector<float> mnt_eta1_ly3_spfr;
462 std::vector<float> mnt_eta1_ly4_spfr;
463 std::vector<float> mnt_eta1_ly5_spfr;
464 std::vector<float> mnt_eta1_ly6_spfr;
465 std::vector<float> mnt_eta1_ly7_spfr;
466 std::vector<int> mnt_eta1_n_qtrk;
467 std::vector<float> mnt_eta1_bdtscore;
468 std::vector<float> mnt_1eta2_ly0_spfr;
469 std::vector<float> mnt_1eta2_ly1_spfr;
470 std::vector<float> mnt_1eta2_ly2_spfr;
471 std::vector<float> mnt_1eta2_ly3_spfr;
472 std::vector<float> mnt_1eta2_ly4_spfr;
473 std::vector<float> mnt_1eta2_ly5_spfr;
474 std::vector<float> mnt_1eta2_ly6_spfr;
475 std::vector<float> mnt_1eta2_ly7_spfr;
476 std::vector<int> mnt_1eta2_n_qtrk;
477 std::vector<float> mnt_1eta2_bdtscore;
499 mon_eta1_ly0_spfr, mon_eta1_ly1_spfr, mon_eta1_ly2_spfr, mon_eta1_ly3_spfr,
500 mon_eta1_ly4_spfr, mon_eta1_ly5_spfr, mon_eta1_ly6_spfr, mon_eta1_ly7_spfr,
501 mon_eta1_n_qtrk, mon_eta1_bdtscore,
502 mon_1eta2_ly0_spfr, mon_1eta2_ly1_spfr, mon_1eta2_ly2_spfr, mon_1eta2_ly3_spfr,
503 mon_1eta2_ly4_spfr, mon_1eta2_ly5_spfr, mon_1eta2_ly6_spfr, mon_1eta2_ly7_spfr,
504 mon_1eta2_n_qtrk, mon_1eta2_bdtscore);
507 for (
auto dv : *dvContainer ) {
508 int seed_type =
dv->getDetail<
int> (
"hitDV_seed_type");
510 if( seed_type == SeedType::SP )
continue;
511 float seed_eta =
dv->getDetail<
float>(
"hitDV_seed_eta");
512 int n_track_qual=
dv->getDetail<
int> (
"hitDV_n_track_qual");
513 float bdt_score =
dv->getDetail<
float>(
"hitDV_bdt_score");
514 float ly0_sp_frac =
dv->getDetail<
float>(
"hitDV_ly0_sp_frac");
515 float ly1_sp_frac =
dv->getDetail<
float>(
"hitDV_ly1_sp_frac");
516 float ly2_sp_frac =
dv->getDetail<
float>(
"hitDV_ly2_sp_frac");
517 float ly3_sp_frac =
dv->getDetail<
float>(
"hitDV_ly3_sp_frac");
518 float ly4_sp_frac =
dv->getDetail<
float>(
"hitDV_ly4_sp_frac");
519 float ly5_sp_frac =
dv->getDetail<
float>(
"hitDV_ly5_sp_frac");
520 float ly6_sp_frac =
dv->getDetail<
float>(
"hitDV_ly6_sp_frac");
521 float ly7_sp_frac =
dv->getDetail<
float>(
"hitDV_ly7_sp_frac");
522 if( std::abs(seed_eta) < 1.0 ) {
523 mnt_eta1_ly0_spfr.push_back(ly0_sp_frac);
524 mnt_eta1_ly1_spfr.push_back(ly1_sp_frac);
525 mnt_eta1_ly2_spfr.push_back(ly2_sp_frac);
526 mnt_eta1_ly3_spfr.push_back(ly3_sp_frac);
527 mnt_eta1_ly4_spfr.push_back(ly4_sp_frac);
528 mnt_eta1_ly5_spfr.push_back(ly5_sp_frac);
529 mnt_eta1_ly6_spfr.push_back(ly6_sp_frac);
530 mnt_eta1_ly7_spfr.push_back(ly7_sp_frac);
531 mnt_eta1_n_qtrk.push_back(n_track_qual);
532 mnt_eta1_bdtscore.push_back(bdt_score);
534 else if( std::abs(seed_eta) < 2.0 ) {
535 mnt_1eta2_ly0_spfr.push_back(ly0_sp_frac);
536 mnt_1eta2_ly1_spfr.push_back(ly1_sp_frac);
537 mnt_1eta2_ly2_spfr.push_back(ly2_sp_frac);
538 mnt_1eta2_ly3_spfr.push_back(ly3_sp_frac);
539 mnt_1eta2_ly4_spfr.push_back(ly4_sp_frac);
540 mnt_1eta2_ly5_spfr.push_back(ly5_sp_frac);
541 mnt_1eta2_ly6_spfr.push_back(ly6_sp_frac);
542 mnt_1eta2_ly7_spfr.push_back(ly7_sp_frac);
543 mnt_1eta2_n_qtrk.push_back(n_track_qual);
544 mnt_1eta2_bdtscore.push_back(bdt_score);
549 return StatusCode::SUCCESS;
◆ evtStore() [1/2]
◆ evtStore() [2/2]
◆ execute()
StatusCode TrigHitDVHypoAlg::execute |
( |
const EventContext & |
context | ) |
const |
|
overridevirtual |
Definition at line 117 of file TrigHitDVHypoAlg.cxx.
121 std::vector<TrigSiSpacePointBase> convertedSpacePoints;
122 convertedSpacePoints.reserve(5000);
135 auto monitorIt =
Monitored::Group(
m_monTool, mon_n_dvtrks, mon_n_dvsps, mon_n_jetseeds, mon_n_jetseedsdel, mon_n_spseeds, mon_n_spseedsdel, mon_average_mu );
140 ATH_CHECK( previousDecisionsHandle.isValid() );
142 ATH_MSG_DEBUG(
"Running with " << previousDecisionsHandle->size() <<
" previous decisions" );
143 if( previousDecisionsHandle->size()!=1 ) {
144 ATH_MSG_ERROR(
"Previous decision handle size is not 1. It is" << previousDecisionsHandle->size() );
145 return StatusCode::FAILURE;
147 const Decision * previousDecision = previousDecisionsHandle->at(0);
152 for(
auto decisionID: previousDecisionIDs) {
ATH_MSG_DEBUG(
" " << decisionID ); }
157 auto outputDecisions = outputHandle.
ptr();
167 if( jetsContainer ==
nullptr ) {
169 return StatusCode::FAILURE;
171 bool isJetEtPassToolsCut =
false;
172 float jetEtaToolsCut = 2.0;
176 float jet_eta =
static_cast<float>(
jet->eta());
178 isJetEtPassToolsCut =
true;
186 std::vector<HitDVSeed> hitDVSeedsContainer;
187 std::vector<HitDVTrk> hitDVTrksContainer;
188 std::vector<HitDVSpacePoint> hitDVSPsContainer;
191 ATH_CHECK(
findHitDV(context, convertedSpacePoints, *tracks, hitDVSeedsContainer, hitDVTrksContainer, hitDVSPsContainer) );
193 mon_n_dvtrks = hitDVTrksContainer.size();
194 mon_n_dvsps = hitDVSPsContainer.size();
195 const unsigned int N_MAX_SP_STORED = 100000;
196 bool isSPOverflow =
false;
197 if( hitDVSPsContainer.size() >= N_MAX_SP_STORED ) isSPOverflow =
true;
204 averageMu =
static_cast<float>(
m_lumiBlockMuTool->averageInteractionsPerCrossing(context));
210 averageMu = lcd.cptr()->lbAverageInteractionsPerCrossing();
213 mon_average_mu = averageMu;
216 std::vector<float> jetSeeds_pt;
217 std::vector<float> jetSeeds_eta;
218 std::vector<float> jetSeeds_phi;
220 int n_alljetseeds = jetSeeds_eta.size();
222 mon_n_jetseeds = jetSeeds_eta.size();
223 mon_n_jetseedsdel = n_alljetseeds - jetSeeds_eta.size();
226 std::vector<float> spSeeds_eta;
227 std::vector<float> spSeeds_phi;
228 std::vector<float> void_pt;
229 int n_allspseeds = 0;
232 n_allspseeds = spSeeds_eta.size();
234 mon_n_spseeds = spSeeds_eta.size();
235 mon_n_spseedsdel = n_allspseeds - spSeeds_eta.size();
239 mon_n_spseedsdel = 0;
243 auto hitDVContainer = std::make_unique<xAOD::TrigCompositeContainer>();
244 auto hitDVContainerAux = std::make_unique<xAOD::TrigCompositeAuxContainer>();
245 hitDVContainer->setStore(hitDVContainerAux.get());
248 std::vector<TrigHitDVHypoTool::HitDVHypoInfo> hitDVHypoInputs;
249 std::unordered_map<Decision*, size_t> mapDecIdx;
252 if( isJetEtPassToolsCut ) {
253 const float preselBDTthreshold = -0.6;
255 int n_passed_jet = 0;
256 int seed_type = SeedType::HLTJet;
257 ATH_CHECK(
calculateBDT(hitDVSPsContainer, hitDVTrksContainer, jetSeeds_pt, jetSeeds_eta, jetSeeds_phi, preselBDTthreshold, seed_type, dvContainer, n_passed_jet) );
261 seed_type = SeedType::SP;
262 ATH_CHECK(
calculateBDT(hitDVSPsContainer, hitDVTrksContainer, void_pt, spSeeds_eta, spSeeds_phi, preselBDTthreshold, seed_type, dvContainer, n_passed_sp) );
265 ATH_MSG_DEBUG(
"nr of dv container / jet-seeded / sp-seed candidates = " << dvContainer->
size() <<
" / " << n_passed_jet <<
" / " << n_passed_sp );
268 for (
auto dv : *dvContainer ) {
270 mapDecIdx.emplace( newDecision,
dv->index() );
272 hitDVHypoInputs.push_back( hypoInfo );
287 ATH_CHECK( hitDVHandle.record( std::move( hitDVContainer ), std::move( hitDVContainerAux ) ) );
291 while(
it != outputDecisions->end()) {
295 it = outputDecisions->erase(
it);
301 size_t idx = mapDecIdx.at(*
it);
317 return StatusCode::SUCCESS;
◆ extraDeps_update_handler()
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
◆ extraOutputDeps()
Return the list of extra output dependencies.
This list is extended to include symlinks implied by inheritance relations.
Definition at line 94 of file AthCommonReentrantAlgorithm.cxx.
◆ filterPassed()
◆ findHitDV()
Definition at line 1166 of file TrigHitDVHypoAlg.cxx.
1171 std::vector<int> v_dvtrk_id;
1172 std::vector<float> v_dvtrk_pt;
1173 std::vector<float> v_dvtrk_eta;
1174 std::vector<float> v_dvtrk_phi;
1175 std::vector<int> v_dvtrk_n_hits_inner;
1176 std::vector<int> v_dvtrk_n_hits_pix;
1177 std::vector<int> v_dvtrk_n_hits_sct;
1178 std::vector<float> v_dvtrk_a0beam;
1179 std::unordered_map<Identifier, int> umap_fittedTrack_identifier;
1180 int fittedTrack_id = -1;
1182 static constexpr
float TRKCUT_PTGEV_HITDV = 0.5;
1184 for (
const auto track: tracks) {
1185 float shift_x = 0;
float shift_y = 0;
1192 if (not igt) {
continue;}
1199 m =
track->measurementsOnTrack()->begin(),
1200 me =
track->measurementsOnTrack()->end ();
1201 for(;
m!=me; ++
m ) {
1203 if( prd ==
nullptr )
continue;
1205 if( umap_fittedTrack_identifier.find(id_prd) == umap_fittedTrack_identifier.end() ) {
1206 umap_fittedTrack_identifier.insert(std::make_pair(id_prd,fittedTrack_id));
1210 v_dvtrk_id.push_back(fittedTrack_id);
1212 v_dvtrk_eta.push_back(theTrackInfo.
eta);
1213 v_dvtrk_phi.push_back(
phi);
1214 v_dvtrk_n_hits_inner.push_back(theTrackInfo.
n_hits_inner);
1215 v_dvtrk_n_hits_pix.push_back(theTrackInfo.
n_hits_pix);
1216 v_dvtrk_n_hits_sct.push_back(theTrackInfo.
n_hits_sct);
1217 v_dvtrk_a0beam.push_back(theTrackInfo.
a0beam);
1219 ATH_MSG_DEBUG(
"Nr of selected tracks / all = " << fittedTrack_id <<
" / " << tracks.size());
1220 ATH_MSG_DEBUG(
"Nr of Identifiers used by selected tracks = " << umap_fittedTrack_identifier.size());
1224 int n_sp_usedByTrk = 0;
1226 std::unordered_map<Identifier, int> umap_sp_identifier;
1227 umap_sp_identifier.reserve(1.3*convertedSpacePoints.size());
1232 if( umap_sp_identifier.find(id_prd) == umap_sp_identifier.end() ) {
1233 umap_sp_identifier.insert(std::make_pair(id_prd,-1));
1238 for(
unsigned int iSp=0; iSp<convertedSpacePoints.size(); ++iSp) {
1239 bool isPix = convertedSpacePoints[iSp].isPixel();
1240 bool isSct = convertedSpacePoints[iSp].isSCT();
1241 if( !
isPix && ! isSct )
continue;
1242 const Trk::SpacePoint* sp = convertedSpacePoints[iSp].offlineSpacePoint();
1246 int n_id_usedByTrack = 0;
1247 for(
auto it=umap_sp_identifier.begin();
it!=umap_sp_identifier.end(); ++
it) {
1249 if( umap_fittedTrack_identifier.find(id_sp) != umap_fittedTrack_identifier.end() ) {
1250 umap_sp_identifier[id_sp] = umap_fittedTrack_identifier[id_sp];
1254 ATH_MSG_DEBUG(
"Nr of SPs / Identifiers (all) / Identifiers (usedByTrack) = " << convertedSpacePoints.size() <<
" / " << umap_sp_identifier.size() <<
" / " << n_id_usedByTrack);
1257 int usedTrack_id = -1;
1260 if( umap_sp_identifier.find(id_prd) != umap_sp_identifier.end() ) {
1261 usedTrack_id = umap_sp_identifier[id_prd];
1264 return usedTrack_id;
1267 std::vector<float> v_sp_eta;
1268 v_sp_eta.reserve(convertedSpacePoints.size());
1269 std::vector<float> v_sp_r;
1270 v_sp_r.reserve(convertedSpacePoints.size());
1271 std::vector<float> v_sp_phi;
1272 v_sp_phi.reserve(convertedSpacePoints.size());
1273 std::vector<int> v_sp_layer;
1274 v_sp_layer.reserve(convertedSpacePoints.size());
1275 std::vector<bool> v_sp_isPix;
1276 v_sp_isPix.reserve(convertedSpacePoints.size());
1277 std::vector<bool> v_sp_isSct;
1278 v_sp_isSct.reserve(convertedSpacePoints.size());
1279 std::vector<int> v_sp_usedTrkId;
1280 v_sp_usedTrkId.reserve(convertedSpacePoints.size());
1282 for(
const auto& sp : convertedSpacePoints) {
1283 bool isPix = sp.isPixel();
1284 bool isSct = sp.isSCT();
1285 if( !
isPix && ! isSct )
continue;
1288 int usedTrack_id = -1;
1289 int usedTrack_id_first = sp_map_used_id(osp->
clusterList().first);
1290 if (usedTrack_id_first != -1) {
1291 usedTrack_id = usedTrack_id_first;
1293 int usedTrack_id_second = sp_map_used_id(osp->
clusterList().second);
1294 if (usedTrack_id_second != -1) {
1295 usedTrack_id = usedTrack_id_second;
1300 if( usedTrack_id != -1 ) n_sp_usedByTrk++;
1301 int layer = sp.layer();
1302 float sp_r = sp.
r();
1305 float sp_eta = pos_sp.eta();
1306 float sp_phi = pos_sp.phi();
1308 v_sp_eta.push_back(sp_eta);
1309 v_sp_r.push_back(sp_r);
1310 v_sp_phi.push_back(sp_phi);
1311 v_sp_layer.push_back(
layer);
1312 v_sp_isPix.push_back(
isPix);
1313 v_sp_isSct.push_back(isSct);
1314 v_sp_usedTrkId.push_back(usedTrack_id);
1316 ATH_MSG_VERBOSE(
"+++ SP eta / phi / layer / ixPix / usedTrack_id = " << sp_eta <<
" / " << sp_phi <<
" / " <<
layer <<
" / " <<
isPix <<
" / " << usedTrack_id);
1319 ATH_MSG_DEBUG(
"Nr of SPs / all = " << n_sp <<
" / " << convertedSpacePoints.size());
1320 ATH_MSG_DEBUG(
"Nr of SPs used by selected tracks = " << n_sp_usedByTrk);
1323 std::vector<float> v_seeds_eta;
1324 std::vector<float> v_seeds_phi;
1325 std::vector<int16_t> v_seeds_type;
1330 const unsigned int L1JET_ET_CUT = 27;
1334 if (!jetRoiCollectionHandle.isValid()){
1336 return StatusCode::FAILURE;
1340 if( jetRoI ==
nullptr )
continue;
1342 if( jetRoI->
et() >= L1JET_ET_CUT ) {
1343 v_seeds_eta.push_back(jetRoI->
eta());
1344 v_seeds_phi.push_back(jetRoI->
phi());
1345 v_seeds_type.push_back(0);
1348 ATH_MSG_DEBUG(
"Nr of L1_J" << L1JET_ET_CUT <<
" seeds = " << v_seeds_eta.size());
1351 std::vector<float> v_spseeds_eta;
1352 std::vector<float> v_spseeds_phi;
1353 ATH_CHECK(
findSPSeeds(ctx, v_sp_eta, v_sp_phi, v_sp_layer, v_sp_usedTrkId, v_spseeds_eta, v_spseeds_phi) );
1355 for(
size_t idx=0;
idx<v_spseeds_eta.size(); ++
idx) {
1356 v_seeds_eta.push_back(v_spseeds_eta[
idx]);
1357 v_seeds_phi.push_back(v_spseeds_phi[
idx]);
1358 v_seeds_type.push_back(1);
1360 ATH_MSG_DEBUG(
"Nr of SP + L1_J" << L1JET_ET_CUT <<
" seeds = " << v_seeds_eta.size());
1366 const int N_MAX_SEEDS = 200;
1367 int n_seeds =
std::min(N_MAX_SEEDS,(
int)v_seeds_eta.size());
1368 hitDVSeedsContainer.reserve(n_seeds);
1369 for(
auto iSeed=0; iSeed < n_seeds; ++iSeed) {
1371 seed.eta = v_seeds_eta[iSeed];
1372 seed.phi = v_seeds_phi[iSeed];
1373 seed.type = v_seeds_type[iSeed];
1374 hitDVSeedsContainer.push_back(seed);
1378 const float TRKCUT_DELTA_R_TO_SEED = 1.0;
1379 hitDVTrksContainer.reserve(v_dvtrk_pt.size());
1380 for(
unsigned int iTrk=0; iTrk<v_dvtrk_pt.size(); ++iTrk) {
1381 float trk_eta = v_dvtrk_eta[iTrk];
1382 float trk_phi = v_dvtrk_phi[iTrk];
1384 bool isNearSeed =
false;
1385 for (
unsigned int iSeed=0; iSeed<v_seeds_eta.size(); ++iSeed) {
1386 float seed_eta = v_seeds_eta[iSeed];
1387 float seed_phi = v_seeds_phi[iSeed];
1388 float dR2 =
deltaR2(trk_eta,trk_phi,seed_eta,seed_phi);
1389 if( dR2 <= TRKCUT_DELTA_R_TO_SEED*TRKCUT_DELTA_R_TO_SEED ) { isNearSeed =
true;
break; }
1391 if( ! isNearSeed )
continue;
1394 hitDVTrk.
id = v_dvtrk_id[iTrk];
1395 hitDVTrk.
pt = v_dvtrk_pt[iTrk];
1396 hitDVTrk.
eta = v_dvtrk_eta[iTrk];
1397 hitDVTrk.
phi = v_dvtrk_phi[iTrk];
1399 hitDVTrk.
n_hits_pix = v_dvtrk_n_hits_pix[iTrk];
1400 hitDVTrk.
n_hits_sct = v_dvtrk_n_hits_sct[iTrk];
1401 hitDVTrk.
a0beam = v_dvtrk_a0beam[iTrk];
1403 hitDVTrksContainer.push_back(hitDVTrk);
1407 const float SPCUT_DELTA_R_TO_SEED = 1.0;
1408 const size_t n_sp_max = std::min<size_t>(100000, v_sp_eta.size());
1409 size_t n_sp_stored = 0;
1411 hitDVSPsContainer.reserve(n_sp_max);
1413 for(
size_t iSp=0; iSp<v_sp_eta.size(); ++iSp) {
1415 const float sp_eta = v_sp_eta[iSp];
1416 const float sp_phi = v_sp_phi[iSp];
1417 bool isNearSeed =
false;
1418 for (
size_t iSeed=0; iSeed<v_seeds_eta.size(); ++iSeed) {
1419 const float seed_eta = v_seeds_eta[iSeed];
1420 const float seed_phi = v_seeds_phi[iSeed];
1421 const float dR2 =
deltaR2(sp_eta, sp_phi, seed_eta, seed_phi);
1422 if( dR2 <= SPCUT_DELTA_R_TO_SEED*SPCUT_DELTA_R_TO_SEED ) { isNearSeed =
true;
break; }
1424 if( ! isNearSeed )
continue;
1426 if( n_sp_stored >= n_sp_max )
break;
1428 hitDVSP.
eta = v_sp_eta[iSp];
1429 hitDVSP.
r = v_sp_r[iSp];
1430 hitDVSP.
phi = v_sp_phi[iSp];
1431 hitDVSP.
layer = v_sp_layer[iSp];
1432 hitDVSP.
isPix = v_sp_isPix[iSp];
1433 hitDVSP.
isSct = v_sp_isSct[iSp];
1434 hitDVSP.
usedTrkId = v_sp_usedTrkId[iSp];
1435 hitDVSPsContainer.push_back(hitDVSP);
1440 return StatusCode::SUCCESS;
◆ findJetSeeds()
StatusCode TrigHitDVHypoAlg::findJetSeeds |
( |
const xAOD::JetContainer * |
jetsContainer, |
|
|
const float |
cutJetPt, |
|
|
const float |
cutJetEta, |
|
|
std::vector< float > & |
jetSeeds_pt, |
|
|
std::vector< float > & |
jetSeeds_eta, |
|
|
std::vector< float > & |
jetSeeds_phi |
|
) |
| const |
|
private |
Definition at line 698 of file TrigHitDVHypoAlg.cxx.
701 std::vector<float> mnt_jet_pt;
702 std::vector<float> mnt_jet_eta;
707 ATH_MSG_VERBOSE(
"looking for jet seed with pt cut=" << cutJetPt <<
", eta cut=" << cutJetEta);
710 if( jet_pt < cutJetPt ) {
714 mnt_jet_pt.push_back(jet_pt);
715 float jet_eta =
static_cast<float>(
jet->eta());
716 mnt_jet_eta.push_back(jet_eta);
717 if( std::fabs(jet_eta) > cutJetEta ) {
721 float jet_phi =
static_cast<float>(
jet->phi());
722 jetSeeds_pt.push_back(jet_pt);
723 jetSeeds_eta.push_back(jet_eta);
724 jetSeeds_phi.push_back(
jet_phi);
728 return StatusCode::SUCCESS;
◆ findSPSeeds() [1/2]
StatusCode TrigHitDVHypoAlg::findSPSeeds |
( |
const EventContext & |
ctx, |
|
|
const std::vector< HitDVSpacePoint > & |
spsContainer, |
|
|
std::vector< float > & |
seeds_eta, |
|
|
std::vector< float > & |
seeds_phi |
|
) |
| const |
|
private |
Definition at line 734 of file TrigHitDVHypoAlg.cxx.
740 const int NBINS_ETA = 50;
741 const float ETA_MIN = -2.5;
742 const float ETA_MAX = 2.5;
744 const int NBINS_PHI = 80;
745 const float PHI_MIN = -4.0;
746 const float PHI_MAX = 4.0;
750 unsigned int slotnr = ctx.slot();
751 unsigned int subSlotnr = ctx.subSlot();
753 sprintf(
hname,
"hitdv_s%u_ss%u_ly6_h2_nsp",slotnr,subSlotnr);
754 std::unique_ptr<TH2F> ly6_h2_nsp = std::make_unique<TH2F>(
hname,
hname,NBINS_ETA,ETA_MIN,ETA_MAX,NBINS_PHI,PHI_MIN,PHI_MAX);
755 sprintf(
hname,
"hitdv_s%u_ss%u_ly7_h2_nsp",slotnr,subSlotnr);
756 std::unique_ptr<TH2F> ly7_h2_nsp = std::make_unique<TH2F>(
hname,
hname,NBINS_ETA,ETA_MIN,ETA_MAX,NBINS_PHI,PHI_MIN,PHI_MAX);
758 sprintf(
hname,
"hitdv_s%u_ss%u_ly6_h2_nsp_notrk",slotnr,subSlotnr);
759 std::unique_ptr<TH2F> ly6_h2_nsp_notrk = std::make_unique<TH2F>(
hname,
hname,NBINS_ETA,ETA_MIN,ETA_MAX,NBINS_PHI,PHI_MIN,PHI_MAX);
760 sprintf(
hname,
"hitdv_s%u_ss%u_ly7_h2_nsp_notrk",slotnr,subSlotnr);
761 std::unique_ptr<TH2F> ly7_h2_nsp_notrk = std::make_unique<TH2F>(
hname,
hname,NBINS_ETA,ETA_MIN,ETA_MAX,NBINS_PHI,PHI_MIN,PHI_MAX);
763 for (
const auto& spData : spsContainer ) {
764 int16_t sp_layer = spData.layer;
765 float sp_eta = spData.eta;
767 if( ilayer<6 )
continue;
769 int sp_trkid = (
int)spData.usedTrkId;
770 bool isUsedByTrk = (sp_trkid != -1);
771 float sp_phi = spData.phi;
773 bool fill_out_of_pi =
false;
776 sp_phi2 = 2*TMath::Pi() + sp_phi;
777 if( sp_phi2 < PHI_MAX ) fill_out_of_pi =
true;
780 sp_phi2 = -2*TMath::Pi() + sp_phi;
781 if( PHI_MIN < sp_phi2 ) fill_out_of_pi =
true;
784 ly6_h2_nsp->Fill(sp_eta,sp_phi);
785 if( fill_out_of_pi ) ly6_h2_nsp->Fill(sp_eta,sp_phi2);
786 if( ! isUsedByTrk ) ly6_h2_nsp_notrk->Fill(sp_eta,sp_phi);
787 if( ! isUsedByTrk && fill_out_of_pi) ly6_h2_nsp_notrk->Fill(sp_eta,sp_phi2);
790 ly7_h2_nsp->Fill(sp_eta,sp_phi);
791 if( fill_out_of_pi ) ly7_h2_nsp->Fill(sp_eta,sp_phi2);
792 if( ! isUsedByTrk ) ly7_h2_nsp_notrk->Fill(sp_eta,sp_phi);
793 if( ! isUsedByTrk && fill_out_of_pi) ly7_h2_nsp_notrk->Fill(sp_eta,sp_phi2);
800 std::vector<std::tuple<int,float,float,float>> QT;
802 for(
int ly6_ieta=1; ly6_ieta<=NBINS_ETA; ly6_ieta++) {
803 float ly6_eta = (ly6_h2_nsp->GetXaxis()->GetBinLowEdge(ly6_ieta) + ly6_h2_nsp->GetXaxis()->GetBinUpEdge(ly6_ieta))/2.0;
804 for(
int ly6_iphi=1; ly6_iphi<=NBINS_PHI; ly6_iphi++) {
805 float ly6_phi = (ly6_h2_nsp->GetYaxis()->GetBinLowEdge(ly6_iphi) + ly6_h2_nsp->GetYaxis()->GetBinUpEdge(ly6_iphi))/2.0;
807 float ly6_nsp = ly6_h2_nsp ->GetBinContent(ly6_ieta,ly6_iphi);
808 float ly6_nsp_notrk = ly6_h2_nsp_notrk->GetBinContent(ly6_ieta,ly6_iphi);
809 float ly6_frac = ( ly6_nsp > 0 ) ? ly6_nsp_notrk / ly6_nsp : 0;
810 if( ly6_nsp < 10 || ly6_frac < 0.85 )
continue;
812 float ly7_frac_max = 0;
813 float ly7_eta_max = 0;
814 float ly7_phi_max = 0;
815 for(
int ly7_ieta=
std::max(1,ly6_ieta-1); ly7_ieta<
std::min(NBINS_ETA,ly6_ieta+1); ly7_ieta++) {
816 for(
int ly7_iphi=
std::max(1,ly6_iphi-1); ly7_iphi<=
std::min(NBINS_PHI,ly6_iphi+1); ly7_iphi++) {
817 float ly7_nsp = ly7_h2_nsp ->GetBinContent(ly7_ieta,ly7_iphi);
818 float ly7_nsp_notrk = ly7_h2_nsp_notrk->GetBinContent(ly7_ieta,ly7_iphi);
819 float ly7_frac = ( ly7_nsp > 0 ) ? ly7_nsp_notrk / ly7_nsp : 0;
820 if( ly7_nsp < 10 )
continue;
821 if( ly7_frac > ly7_frac_max ) {
822 ly7_frac_max = ly7_frac;
823 ly7_eta_max = (ly7_h2_nsp->GetXaxis()->GetBinLowEdge(ly7_ieta) + ly7_h2_nsp->GetXaxis()->GetBinUpEdge(ly7_ieta))/2.0;
824 ly7_phi_max = (ly7_h2_nsp->GetXaxis()->GetBinLowEdge(ly7_iphi) + ly7_h2_nsp->GetXaxis()->GetBinUpEdge(ly7_iphi))/2.0;
828 if( ly7_frac_max < 0.85 )
continue;
830 float wsum = ly6_frac + ly7_frac_max;
831 float weta = (ly6_eta*ly6_frac + ly7_eta_max*ly7_frac_max) / wsum;
832 float wphi = (ly6_phi*ly6_frac + ly7_phi_max*ly7_frac_max) / wsum;
833 float w = wsum / 2.0;
834 QT.push_back(std::make_tuple(-1,
w,weta,wphi));
837 ATH_MSG_VERBOSE(
"nr of ly6/ly7 doublet candidate seeds=" << QT.size() <<
", doing clustering...");
841 [](
const std::tuple<int,float,float,float>& lhs,
const std::tuple<int,float,float,float>& rhs) {
842 return std::get<1>(lhs) > std::get<1>(rhs); } );
845 const double CLUSTCUT_DIST_SQUARED = 0.04;
846 const double CLUSTCUT_SEED_FRAC = 0.9;
848 std::vector<float> seeds_wsum;
850 for(
unsigned int i=0;
i<QT.size();
i++) {
851 float phi = std::get<3>(QT[
i]);
852 float eta = std::get<2>(QT[
i]);
853 float w = std::get<1>(QT[
i]);
855 seeds_eta.push_back(
w*
eta); seeds_phi.push_back(
w*
phi);
856 seeds_wsum.push_back(
w);
859 const int IDX_INITIAL = 100;
860 float dist2_min = 100.0;
862 for(
unsigned j=0; j<seeds_eta.size(); j++) {
863 float ceta = seeds_eta[j]/seeds_wsum[j];
864 float cphi = seeds_phi[j]/seeds_wsum[j];
866 float deta = std::fabs(ceta-
eta);
867 float dphi = std::fabs(cphi-
phi);
868 float dist2 = dphi*dphi+deta*deta;
869 if( dist2 < dist2_min ) {
874 int match_idx = IDX_INITIAL;
876 if( dist2_min < CLUSTCUT_DIST_SQUARED ) { match_idx =
idx_min; }
878 if( match_idx == IDX_INITIAL ) {
879 if(
w > CLUSTCUT_SEED_FRAC && dist2_min > CLUSTCUT_DIST_SQUARED ) {
880 seeds_eta.push_back(
w*
eta); seeds_phi.push_back(
w*
phi);
881 seeds_wsum.push_back(
w);
885 float new_eta = seeds_eta[match_idx] +
w*
eta;
886 float new_phi = seeds_phi[match_idx] +
w*
phi;
887 float new_wsum = seeds_wsum[match_idx] +
w;
888 seeds_eta[match_idx] = new_eta;
889 seeds_phi[match_idx] = new_phi;
890 seeds_wsum[match_idx] = new_wsum;
893 for(
unsigned int i=0;
i<seeds_eta.size();
i++) {
894 float eta = seeds_eta[
i] / seeds_wsum[
i];
895 float phi = seeds_phi[
i] / seeds_wsum[
i];
898 if(
phi < -TMath::Pi() )
phi = 2*TMath::Pi() +
phi;
899 if(
phi > TMath::Pi() )
phi = -2*TMath::Pi() +
phi;
902 ATH_MSG_VERBOSE(
"after clustering, nr of seeds = " << seeds_eta.size());
905 std::vector<unsigned int> idx_to_delete;
906 for(
unsigned int i=0;
i<seeds_eta.size();
i++) {
907 if(
std::find(idx_to_delete.begin(),idx_to_delete.end(),
i) != idx_to_delete.end() )
continue;
908 float eta_i = seeds_eta[
i];
909 float phi_i = seeds_phi[
i];
910 for(
unsigned int j=
i+1; j<seeds_eta.size(); j++) {
911 if(
std::find(idx_to_delete.begin(),idx_to_delete.end(),j) != idx_to_delete.end() )
continue;
912 float eta_j = seeds_eta[j];
913 float phi_j = seeds_phi[j];
914 float dR2 =
deltaR2(eta_i,phi_i,eta_j,phi_j);
915 if( dR2 < CLUSTCUT_DIST_SQUARED ) idx_to_delete.push_back(j);
918 ATH_MSG_VERBOSE(
"nr of duplicated seeds to be removed = " << idx_to_delete.size());
919 if( idx_to_delete.size() > 0 ) {
920 std::sort(idx_to_delete.begin(),idx_to_delete.end());
921 for(
unsigned int j=idx_to_delete.size(); j>0; j--) {
922 unsigned int idx = idx_to_delete[j-1];
923 seeds_eta.erase(seeds_eta.begin()+
idx);
924 seeds_phi.erase(seeds_phi.begin()+
idx);
931 return StatusCode::SUCCESS;
◆ findSPSeeds() [2/2]
StatusCode TrigHitDVHypoAlg::findSPSeeds |
( |
const EventContext & |
ctx, |
|
|
const std::vector< float > & |
v_sp_eta, |
|
|
const std::vector< float > & |
v_sp_phi, |
|
|
const std::vector< int > & |
v_sp_layer, |
|
|
const std::vector< int > & |
v_sp_usedTrkId, |
|
|
std::vector< float > & |
seeds_eta, |
|
|
std::vector< float > & |
seeds_phi |
|
) |
| const |
|
private |
Definition at line 967 of file TrigHitDVHypoAlg.cxx.
972 const int NBINS_ETA = 50;
973 const float ETA_MIN = -2.5;
974 const float ETA_MAX = 2.5;
976 const int NBINS_PHI = 80;
977 const float PHI_MIN = -4.0;
978 const float PHI_MAX = 4.0;
982 unsigned int slotnr = ctx.slot();
983 unsigned int subSlotnr = ctx.subSlot();
985 sprintf(
hname,
"ftf_s%u_ss%u_ly6_h2_nsp",slotnr,subSlotnr);
986 std::unique_ptr<TH2F> ly6_h2_nsp = std::make_unique<TH2F>(
hname,
hname,NBINS_ETA,ETA_MIN,ETA_MAX,NBINS_PHI,PHI_MIN,PHI_MAX);
987 sprintf(
hname,
"ftf_s%u_ss%u_ly7_h2_nsp",slotnr,subSlotnr);
988 std::unique_ptr<TH2F> ly7_h2_nsp = std::make_unique<TH2F>(
hname,
hname,NBINS_ETA,ETA_MIN,ETA_MAX,NBINS_PHI,PHI_MIN,PHI_MAX);
990 sprintf(
hname,
"ftf_s%u_ss%u_ly6_h2_nsp_notrk",slotnr,subSlotnr);
991 std::unique_ptr<TH2F> ly6_h2_nsp_notrk = std::make_unique<TH2F>(
hname,
hname,NBINS_ETA,ETA_MIN,ETA_MAX,NBINS_PHI,PHI_MIN,PHI_MAX);
992 sprintf(
hname,
"ftf_s%u_ss%u_ly7_h2_nsp_notrk",slotnr,subSlotnr);
993 std::unique_ptr<TH2F> ly7_h2_nsp_notrk = std::make_unique<TH2F>(
hname,
hname,NBINS_ETA,ETA_MIN,ETA_MAX,NBINS_PHI,PHI_MIN,PHI_MAX);
995 for(
unsigned int iSeed=0; iSeed<v_sp_eta.size(); ++iSeed) {
997 int sp_layer = v_sp_layer[iSeed];
998 float sp_eta = v_sp_eta[iSeed];
1000 if( ilayer<6 )
continue;
1002 int sp_trkid = v_sp_usedTrkId[iSeed];
1003 bool isUsedByTrk = (sp_trkid != -1);
1004 float sp_phi = v_sp_phi[iSeed];
1006 bool fill_out_of_pi =
false;
1009 sp_phi2 = 2*TMath::Pi() + sp_phi;
1010 if( sp_phi2 < PHI_MAX ) fill_out_of_pi =
true;
1013 sp_phi2 = -2*TMath::Pi() + sp_phi;
1014 if( PHI_MIN < sp_phi2 ) fill_out_of_pi =
true;
1017 ly6_h2_nsp->Fill(sp_eta,sp_phi);
1018 if( fill_out_of_pi ) ly6_h2_nsp->Fill(sp_eta,sp_phi2);
1019 if( ! isUsedByTrk ) ly6_h2_nsp_notrk->Fill(sp_eta,sp_phi);
1020 if( ! isUsedByTrk && fill_out_of_pi) ly6_h2_nsp_notrk->Fill(sp_eta,sp_phi2);
1023 ly7_h2_nsp->Fill(sp_eta,sp_phi);
1024 if( fill_out_of_pi ) ly7_h2_nsp->Fill(sp_eta,sp_phi2);
1025 if( ! isUsedByTrk ) ly7_h2_nsp_notrk->Fill(sp_eta,sp_phi);
1026 if( ! isUsedByTrk && fill_out_of_pi) ly7_h2_nsp_notrk->Fill(sp_eta,sp_phi2);
1033 std::vector<std::tuple<int,float,float,float>> QT;
1035 for(
int ly6_ieta=1; ly6_ieta<=NBINS_ETA; ly6_ieta++) {
1036 float ly6_eta = (ly6_h2_nsp->GetXaxis()->GetBinLowEdge(ly6_ieta) + ly6_h2_nsp->GetXaxis()->GetBinUpEdge(ly6_ieta))/2.0;
1037 for(
int ly6_iphi=1; ly6_iphi<=NBINS_PHI; ly6_iphi++) {
1038 float ly6_phi = (ly6_h2_nsp->GetYaxis()->GetBinLowEdge(ly6_iphi) + ly6_h2_nsp->GetYaxis()->GetBinUpEdge(ly6_iphi))/2.0;
1040 float ly6_nsp = ly6_h2_nsp ->GetBinContent(ly6_ieta,ly6_iphi);
1041 float ly6_nsp_notrk = ly6_h2_nsp_notrk->GetBinContent(ly6_ieta,ly6_iphi);
1042 float ly6_frac = ( ly6_nsp > 0 ) ? ly6_nsp_notrk / ly6_nsp : 0;
1043 if( ly6_nsp < 10 || ly6_frac < 0.85 )
continue;
1045 float ly7_frac_max = 0;
1046 float ly7_eta_max = 0;
1047 float ly7_phi_max = 0;
1048 for(
int ly7_ieta=
std::max(1,ly6_ieta-1); ly7_ieta<
std::min(NBINS_ETA,ly6_ieta+1); ly7_ieta++) {
1049 for(
int ly7_iphi=
std::max(1,ly6_iphi-1); ly7_iphi<=
std::min(NBINS_PHI,ly6_iphi+1); ly7_iphi++) {
1050 float ly7_nsp = ly7_h2_nsp ->GetBinContent(ly7_ieta,ly7_iphi);
1051 float ly7_nsp_notrk = ly7_h2_nsp_notrk->GetBinContent(ly7_ieta,ly7_iphi);
1052 float ly7_frac = ( ly7_nsp > 0 ) ? ly7_nsp_notrk / ly7_nsp : 0;
1053 if( ly7_nsp < 10 )
continue;
1054 if( ly7_frac > ly7_frac_max ) {
1055 ly7_frac_max = ly7_frac;
1056 ly7_eta_max = (ly7_h2_nsp->GetXaxis()->GetBinLowEdge(ly7_ieta) + ly7_h2_nsp->GetXaxis()->GetBinUpEdge(ly7_ieta))/2.0;
1057 ly7_phi_max = (ly7_h2_nsp->GetXaxis()->GetBinLowEdge(ly7_iphi) + ly7_h2_nsp->GetXaxis()->GetBinUpEdge(ly7_iphi))/2.0;
1061 if( ly7_frac_max < 0.85 )
continue;
1063 float wsum = ly6_frac + ly7_frac_max;
1064 float weta = (ly6_eta*ly6_frac + ly7_eta_max*ly7_frac_max) / wsum;
1065 float wphi = (ly6_phi*ly6_frac + ly7_phi_max*ly7_frac_max) / wsum;
1066 float w = wsum / 2.0;
1067 QT.push_back(std::make_tuple(-1,
w,weta,wphi));
1070 ATH_MSG_VERBOSE(
"nr of ly6/ly7 doublet candidate seeds=" << QT.size() <<
", doing clustering...");
1074 [](
const std::tuple<int,float,float,float>& lhs,
const std::tuple<int,float,float,float>& rhs) {
1075 return std::get<1>(lhs) > std::get<1>(rhs); } );
1078 const double CLUSTCUT_DIST_SQUARED = 0.04;
1079 const double CLUSTCUT_SEED_FRAC = 0.9;
1081 std::vector<float> seeds_wsum;
1083 for(
unsigned int i=0;
i<QT.size();
i++) {
1084 float phi = std::get<3>(QT[
i]);
1085 float eta = std::get<2>(QT[
i]);
1086 float w = std::get<1>(QT[
i]);
1088 seeds_eta.push_back(
w*
eta); seeds_phi.push_back(
w*
phi);
1089 seeds_wsum.push_back(
w);
1092 const int IDX_INITIAL = 100;
1093 float dist2_min = 100.0;
1095 for(
unsigned j=0; j<seeds_eta.size(); j++) {
1096 float ceta = seeds_eta[j]/seeds_wsum[j];
1097 float cphi = seeds_phi[j]/seeds_wsum[j];
1099 float deta = std::fabs(ceta-
eta);
1100 float dphi = std::fabs(cphi-
phi);
1101 float dist2 = dphi*dphi+deta*deta;
1102 if( dist2 < dist2_min ) {
1107 int match_idx = IDX_INITIAL;
1108 if(
idx_min != IDX_INITIAL ) {
1109 if( dist2_min < CLUSTCUT_DIST_SQUARED ) { match_idx =
idx_min; }
1111 if( match_idx == IDX_INITIAL ) {
1112 if(
w > CLUSTCUT_SEED_FRAC && dist2_min > CLUSTCUT_DIST_SQUARED ) {
1113 seeds_eta.push_back(
w*
eta); seeds_phi.push_back(
w*
phi);
1114 seeds_wsum.push_back(
w);
1118 float new_eta = seeds_eta[match_idx] +
w*
eta;
1119 float new_phi = seeds_phi[match_idx] +
w*
phi;
1120 float new_wsum = seeds_wsum[match_idx] +
w;
1121 seeds_eta[match_idx] = new_eta;
1122 seeds_phi[match_idx] = new_phi;
1123 seeds_wsum[match_idx] = new_wsum;
1126 for(
unsigned int i=0;
i<seeds_eta.size();
i++) {
1127 float eta = seeds_eta[
i] / seeds_wsum[
i];
1128 float phi = seeds_phi[
i] / seeds_wsum[
i];
1130 if(
phi < -TMath::Pi() )
phi = 2*TMath::Pi() +
phi;
1131 if(
phi > TMath::Pi() )
phi = -2*TMath::Pi() +
phi;
1134 ATH_MSG_VERBOSE(
"after clustering, nr of seeds = " << seeds_eta.size());
1137 std::vector<unsigned int> idx_to_delete;
1138 for(
unsigned int i=0;
i<seeds_eta.size();
i++) {
1139 if(
std::find(idx_to_delete.begin(),idx_to_delete.end(),
i) != idx_to_delete.end() )
continue;
1140 float eta_i = seeds_eta[
i];
1141 float phi_i = seeds_phi[
i];
1142 for(
unsigned int j=
i+1; j<seeds_eta.size(); j++) {
1143 if(
std::find(idx_to_delete.begin(),idx_to_delete.end(),j) != idx_to_delete.end() )
continue;
1144 float eta_j = seeds_eta[j];
1145 float phi_j = seeds_phi[j];
1146 float dR2 =
deltaR2(eta_i,phi_i,eta_j,phi_j);
1147 if( dR2 < CLUSTCUT_DIST_SQUARED ) idx_to_delete.push_back(j);
1150 ATH_MSG_VERBOSE(
"nr of duplicated seeds to be removed = " << idx_to_delete.size());
1151 if( idx_to_delete.size() > 0 ) {
1152 std::sort(idx_to_delete.begin(),idx_to_delete.end());
1153 for(
unsigned int j=idx_to_delete.size(); j>0; j--) {
1154 unsigned int idx = idx_to_delete[j-1];
1155 seeds_eta.erase(seeds_eta.begin()+
idx);
1156 seeds_phi.erase(seeds_phi.begin()+
idx);
1163 return StatusCode::SUCCESS;
◆ getSPLayer()
int TrigHitDVHypoAlg::getSPLayer |
( |
int |
layer, |
|
|
float |
eta |
|
) |
| const |
|
private |
Definition at line 332 of file TrigHitDVHypoAlg.cxx.
334 float abseta = std::fabs(
eta);
347 const float PixBR6limit = 1.29612;
348 const float PixBR5limit = 1.45204;
349 const float PixBR4limit = 1.64909;
350 const float PixBR3limit = 1.90036;
351 const float PixBR2limit = 2.2146;
357 if( abseta > PixBR2limit )
return 2;
365 if( abseta > PixBR2limit )
return 2;
380 if( abseta < PixBR6limit )
return 7;
381 else if( abseta < PixBR5limit )
return 6;
389 if( abseta < PixBR5limit )
return 7;
390 else if( abseta < PixBR4limit )
return 6;
398 if( abseta < PixBR4limit )
return 7;
406 if( abseta < PixBR4limit )
return 6;
407 else if( abseta < PixBR3limit )
return 6;
415 if( abseta < PixBR3limit )
return 7;
423 if( abseta < PixBR3limit )
return 6;
431 if( abseta < PixBR3limit )
return 7;
439 if( abseta < PixBR3limit )
return 7;
◆ hypoBaseOutputProcessing()
Base class function to be called once slice specific code has finished. Handles debug printing and validation.
Definition at line 33 of file HypoBase.cxx.
41 return StatusCode::SUCCESS;
◆ initialize()
StatusCode TrigHitDVHypoAlg::initialize |
( |
| ) |
|
|
overridevirtual |
Definition at line 55 of file TrigHitDVHypoAlg.cxx.
64 std::string sth =
results[1].str();
65 std::string swp =
results[2].str();
67 int thres = std::stoi(sth);
93 std::string weightfile[2];
96 for (
unsigned int i=0;
i<2; ++
i) {
97 std::unique_ptr<TFile>
rootFile(TFile::Open(weightfile[
i].c_str(),
"READ"));
100 return StatusCode::FAILURE;
102 std::unique_ptr<TTree>
tree((TTree*)
rootFile->Get(
"BDT"));
104 ATH_MSG_ERROR(
"Can not find BDT tree in file: " << weightfile[
i]);
105 return StatusCode::FAILURE;
107 ATH_MSG_INFO(
"Loading BDT tree from file: " << weightfile[
i]);
111 return StatusCode::SUCCESS;
◆ inputHandles()
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.
◆ isClonable()
◆ msg() [1/2]
◆ msg() [2/2]
◆ msgLvl()
◆ outputHandles()
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.
◆ printBangs()
void HypoBase::printBangs |
( |
MsgStream & |
msg | ) |
|
|
staticprivateinherited |
Print header line.
Definition at line 388 of file HypoBase.cxx.
389 msg << MSG::ERROR <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" <<
endmsg;
◆ printDebugInformation()
Common base function to print information on chains passed by objects considered in the hypo.
Definition at line 404 of file HypoBase.cxx.
407 msg() <<
"Exiting with " << outputHandle->
size() <<
" Decision objects" <<
endmsg;
412 msg() <<
"Number of positive decisions for Decision object #" <<
count++ <<
": " << objDecisions.size() <<
endmsg;
418 return StatusCode::SUCCESS;
◆ printErrorHeader()
A problem was found, print common output data.
Definition at line 393 of file HypoBase.cxx.
397 msg << MSG::ERROR <<
"! RUNTIME TRIGGER NAVIGATION VALIDATION ERROR" <<
endmsg;
398 msg << MSG::ERROR <<
"! Caused by Decision with index:" << (*dEL)->index() <<
endmsg;
400 msg << MSG::ERROR <<
"! " << **dEL <<
endmsg;
◆ recursiveValidateGraph()
Execute all checks on one node in the graph, d, then recursive call self on all parent nodes up to L1.
Definition at line 69 of file HypoBase.cxx.
76 if (onlyValidateOneStep && callDepth > 0) {
80 return StatusCode::SUCCESS;
88 return StatusCode::FAILURE;
93 return StatusCode::FAILURE;
99 return StatusCode::FAILURE;
102 return StatusCode::FAILURE;
107 return StatusCode::FAILURE;
110 return StatusCode::FAILURE;
116 if (fullyExploredFrom.count( (*seed) ) == 1) {
119 if ( not
seed.isValid() ) {
120 msg << MSG::ERROR <<
"Invalid seed element link in recursiveValidateGraph" <<
endmsg;
121 return StatusCode::FAILURE;
123 if (
recursiveValidateGraph(seed,
msg, onlyValidateOneStep, runTwoConversion, callDepth + 1, fullyExploredFrom).isFailure() ) {
124 return StatusCode::FAILURE;
128 fullyExploredFrom.insert( *dEL );
129 return StatusCode::SUCCESS;
◆ renounce()
◆ renounceArray()
◆ runtimeValidation()
Executes all individual runtime tests.
Definition at line 45 of file HypoBase.cxx.
51 std::set<const Decision*> fullyExploredFrom;
56 msg << MSG::ERROR <<
"Invalid seed element link in recursiveValidateGraph" <<
endmsg;
57 return StatusCode::FAILURE;
62 return StatusCode::FAILURE;
65 return StatusCode::SUCCESS;
◆ selectSeedsNearby()
StatusCode TrigHitDVHypoAlg::selectSeedsNearby |
( |
const std::vector< HitDVSeed > & |
hitDVSeedsContainer, |
|
|
std::vector< float > & |
jetSeeds_eta, |
|
|
std::vector< float > & |
jetSeeds_phi, |
|
|
std::vector< float > & |
jetSeeds_pt |
|
) |
| const |
|
private |
Definition at line 937 of file TrigHitDVHypoAlg.cxx.
940 std::vector<unsigned int> idx_to_delete;
941 for(
unsigned int idx=0;
idx<jetSeeds_eta.size(); ++
idx) {
942 const float DR_SQUARED_CUT_TO_FTFSEED = 0.09;
943 float eta = jetSeeds_eta[
idx];
944 float phi = jetSeeds_phi[
idx];
946 for (
const auto& seed : hitDVSeedsContainer ) {
948 if( dR2 < dR2min ) dR2min = dR2;
950 if( dR2min > DR_SQUARED_CUT_TO_FTFSEED ) idx_to_delete.push_back(
idx);
952 if( idx_to_delete.size() > 0 ) {
953 std::sort(idx_to_delete.begin(),idx_to_delete.end());
954 for(
unsigned int j=idx_to_delete.size(); j>0; j--) {
955 unsigned int idx = idx_to_delete[j-1];
956 jetSeeds_eta.erase(jetSeeds_eta.begin()+
idx);
957 jetSeeds_phi.erase(jetSeeds_phi.begin()+
idx);
958 if( jetSeeds_pt.size() > 0 ) jetSeeds_pt.erase(jetSeeds_pt.begin()+
idx);
961 return StatusCode::SUCCESS;
◆ setFilterPassed()
◆ sysExecute()
Execute an algorithm.
We override this in order to work around an issue with the Algorithm base class storing the event context in a member variable that can cause crashes in MT jobs.
Definition at line 85 of file AthCommonReentrantAlgorithm.cxx.
◆ sysInitialize()
StatusCode HypoBase::sysInitialize |
( |
| ) |
|
|
overridevirtualinherited |
◆ sysStart()
Handle START transition.
We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.
◆ updateVHKA()
◆ validateDecisionIDs()
Ensure that all present IDs correspond to configured chains.
Definition at line 207 of file HypoBase.cxx.
217 msg << MSG::ERROR <<
"! Decision contains an ID which does not correspond to a configured chain or a configured chain-leg: " <<
HLT::Identifier(
id ) <<
endmsg;
218 msg << MSG::ERROR <<
"! SOLUTION: Locate the producer of the collection, investigate how this bad ID could have been added." <<
endmsg;
220 return StatusCode::FAILURE;
223 return StatusCode::SUCCESS;
◆ validateDuplicatedDecisionID()
Ensure that no space is being wasted by duplicated DecisionIDs in any Decision objects.
Definition at line 227 of file HypoBase.cxx.
233 if (decisionIDSet.size() != (*dEL)->decisions().size()) {
235 msg << MSG::ERROR <<
"! Decision contains duplicate DecisionIDs." <<
endmsg;
236 msg << MSG::ERROR <<
"! SOLUTION: If combining DecisionIDs from multiple parents, de-duplicate the internal std::vector<DecisionID> of 'Decision* d' with:" <<
endmsg;
237 msg << MSG::ERROR <<
"! TrigCompositeUtils::insertDecisionIDs(DecisionIDContainer(), d);" <<
endmsg;
239 return StatusCode::FAILURE;
241 return StatusCode::SUCCESS;
◆ validateHasLinks()
Ensure all Decisions have the named ElementLink graph edges which they are required to by spec.
Definition at line 336 of file HypoBase.cxx.
339 const std::string&
name = (*dEL)->name();
344 return StatusCode::SUCCESS;
348 msg << MSG::ERROR <<
"! Every Decision created by a HypoAlg must correspond to some physics object, and be linked to the object." <<
endmsg;
349 msg << MSG::ERROR <<
"! SOLUTION: Ensure that all produced Decision objects are assigned their feature:" <<
endmsg;
350 msg << MSG::ERROR <<
"! SOLUTION: decision->setObjectLink<MY_FEATURE_CONTANER_TYPE>(featureString(), MY_FEATURE_ELEMENT_LINK);" <<
endmsg;
352 return StatusCode::FAILURE;
358 if ((*dEL)->hasDetail<int32_t>(
"isEmpty") and (*dEL)->getDetail<int32_t>(
"isEmpty") == 1) {
362 if (not (*dEL)->hasObjectLink(
roiString() ) and not exempt) {
364 msg << MSG::ERROR <<
"! Decision has no '" <<
roiString() <<
"' ElementLink." <<
endmsg;
365 msg << MSG::ERROR <<
"! Every Decision created by a InputMaker must link to the ROI which reconstruction will run on for that Decision object in this Step." <<
endmsg;
366 msg << MSG::ERROR <<
"! It can be the FullScan ROI created by the HLTSeeding (FSNOSEED) if no other suitable ROI exists." <<
endmsg;
367 msg << MSG::ERROR <<
"! SOLUTION: Check the configuration of InputMakerForRoI or EventViewCreatorAlgorithm responsible for creating this Decision Object" <<
endmsg;
368 msg << MSG::ERROR <<
"! SOLUTION: The algorithm must have an ROITool which must attach an '"<<
roiString() <<
"' link to each Decision Object" <<
endmsg;
377 msg << MSG::ERROR <<
"! Every Decision created by the HLTSeeding must link to the initial ROI which caused it to be created." <<
endmsg;
378 msg << MSG::ERROR <<
"! This includes the Decision Object created to represent the Full-Scan/NoSeed (FSNOSEED) ROI." <<
endmsg;
379 msg << MSG::ERROR <<
"! SOLUTION: Check the configuration of the HLTSeeding tool responsible for creating this Decision Object" <<
endmsg;
384 return StatusCode::SUCCESS;
◆ validateLogicalFlow()
Ensure that all DecisionIDs have propagated correctly from their parent.
Definition at line 245 of file HypoBase.cxx.
251 return StatusCode::SUCCESS;
260 size_t parentsWithDecision = 0;
262 if ( not
seed.isValid() ) {
263 msg << MSG::ERROR <<
"Invalid seed element link in recursiveValidateGraph" <<
endmsg;
264 return StatusCode::FAILURE;
272 ++parentsWithDecision;
275 for (
auto sid: seedIDSet){
277 ++parentsWithDecision;
288 msg << MSG::ERROR <<
"! This Decision object is not respecting logical flow of DecisionIDs for chain: " <<
HLT::Identifier(
id ) <<
endmsg;
289 msg << MSG::ERROR <<
"! This chain's DecisionID can not be found in any parents of this Decision object:" <<
endmsg;
292 msg << MSG::ERROR <<
"! Index:" << (*seed)->index() <<
" from collection:" <<
seed.dataID() <<
endmsg;
301 msg << MSG::ERROR <<
"! SOLUTION: Ensure that the producer of this Decision object only adds DecisionIDs"
302 " which were present in at least one of its parents." <<
endmsg;
304 return StatusCode::FAILURE;
305 }
else if (
mode ==
kRequireAll && parentsWithDecision != seeds.size()) {
312 msg << MSG::ERROR <<
"! This Decision object is not respecting logical flow of DecisionIDs for chain: " <<
HLT::Identifier(
id ) <<
endmsg;
313 msg << MSG::ERROR <<
"! As this Decision object represents the output of a HypoAlg, it must respect logical flow on all "
314 << seeds.size() <<
" of its parent(s):" <<
endmsg;
317 msg << MSG::ERROR <<
"! Index:" << (*seed)->index() <<
" from collection:" <<
seed.dataID() <<
endmsg;
326 msg << MSG::ERROR <<
"! SOLUTION: Ensure that the HypoTool responsible for " <<
HLT::Identifier(
id )
327 <<
" in this HypoAlg only runs if this ID is present in all parent decisions." <<
endmsg;
329 return StatusCode::FAILURE;
332 return StatusCode::SUCCESS;
◆ validateParentLinking()
Ensure that the Decision has at least one valid parent, unless it is a initial Decision from the HLTSeeding.
Definition at line 133 of file HypoBase.cxx.
139 const std::string&
name = (*dEL)->name();
142 msg << MSG::ERROR <<
"! Decision has zero parents. This is only allowed for the initial Decisions created by the HLTSeeding." <<
endmsg;
143 msg << MSG::ERROR <<
"! SOLUTION: Attach parent Decision(s) with TrigCompositeUtils::linkToPrevious" <<
endmsg;
145 return StatusCode::FAILURE;
149 if (seeds.size() > 0) {
151 msg << MSG::ERROR <<
"! Decision has parents. This is not allowed for the initial Decisions created by the HLTSeeding." <<
endmsg;
152 msg << MSG::ERROR <<
"! SOLUTION: Check HLTSeeding, no where should it be adding a parent link." <<
endmsg;
154 return StatusCode::FAILURE;
156 return StatusCode::SUCCESS;
160 static const std::set<std::string> expectedParentsInputMaker = {
filterNodeName()};
164 static const std::set<std::string> expectedParentsSummaryPassed = {
"SF"};
166 const std::set<std::string>* expectedParentsPtr =
nullptr;
168 expectedParentsPtr = &expectedParentsFilter;
170 expectedParentsPtr = &expectedParentsInputMaker;
172 expectedParentsPtr = &expectedParentsFilter;
174 expectedParentsPtr = &expectedParentsHypoAlg;
176 expectedParentsPtr = &expectedParentsComboHypoAlg;
177 }
else if (
name ==
"SF") {
178 expectedParentsPtr = &expectedParentsSummaryFilter;
179 }
else if (
name ==
"HLTPassRaw") {
180 expectedParentsPtr = &expectedParentsSummaryPassed;
183 msg << MSG::ERROR <<
"! Invalid Node name '" <<
name <<
"'." <<
endmsg;
184 msg << MSG::ERROR <<
"! SOLUTION: Find the alg which made a node with this name. Allowed named may be found in TrigCompositeUtils.h, See:'Constant string literals used within the HLT'." <<
endmsg;
186 return StatusCode::FAILURE;
190 if (expectedParentsPtr->count( (*seed)->name() ) == 0) {
192 msg << MSG::ERROR <<
"! Invalid linking from node with name '" <<
name <<
"' to one with name '"<< (*seed)->name() <<
"'." <<
endmsg;
193 msg << MSG::ERROR <<
"! Allowed seed names are:" <<
endmsg;
194 for (
const std::string& allowed : *expectedParentsPtr) {
195 msg << MSG::ERROR <<
"! " << allowed <<
endmsg;
197 msg << MSG::ERROR <<
"! SOLUTION: Find where this invalid parent was added and correct it." <<
endmsg;
199 return StatusCode::FAILURE;
203 return StatusCode::SUCCESS;
◆ m_bdt_eta
◆ m_beamSpotKey
◆ m_detStore
◆ m_doHitDV_Seeding
bool TrigHitDVHypoAlg::m_doHitDV_Seeding = true |
|
private |
◆ m_evtStore
◆ m_extendedExtraObjects
Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.
Empty if no symlinks were found.
Definition at line 114 of file AthCommonReentrantAlgorithm.h.
◆ m_hitDVKey
◆ m_hitDVLinkName
Gaudi::Property<std::string> TrigHitDVHypoAlg::m_hitDVLinkName {this, "hitDVLinkName", "HitDVSeedLink", "Name of the link to HitDVContainer. Used by ViewCreatorROITool."} |
|
private |
◆ m_hypoTools
◆ m_input
◆ m_isMC
Gaudi::Property<bool> TrigHitDVHypoAlg::m_isMC {this, "isMC", false, "Real data or MC"} |
|
private |
◆ m_jetRoiCollectionKey
◆ m_jetSeed_etaMax
Gaudi::Property<float> TrigHitDVHypoAlg::m_jetSeed_etaMax {this, "jetSeed_etaMin", 2.0, "Maximum eta for jet seed"} |
|
private |
◆ m_jetSeed_ptMin
Gaudi::Property<float> TrigHitDVHypoAlg::m_jetSeed_ptMin {this, "jetSeed_ptMin", 50.0, "Minimum pT for jet seed"} |
|
private |
◆ m_jetsKey
◆ m_lumiBlockMuTool
◆ m_lumiDataKey
◆ m_monTool
◆ m_output
◆ m_runtimeValidation
Gaudi::Property<bool> HypoBase::m_runtimeValidation { this, "RuntimeValidation", false, "Enable detailed runtime validation of HypoAlg output, and upstream Decisions." } |
|
privateinherited |
Enabling of detailed validation checks for use during development.
Definition at line 105 of file HypoBase.h.
◆ m_spacePointTool
◆ m_tools_loosest_wp
int TrigHitDVHypoAlg::m_tools_loosest_wp = 0 |
|
private |
◆ m_tools_lowest_jetEt
int TrigHitDVHypoAlg::m_tools_lowest_jetEt = 1000 |
|
private |
◆ m_tracksKey
◆ m_useBeamSpot
bool TrigHitDVHypoAlg::m_useBeamSpot = true |
|
private |
◆ m_varHandleArraysDeclared
◆ m_vhka
The documentation for this class was generated from the following files:
const std::pair< const PrepRawData *, const PrepRawData * > & clusterList() const
return the pair of cluster pointers by reference
JetConstituentVector::iterator iterator
static std::string find_calib_file(const std::string &logical_file_name)
std::unique_ptr< MVAUtils::BDT > m_bdt_eta[2]
Class describing properties of a LVL1 jFEX global Trigger Object (TOB) in the xAOD format.
Group
Properties of a chain group.
Scalar phi() const
phi method
bool passed(DecisionID id, const DecisionIDContainer &idSet)
checks if required decision ID is in the set of IDs in the container
std::string find(const std::string &s)
return a remapped string
bool isGoodTrackUTT(const Trk::Track *track, trackInfo &theTrackInfo, const float shift_x, const float shift_y, float trkcut_ptgev)
ToolHandle< ITrigSpacePointConversionTool > m_spacePointTool
const std::string & hltSeedingNodeName()
TrigComposite_v1 TrigComposite
Declare the latest version of the class.
virtual const Amg::Vector3D & globalPosition() const override final
Interface method to get the global Position.
Decision * newDecisionIn(DecisionContainer *dc, const std::string &name)
Helper method to create a Decision object, place it in the container and return a pointer to it.
Scalar eta() const
pseudorapidity method
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
const std::string & hypoAlgNodeName()
T wrapToPi(T phi)
Wrap angle in radians to [-pi, pi].
SG::ReadHandleKey< xAOD::jFexSRJetRoIContainer > m_jetRoiCollectionKey
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)
StoreGateSvc_t m_evtStore
Pointer to StoreGate (event store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
const T * get(size_type n) const
Access an element, as an rvalue.
bool msgLvl(const MSG::Level lvl) const
const SG::ReadHandleKey< TrigCompositeUtils::DecisionContainer > & decisionInput() const
methods for derived classes to access handles of the base class input other read/write handles may be...
ToolHandle< GenericMonitoringTool > m_monTool
static void printBangs(MsgStream &msg)
Print header line.
const std::string & comboHypoAlgNodeName()
SG::WriteHandle< DecisionContainer > createAndStore(const SG::WriteHandleKey< DecisionContainer > &key, const EventContext &ctx)
Creates and right away records the DecisionContainer with the key.
nope - should be used for standalone also, perhaps need to protect the class def bits #ifndef XAOD_AN...
void getBeamSpotShift(float &shift_x, float &shift_y, const InDet::BeamSpotData &beamSpotHandle)
#define ATH_MSG_VERBOSE(x)
double r() const
returns the r value of the SpacePoint's position (in cylindrical coordinates).
setScaleOne setStatusOne setSaturated int16_t
const SG::WriteHandleKey< TrigCompositeUtils::DecisionContainer > & decisionOutput() const
methods for derived classes to access handles of the base class output other read/write handles may b...
bool isValid() const
Test to see if the link can be dereferenced.
const ID_type & dataID() const
Get the key that we reference, as a string.
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
virtual void setOwner(IDataHandleHolder *o)=0
Gaudi::Property< float > m_jetSeed_etaMax
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
static StatusCode recursiveValidateGraph(const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg, bool onlyValidateOneStep, bool runTwoConversion, size_t callDepth, std::set< const TrigCompositeUtils::Decision * > &fullyExploredFrom)
Execute all checks on one node in the graph, d, then recursive call self on all parent nodes up to L1...
float deltaR2(float, float, float, float) const
virtual const DataObjIDColl & extraOutputDeps() const override
Return the list of extra output dependencies.
StatusCode selectSeedsNearby(const std::vector< HitDVSeed > &hitDVSeedsContainer, std::vector< float > &jetSeeds_eta, std::vector< float > &jetSeeds_phi, std::vector< float > &jetSeeds_pt) const
static StatusCode validateDuplicatedDecisionID(const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg)
Ensure that no space is being wasted by duplicated DecisionIDs in any Decision objects.
const std::string & initialRoIString()
StatusCode hypoBaseOutputProcessing(SG::WriteHandle< TrigCompositeUtils::DecisionContainer > &outputHandle, MSG::Level lvl=MSG::DEBUG) const
Base class function to be called once slice specific code has finished. Handles debug printing and va...
Gaudi::Property< bool > m_runtimeValidation
Enabling of detailed validation checks for use during development.
pointer_type ptr()
Dereference the pointer.
bool dPhi(const xAOD::TauJet &tau, const xAOD::TauTrack &track, double &out)
SG::ReadHandleKey< TrigCompositeUtils::DecisionContainer > m_input
input decisions
virtual StatusCode sysExecute(const EventContext &ctx) override
Execute an algorithm.
ToolHandle< ILumiBlockMuTool > m_lumiBlockMuTool
#define CHECK(...)
Evaluate an expression and check for errors.
static StatusCode validateLogicalFlow(const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg, const LogicalFlowCheckMode mode)
Ensure that all DecisionIDs have propagated correctly from their parent.
static StatusCode validateDecisionIDs(const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg)
Ensure that all present IDs correspond to configured chains.
StoreGateSvc_t m_detStore
Pointer to StoreGate (detector store by default)
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Class used to describe composite objects in the HLT.
StatusCode doMonitor(const xAOD::TrigCompositeContainer *) const
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
virtual void renounce()=0
std::conditional< std::is_base_of< SG::VarHandleKeyArray, T >::value, VarHandleKeyArrayType, type2 >::type type
ElementLink implementation for ROOT usage.
const std::string & featureString()
Identifier identify() const
return the identifier
bool isChainId(const HLT::Identifier &chainIdentifier)
Recognise whether the HLT identifier corresponds to a whole chain.
StatusCode findJetSeeds(const xAOD::JetContainer *, const float, const float, std::vector< float > &, std::vector< float > &, std::vector< float > &) const
SG::ReadHandleKey< TrackCollection > m_tracksKey
xAOD::TrigComposite Decision
SG::ReadHandleKey< xAOD::JetContainer > m_jetsKey
value_type push_back(value_type pElem)
Add an element to the end of the collection.
StatusCode initialize(bool used=true)
StatusCode calculateBDT(const std::vector< HitDVSpacePoint > &, const std::vector< HitDVTrk > &, const std::vector< float > &, const std::vector< float > &, const std::vector< float > &, const float &, const int, xAOD::TrigCompositeContainer *, int &) const
SG::WriteHandleKey< xAOD::TrigCompositeContainer > m_hitDVKey
Eigen::Matrix< double, 3, 1 > Vector3D
SG::ReadCondHandleKey< LuminosityCondData > m_lumiDataKey
Gaudi::Property< bool > m_isMC
const std::string & filterNodeName()
const std::string & seedString()
std::set< DecisionID > DecisionIDContainer
StatusCode printDebugInformation(SG::WriteHandle< TrigCompositeUtils::DecisionContainer > &outputHandle, MSG::Level lvl) const
Common base function to print information on chains passed by objects considered in the hypo.
void sort(typename std::reverse_iterator< DataModel_detail::iterator< DVL > > beg, typename std::reverse_iterator< DataModel_detail::iterator< DVL > > end, const Compare &comp)
Specialization of sort for DataVector/List.
static StatusCode validateParentLinking(const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg, bool runTwoConversion)
Ensure that the Decision has at least one valid parent, unless it is a initial Decision from the HLTS...
Gaudi::Property< float > m_jetSeed_ptMin
StatusCode findSPSeeds(const EventContext &, const std::vector< HitDVSpacePoint > &, std::vector< float > &, std::vector< float > &) const
HypoBase(const std::string &name, ISvcLocator *pSvcLocator)
constructor, to be called by sub-class constructors
bool allFailed(const Decision *d)
return true if there is no positive decision stored
void decisionIDs(const Decision *d, DecisionIDContainer &destination)
Extracts DecisionIDs stored in the Decision object.
std::string name() const
reports human redable name if it is enabled or, empty string
SG::VarHandleKey & vhKey()
Return a non-const reference to the HandleKey.
SG::WriteHandleKey< TrigCompositeUtils::DecisionContainer > m_output
output decisions
virtual StatusCode sysInitialize() override
Override sysInitialize.
const std::string & roiString()
Athena::TPCnvVers::Current TrigRoiDescriptor
static StatusCode runtimeValidation(SG::WriteHandle< TrigCompositeUtils::DecisionContainer > &outputHandle, MsgStream &msg, bool onlyValidateOneStep=true, bool runTwoConversion=false)
Executes all individual runtime tests.
HLT::Identifier getIDFromLeg(const HLT::Identifier &legIdentifier)
Generate the HLT::Identifier which corresponds to the chain name from the leg name.
const T * at(size_type n) const
Access an element, as an rvalue.
Declare a monitored scalar variable.
ToolHandleArray< TrigHitDVHypoTool > m_hypoTools
StatusCode findHitDV(const EventContext &ctx, const std::vector< TrigSiSpacePointBase > &convertedSpacePoints, const DataVector< Trk::Track > &tracks, std::vector< HitDVSeed > &hitDVSeedsContainer, std::vector< HitDVTrk > &hitDVTrksContainer, std::vector< HitDVSpacePoint > &hitDVSPContainer) const
bool dEta(const xAOD::TauJet &tau, const xAOD::TauTrack &track, double &out)
DataObjIDColl m_extendedExtraObjects
Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.
static StatusCode validateHasLinks(const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg)
Ensure all Decisions have the named ElementLink graph edges which they are required to by spec.
size_type size() const noexcept
Returns the number of elements in the collection.
static void printErrorHeader(const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg)
A problem was found, print common output data.
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>
@ kRequireOne
Require all DecisionIDs to be present in at least one of my parent Decision objects.
const std::string & inputMakerNodeName()
int getSPLayer(int, float) const
unsigned int et() const
Methods that require combining results or applying scales.