From 324c5d1f839847e42ddacf332f15df17dc93eaee Mon Sep 17 00:00:00 2001
From: gipezzul <g.pezzullo@yale.edu>
Date: Mon, 26 Oct 2020 14:01:36 +0100
Subject: [PATCH 01/30] test HLT monitoring config file

---
 .../HLTMenuConfig/Menu/HLTMonitoringJSON.py   | 62 +++++++++++++++++++
 .../TriggerMenuMT/share/Mon_METSlice.json     | 32 ++++++++++
 2 files changed, 94 insertions(+)
 create mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
 create mode 100644 Trigger/TriggerCommon/TriggerMenuMT/share/Mon_METSlice.json

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
new file mode 100644
index 000000000000..e3159efbbee6
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
@@ -0,0 +1,62 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+import json
+from collections import OrderedDict as odict
+from TrigConfigSvc.TrigConfigSvcCfg import getHLTMenuFileName, getHLTPrescalesSetFileName, getHLTMonitoringFileName
+from AthenaCommon.Logging import logging
+__log = logging.getLogger( __name__ )
+
+
+def generateJSON():
+    __log.info("Generating HLT Monitoring Config JSON...")
+    from AthenaConfiguration.AllConfigFlags import ConfigFlags
+    from TriggerMenuMT.HLTMenuConfig.Menu.TriggerConfigHLT import TriggerConfigHLT
+
+    return __generateJSON( TriggerConfigHLT.dictsList(),
+                           TriggerConfigHLT.configsList(),
+                           ConfigFlags.Trigger.triggerMenuSetup,
+                           getHLTMenuFileName(ConfigFlags),
+                           getHLTPrescalesSetFileName(ConfigFlags),
+                           getHLTMonitoringFileName(ConfigFlags) )
+
+def __generateJSON(chainDicts, chainConfigs, menuName, menuFileName, prescaleFileName, fileName):
+    #get the name of the outputfile
+    menuFile   = open(menuFileName,'r')
+    menuDict   = json.load(menuFile, object_pairs_hook = odict)
+    menuChains = menuDict['chains'].keys()
+     
+    # get the dict of the prescales
+    prescaleFile  = open(prescaleFileName,'r')
+    prescaleDict  = json.load(prescaleFile, object_pairs_hook = odict)
+     
+    #create the dictionary the will house the monitoring info
+    monDict=odict([ ("filetype", "hltmonitoring"), ("name", menuName), ("monchains", odict()) ])
+    
+    #test file: FIXME!
+    config_fileName="Mon_METSlice.json"
+    
+    with open(config_fileName,'r') as file:
+        json_file = json.load(file, object_pairs_hook = odict)
+
+        # then you can iterate, say over the HLT menu:
+        for chain_name, ch in json_file.items(): #json_file['chains'].items():
+
+            #check that the chain is present in the Menu
+            if chain_name not in menuChains:
+                __log.info( "Chain %s not present in the HLT Menu JSON %s", chain_name, menuFileName)
+                continue
+
+            #and then the elements of that chain, e.g:
+            # ch['groups']
+            monDict['monchains'][chain_name] = odict([
+                ('prescale', prescaleDict[chain_name]['prescale']),
+                #('enabled', ch['enabled']),
+                ('monP1', ch['monP1']),
+                ('monT0', ch['monT0']),
+                ('monOffline', ch['monOffline'])
+            ])
+
+    # then writing to a file is as simple as:
+    __log.info( "Writing HLT Monitoring JSON to %s", fileName )
+    with open(fileName, 'w') as outfile:
+        json.dump(monDict, outfile, indent = 4)
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/share/Mon_METSlice.json b/Trigger/TriggerCommon/TriggerMenuMT/share/Mon_METSlice.json
new file mode 100644
index 000000000000..1a656e3fa887
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/share/Mon_METSlice.json
@@ -0,0 +1,32 @@
+{
+    'HLT_xe65_cell_L1XE50' : {
+	"monP1": false,
+        "monT0": true,
+        "monOffline": true
+    }, 
+    'HLT_xe100_mht_L1XE50': {
+	"monP1": false,
+        "monT0": true,
+        "monOffline": true
+    },
+    'HLT_xe100_tcpufit_L1XE50': {
+	"monP1": false,
+        "monT0": true,
+        "monOffline": true
+    },
+    'HLT_xe100_trkmht_L1XE50': {
+	"monP1": false,
+        "monT0": true,
+        "monOffline": true
+    }, 
+    'HLT_xe100_pfsum_L1XE50': {
+	"monP1": false,
+        "monT0": true,
+        "monOffline": true
+    }, 
+    'HLT_xe65_cell_xe110_tcpufit_L1XE50': {
+	"monP1": false,
+        "monT0": true,
+        "monOffline": true
+    }
+}
-- 
GitLab


From 68f6465c356fa20ad23dd9bb5348dc250688d64d Mon Sep 17 00:00:00 2001
From: gipezzul <g.pezzullo@yale.edu>
Date: Mon, 26 Oct 2020 14:02:31 +0100
Subject: [PATCH 02/30] added the generateMonitoringJSON function call

---
 .../TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py  | 3 +++
 Trigger/TriggerCommon/TriggerMenuMT/share/full_menu_cf.py      | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
index b2b5bf0947e0..1d98f5e83e16 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
@@ -563,4 +563,7 @@ class GenerateMenuMT(object):
         from TriggerMenuMT.HLTMenuConfig.Menu.HLTPrescaleJSON import generateJSON as generatePrescaleJSON
         generatePrescaleJSON()
 
+        from TriggerMenuMT.HLTMenuConfig.Menu.HLTMonitoringJSON import generateJSON as generateMonitoringJSON
+        generateMonitoringJSON()
+
         return finalListOfChainConfigs
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/share/full_menu_cf.py b/Trigger/TriggerCommon/TriggerMenuMT/share/full_menu_cf.py
index 155328bdfd8d..b12b38d20c7b 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/share/full_menu_cf.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/share/full_menu_cf.py
@@ -292,6 +292,9 @@ generateJSON()
 from TriggerMenuMT.HLTMenuConfig.Menu.HLTPrescaleJSON import generateJSON as generatePrescaleJSON
 generatePrescaleJSON()
    
+from TriggerMenuMT.HLTMenuConfig.Menu.HLTMonitoringJSON import generateJSON as generateMonitoringJSON
+generateMonitoringJSON()
+
 from AthenaCommon.AlgSequence import dumpSequence, AthSequencer
 dumpSequence(topSequence)
     
-- 
GitLab


From 8ca65a3278f425abe19400170df77b50cfe63f59 Mon Sep 17 00:00:00 2001
From: gipezzul <g.pezzullo@yale.edu>
Date: Mon, 26 Oct 2020 14:02:45 +0100
Subject: [PATCH 03/30] updates

---
 .../python/HLTMenuConfig/Menu/HLTMonitoringJSON.py          | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
index e3159efbbee6..b6ae37098ae4 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
@@ -8,7 +8,7 @@ __log = logging.getLogger( __name__ )
 
 
 def generateJSON():
-    __log.info("Generating HLT Monitoring Config JSON...")
+    __log.info("Generating HLT Monitoring JSON in the rec-ex-common job")
     from AthenaConfiguration.AllConfigFlags import ConfigFlags
     from TriggerMenuMT.HLTMenuConfig.Menu.TriggerConfigHLT import TriggerConfigHLT
 
@@ -33,7 +33,7 @@ def __generateJSON(chainDicts, chainConfigs, menuName, menuFileName, prescaleFil
     monDict=odict([ ("filetype", "hltmonitoring"), ("name", menuName), ("monchains", odict()) ])
     
     #test file: FIXME!
-    config_fileName="Mon_METSlice.json"
+    config_fileName="TriggerMenuMT/Mon_METSlice.json"
     
     with open(config_fileName,'r') as file:
         json_file = json.load(file, object_pairs_hook = odict)
@@ -43,7 +43,7 @@ def __generateJSON(chainDicts, chainConfigs, menuName, menuFileName, prescaleFil
 
             #check that the chain is present in the Menu
             if chain_name not in menuChains:
-                __log.info( "Chain %s not present in the HLT Menu JSON %s", chain_name, menuFileName)
+                __log.error( "Chain %s not present in the HLT Menu JSON %s", chain_name, menuFileName)
                 continue
 
             #and then the elements of that chain, e.g:
-- 
GitLab


From bc4686b24102526722e607ffe0857433e2d94b71 Mon Sep 17 00:00:00 2001
From: gipezzul <g.pezzullo@yale.edu>
Date: Mon, 26 Oct 2020 14:04:10 +0100
Subject: [PATCH 04/30] added a function for getting the name of the HLT
 monitoting json file

---
 .../TrigConfigSvc/python/TrigConfigSvcCfg.py                | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/Trigger/TrigConfiguration/TrigConfigSvc/python/TrigConfigSvcCfg.py b/Trigger/TrigConfiguration/TrigConfigSvc/python/TrigConfigSvcCfg.py
index ca5c5c200a50..efa5a6731ea7 100644
--- a/Trigger/TrigConfiguration/TrigConfigSvc/python/TrigConfigSvcCfg.py
+++ b/Trigger/TrigConfiguration/TrigConfigSvc/python/TrigConfigSvcCfg.py
@@ -40,6 +40,12 @@ def getHLTPrescalesSetFileName( flags ):
     hltPrescalesSetFileName = 'HLTPrescalesSet_'+flags.Trigger.triggerMenuSetup+'_'+flags.Trigger.menuVersion+'.json'
     return hltPrescalesSetFileName
 
+# HLT Monitoring set json file name
+def getHLTMonitoringFileName( flags ):
+    hltMonitoringFileName = 'HLTMonitoring_'+flags.Trigger.triggerMenuSetup+'_'+flags.Trigger.menuVersion+'.json'
+    return hltMonitoringFileName
+
+
 # L1 Bunchgroups set json file name
 def getBunchGroupSetFileName( flags ):
     bunchGroupSetFileName = 'BunchGroupSet_'+flags.Trigger.triggerMenuSetup+'_'+flags.Trigger.menuVersion+'.json'
-- 
GitLab


From c665eea5fbcf7e93cac103dca8fa1516b2bdaaf8 Mon Sep 17 00:00:00 2001
From: gipezzul <g.pezzullo@yale.edu>
Date: Fri, 30 Oct 2020 04:02:19 +0100
Subject: [PATCH 05/30] fixed structure of the json file

---
 .../TriggerMenuMT/share/Mon_METSlice.json            | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/share/Mon_METSlice.json b/Trigger/TriggerCommon/TriggerMenuMT/share/Mon_METSlice.json
index 1a656e3fa887..3550d589f1df 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/share/Mon_METSlice.json
+++ b/Trigger/TriggerCommon/TriggerMenuMT/share/Mon_METSlice.json
@@ -1,30 +1,30 @@
 {
-    'HLT_xe65_cell_L1XE50' : {
+    "HLT_xe65_cell_L1XE50" : {
 	"monP1": false,
         "monT0": true,
         "monOffline": true
     }, 
-    'HLT_xe100_mht_L1XE50': {
+    "HLT_xe100_mht_L1XE50": {
 	"monP1": false,
         "monT0": true,
         "monOffline": true
     },
-    'HLT_xe100_tcpufit_L1XE50': {
+    "HLT_xe100_tcpufit_L1XE50": {
 	"monP1": false,
         "monT0": true,
         "monOffline": true
     },
-    'HLT_xe100_trkmht_L1XE50': {
+    "HLT_xe100_trkmht_L1XE50": {
 	"monP1": false,
         "monT0": true,
         "monOffline": true
     }, 
-    'HLT_xe100_pfsum_L1XE50': {
+    "HLT_xe100_pfsum_L1XE50": {
 	"monP1": false,
         "monT0": true,
         "monOffline": true
     }, 
-    'HLT_xe65_cell_xe110_tcpufit_L1XE50': {
+    "HLT_xe65_cell_xe110_tcpufit_L1XE50": {
 	"monP1": false,
         "monT0": true,
         "monOffline": true
-- 
GitLab


From 3afb3f5b6c9d61f49314977af1f5f822f7455ff4 Mon Sep 17 00:00:00 2001
From: gipezzul <g.pezzullo@yale.edu>
Date: Fri, 30 Oct 2020 04:02:47 +0100
Subject: [PATCH 06/30] fixed bugs + added debug printout level

---
 .../HLTMenuConfig/Menu/GenerateMenuMT.py      |  1 +
 .../HLTMenuConfig/Menu/HLTMonitoringJSON.py   | 40 ++++++++++++++-----
 2 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
index 1d98f5e83e16..26aa2a530b37 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
@@ -563,6 +563,7 @@ class GenerateMenuMT(object):
         from TriggerMenuMT.HLTMenuConfig.Menu.HLTPrescaleJSON import generateJSON as generatePrescaleJSON
         generatePrescaleJSON()
 
+        log.debug('[GenerateMenuMT::generateMT] now generating HLTMonitoring JSON...')
         from TriggerMenuMT.HLTMenuConfig.Menu.HLTMonitoringJSON import generateJSON as generateMonitoringJSON
         generateMonitoringJSON()
 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
index b6ae37098ae4..b0daf7117f9b 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
@@ -12,28 +12,43 @@ def generateJSON():
     from AthenaConfiguration.AllConfigFlags import ConfigFlags
     from TriggerMenuMT.HLTMenuConfig.Menu.TriggerConfigHLT import TriggerConfigHLT
 
+    __log.debug("[HLTMonitoring::generateJSON] HLTMenuFileName =  %s", getHLTMenuFileName(ConfigFlags)        )
+    __log.debug("[HLTMonitoring::generateJSON] HLTPrescalesSetFileName  = %s", getHLTPrescalesSetFileName(ConfigFlags))
+    __log.debug("[HLTMonitoring::generateJSON] HLTMonitoringFileName =  %s", getHLTMonitoringFileName(ConfigFlags)  )
+
     return __generateJSON( TriggerConfigHLT.dictsList(),
                            TriggerConfigHLT.configsList(),
                            ConfigFlags.Trigger.triggerMenuSetup,
-                           getHLTMenuFileName(ConfigFlags),
+                           getHLTMenuFileName(ConfigFlags),       
                            getHLTPrescalesSetFileName(ConfigFlags),
-                           getHLTMonitoringFileName(ConfigFlags) )
+                           getHLTMonitoringFileName(ConfigFlags))
 
 def __generateJSON(chainDicts, chainConfigs, menuName, menuFileName, prescaleFileName, fileName):
+
     #get the name of the outputfile
     menuFile   = open(menuFileName,'r')
     menuDict   = json.load(menuFile, object_pairs_hook = odict)
     menuChains = menuDict['chains'].keys()
-     
+    # menuChains = menuDict.keys()
+    for ch in menuChains:
+        __log.debug("[HLTMonitoring::generateJSON] Menu chains: %s", ch)
+
     # get the dict of the prescales
-    prescaleFile  = open(prescaleFileName,'r')
-    prescaleDict  = json.load(prescaleFile, object_pairs_hook = odict)
-     
+    prescaleFile   = open(prescaleFileName,'r')
+    prescaleDict   = json.load(prescaleFile, object_pairs_hook = odict)
+    prescaleKeys   = prescaleDict.keys()
+    for ch in prescaleKeys:
+        __log.debug("[HLTMonitoring::generateJSON] Prescale keys: %s", ch)
+ 
+    prescaleChains = prescaleDict['prescales'].keys()
+    for ch in prescaleChains:
+        __log.debug("[HLTMonitoring::generateJSON] Prescale chains: %s", ch)
+
     #create the dictionary the will house the monitoring info
     monDict=odict([ ("filetype", "hltmonitoring"), ("name", menuName), ("monchains", odict()) ])
     
     #test file: FIXME!
-    config_fileName="TriggerMenuMT/Mon_METSlice.json"
+    config_fileName="Mon_METSlice.json"
     
     with open(config_fileName,'r') as file:
         json_file = json.load(file, object_pairs_hook = odict)
@@ -45,11 +60,18 @@ def __generateJSON(chainDicts, chainConfigs, menuName, menuFileName, prescaleFil
             if chain_name not in menuChains:
                 __log.error( "Chain %s not present in the HLT Menu JSON %s", chain_name, menuFileName)
                 continue
+            __log.debug("[HLTMonitoring::generateJSON] chain %s found in the HLT Menu dict..", chain_name)
+
+            if chain_name not in prescaleChains:
+                __log.error( "Chain %s not present in the HLT PrescaleSet JSON %s", chain_name, prescaleFileName)
+                continue
+            __log.debug("[HLTMonitoring::generateJSON] chain %s found in the HLT PrescaleSet dict..", chain_name)
+
 
             #and then the elements of that chain, e.g:
             # ch['groups']
             monDict['monchains'][chain_name] = odict([
-                ('prescale', prescaleDict[chain_name]['prescale']),
+                ('prescale', prescaleDict['prescales'][chain_name]['prescale']),
                 #('enabled', ch['enabled']),
                 ('monP1', ch['monP1']),
                 ('monT0', ch['monT0']),
@@ -59,4 +81,4 @@ def __generateJSON(chainDicts, chainConfigs, menuName, menuFileName, prescaleFil
     # then writing to a file is as simple as:
     __log.info( "Writing HLT Monitoring JSON to %s", fileName )
     with open(fileName, 'w') as outfile:
-        json.dump(monDict, outfile, indent = 4)
+        json.dump(monDict, outfile, indent = 4, sort_keys=False )
-- 
GitLab


From 6dabc19dabeb9ad706614314a103a891afc861be Mon Sep 17 00:00:00 2001
From: gipezzul <g.pezzullo@yale.edu>
Date: Mon, 16 Nov 2020 00:12:31 +0100
Subject: [PATCH 07/30] changed function name to generateMonitoringJSON, and
 removed unused input variables and prescale key form the JSON output

---
 .../HLTMenuConfig/Menu/GenerateMenuMT.py      |  2 +-
 .../HLTMenuConfig/Menu/HLTMonitoringJSON.py   | 31 +++----------------
 2 files changed, 6 insertions(+), 27 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
index 26aa2a530b37..b678d5d4b1fa 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
@@ -564,7 +564,7 @@ class GenerateMenuMT(object):
         generatePrescaleJSON()
 
         log.debug('[GenerateMenuMT::generateMT] now generating HLTMonitoring JSON...')
-        from TriggerMenuMT.HLTMenuConfig.Menu.HLTMonitoringJSON import generateJSON as generateMonitoringJSON
+        from TriggerMenuMT.HLTMenuConfig.Menu.HLTMonitoringJSON import generateMonitoringJSON
         generateMonitoringJSON()
 
         return finalListOfChainConfigs
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
index b0daf7117f9b..7b4efd8ba12b 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
@@ -7,7 +7,7 @@ from AthenaCommon.Logging import logging
 __log = logging.getLogger( __name__ )
 
 
-def generateJSON():
+def generateMonitoringJSON():
     __log.info("Generating HLT Monitoring JSON in the rec-ex-common job")
     from AthenaConfiguration.AllConfigFlags import ConfigFlags
     from TriggerMenuMT.HLTMenuConfig.Menu.TriggerConfigHLT import TriggerConfigHLT
@@ -16,14 +16,11 @@ def generateJSON():
     __log.debug("[HLTMonitoring::generateJSON] HLTPrescalesSetFileName  = %s", getHLTPrescalesSetFileName(ConfigFlags))
     __log.debug("[HLTMonitoring::generateJSON] HLTMonitoringFileName =  %s", getHLTMonitoringFileName(ConfigFlags)  )
 
-    return __generateJSON( TriggerConfigHLT.dictsList(),
-                           TriggerConfigHLT.configsList(),
-                           ConfigFlags.Trigger.triggerMenuSetup,
-                           getHLTMenuFileName(ConfigFlags),       
-                           getHLTPrescalesSetFileName(ConfigFlags),
-                           getHLTMonitoringFileName(ConfigFlags))
+    return __generateMonitoringJSON(ConfigFlags.Trigger.triggerMenuSetup,
+                                    getHLTMenuFileName(ConfigFlags),       
+                                    getHLTMonitoringFileName(ConfigFlags))
 
-def __generateJSON(chainDicts, chainConfigs, menuName, menuFileName, prescaleFileName, fileName):
+def __generateMonitoringJSON(menuName, menuFileName, fileName):
 
     #get the name of the outputfile
     menuFile   = open(menuFileName,'r')
@@ -33,17 +30,6 @@ def __generateJSON(chainDicts, chainConfigs, menuName, menuFileName, prescaleFil
     for ch in menuChains:
         __log.debug("[HLTMonitoring::generateJSON] Menu chains: %s", ch)
 
-    # get the dict of the prescales
-    prescaleFile   = open(prescaleFileName,'r')
-    prescaleDict   = json.load(prescaleFile, object_pairs_hook = odict)
-    prescaleKeys   = prescaleDict.keys()
-    for ch in prescaleKeys:
-        __log.debug("[HLTMonitoring::generateJSON] Prescale keys: %s", ch)
- 
-    prescaleChains = prescaleDict['prescales'].keys()
-    for ch in prescaleChains:
-        __log.debug("[HLTMonitoring::generateJSON] Prescale chains: %s", ch)
-
     #create the dictionary the will house the monitoring info
     monDict=odict([ ("filetype", "hltmonitoring"), ("name", menuName), ("monchains", odict()) ])
     
@@ -62,16 +48,9 @@ def __generateJSON(chainDicts, chainConfigs, menuName, menuFileName, prescaleFil
                 continue
             __log.debug("[HLTMonitoring::generateJSON] chain %s found in the HLT Menu dict..", chain_name)
 
-            if chain_name not in prescaleChains:
-                __log.error( "Chain %s not present in the HLT PrescaleSet JSON %s", chain_name, prescaleFileName)
-                continue
-            __log.debug("[HLTMonitoring::generateJSON] chain %s found in the HLT PrescaleSet dict..", chain_name)
-
-
             #and then the elements of that chain, e.g:
             # ch['groups']
             monDict['monchains'][chain_name] = odict([
-                ('prescale', prescaleDict['prescales'][chain_name]['prescale']),
                 #('enabled', ch['enabled']),
                 ('monP1', ch['monP1']),
                 ('monT0', ch['monT0']),
-- 
GitLab


From 22fd17d61dc1c8fec6ea7e85f2a9bc6569995f85 Mon Sep 17 00:00:00 2001
From: gipezzul <g.pezzullo@yale.edu>
Date: Mon, 16 Nov 2020 05:13:23 +0100
Subject: [PATCH 08/30] updates

---
 .../HLTMenuConfig/Menu/HLTMonitoringJSON.py   | 48 ++++++++++---------
 1 file changed, 26 insertions(+), 22 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
index 7b4efd8ba12b..24ef8a3d3fe7 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
@@ -10,7 +10,6 @@ __log = logging.getLogger( __name__ )
 def generateMonitoringJSON():
     __log.info("Generating HLT Monitoring JSON in the rec-ex-common job")
     from AthenaConfiguration.AllConfigFlags import ConfigFlags
-    from TriggerMenuMT.HLTMenuConfig.Menu.TriggerConfigHLT import TriggerConfigHLT
 
     __log.debug("[HLTMonitoring::generateJSON] HLTMenuFileName =  %s", getHLTMenuFileName(ConfigFlags)        )
     __log.debug("[HLTMonitoring::generateJSON] HLTPrescalesSetFileName  = %s", getHLTPrescalesSetFileName(ConfigFlags))
@@ -22,6 +21,8 @@ def generateMonitoringJSON():
 
 def __generateMonitoringJSON(menuName, menuFileName, fileName):
 
+    import TriggerMenuMT.HLTMenuConfig.Menu.Mon_METSlice as Mon_METSlice
+
     #get the name of the outputfile
     menuFile   = open(menuFileName,'r')
     menuDict   = json.load(menuFile, object_pairs_hook = odict)
@@ -34,28 +35,31 @@ def __generateMonitoringJSON(menuName, menuFileName, fileName):
     monDict=odict([ ("filetype", "hltmonitoring"), ("name", menuName), ("monchains", odict()) ])
     
     #test file: FIXME!
-    config_fileName="Mon_METSlice.json"
+    # config_fileName="Mon_METSlice.json"
     
-    with open(config_fileName,'r') as file:
-        json_file = json.load(file, object_pairs_hook = odict)
-
-        # then you can iterate, say over the HLT menu:
-        for chain_name, ch in json_file.items(): #json_file['chains'].items():
-
-            #check that the chain is present in the Menu
-            if chain_name not in menuChains:
-                __log.error( "Chain %s not present in the HLT Menu JSON %s", chain_name, menuFileName)
-                continue
-            __log.debug("[HLTMonitoring::generateJSON] chain %s found in the HLT Menu dict..", chain_name)
-
-            #and then the elements of that chain, e.g:
-            # ch['groups']
-            monDict['monchains'][chain_name] = odict([
-                #('enabled', ch['enabled']),
-                ('monP1', ch['monP1']),
-                ('monT0', ch['monT0']),
-                ('monOffline', ch['monOffline'])
-            ])
+    # with open(config_fileName,'r') as file:
+    #     json_file = json.load(file, object_pairs_hook = odict)
+
+    # then you can iterate, say over the HLT menu:
+    #    for chain_name, ch in json_file.items(): #json_file['chains'].items():
+    for chain_name in Mon_METSlice.chainsToMonitor:
+        #check that the chain is present in the Menu
+        if chain_name not in menuChains:
+            __log.error( "Chain %s not present in the HLT Menu JSON %s", chain_name, menuFileName)
+            continue
+        __log.debug("[HLTMonitoring::generateJSON] chain %s found in the HLT Menu dict..", chain_name)
+
+        #and then the elements of that chain, e.g:
+        # ch['groups']
+        monDict['monchains'][chain_name] = odict([
+            ('monP1', Mon_METSlice.monP1),
+            ('monT0', Mon_METSlice.monT0),
+            ('monOffline', Mon_METSlice.monOffline)
+            #('enabled', ch['enabled']),
+            # ('monP1', ch['monP1']),
+            # ('monT0', ch['monT0']),
+            # ('monOffline', ch['monOffline'])
+        ])
 
     # then writing to a file is as simple as:
     __log.info( "Writing HLT Monitoring JSON to %s", fileName )
-- 
GitLab


From 495ac81c884bdbc8077a88551a3a96673083ecf0 Mon Sep 17 00:00:00 2001
From: gipezzul <g.pezzullo@yale.edu>
Date: Mon, 16 Nov 2020 05:13:50 +0100
Subject: [PATCH 09/30] test file

---
 .../python/HLTMenuConfig/Menu/Mon_METSlice.py         | 11 +++++++++++
 1 file changed, 11 insertions(+)
 create mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Mon_METSlice.py

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Mon_METSlice.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Mon_METSlice.py
new file mode 100644
index 000000000000..853ab9d8af44
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Mon_METSlice.py
@@ -0,0 +1,11 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+# from AthenaCommon.Logging import logging
+# __log = logging.getLogger( __name__ )
+
+chainsToMonitor = ["HLT_xe65_cell_L1XE50", "HLT_xe100_mht_L1XE50", "HLT_xe100_tcpufit_L1XE50",
+                   "HLT_xe100_trkmht_L1XE50", "HLT_xe100_pfsum_L1XE50", "HLT_xe65_cell_xe110_tcpufit_L1XE50"]
+monP1      = False
+monT0      = True
+monOffline = True
+
-- 
GitLab


From de7bae141b2061adf68cef3006284417705a10da Mon Sep 17 00:00:00 2001
From: gipezzul <g.pezzullo@yale.edu>
Date: Mon, 23 Nov 2020 05:05:26 +0100
Subject: [PATCH 10/30] crated new dir for the HLTMon script and config files

---
 .../TriggerMenuMT/CMakeLists.txt              |  1 +
 .../HLTMenuConfig/Menu/GenerateMenuMT.py      |  4 +-
 .../python/HLTMenuConfig/Menu/Mon_METSlice.py | 11 ----
 .../MET/METChainMonConfiguration.py           | 12 ++++
 .../python/HLTMonConfig/MET/__init__.py       |  2 +
 .../python/HLTMonConfig/Mon/ChainDefInMon.py  | 14 +++++
 .../python/HLTMonConfig/Mon/ChainMon.py       |  7 +++
 .../Mon}/HLTMonitoringJSON.py                 | 62 ++++++++++---------
 .../python/HLTMonConfig/__init__.py           |  0
 .../TriggerMenuMT/share/Mon_METSlice.json     | 32 ----------
 10 files changed, 71 insertions(+), 74 deletions(-)
 delete mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Mon_METSlice.py
 create mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/METChainMonConfiguration.py
 create mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/__init__.py
 create mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainDefInMon.py
 create mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainMon.py
 rename Trigger/TriggerCommon/TriggerMenuMT/python/{HLTMenuConfig/Menu => HLTMonConfig/Mon}/HLTMonitoringJSON.py (51%)
 create mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/__init__.py
 delete mode 100644 Trigger/TriggerCommon/TriggerMenuMT/share/Mon_METSlice.json

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt b/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt
index 4ce4f91ce383..58a29436e185 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt
+++ b/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt
@@ -102,6 +102,7 @@ atlas_install_python_modules( python/*.py
                               python/LVL1MenuConfig
                               python/L1
                               python/HLTMenuConfig
+                              python/HLTMonConfig
 			                  POST_BUILD_CMD ${ATLAS_FLAKE8})
 
 atlas_install_scripts( scripts/generateMenuMT.py
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
index b678d5d4b1fa..a8246cdc3884 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
@@ -564,7 +564,7 @@ class GenerateMenuMT(object):
         generatePrescaleJSON()
 
         log.debug('[GenerateMenuMT::generateMT] now generating HLTMonitoring JSON...')
-        from TriggerMenuMT.HLTMenuConfig.Menu.HLTMonitoringJSON import generateMonitoringJSON
-        generateMonitoringJSON()
+        from TriggerMenuMT.HLTMonConfig.Mon.HLTMonitoringJSON import generateDefaultMonitoringJSON
+        generateDefaultMonitoringJSON()
 
         return finalListOfChainConfigs
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Mon_METSlice.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Mon_METSlice.py
deleted file mode 100644
index 853ab9d8af44..000000000000
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Mon_METSlice.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-
-# from AthenaCommon.Logging import logging
-# __log = logging.getLogger( __name__ )
-
-chainsToMonitor = ["HLT_xe65_cell_L1XE50", "HLT_xe100_mht_L1XE50", "HLT_xe100_tcpufit_L1XE50",
-                   "HLT_xe100_trkmht_L1XE50", "HLT_xe100_pfsum_L1XE50", "HLT_xe65_cell_xe110_tcpufit_L1XE50"]
-monP1      = False
-monT0      = True
-monOffline = True
-
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/METChainMonConfiguration.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/METChainMonConfiguration.py
new file mode 100644
index 000000000000..c13d109f8056
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/METChainMonConfiguration.py
@@ -0,0 +1,12 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+from TriggerMenuMT.HLTMonConfig.Mon.ChainDefInMon import ChainMonProp
+
+METChainMon = ChainMonProp(name="METSliceMon", 
+                           chains=["HLT_xe65_cell_L1XE50", "HLT_xe100_mht_L1XE50", "HLT_xe100_tcpufit_L1XE50",
+                                   "HLT_xe100_trkmht_L1XE50", "HLT_xe100_pfsum_L1XE50", "HLT_xe65_cell_xe110_tcpufit_L1XE50"],
+                           monP1=[True, True, True, True, True, True],
+                           monT0=[True, True, True, True, True, True],
+                           monOffline=True)
+
+
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/__init__.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/__init__.py
new file mode 100644
index 000000000000..91873a08bc5a
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/__init__.py
@@ -0,0 +1,2 @@
+#Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainDefInMon.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainDefInMon.py
new file mode 100644
index 000000000000..70a9ac378576
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainDefInMon.py
@@ -0,0 +1,14 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+# from AthenaCommon.Logging import logging
+# __log = logging.getLogger( __name__ )
+from TriggerMenuMT.HLTMenuConfig.Menu.ChainDefInMenu import namedtuple_with_defaults
+
+
+ChainMonProp = namedtuple_with_defaults("ChainMonPro",
+                                        ['name','chains', 'monP1', 'monT0', 'monOffline'],
+                                        {'chains' : [],
+                                         'monP1'  : [], 
+                                         'monT0'  : [], 
+                                         'monOffline' : []})
+
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainMon.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainMon.py
new file mode 100644
index 000000000000..89d072de185d
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainMon.py
@@ -0,0 +1,7 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+from TriggerMenuMT.HLTMonConfig.MET.METChainMonConfiguration import METChainMon
+
+chainsToMonitor = [
+    METChainMon
+]
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/HLTMonitoringJSON.py
similarity index 51%
rename from Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
rename to Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/HLTMonitoringJSON.py
index 24ef8a3d3fe7..cd728beb4bc8 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/HLTMonitoringJSON.py
@@ -7,7 +7,7 @@ from AthenaCommon.Logging import logging
 __log = logging.getLogger( __name__ )
 
 
-def generateMonitoringJSON():
+def generateDefaultMonitoringJSON():
     __log.info("Generating HLT Monitoring JSON in the rec-ex-common job")
     from AthenaConfiguration.AllConfigFlags import ConfigFlags
 
@@ -15,51 +15,55 @@ def generateMonitoringJSON():
     __log.debug("[HLTMonitoring::generateJSON] HLTPrescalesSetFileName  = %s", getHLTPrescalesSetFileName(ConfigFlags))
     __log.debug("[HLTMonitoring::generateJSON] HLTMonitoringFileName =  %s", getHLTMonitoringFileName(ConfigFlags)  )
 
-    return __generateMonitoringJSON(ConfigFlags.Trigger.triggerMenuSetup,
+    return generateMonitoringJSON(ConfigFlags.Trigger.triggerMenuSetup,
                                     getHLTMenuFileName(ConfigFlags),       
                                     getHLTMonitoringFileName(ConfigFlags))
 
-def __generateMonitoringJSON(menuName, menuFileName, fileName):
+def generateMonitoringJSON(menuName, menuFileName, fileName):
 
-    import TriggerMenuMT.HLTMenuConfig.Menu.Mon_METSlice as Mon_METSlice
+    from TriggerMenuMT.HLTMonConfig.Mon.ChainMon import chainsToMonitor
 
     #get the name of the outputfile
     menuFile   = open(menuFileName,'r')
     menuDict   = json.load(menuFile, object_pairs_hook = odict)
     menuChains = menuDict['chains'].keys()
-    # menuChains = menuDict.keys()
     for ch in menuChains:
         __log.debug("[HLTMonitoring::generateJSON] Menu chains: %s", ch)
 
     #create the dictionary the will house the monitoring info
     monDict=odict([ ("filetype", "hltmonitoring"), ("name", menuName), ("monchains", odict()) ])
     
-    #test file: FIXME!
-    # config_fileName="Mon_METSlice.json"
-    
-    # with open(config_fileName,'r') as file:
-    #     json_file = json.load(file, object_pairs_hook = odict)
-
     # then you can iterate, say over the HLT menu:
-    #    for chain_name, ch in json_file.items(): #json_file['chains'].items():
-    for chain_name in Mon_METSlice.chainsToMonitor:
-        #check that the chain is present in the Menu
-        if chain_name not in menuChains:
-            __log.error( "Chain %s not present in the HLT Menu JSON %s", chain_name, menuFileName)
-            continue
-        __log.debug("[HLTMonitoring::generateJSON] chain %s found in the HLT Menu dict..", chain_name)
+    for monSlice in chainsToMonitor:
+        __log.debug("[HLTMonitoring::generateJSON] Processing Slice %s ...", monSlice.name)
+
+        for i, chain_name in enumerate(monSlice.chains):
+            #check that the chain is present in the Menu
+            if chain_name not in menuChains:
+                __log.error( "Chain %s not present in the HLT Menu JSON %s", chain_name, menuFileName)
+                continue
+            __log.debug("[HLTMonitoring::generateJSON] chain %s found in the HLT Menu dict..", chain_name)
+            
+            if isinstance(monSlice.monP1, list):
+                chain_monP1 = monSlice.monP1[i]
+            else:
+                chain_monP1 = monSlice.monP1
+            if isinstance(monSlice.monT0, list):
+                chain_monT0 = monSlice.monT0[i]
+            else:
+                chain_monT0 = monSlice.monT0
+            if isinstance(monSlice.monOffline, list):
+                chain_monOffline = monSlice.monOffline[i]
+            else:
+                chain_monOffline = monSlice.monOffline
 
-        #and then the elements of that chain, e.g:
-        # ch['groups']
-        monDict['monchains'][chain_name] = odict([
-            ('monP1', Mon_METSlice.monP1),
-            ('monT0', Mon_METSlice.monT0),
-            ('monOffline', Mon_METSlice.monOffline)
-            #('enabled', ch['enabled']),
-            # ('monP1', ch['monP1']),
-            # ('monT0', ch['monT0']),
-            # ('monOffline', ch['monOffline'])
-        ])
+            #and then the elements of that chain, e.g:
+            # ch['groups']
+            monDict['monchains'][chain_name] = odict([
+                ('monP1', chain_monP1),
+                ('monT0', chain_monT0),
+                ('monOffline', chain_monOffline)
+            ])
 
     # then writing to a file is as simple as:
     __log.info( "Writing HLT Monitoring JSON to %s", fileName )
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/__init__.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/__init__.py
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/share/Mon_METSlice.json b/Trigger/TriggerCommon/TriggerMenuMT/share/Mon_METSlice.json
deleted file mode 100644
index 3550d589f1df..000000000000
--- a/Trigger/TriggerCommon/TriggerMenuMT/share/Mon_METSlice.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-    "HLT_xe65_cell_L1XE50" : {
-	"monP1": false,
-        "monT0": true,
-        "monOffline": true
-    }, 
-    "HLT_xe100_mht_L1XE50": {
-	"monP1": false,
-        "monT0": true,
-        "monOffline": true
-    },
-    "HLT_xe100_tcpufit_L1XE50": {
-	"monP1": false,
-        "monT0": true,
-        "monOffline": true
-    },
-    "HLT_xe100_trkmht_L1XE50": {
-	"monP1": false,
-        "monT0": true,
-        "monOffline": true
-    }, 
-    "HLT_xe100_pfsum_L1XE50": {
-	"monP1": false,
-        "monT0": true,
-        "monOffline": true
-    }, 
-    "HLT_xe65_cell_xe110_tcpufit_L1XE50": {
-	"monP1": false,
-        "monT0": true,
-        "monOffline": true
-    }
-}
-- 
GitLab


From 26b8d895aefed7800dfe93b9188fb13f139387af Mon Sep 17 00:00:00 2001
From: gipezzul <g.pezzullo@yale.edu>
Date: Mon, 23 Nov 2020 18:58:28 +0100
Subject: [PATCH 11/30] improved structure for storing the chains within a
 given signature

---
 .../MET/METChainMonConfiguration.py           | 15 +++---
 .../python/HLTMonConfig/Mon/ChainDefInMon.py  | 11 +++--
 .../python/HLTMonConfig/Mon/ChainMon.py       |  7 +--
 .../HLTMonConfig/Mon/HLTMonitoringJSON.py     | 47 +++++++------------
 4 files changed, 36 insertions(+), 44 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/METChainMonConfiguration.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/METChainMonConfiguration.py
index c13d109f8056..62dd60c89d4c 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/METChainMonConfiguration.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/METChainMonConfiguration.py
@@ -2,11 +2,14 @@
 
 from TriggerMenuMT.HLTMonConfig.Mon.ChainDefInMon import ChainMonProp
 
-METChainMon = ChainMonProp(name="METSliceMon", 
-                           chains=["HLT_xe65_cell_L1XE50", "HLT_xe100_mht_L1XE50", "HLT_xe100_tcpufit_L1XE50",
-                                   "HLT_xe100_trkmht_L1XE50", "HLT_xe100_pfsum_L1XE50", "HLT_xe65_cell_xe110_tcpufit_L1XE50"],
-                           monP1=[True, True, True, True, True, True],
-                           monT0=[True, True, True, True, True, True],
-                           monOffline=True)
+METChainMon = [] 
+METChainMon += [ 
+    ChainMonProp(name="HLT_xe65_cell_L1XE50", monP1=True, monT0=True, monOffline=True),
+    ChainMonProp(name="HLT_xe100_mht_L1XE50", monP1=True, monT0=True, monOffline=True),
+    ChainMonProp(name="HLT_xe100_tcpufit_L1XE50", monP1=True, monT0=True, monOffline=True),
+    ChainMonProp(name="HLT_xe100_trkmht_L1XE50", monP1=True, monT0=True, monOffline=True),
+    ChainMonProp(name="HLT_xe100_pfsum_L1XE50", monP1=True, monT0=True, monOffline=True),
+    ChainMonProp(name="HLT_xe65_cell_xe110_tcpufit_L1XE50", monP1=True, monT0=True, monOffline=True)
+]
 
 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainDefInMon.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainDefInMon.py
index 70a9ac378576..4c617fce76be 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainDefInMon.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainDefInMon.py
@@ -1,3 +1,4 @@
+
 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # from AthenaCommon.Logging import logging
@@ -6,9 +7,9 @@ from TriggerMenuMT.HLTMenuConfig.Menu.ChainDefInMenu import namedtuple_with_defa
 
 
 ChainMonProp = namedtuple_with_defaults("ChainMonPro",
-                                        ['name','chains', 'monP1', 'monT0', 'monOffline'],
-                                        {'chains' : [],
-                                         'monP1'  : [], 
-                                         'monT0'  : [], 
-                                         'monOffline' : []})
+                                        ['name', 'monP1', 'monT0', 'monOffline'],
+                                        {'name' : 'UNSET',
+                                         'monP1'  : False, 
+                                         'monT0'  : False, 
+                                         'monOffline' : False})
 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainMon.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainMon.py
index 89d072de185d..b1a519db4103 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainMon.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainMon.py
@@ -2,6 +2,7 @@
 
 from TriggerMenuMT.HLTMonConfig.MET.METChainMonConfiguration import METChainMon
 
-chainsToMonitor = [
-    METChainMon
-]
+chainsToMonitor = []
+
+chainsToMonitor += METChainMon 
+
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/HLTMonitoringJSON.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/HLTMonitoringJSON.py
index cd728beb4bc8..bfea52447a8c 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/HLTMonitoringJSON.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/HLTMonitoringJSON.py
@@ -28,42 +28,29 @@ def generateMonitoringJSON(menuName, menuFileName, fileName):
     menuDict   = json.load(menuFile, object_pairs_hook = odict)
     menuChains = menuDict['chains'].keys()
     for ch in menuChains:
-        __log.debug("[HLTMonitoring::generateJSON] Menu chains: %s", ch)
+        __log.debug("[HLTMonitoring::generateMonitoringJSON] Menu chains: %s", ch)
 
     #create the dictionary the will house the monitoring info
     monDict=odict([ ("filetype", "hltmonitoring"), ("name", menuName), ("monchains", odict()) ])
     
     # then you can iterate, say over the HLT menu:
-    for monSlice in chainsToMonitor:
-        __log.debug("[HLTMonitoring::generateJSON] Processing Slice %s ...", monSlice.name)
-
-        for i, chain_name in enumerate(monSlice.chains):
-            #check that the chain is present in the Menu
-            if chain_name not in menuChains:
-                __log.error( "Chain %s not present in the HLT Menu JSON %s", chain_name, menuFileName)
-                continue
-            __log.debug("[HLTMonitoring::generateJSON] chain %s found in the HLT Menu dict..", chain_name)
+    for chain in chainsToMonitor:
+        __log.debug("[HLTMonitoring::generateMonitoringJSON] Processing Chain %s ...", chain)
+        chain_name=chain.name
+        
+        #check that the chain is present in the Menu
+        if chain_name not in menuChains:
+            __log.error( "Chain %s not present in the HLT Menu JSON %s", chain_name, menuFileName)
+            continue
+        __log.debug("[HLTMonitoring::generateMonitoringJSON] chain %s found in the HLT Menu dict..", chain_name)
             
-            if isinstance(monSlice.monP1, list):
-                chain_monP1 = monSlice.monP1[i]
-            else:
-                chain_monP1 = monSlice.monP1
-            if isinstance(monSlice.monT0, list):
-                chain_monT0 = monSlice.monT0[i]
-            else:
-                chain_monT0 = monSlice.monT0
-            if isinstance(monSlice.monOffline, list):
-                chain_monOffline = monSlice.monOffline[i]
-            else:
-                chain_monOffline = monSlice.monOffline
-
-            #and then the elements of that chain, e.g:
-            # ch['groups']
-            monDict['monchains'][chain_name] = odict([
-                ('monP1', chain_monP1),
-                ('monT0', chain_monT0),
-                ('monOffline', chain_monOffline)
-            ])
+        #and then the elements of that chain, e.g:
+        # ch['groups']
+        monDict['monchains'][chain_name] = odict([
+            ('monP1', chain.monP1),
+            ('monT0', chain.monT0),
+            ('monOffline', chain.monOffline)
+        ])
 
     # then writing to a file is as simple as:
     __log.info( "Writing HLT Monitoring JSON to %s", fileName )
-- 
GitLab


From 4607c4c9ca1ae6b2db082c8c37deb87e873b5093 Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Sat, 16 Jan 2021 23:36:16 +0100
Subject: [PATCH 12/30] included HLTmonitoring JSON maker

---
 Trigger/TriggerCommon/TriggerMenuMT/share/full_menu_cf.py | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/share/full_menu_cf.py b/Trigger/TriggerCommon/TriggerMenuMT/share/full_menu_cf.py
index 51d811f69883..3b8b7e90ee29 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/share/full_menu_cf.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/share/full_menu_cf.py
@@ -307,12 +307,8 @@ generateJSON()
 from TriggerMenuMT.HLTMenuConfig.Menu.HLTPrescaleJSON import generateJSON as generatePrescaleJSON
 generatePrescaleJSON()
    
-<<<<<<< HEAD
 from TriggerMenuMT.HLTMenuConfig.Menu.HLTMonitoringJSON import generateJSON as generateMonitoringJSON
 generateMonitoringJSON()
 
-from AthenaCommon.AlgSequence import dumpSequence, AthSequencer
-=======
 from AthenaCommon.AlgSequence import dumpSequence
->>>>>>> 0a56170c2bc9d535b27e53054ed5fb5ecf7dcaa9
 dumpSequence(topSequence)
-- 
GitLab


From 650668bf83a28ad801f18454e6416d20c9fdec72 Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Fri, 22 Jan 2021 07:19:06 +0100
Subject: [PATCH 13/30] added monGoups for testing

---
 .../TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py         | 4 ++--
 .../python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py           | 3 +++
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
index 0dc13b943705..4c3019888e69 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
@@ -14,7 +14,7 @@ import TriggerMenuMT.HLTMenuConfig.Menu.MC_pp_run3_v1 as mc_menu
 import TriggerMenuMT.HLTMenuConfig.Menu.PhysicsP1_pp_run3_v1 as p1_menu
 
 # this is not the best option, due to flake violation, this list has to be changed when some groups are removed
-from TriggerMenuMT.HLTMenuConfig.Menu.Physics_pp_run3_v1 import PhysicsStream,SingleMuonGroup,MultiMuonGroup,SingleElectronGroup,MultiElectronGroup,SinglePhotonGroup,MultiPhotonGroup,SingleMETGroup,MultiMETGroup,SingleJetGroup,MultiJetGroup,SingleBjetGroup,SingleTauGroup,MultiTauGroup,BphysicsGroup,EgammaMuonGroup,MuonJetGroup,MuonMETGroup,EgammaTauGroup,MuonTauGroup,TauMETGroup 
+from TriggerMenuMT.HLTMenuConfig.Menu.Physics_pp_run3_v1 import PhysicsStream,SingleMuonGroup,MultiMuonGroup,SingleElectronGroup,MultiElectronGroup,SinglePhotonGroup,MultiPhotonGroup,SingleMETGroup,MultiMETGroup,SingleJetGroup,MultiJetGroup,SingleBjetGroup,SingleTauGroup,MultiTauGroup,BphysicsGroup,EgammaMuonGroup,MuonJetGroup,MuonMETGroup,EgammaTauGroup,MuonTauGroup,TauMETGroup,SingleMuonMonGroup
 
 def setupMenu():
 
@@ -60,7 +60,7 @@ def setupMenu():
         ChainProp(name='HLT_mu6_mu4_L12MU4',  l1SeedThresholds=['MU4']*2, groups=MultiMuonGroup),
         
         # in planned primary as an option
-        ChainProp(name='HLT_mu24_ivarmedium_L1MU20', groups=SingleMuonGroup),
+        ChainProp(name='HLT_mu24_ivarmedium_L1MU20', groups=SingleMuonGroup, monGroups=SingleMuonMonGroup),
 
         # Additional intermediate thresholds for validation comparisons to match with Physics_pp_v7_primaries menu
         ChainProp(name='HLT_mu24_mu10noL1_L1MU20', l1SeedThresholds=['MU20','FSNOSEED'], groups=MultiMuonGroup),
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py
index 473ef4d9bb7b..ed3ff3b6faa5 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py
@@ -43,6 +43,9 @@ JetStreamersGroup = ['RATE:SeededStreamers', 'BW:Jet']
 METStreamersGroup = ['RATE:SeededStreamers', 'BW:MET']
 BCIDmonGroup = ['MON:BCID']
 
+#Monitoring groups
+SingleMuonMonGroup = ['singleMuonMon:shifter','idMon:t0']
+
 def setupMenu():
 
     from TriggerJobOpts.TriggerFlags          import TriggerFlags
-- 
GitLab


From 6c1c60deb97ce465cbc682754a97801ab3d1d25e Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Fri, 22 Jan 2021 07:19:23 +0100
Subject: [PATCH 14/30] added monGroups to ChainProp

---
 .../python/HLTMenuConfig/Menu/ChainDefInMenu.py              | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/ChainDefInMenu.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/ChainDefInMenu.py
index 61f5c45d8fa8..e34a6b34fd15 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/ChainDefInMenu.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/ChainDefInMenu.py
@@ -15,12 +15,13 @@ def namedtuple_with_defaults(typename, field_names, default_values=()):
 
 # namedtuple class with some defaults set for those entries that do not require settings
 ChainProp = namedtuple_with_defaults("ChainProp", 
-                                     ['name', 'l1SeedThresholds', 'stream', 'groups', 'mergingStrategy', 'mergingOrder', 'mergingOffset', 'topoStartFrom'],
+                                     ['name', 'l1SeedThresholds', 'stream', 'groups', 'mergingStrategy', 'mergingOrder', 'mergingOffset', 'topoStartFrom','monGroups'],
                                      {'stream':['Main'],
                                       'l1SeedThresholds': [], 
                                       'mergingStrategy':'auto', 
                                       'mergingOrder': [], 
                                       'mergingOffset': -1, 
-                                      'topoStartFrom': False})
+                                      'topoStartFrom': False,
+                                      'monGroups' : []})
 
 
-- 
GitLab


From 00a30541feae29abb78f04b67361c2ca536c27aa Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Fri, 22 Jan 2021 07:19:49 +0100
Subject: [PATCH 15/30] updated path for HLTMonitotingJSON script

---
 .../TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
index 60ce73ec6d0b..89b2dd296581 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
@@ -508,7 +508,7 @@ class GenerateMenuMT(object, metaclass=Singleton):
         generatePrescaleJSON()
 
         log.debug('[GenerateMenuMT::generateMT] now generating HLTMonitoring JSON...')
-        from TriggerMenuMT.HLTMonConfig.Mon.HLTMonitoringJSON import generateDefaultMonitoringJSON
+        from TriggerMenuMT.HLTMenuConfig.Menu.HLTMonitoringJSON import generateDefaultMonitoringJSON
         generateDefaultMonitoringJSON()
 
         return finalListOfChainConfigs
-- 
GitLab


From e9bd7afd3ec76a5f4b98419f115e99a1d8ce6c77 Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Fri, 22 Jan 2021 13:27:47 +0100
Subject: [PATCH 16/30] clean up

---
 .../HLTMenuConfig/Menu/HLTMonitoringJSON.py   | 94 +++++++++++++++++++
 .../HLTMenuConfig/Menu/Physics_pp_run3_v1.py  |  2 +-
 .../MET/METChainMonConfiguration.py           | 15 ---
 .../python/HLTMonConfig/MET/__init__.py       |  2 -
 .../python/HLTMonConfig/Mon/ChainDefInMon.py  | 15 ---
 .../python/HLTMonConfig/Mon/ChainMon.py       |  8 --
 .../HLTMonConfig/Mon/HLTMonitoringJSON.py     | 58 ------------
 .../python/HLTMonConfig/__init__.py           |  0
 8 files changed, 95 insertions(+), 99 deletions(-)
 create mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
 delete mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/METChainMonConfiguration.py
 delete mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/__init__.py
 delete mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainDefInMon.py
 delete mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainMon.py
 delete mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/HLTMonitoringJSON.py
 delete mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/__init__.py

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
new file mode 100644
index 000000000000..fb4d5516ddd0
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
@@ -0,0 +1,94 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+import json
+from collections import OrderedDict as odict
+from TrigConfigSvc.TrigConfigSvcCfg import getHLTMenuFileName, getHLTPrescalesSetFileName, getHLTMonitoringFileName
+from AthenaCommon.Logging import logging
+__log = logging.getLogger( __name__ )
+
+
+def generateDefaultMonitoringJSON():
+    __log.info("Generating HLT Monitoring JSON in the rec-ex-common job")
+    from AthenaConfiguration.AllConfigFlags import ConfigFlags
+
+    __log.debug("[HLTMonitoring::generateJSON] HLTMenuFileName =  %s"        , getHLTMenuFileName(ConfigFlags)        )
+    __log.debug("[HLTMonitoring::generateJSON] HLTPrescalesSetFileName  = %s", getHLTPrescalesSetFileName(ConfigFlags))
+    __log.debug("[HLTMonitoring::generateJSON] HLTMonitoringFileName =  %s"  , getHLTMonitoringFileName(ConfigFlags)  )
+
+    return generateMonitoringJSON(ConfigFlags.Trigger.triggerMenuSetup,
+                                  getHLTMenuFileName(ConfigFlags),       
+                                  getHLTMonitoringFileName(ConfigFlags))
+
+def generateMonitoringJSON(menuName, menuFileName, fileName):
+
+    # from TriggerMenuMT.HLTMonConfig.Mon.ChainMon import chainsToMonitor
+
+    #get the name of the outputfile
+    menuFile   = open(menuFileName,'r')
+    menuDict   = json.load(menuFile, object_pairs_hook = odict)
+    menuChains = menuDict['chains'].keys()
+    for ch in menuChains:
+        __log.debug("[HLTMonitoring::generateMonitoringJSON] Menu chains: %s", ch)
+
+    #create the dictionary the will house the monitoring info
+    monDict=odict([ ("filetype", "hltmonitoring"), ("name", menuName), ("monchains", odict()) ])
+    
+    #create a summary file 
+    summaryDict=odict([ ("filetype", "hltmonitoringsummary"), ("name", menuName), ("signatures", odict())])
+
+    # then you can iterate, say over the HLT menu:
+    # for chain in chainsToMonitor:
+    for chain in menuDict['chains']:
+        __log.debug("[HLTMonitoring::generateMonitoringJSON] Processing Chain %s ...", chain)
+        chain_name=chain.name
+        
+        #check that the chain is present in the Menu
+        # if chain_name not in menuChains:
+        #     __log.error( "Chain %s not present in the HLT Menu JSON %s", chain_name, menuFileName)
+        #     continue
+        # __log.debug("[HLTMonitoring::generateMonitoringJSON] chain %s found in the HLT Menu dict..", chain_name)
+            
+        #and then the elements of that chain, e.g:
+        # ch['groups']
+
+        #check if the chain needs to be monitored
+        if len(chain.monGroups) == 0:
+            continue
+
+        monDict['monchains'][chain_name] = odict([
+            #('groups', chain.monGroups)
+            (chain.monGroups)
+        ])
+
+        #add the signatures in the summary file
+        for entry in chain.monGroups:
+            monGroup     = entry.split(':')[0]
+            monSignature = entry.split(':')[1]
+            
+            if monSignature not in summaryDict['signatures']:
+                summaryDict['signatures'][monSignature] = odict([
+                    ('chains', [chain_name] ),
+                    ('monGroups', [monGroup])
+                ])
+            else:
+                #the signature is already present, 
+                # now check the chain
+                if chain_name not in summaryDict['signatures']['chains']:
+                    summaryDict['signatures']['chains'].append(chain_name)
+
+                # now check if the monGroup is alrady present
+                if monGroup not in summaryDict['signatures']['monGroups']:
+                    summaryDict['signatures']['monGroups'].append(monGroup)
+        
+
+    # then writing to a file is as simple as:
+    __log.info( "Writing HLT Monitoring JSON to %s", fileName )
+    with open(fileName, 'w') as outfile:
+        json.dump(monDict, outfile, indent = 4, sort_keys=False )
+
+
+    # then writing the summary to a file is as simple as:
+    summaryFileName = "Summary_"+fileName
+    __log.info( "Writing Summary of HLT Monitoring JSON to %s",  summaryFileName)
+    with open(summaryFileName, 'w') as outfile:
+        json.dump(summaryDict, outfile, indent = 4, sort_keys=False )
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py
index ed3ff3b6faa5..81368151905e 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py
@@ -44,7 +44,7 @@ METStreamersGroup = ['RATE:SeededStreamers', 'BW:MET']
 BCIDmonGroup = ['MON:BCID']
 
 #Monitoring groups
-SingleMuonMonGroup = ['singleMuonMon:shifter','idMon:t0']
+SingleMuonMonGroup = ['monShifter:singleMuonMon:shifter','monT0:idMon:t0']
 
 def setupMenu():
 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/METChainMonConfiguration.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/METChainMonConfiguration.py
deleted file mode 100644
index 62dd60c89d4c..000000000000
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/METChainMonConfiguration.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-
-from TriggerMenuMT.HLTMonConfig.Mon.ChainDefInMon import ChainMonProp
-
-METChainMon = [] 
-METChainMon += [ 
-    ChainMonProp(name="HLT_xe65_cell_L1XE50", monP1=True, monT0=True, monOffline=True),
-    ChainMonProp(name="HLT_xe100_mht_L1XE50", monP1=True, monT0=True, monOffline=True),
-    ChainMonProp(name="HLT_xe100_tcpufit_L1XE50", monP1=True, monT0=True, monOffline=True),
-    ChainMonProp(name="HLT_xe100_trkmht_L1XE50", monP1=True, monT0=True, monOffline=True),
-    ChainMonProp(name="HLT_xe100_pfsum_L1XE50", monP1=True, monT0=True, monOffline=True),
-    ChainMonProp(name="HLT_xe65_cell_xe110_tcpufit_L1XE50", monP1=True, monT0=True, monOffline=True)
-]
-
-
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/__init__.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/__init__.py
deleted file mode 100644
index 91873a08bc5a..000000000000
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/MET/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-#Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainDefInMon.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainDefInMon.py
deleted file mode 100644
index 4c617fce76be..000000000000
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainDefInMon.py
+++ /dev/null
@@ -1,15 +0,0 @@
-
-# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-
-# from AthenaCommon.Logging import logging
-# __log = logging.getLogger( __name__ )
-from TriggerMenuMT.HLTMenuConfig.Menu.ChainDefInMenu import namedtuple_with_defaults
-
-
-ChainMonProp = namedtuple_with_defaults("ChainMonPro",
-                                        ['name', 'monP1', 'monT0', 'monOffline'],
-                                        {'name' : 'UNSET',
-                                         'monP1'  : False, 
-                                         'monT0'  : False, 
-                                         'monOffline' : False})
-
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainMon.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainMon.py
deleted file mode 100644
index b1a519db4103..000000000000
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/ChainMon.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-
-from TriggerMenuMT.HLTMonConfig.MET.METChainMonConfiguration import METChainMon
-
-chainsToMonitor = []
-
-chainsToMonitor += METChainMon 
-
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/HLTMonitoringJSON.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/HLTMonitoringJSON.py
deleted file mode 100644
index bfea52447a8c..000000000000
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/Mon/HLTMonitoringJSON.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-
-import json
-from collections import OrderedDict as odict
-from TrigConfigSvc.TrigConfigSvcCfg import getHLTMenuFileName, getHLTPrescalesSetFileName, getHLTMonitoringFileName
-from AthenaCommon.Logging import logging
-__log = logging.getLogger( __name__ )
-
-
-def generateDefaultMonitoringJSON():
-    __log.info("Generating HLT Monitoring JSON in the rec-ex-common job")
-    from AthenaConfiguration.AllConfigFlags import ConfigFlags
-
-    __log.debug("[HLTMonitoring::generateJSON] HLTMenuFileName =  %s", getHLTMenuFileName(ConfigFlags)        )
-    __log.debug("[HLTMonitoring::generateJSON] HLTPrescalesSetFileName  = %s", getHLTPrescalesSetFileName(ConfigFlags))
-    __log.debug("[HLTMonitoring::generateJSON] HLTMonitoringFileName =  %s", getHLTMonitoringFileName(ConfigFlags)  )
-
-    return generateMonitoringJSON(ConfigFlags.Trigger.triggerMenuSetup,
-                                    getHLTMenuFileName(ConfigFlags),       
-                                    getHLTMonitoringFileName(ConfigFlags))
-
-def generateMonitoringJSON(menuName, menuFileName, fileName):
-
-    from TriggerMenuMT.HLTMonConfig.Mon.ChainMon import chainsToMonitor
-
-    #get the name of the outputfile
-    menuFile   = open(menuFileName,'r')
-    menuDict   = json.load(menuFile, object_pairs_hook = odict)
-    menuChains = menuDict['chains'].keys()
-    for ch in menuChains:
-        __log.debug("[HLTMonitoring::generateMonitoringJSON] Menu chains: %s", ch)
-
-    #create the dictionary the will house the monitoring info
-    monDict=odict([ ("filetype", "hltmonitoring"), ("name", menuName), ("monchains", odict()) ])
-    
-    # then you can iterate, say over the HLT menu:
-    for chain in chainsToMonitor:
-        __log.debug("[HLTMonitoring::generateMonitoringJSON] Processing Chain %s ...", chain)
-        chain_name=chain.name
-        
-        #check that the chain is present in the Menu
-        if chain_name not in menuChains:
-            __log.error( "Chain %s not present in the HLT Menu JSON %s", chain_name, menuFileName)
-            continue
-        __log.debug("[HLTMonitoring::generateMonitoringJSON] chain %s found in the HLT Menu dict..", chain_name)
-            
-        #and then the elements of that chain, e.g:
-        # ch['groups']
-        monDict['monchains'][chain_name] = odict([
-            ('monP1', chain.monP1),
-            ('monT0', chain.monT0),
-            ('monOffline', chain.monOffline)
-        ])
-
-    # then writing to a file is as simple as:
-    __log.info( "Writing HLT Monitoring JSON to %s", fileName )
-    with open(fileName, 'w') as outfile:
-        json.dump(monDict, outfile, indent = 4, sort_keys=False )
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/__init__.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMonConfig/__init__.py
deleted file mode 100644
index e69de29bb2d1..000000000000
-- 
GitLab


From f168f4e3dd71c08d32597dc9db4b5885e93d642b Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Sun, 24 Jan 2021 23:20:50 +0100
Subject: [PATCH 17/30] added monGroups to a few chains for testing

---
 .../TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py       | 6 +++---
 .../python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py         | 3 ++-
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
index 4c3019888e69..eaae92865885 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
@@ -14,7 +14,7 @@ import TriggerMenuMT.HLTMenuConfig.Menu.MC_pp_run3_v1 as mc_menu
 import TriggerMenuMT.HLTMenuConfig.Menu.PhysicsP1_pp_run3_v1 as p1_menu
 
 # this is not the best option, due to flake violation, this list has to be changed when some groups are removed
-from TriggerMenuMT.HLTMenuConfig.Menu.Physics_pp_run3_v1 import PhysicsStream,SingleMuonGroup,MultiMuonGroup,SingleElectronGroup,MultiElectronGroup,SinglePhotonGroup,MultiPhotonGroup,SingleMETGroup,MultiMETGroup,SingleJetGroup,MultiJetGroup,SingleBjetGroup,SingleTauGroup,MultiTauGroup,BphysicsGroup,EgammaMuonGroup,MuonJetGroup,MuonMETGroup,EgammaTauGroup,MuonTauGroup,TauMETGroup,SingleMuonMonGroup
+from TriggerMenuMT.HLTMenuConfig.Menu.Physics_pp_run3_v1 import PhysicsStream,SingleMuonGroup,MultiMuonGroup,SingleElectronGroup,MultiElectronGroup,SinglePhotonGroup,MultiPhotonGroup,SingleMETGroup,MultiMETGroup,SingleJetGroup,MultiJetGroup,SingleBjetGroup,SingleTauGroup,MultiTauGroup,BphysicsGroup,EgammaMuonGroup,MuonJetGroup,MuonMETGroup,EgammaTauGroup,MuonTauGroup,TauMETGroup,SingleMuonMonGroup,SingleElectronMonGroup
 
 def setupMenu():
 
@@ -48,7 +48,7 @@ def setupMenu():
         # commented because it is conflict with dimuon noL1 serial chain
         # ChainProp(name='HLT_mu6noL1_L1MU6', l1SeedThresholds=['FSNOSEED'], groups=SingleMuonGroup),
         
-        ChainProp(name='HLT_mu6_msonly_L1MU6',     groups=SingleMuonGroup),
+        ChainProp(name='HLT_mu6_msonly_L1MU6',     groups=SingleMuonGroup, monGroups=SingleMuonMonGroup),
 
         ChainProp(name='HLT_2mu6_10invm70_L1MU6', groups=SingleMuonGroup),
         ChainProp(name='HLT_mu10_lateMu_L1LATE-MU10_XE50', l1SeedThresholds=['FSNOSEED'], groups=SingleMuonGroup),
@@ -90,7 +90,7 @@ def setupMenu():
         # ElectronChains----------
         ChainProp(name='HLT_e3_etcut_L1EM3', groups=SingleElectronGroup),
         ChainProp(name='HLT_e5_etcut_L1EM3', groups=SingleElectronGroup),
-        ChainProp(name='HLT_e7_etcut_L1EM3', stream=[PhysicsStream, 'express'], groups=SingleElectronGroup),
+        ChainProp(name='HLT_e7_etcut_L1EM3', stream=[PhysicsStream, 'express'], groups=SingleElectronGroup, monGroups=SingleElectronMonGroup),
 
         ChainProp(name='HLT_2e3_etcut_L12EM3', stream=[PhysicsStream], groups=MultiElectronGroup),
 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py
index 81368151905e..f36f5afb0f02 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py
@@ -44,7 +44,8 @@ METStreamersGroup = ['RATE:SeededStreamers', 'BW:MET']
 BCIDmonGroup = ['MON:BCID']
 
 #Monitoring groups
-SingleMuonMonGroup = ['monShifter:singleMuonMon:shifter','monT0:idMon:t0']
+SingleMuonMonGroup     = ['monShifter:singleMuonMon:shifter','monT0:idMon:t0']
+SingleElectronMonGroup = ['monShifter:singleElectronMon:shifter','monT0:idMon:t0']
 
 def setupMenu():
 
-- 
GitLab


From 2063f86a2410484ade8ca7372cbf1591cec0570a Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Sun, 24 Jan 2021 23:21:06 +0100
Subject: [PATCH 18/30] adde monGroups

---
 .../python/HLTMenuConfig/Menu/DictFromChainName.py          | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/DictFromChainName.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/DictFromChainName.py
index 17c7be9e9d06..136e8e2f1d8f 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/DictFromChainName.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/DictFromChainName.py
@@ -476,7 +476,7 @@ def dictFromChainName(chainInfo):
     ---- Loop over all chains (keys) in dictionary ----
     ---- Then complete the dict with other info    ----
     Default input format will be namedtuple:
-    ChainProp: ['name', 'L1Thresholds'=[], 'stream', 'groups', 'merging'=[], 'topoStartFrom'=False],
+    ChainProp: ['name', 'L1Thresholds'=[], 'stream', 'groups', 'merging'=[], 'topoStartFrom'=False, 'monGroups' = []],
     but for nwo plain chain name is also supported
     
     """
@@ -492,6 +492,7 @@ def dictFromChainName(chainInfo):
         mergingOffset   = -1
         mergingOrder    = []
         topoStartFrom   = ''
+        monGroups       = []
 
     elif 'ChainProp' in str(type(chainInfo)):	
         #this is how we define chains in the menu - the normal behaviour of this function
@@ -503,6 +504,8 @@ def dictFromChainName(chainInfo):
         mergingOffset   = chainInfo.mergingOffset
         mergingOrder    = chainInfo.mergingOrder
         topoStartFrom   = chainInfo.topoStartFrom
+        monGroups       = chainInfo.monGroups
+
         
     else:
         assert True, "Format of chainInfo passed to genChainDict not known"
@@ -521,6 +524,7 @@ def dictFromChainName(chainInfo):
     chainDict['mergingOffset']   = mergingOffset
     chainDict['mergingOrder']    = mergingOrder
     chainDict['topoStartFrom']   = topoStartFrom
+    chainDict['monGroups']       = monGroups
     chainDict['chainNameHash']   = string2hash(chainDict['chainName'])
 
 
-- 
GitLab


From a13dbcb813d0e651da94821b66436afd8b4115de Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Sun, 24 Jan 2021 23:21:25 +0100
Subject: [PATCH 19/30] updates

---
 .../HLTMenuConfig/Menu/HLTMonitoringJSON.py   | 63 +++++++------------
 1 file changed, 24 insertions(+), 39 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
index fb4d5516ddd0..d73db271f473 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
@@ -10,25 +10,16 @@ __log = logging.getLogger( __name__ )
 def generateDefaultMonitoringJSON():
     __log.info("Generating HLT Monitoring JSON in the rec-ex-common job")
     from AthenaConfiguration.AllConfigFlags import ConfigFlags
+    from TriggerMenuMT.HLTMenuConfig.Menu.TriggerConfigHLT import TriggerConfigHLT
 
     __log.debug("[HLTMonitoring::generateJSON] HLTMenuFileName =  %s"        , getHLTMenuFileName(ConfigFlags)        )
-    __log.debug("[HLTMonitoring::generateJSON] HLTPrescalesSetFileName  = %s", getHLTPrescalesSetFileName(ConfigFlags))
     __log.debug("[HLTMonitoring::generateJSON] HLTMonitoringFileName =  %s"  , getHLTMonitoringFileName(ConfigFlags)  )
 
     return generateMonitoringJSON(ConfigFlags.Trigger.triggerMenuSetup,
-                                  getHLTMenuFileName(ConfigFlags),       
+                                  TriggerConfigHLT.dictsList(), 
                                   getHLTMonitoringFileName(ConfigFlags))
 
-def generateMonitoringJSON(menuName, menuFileName, fileName):
-
-    # from TriggerMenuMT.HLTMonConfig.Mon.ChainMon import chainsToMonitor
-
-    #get the name of the outputfile
-    menuFile   = open(menuFileName,'r')
-    menuDict   = json.load(menuFile, object_pairs_hook = odict)
-    menuChains = menuDict['chains'].keys()
-    for ch in menuChains:
-        __log.debug("[HLTMonitoring::generateMonitoringJSON] Menu chains: %s", ch)
+def generateMonitoringJSON(menuName, chainDicts, fileName):
 
     #create the dictionary the will house the monitoring info
     monDict=odict([ ("filetype", "hltmonitoring"), ("name", menuName), ("monchains", odict()) ])
@@ -37,31 +28,25 @@ def generateMonitoringJSON(menuName, menuFileName, fileName):
     summaryDict=odict([ ("filetype", "hltmonitoringsummary"), ("name", menuName), ("signatures", odict())])
 
     # then you can iterate, say over the HLT menu:
-    # for chain in chainsToMonitor:
-    for chain in menuDict['chains']:
-        __log.debug("[HLTMonitoring::generateMonitoringJSON] Processing Chain %s ...", chain)
-        chain_name=chain.name
-        
-        #check that the chain is present in the Menu
-        # if chain_name not in menuChains:
-        #     __log.error( "Chain %s not present in the HLT Menu JSON %s", chain_name, menuFileName)
-        #     continue
-        # __log.debug("[HLTMonitoring::generateMonitoringJSON] chain %s found in the HLT Menu dict..", chain_name)
-            
-        #and then the elements of that chain, e.g:
-        # ch['groups']
-
+    for chain in chainDicts:
+        chain_name = chain['chainName']
+        __log.debug("[HLTMonitoring::generateMonitoringJSON] Processing Chain %s ...", chain_name)
+
+        #if the chain is in a express stream, check presence of teh monGroup
+        if 'express' in chain['stream']:
+            if len(chain['monGroups']) == 0:
+                __log.error( "Chain %s is in the express stream and doesn't have any monGroup", chain_name)
+          
         #check if the chain needs to be monitored
-        if len(chain.monGroups) == 0:
+        if len(chain['monGroups']) == 0:
             continue
 
-        monDict['monchains'][chain_name] = odict([
-            #('groups', chain.monGroups)
-            (chain.monGroups)
-        ])
+        __log.debug("[HLTMonitoring::generateMonitoringJSON] Chain %s has monitoring groups!", chain_name)
+            
+        monDict['monchains'][chain_name] = chain['monGroups'] 
 
         #add the signatures in the summary file
-        for entry in chain.monGroups:
+        for entry in chain['monGroups']:
             monGroup     = entry.split(':')[0]
             monSignature = entry.split(':')[1]
             
@@ -73,22 +58,22 @@ def generateMonitoringJSON(menuName, menuFileName, fileName):
             else:
                 #the signature is already present, 
                 # now check the chain
-                if chain_name not in summaryDict['signatures']['chains']:
-                    summaryDict['signatures']['chains'].append(chain_name)
+                if chain_name not in summaryDict['signatures'][monSignature]['chains']:
+                    summaryDict['signatures'][monSignature]['chains'].append(chain_name)
 
                 # now check if the monGroup is alrady present
-                if monGroup not in summaryDict['signatures']['monGroups']:
-                    summaryDict['signatures']['monGroups'].append(monGroup)
+                if monGroup not in summaryDict['signatures'][monSignature]['monGroups']:
+                    summaryDict['signatures'][monSignature]['monGroups'].append(monGroup)
         
 
     # then writing to a file is as simple as:
-    __log.info( "Writing HLT Monitoring JSON to %s", fileName )
+    __log.info( "[HLTMonitoring::generateMonitoringJSON] Writing HLT Monitoring JSON to %s", fileName )
     with open(fileName, 'w') as outfile:
         json.dump(monDict, outfile, indent = 4, sort_keys=False )
 
 
-    # then writing the summary to a file is as simple as:
+    # # then writing the summary to a file is as simple as:
     summaryFileName = "Summary_"+fileName
-    __log.info( "Writing Summary of HLT Monitoring JSON to %s",  summaryFileName)
+    __log.info( "[HLTMonitoring::generateMonitoringJSON] Writing Summary of HLT Monitoring JSON to %s",  summaryFileName)
     with open(summaryFileName, 'w') as outfile:
         json.dump(summaryDict, outfile, indent = 4, sort_keys=False )
-- 
GitLab


From 375b06e9e8ba49ef9f80287be94ccc33db8e9674 Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Sun, 24 Jan 2021 23:44:01 +0100
Subject: [PATCH 20/30] clean up

---
 Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt | 1 -
 1 file changed, 1 deletion(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt b/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt
index 063e6038e091..4734d006bc40 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt
+++ b/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt
@@ -100,7 +100,6 @@ atlas_install_python_modules( python/*.py
                               python/LVL1MenuConfig
                               python/L1
                               python/HLTMenuConfig
-                              python/HLTMonConfig
                               POST_BUILD_CMD ${ATLAS_FLAKE8} --extend-extensions=ATL900,ATL901 )
 
 atlas_install_scripts( scripts/generateLVL1MenuMT.py
-- 
GitLab


From a925fea46ed52263fe089bb955680749aeb87308 Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Mon, 25 Jan 2021 02:35:37 +0100
Subject: [PATCH 21/30] updated error message

---
 .../python/HLTMenuConfig/Menu/HLTMonitoringJSON.py            | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
index d73db271f473..c87b0b1afd17 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
@@ -35,8 +35,8 @@ def generateMonitoringJSON(menuName, chainDicts, fileName):
         #if the chain is in a express stream, check presence of teh monGroup
         if 'express' in chain['stream']:
             if len(chain['monGroups']) == 0:
-                __log.error( "Chain %s is in the express stream and doesn't have any monGroup", chain_name)
-          
+                __log.error( "[HLTMonitoring::generateMonitoringJSON]Chain %s is in the express stream and doesn't have any monGroup", chain_name)
+
         #check if the chain needs to be monitored
         if len(chain['monGroups']) == 0:
             continue
-- 
GitLab


From cfa86e6d54ae0bc6fb0a1db0f35bf7f3f0093cd1 Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Mon, 25 Jan 2021 02:37:29 +0100
Subject: [PATCH 22/30] added dummy monGroups to chains in the express stream
 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py

---
 .../HLTMenuConfig/Menu/PhysicsP1_pp_run3_v1.py   | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/PhysicsP1_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/PhysicsP1_pp_run3_v1.py
index bbebca9e3f5b..ca05563305a8 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/PhysicsP1_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/PhysicsP1_pp_run3_v1.py
@@ -13,7 +13,7 @@ from TriggerMenuMT.HLTMenuConfig.Menu.ChainDefInMenu import ChainProp
 
 import TriggerMenuMT.HLTMenuConfig.Menu.Physics_pp_run3_v1 as physics_menu 
 
-from TriggerMenuMT.HLTMenuConfig.Menu.Physics_pp_run3_v1 import PhysicsStream,SingleMuonGroup,EgammaStreamersGroup,TauStreamersGroup,JetStreamersGroup,METStreamersGroup,MinBiasGroup,ZeroBiasGroup
+from TriggerMenuMT.HLTMenuConfig.Menu.Physics_pp_run3_v1 import PhysicsStream,SingleMuonGroup,EgammaStreamersGroup,TauStreamersGroup,JetStreamersGroup,METStreamersGroup,MinBiasGroup,ZeroBiasGroup,CosmicCaloMonGroup,NoAlgMonGroup
 
 
 def addP1Signatures():
@@ -65,7 +65,7 @@ def addP1Signatures():
     TriggerFlags.StreamingSlice.signatures = TriggerFlags.StreamingSlice.signatures() + [
         ChainProp(name='HLT_noalg_L1RD0_EMPTY',  l1SeedThresholds=['FSNOSEED'], stream=[PhysicsStream], groups=MinBiasGroup), 
         ChainProp(name='HLT_noalg_L1RD0_FILLED', l1SeedThresholds=['FSNOSEED'], stream=[PhysicsStream], groups=MinBiasGroup),  
-        ChainProp(name='HLT_noalg_idmon_L1RD0_EMPTY', l1SeedThresholds=['FSNOSEED'], stream=['IDMonitoring','express'],groups=['RATE:Monitoring','BW:Detector']),
+        ChainProp(name='HLT_noalg_idmon_L1RD0_EMPTY', l1SeedThresholds=['FSNOSEED'], stream=['IDMonitoring','express'],groups=['RATE:Monitoring','BW:Detector'],monGroups=[NoAlgMonGroup]),
         ChainProp(name='HLT_noalg_idmon_L1RD0_FILLED', l1SeedThresholds=['FSNOSEED'], stream=['IDMonitoring'],groups=['RATE:Monitoring','BW:Detector']),
         ChainProp(name='HLT_noalg_idmon_L1RD0_UNPAIRED_ISO', l1SeedThresholds=['FSNOSEED'], stream=['IDMonitoring'],groups=['RATE:Monitoring','BW:Detector']),
 
@@ -123,13 +123,13 @@ def addP1Signatures():
 
         # Cosmic calo stream
         ChainProp(name='HLT_noalg_cosmiccalo_L1EM3_EMPTY', stream=['CosmicCalo'],groups=['RATE:Cosmic_Calo','BW:MinBias']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1RD1_EMPTY', l1SeedThresholds=['FSNOSEED'], stream=['CosmicCalo','express'],groups=['RATE:Calibration','BW:Detector']),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1RD1_EMPTY', l1SeedThresholds=['FSNOSEED'], stream=['CosmicCalo','express'],groups=['RATE:Calibration','BW:Detector'],monGroups=[CosmicCaloMonGroup]),
         ChainProp(name='HLT_noalg_cosmiccalo_L1J30_31ETA49_EMPTY', stream=['CosmicCalo'],groups=['RATE:Cosmic_Calo','BW:Jet']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1J12_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1EM7_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1J30_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1J12_FIRSTEMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1J30_FIRSTEMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet']),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1J12_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=[CosmicCaloMonGroup]),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1EM7_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=[CosmicCaloMonGroup]),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1J30_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=[CosmicCaloMonGroup]),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1J12_FIRSTEMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=[CosmicCaloMonGroup]),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1J30_FIRSTEMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=[CosmicCaloMonGroup]),
 #        ChainProp(name='HLT_noalg_cosmiccalo_L1RD1_BGRP10', l1SeedThresholds=['FSNOSEED'], stream=['CosmicCalo','express'],groups=['RATE:Calibration','BW:Detector']),
 
         # MBTS
-- 
GitLab


From 4937b677d41a11e81cb5cc0d2a8f4c36c97c1715 Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Mon, 25 Jan 2021 12:22:51 +0100
Subject: [PATCH 23/30] monGroups are defined explicitly in the ChainProp +
 added/modified monGroups for testing purposes

---
 .../python/HLTMenuConfig/Menu/LS2_v1.py          |  8 ++++----
 .../HLTMenuConfig/Menu/PhysicsP1_pp_run3_v1.py   | 16 ++++++++--------
 .../HLTMenuConfig/Menu/Physics_pp_run3_v1.py     |  3 ---
 3 files changed, 12 insertions(+), 15 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
index 435dae4ec120..4bbae4c19a11 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
@@ -14,7 +14,7 @@ import TriggerMenuMT.HLTMenuConfig.Menu.MC_pp_run3_v1 as mc_menu
 import TriggerMenuMT.HLTMenuConfig.Menu.PhysicsP1_pp_run3_v1 as p1_menu
 
 # this is not the best option, due to flake violation, this list has to be changed when some groups are removed
-from TriggerMenuMT.HLTMenuConfig.Menu.Physics_pp_run3_v1 import PhysicsStream,SingleMuonGroup,MultiMuonGroup,SingleElectronGroup,MultiElectronGroup,SinglePhotonGroup,MultiPhotonGroup,SingleMETGroup,MultiMETGroup,SingleJetGroup,MultiJetGroup,SingleBjetGroup,SingleTauGroup,MultiTauGroup,BphysicsGroup,EgammaMuonGroup,MuonJetGroup,MuonMETGroup,EgammaJetGroup,EgammaMETGroup,EgammaTauGroup,MuonTauGroup,TauMETGroup,SingleMuonMonGroup,SingleElectronMonGroup  
+from TriggerMenuMT.HLTMenuConfig.Menu.Physics_pp_run3_v1 import PhysicsStream,SingleMuonGroup,MultiMuonGroup,SingleElectronGroup,MultiElectronGroup,SinglePhotonGroup,MultiPhotonGroup,SingleMETGroup,MultiMETGroup,SingleJetGroup,MultiJetGroup,SingleBjetGroup,SingleTauGroup,MultiTauGroup,BphysicsGroup,EgammaMuonGroup,MuonJetGroup,MuonMETGroup,EgammaJetGroup,EgammaMETGroup,EgammaTauGroup,MuonTauGroup,TauMETGroup
 
 
 def setupMenu():
@@ -49,7 +49,7 @@ def setupMenu():
         # commented because it is conflict with dimuon noL1 serial chain
         # ChainProp(name='HLT_mu6noL1_L1MU6', l1SeedThresholds=['FSNOSEED'], groups=SingleMuonGroup),
         
-        ChainProp(name='HLT_mu6_msonly_L1MU6',     groups=SingleMuonGroup, monGroups=SingleMuonMonGroup),
+        ChainProp(name='HLT_mu6_msonly_L1MU6',     groups=SingleMuonGroup, monGroups=['muonMon:shifter','muonMon:val','idMon:t0']),
 
         ChainProp(name='HLT_2mu6_10invm70_L1MU6', groups=SingleMuonGroup),
         ChainProp(name='HLT_mu10_lateMu_L1LATE-MU10_XE50', l1SeedThresholds=['FSNOSEED'], groups=SingleMuonGroup),
@@ -61,7 +61,7 @@ def setupMenu():
         ChainProp(name='HLT_mu6_mu4_L12MU4',  l1SeedThresholds=['MU4']*2, groups=MultiMuonGroup),
         
         # in planned primary as an option
-        ChainProp(name='HLT_mu24_ivarmedium_L1MU20', groups=SingleMuonGroup, monGroups=SingleMuonMonGroup),
+        ChainProp(name='HLT_mu24_ivarmedium_L1MU20', groups=SingleMuonGroup, monGroups=['muonMon:shifter','idMon:t0']),
 
         # Additional intermediate thresholds for validation comparisons to match with Physics_pp_v7_primaries menu
         ChainProp(name='HLT_mu24_mu10noL1_L1MU20', l1SeedThresholds=['MU20','FSNOSEED'], groups=MultiMuonGroup),
@@ -91,7 +91,7 @@ def setupMenu():
         # ElectronChains----------
         ChainProp(name='HLT_e3_etcut_L1EM3', groups=SingleElectronGroup),
         ChainProp(name='HLT_e5_etcut_L1EM3', groups=SingleElectronGroup),
-        ChainProp(name='HLT_e7_etcut_L1EM3', stream=[PhysicsStream, 'express'], groups=SingleElectronGroup, monGroups=SingleElectronMonGroup),
+        ChainProp(name='HLT_e7_etcut_L1EM3', stream=[PhysicsStream, 'express'], groups=SingleElectronGroup, monGroups=['electronMon:shifter','idMon:t0']),
 
         ChainProp(name='HLT_2e3_etcut_L12EM3', stream=[PhysicsStream], groups=MultiElectronGroup),
 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/PhysicsP1_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/PhysicsP1_pp_run3_v1.py
index ca05563305a8..7a008eaa7c67 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/PhysicsP1_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/PhysicsP1_pp_run3_v1.py
@@ -13,7 +13,7 @@ from TriggerMenuMT.HLTMenuConfig.Menu.ChainDefInMenu import ChainProp
 
 import TriggerMenuMT.HLTMenuConfig.Menu.Physics_pp_run3_v1 as physics_menu 
 
-from TriggerMenuMT.HLTMenuConfig.Menu.Physics_pp_run3_v1 import PhysicsStream,SingleMuonGroup,EgammaStreamersGroup,TauStreamersGroup,JetStreamersGroup,METStreamersGroup,MinBiasGroup,ZeroBiasGroup,CosmicCaloMonGroup,NoAlgMonGroup
+from TriggerMenuMT.HLTMenuConfig.Menu.Physics_pp_run3_v1 import PhysicsStream,SingleMuonGroup,EgammaStreamersGroup,TauStreamersGroup,JetStreamersGroup,METStreamersGroup,MinBiasGroup,ZeroBiasGroup
 
 
 def addP1Signatures():
@@ -65,7 +65,7 @@ def addP1Signatures():
     TriggerFlags.StreamingSlice.signatures = TriggerFlags.StreamingSlice.signatures() + [
         ChainProp(name='HLT_noalg_L1RD0_EMPTY',  l1SeedThresholds=['FSNOSEED'], stream=[PhysicsStream], groups=MinBiasGroup), 
         ChainProp(name='HLT_noalg_L1RD0_FILLED', l1SeedThresholds=['FSNOSEED'], stream=[PhysicsStream], groups=MinBiasGroup),  
-        ChainProp(name='HLT_noalg_idmon_L1RD0_EMPTY', l1SeedThresholds=['FSNOSEED'], stream=['IDMonitoring','express'],groups=['RATE:Monitoring','BW:Detector'],monGroups=[NoAlgMonGroup]),
+        ChainProp(name='HLT_noalg_idmon_L1RD0_EMPTY', l1SeedThresholds=['FSNOSEED'], stream=['IDMonitoring','express'],groups=['RATE:Monitoring','BW:Detector'],monGroups=['noAlgMon:shifter']),
         ChainProp(name='HLT_noalg_idmon_L1RD0_FILLED', l1SeedThresholds=['FSNOSEED'], stream=['IDMonitoring'],groups=['RATE:Monitoring','BW:Detector']),
         ChainProp(name='HLT_noalg_idmon_L1RD0_UNPAIRED_ISO', l1SeedThresholds=['FSNOSEED'], stream=['IDMonitoring'],groups=['RATE:Monitoring','BW:Detector']),
 
@@ -123,13 +123,13 @@ def addP1Signatures():
 
         # Cosmic calo stream
         ChainProp(name='HLT_noalg_cosmiccalo_L1EM3_EMPTY', stream=['CosmicCalo'],groups=['RATE:Cosmic_Calo','BW:MinBias']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1RD1_EMPTY', l1SeedThresholds=['FSNOSEED'], stream=['CosmicCalo','express'],groups=['RATE:Calibration','BW:Detector'],monGroups=[CosmicCaloMonGroup]),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1RD1_EMPTY', l1SeedThresholds=['FSNOSEED'], stream=['CosmicCalo','express'],groups=['RATE:Calibration','BW:Detector'],monGroups=['cosmicCaloMon:shifter']),
         ChainProp(name='HLT_noalg_cosmiccalo_L1J30_31ETA49_EMPTY', stream=['CosmicCalo'],groups=['RATE:Cosmic_Calo','BW:Jet']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1J12_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=[CosmicCaloMonGroup]),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1EM7_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=[CosmicCaloMonGroup]),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1J30_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=[CosmicCaloMonGroup]),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1J12_FIRSTEMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=[CosmicCaloMonGroup]),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1J30_FIRSTEMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=[CosmicCaloMonGroup]),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1J12_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=['cosmicCaloMon:shifter','cosmicCaloMon:t0']),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1EM7_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=['cosmicCaloMon:shifter']),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1J30_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=['cosmicCaloMon:shifter']),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1J12_FIRSTEMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=['cosmicCaloMon:shifter']),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1J30_FIRSTEMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=['cosmicCaloMon:shifter']),
 #        ChainProp(name='HLT_noalg_cosmiccalo_L1RD1_BGRP10', l1SeedThresholds=['FSNOSEED'], stream=['CosmicCalo','express'],groups=['RATE:Calibration','BW:Detector']),
 
         # MBTS
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py
index f36f5afb0f02..38d62ab4aeb6 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py
@@ -43,9 +43,6 @@ JetStreamersGroup = ['RATE:SeededStreamers', 'BW:Jet']
 METStreamersGroup = ['RATE:SeededStreamers', 'BW:MET']
 BCIDmonGroup = ['MON:BCID']
 
-#Monitoring groups
-SingleMuonMonGroup     = ['monShifter:singleMuonMon:shifter','monT0:idMon:t0']
-SingleElectronMonGroup = ['monShifter:singleElectronMon:shifter','monT0:idMon:t0']
 
 def setupMenu():
 
-- 
GitLab


From a3f0af308518902c6bc7cf8e465653f38cc11058 Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Mon, 25 Jan 2021 12:23:43 +0100
Subject: [PATCH 24/30] updated the structure of the SummaryHLTMon JSON file
 and removed the production of the other HLTMonitoring JSON file

---
 .../HLTMenuConfig/Menu/HLTMonitoringJSON.py   | 33 +++++--------------
 1 file changed, 8 insertions(+), 25 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
index c87b0b1afd17..43ca0dcfe3d6 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
@@ -2,7 +2,7 @@
 
 import json
 from collections import OrderedDict as odict
-from TrigConfigSvc.TrigConfigSvcCfg import getHLTMenuFileName, getHLTPrescalesSetFileName, getHLTMonitoringFileName
+from TrigConfigSvc.TrigConfigSvcCfg import getHLTMenuFileName, getHLTMonitoringFileName
 from AthenaCommon.Logging import logging
 __log = logging.getLogger( __name__ )
 
@@ -21,9 +21,6 @@ def generateDefaultMonitoringJSON():
 
 def generateMonitoringJSON(menuName, chainDicts, fileName):
 
-    #create the dictionary the will house the monitoring info
-    monDict=odict([ ("filetype", "hltmonitoring"), ("name", menuName), ("monchains", odict()) ])
-    
     #create a summary file 
     summaryDict=odict([ ("filetype", "hltmonitoringsummary"), ("name", menuName), ("signatures", odict())])
 
@@ -43,34 +40,20 @@ def generateMonitoringJSON(menuName, chainDicts, fileName):
 
         __log.debug("[HLTMonitoring::generateMonitoringJSON] Chain %s has monitoring groups!", chain_name)
             
-        monDict['monchains'][chain_name] = chain['monGroups'] 
-
         #add the signatures in the summary file
         for entry in chain['monGroups']:
-            monGroup     = entry.split(':')[0]
-            monSignature = entry.split(':')[1]
+            monSignature = entry.split(':')[0]
+            monGroup     = entry.split(':')[1]
             
             if monSignature not in summaryDict['signatures']:
-                summaryDict['signatures'][monSignature] = odict([
-                    ('chains', [chain_name] ),
-                    ('monGroups', [monGroup])
-                ])
+                summaryDict['signatures'][monSignature] = odict([(chain_name, [monGroup])])
             else:
                 #the signature is already present, 
                 # now check the chain
-                if chain_name not in summaryDict['signatures'][monSignature]['chains']:
-                    summaryDict['signatures'][monSignature]['chains'].append(chain_name)
-
-                # now check if the monGroup is alrady present
-                if monGroup not in summaryDict['signatures'][monSignature]['monGroups']:
-                    summaryDict['signatures'][monSignature]['monGroups'].append(monGroup)
-        
-
-    # then writing to a file is as simple as:
-    __log.info( "[HLTMonitoring::generateMonitoringJSON] Writing HLT Monitoring JSON to %s", fileName )
-    with open(fileName, 'w') as outfile:
-        json.dump(monDict, outfile, indent = 4, sort_keys=False )
-
+                if chain_name not in summaryDict['signatures'][monSignature]:
+                    summaryDict['signatures'][monSignature].update(odict([(chain_name, [monGroup])]))
+                else:
+                    summaryDict['signatures'][monSignature][chain_name].append(monGroup)
 
     # # then writing the summary to a file is as simple as:
     summaryFileName = "Summary_"+fileName
-- 
GitLab


From e97ef6522d5546e996cfad6d994a49aaf5c8e2ac Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Mon, 25 Jan 2021 13:50:12 +0100
Subject: [PATCH 25/30] removed extra new line

---
 .../python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py              | 1 -
 1 file changed, 1 deletion(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py
index 38d62ab4aeb6..473ef4d9bb7b 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Physics_pp_run3_v1.py
@@ -43,7 +43,6 @@ JetStreamersGroup = ['RATE:SeededStreamers', 'BW:Jet']
 METStreamersGroup = ['RATE:SeededStreamers', 'BW:MET']
 BCIDmonGroup = ['MON:BCID']
 
-
 def setupMenu():
 
     from TriggerJobOpts.TriggerFlags          import TriggerFlags
-- 
GitLab


From 3365f78f6ae0a51a2148c706fa58981cbdb6804f Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Mon, 25 Jan 2021 13:50:26 +0100
Subject: [PATCH 26/30] clean up

---
 .../TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py           | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
index 4bbae4c19a11..8a60c28f39a9 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
@@ -91,7 +91,7 @@ def setupMenu():
         # ElectronChains----------
         ChainProp(name='HLT_e3_etcut_L1EM3', groups=SingleElectronGroup),
         ChainProp(name='HLT_e5_etcut_L1EM3', groups=SingleElectronGroup),
-        ChainProp(name='HLT_e7_etcut_L1EM3', stream=[PhysicsStream, 'express'], groups=SingleElectronGroup, monGroups=['electronMon:shifter','idMon:t0']),
+        ChainProp(name='HLT_e7_etcut_L1EM3', stream=[PhysicsStream, 'express'], groups=SingleElectronGroup, monGroups=['electronMon:shifter']),
 
         ChainProp(name='HLT_2e3_etcut_L12EM3', stream=[PhysicsStream], groups=MultiElectronGroup),
 
-- 
GitLab


From 8b9901acdbdaa1413109f7fc86d68e770025818f Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Tue, 26 Jan 2021 14:45:39 +0100
Subject: [PATCH 27/30] fixed a typo

---
 Trigger/TriggerCommon/TriggerMenuMT/share/full_menu_cf.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/share/full_menu_cf.py b/Trigger/TriggerCommon/TriggerMenuMT/share/full_menu_cf.py
index 3b8b7e90ee29..9f825f0f4192 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/share/full_menu_cf.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/share/full_menu_cf.py
@@ -307,8 +307,8 @@ generateJSON()
 from TriggerMenuMT.HLTMenuConfig.Menu.HLTPrescaleJSON import generateJSON as generatePrescaleJSON
 generatePrescaleJSON()
    
-from TriggerMenuMT.HLTMenuConfig.Menu.HLTMonitoringJSON import generateJSON as generateMonitoringJSON
-generateMonitoringJSON()
+from TriggerMenuMT.HLTMenuConfig.Menu.HLTMonitoringJSON import generateDefaultMonitoringJSON
+generateDefaultMonitoringJSON()
 
 from AthenaCommon.AlgSequence import dumpSequence
 dumpSequence(topSequence)
-- 
GitLab


From 33360e130f27aa7571a06c7b7106741dc7836ff7 Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Tue, 26 Jan 2021 22:56:18 +0100
Subject: [PATCH 28/30] added monGroup to chains in the express stream of
 Cosmi_run3_v1

---
 .../python/HLTMenuConfig/Menu/Cosmic_run3_v1.py             | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Cosmic_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Cosmic_run3_v1.py
index d2c239f47d9c..805f59b0291f 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Cosmic_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Cosmic_run3_v1.py
@@ -39,11 +39,11 @@ def setupMenu():
     TriggerFlags.CosmicSlice.signatures    = []
     TriggerFlags.StreamingSlice.signatures = [
 
-        ChainProp(name='HLT_noalg_idcosmic_L1TRT_EMPTY', l1SeedThresholds=['FSNOSEED'], stream=['IDCosmic','express'],groups=['RATE:SeededStreamers','BW:Other']),
+        ChainProp(name='HLT_noalg_idcosmic_L1TRT_EMPTY', l1SeedThresholds=['FSNOSEED'], stream=['IDCosmic','express'],groups=['RATE:SeededStreamers','BW:Other'],monGroups=['noAlgMon:shifter']),
         ChainProp(name='HLT_noalg_idcosmic_L1TRT_FILLED', l1SeedThresholds=['FSNOSEED'], stream=['IDCosmic'],groups=['RATE:SeededStreamers','BW:Other']),
 
-        ChainProp(name='HLT_noalg_cosmicmuons_L1MU4_EMPTY', stream=['CosmicMuons','express'],groups=['RATE:Cosmic_Muon','BW:Muon']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1MU11_EMPTY', stream=['CosmicMuons','express'],groups=['RATE:Cosmic_Muon','BW:Muon']),
+        ChainProp(name='HLT_noalg_cosmicmuons_L1MU4_EMPTY', stream=['CosmicMuons','express'],groups=['RATE:Cosmic_Muon','BW:Muon'],monGroups=['noAlgMon:shifter']),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1MU11_EMPTY', stream=['CosmicMuons','express'],groups=['RATE:Cosmic_Muon','BW:Muon'],monGroups=['noAlgMon:shifter']),
 
 
 ]
-- 
GitLab


From 20cead89de95c805cb362e8dbb8ce29492393318 Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Wed, 27 Jan 2021 14:48:54 +0100
Subject: [PATCH 29/30] clean up

---
 .../python/HLTMenuConfig/Menu/Cosmic_run3_v1.py  |  6 +++---
 .../HLTMenuConfig/Menu/PhysicsP1_pp_run3_v1.py   | 16 ++++++++--------
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Cosmic_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Cosmic_run3_v1.py
index 805f59b0291f..d2c239f47d9c 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Cosmic_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Cosmic_run3_v1.py
@@ -39,11 +39,11 @@ def setupMenu():
     TriggerFlags.CosmicSlice.signatures    = []
     TriggerFlags.StreamingSlice.signatures = [
 
-        ChainProp(name='HLT_noalg_idcosmic_L1TRT_EMPTY', l1SeedThresholds=['FSNOSEED'], stream=['IDCosmic','express'],groups=['RATE:SeededStreamers','BW:Other'],monGroups=['noAlgMon:shifter']),
+        ChainProp(name='HLT_noalg_idcosmic_L1TRT_EMPTY', l1SeedThresholds=['FSNOSEED'], stream=['IDCosmic','express'],groups=['RATE:SeededStreamers','BW:Other']),
         ChainProp(name='HLT_noalg_idcosmic_L1TRT_FILLED', l1SeedThresholds=['FSNOSEED'], stream=['IDCosmic'],groups=['RATE:SeededStreamers','BW:Other']),
 
-        ChainProp(name='HLT_noalg_cosmicmuons_L1MU4_EMPTY', stream=['CosmicMuons','express'],groups=['RATE:Cosmic_Muon','BW:Muon'],monGroups=['noAlgMon:shifter']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1MU11_EMPTY', stream=['CosmicMuons','express'],groups=['RATE:Cosmic_Muon','BW:Muon'],monGroups=['noAlgMon:shifter']),
+        ChainProp(name='HLT_noalg_cosmicmuons_L1MU4_EMPTY', stream=['CosmicMuons','express'],groups=['RATE:Cosmic_Muon','BW:Muon']),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1MU11_EMPTY', stream=['CosmicMuons','express'],groups=['RATE:Cosmic_Muon','BW:Muon']),
 
 
 ]
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/PhysicsP1_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/PhysicsP1_pp_run3_v1.py
index c0103cced764..380f2d858b26 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/PhysicsP1_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/PhysicsP1_pp_run3_v1.py
@@ -66,7 +66,7 @@ def addP1Signatures():
     TriggerFlags.StreamingSlice.signatures = TriggerFlags.StreamingSlice.signatures() + [
         ChainProp(name='HLT_noalg_L1RD0_EMPTY',  l1SeedThresholds=['FSNOSEED'], stream=[PhysicsStream], groups=MinBiasGroup), 
         ChainProp(name='HLT_noalg_L1RD0_FILLED', l1SeedThresholds=['FSNOSEED'], stream=[PhysicsStream], groups=MinBiasGroup),  
-        ChainProp(name='HLT_noalg_idmon_L1RD0_EMPTY', l1SeedThresholds=['FSNOSEED'], stream=['IDMonitoring','express'],groups=['RATE:Monitoring','BW:Detector'],monGroups=['noAlgMon:shifter']),
+        ChainProp(name='HLT_noalg_idmon_L1RD0_EMPTY', l1SeedThresholds=['FSNOSEED'], stream=['IDMonitoring','express'],groups=['RATE:Monitoring','BW:Detector']),
         ChainProp(name='HLT_noalg_idmon_L1RD0_FILLED', l1SeedThresholds=['FSNOSEED'], stream=['IDMonitoring'],groups=['RATE:Monitoring','BW:Detector']),
         ChainProp(name='HLT_noalg_idmon_L1RD0_UNPAIRED_ISO', l1SeedThresholds=['FSNOSEED'], stream=['IDMonitoring'],groups=['RATE:Monitoring','BW:Detector']),
 
@@ -124,14 +124,14 @@ def addP1Signatures():
 
         # Cosmic calo stream
         ChainProp(name='HLT_noalg_cosmiccalo_L1EM3_EMPTY', stream=['CosmicCalo'],groups=['RATE:Cosmic_Calo','BW:MinBias']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1RD1_EMPTY', l1SeedThresholds=['FSNOSEED'], stream=['CosmicCalo','express'],groups=['RATE:Calibration','BW:Detector'],monGroups=['cosmicCaloMon:shifter']),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1RD1_EMPTY', l1SeedThresholds=['FSNOSEED'], stream=['CosmicCalo','express'],groups=['RATE:Calibration','BW:Detector']),
         ChainProp(name='HLT_noalg_cosmiccalo_L1J30_31ETA49_EMPTY', stream=['CosmicCalo'],groups=['RATE:Cosmic_Calo','BW:Jet']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1J12_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=['cosmicCaloMon:shifter','cosmicCaloMon:t0']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1EM7_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=['cosmicCaloMon:shifter']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1J30_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=['cosmicCaloMon:shifter']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1J12_FIRSTEMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=['cosmicCaloMon:shifter']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1J30_FIRSTEMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet'],monGroups=['cosmicCaloMon:shifter']),
-        ChainProp(name='HLT_noalg_cosmiccalo_L1RD0_FIRSTEMPTY', l1SeedThresholds=['FSNOSEED'], stream=['CosmicCalo'], groups=['RATE:Calibration','BW:Detector'],monGroups=['cosmicCaloMon:shifter']),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1J12_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet']),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1EM7_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet']),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1J30_EMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet']),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1J12_FIRSTEMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet']),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1J30_FIRSTEMPTY', stream=['CosmicCalo','express'],groups=['RATE:Cosmic_Calo','BW:Jet']),
+        ChainProp(name='HLT_noalg_cosmiccalo_L1RD0_FIRSTEMPTY', l1SeedThresholds=['FSNOSEED'], stream=['CosmicCalo'], groups=['RATE:Calibration','BW:Detector']),
 
 #        ChainProp(name='HLT_noalg_cosmiccalo_L1RD1_BGRP10', l1SeedThresholds=['FSNOSEED'], stream=['CosmicCalo','express'],groups=['RATE:Calibration','BW:Detector']),
 
-- 
GitLab


From c87e03b698db1f19471fbac7b1219ec190c02de8 Mon Sep 17 00:00:00 2001
From: Gianantonio Pezzullo <g.pezzullo@yale.edu>
Date: Wed, 27 Jan 2021 14:49:47 +0100
Subject: [PATCH 30/30] changed error to warning report in the
 HLTMonitoringJSON script when a chain in the express stream has no monGroups
 defined

---
 .../python/HLTMenuConfig/Menu/HLTMonitoringJSON.py              | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
index 43ca0dcfe3d6..dc943808d5e4 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTMonitoringJSON.py
@@ -32,7 +32,7 @@ def generateMonitoringJSON(menuName, chainDicts, fileName):
         #if the chain is in a express stream, check presence of teh monGroup
         if 'express' in chain['stream']:
             if len(chain['monGroups']) == 0:
-                __log.error( "[HLTMonitoring::generateMonitoringJSON]Chain %s is in the express stream and doesn't have any monGroup", chain_name)
+                __log.warning( "[HLTMonitoring::generateMonitoringJSON]Chain %s is in the express stream and doesn't have any monGroup", chain_name)
 
         #check if the chain needs to be monitored
         if len(chain['monGroups']) == 0:
-- 
GitLab