ATLAS Offline Software
Loading...
Searching...
No Matches
GlobalMonitoring.py
Go to the documentation of this file.
1#!/usr/bin/env python3
2#
3# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
4#
5'''
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.
12
13-- Online is the default: python GlobalMonitoring.py"
14'''
15
16if __name__=='__main__':
17 import sys
18 import os
19 from AthenaConfiguration.Enums import BeamType
20 from AthenaConfiguration.AllConfigFlags import initConfigFlags
21 from AthenaConfiguration.ComponentFactory import CompFactory
22 from AthenaConfiguration.Enums import Format
23 flags = initConfigFlags()
24 parser = flags.getArgumentParser()
25 parser.add_argument('--offline', action='store_true', help="Run in offline mode (default is online)")
26 # change default
27 parser.set_defaults(threads=1)
28 args, _ = parser.parse_known_args()
29 is_online = not args.offline
30 flags.fillFromArgs(parser=parser)
31
32 # Setup logs
33 from AthenaCommon.Logging import log
34 from AthenaCommon import Constants
35 if args.loglevel:
36 log.setLevel(getattr(Constants, args.loglevel))
37
38 if is_online:
39 print("Running in online mode")
40 partitionName = os.environ.get("TDAQ_PARTITION", "ATLAS")
41
42 from AthenaConfiguration.AutoConfigOnlineRecoFlags import autoConfigOnlineRecoFlags
43 autoConfigOnlineRecoFlags(flags, partitionName)
44
45 flags.Concurrency.NumThreads = 1
46 flags.Exec.MaxEvents = -1
47
48
49 # Set up partition for online monitoring
50 from ispy import IPCPartition, ISObject
51 p = IPCPartition(partitionName)
52 if not p.isValid():
53 print("Partition:", p.name(), "is not valid")
54 sys.exit(1)
55
56 # Online specific flags setup
57 flags.DQ.useTrigger = True
58 flags.DQ.triggerDataAvailable = True
59 flags.DQ.enableLumiAccess = False
60 print("Online mode setup complete.")
61
62 # Offline mode logic
63 else:
64 print("Running in offline mode")
65 partitionName = 'GMTestPartition'
66
67 # Offline specific settings
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
74 isOfflineTest = True
75
76 print("Offline mode setup complete.")
77
78 # flags.DQ.enableLumiAccess
79 # for ART Test on LXPLUS needs to be True, for online/test partition it need to be false with applying changes to CaloMonitoringConfig.py Jira "ATLASRECTS-8077"
80
81 # ############################################################
82 # COND tag and GEO are needed
83 # for running over a test partition online
84 # ############################################################
85 detDescrVersion = 'ATLAS-R3S-2021-03-02-00'
86 flags.IOVDb.DatabaseInstance = "CONDBR2"
87 flags.GeoModel.Layout="atlas"
88 flags.GeoModel.AtlasVersion = detDescrVersion
89 #flags.IOVDb.GlobalTag="CONDBR2-HLTP-2024-02"
90 flags.Trigger.triggerConfig='DB'
91
92 if partitionName not in ['ATLAS', 'ATLAS_MP1']:
93 from AthenaConfiguration.TestDefaults import defaultTestFiles
94 # if --filesInput was specified as well (!) this will override
95 if not args.filesInput and args.offline:
96 flags.Input.Files = defaultTestFiles.RAW_RUN3_DATA24
97 # if --evtMax was specified as well this will override
98 if not args.evtMax:
99 flags.Exec.MaxEvents = 100
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')
107 else:
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')
112
113 flags.Common.isOnline = True
114
115 print("=" * 50)
116 print("Configuration Info".center(50))
117 print("=" * 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}")
122 print("=" * 50)
123 if not args.offline:
124 print("=" * 50)
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}")
131 print("=" * 50)
132
133
134 flags.Input.isMC = False
135
136 flags.InDet.useSctDCS = False
137 flags.InDet.useDCS = False
138
139 flags.DQ.doMonitoring = True
140 flags.DQ.doPostProcessing = True
141
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
147 #flags.Reco.EnableHI = False
148
149 # ############################################################
150 # Set monitoring flags
151 # ############################################################
152 flags.DQ.Steering.doGlobalMon = False
153
154 flags.DQ.Steering.doHLTMon = False
155
156 flags.DQ.Steering.doZDCMon = False
157
158 flags.DQ.Steering.doLVL1CaloMon = False
159 flags.DQ.Steering.doLVL1InterfacesMon = False
160
161 flags.DQ.Steering.doDataFlowMon = False
162
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
168
169 log.info('FINAL CONFIG FLAGS SETTINGS FOLLOW')
170 if args.loglevel is None or getattr(Constants, args.loglevel) <= Constants.INFO:
171 flags.dump()
172 flags.lock()
173
174 from AthenaConfiguration.ComponentFactory import CompFactory
175 from SGComps.SGInputLoaderConfig import SGInputLoaderCfg
176
177 # Initialize configuration object, add accumulator, merge, and run.
178 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
179 acc = MainServicesCfg(flags)
180 acc.addService(CompFactory.ByteStreamCnvSvc(), primary=True)
181
182 #if args.offline:
183 from ByteStreamCnvSvc.ByteStreamConfig import ByteStreamReadCfg
184 acc.merge(ByteStreamReadCfg(flags))
185
186 if not args.offline and not args.filesInput:
187 from ByteStreamEmonSvc.EmonByteStreamConfig import EmonByteStreamCfg
188 acc.merge(EmonByteStreamCfg(flags, type_names=['CTP_RDO/CTP_RDO']))
189 bytestreamInput = acc.getService("ByteStreamInputSvc")
190
191 # ############################################################
192 # The name of the partition you want to connect
193 # ############################################################
194 bytestreamInput.Partition = partitionName
195
196 bytestreamInput.Key = "dcm"
197 bytestreamInput.KeyCount = 40
198 bytestreamInput.BufferSize = 120 #event buffersize
199
200 # #######################################################
201 # TimeOut (in milliseconds) - Prevent job with low rates
202 # to reconnect too often to SFIs
203 # ######################################################
204 bytestreamInput.Timeout = 600000
205
206 bytestreamInput.UpdatePeriod = 200
207
208 bytestreamInput.StreamNames = ['express']
209 bytestreamInput.StreamType = "physics"
210 bytestreamInput.StreamLogic = "Or"
211
212 bytestreamInput.PublishName = os.environ.get("TDAQ_APPLICATION_NAME", "GlobalMonitoring")
213 bytestreamInput.ISServer = 'Histogramming-Global-iss' # Ak: 26-05-2014 - needed to write out the gathere hsitograms to the correct server
214 if partitionName != 'ATLAS' and partitionName != 'ATLAS_MP1':
215 bytestreamInput.ISServer = 'Histogramming'
216
217
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']
222 else:
223 if GetAtlasReady():
224 #printfunc ("ATLAS READY, reading express stream")
225 bytestreamInput.StreamNames = ['express']
226 # bytestreamInput.StreamNames = ['express','MinBias','Main']
227 bytestreamInput.StreamType = "express"
228 else:
229 #printfunc ("ATLAS NOT READY, reading standby stream")
230 bytestreamInput.StreamNames = ['express','IDCosmic','HLT_IDCosmic','CosmicMuons','MinBias','Standby','Main','CosmicCalo']
231 #bytestreamInput.StreamNames = ['MinBias']
232 else:
233 bytestreamInput.StreamLogic = 'Ignore'
234 bytestreamInput.PublishName = 'GMT9_sdahbi_R55'
235
236 from xAODEventInfoCnv.xAODEventInfoCnvConfig import EventInfoBeamSpotDecoratorAlgCfg
237 acc.merge(EventInfoBeamSpotDecoratorAlgCfg(flags))
238
239
240 acc.flagPerfmonDomain('Calo')
241 if flags.Detector.EnableCalo:
242 from CaloRec.CaloRecoConfig import CaloRecoCfg
243 acc.merge(CaloRecoCfg(flags))
244
245
246 acc.flagPerfmonDomain('CaloExtension')
247 if flags.Reco.EnableCaloExtension:
248 from TrackToCalo.CaloExtensionBuilderAlgCfg import (
249 CaloExtensionBuilderCfg)
250 acc.merge(CaloExtensionBuilderCfg(flags))
251
252 acc.flagPerfmonDomain('CaloRings')
253 if flags.Reco.EnableCaloRinger:
254 from CaloRingerAlgs.CaloRingerAlgsConfig import CaloRingerSteeringCfg
255 acc.merge(CaloRingerSteeringCfg(flags))
256
257 acc.flagPerfmonDomain('ID')
258 if flags.Reco.EnableTracking:
259 from InDetConfig.TrackRecoConfig import InDetTrackRecoCfg
260 acc.merge(InDetTrackRecoCfg(flags))
261
262
263 acc.flagPerfmonDomain('Muon')
264 if flags.Detector.EnableMuon:
265 from MuonConfig.MuonReconstructionConfig import MuonReconstructionCfg
266 acc.merge(MuonReconstructionCfg(flags))
267
268
269 acc.flagPerfmonDomain('CombinedMuon')
270 if flags.Reco.EnableCombinedMuon:
271 from MuonCombinedConfig.MuonCombinedReconstructionConfig import (
272 MuonCombinedReconstructionCfg)
273 acc.merge(MuonCombinedReconstructionCfg(flags))
274
275
276 acc.flagPerfmonDomain('Jets')
277 if flags.Reco.EnableJet:
278 from JetRecConfig.JetRecoSteering import JetRecoSteeringCfg
279 acc.merge(JetRecoSteeringCfg(flags))
280
281 # TrackParticleCellAssociation
282 # add cells crossed by high pt ID tracks
283 acc.flagPerfmonDomain('TrackCellAssociation')
284 if flags.Reco.EnableTrackCellAssociation:
285 from TrackParticleAssociationAlgs.TrackParticleAssociationAlgsConfig import (
286 TrackParticleCellAssociationCfg)
287 acc.merge(TrackParticleCellAssociationCfg(flags))
288
289 acc.flagPerfmonDomain('Jets')
290 if flags.Reco.EnableGlobalFELinking:
291 # We also need to build links between the newly
292 # created jet constituents (GlobalFE)
293 # and electrons,photons,muons and taus
294 from eflowRec.PFCfg import PFGlobalFlowElementLinkingCfg
295 acc.merge(PFGlobalFlowElementLinkingCfg(flags))
296
297 acc.flagPerfmonDomain('PFlow')
298 if flags.Reco.EnablePFlow:
299 from eflowRec.PFRun3Config import PFCfg
300 acc.merge(PFCfg(flags))
301
302 acc.flagPerfmonDomain('EGamma')
303 if flags.Reco.EnableEgamma:
304 from egammaConfig.egammaSteeringConfig import EGammaSteeringCfg
305 acc.merge(EGammaSteeringCfg(flags))
306
307 acc.flagPerfmonDomain('Tau')
308 if flags.Reco.EnableTau:
309 from tauRec.TauConfig import TauReconstructionCfg
310 acc.merge(TauReconstructionCfg(flags))
311
312
313 acc.flagPerfmonDomain('Trigger')
314 if flags.Reco.EnableTrigger:
315 from TriggerJobOpts.TriggerRecoConfig import TriggerRecoCfg
316 acc.merge(TriggerRecoCfg(flags))
317
318
319 acc.flagPerfmonDomain('MET')
320 if flags.Reco.EnableMet:
321 from METReconstruction.METRecCfg import METCfg
322 acc.merge(METCfg(flags))
323
324
325 acc.flagPerfmonDomain('Isolation')
326 if flags.Reco.EnableIsolation:
327 from IsolationAlgs.IsolationSteeringConfig import IsolationSteeringCfg
328 acc.merge(IsolationSteeringCfg(flags))
329
330
331 acc.flagPerfmonDomain('Lucid')
332 if flags.Detector.EnableLucid:
333 from ForwardRec.LucidRecConfig import LucidRecCfg
334 acc.merge(LucidRecCfg(flags))
335
336
337 acc.flagPerfmonDomain('HI')
338 if flags.Reco.EnableHI:
339 from HIRecConfig.HIRecConfig import HIRecCfg
340 acc.merge(HIRecCfg(flags))
341
342
343 acc.flagPerfmonDomain('FTag')
344 if flags.Reco.EnableBTagging:
345 from BTagging.BTagConfig import BTagRecoSplitCfg
346 acc.merge(BTagRecoSplitCfg(flags))
347
348 # #####################################################
349 # Load Monitoring
350 # #####################################################
351 #if flags.Reco.EnablePostProcessing:
352 # acc.merge(RecoPostProcessingCfg(flags))
353
354 if not args.offline :
355 # Monitoring
356 acc.flagPerfmonDomain('DQM')
357 if flags.DQ.doMonitoring:
358 from AthenaMonitoring.AthenaMonitoringCfg import (AthenaMonitoringCfg, AthenaMonitoringPostprocessingCfg)
359 acc.merge(AthenaMonitoringCfg(flags))
360 if flags.DQ.doPostProcessing:
361 acc.merge(AthenaMonitoringPostprocessingCfg(flags))
362
363 if flags.DQ.Steering.doInDetMon:
364 if flags.DQ.Steering.InDet.doGlobalMon:
365 #info('Set up InDet Global monitoring')
366 from InDetGlobalMonitoringRun3Test.InDetGlobalMonitoringRun3TestConfig import InDetGlobalMonitoringRun3TestConfig
368 if flags.DQ.Steering.InDet.doAlignMon:
369 #info('Set up Alignment monitoring')
370 from InDetAlignmentMonitoringRun3.InDetAlignmentMonitoringRun3Config import InDetAlignmentMonitoringRun3Config
371 acc.merge(InDetAlignmentMonitoringRun3Config(flags))
372
373 if flags.DQ.Steering.doPixelMon:
374 from PixelMonitoring.PixelMonitoringConfig import PixelMonitoringConfig
375 acc.merge(PixelMonitoringConfig(flags))
376
377 if flags.DQ.Steering.doSCTMon:
378 #info('Set up SCT monitoring')
379 from SCT_Monitoring.SCTMonitoringConfig import SCTMonitoringConfig
380 acc.merge(SCTMonitoringConfig(flags))
381
382 if flags.DQ.Steering.doTRTMon:
383 #info('Set up TRT monitoring')
384 from TRTMonitoringRun3.TRTMonitoringRun3Config import TRTMonitoringRun3Cfg
385 acc.merge(TRTMonitoringRun3Cfg(flags))
386
387 if flags.DQ.Steering.doLArMon:
388 #info('Set up LAr monitoring')
389 from LArConfiguration.LArMonitoringConfig import LArMonitoringConfig
390 acc.merge(LArMonitoringConfig(flags))
391
392 if flags.DQ.Steering.doTileMon:
393 #info('Set up Tile monitoring')
394 from TileMonitoring.TileMonitoringConfig import TileMonitoringCfg
395 acc.merge(TileMonitoringCfg(flags))
396
397 if flags.DQ.Steering.doCaloGlobalMon:
398 #info('Set up Calo monitoring')
399 from CaloMonitoring.CaloMonitoringConfig import CaloMonitoringCfg
400 acc.merge(CaloMonitoringCfg(flags))
401
402 if flags.DQ.Steering.doMuonMon:
403 #info('Set up Muon monitoring')
404 from MuonDQAMonitoring.MuonDQAMonitoringConfig import MuonDQAMonitoringConfig
405 acc.merge(MuonDQAMonitoringConfig(flags))
406
407 if flags.DQ.Steering.doHLTMon:
408 #info('Set up HLT monitoring')
409 from TrigHLTMonitoring.TrigHLTMonitorAlgorithm import TrigHLTMonTopConfig
410 acc.merge(TrigHLTMonTopConfig(flags))
411
412 if flags.DQ.Steering.doJetTagMon:
413 #info('Set up JetTagging monitoring')
414 from JetTagMonitoring.JetTagMonitorAlgorithm import JetTagMonitorConfig
415 acc.merge(JetTagMonitorConfig(flags))
416
417 if flags.DQ.Steering.doEgammaMon:
418 #info('Set up Egamma monitoring')
419 from egammaPerformance.egammaMonitoringConfig import egammaMonitoringConfig
420 acc.merge(egammaMonitoringConfig(flags))
421
422 if flags.DQ.Steering.doJetMon:
423 #info('Set up Jet monitoring')
424 from JetMonitoring.JetMonitoringStandard import standardJetMonitoring
425 acc.merge(standardJetMonitoring(flags))
426 #Need to create links between global FE, created in jet finding, and other objects
427 #MET monitoring will need these in some workflows (but not in tier0ESD)
428 if flags.DQ.Environment != 'tier0ESD':
429 # Only run PFlow linking for ion runs in UPC mode
430 if not flags.Reco.EnableHI or (flags.Reco.EnableHI and flags.Tracking.doUPC) :
431 from eflowRec.PFCfg import PFGlobalFlowElementLinkingCfg
432 acc.merge(PFGlobalFlowElementLinkingCfg(flags))
433
434 # #######################################
435 # Set TRT expert flags
436 # #######################################
437 acc.getEventAlgo("AlgTRTMonitoringRun3RAW").doExpert = True
438 # acc.getEventAlgo("AlgTRTMonitoringRun3RAW").doExpert = False
439 # acc.getEventAlgo("AlgTRTMonitoringRun3RAW").doEfficiency = True
440
441 from IOVDbSvc.IOVDbSvcConfig import addOverride
442 acc.merge(addOverride(flags, "/TRT/Onl/Calib/PID_NN", "TRTCalibPID_NN_v2", db=""))
443
444
445
446 # #######################################
447 # Need to add this line since it was needed as explained in the below link. Otherwise jobs crash
448 # https://gitlab.cern.ch/atlas/athena/-/blob/master/Reconstruction/RecExample/RecExOnline/share/RecExOnline_postconfig.py#L12
449 # #######################################
450 acc.getService("PoolSvc").ReadCatalog += ["xmlcatalog_file:/det/dqm/GlobalMonitoring/PoolFileCatalog_M7/PoolFileCatalog.xml"]
451
452 # #######################################
453 # Run
454 # #######################################
455 sc = acc.run()
456 sys.exit(0 if sc.isSuccess() else 1)
void print(char *figname, TCanvas *c1)
Definition PFCfg.py:1