 |
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, V, H > &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, V, H > &hndl, const SG::VarHandleKeyType &) |
| | specialization for handling Gaudi::Property<SG::VarHandleKey> More...
|
| |
| Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyArrayType &) |
| | specialization for handling Gaudi::Property<SG::VarHandleKeyArray> More...
|
| |
| Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleType &) |
| | specialization for handling Gaudi::Property<SG::VarHandleBase> More...
|
| |
| Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T, V, H > &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 508 of file TrigHitDVHypoAlg.cxx.
515 if( seeds_eta.size() != seeds_phi.size() )
return StatusCode::SUCCESS;
518 for(
unsigned int iseed=0; iseed<seeds_eta.size(); iseed++) {
520 float seed_eta = seeds_eta[iseed];
521 float seed_phi = seeds_phi[iseed];
523 ATH_MSG_VERBOSE(
"+++++ seed eta: " << seed_eta <<
", phi:" << seed_phi <<
" +++++");
527 const float DR_SQUARED_TO_REF_CUT = 0.16;
530 int n_sp_injet_usedByTrk = 0;
532 int v_n_sp_injet_usedByTrk[
N_LAYER];
533 for(
int i=0;
i<
N_LAYER;
i++) { v_n_sp_injet[
i]=0; v_n_sp_injet_usedByTrk[
i]=0; }
535 for (
const auto & spData : spsContainer ) {
537 float sp_eta = spData.eta;
538 float sp_phi = spData.phi;
539 float dR2 =
deltaR2(sp_eta,sp_phi,seed_eta,seed_phi);
540 if( dR2 > DR_SQUARED_TO_REF_CUT )
continue;
543 int sp_layer = (
int)spData.layer;
544 int sp_trkid = (
int)spData.usedTrkId;
545 bool isUsedByTrk = (sp_trkid != -1);
551 v_n_sp_injet[ilayer]++;
553 n_sp_injet_usedByTrk++;
554 v_n_sp_injet_usedByTrk[ilayer]++;
558 ATH_MSG_VERBOSE(
"nr of SPs in jet: usedByTrk / all = " << n_sp_injet_usedByTrk <<
" / " << n_sp_injet);
562 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]);
563 v_ly_sp_frac[
i] =
frac;
564 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]);
568 const float TRK_PT_GEV_CUT = 2.0;
570 unsigned int n_qtrk_injet = 0;
571 for (
const auto& trk : trksContainer ) {
572 float trk_ptGeV = trk.pt;
574 if( trk_ptGeV < TRK_PT_GEV_CUT )
continue;
575 float dR2 =
deltaR2(trk.eta,trk.phi,seed_eta,seed_phi);
576 if( dR2 > DR_SQUARED_TO_REF_CUT )
continue;
579 ATH_MSG_DEBUG(
"nr of all / quality tracks matched = " << trksContainer.size() <<
" / " << n_qtrk_injet);
582 bool isSeedOutOfRange =
false;
583 if( n_qtrk_injet == 0 ) {
584 isSeedOutOfRange =
true;
586 if( std::fabs(v_ly_sp_frac[
i]) > 1
e-3 ) {
587 isSeedOutOfRange =
false;
break;
591 float bdt_score = -2.0;
592 if( ! isSeedOutOfRange ) {
593 const std::vector<float> input_values = {
594 static_cast<float>(n_qtrk_injet),
604 if ( std::abs(seed_eta) < 1 ) {
605 bdt_score =
m_bdt_eta[0]->GetClassification(input_values);
606 }
else if ( std::abs(seed_eta) < 2 ) {
607 bdt_score =
m_bdt_eta[1]->GetClassification(input_values);
612 if( bdt_score < cutBDTthreshold )
continue;
620 dv->makePrivateStore();
624 if ( seed_type == SeedType::HLTJet ) seed_pt = seeds_pt[iseed];
625 dv->setDetail<
float>(
"hitDV_seed_pt", seed_pt);
626 dv->setDetail<
float>(
"hitDV_seed_eta", seed_eta);
627 dv->setDetail<
float>(
"hitDV_seed_phi", seed_phi);
628 dv->setDetail<
int> (
"hitDV_seed_type", seed_type);
629 dv->setDetail<
int> (
"hitDV_n_track_qual", n_qtrk_injet);
630 dv->setDetail<
float>(
"hitDV_ly0_sp_frac", v_ly_sp_frac[0]);
631 dv->setDetail<
float>(
"hitDV_ly1_sp_frac", v_ly_sp_frac[1]);
632 dv->setDetail<
float>(
"hitDV_ly2_sp_frac", v_ly_sp_frac[2]);
633 dv->setDetail<
float>(
"hitDV_ly3_sp_frac", v_ly_sp_frac[3]);
634 dv->setDetail<
float>(
"hitDV_ly4_sp_frac", v_ly_sp_frac[4]);
635 dv->setDetail<
float>(
"hitDV_ly5_sp_frac", v_ly_sp_frac[5]);
636 dv->setDetail<
float>(
"hitDV_ly6_sp_frac", v_ly_sp_frac[6]);
637 dv->setDetail<
float>(
"hitDV_ly7_sp_frac", v_ly_sp_frac[7]);
638 dv->setDetail<
float>(
"hitDV_bdt_score", bdt_score);
645 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 18 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 22 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.
459 "ly0_spfr", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_ly0_sp_frac"); });
461 "ly1_spfr", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_ly1_sp_frac"); });
463 "ly2_spfr", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_ly2_sp_frac"); });
465 "ly3_spfr", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_ly3_sp_frac"); });
467 "ly4_spfr", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_ly4_sp_frac"); });
469 "ly5_spfr", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_ly5_sp_frac"); });
471 "ly6_spfr", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_ly6_sp_frac"); });
473 "ly7_spfr", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_ly7_sp_frac"); });
475 "bdtscore", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_bdt_score"); });
477 "n_qtrk", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
int>(
"hitDV_n_track_qual"); });
480 std::vector<char> mask_eta1(dvContainer->
size(), 0);
481 std::vector<char> mask_1eta2(dvContainer->
size(), 0);
485 for (
size_t i = 0;
i<dvContainer->
size(); ++
i) {
489 if(
dv->getDetail<
int>(
"hitDV_seed_type") == SeedType::SP )
continue;
492 const float abs_eta = std::abs(
dv->getDetail<
float>(
"hitDV_seed_eta"));
493 if ( abs_eta < 1.0 ) mask_eta1[
i] = 1;
494 else if( abs_eta < 2.0 ) mask_1eta2[
i] = 1;
498 mon_ly0_spfr, mon_ly1_spfr, mon_ly2_spfr, mon_ly3_spfr,
499 mon_ly4_spfr, mon_ly5_spfr, mon_ly6_spfr, mon_ly7_spfr,
500 mon_n_qtrk, mon_bdtscore, mon_eta1_mask, mon_1eta2_mask );
502 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 1119 of file TrigHitDVHypoAlg.cxx.
1124 std::vector<int> v_dvtrk_id;
1125 std::vector<float> v_dvtrk_pt;
1126 std::vector<float> v_dvtrk_eta;
1127 std::vector<float> v_dvtrk_phi;
1128 std::vector<int> v_dvtrk_n_hits_inner;
1129 std::vector<int> v_dvtrk_n_hits_pix;
1130 std::vector<int> v_dvtrk_n_hits_sct;
1131 std::vector<float> v_dvtrk_a0beam;
1132 std::unordered_map<Identifier, int> umap_fittedTrack_identifier;
1133 int fittedTrack_id = -1;
1135 static constexpr
float TRKCUT_PTGEV_HITDV = 0.5;
1137 for (
const auto track: tracks) {
1138 float shift_x = 0;
float shift_y = 0;
1145 if (not igt) {
continue;}
1152 m =
track->measurementsOnTrack()->begin(),
1153 me =
track->measurementsOnTrack()->end ();
1154 for(;
m!=me; ++
m ) {
1156 if( prd ==
nullptr )
continue;
1158 if( umap_fittedTrack_identifier.find(id_prd) == umap_fittedTrack_identifier.end() ) {
1159 umap_fittedTrack_identifier.insert(std::make_pair(id_prd,fittedTrack_id));
1163 v_dvtrk_id.push_back(fittedTrack_id);
1165 v_dvtrk_eta.push_back(theTrackInfo.
eta);
1166 v_dvtrk_phi.push_back(
phi);
1167 v_dvtrk_n_hits_inner.push_back(theTrackInfo.
n_hits_inner);
1168 v_dvtrk_n_hits_pix.push_back(theTrackInfo.
n_hits_pix);
1169 v_dvtrk_n_hits_sct.push_back(theTrackInfo.
n_hits_sct);
1170 v_dvtrk_a0beam.push_back(theTrackInfo.
a0beam);
1172 ATH_MSG_DEBUG(
"Nr of selected tracks / all = " << fittedTrack_id <<
" / " << tracks.size());
1173 ATH_MSG_DEBUG(
"Nr of Identifiers used by selected tracks = " << umap_fittedTrack_identifier.size());
1177 int n_sp_usedByTrk = 0;
1179 std::unordered_map<Identifier, int> umap_sp_identifier;
1180 umap_sp_identifier.reserve(1.3*convertedSpacePoints.size());
1185 if( umap_sp_identifier.find(id_prd) == umap_sp_identifier.end() ) {
1186 umap_sp_identifier.insert(std::make_pair(id_prd,-1));
1191 for(
unsigned int iSp=0; iSp<convertedSpacePoints.size(); ++iSp) {
1192 bool isPix = convertedSpacePoints[iSp].isPixel();
1193 bool isSct = convertedSpacePoints[iSp].isSCT();
1194 if( !
isPix && ! isSct )
continue;
1195 const Trk::SpacePoint* sp = convertedSpacePoints[iSp].offlineSpacePoint();
1199 int n_id_usedByTrack = 0;
1200 for(
auto it=umap_sp_identifier.begin();
it!=umap_sp_identifier.end(); ++
it) {
1202 if( umap_fittedTrack_identifier.find(id_sp) != umap_fittedTrack_identifier.end() ) {
1203 umap_sp_identifier[id_sp] = umap_fittedTrack_identifier[id_sp];
1207 ATH_MSG_DEBUG(
"Nr of SPs / Identifiers (all) / Identifiers (usedByTrack) = " << convertedSpacePoints.size() <<
" / " << umap_sp_identifier.size() <<
" / " << n_id_usedByTrack);
1210 int usedTrack_id = -1;
1213 if( umap_sp_identifier.find(id_prd) != umap_sp_identifier.end() ) {
1214 usedTrack_id = umap_sp_identifier[id_prd];
1217 return usedTrack_id;
1220 std::vector<float> v_sp_eta;
1221 v_sp_eta.reserve(convertedSpacePoints.size());
1222 std::vector<float> v_sp_r;
1223 v_sp_r.reserve(convertedSpacePoints.size());
1224 std::vector<float> v_sp_phi;
1225 v_sp_phi.reserve(convertedSpacePoints.size());
1226 std::vector<int> v_sp_layer;
1227 v_sp_layer.reserve(convertedSpacePoints.size());
1228 std::vector<bool> v_sp_isPix;
1229 v_sp_isPix.reserve(convertedSpacePoints.size());
1230 std::vector<bool> v_sp_isSct;
1231 v_sp_isSct.reserve(convertedSpacePoints.size());
1232 std::vector<int> v_sp_usedTrkId;
1233 v_sp_usedTrkId.reserve(convertedSpacePoints.size());
1235 for(
const auto& sp : convertedSpacePoints) {
1236 bool isPix = sp.isPixel();
1237 bool isSct = sp.isSCT();
1238 if( !
isPix && ! isSct )
continue;
1241 int usedTrack_id = -1;
1242 int usedTrack_id_first = sp_map_used_id(osp->
clusterList().first);
1243 if (usedTrack_id_first != -1) {
1244 usedTrack_id = usedTrack_id_first;
1246 int usedTrack_id_second = sp_map_used_id(osp->
clusterList().second);
1247 if (usedTrack_id_second != -1) {
1248 usedTrack_id = usedTrack_id_second;
1253 if( usedTrack_id != -1 ) n_sp_usedByTrk++;
1254 int layer = sp.layer();
1255 float sp_r = sp.
r();
1258 float sp_eta = pos_sp.eta();
1259 float sp_phi = pos_sp.phi();
1261 v_sp_eta.push_back(sp_eta);
1262 v_sp_r.push_back(sp_r);
1263 v_sp_phi.push_back(sp_phi);
1264 v_sp_layer.push_back(
layer);
1265 v_sp_isPix.push_back(
isPix);
1266 v_sp_isSct.push_back(isSct);
1267 v_sp_usedTrkId.push_back(usedTrack_id);
1269 ATH_MSG_VERBOSE(
"+++ SP eta / phi / layer / ixPix / usedTrack_id = " << sp_eta <<
" / " << sp_phi <<
" / " <<
layer <<
" / " <<
isPix <<
" / " << usedTrack_id);
1272 ATH_MSG_DEBUG(
"Nr of SPs / all = " << n_sp <<
" / " << convertedSpacePoints.size());
1273 ATH_MSG_DEBUG(
"Nr of SPs used by selected tracks = " << n_sp_usedByTrk);
1276 std::vector<float> v_seeds_eta;
1277 std::vector<float> v_seeds_phi;
1278 std::vector<int16_t> v_seeds_type;
1283 const unsigned int L1JET_ET_CUT = 27;
1287 if (!jetRoiCollectionHandle.isValid()){
1289 return StatusCode::FAILURE;
1293 if( jetRoI ==
nullptr )
continue;
1295 if( jetRoI->
et() >= L1JET_ET_CUT ) {
1296 v_seeds_eta.push_back(jetRoI->
eta());
1297 v_seeds_phi.push_back(jetRoI->
phi());
1298 v_seeds_type.push_back(0);
1301 ATH_MSG_DEBUG(
"Nr of L1_J" << L1JET_ET_CUT <<
" seeds = " << v_seeds_eta.size());
1304 std::vector<float> v_spseeds_eta;
1305 std::vector<float> v_spseeds_phi;
1306 ATH_CHECK(
findSPSeeds(ctx, v_sp_eta, v_sp_phi, v_sp_layer, v_sp_usedTrkId, v_spseeds_eta, v_spseeds_phi) );
1308 for(
size_t idx=0;
idx<v_spseeds_eta.size(); ++
idx) {
1309 v_seeds_eta.push_back(v_spseeds_eta[
idx]);
1310 v_seeds_phi.push_back(v_spseeds_phi[
idx]);
1311 v_seeds_type.push_back(1);
1313 ATH_MSG_DEBUG(
"Nr of SP + L1_J" << L1JET_ET_CUT <<
" seeds = " << v_seeds_eta.size());
1319 const int N_MAX_SEEDS = 200;
1320 int n_seeds =
std::min(N_MAX_SEEDS,(
int)v_seeds_eta.size());
1321 hitDVSeedsContainer.reserve(n_seeds);
1322 for(
auto iSeed=0; iSeed < n_seeds; ++iSeed) {
1324 seed.eta = v_seeds_eta[iSeed];
1325 seed.phi = v_seeds_phi[iSeed];
1326 seed.type = v_seeds_type[iSeed];
1327 hitDVSeedsContainer.push_back(seed);
1331 const float TRKCUT_DELTA_R_TO_SEED = 1.0;
1332 hitDVTrksContainer.reserve(v_dvtrk_pt.size());
1333 for(
unsigned int iTrk=0; iTrk<v_dvtrk_pt.size(); ++iTrk) {
1334 float trk_eta = v_dvtrk_eta[iTrk];
1335 float trk_phi = v_dvtrk_phi[iTrk];
1337 bool isNearSeed =
false;
1338 for (
unsigned int iSeed=0; iSeed<v_seeds_eta.size(); ++iSeed) {
1339 float seed_eta = v_seeds_eta[iSeed];
1340 float seed_phi = v_seeds_phi[iSeed];
1341 float dR2 =
deltaR2(trk_eta,trk_phi,seed_eta,seed_phi);
1342 if( dR2 <= TRKCUT_DELTA_R_TO_SEED*TRKCUT_DELTA_R_TO_SEED ) { isNearSeed =
true;
break; }
1344 if( ! isNearSeed )
continue;
1347 hitDVTrk.
id = v_dvtrk_id[iTrk];
1348 hitDVTrk.
pt = v_dvtrk_pt[iTrk];
1349 hitDVTrk.
eta = v_dvtrk_eta[iTrk];
1350 hitDVTrk.
phi = v_dvtrk_phi[iTrk];
1352 hitDVTrk.
n_hits_pix = v_dvtrk_n_hits_pix[iTrk];
1353 hitDVTrk.
n_hits_sct = v_dvtrk_n_hits_sct[iTrk];
1354 hitDVTrk.
a0beam = v_dvtrk_a0beam[iTrk];
1356 hitDVTrksContainer.push_back(hitDVTrk);
1360 const float SPCUT_DELTA_R_TO_SEED = 1.0;
1361 const size_t n_sp_max = std::min<size_t>(100000, v_sp_eta.size());
1362 size_t n_sp_stored = 0;
1364 hitDVSPsContainer.reserve(n_sp_max);
1366 for(
size_t iSp=0; iSp<v_sp_eta.size(); ++iSp) {
1368 const float sp_eta = v_sp_eta[iSp];
1369 const float sp_phi = v_sp_phi[iSp];
1370 bool isNearSeed =
false;
1371 for (
size_t iSeed=0; iSeed<v_seeds_eta.size(); ++iSeed) {
1372 const float seed_eta = v_seeds_eta[iSeed];
1373 const float seed_phi = v_seeds_phi[iSeed];
1374 const float dR2 =
deltaR2(sp_eta, sp_phi, seed_eta, seed_phi);
1375 if( dR2 <= SPCUT_DELTA_R_TO_SEED*SPCUT_DELTA_R_TO_SEED ) { isNearSeed =
true;
break; }
1377 if( ! isNearSeed )
continue;
1379 if( n_sp_stored >= n_sp_max )
break;
1381 hitDVSP.
eta = v_sp_eta[iSp];
1382 hitDVSP.
r = v_sp_r[iSp];
1383 hitDVSP.
phi = v_sp_phi[iSp];
1384 hitDVSP.
layer = v_sp_layer[iSp];
1385 hitDVSP.
isPix = v_sp_isPix[iSp];
1386 hitDVSP.
isSct = v_sp_isSct[iSp];
1387 hitDVSP.
usedTrkId = v_sp_usedTrkId[iSp];
1388 hitDVSPsContainer.push_back(hitDVSP);
1393 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 651 of file TrigHitDVHypoAlg.cxx.
654 std::vector<float> mnt_jet_pt;
655 std::vector<float> mnt_jet_eta;
660 ATH_MSG_VERBOSE(
"looking for jet seed with pt cut=" << cutJetPt <<
", eta cut=" << cutJetEta);
663 if( jet_pt < cutJetPt ) {
667 mnt_jet_pt.push_back(jet_pt);
668 float jet_eta =
static_cast<float>(
jet->eta());
669 mnt_jet_eta.push_back(jet_eta);
670 if( std::fabs(jet_eta) > cutJetEta ) {
674 float jet_phi =
static_cast<float>(
jet->phi());
675 jetSeeds_pt.push_back(jet_pt);
676 jetSeeds_eta.push_back(jet_eta);
677 jetSeeds_phi.push_back(
jet_phi);
681 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 687 of file TrigHitDVHypoAlg.cxx.
693 const int NBINS_ETA = 50;
694 const float ETA_MIN = -2.5;
695 const float ETA_MAX = 2.5;
697 const int NBINS_PHI = 80;
698 const float PHI_MIN = -4.0;
699 const float PHI_MAX = 4.0;
703 unsigned int slotnr = ctx.slot();
704 unsigned int subSlotnr = ctx.subSlot();
706 sprintf(
hname,
"hitdv_s%u_ss%u_ly6_h2_nsp",slotnr,subSlotnr);
707 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);
708 sprintf(
hname,
"hitdv_s%u_ss%u_ly7_h2_nsp",slotnr,subSlotnr);
709 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);
711 sprintf(
hname,
"hitdv_s%u_ss%u_ly6_h2_nsp_notrk",slotnr,subSlotnr);
712 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);
713 sprintf(
hname,
"hitdv_s%u_ss%u_ly7_h2_nsp_notrk",slotnr,subSlotnr);
714 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);
716 for (
const auto& spData : spsContainer ) {
717 int16_t sp_layer = spData.layer;
718 float sp_eta = spData.eta;
720 if( ilayer<6 )
continue;
722 int sp_trkid = (
int)spData.usedTrkId;
723 bool isUsedByTrk = (sp_trkid != -1);
724 float sp_phi = spData.phi;
726 bool fill_out_of_pi =
false;
729 sp_phi2 = 2*TMath::Pi() + sp_phi;
730 if( sp_phi2 < PHI_MAX ) fill_out_of_pi =
true;
733 sp_phi2 = -2*TMath::Pi() + sp_phi;
734 if( PHI_MIN < sp_phi2 ) fill_out_of_pi =
true;
737 ly6_h2_nsp->Fill(sp_eta,sp_phi);
738 if( fill_out_of_pi ) ly6_h2_nsp->Fill(sp_eta,sp_phi2);
739 if( ! isUsedByTrk ) ly6_h2_nsp_notrk->Fill(sp_eta,sp_phi);
740 if( ! isUsedByTrk && fill_out_of_pi) ly6_h2_nsp_notrk->Fill(sp_eta,sp_phi2);
743 ly7_h2_nsp->Fill(sp_eta,sp_phi);
744 if( fill_out_of_pi ) ly7_h2_nsp->Fill(sp_eta,sp_phi2);
745 if( ! isUsedByTrk ) ly7_h2_nsp_notrk->Fill(sp_eta,sp_phi);
746 if( ! isUsedByTrk && fill_out_of_pi) ly7_h2_nsp_notrk->Fill(sp_eta,sp_phi2);
753 std::vector<std::tuple<int,float,float,float>> QT;
755 for(
int ly6_ieta=1; ly6_ieta<=NBINS_ETA; ly6_ieta++) {
756 float ly6_eta = (ly6_h2_nsp->GetXaxis()->GetBinLowEdge(ly6_ieta) + ly6_h2_nsp->GetXaxis()->GetBinUpEdge(ly6_ieta))/2.0;
757 for(
int ly6_iphi=1; ly6_iphi<=NBINS_PHI; ly6_iphi++) {
758 float ly6_phi = (ly6_h2_nsp->GetYaxis()->GetBinLowEdge(ly6_iphi) + ly6_h2_nsp->GetYaxis()->GetBinUpEdge(ly6_iphi))/2.0;
760 float ly6_nsp = ly6_h2_nsp ->GetBinContent(ly6_ieta,ly6_iphi);
761 float ly6_nsp_notrk = ly6_h2_nsp_notrk->GetBinContent(ly6_ieta,ly6_iphi);
762 float ly6_frac = ( ly6_nsp > 0 ) ? ly6_nsp_notrk / ly6_nsp : 0;
763 if( ly6_nsp < 10 || ly6_frac < 0.85 )
continue;
765 float ly7_frac_max = 0;
766 float ly7_eta_max = 0;
767 float ly7_phi_max = 0;
768 for(
int ly7_ieta=
std::max(1,ly6_ieta-1); ly7_ieta<
std::min(NBINS_ETA,ly6_ieta+1); ly7_ieta++) {
769 for(
int ly7_iphi=
std::max(1,ly6_iphi-1); ly7_iphi<=
std::min(NBINS_PHI,ly6_iphi+1); ly7_iphi++) {
770 float ly7_nsp = ly7_h2_nsp ->GetBinContent(ly7_ieta,ly7_iphi);
771 float ly7_nsp_notrk = ly7_h2_nsp_notrk->GetBinContent(ly7_ieta,ly7_iphi);
772 float ly7_frac = ( ly7_nsp > 0 ) ? ly7_nsp_notrk / ly7_nsp : 0;
773 if( ly7_nsp < 10 )
continue;
774 if( ly7_frac > ly7_frac_max ) {
775 ly7_frac_max = ly7_frac;
776 ly7_eta_max = (ly7_h2_nsp->GetXaxis()->GetBinLowEdge(ly7_ieta) + ly7_h2_nsp->GetXaxis()->GetBinUpEdge(ly7_ieta))/2.0;
777 ly7_phi_max = (ly7_h2_nsp->GetXaxis()->GetBinLowEdge(ly7_iphi) + ly7_h2_nsp->GetXaxis()->GetBinUpEdge(ly7_iphi))/2.0;
781 if( ly7_frac_max < 0.85 )
continue;
783 float wsum = ly6_frac + ly7_frac_max;
784 float weta = (ly6_eta*ly6_frac + ly7_eta_max*ly7_frac_max) / wsum;
785 float wphi = (ly6_phi*ly6_frac + ly7_phi_max*ly7_frac_max) / wsum;
786 float w = wsum / 2.0;
787 QT.push_back(std::make_tuple(-1,
w,weta,wphi));
790 ATH_MSG_VERBOSE(
"nr of ly6/ly7 doublet candidate seeds=" << QT.size() <<
", doing clustering...");
794 [](
const std::tuple<int,float,float,float>& lhs,
const std::tuple<int,float,float,float>& rhs) {
795 return std::get<1>(lhs) > std::get<1>(rhs); } );
798 const double CLUSTCUT_DIST_SQUARED = 0.04;
799 const double CLUSTCUT_SEED_FRAC = 0.9;
801 std::vector<float> seeds_wsum;
803 for(
unsigned int i=0;
i<QT.size();
i++) {
804 float phi = std::get<3>(QT[
i]);
805 float eta = std::get<2>(QT[
i]);
806 float w = std::get<1>(QT[
i]);
808 seeds_eta.push_back(
w*
eta); seeds_phi.push_back(
w*
phi);
809 seeds_wsum.push_back(
w);
812 const int IDX_INITIAL = 100;
813 float dist2_min = 100.0;
815 for(
unsigned j=0; j<seeds_eta.size(); j++) {
816 float ceta = seeds_eta[j]/seeds_wsum[j];
817 float cphi = seeds_phi[j]/seeds_wsum[j];
819 float deta = std::fabs(ceta-
eta);
820 float dphi = std::fabs(cphi-
phi);
821 float dist2 = dphi*dphi+deta*deta;
822 if( dist2 < dist2_min ) {
827 int match_idx = IDX_INITIAL;
829 if( dist2_min < CLUSTCUT_DIST_SQUARED ) { match_idx =
idx_min; }
831 if( match_idx == IDX_INITIAL ) {
832 if(
w > CLUSTCUT_SEED_FRAC && dist2_min > CLUSTCUT_DIST_SQUARED ) {
833 seeds_eta.push_back(
w*
eta); seeds_phi.push_back(
w*
phi);
834 seeds_wsum.push_back(
w);
838 float new_eta = seeds_eta[match_idx] +
w*
eta;
839 float new_phi = seeds_phi[match_idx] +
w*
phi;
840 float new_wsum = seeds_wsum[match_idx] +
w;
841 seeds_eta[match_idx] = new_eta;
842 seeds_phi[match_idx] = new_phi;
843 seeds_wsum[match_idx] = new_wsum;
846 for(
unsigned int i=0;
i<seeds_eta.size();
i++) {
847 float eta = seeds_eta[
i] / seeds_wsum[
i];
848 float phi = seeds_phi[
i] / seeds_wsum[
i];
851 if(
phi < -TMath::Pi() )
phi = 2*TMath::Pi() +
phi;
852 if(
phi > TMath::Pi() )
phi = -2*TMath::Pi() +
phi;
855 ATH_MSG_VERBOSE(
"after clustering, nr of seeds = " << seeds_eta.size());
858 std::vector<unsigned int> idx_to_delete;
859 for(
unsigned int i=0;
i<seeds_eta.size();
i++) {
860 if(
std::find(idx_to_delete.begin(),idx_to_delete.end(),
i) != idx_to_delete.end() )
continue;
861 float eta_i = seeds_eta[
i];
862 float phi_i = seeds_phi[
i];
863 for(
unsigned int j=
i+1; j<seeds_eta.size(); j++) {
864 if(
std::find(idx_to_delete.begin(),idx_to_delete.end(),j) != idx_to_delete.end() )
continue;
865 float eta_j = seeds_eta[j];
866 float phi_j = seeds_phi[j];
867 float dR2 =
deltaR2(eta_i,phi_i,eta_j,phi_j);
868 if( dR2 < CLUSTCUT_DIST_SQUARED ) idx_to_delete.push_back(j);
871 ATH_MSG_VERBOSE(
"nr of duplicated seeds to be removed = " << idx_to_delete.size());
872 if( idx_to_delete.size() > 0 ) {
873 std::sort(idx_to_delete.begin(),idx_to_delete.end());
874 for(
unsigned int j=idx_to_delete.size(); j>0; j--) {
875 unsigned int idx = idx_to_delete[j-1];
876 seeds_eta.erase(seeds_eta.begin()+
idx);
877 seeds_phi.erase(seeds_phi.begin()+
idx);
884 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 920 of file TrigHitDVHypoAlg.cxx.
925 const int NBINS_ETA = 50;
926 const float ETA_MIN = -2.5;
927 const float ETA_MAX = 2.5;
929 const int NBINS_PHI = 80;
930 const float PHI_MIN = -4.0;
931 const float PHI_MAX = 4.0;
935 unsigned int slotnr = ctx.slot();
936 unsigned int subSlotnr = ctx.subSlot();
938 sprintf(
hname,
"ftf_s%u_ss%u_ly6_h2_nsp",slotnr,subSlotnr);
939 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);
940 sprintf(
hname,
"ftf_s%u_ss%u_ly7_h2_nsp",slotnr,subSlotnr);
941 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);
943 sprintf(
hname,
"ftf_s%u_ss%u_ly6_h2_nsp_notrk",slotnr,subSlotnr);
944 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);
945 sprintf(
hname,
"ftf_s%u_ss%u_ly7_h2_nsp_notrk",slotnr,subSlotnr);
946 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);
948 for(
unsigned int iSeed=0; iSeed<v_sp_eta.size(); ++iSeed) {
950 int sp_layer = v_sp_layer[iSeed];
951 float sp_eta = v_sp_eta[iSeed];
953 if( ilayer<6 )
continue;
955 int sp_trkid = v_sp_usedTrkId[iSeed];
956 bool isUsedByTrk = (sp_trkid != -1);
957 float sp_phi = v_sp_phi[iSeed];
959 bool fill_out_of_pi =
false;
962 sp_phi2 = 2*TMath::Pi() + sp_phi;
963 if( sp_phi2 < PHI_MAX ) fill_out_of_pi =
true;
966 sp_phi2 = -2*TMath::Pi() + sp_phi;
967 if( PHI_MIN < sp_phi2 ) fill_out_of_pi =
true;
970 ly6_h2_nsp->Fill(sp_eta,sp_phi);
971 if( fill_out_of_pi ) ly6_h2_nsp->Fill(sp_eta,sp_phi2);
972 if( ! isUsedByTrk ) ly6_h2_nsp_notrk->Fill(sp_eta,sp_phi);
973 if( ! isUsedByTrk && fill_out_of_pi) ly6_h2_nsp_notrk->Fill(sp_eta,sp_phi2);
976 ly7_h2_nsp->Fill(sp_eta,sp_phi);
977 if( fill_out_of_pi ) ly7_h2_nsp->Fill(sp_eta,sp_phi2);
978 if( ! isUsedByTrk ) ly7_h2_nsp_notrk->Fill(sp_eta,sp_phi);
979 if( ! isUsedByTrk && fill_out_of_pi) ly7_h2_nsp_notrk->Fill(sp_eta,sp_phi2);
986 std::vector<std::tuple<int,float,float,float>> QT;
988 for(
int ly6_ieta=1; ly6_ieta<=NBINS_ETA; ly6_ieta++) {
989 float ly6_eta = (ly6_h2_nsp->GetXaxis()->GetBinLowEdge(ly6_ieta) + ly6_h2_nsp->GetXaxis()->GetBinUpEdge(ly6_ieta))/2.0;
990 for(
int ly6_iphi=1; ly6_iphi<=NBINS_PHI; ly6_iphi++) {
991 float ly6_phi = (ly6_h2_nsp->GetYaxis()->GetBinLowEdge(ly6_iphi) + ly6_h2_nsp->GetYaxis()->GetBinUpEdge(ly6_iphi))/2.0;
993 float ly6_nsp = ly6_h2_nsp ->GetBinContent(ly6_ieta,ly6_iphi);
994 float ly6_nsp_notrk = ly6_h2_nsp_notrk->GetBinContent(ly6_ieta,ly6_iphi);
995 float ly6_frac = ( ly6_nsp > 0 ) ? ly6_nsp_notrk / ly6_nsp : 0;
996 if( ly6_nsp < 10 || ly6_frac < 0.85 )
continue;
998 float ly7_frac_max = 0;
999 float ly7_eta_max = 0;
1000 float ly7_phi_max = 0;
1001 for(
int ly7_ieta=
std::max(1,ly6_ieta-1); ly7_ieta<
std::min(NBINS_ETA,ly6_ieta+1); ly7_ieta++) {
1002 for(
int ly7_iphi=
std::max(1,ly6_iphi-1); ly7_iphi<=
std::min(NBINS_PHI,ly6_iphi+1); ly7_iphi++) {
1003 float ly7_nsp = ly7_h2_nsp ->GetBinContent(ly7_ieta,ly7_iphi);
1004 float ly7_nsp_notrk = ly7_h2_nsp_notrk->GetBinContent(ly7_ieta,ly7_iphi);
1005 float ly7_frac = ( ly7_nsp > 0 ) ? ly7_nsp_notrk / ly7_nsp : 0;
1006 if( ly7_nsp < 10 )
continue;
1007 if( ly7_frac > ly7_frac_max ) {
1008 ly7_frac_max = ly7_frac;
1009 ly7_eta_max = (ly7_h2_nsp->GetXaxis()->GetBinLowEdge(ly7_ieta) + ly7_h2_nsp->GetXaxis()->GetBinUpEdge(ly7_ieta))/2.0;
1010 ly7_phi_max = (ly7_h2_nsp->GetXaxis()->GetBinLowEdge(ly7_iphi) + ly7_h2_nsp->GetXaxis()->GetBinUpEdge(ly7_iphi))/2.0;
1014 if( ly7_frac_max < 0.85 )
continue;
1016 float wsum = ly6_frac + ly7_frac_max;
1017 float weta = (ly6_eta*ly6_frac + ly7_eta_max*ly7_frac_max) / wsum;
1018 float wphi = (ly6_phi*ly6_frac + ly7_phi_max*ly7_frac_max) / wsum;
1019 float w = wsum / 2.0;
1020 QT.push_back(std::make_tuple(-1,
w,weta,wphi));
1023 ATH_MSG_VERBOSE(
"nr of ly6/ly7 doublet candidate seeds=" << QT.size() <<
", doing clustering...");
1027 [](
const std::tuple<int,float,float,float>& lhs,
const std::tuple<int,float,float,float>& rhs) {
1028 return std::get<1>(lhs) > std::get<1>(rhs); } );
1031 const double CLUSTCUT_DIST_SQUARED = 0.04;
1032 const double CLUSTCUT_SEED_FRAC = 0.9;
1034 std::vector<float> seeds_wsum;
1036 for(
unsigned int i=0;
i<QT.size();
i++) {
1037 float phi = std::get<3>(QT[
i]);
1038 float eta = std::get<2>(QT[
i]);
1039 float w = std::get<1>(QT[
i]);
1041 seeds_eta.push_back(
w*
eta); seeds_phi.push_back(
w*
phi);
1042 seeds_wsum.push_back(
w);
1045 const int IDX_INITIAL = 100;
1046 float dist2_min = 100.0;
1048 for(
unsigned j=0; j<seeds_eta.size(); j++) {
1049 float ceta = seeds_eta[j]/seeds_wsum[j];
1050 float cphi = seeds_phi[j]/seeds_wsum[j];
1052 float deta = std::fabs(ceta-
eta);
1053 float dphi = std::fabs(cphi-
phi);
1054 float dist2 = dphi*dphi+deta*deta;
1055 if( dist2 < dist2_min ) {
1060 int match_idx = IDX_INITIAL;
1061 if(
idx_min != IDX_INITIAL ) {
1062 if( dist2_min < CLUSTCUT_DIST_SQUARED ) { match_idx =
idx_min; }
1064 if( match_idx == IDX_INITIAL ) {
1065 if(
w > CLUSTCUT_SEED_FRAC && dist2_min > CLUSTCUT_DIST_SQUARED ) {
1066 seeds_eta.push_back(
w*
eta); seeds_phi.push_back(
w*
phi);
1067 seeds_wsum.push_back(
w);
1071 float new_eta = seeds_eta[match_idx] +
w*
eta;
1072 float new_phi = seeds_phi[match_idx] +
w*
phi;
1073 float new_wsum = seeds_wsum[match_idx] +
w;
1074 seeds_eta[match_idx] = new_eta;
1075 seeds_phi[match_idx] = new_phi;
1076 seeds_wsum[match_idx] = new_wsum;
1079 for(
unsigned int i=0;
i<seeds_eta.size();
i++) {
1080 float eta = seeds_eta[
i] / seeds_wsum[
i];
1081 float phi = seeds_phi[
i] / seeds_wsum[
i];
1083 if(
phi < -TMath::Pi() )
phi = 2*TMath::Pi() +
phi;
1084 if(
phi > TMath::Pi() )
phi = -2*TMath::Pi() +
phi;
1087 ATH_MSG_VERBOSE(
"after clustering, nr of seeds = " << seeds_eta.size());
1090 std::vector<unsigned int> idx_to_delete;
1091 for(
unsigned int i=0;
i<seeds_eta.size();
i++) {
1092 if(
std::find(idx_to_delete.begin(),idx_to_delete.end(),
i) != idx_to_delete.end() )
continue;
1093 float eta_i = seeds_eta[
i];
1094 float phi_i = seeds_phi[
i];
1095 for(
unsigned int j=
i+1; j<seeds_eta.size(); j++) {
1096 if(
std::find(idx_to_delete.begin(),idx_to_delete.end(),j) != idx_to_delete.end() )
continue;
1097 float eta_j = seeds_eta[j];
1098 float phi_j = seeds_phi[j];
1099 float dR2 =
deltaR2(eta_i,phi_i,eta_j,phi_j);
1100 if( dR2 < CLUSTCUT_DIST_SQUARED ) idx_to_delete.push_back(j);
1103 ATH_MSG_VERBOSE(
"nr of duplicated seeds to be removed = " << idx_to_delete.size());
1104 if( idx_to_delete.size() > 0 ) {
1105 std::sort(idx_to_delete.begin(),idx_to_delete.end());
1106 for(
unsigned int j=idx_to_delete.size(); j>0; j--) {
1107 unsigned int idx = idx_to_delete[j-1];
1108 seeds_eta.erase(seeds_eta.begin()+
idx);
1109 seeds_phi.erase(seeds_phi.begin()+
idx);
1116 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 35 of file HypoBase.cxx.
43 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 390 of file HypoBase.cxx.
391 msg << MSG::ERROR <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" <<
endmsg;
◆ printDebugInformation()
Common base function to print information on chains passed by objects considered in the hypo.
Definition at line 406 of file HypoBase.cxx.
409 msg() <<
"Exiting with " << outputHandle->
size() <<
" Decision objects" <<
endmsg;
414 msg() <<
"Number of positive decisions for Decision object #" <<
count++ <<
": " << objDecisions.size() <<
endmsg;
420 return StatusCode::SUCCESS;
◆ printErrorHeader()
A problem was found, print common output data.
Definition at line 395 of file HypoBase.cxx.
399 msg << MSG::ERROR <<
"! RUNTIME TRIGGER NAVIGATION VALIDATION ERROR" <<
endmsg;
400 msg << MSG::ERROR <<
"! Caused by Decision with index:" << (*dEL)->index() <<
endmsg;
402 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 71 of file HypoBase.cxx.
78 if (onlyValidateOneStep && callDepth > 0) {
82 return StatusCode::SUCCESS;
90 return StatusCode::FAILURE;
95 return StatusCode::FAILURE;
101 return StatusCode::FAILURE;
104 return StatusCode::FAILURE;
109 return StatusCode::FAILURE;
112 return StatusCode::FAILURE;
118 if (fullyExploredFrom.count( (*seed) ) == 1) {
121 if ( not
seed.isValid() ) {
122 msg << MSG::ERROR <<
"Invalid seed element link in recursiveValidateGraph" <<
endmsg;
123 return StatusCode::FAILURE;
125 if (
recursiveValidateGraph(seed,
msg, onlyValidateOneStep, runTwoConversion, callDepth + 1, fullyExploredFrom).isFailure() ) {
126 return StatusCode::FAILURE;
130 fullyExploredFrom.insert( *dEL );
131 return StatusCode::SUCCESS;
◆ renounce()
◆ renounceArray()
◆ runtimeValidation()
Executes all individual runtime tests.
Definition at line 47 of file HypoBase.cxx.
53 std::set<const Decision*> fullyExploredFrom;
58 msg << MSG::ERROR <<
"Invalid seed element link in recursiveValidateGraph" <<
endmsg;
59 return StatusCode::FAILURE;
64 return StatusCode::FAILURE;
67 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 890 of file TrigHitDVHypoAlg.cxx.
893 std::vector<unsigned int> idx_to_delete;
894 for(
unsigned int idx=0;
idx<jetSeeds_eta.size(); ++
idx) {
895 const float DR_SQUARED_CUT_TO_FTFSEED = 0.09;
896 float eta = jetSeeds_eta[
idx];
897 float phi = jetSeeds_phi[
idx];
899 for (
const auto& seed : hitDVSeedsContainer ) {
901 if( dR2 < dR2min ) dR2min = dR2;
903 if( dR2min > DR_SQUARED_CUT_TO_FTFSEED ) idx_to_delete.push_back(
idx);
905 if( idx_to_delete.size() > 0 ) {
906 std::sort(idx_to_delete.begin(),idx_to_delete.end());
907 for(
unsigned int j=idx_to_delete.size(); j>0; j--) {
908 unsigned int idx = idx_to_delete[j-1];
909 jetSeeds_eta.erase(jetSeeds_eta.begin()+
idx);
910 jetSeeds_phi.erase(jetSeeds_phi.begin()+
idx);
911 if( jetSeeds_pt.size() > 0 ) jetSeeds_pt.erase(jetSeeds_pt.begin()+
idx);
914 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 209 of file HypoBase.cxx.
219 msg << MSG::ERROR <<
"! Decision contains an ID which does not correspond to a configured chain or a configured chain-leg: " <<
HLT::Identifier(
id ) <<
endmsg;
220 msg << MSG::ERROR <<
"! SOLUTION: Locate the producer of the collection, investigate how this bad ID could have been added." <<
endmsg;
222 return StatusCode::FAILURE;
225 return StatusCode::SUCCESS;
◆ validateDuplicatedDecisionID()
Ensure that no space is being wasted by duplicated DecisionIDs in any Decision objects.
Definition at line 229 of file HypoBase.cxx.
235 if (decisionIDSet.size() != (*dEL)->decisions().size()) {
237 msg << MSG::ERROR <<
"! Decision contains duplicate DecisionIDs." <<
endmsg;
238 msg << MSG::ERROR <<
"! SOLUTION: If combining DecisionIDs from multiple parents, de-duplicate the internal std::vector<DecisionID> of 'Decision* d' with:" <<
endmsg;
239 msg << MSG::ERROR <<
"! TrigCompositeUtils::insertDecisionIDs(DecisionIDContainer(), d);" <<
endmsg;
241 return StatusCode::FAILURE;
243 return StatusCode::SUCCESS;
◆ validateHasLinks()
Ensure all Decisions have the named ElementLink graph edges which they are required to by spec.
Definition at line 338 of file HypoBase.cxx.
341 const std::string&
name = (*dEL)->name();
346 return StatusCode::SUCCESS;
350 msg << MSG::ERROR <<
"! Every Decision created by a HypoAlg must correspond to some physics object, and be linked to the object." <<
endmsg;
351 msg << MSG::ERROR <<
"! SOLUTION: Ensure that all produced Decision objects are assigned their feature:" <<
endmsg;
352 msg << MSG::ERROR <<
"! SOLUTION: decision->setObjectLink<MY_FEATURE_CONTANER_TYPE>(featureString(), MY_FEATURE_ELEMENT_LINK);" <<
endmsg;
354 return StatusCode::FAILURE;
360 if ((*dEL)->hasDetail<int32_t>(
"isEmpty") and (*dEL)->getDetail<int32_t>(
"isEmpty") == 1) {
364 if (not (*dEL)->hasObjectLink(
roiString() ) and not exempt) {
366 msg << MSG::ERROR <<
"! Decision has no '" <<
roiString() <<
"' ElementLink." <<
endmsg;
367 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;
368 msg << MSG::ERROR <<
"! It can be the FullScan ROI created by the HLTSeeding (FSNOSEED) if no other suitable ROI exists." <<
endmsg;
369 msg << MSG::ERROR <<
"! SOLUTION: Check the configuration of InputMakerForRoI or EventViewCreatorAlgorithm responsible for creating this Decision Object" <<
endmsg;
370 msg << MSG::ERROR <<
"! SOLUTION: The algorithm must have an ROITool which must attach an '"<<
roiString() <<
"' link to each Decision Object" <<
endmsg;
379 msg << MSG::ERROR <<
"! Every Decision created by the HLTSeeding must link to the initial ROI which caused it to be created." <<
endmsg;
380 msg << MSG::ERROR <<
"! This includes the Decision Object created to represent the Full-Scan/NoSeed (FSNOSEED) ROI." <<
endmsg;
381 msg << MSG::ERROR <<
"! SOLUTION: Check the configuration of the HLTSeeding tool responsible for creating this Decision Object" <<
endmsg;
386 return StatusCode::SUCCESS;
◆ validateLogicalFlow()
Ensure that all DecisionIDs have propagated correctly from their parent.
Definition at line 247 of file HypoBase.cxx.
253 return StatusCode::SUCCESS;
262 size_t parentsWithDecision = 0;
264 if ( not
seed.isValid() ) {
265 msg << MSG::ERROR <<
"Invalid seed element link in recursiveValidateGraph" <<
endmsg;
266 return StatusCode::FAILURE;
274 ++parentsWithDecision;
277 for (
auto sid: seedIDSet){
279 ++parentsWithDecision;
290 msg << MSG::ERROR <<
"! This Decision object is not respecting logical flow of DecisionIDs for chain: " <<
HLT::Identifier(
id ) <<
endmsg;
291 msg << MSG::ERROR <<
"! This chain's DecisionID can not be found in any parents of this Decision object:" <<
endmsg;
294 msg << MSG::ERROR <<
"! Index:" << (*seed)->index() <<
" from collection:" <<
seed.dataID() <<
endmsg;
303 msg << MSG::ERROR <<
"! SOLUTION: Ensure that the producer of this Decision object only adds DecisionIDs"
304 " which were present in at least one of its parents." <<
endmsg;
306 return StatusCode::FAILURE;
307 }
else if (
mode ==
kRequireAll && parentsWithDecision != seeds.size()) {
314 msg << MSG::ERROR <<
"! This Decision object is not respecting logical flow of DecisionIDs for chain: " <<
HLT::Identifier(
id ) <<
endmsg;
315 msg << MSG::ERROR <<
"! As this Decision object represents the output of a HypoAlg, it must respect logical flow on all "
316 << seeds.size() <<
" of its parent(s):" <<
endmsg;
319 msg << MSG::ERROR <<
"! Index:" << (*seed)->index() <<
" from collection:" <<
seed.dataID() <<
endmsg;
328 msg << MSG::ERROR <<
"! SOLUTION: Ensure that the HypoTool responsible for " <<
HLT::Identifier(
id )
329 <<
" in this HypoAlg only runs if this ID is present in all parent decisions." <<
endmsg;
331 return StatusCode::FAILURE;
334 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 135 of file HypoBase.cxx.
141 const std::string&
name = (*dEL)->name();
144 msg << MSG::ERROR <<
"! Decision has zero parents. This is only allowed for the initial Decisions created by the HLTSeeding." <<
endmsg;
145 msg << MSG::ERROR <<
"! SOLUTION: Attach parent Decision(s) with TrigCompositeUtils::linkToPrevious" <<
endmsg;
147 return StatusCode::FAILURE;
151 if (seeds.size() > 0) {
153 msg << MSG::ERROR <<
"! Decision has parents. This is not allowed for the initial Decisions created by the HLTSeeding." <<
endmsg;
154 msg << MSG::ERROR <<
"! SOLUTION: Check HLTSeeding, no where should it be adding a parent link." <<
endmsg;
156 return StatusCode::FAILURE;
158 return StatusCode::SUCCESS;
162 static const std::set<std::string> expectedParentsInputMaker = {
filterNodeName()};
168 const std::set<std::string>* expectedParentsPtr =
nullptr;
170 expectedParentsPtr = &expectedParentsFilter;
172 expectedParentsPtr = &expectedParentsInputMaker;
174 expectedParentsPtr = &expectedParentsFilter;
176 expectedParentsPtr = &expectedParentsHypoAlg;
178 expectedParentsPtr = &expectedParentsComboHypoAlg;
180 expectedParentsPtr = &expectedParentsSummaryFilter;
182 expectedParentsPtr = &expectedParentsSummaryPassed;
185 msg << MSG::ERROR <<
"! Invalid Node name '" <<
name <<
"'." <<
endmsg;
186 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;
188 return StatusCode::FAILURE;
192 if (!expectedParentsPtr->contains( (*seed)->name() )) {
194 msg << MSG::ERROR <<
"! Invalid linking from node with name '" <<
name <<
"' to one with name '"<< (*seed)->name() <<
"'." <<
endmsg;
195 msg << MSG::ERROR <<
"! Allowed seed names are:" <<
endmsg;
196 for (
const std::string& allowed : *expectedParentsPtr) {
197 msg << MSG::ERROR <<
"! " << allowed <<
endmsg;
199 msg << MSG::ERROR <<
"! SOLUTION: Find where this invalid parent was added and correct it." <<
endmsg;
201 return StatusCode::FAILURE;
205 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
const std::string & featureString()
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
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
const std::string & summaryFilterNodeName()
T wrapToPi(T phi)
Wrap angle in radians to [-pi, pi].
SG::ReadHandleKey< xAOD::jFexSRJetRoIContainer > m_jetRoiCollectionKey
const std::string & summaryPassNodeName()
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()
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).
bool dPhi(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, float &out)
SG::WriteHandle< DecisionContainer > createAndStore(const SG::WriteHandleKey< DecisionContainer > &key, const EventContext &ctx)
Creates and right away records the DecisionContainer with the key.
const std::string & roiString()
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.
bool dEta(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, float &out)
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())
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>
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
const std::string & filterNodeName()
static StatusCode validateDuplicatedDecisionID(const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg)
Ensure that no space is being wasted by duplicated DecisionIDs in any Decision objects.
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.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
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.
const std::string & initialRoIString()
StatusCode doMonitor(const xAOD::TrigCompositeContainer *) const
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
const std::string & hltSeedingNodeName()
virtual void renounce()=0
std::conditional< std::is_base_of< SG::VarHandleKeyArray, T >::value, VarHandleKeyArrayType, type2 >::type type
ElementLink implementation for ROOT usage.
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
const std::string & seedString()
SG::ReadCondHandleKey< LuminosityCondData > m_lumiDataKey
Gaudi::Property< bool > m_isMC
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
const std::string & hypoAlgNodeName()
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
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.
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
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.
const std::string & inputMakerNodeName()
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.
@ kRequireOne
Require all DecisionIDs to be present in at least one of my parent Decision objects.
int getSPLayer(int, float) const
unsigned int et() const
Methods that require combining results or applying scales.