From 5af6fbb24308fb16bb5737569c70febebb2ed92c Mon Sep 17 00:00:00 2001
From: Tim Martin <Tim.Martin@cern.ch>
Date: Thu, 18 Jun 2020 12:00:37 +0200
Subject: [PATCH] Pick EDM updates from triggerJsonPayload branch

---
 Event/xAOD/xAODTrigger/CMakeLists.txt         |   2 +-
 .../Root/TriggerMenuJsonAuxContainer_v1.cxx   |  19 +++
 .../xAODTrigger/Root/TriggerMenuJson_v1.cxx   |  48 +++++++
 .../xAODTrigger/Root/compileVersionless.cxx   |   3 +
 .../Root/dict/ContainerProxies.cxx            |   4 +-
 .../xAODTrigger/Root/xAODTriggerCLIDs.cxx     |   2 +
 .../xAODTrigger/xAODTrigger/TriggerMenuJson.h |  18 +++
 .../xAODTrigger/TriggerMenuJsonAuxContainer.h |  23 ++++
 .../xAODTrigger/TriggerMenuJsonContainer.h    |  29 ++++
 .../xAODTrigger/xAODTrigger/selection.xml     |  12 ++
 .../versions/TriggerMenuJsonAuxContainer_v1.h |  56 ++++++++
 .../versions/TriggerMenuJsonContainer_v1.h    |  21 +++
 .../xAODTrigger/versions/TriggerMenuJson_v1.h |  61 +++++++++
 .../xAODTrigger/xAODTrigger/xAODTriggerDict.h |   8 ++
 .../xAOD/xAODTriggerAthenaPool/CMakeLists.txt |   2 +
 .../xAODTriggerMenuJsonAuxContainerCnv.cxx    |  20 +++
 .../src/xAODTriggerMenuJsonAuxContainerCnv.h  |  41 ++++++
 .../Root/TriggerMenuMetaDataTool.cxx          | 127 +++++++++++++++++-
 .../xAODTriggerCnv/TriggerMenuMetaDataTool.h  |  68 +++++++++-
 19 files changed, 554 insertions(+), 10 deletions(-)
 create mode 100644 Event/xAOD/xAODTrigger/Root/TriggerMenuJsonAuxContainer_v1.cxx
 create mode 100644 Event/xAOD/xAODTrigger/Root/TriggerMenuJson_v1.cxx
 create mode 100644 Event/xAOD/xAODTrigger/xAODTrigger/TriggerMenuJson.h
 create mode 100644 Event/xAOD/xAODTrigger/xAODTrigger/TriggerMenuJsonAuxContainer.h
 create mode 100644 Event/xAOD/xAODTrigger/xAODTrigger/TriggerMenuJsonContainer.h
 create mode 100644 Event/xAOD/xAODTrigger/xAODTrigger/versions/TriggerMenuJsonAuxContainer_v1.h
 create mode 100644 Event/xAOD/xAODTrigger/xAODTrigger/versions/TriggerMenuJsonContainer_v1.h
 create mode 100644 Event/xAOD/xAODTrigger/xAODTrigger/versions/TriggerMenuJson_v1.h
 create mode 100644 Event/xAOD/xAODTriggerAthenaPool/src/xAODTriggerMenuJsonAuxContainerCnv.cxx
 create mode 100644 Event/xAOD/xAODTriggerAthenaPool/src/xAODTriggerMenuJsonAuxContainerCnv.h

diff --git a/Event/xAOD/xAODTrigger/CMakeLists.txt b/Event/xAOD/xAODTrigger/CMakeLists.txt
index 73487f2ce92..32516313a33 100644
--- a/Event/xAOD/xAODTrigger/CMakeLists.txt
+++ b/Event/xAOD/xAODTrigger/CMakeLists.txt
@@ -27,7 +27,7 @@ atlas_add_xaod_smart_pointer_dicts(
               "xAOD::JetRoIContainer_v2" "xAOD::EmTauRoIContainer_v1"
               "xAOD::EmTauRoIContainer_v2" "xAOD::TriggerMenuContainer_v1"
               "xAOD::TrigCompositeContainer_v1" "xAOD::BunchConfContainer_v1"
-              "xAOD::TrigPassBitsContainer_v1"
+              "xAOD::TrigPassBitsContainer_v1" "xAOD::TriggerMenuJsonContainer_v1"
    OBJECTS "xAOD::EnergySumRoI_v1" "xAOD::EnergySumRoI_v2"
            "xAOD::TrigDecision_v1" "xAOD::TrigNavigation_v1"
            "xAOD::RoiDescriptorStore_v1" )
diff --git a/Event/xAOD/xAODTrigger/Root/TriggerMenuJsonAuxContainer_v1.cxx b/Event/xAOD/xAODTrigger/Root/TriggerMenuJsonAuxContainer_v1.cxx
new file mode 100644
index 00000000000..05c0b326943
--- /dev/null
+++ b/Event/xAOD/xAODTrigger/Root/TriggerMenuJsonAuxContainer_v1.cxx
@@ -0,0 +1,19 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+// Local include(s):
+#include "xAODTrigger/versions/TriggerMenuJsonAuxContainer_v1.h"
+
+namespace xAOD {
+
+   TriggerMenuJsonAuxContainer_v1::TriggerMenuJsonAuxContainer_v1()
+      : AuxContainerBase() {
+
+      AUX_VARIABLE( key );
+      AUX_VARIABLE( name );
+
+      AUX_VARIABLE( payload );
+   }
+
+} // namespace xAOD
diff --git a/Event/xAOD/xAODTrigger/Root/TriggerMenuJson_v1.cxx b/Event/xAOD/xAODTrigger/Root/TriggerMenuJson_v1.cxx
new file mode 100644
index 00000000000..1644d8f4e5c
--- /dev/null
+++ b/Event/xAOD/xAODTrigger/Root/TriggerMenuJson_v1.cxx
@@ -0,0 +1,48 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+
+// System include(s):
+#include <iostream>
+
+// EDM include(s):
+#include "xAODCore/AuxStoreAccessorMacros.h"
+
+// Local include(s):
+#include "xAODTrigger/versions/TriggerMenuJson_v1.h"
+
+namespace xAOD {
+
+   TriggerMenuJson_v1::TriggerMenuJson_v1()
+      : SG::AuxElement() {
+
+   }
+
+   /////////////////////////////////////////////////////////////////////////////
+   //
+   //   Implementation of the configuration identifier accessor functions
+   //
+
+   AUXSTORE_PRIMITIVE_SETTER_AND_GETTER( TriggerMenuJson_v1, uint32_t, key,
+                                         setKey )
+   AUXSTORE_OBJECT_SETTER_AND_GETTER( TriggerMenuJson_v1, std::string, name,
+                                      setName )
+
+
+   //
+   /////////////////////////////////////////////////////////////////////////////
+
+   /////////////////////////////////////////////////////////////////////////////
+   //
+   //       Implementation of the payload accessor functions
+   //
+
+
+   AUXSTORE_OBJECT_SETTER_AND_GETTER( TriggerMenuJson_v1, std::string,
+                                      payload, setPayload )
+
+   //
+   /////////////////////////////////////////////////////////////////////////////
+
+} // namespace xAOD
diff --git a/Event/xAOD/xAODTrigger/Root/compileVersionless.cxx b/Event/xAOD/xAODTrigger/Root/compileVersionless.cxx
index 4f20204c7a9..4f8b2e1f2d4 100644
--- a/Event/xAOD/xAODTrigger/Root/compileVersionless.cxx
+++ b/Event/xAOD/xAODTrigger/Root/compileVersionless.cxx
@@ -4,3 +4,6 @@
 
 #include "xAODTrigger/TriggerMenuAuxContainer.h"
 #include "xAODTrigger/TriggerMenuContainer.h"
+
+#include "xAODTrigger/TriggerMenuJsonAuxContainer.h"
+#include "xAODTrigger/TriggerMenuJsonContainer.h"
\ No newline at end of file
diff --git a/Event/xAOD/xAODTrigger/Root/dict/ContainerProxies.cxx b/Event/xAOD/xAODTrigger/Root/dict/ContainerProxies.cxx
index 8a1684f78ad..a63ad6ba574 100644
--- a/Event/xAOD/xAODTrigger/Root/dict/ContainerProxies.cxx
+++ b/Event/xAOD/xAODTrigger/Root/dict/ContainerProxies.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 // $Id: ContainerProxies.cxx 755776 2016-06-17 13:45:30Z krasznaa $
@@ -9,6 +9,7 @@
 
 // Local include(s):
 #include "xAODTrigger/versions/TriggerMenuContainer_v1.h"
+#include "xAODTrigger/versions/TriggerMenuJsonContainer_v1.h"
 
 #include "xAODTrigger/versions/EmTauRoIContainer_v1.h"
 #include "xAODTrigger/versions/EmTauRoIContainer_v2.h"
@@ -22,6 +23,7 @@
 
 // Set up the collection proxies:
 ADD_NS_DV_PROXY( xAOD, TriggerMenuContainer_v1 );
+ADD_NS_DV_PROXY( xAOD, TriggerMenuJsonContainer_v1 );
 
 ADD_NS_DV_PROXY( xAOD, EmTauRoIContainer_v1 );
 ADD_NS_DV_PROXY( xAOD, EmTauRoIContainer_v2 );
diff --git a/Event/xAOD/xAODTrigger/Root/xAODTriggerCLIDs.cxx b/Event/xAOD/xAODTrigger/Root/xAODTriggerCLIDs.cxx
index 66c04dbad25..be4bf891b6c 100644
--- a/Event/xAOD/xAODTrigger/Root/xAODTriggerCLIDs.cxx
+++ b/Event/xAOD/xAODTrigger/Root/xAODTriggerCLIDs.cxx
@@ -14,6 +14,8 @@
 #include "xAODTrigger/JetEtRoIAuxInfo.h"
 #include "xAODTrigger/JetRoIContainer.h"
 #include "xAODTrigger/JetRoIAuxContainer.h"
+#include "xAODTrigger/TriggerMenuJsonContainer.h"
+#include "xAODTrigger/TriggerMenuJsonAuxContainer.h"
 #include "xAODTrigger/MuonRoIContainer.h"
 #include "xAODTrigger/MuonRoIAuxContainer.h"
 #include "xAODTrigger/TrigCompositeContainer.h"
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/TriggerMenuJson.h b/Event/xAOD/xAODTrigger/xAODTrigger/TriggerMenuJson.h
new file mode 100644
index 00000000000..467232c5146
--- /dev/null
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/TriggerMenuJson.h
@@ -0,0 +1,18 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef XAODTRIGGER_TRIGGERMENUJSON_H
+#define XAODTRIGGER_TRIGGERMENUJSON_H
+
+// Local include(s):
+#include "xAODTrigger/versions/TriggerMenuJson_v1.h"
+
+namespace xAOD {
+   /// Define the latest version of the trigger menu JSON class
+   typedef TriggerMenuJson_v1 TriggerMenuJson;
+}
+
+#endif // XAODTRIGGER_TRIGGERMENUJSON_H
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/TriggerMenuJsonAuxContainer.h b/Event/xAOD/xAODTrigger/xAODTrigger/TriggerMenuJsonAuxContainer.h
new file mode 100644
index 00000000000..6b1b8994889
--- /dev/null
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/TriggerMenuJsonAuxContainer.h
@@ -0,0 +1,23 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id: TriggerMenuAuxContainer.h 631149 2014-11-26 12:26:18Z krasznaa $
+#ifndef XAODTRIGGER_TRIGGERMENUJSONAUXCONTAINER_H
+#define XAODTRIGGER_TRIGGERMENUJSONAUXCONTAINER_H
+
+// Local include(s):
+#include "xAODTrigger/versions/TriggerMenuJsonAuxContainer_v1.h"
+
+namespace xAOD {
+   /// Define the latest version of the trigger menu auxiliary container class
+   typedef TriggerMenuJsonAuxContainer_v1 TriggerMenuJsonAuxContainer;
+}
+
+// Set up a CLID for the container:
+#include "xAODCore/CLASS_DEF.h"
+CLASS_DEF( xAOD::TriggerMenuJsonAuxContainer, 373045213, 1 )
+
+#endif // XAODTRIGGER_TRIGGERMENUJSONAUXCONTAINER_H
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/TriggerMenuJsonContainer.h b/Event/xAOD/xAODTrigger/xAODTrigger/TriggerMenuJsonContainer.h
new file mode 100644
index 00000000000..55ddf1c8169
--- /dev/null
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/TriggerMenuJsonContainer.h
@@ -0,0 +1,29 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef XAODTRIGGER_TRIGGERMENUJSONCONTAINER_H
+#define XAODTRIGGER_TRIGGERMENUJSONCONTAINER_H
+
+// Local include(s):
+#include "xAODTrigger/versions/TriggerMenuJsonContainer_v1.h"
+#include "xAODTrigger/TriggerMenuJson.h"
+
+namespace xAOD {
+   typedef TriggerMenuJsonContainer_v1 TriggerMenuJsonContainer;
+}
+
+// Set up a CLID for the container:
+#include "xAODCore/CLASS_DEF.h"
+CLASS_DEF( xAOD::TriggerMenuJsonContainer, 1221262614, 1 )
+
+#ifndef XAOD_STANDALONE
+#include "AthenaKernel/MetaCont.h"
+CLASS_DEF( MetaCont<xAOD::TriggerMenuJsonContainer> , 1760135678 , 1 )
+#include "xAODCore/BaseInfo.h"
+SG_BASE( MetaCont<xAOD::TriggerMenuJsonContainer>, MetaContBase );
+#endif // not XAOD_STANDALONE
+
+#endif // XAODTRIGGER_TRIGGERMENUJSONCONTAINER_H
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/selection.xml b/Event/xAOD/xAODTrigger/xAODTrigger/selection.xml
index d316db7bfc3..7eaee8ee54b 100644
--- a/Event/xAOD/xAODTrigger/xAODTrigger/selection.xml
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/selection.xml
@@ -126,6 +126,18 @@
           id="B8614CC5-8696-4170-8CCC-496DA7671246" />
    <typedef name="xAOD::TriggerMenuAuxContainer" />
 
+   <!-- xAOD::TriggerMenuJson interface type(s). -->
+   <class name="xAOD::TriggerMenuJson_v1" />
+   <class name="xAOD::TriggerMenuJsonContainer_v1"
+          id="EB93A327-042C-706C-9690-A3F419DCCFEB" />
+   <typedef name="xAOD::TriggerMenuJson" />
+   <typedef name="xAOD::TriggerMenuJsonContainer" />
+
+   <!-- xAOD::TriggerMenuJson auxiliary type(s). -->
+   <class name="xAOD::TriggerMenuJsonAuxContainer_v1"
+          id="27A79C63-7809-7F7F-DB5A-998EF07CD154" />
+   <typedef name="xAOD::TriggerMenuJsonAuxContainer" />
+
    <!-- xAOD::TrigDecision interface type(s). -->
    <class name="xAOD::TrigDecision_v1"
           id="092BCB2D-9630-4689-BE86-7B93466420DA" />
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TriggerMenuJsonAuxContainer_v1.h b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TriggerMenuJsonAuxContainer_v1.h
new file mode 100644
index 00000000000..e134cffae64
--- /dev/null
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TriggerMenuJsonAuxContainer_v1.h
@@ -0,0 +1,56 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id: TriggerMenuAuxContainer_v1.h 636406 2014-12-17 05:19:48Z lheinric $
+#ifndef XAODTRIGGER_VERSIONS_MENUJSONAUXCONTAINER_v1_H
+#define XAODTRIGGER_VERSIONS_MENUJSONAUXCONTAINER_v1_H
+
+// System include(s):
+extern "C" {
+#   include <stdint.h>
+}
+#include <vector>
+#include <string>
+
+// EDM include(s):
+#include "xAODCore/AuxContainerBase.h"
+
+//class xAODTriggerMenuAuxContainerCnv;
+
+namespace xAOD {
+
+   /// Auxiliary store object for TriggerMenuJsonContainer_v1
+   ///
+   /// Holder for a JSON file.
+   ///
+   class TriggerMenuJsonAuxContainer_v1 : public AuxContainerBase {
+
+   public:
+      /// Default constructor
+      TriggerMenuJsonAuxContainer_v1();
+
+   private:
+      //friend class ::xAODTriggerMenuAuxContainerCnv;
+
+      /// @name Configuration identifier variables
+      /// @{
+      std::vector< uint32_t > key;
+      std::vector< std::string > name;
+      /// @}
+
+      /// @name Stored JSON data
+      /// @{
+      std::vector< std::string > payload;
+      /// @}
+
+   }; // class TriggerMenuJsonAuxContainer_v1
+
+} // namespace xAOD
+
+#include "xAODCore/BaseInfo.h" 
+SG_BASE( xAOD::TriggerMenuJsonAuxContainer_v1, xAOD::AuxContainerBase ); 
+
+#endif // XAODTRIGGER_VERSIONS_MENUJSONAUXCONTAINER_v1_H
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TriggerMenuJsonContainer_v1.h b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TriggerMenuJsonContainer_v1.h
new file mode 100644
index 00000000000..1fd74b7b104
--- /dev/null
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TriggerMenuJsonContainer_v1.h
@@ -0,0 +1,21 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef XAODTRIGGER_VERSIONS_MENUJSONCONTAINER_v1_H
+#define XAODTRIGGER_VERSIONS_MENUJSONCONTAINER_v1_H
+
+// EDM include(s):
+#include "AthContainers/DataVector.h"
+
+// Local include(s):
+#include "xAODTrigger/versions/TriggerMenuJson_v1.h"
+
+namespace xAOD {
+   /// Define the menu container as a simple DataVector
+   typedef DataVector< TriggerMenuJson_v1 > TriggerMenuJsonContainer_v1;
+}
+
+#endif // XAODTRIGGER_VERSIONS_MENUJSONCONTAINER_v1_H
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TriggerMenuJson_v1.h b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TriggerMenuJson_v1.h
new file mode 100644
index 00000000000..030ef113477
--- /dev/null
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TriggerMenuJson_v1.h
@@ -0,0 +1,61 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef XAODTRIGGER_VERSIONS_MENUJSON_v1_H
+#define XAODTRIGGER_VERSIONS_MENUJSON_v1_H
+
+// System include(s):
+extern "C" {
+#   include <stdint.h>
+}
+#include <vector>
+#include <string>
+
+// EDM include(s):
+#include "AthContainers/AuxElement.h"
+
+namespace xAOD {
+
+   /// Raw JSON data for a given type of menu file.
+   ///
+   /// Associated to the menu file's configuration key.
+   ///
+   class TriggerMenuJson_v1 : public SG::AuxElement {
+
+   public:
+      /// Default constructor
+      TriggerMenuJson_v1();
+
+      /// @name Configuration identifier variables
+      /// @{
+
+      /// Get the key of this configuration
+      uint32_t key() const;
+      /// Set the key of this configuration
+      void setKey( uint32_t value );
+
+      /// Get the name of this configuration
+      const std::string& name() const;
+      /// Set the name key of this configuration
+      void setName( const std::string& name );
+
+      /// @}
+
+      /// @name Payload configuration access
+      /// @{
+
+      /// Get the JSON payload
+      const std::string& payload() const;
+      /// Set the JSON payload
+      void setPayload( const std::string& payload );
+
+      /// @}
+
+   }; // class TriggerMenuJson_v1
+
+} // namespace xAOD
+
+#endif // XAODTRIGGER_VERSIONS_MENUJSON_v1_H
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/xAODTriggerDict.h b/Event/xAOD/xAODTrigger/xAODTrigger/xAODTriggerDict.h
index 5b5127c2523..7beb29624bf 100644
--- a/Event/xAOD/xAODTrigger/xAODTrigger/xAODTriggerDict.h
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/xAODTriggerDict.h
@@ -15,6 +15,13 @@
 #include "xAODTrigger/versions/TriggerMenuContainer_v1.h"
 #include "xAODTrigger/versions/TriggerMenuAuxContainer_v1.h"
 
+#include "xAODTrigger/TriggerMenuJson.h"
+#include "xAODTrigger/TriggerMenuJsonContainer.h"
+#include "xAODTrigger/TriggerMenuJsonAuxContainer.h"
+#include "xAODTrigger/versions/TriggerMenuJson_v1.h"
+#include "xAODTrigger/versions/TriggerMenuJsonContainer_v1.h"
+#include "xAODTrigger/versions/TriggerMenuJsonAuxContainer_v1.h"
+
 #include "xAODTrigger/MuonRoI.h"
 #include "xAODTrigger/MuonRoIContainer.h"
 #include "xAODTrigger/MuonRoIAuxContainer.h"
@@ -105,6 +112,7 @@ namespace {
    struct GCCXML_DUMMY_INSTANTIATION_XAODTRIGGER {
       // Local type(s).
       XAOD_INSTANTIATE_NS_CONTAINER_TYPES( xAOD, TriggerMenuContainer_v1 );
+      XAOD_INSTANTIATE_NS_CONTAINER_TYPES( xAOD, TriggerMenuJsonContainer_v1 );
       XAOD_INSTANTIATE_NS_CONTAINER_TYPES( xAOD, BunchConfContainer_v1 );
 
       XAOD_INSTANTIATE_NS_CONTAINER_TYPES( xAOD, MuonRoIContainer_v1 );
diff --git a/Event/xAOD/xAODTriggerAthenaPool/CMakeLists.txt b/Event/xAOD/xAODTriggerAthenaPool/CMakeLists.txt
index 52c854336b5..73e6e6d0189 100644
--- a/Event/xAOD/xAODTriggerAthenaPool/CMakeLists.txt
+++ b/Event/xAOD/xAODTriggerAthenaPool/CMakeLists.txt
@@ -13,6 +13,7 @@ atlas_add_poolcnv_library( xAODTriggerAthenaPoolPoolCnv
    xAODTrigger/EnergySumRoI.h xAODTrigger/EnergySumRoIAuxInfo.h
    xAODTrigger/TrigCompositeContainer.h xAODTrigger/TrigCompositeAuxContainer.h
    xAODTrigger/TriggerMenuContainer.h xAODTrigger/TriggerMenuAuxContainer.h
+   xAODTrigger/TriggerMenuJsonContainer.h xAODTrigger/TriggerMenuJsonAuxContainer.h
    xAODTrigger/TrigConfKeys.h
    xAODTrigger/TrigDecision.h xAODTrigger/TrigDecisionAuxInfo.h
    xAODTrigger/TrigNavigation.h xAODTrigger/TrigNavigationAuxInfo.h
@@ -27,6 +28,7 @@ atlas_add_poolcnv_library( xAODTriggerAthenaPoolPoolCnv
    xAOD::EnergySumRoI xAOD::EnergySumRoIAuxInfo
    xAOD::TrigCompositeContainer xAOD::TrigCompositeAuxContainer
    xAOD::TriggerMenuContainer xAOD::TriggerMenuAuxContainer
+   xAOD::TriggerMenuJsonContainer xAOD::TriggerMenuJsonAuxContainer
    xAOD::TrigConfKeys
    xAOD::TrigDecision xAOD::TrigDecisionAuxInfo
    xAOD::TrigNavigation xAOD::TrigNavigationAuxInfo
diff --git a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTriggerMenuJsonAuxContainerCnv.cxx b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTriggerMenuJsonAuxContainerCnv.cxx
new file mode 100644
index 00000000000..2dfb4160f07
--- /dev/null
+++ b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTriggerMenuJsonAuxContainerCnv.cxx
@@ -0,0 +1,20 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+// Local include(s):
+#include "xAODTriggerMenuJsonAuxContainerCnv.h"
+
+xAODTriggerMenuJsonAuxContainerCnv::
+xAODTriggerMenuJsonAuxContainerCnv( ISvcLocator* svcLoc )
+   : xAODTriggerMenuJsonAuxContainerCnvBase( svcLoc ) {
+}
+
+xAOD::TriggerMenuJsonAuxContainer*
+xAODTriggerMenuJsonAuxContainerCnv::createTransientWithKey (const std::string& key) {
+
+  std::unique_ptr<xAOD::TriggerMenuJsonAuxContainer_v1> obj
+    { xAODTriggerMenuJsonAuxContainerCnvBase::createTransientWithKey (key) };
+
+  return obj.release();
+}
diff --git a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTriggerMenuJsonAuxContainerCnv.h b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTriggerMenuJsonAuxContainerCnv.h
new file mode 100644
index 00000000000..a151013dd6f
--- /dev/null
+++ b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTriggerMenuJsonAuxContainerCnv.h
@@ -0,0 +1,41 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef XAODTRIGGERATHENAPOOL_XAODTRIGGERMENUJSONAUXCONTAINERCNV_H
+#define XAODTRIGGERATHENAPOOL_XAODTRIGGERMENUJSONAUXCONTAINERCNV_H
+
+// Gaudi/Athena include(s):
+#include "AthenaPoolCnvSvc/T_AthenaPoolAuxContainerCnv.h"
+
+// EDM include(s):
+#include "xAODTrigger/TriggerMenuJsonAuxContainer.h"
+
+/// Base class for the converter
+typedef T_AthenaPoolAuxContainerCnv< xAOD::TriggerMenuJsonAuxContainer >
+   xAODTriggerMenuJsonAuxContainerCnvBase;
+
+/**
+ *  @short POOL converter for the xAOD::TriggerMenuJsonAuxContainer class
+ */
+class xAODTriggerMenuJsonAuxContainerCnv :
+   public xAODTriggerMenuJsonAuxContainerCnvBase {
+
+   // Declare the factory as our friend:
+   friend class CnvFactory< xAODTriggerMenuJsonAuxContainerCnv >;
+
+protected:
+   /// Converter constructor
+public:
+   xAODTriggerMenuJsonAuxContainerCnv( ISvcLocator* svcLoc );
+protected:
+
+   /// Function reading in the object from the input file
+   virtual xAOD::TriggerMenuJsonAuxContainer*
+   createTransientWithKey( const std::string& key ) override;
+
+}; // class xAODTriggerMenuJsonAuxContainerCnv
+
+#endif // XAODTRIGGERATHENAPOOL_XAODTRIGGERMENUJSONAUXCONTAINERCNV_H
diff --git a/Event/xAOD/xAODTriggerCnv/Root/TriggerMenuMetaDataTool.cxx b/Event/xAOD/xAODTriggerCnv/Root/TriggerMenuMetaDataTool.cxx
index 3f7e60de775..4c07a279bbc 100644
--- a/Event/xAOD/xAODTriggerCnv/Root/TriggerMenuMetaDataTool.cxx
+++ b/Event/xAOD/xAODTriggerCnv/Root/TriggerMenuMetaDataTool.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 // $Id: TriggerMenuMetaDataTool.cxx 683395 2015-07-16 11:11:56Z krasznaa $
@@ -16,23 +16,46 @@ namespace xAODMaker {
       : asg::AsgMetadataTool( name ),
         m_menu(), m_menuAux(), m_beginFileIncidentSeen( false ) {
 
-      declareProperty( "InputKey", m_inputKey = "TriggerMenu" );
-      declareProperty( "OutputKey", m_outputKey = "TriggerMenu" );
+
 
 #ifndef XAOD_STANDALONE
       declareInterface< ::IMetaDataTool >( this );
 #endif // XAOD_STANDALONE
+
+      declareProperty("InputKey", m_inputKey = "TriggerMenu");
+      declareProperty("OutputKey", m_outputKey = "TriggerMenu");
+      declareProperty("InputKeyJSON_HLT", m_inputKeyJSON_HLT = "TriggerMenuJson_HLT");
+      declareProperty("OutputKeyJSON_HLT", m_outputKeyJSON_HLT = "TriggerMenuJson_HLT");
+      declareProperty("InputKeyJSON_L1", m_inputKeyJSON_L1 = "TriggerMenuJson_L1");
+      declareProperty("OutputKeyJSON_L1", m_outputKeyJSON_L1 = "TriggerMenuJson_L1");
+      declareProperty("InputKeyJSON_HLTPS", m_inputKeyJSON_HLTPS = "TriggerMenuJson_HLTPS");
+      declareProperty("OutputKeyJSON_HLTPS", m_outputKeyJSON_HLTPS = "TriggerMenuJson_HLTPS");
+      declareProperty("InputKeyJSON_L1PS", m_inputKeyJSON_L1PS = "TriggerMenuJson_L1PS");
+      declareProperty("OutputKeyJSON_L1PS", m_outputKeyJSON_L1PS = "TriggerMenuJson_L1PS");
    }
 
    StatusCode TriggerMenuMetaDataTool::initialize() {
 
       // Greet the user:
       ATH_MSG_DEBUG( "Initialising TriggerMenuMetaDataTool" );
-      ATH_MSG_DEBUG( "  InputKey  = " << m_inputKey );
-      ATH_MSG_DEBUG( "  OutputKey = " << m_outputKey );
+
+
+
 
       // Reset the internal variable(s):
-      m_menu.reset(); m_menuAux.reset();
+      m_menu.reset();
+      m_menuAux.reset();
+      m_menuJSON_hlt.reset();
+      m_menuJSON_hltAux.reset();
+      m_menuJSON_l1.reset();
+      m_menuJSON_l1Aux.reset();
+      m_menuJSON_hltps.reset();
+      m_menuJSON_hltpsAux.reset();
+      m_menuJSON_l1ps.reset();
+      m_menuJSON_l1psAux.reset();
+      // m_menuJSON_bg.reset(); // TODO
+      // m_menuJSON_bgAux.reset();
+
       m_beginFileIncidentSeen = false;
 
       // Return gracefully:
@@ -44,10 +67,14 @@ namespace xAODMaker {
       return StatusCode::SUCCESS;
    }
    StatusCode TriggerMenuMetaDataTool::beginInputFile() {
-
       // Whatever happens, we've seen the first BeginInputFile incident now.
       m_beginFileIncidentSeen = true;
+      ATH_CHECK( checkxAODTriggerMenu() );
+      ATH_CHECK( checkxAODTriggerMenuJson() );
+      return StatusCode::SUCCESS;
+   }
 
+   StatusCode TriggerMenuMetaDataTool::checkxAODTriggerMenu() {
       // If the input file doesn't have any trigger configuration metadata,
       // then finish right away:
       if( ! inputMetaStore()->contains< xAOD::TriggerMenuContainer >(
@@ -97,6 +124,55 @@ namespace xAODMaker {
       return StatusCode::SUCCESS;
    }
 
+   StatusCode TriggerMenuMetaDataTool::checkxAODTriggerMenuJson() {
+      ATH_CHECK( checkCopyJSON(m_inputKeyJSON_HLT, m_menuJSON_hlt, m_menuJSON_hltAux) );
+      ATH_CHECK( checkCopyJSON(m_inputKeyJSON_L1, m_menuJSON_l1, m_menuJSON_l1Aux) );
+      ATH_CHECK( checkCopyJSON(m_inputKeyJSON_HLTPS, m_menuJSON_hltps, m_menuJSON_hltpsAux) );
+      ATH_CHECK( checkCopyJSON(m_inputKeyJSON_L1PS, m_menuJSON_l1ps, m_menuJSON_l1psAux) );
+      // ATH_CHECK( checkCopyJSON(m_inputKeyJSON_BG, m_menuJSON_bg, m_menuJSON_bgAux) );
+      return StatusCode::SUCCESS;
+   }
+
+   StatusCode TriggerMenuMetaDataTool::checkCopyJSON(const std::string& inputMetaSGKey,
+      std::unique_ptr< xAOD::TriggerMenuJsonContainer >& outContainer,
+      std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer >& outAuxContainer) {
+
+      const xAOD::TriggerMenuJsonContainer* input = 0;
+      if (inputMetaStore()->retrieve( input, inputMetaSGKey ).isSuccess() ) {
+
+         // Create an output container if it doesn't exist yet:
+         if( ( ! outContainer.get() ) && ( ! outAuxContainer.get() ) ) {
+            ATH_MSG_DEBUG( "Creating output container" );
+            outContainer.reset( new xAOD::TriggerMenuJsonContainer() );
+            outAuxContainer.reset( new xAOD::TriggerMenuJsonAuxContainer() );
+            outContainer->setStore( outAuxContainer.get() );
+         }
+
+         // Loop over the configurations of the input file:
+         for( const xAOD::TriggerMenuJson* menuJson : *input ) {
+            // Check if this configuration is already in the output container:
+            bool exists = false;
+            for( const xAOD::TriggerMenuJson* existing : *outContainer ) {
+               if (existing->key() == menuJson->key()) {
+                  exists = true;
+                  break;
+               }
+            }
+            if( exists ) {
+               continue;
+            }
+
+            // If it's a new configuration, put it into the output container:
+            ATH_MSG_VERBOSE( "Copying " << inputMetaSGKey << " configuration with Key: " << menuJson->key() );
+            xAOD::TriggerMenuJson* out = new xAOD::TriggerMenuJson();
+            outContainer->push_back( out );
+            *out = *menuJson;
+         }
+      }
+      return StatusCode::SUCCESS;
+   }
+
+
    StatusCode TriggerMenuMetaDataTool::beginEvent() {
 
       // In case the BeginInputFile incident was missed in standalone mode, make
@@ -111,7 +187,12 @@ namespace xAODMaker {
    }
 
    StatusCode TriggerMenuMetaDataTool::metaDataStop() {
+      ATH_CHECK( endxAODTriggerMenu() );
+      ATH_CHECK( endxAODTriggerMenuJson() );
+      return StatusCode::SUCCESS;
+   }
 
+   StatusCode TriggerMenuMetaDataTool::endxAODTriggerMenu() {
       // The output may already have trigger configuration metadata in it.
       // For instance from TrigConf::xAODMenuWriter. In this case let that
       // object take precedence.
@@ -135,4 +216,36 @@ namespace xAODMaker {
       return StatusCode::SUCCESS;
    }
 
+   StatusCode TriggerMenuMetaDataTool::endxAODTriggerMenuJson() {
+      ATH_CHECK( checkExportJSON(m_outputKeyJSON_HLT, m_menuJSON_hlt, m_menuJSON_hltAux) );
+      ATH_CHECK( checkExportJSON(m_outputKeyJSON_L1, m_menuJSON_l1, m_menuJSON_l1Aux) );
+      ATH_CHECK( checkExportJSON(m_outputKeyJSON_HLTPS, m_menuJSON_hltps, m_menuJSON_hltpsAux) );
+      ATH_CHECK( checkExportJSON(m_outputKeyJSON_L1PS, m_menuJSON_l1ps, m_menuJSON_l1psAux) );
+      // ATH_CHECK( checkExportJSON(m_outputKeyJSON_BG, m_menuJSON_bg, m_menuJSON_bgAux) );
+      return StatusCode::SUCCESS;
+   }
+
+   StatusCode TriggerMenuMetaDataTool::checkExportJSON(const std::string& outputMetaSGKey,
+      std::unique_ptr< xAOD::TriggerMenuJsonContainer >& outContainer,
+      std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer >& outAuxContainer) {
+
+      if( outputMetaStore()->contains< xAOD::TriggerMenuJsonContainer >( outputMetaSGKey ) ) {
+         ATH_MSG_DEBUG( "xAOD::TriggerMenuJsonContainer already in the output" );
+         return StatusCode::SUCCESS;
+      }
+
+      // Record the trigger configuration metadata, if any was found in the
+      // processed input files.
+      if( outContainer.get() && outAuxContainer.get() ) {
+         ATH_MSG_DEBUG( "Recording " << outputMetaSGKey << " trigger configuration metadata" );
+         ATH_CHECK( outputMetaStore()->record( outContainer.release(),
+                                               outputMetaSGKey ) );
+         ATH_CHECK( outputMetaStore()->record( outAuxContainer.release(),
+                                               outputMetaSGKey + "Aux." ) );
+      }
+
+      // Return gracefully:
+      return StatusCode::SUCCESS;
+   }
+
 } // namespace xAODMaker
diff --git a/Event/xAOD/xAODTriggerCnv/xAODTriggerCnv/TriggerMenuMetaDataTool.h b/Event/xAOD/xAODTriggerCnv/xAODTriggerCnv/TriggerMenuMetaDataTool.h
index 948e1369e8f..17ffdd78e92 100644
--- a/Event/xAOD/xAODTriggerCnv/xAODTriggerCnv/TriggerMenuMetaDataTool.h
+++ b/Event/xAOD/xAODTriggerCnv/xAODTriggerCnv/TriggerMenuMetaDataTool.h
@@ -1,7 +1,7 @@
 // Dear emacs, this is -*- c++ -*-
 
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 // $Id: TriggerMenuMetaDataTool.h 683395 2015-07-16 11:11:56Z krasznaa $
@@ -22,6 +22,10 @@
 #include "xAODTrigger/TriggerMenuContainer.h"
 #include "xAODTrigger/TriggerMenuAuxContainer.h"
 
+#include "xAODTrigger/TriggerMenuJsonContainer.h"
+#include "xAODTrigger/TriggerMenuJsonAuxContainer.h"
+#include "xAODTrigger/TriggerMenuJson.h"
+
 namespace xAODMaker {
 
    /// Tool taking care of copying the trigger configuration from file to file
@@ -80,6 +84,29 @@ namespace xAODMaker {
       /// @}
 
    private:
+
+      /// Perform the R2 data copy
+      StatusCode checkxAODTriggerMenu();
+      StatusCode endxAODTriggerMenu();
+
+      /// Perform the R3 data copy
+      StatusCode checkxAODTriggerMenuJson();
+      StatusCode endxAODTriggerMenuJson();
+
+      /// Helper function to do the R3 data copy to the internal store
+      StatusCode checkCopyJSON(const std::string& inputMetaSGKey,
+         std::unique_ptr< xAOD::TriggerMenuJsonContainer >& outContainer,
+         std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer >& outAuxContainer);
+
+      // Helper function to move the internal store to the output file
+      StatusCode checkExportJSON(const std::string& outputMetaSGKey,
+         std::unique_ptr< xAOD::TriggerMenuJsonContainer >& outContainer,
+         std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer >& outAuxContainer);
+
+
+      /// @name Runs 1, 2 data propagation
+      /// @{
+
       /// The key of the trigger menu in the input file
       std::string m_inputKey;
       /// The key of the trigger menu for the output file
@@ -90,6 +117,45 @@ namespace xAODMaker {
       /// The merged trigger menu auxiliary container
       std::unique_ptr< xAOD::TriggerMenuAuxContainer > m_menuAux;
 
+      /// @}
+
+      /// @name Run 3 data propagation
+      /// @{
+
+      std::string m_inputKeyJSON_HLT;
+      std::string m_outputKeyJSON_HLT;
+
+      std::string m_inputKeyJSON_L1;
+      std::string m_outputKeyJSON_L1;
+
+      std::string m_inputKeyJSON_HLTPS;
+      std::string m_outputKeyJSON_HLTPS;
+
+      std::string m_inputKeyJSON_L1PS;
+      std::string m_outputKeyJSON_L1PS;
+
+      // TODO
+      // Gaudi::Property<std::string> m_inputKeyJSON_BG {this, "InputKeyJSON_BG", "TriggerMenuJson_BG"};
+      // Gaudi::Property<std::string> m_outputKeyJSON_BG {this, "OutputKeyJSON_BG", "TriggerMenuJson_BG"};
+
+      std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_menuJSON_hlt;
+      std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_menuJSON_hltAux;
+
+      std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_menuJSON_l1;
+      std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_menuJSON_l1Aux;
+
+      std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_menuJSON_hltps;
+      std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_menuJSON_hltpsAux;
+
+      std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_menuJSON_l1ps;
+      std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_menuJSON_l1psAux;
+
+      // TODO
+      // std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_menuJSON_bg;
+      // std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_menuJSON_bgAux;
+
+      /// @} 
+
       /// Internal status flag showing whether a BeginInputFile incident was
       /// seen already
       bool m_beginFileIncidentSeen;
-- 
GitLab