6 @author Salah-Eddine Dahbi, Song-Ming Wang 
    7 @brief Global Monitoring job option to run online DQ with new-style configuration. 
    8 -- Offline on lxplus for ART test :  
    9    --- python GlobalMonitoring.py IOVDb.GlobalTag="conditions_Tag" --offline  --filesInput [path_to_RAW_data_file] --evtMax [Max_number_events] 
   10    --- note: if the filesInput is not provided a defaultTestFile will be used. 
   11    --- note: if the evtMax is not provided, the default is 100. 
   13 -- Online is the default: python GlobalMonitoring.py" 
   16 if __name__==
'__main__':
 
   19     from AthenaConfiguration.Enums 
import BeamType
 
   20     from AthenaConfiguration.AllConfigFlags 
import initConfigFlags
 
   21     from AthenaConfiguration.ComponentFactory 
import CompFactory
 
   22     from AthenaConfiguration.Enums 
import Format
 
   24     parser = flags.getArgumentParser()
 
   25     parser.add_argument(
'--offline', action=
'store_true', help=
"Run in offline mode (default is online)")
 
   27     parser.set_defaults(threads=1)
 
   28     args, _ = parser.parse_known_args()
 
   29     is_online = 
not args.offline
 
   30     flags.fillFromArgs(parser=parser)
 
   33     from AthenaCommon.Logging 
import log
 
   34     from AthenaCommon 
import Constants
 
   36         log.setLevel(getattr(Constants, args.loglevel))
 
   39         print(
"Running in online mode")
 
   40         partitionName = os.environ.get(
"TDAQ_PARTITION", 
"ATLAS")
 
   42         from AthenaConfiguration.AutoConfigOnlineRecoFlags 
import autoConfigOnlineRecoFlags
 
   45         flags.Concurrency.NumThreads = 1
 
   46         flags.Exec.MaxEvents = -1
 
   50         from ispy 
import IPCPartition, ISObject
 
   51         p = IPCPartition(partitionName)
 
   53             print(
"Partition:", p.name(), 
"is not valid")
 
   57         flags.DQ.useTrigger = 
True 
   58         flags.DQ.triggerDataAvailable = 
True 
   59         flags.DQ.enableLumiAccess = 
False 
   60         print(
"Online mode setup complete.")
 
   64         print(
"Running in offline mode")
 
   65         partitionName = 
'GMTestPartition' 
   68         flags.DQ.useTrigger = 
False 
   69         flags.Reco.EnableTrigger = 
False 
   70         flags.DQ.triggerDataAvailable = 
False 
   71         flags.LAr.doHVCorr = 
False 
   72         flags.DQ.enableLumiAccess = 
True 
   73         isOnlineStateless = 
True 
   76         print(
"Offline mode setup complete.")
 
   85     detDescrVersion = 
'ATLAS-R3S-2021-03-02-00' 
   86     flags.IOVDb.DatabaseInstance = 
"CONDBR2" 
   87     flags.GeoModel.Layout=
"atlas" 
   88     flags.GeoModel.AtlasVersion = detDescrVersion
 
   90     flags.Trigger.triggerConfig=
'DB' 
   92     if partitionName 
not in [
'ATLAS', 
'ATLAS_MP1']: 
 
   93         from AthenaConfiguration.TestDefaults 
import defaultTestFiles
 
   95         if not args.filesInput 
and args.offline:
 
   96             flags.Input.Files = defaultTestFiles.RAW_RUN3_DATA24
 
   99             flags.Exec.MaxEvents = 100
 
  101     if flags.Input.Format 
is Format.BS :
 
  102         if flags.DQ.Environment 
not in (
'tier0', 
'tier0Raw', 
'online'):
 
  103             log.warning(
'Reading RAW file, but DQ.Environment set to %s',
 
  104                         flags.DQ.Environment)
 
  105             log.warning(
'Will proceed but best guess is this is an error')
 
  106         log.info(
'Will schedule reconstruction, as best we know')
 
  108         if flags.DQ.Environment 
in (
'tier0', 
'tier0Raw', 
'online'):
 
  109             log.warning(
'Reading POOL file, but DQ.Environment set to %s',
 
  110                         flags.DQ.Environment)
 
  111             log.warning(
'Will proceed but best guess is this is an error')
 
  113     flags.Common.isOnline = 
True 
  116     print(
"Configuration Info".center(50))
 
  118     print(f
"{'Partition:':30} {partitionName}")
 
  119     print(f
"{'Max events:':30} {flags.Exec.MaxEvents}")
 
  120     print(f
"{'Run numbers:':30} {flags.Input.RunNumbers}")
 
  121     print(f
"{'Lumi block numbers:':30} {flags.Input.LumiBlockNumbers}")
 
  125         print(
"Beam Info".center(50))
 
  126         print(f
"{'Beam Energy:':30} {flags.Beam.Energy}")
 
  127         print(f
"{'Beam Type:':30} {flags.Beam.Type}")
 
  128         print(f
"{'Beam Number Of Collisions:':30} {flags.Beam.NumberOfCollisions}")
 
  129         print(f
"{'Beam Estimated Luminosity:':30} {flags.Beam.estimatedLuminosity}")
 
  130         print(f
"{'Beam Bunch Spacing:':30} {flags.Beam.BunchSpacing}")
 
  134     flags.Input.isMC = 
False 
  136     flags.InDet.useSctDCS = 
False 
  137     flags.InDet.useDCS = 
False 
  139     flags.DQ.doMonitoring = 
True 
  140     flags.DQ.doPostProcessing = 
True 
  142     flags.DQ.FileKey = 
'' 
  143     flags.DQ.Environment = 
'online' 
  144     flags.Output.HISTFileName = 
'monitoring.root' 
  145     flags.LAr.doHVCorr = 
False 
  146     flags.Detector.EnableCalo = 
True 
  152     flags.DQ.Steering.doGlobalMon = 
False 
  154     flags.DQ.Steering.doHLTMon = 
False 
  156     flags.DQ.Steering.doZDCMon = 
False 
  158     flags.DQ.Steering.doLVL1CaloMon = 
False 
  159     flags.DQ.Steering.doLVL1InterfacesMon = 
False 
  161     flags.DQ.Steering.doDataFlowMon = 
False 
  163     flags.DQ.Steering.doCTPMon = 
False 
  164     if partitionName 
not in [
'ATLAS', 
'ATLAS_MP1'] :
 
  165         flags.DQ.useTrigger = 
False 
  166         flags.DQ.triggerDataAvailable = 
False 
  167         flags.Reco.EnableTrigger = 
False     
  169     log.info(
'FINAL CONFIG FLAGS SETTINGS FOLLOW')
 
  170     if args.loglevel 
is None or getattr(Constants, args.loglevel) <= Constants.INFO:
 
  174     from AthenaConfiguration.ComponentFactory 
import CompFactory
 
  175     from SGComps.SGInputLoaderConfig 
import SGInputLoaderCfg
 
  178     from AthenaConfiguration.MainServicesConfig 
import MainServicesCfg
 
  180     acc.addService(CompFactory.ByteStreamCnvSvc(), primary=
True)
 
  183     from ByteStreamCnvSvc.ByteStreamConfig 
import ByteStreamReadCfg
 
  186     if not args.offline 
and not args.filesInput:
 
  187         from ByteStreamEmonSvc.EmonByteStreamConfig 
import EmonByteStreamCfg
 
  189         bytestreamInput = acc.getService(
"ByteStreamInputSvc")
 
  194         bytestreamInput.Partition = partitionName
 
  196         bytestreamInput.Key = 
"dcm" 
  197         bytestreamInput.KeyCount = 40
 
  198         bytestreamInput.BufferSize = 120  
 
  204         bytestreamInput.Timeout = 600000
 
  206         bytestreamInput.UpdatePeriod = 200
 
  208         bytestreamInput.StreamNames = [
'express']
 
  209         bytestreamInput.StreamType = 
"physics" 
  210         bytestreamInput.StreamLogic = 
"Or" 
  212         bytestreamInput.PublishName = os.environ.get(
"TDAQ_APPLICATION_NAME", 
"GlobalMonitoring")
 
  213         bytestreamInput.ISServer = 
'Histogramming-Global-iss'   
  214         if partitionName != 
'ATLAS' and partitionName != 
'ATLAS_MP1':
 
  215             bytestreamInput.ISServer = 
'Histogramming' 
  218         if partitionName == 
'ATLAS' or partitionName == 
'ATLAS_MP1':
 
  219             from PyUtils.OnlineISConfig 
import GetAtlasReady
 
  220             if beamType == BeamType.Cosmics:
 
  221                 bytestreamInput.StreamNames = [
'express',
'IDCosmic',
'HLT_IDCosmic',
'CosmicMuons',
'CosmicCalo']
 
  225                     bytestreamInput.StreamNames = [
'express']
 
  227                     bytestreamInput.StreamType = 
"express" 
  230                     bytestreamInput.StreamNames = [
'express',
'IDCosmic',
'HLT_IDCosmic',
'CosmicMuons',
'MinBias',
'Standby',
'Main',
'CosmicCalo']
 
  233             bytestreamInput.StreamLogic = 
'Ignore' 
  234             bytestreamInput.PublishName = 
'GMT9_sdahbi_R55' 
  236     from xAODEventInfoCnv.xAODEventInfoCnvConfig 
import EventInfoBeamSpotDecoratorAlgCfg
 
  240     acc.flagPerfmonDomain(
'Calo')
 
  241     if flags.Detector.EnableCalo:
 
  242         from CaloRec.CaloRecoConfig 
import CaloRecoCfg
 
  246     acc.flagPerfmonDomain(
'CaloExtension')
 
  247     if flags.Reco.EnableCaloExtension:
 
  248         from TrackToCalo.CaloExtensionBuilderAlgCfg 
import (
 
  249             CaloExtensionBuilderCfg)
 
  252     acc.flagPerfmonDomain(
'CaloRings')
 
  253     if flags.Reco.EnableCaloRinger:
 
  254         from CaloRingerAlgs.CaloRingerAlgsConfig 
import CaloRingerSteeringCfg
 
  257     acc.flagPerfmonDomain(
'ID')
 
  258     if flags.Reco.EnableTracking:
 
  259         from InDetConfig.TrackRecoConfig 
import InDetTrackRecoCfg
 
  263     acc.flagPerfmonDomain(
'Muon')
 
  264     if flags.Detector.EnableMuon:
 
  265         from MuonConfig.MuonReconstructionConfig 
import MuonReconstructionCfg
 
  269     acc.flagPerfmonDomain(
'CombinedMuon')
 
  270     if flags.Reco.EnableCombinedMuon:
 
  271         from MuonCombinedConfig.MuonCombinedReconstructionConfig 
import (
 
  272             MuonCombinedReconstructionCfg)
 
  276     acc.flagPerfmonDomain(
'Jets')
 
  277     if flags.Reco.EnableJet:
 
  278         from JetRecConfig.JetRecoSteering 
import JetRecoSteeringCfg
 
  283     acc.flagPerfmonDomain(
'TrackCellAssociation')
 
  284     if flags.Reco.EnableTrackCellAssociation:
 
  285         from TrackParticleAssociationAlgs.TrackParticleAssociationAlgsConfig 
import (
 
  286             TrackParticleCellAssociationCfg)
 
  289     acc.flagPerfmonDomain(
'Jets')
 
  290     if flags.Reco.EnableGlobalFELinking:
 
  294         from eflowRec.PFCfg 
import PFGlobalFlowElementLinkingCfg
 
  297     acc.flagPerfmonDomain(
'PFlow')
 
  298     if flags.Reco.EnablePFlow:
 
  299         from eflowRec.PFRun3Config 
import PFCfg
 
  300         acc.merge(
PFCfg(flags))
 
  302     acc.flagPerfmonDomain(
'EGamma')
 
  303     if flags.Reco.EnableEgamma:
 
  304         from egammaConfig.egammaSteeringConfig 
import EGammaSteeringCfg
 
  307     acc.flagPerfmonDomain(
'Tau')
 
  308     if flags.Reco.EnableTau:
 
  309         from tauRec.TauConfig 
import TauReconstructionCfg
 
  313     acc.flagPerfmonDomain(
'Trigger')
 
  314     if flags.Reco.EnableTrigger:
 
  315         from TriggerJobOpts.TriggerRecoConfig 
import TriggerRecoCfg
 
  319     acc.flagPerfmonDomain(
'MET')
 
  320     if flags.Reco.EnableMet:
 
  321         from METReconstruction.METRecCfg 
import METCfg
 
  325     acc.flagPerfmonDomain(
'Isolation')
 
  326     if flags.Reco.EnableIsolation:
 
  327         from IsolationAlgs.IsolationSteeringConfig 
import IsolationSteeringCfg
 
  331     acc.flagPerfmonDomain(
'Lucid')
 
  332     if flags.Detector.EnableLucid:
 
  333         from ForwardRec.LucidRecConfig 
import LucidRecCfg
 
  337     acc.flagPerfmonDomain(
'HI')
 
  338     if flags.Reco.EnableHI:
 
  339         from HIRecConfig.HIRecConfig 
import HIRecCfg
 
  343     acc.flagPerfmonDomain(
'FTag')
 
  344     if flags.Reco.EnableBTagging:
 
  345         from BTagging.BTagConfig 
import BTagRecoSplitCfg
 
  354     if not args.offline :
 
  356         acc.flagPerfmonDomain(
'DQM')
 
  357         if flags.DQ.doMonitoring:
 
  358             from AthenaMonitoring.AthenaMonitoringCfg 
import (AthenaMonitoringCfg, AthenaMonitoringPostprocessingCfg)
 
  360             if flags.DQ.doPostProcessing:
 
  363         if flags.DQ.Steering.doInDetMon:
 
  364             if flags.DQ.Steering.InDet.doGlobalMon:
 
  366                 from InDetGlobalMonitoringRun3Test.InDetGlobalMonitoringRun3TestConfig 
import InDetGlobalMonitoringRun3TestConfig
 
  368             if flags.DQ.Steering.InDet.doAlignMon:
 
  370                 from InDetAlignmentMonitoringRun3.InDetAlignmentMonitoringRun3Config 
import InDetAlignmentMonitoringRun3Config
 
  373         if flags.DQ.Steering.doPixelMon:
 
  374             from PixelMonitoring.PixelMonitoringConfig 
import PixelMonitoringConfig
 
  377         if flags.DQ.Steering.doSCTMon:
 
  379             from SCT_Monitoring.SCTMonitoringConfig 
import SCTMonitoringConfig
 
  382         if flags.DQ.Steering.doTRTMon:
 
  384             from TRTMonitoringRun3.TRTMonitoringRun3Config 
import TRTMonitoringRun3Cfg
 
  387         if flags.DQ.Steering.doLArMon:
 
  389             from LArConfiguration.LArMonitoringConfig 
import LArMonitoringConfig
 
  392         if flags.DQ.Steering.doTileMon:
 
  394             from TileMonitoring.TileMonitoringConfig 
import TileMonitoringCfg
 
  397         if flags.DQ.Steering.doCaloGlobalMon:
 
  399             from CaloMonitoring.CaloMonitoringConfig 
import CaloMonitoringCfg
 
  402         if flags.DQ.Steering.doMuonMon:
 
  404             from MuonDQAMonitoring.MuonDQAMonitoringConfig 
import MuonDQAMonitoringConfig
 
  407         if flags.DQ.Steering.doHLTMon:
 
  409             from TrigHLTMonitoring.TrigHLTMonitorAlgorithm 
import TrigHLTMonTopConfig
 
  412         if flags.DQ.Steering.doJetTagMon:
 
  414             from JetTagMonitoring.JetTagMonitorAlgorithm 
import JetTagMonitorConfig
 
  417         if flags.DQ.Steering.doEgammaMon:
 
  419             from egammaPerformance.egammaMonitoringConfig 
import egammaMonitoringConfig
 
  422         if flags.DQ.Steering.doJetMon:
 
  424             from JetMonitoring.JetMonitoringStandard 
import standardJetMonitoring
 
  428             if flags.DQ.Environment != 
'tier0ESD':
 
  430                 if not flags.Reco.EnableHI 
or (flags.Reco.EnableHI 
and flags.Tracking.doUPC) :
 
  431                     from eflowRec.PFCfg 
import PFGlobalFlowElementLinkingCfg
 
  437         acc.getEventAlgo(
"AlgTRTMonitoringRun3RAW").doExpert = 
True 
  441     from IOVDbSvc.IOVDbSvcConfig 
import addOverride
 
  442     acc.merge(
addOverride(flags, 
"/TRT/Onl/Calib/PID_NN", 
"TRTCalibPID_NN_v2", db=
""))
 
  450     acc.getService(
"PoolSvc").ReadCatalog += [
"xmlcatalog_file:/det/dqm/GlobalMonitoring/PoolFileCatalog_M7/PoolFileCatalog.xml"]
 
  456     sys.exit(0 
if sc.isSuccess() 
else 1)