From 92c792eafb8705d78b353b8e74995ed4329ef8d2 Mon Sep 17 00:00:00 2001
From: Javier Sanchez <javier.sanchez@cern.ch>
Date: Sat, 18 Feb 2017 22:32:05 +0100
Subject: [PATCH] Tagging the 00.02.13 release (EventIndexProducer-00-02-13)

	* ALL: changes needed to Correct failures for athena 21.0.x
	* POOL2EI_joboptions.py: Force trigger processing flag to false for EVNT files
	                         Check for RUN1 files and flag them accordingly
	                         Disable trigger processing for MC files with no trigger inside
	                         Force loading of trigger /TRIGGER/HLT/PrescaleKey into detStore
	* python/POOL2EI_Lib.py: Get SMK and L1 and HLT prescale keys from detStore if not loaded from in-file metadata
	                         Modify getting trigger chain details for HLT
	                         Get chain counters from detector Store if not provided by TriggerDecisionTool
	* Tag EventIndexProducer-00-02-13

2017-01-15 Javier Sanchez <Javier.Sanchez@ific.uv.es>
	* ALL: changes needed to correct failures for athena 21.0.x
	* python/POOL2EI_Lib.py: modify getting trigger chain details for HLT
	* POOL2EI_joboptions.py: modify TriggerDecisionTool instantiate to use TrigConf::TrigConfigSvc
	                         which was the default for previous version of TriggerDecision package

2016-10-14 Javier Sanchez <Javier.Sanchez@ific.uv.es>
	* POOL2EI_joboptions.py: Fix TrigDecisionTool configuration. Modify detection of HLT trigger on xAOD files
	* Tag EventIndexProducer-00-02-12


Former-commit-id: c5fe7396b70742b9647305d27ad682b0429af419
---
 .../EventIndexProducer/python/POOL2EI_Lib.py  | 218 ++++++++++++++----
 .../share/POOL2EI_joboptions.py               |  50 +++-
 2 files changed, 215 insertions(+), 53 deletions(-)

diff --git a/Database/EventIndex/EventIndexProducer/python/POOL2EI_Lib.py b/Database/EventIndex/EventIndexProducer/python/POOL2EI_Lib.py
index b8edcb7dd0b..6382b98efc7 100755
--- a/Database/EventIndex/EventIndexProducer/python/POOL2EI_Lib.py
+++ b/Database/EventIndex/EventIndexProducer/python/POOL2EI_Lib.py
@@ -82,6 +82,7 @@ class POOL2EI(PyAthena.Alg):
         _info("## DoTriggerInfo: {}".format(self.DoTriggerInfo))
         _info("## HaveHlt: {}".format(self.HaveHlt))
         _info("## HaveXHlt: {}".format(self.HaveXHlt))
+        _info("## RUN1: {}".format(self.RUN1))
         _info("## SendToBroker: {}".format(self.SendToBroker))
 
 
@@ -130,7 +131,7 @@ class POOL2EI(PyAthena.Alg):
             cls = getattr(PyAthena, cls_name)
 
         _info("retrieving various stores...")
-        for store_name in ('evtStore', 'inputStore',
+        for store_name in ('evtStore', 'inputStore', 'detStore', 
                            'tagStore', 'metaStore'):
             _info("retrieving [{}]...".format(store_name))
             o = getattr(self, store_name)
@@ -138,7 +139,7 @@ class POOL2EI(PyAthena.Alg):
         _info("retrieving various stores... [done]")
 
 
-        if "/TRIGGER/HLT/HltConfigKeys" in self.inputStore.keys():
+        if self.HaveHlt:
             # load trigger decision tool
             from TriggerJobOpts.TriggerFlags import TriggerFlags
             TriggerFlags.configurationSourceList=['ds']
@@ -146,16 +147,12 @@ class POOL2EI(PyAthena.Alg):
             self.trigDec = PyAthena.py_tool('Trig::TrigDecisionTool/TrigDecisionTool')
             self.trigDec.ExperimentalAndExpertMethods().enable()
             if self.HaveXHlt:
+                self.trigDec.setProperty("ConfigTool","TrigConf::xAODConfigTool");
                 self.trigDec.setProperty("TrigDecisionKey","xTrigDecision")
             else:
+                self.trigDec.setProperty("ConfigTool","TrigConf::AODConfigTool");
                 self.trigDec.setProperty("TrigDecisionKey","TrigDecision")
-        else:
-            if self.HaveHlt:
-                _info("Switch HaveHlt to False")
-                self.HaveHlt = False
-            #if self.DoTriggerInfo:
-            #    _info("Switch DoTriggerInfo to False")
-            #    self.DoTriggerInfo = False
+
 
         ## open output pkl file
         import os
@@ -225,6 +222,11 @@ class POOL2EI(PyAthena.Alg):
         import AthenaPython.PyAthena as PyAthena
         return PyAthena.py_svc('StoreGateSvc/TagMetaDataStore')
     
+    @property
+    def detStore(self):
+        import AthenaPython.PyAthena as PyAthena
+        return PyAthena.py_svc('StoreGateSvc/DetectorStore')
+    
     @property
     def inputStore(self):
         import AthenaPython.PyAthena as PyAthena
@@ -451,17 +453,15 @@ class POOL2EI(PyAthena.Alg):
 
         return 
 
-    def getChainCounter(self,level):
+    #################################################
+    # Get trigger list and chain counters or ctpIds
+    #################################################
+    def getChainCounter(self, level):
+        _info = self.msg.info
 
-        if self.HaveXHlt:
-            if level.startswith("L1"):
-                triggers = self.trigDec.getChainGroup(level)
-                names = triggers.getListOfTriggers()
-            else:
-                names = self.trigDec.getListOfTriggers(level)
-        else:
-            triggers = self.trigDec.getChainGroup(level)
-            names = triggers.getListOfTriggers()
+        triggers = self.trigDec.getChainGroup(level)
+        names = triggers.getListOfTriggers()
+        _info("POOL2EI::getChainCounter got {} triggers for level {}".format( names.size(),level))
 
         if level.startswith("L1"):
             level1 = True
@@ -470,20 +470,33 @@ class POOL2EI(PyAthena.Alg):
 
         ccname = {}
         ccmax = 0
-        for i in xrange(names.size()):
-            name = names.at(i)
-            if level1:
-                cc = self.trigDec.ExperimentalAndExpertMethods().getItemConfigurationDetails(name).ctpId()
+        gtd_method = True                         # by default, use getChainDetails for L2,EF,HLT
+        try:
+            for i in xrange(names.size()):
+                name = names.at(i)
+                if level1:
+                    cc = self.trigDec.ExperimentalAndExpertMethods().getItemConfigurationDetails(name).ctpId()
+                else:
+                    if gtd_method:
+                        try:
+                            cc = self.trigDec.ExperimentalAndExpertMethods().getChainDetails(name).getChainCounter()
+                        except:
+                            gtd_method = False    # disable this method for next triggers 
+                    if not gtd_method:
+                        cc = self.trigDec.ExperimentalAndExpertMethods().getChainConfigurationDetails(name).chain_counter()
+                ccname[cc]=name
+                if cc > ccmax:
+                    ccmax = cc
+
+            if len(ccname) == 0:
+                cclen = 0
             else:
-                cc = self.trigDec.ExperimentalAndExpertMethods().getChainConfigurationDetails(name).chain_counter()
-            ccname[cc]=name
-            if cc > ccmax:
-                ccmax = cc
-
-        if len(ccname) == 0:
+                cclen = ccmax + 1
+        except:
+            _info("POOL2EI::getChainCounter Unable to get trigger chains for {}".format(level))
+            ccname = {}
             cclen = 0
-        else:
-            cclen = ccmax + 1
+
         return ( cclen, ccname )
         
  
@@ -497,17 +510,107 @@ class POOL2EI(PyAthena.Alg):
 
         # get trigger chains
         if self.DoTriggerInfo and self.HaveHlt:
-            if self.HaveXHlt:
-                ( self.cclenL1, self.ccnameL1 ) = self.getChainCounter("L1_.*")
-                ( self.cclenL2, self.ccnameL2 ) = self.getChainCounter("HLT_.*")
-                ( self.cclenEF, self.ccnameEF ) = ( self.cclenL2, self.ccnameL2 )
-            else:
+            if self.RUN1:
                 ( self.cclenL1, self.ccnameL1 ) = self.getChainCounter("L1_.*")
                 ( self.cclenL2, self.ccnameL2 ) = self.getChainCounter("L2_.*")
                 ( self.cclenEF, self.ccnameEF ) = self.getChainCounter("EF_.*")
-                
+            else:
+                ( self.cclenL1, self.ccnameL1 ) = self.getChainCounter("L1_.*")
+                ( self.cclenL2, self.ccnameL2 ) = self.getChainCounter("HLT_.*")
+                ( self.cclenEF, self.ccnameEF ) = ( self.cclenL2, self.ccnameL2 )
+
         return StatusCode.Success
 
+    ##########################################
+    # get chain counters from detector Store
+    ##########################################
+    def getChainCountersFromDetStore(self):
+        _info = self.msg.info
+
+        # try to get L1 trigger menu from detStore if not loaded in BeginRun
+        if self.cclenL1 == 0:
+            _info("POOL2EI::getChainCountersFromDetStore Trying to get L1 trigger names from detStore")
+            try:
+                self.cclenL1 = 0
+                self.ccnameL1 = {}
+                lvl1menu = self.detStore['/TRIGGER/LVL1/Menu']
+                for (ichan, entry) in lvl1menu:
+                    self.ccnameL1[ichan] = entry['ItemName']
+                    if ichan > self.cclenL1:
+                        self.cclenL1 = ichan
+                _info("POOL2EI::getChainCountersFromDetStore got {} triggers for level L1".format(self.cclenL1))
+                if len(self.ccnameL1) == 0:
+                    self.cclenL1 = 0
+                else:
+                    self.cclenL1 += 1
+            except:
+                _info("POOL2EI::getChainCountersFromDetStore Unable to get L1 trigger names from detStore")
+                self.cclenL1 = 0
+                self.ccnameL1 = {}
+                pass
+
+        # try to get HLT trigger menu from detStore if not loaded in BeginRun
+        if self.cclenL2 == 0 or self.cclenEF == 0:
+            _info("POOL2EI::getChainCountersFromDetStore Trying to get HLT trigger names from detStore")
+            if self.RUN1:
+                try:
+                    self.cclenL2 = 0
+                    self.ccnameL2 = {}
+                    self.cclenEF = 0
+                    self.ccnameEF = {}
+                    hltmenu = self.detStore['/TRIGGER/HLT/Menu']
+                    for (ichan, entry) in hltmenu:
+                        ccounter = entry['ChainCounter']
+                        ccname   = entry['ChainName']
+                        if ccname.startswith("L2_"):
+                            self.ccnameL2[ccounter] = ccname
+                            if ccounter > self.cclenL2:
+                                self.cclenL2 = ccounter
+                        if ccname.startswith("EF_"):
+                            self.ccnameEF[ccounter] = ccname
+                            if ccounter > self.cclenEF:
+                                self.cclenEF = ccounter
+                    _info("POOL2EI::getChainCountersFromDetStore got {} triggers for level L2".format(self.cclenL2))
+                    _info("POOL2EI::getChainCountersFromDetStore got {} triggers for level EF".format(self.cclenEF))
+                    if len(self.ccnameL2) == 0:
+                        self.cclenL2 = 0
+                    else:
+                        self.cclenL2 += 1
+                    if len(self.ccnameEF) == 0:
+                        self.cclenEF = 0
+                    else:
+                        self.cclenEF += 1
+                except:
+                    _info("POOL2EI::getChainCountersFromDetStore Unable to get L2 & EF trigger names from detStore")
+                    self.cclenL2 = 0
+                    self.ccnameL2 = {}
+                    self.cclenEF = 0
+                    self.ccnameEF = {}
+                    pass
+            else:
+                try:
+                    self.cclenL2 = 0
+                    self.ccnameL2 = {}
+                    hltmenu = self.detStore['/TRIGGER/HLT/Menu']
+                    for (ichan, entry) in hltmenu:
+                        ccounter = entry['ChainCounter']
+                        ccname   = entry['ChainName']
+                        if ccname.startswith("HLT_"):
+                            self.ccnameL2[ccounter] = ccname
+                            if ccounter > self.cclenL2:
+                                self.cclenL2 = ccounter
+                    _info("POOL2EI::getChainCountersFromDetStore got {} triggers for level HLT".format(self.cclenL2))
+                    if len(self.ccnameL2) == 0:
+                        self.cclenL2 = 0
+                    else:
+                        self.cclenL2 += 1
+                    ( self.cclenEF, self.ccnameEF ) = ( self.cclenL2, self.ccnameL2 )
+                except:
+                    _info("POOL2EI::getChainCountersFromDetStore Unable to get HLT trigger names from detStore")
+                    self.cclenL2 = 0
+                    self.ccnameL2 = {}
+                    pass
+
 
     ##########################################
     # execute event by event
@@ -593,6 +696,8 @@ class POOL2EI(PyAthena.Alg):
         if self.DoTriggerInfo:
             eit = ei.trigger_info()
             _info("## Lvl1ID {}".format(eit.extendedLevel1ID()))
+            if 'xAOD::EventInfo' in store.keys():
+                _info("#2# Lvl1ID {}".format(xei.extendedLevel1ID()))
             Lvl1ID = eit.extendedLevel1ID()
             eirec['Lvl1ID'] = Lvl1ID
             trigL1=""
@@ -618,7 +723,11 @@ class POOL2EI(PyAthena.Alg):
             eirec['L2PassedTrigMask'] = trigL2
             eirec['EFPassedTrigMask'] = trigEF
         
-        
+            # if trigger chains were not read at BeginRun try now from detStore
+            if self.cclenL1 == 0 or self.cclenL2 == 0 or self.cclenEF == 0:
+                _info("triggers were not read  at BeginRun try now from detStore")
+                self.getChainCountersFromDetStore()
+
             ## from Metadata
             SMK = self._iov.get('SMK',(run_number,event_number))
             L1PSK = self._iov.get('L1PSK',(run_number,lumi_block))
@@ -627,14 +736,31 @@ class POOL2EI(PyAthena.Alg):
             _info('## L1PSK:  {}'.format(L1PSK))
             _info('## HLTPSK: {}'.format(HLTPSK))
 
+            if SMK is None:
+                # try read keys from detector store
+                try:
+                    SMK    = self.detStore['/TRIGGER/HLT/HltConfigKeys']['MasterConfigurationKey']
+                    L1PSK  = self.detStore['/TRIGGER/LVL1/Lvl1ConfigKey']['Lvl1PrescaleConfigurationKey']
+                    if '/TRIGGER/HLT/PrescaleKey' in self.detStore.keys():
+                        # LB-wise 
+                        HLTPSK = self.detStore['/TRIGGER/HLT/PrescaleKey']['HltPrescaleKey']
+                    else:
+                        # Run-wise
+                        HLTPSK = self.detStore['/TRIGGER/HLT/HltConfigKeys']['HltPrescaleConfigurationKey']
+                except:
+                    pass
+                _info('## SMK*:    {}'.format(SMK))
+                _info('## L1PSK*:  {}'.format(L1PSK))
+                _info('## HLTPSK*: {}'.format(HLTPSK))
+
             eirec['SMK'] = SMK
             eirec['L1PSK'] = L1PSK
             eirec['HLTPSK'] = HLTPSK
 
 
         # update trigger if TrigDecision info is available
-        if self.DoTriggerInfo and self.HaveHlt and ('TrigDecision' in self.evtStore.keys() or 
-                                                    'xTrigDecision' in self.evtStore.keys()):
+        if self.DoTriggerInfo and self.HaveHlt:
+
             L1_isPassedAfterPrescale  = 0x1 << 16
             L1_isPassedBeforePrescale = 0x1 << 17
             L1_isPassedAfterVeto      = 0x1 << 18
@@ -882,8 +1008,8 @@ class POOL2EISvc(PyAthena.Svc):
 
         incsvc.addListener(self, 'BeginInputFile')
         incsvc.addListener(self, 'EndInputFile')
-        incsvc.addListener(self, 'BeginRun', 10)
-        incsvc.addListener(self, 'EndRun', 10)
+        #incsvc.addListener(self, 'BeginRun', 10)
+        #incsvc.addListener(self, 'EndRun', 10)
         incsvc.addListener(self, 'EndEvtLoop')
         incsvc.release()
 
@@ -917,10 +1043,10 @@ class POOL2EISvc(PyAthena.Svc):
             if self.insideInputFile:
                 self.algo.endFile()
             pass
-        elif tp == 'BeginRun':
-            _info('POOL2EISvc::handle BeginRun')
-            self.algo.beginRun()
-            pass
+        #elif tp == 'BeginRun':
+        #    _info('POOL2EISvc::handle BeginRun')
+        #    self.algo.beginRun()
+        #    pass
         else:
             _info('POOL2EISvc::handle {}'.format(tp))
             pass
diff --git a/Database/EventIndex/EventIndexProducer/share/POOL2EI_joboptions.py b/Database/EventIndex/EventIndexProducer/share/POOL2EI_joboptions.py
index 47cd697ebd4..cca8d21443f 100644
--- a/Database/EventIndex/EventIndexProducer/share/POOL2EI_joboptions.py
+++ b/Database/EventIndex/EventIndexProducer/share/POOL2EI_joboptions.py
@@ -147,10 +147,34 @@ except:
     except:
         pass
 
-if inputFileSummary.has_key('metadata') and inputFileSummary['metadata'].has_key('/TRIGGER/HLT/HltConfigKeys'):
-
-    # we should search for 'xAOD::TrigDecision' in eventdata_items but 'zero events' files do not                                                              
-    # contain eventdata_items, so we look also for 'xAOD::TriggerMenuContainer' in metadata_items                                                              
+# set RUN1 flag
+run_number = inputFileSummary['run_number'][0]
+if run_number < 222222:
+    job.pool2ei.RUN1 = True
+else:
+    job.pool2ei.RUN1 = False
+
+log = logging.getLogger( "Py:pool2ei" )
+# if EVNT, disable trigger processing
+if  job.pool2ei.DoTriggerInfo:
+    if 'StreamEVGEN' in inputFileSummary['stream_names']:
+        log.info ("Disable trigger processing for EVNT files")
+        job.pool2ei.DoTriggerInfo = False
+        job.pool2ei.HaveHlt = False
+        job.pool2ei.HaveXHlt = False
+
+# if MC, check that trigger information is available in the metadata
+if inputFileSummary['evt_type'][0] == "IS_SIMULATION":
+    if 'metadata' not in inputFileSummary or '/TRIGGER/HLT/HltConfigKeys' not in inputFileSummary['metadata']:
+        log.info ("Disable trigger processing for MC files with no trigger inside")
+        job.pool2ei.DoTriggerInfo = False
+        job.pool2ei.HaveHlt = False
+        job.pool2ei.HaveXHlt = False
+
+if job.pool2ei.DoTriggerInfo:
+
+    # we should search for 'xAOD::TrigDecision' in eventdata_items but 'zero events' files do not
+    # contain eventdata_items, so we look also for 'xAOD::TriggerMenuContainer' in metadata_items
     job.pool2ei.HaveXHlt = False
     if inputFileSummary.has_key('eventdata_items') and 'xAOD::TrigDecision' \
             in [ x[0] for x in inputFileSummary['eventdata_items'] ]:
@@ -160,16 +184,28 @@ if inputFileSummary.has_key('metadata') and inputFileSummary['metadata'].has_key
         job.pool2ei.HaveXHlt = True
 
     from TriggerJobOpts.TriggerConfigGetter import TriggerConfigGetter
-    cfg = TriggerConfigGetter("ReadPool")
-  
+    trigcfg = TriggerConfigGetter("ReadPool")
+
+    # ensure that /TRIGGER/HLT/PrescaleKey is always loaded
+    # it is not loaded by TriggerConfigGetter when trigger metadata is missing
+    # but it should have been loaded. We need LB-wise HLT prescale key
+    if trigcfg.hasLBwiseHLTPrescalesAndL1ItemDef is False and inputFileSummary['evt_type'][0] == "IS_DATA":
+        from IOVDbSvc.CondDB import conddb
+        conddb.addFolderWithTag("TRIGGER", "/TRIGGER/HLT/PrescaleKey", "HEAD")
+        conddb.addFolderWithTag("TRIGGER", "/TRIGGER/HLT/Prescales", "HEAD")
+        conddb.addFolderWithTag("TRIGGER", "/TRIGGER/LVL1/ItemDef", "HEAD")
+
     from AthenaCommon.AppMgr import ToolSvc
     from TrigDecisionTool.TrigDecisionToolConf import Trig__TrigDecisionTool
-    tdt = Trig__TrigDecisionTool("TrigDecisionTool")
     if job.pool2ei.HaveXHlt:
+        tdt = Trig__TrigDecisionTool(name="TrigDecisionTool", 
+                                     TrigConfigSvc="TrigConf::TrigConfigSvc/TrigConfigSvc")
         tdt.TrigDecisionKey = 'xTrigDecision'
         tdt.UseAODDecision = False
     else:
         # use old decision
+        tdt = Trig__TrigDecisionTool(name="TrigDecisionTool", 
+                                     TrigConfigSvc="TrigConf::TrigConfigSvc/TrigConfigSvc")
         tdt.TrigDecisionKey = 'TrigDecision'
         tdt.UseAODDecision = True
     ToolSvc += tdt
-- 
GitLab