From 80a37402099807535e51b4931b9deef9a373a864 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Fri, 28 Jun 2024 21:49:21 +0200
Subject: [PATCH 1/3] PersistentDataModel: Add dhFormToken to DataHeader.

Track the DhForm token in the transient DataHeader.
This is to allow skipping the key registration step
if the format has not changed.
---
 .../PersistentDataModel/DataHeader.h                   |  8 +++++++-
 Database/PersistentDataModel/src/DataHeader.cxx        | 10 ++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/Database/PersistentDataModel/PersistentDataModel/DataHeader.h b/Database/PersistentDataModel/PersistentDataModel/DataHeader.h
index a36aef566bd8..f89e6ceb23c6 100755
--- a/Database/PersistentDataModel/PersistentDataModel/DataHeader.h
+++ b/Database/PersistentDataModel/PersistentDataModel/DataHeader.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef PERSISTENTDATAMODEL_DATAHEADER_H
@@ -182,6 +182,10 @@ public: // Non-static members
    /// Add new entry to hash map
    void addHash(IStringPool* pool);
 
+   /// Form token, to be able to tell when the form changes.
+   const std::string& dhFormToken() const;
+   void setDhFormToken(const std::string& formToken);
+
    void setAttributeList(const coral::AttributeList* attrList);
    const coral::AttributeList* getAttributeList();
    void setEvtRefTokenStr(const std::string& tokenStr);
@@ -208,6 +212,8 @@ private:
    const coral::AttributeList* m_attrList;
    /// Optional Token String for Event Reference to enable writing of TAG to Payload files.
    std::string m_evtRefTokenStr;
+   /// Token to the DH format object.
+   std::string m_dhFormToken;
 };
 
 #include "AthenaKernel/CLASS_DEF.h"
diff --git a/Database/PersistentDataModel/src/DataHeader.cxx b/Database/PersistentDataModel/src/DataHeader.cxx
index 6364c3cda3be..e1f263cbf544 100755
--- a/Database/PersistentDataModel/src/DataHeader.cxx
+++ b/Database/PersistentDataModel/src/DataHeader.cxx
@@ -286,6 +286,16 @@ void DataHeader::addHash(IStringPool* pool) {
    }
 }
 //______________________________________________________________________________
+const std::string& DataHeader::dhFormToken() const
+{
+  return m_dhFormToken;
+}
+//______________________________________________________________________________
+void DataHeader::setDhFormToken(const std::string& formToken)
+{
+  m_dhFormToken = formToken;
+}
+//______________________________________________________________________________
 void DataHeader::setAttributeList(const coral::AttributeList* attrList) {
    m_attrList = attrList;
 }
-- 
GitLab


From bfc0613a32cf8e4ea4360780668a41d9c287f724 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Fri, 28 Jun 2024 21:50:33 +0200
Subject: [PATCH 2/3] PersistentDataModelTPCnv: Add dhFormToken to
 DataHeader.

Track the DhForm token in the transient	DataHeader.
This is	to allow skipping the key registration step
if the format has not changed.
---
 Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx | 3 ++-
 Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx | 1 +
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx
index c6977d5f3698..4bf905c27ebe 100755
--- a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx
+++ b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
 */
 
 /** @file DataHeaderCnv_p5.cxx
@@ -218,6 +218,7 @@ void DataHeaderCnv_p5::persToTrans(const DataHeader_p5& pers,
 {
   unsigned int entry = 1;
   const unsigned int provSize = dhForm.params(entry)[0];
+  trans.setDhFormToken (pers.dhFormToken());
   trans.m_inputDataHeader.resize(provSize);
   std::vector<DataHeaderElement>::iterator it = trans.m_inputDataHeader.begin();
   std::vector<DataHeaderElement_p5>::const_iterator pit = pers.m_dataHeader.begin();
diff --git a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx
index ddc1f18e32af..1f49396de8cb 100755
--- a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx
+++ b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx
@@ -60,6 +60,7 @@ DataHeader* DataHeaderCnv_p6::createTransient( const DataHeader_p6* pers,
                                                const Token* dhToken ) const
 {
    DataHeader* trans = new DataHeader();
+   trans->setDhFormToken (pers->dhFormToken());
    const unsigned int provSize = pers->m_provenanceSize;
    trans->m_inputDataHeader.resize(provSize);
    // DataHeaders with a self Reference at the end have the list longer by 1 element
-- 
GitLab


From 211ca57da0bc7145d8801b60a6250caf043daae4 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Fri, 28 Jun 2024 21:53:18 +0200
Subject: [PATCH 3/3] EventSelectorAthenaPool: Skip calling registerKeys
 repeatedly with the same form.

We can skip calling registerKeys() if we've seen the same DH form before.
Speeds up analysis use cases.
---
 .../src/AthenaPoolAddressProviderSvc.cxx                   | 7 ++++++-
 .../src/AthenaPoolAddressProviderSvc.h                     | 3 +++
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.cxx b/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.cxx
index c15460704973..f432433c5035 100755
--- a/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.cxx
+++ b/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.cxx
@@ -129,8 +129,14 @@ StatusCode AthenaPoolAddressProviderSvc::loadAddresses(StoreID::type storeID,
       }
       ATH_MSG_DEBUG("Created dataHeader SecondaryEventSelector");
    }
+   /// Only call registerKeys() if we haven't seen this form before.
+   bool doRegister = dataHeader->dhFormToken().empty() ||
+     m_dhFormKeys.emplace (dataHeader->dhFormToken()).second;
    ATH_MSG_DEBUG("The current Event contains: " << dataHeader->size() << " objects");
    for (const auto& element : *dataHeader) {
+      if (doRegister) {
+         EventSelectorAthenaPoolUtil::registerKeys(element, eventStore());
+      }
       SG::TransientAddress* tadd = element.getAddress();
       if (tadd->clID() == ClassID_traits<DataHeader>::ID()) { // self reference
          delete tadd; tadd = nullptr;
@@ -139,7 +145,6 @@ StatusCode AthenaPoolAddressProviderSvc::loadAddresses(StoreID::type storeID,
          tadd->setProvider(this, storeID);
          tads.push_back(tadd);
       }
-      EventSelectorAthenaPoolUtil::registerKeys(element, eventStore());
    }
    m_guid = thisFile;
    return(StatusCode::SUCCESS);
diff --git a/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.h b/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.h
index 4d0afd648ab6..b0140cba874b 100755
--- a/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.h
+++ b/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.h
@@ -18,6 +18,7 @@
 #include "PersistentDataModel/Guid.h"
 
 #include <string>
+#include <unordered_set>
 
 class IClassIDSvc;
 
@@ -56,6 +57,8 @@ private: // data
    ServiceHandle<StoreGateSvc> m_metaDataStore;
    ServiceHandle<IClassIDSvc> m_clidSvc;
    Guid m_guid;
+   /// Set of DataHeader form keys for which we've already done registerKeys.
+   std::unordered_set<std::string> m_dhFormKeys;
 
 private: // properties
    Gaudi::Property<std::string> m_dataHeaderKey{this, "DataHeaderKey", "EventSelector",
-- 
GitLab