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-2025 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
8 new-style configuration.
9-- Offline on lxplus for ART test :
10 --- python GlobalMonitoring.py IOVDb.GlobalTag="conditions_Tag" --offline
11 --filesInput [path_to_RAW_data_file] --evtMax [Max_number_events]
12 --- note: if the filesInput is not provided a defaultTestFile will be used.
13 --- note: if the evtMax is not provided, the default is 100.
14-- Online is the default: python GlobalMonitoring.py"
15"""
16
17if __name__ == '__main__':
18 import sys
19 import os
20 from AthenaConfiguration.Enums import BeamType
21 from AthenaConfiguration.AllConfigFlags import initConfigFlags
22 from AthenaConfiguration.ComponentFactory import CompFactory
23 from AthenaConfiguration.Enums import Format
24 flags = initConfigFlags()
25 parser = flags.getArgumentParser()
26 parser.add_argument('--offline', action='store_true',
27 help="Run in offline mode (default is online)")
28 # change default
29 parser.set_defaults(threads=1)
30 args, _ = parser.parse_known_args()
31 is_online = not args.offline
32 flags.fillFromArgs(parser=parser)
33
34 # Setup logs
35 from AthenaCommon.Logging import log
36 from AthenaCommon import Constants
37 if args.loglevel:
38 log.setLevel(getattr(Constants, args.loglevel))
39 if is_online:
40 print("Running in online mode")
41 partitionName = os.environ.get("TDAQ_PARTITION", "ATLAS")
42 from AthenaConfiguration.AutoConfigOnlineRecoFlags import (
43 autoConfigOnlineRecoFlags)
44 autoConfigOnlineRecoFlags(flags, partitionName)
45
46 flags.Concurrency.NumThreads = 1
47 flags.Exec.MaxEvents = -1
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 if partitionName == "ATLAS" or partitionName == 'ATLAS_MP1':
57 try:
58 y = ISObject(p, 'RunParams.RunParams', 'RunParams')
59 except Exception:
60 print("Could not find Run Parameters in IS - "
61 "Set default beam type to 'cosmics'")
62 beamType = BeamType.Cosmics
63 else:
64 y.checkout()
65 beamtype = y.beam_type
66 beamenergy = y.beam_energy
67 runnumber = y.run_number
68 project = y.T0_project_tag
69 print("RUN CONFIGURATION: beam type %i, beam energy %i, "
70 "run number %i, project tag %s" %
71 (beamtype, beamenergy, runnumber, project))
72 # Define beam type based on project tag name
73 if project[7:10] == "cos":
74 beamType = BeamType.Cosmics
75 else:
76 beamType = BeamType.Collisions
77 else:
78 beamType = BeamType.Collisions
79
80 # Online specific flags setup
81 flags.DQ.useTrigger = True
82 flags.DQ.triggerDataAvailable = True
83 flags.DQ.enableLumiAccess = False
84 print("Online mode setup complete.")
85 # Offline mode logic
86 else:
87 print("Running in offline mode")
88 partitionName = 'GMTestPartition'
89
90 # Offline specific settings
91 flags.DQ.useTrigger = False
92 flags.Reco.EnableTrigger = False
93 flags.DQ.triggerDataAvailable = False
94 flags.LAr.doHVCorr = False
95 flags.DQ.enableLumiAccess = True
96 isOnlineStateless = True
97 isOfflineTest = True
98 print("Offline mode setup complete.")
99
100 # flags.DQ.enableLumiAccess
101 # for ART Test on LXPLUS needs to be True, for online/test partition
102 # it need to be false with applying changes to CaloMonitoringConfig.py
103 # Jira "ATLASRECTS-8077"
104
105 # ############################################################
106 # COND tag and GEO are needed
107 # for running over a test partition online
108 # ############################################################
109 detDescrVersion = 'ATLAS-R3S-2021-03-02-00'
110 flags.IOVDb.DatabaseInstance = "CONDBR2"
111 flags.GeoModel.Layout = "atlas"
112 flags.GeoModel.AtlasVersion = detDescrVersion
113 # flags.IOVDb.GlobalTag="CONDBR2-HLTP-2024-02"
114 flags.Trigger.triggerConfig = 'DB'
115
116 if partitionName not in ['ATLAS', 'ATLAS_MP1']:
117 from AthenaConfiguration.TestDefaults import defaultTestFiles
118 # if --filesInput was specified as well (!) this will override
119 if not args.filesInput and args.offline:
120 flags.Input.Files = defaultTestFiles.RAW_RUN3_DATA24
121 # if --evtMax was specified as well this will override
122 if not args.evtMax:
123 flags.Exec.MaxEvents = 100
124
125 if flags.Input.Format is Format.BS:
126 if flags.DQ.Environment not in ('tier0', 'tier0Raw', 'online'):
127 log.warning('Reading RAW file, but DQ.Environment set to %s',
128 flags.DQ.Environment)
129 log.warning('Will proceed but best guess is this is an error')
130 log.info('Will schedule reconstruction, as best we know')
131 else:
132 if flags.DQ.Environment in ('tier0', 'tier0Raw', 'online'):
133 log.warning('Reading POOL file, but DQ.Environment set to %s',
134 flags.DQ.Environment)
135 log.warning('Will proceed but best guess is this is an error')
136
137 flags.Common.isOnline = True
138
139 print("=" * 50)
140 print("Configuration Info".center(50))
141 print("=" * 50)
142 print(f"{'Partition:':30} {partitionName}")
143 print(f"{'Max events:':30} {flags.Exec.MaxEvents}")
144 print(f"{'Run numbers:':30} {flags.Input.RunNumbers}")
145 print(f"{'Lumi block numbers:':30} {flags.Input.LumiBlockNumbers}")
146 print("=" * 50)
147 if not args.offline:
148 print("=" * 50)
149 print("Beam Info".center(50))
150 print(f"{'Beam Energy:':30} {flags.Beam.Energy}")
151 print(f"{'Beam Type:':30} {flags.Beam.Type}")
152 print(f"{'Beam Number Of Collisions:':30} "
153 f"{flags.Beam.NumberOfCollisions}")
154 print(f"{'Beam Estimated Luminosity:':30} "
155 f"{flags.Beam.estimatedLuminosity}")
156 print(f"{'Beam Bunch Spacing:':30} {flags.Beam.BunchSpacing}")
157 print("=" * 50)
158
159 flags.Input.isMC = False
160
161 flags.InDet.useSctDCS = False
162 flags.InDet.useDCS = False
163
164 flags.DQ.doMonitoring = True
165 flags.DQ.doPostProcessing = True
166 flags.DQ.FileKey = ''
167 flags.DQ.Environment = 'online'
168 flags.Output.HISTFileName = 'monitoring.root'
169 flags.LAr.doHVCorr = False
170 flags.Detector.EnableCalo = True
171 # ############################################################
172 # Set monitoring flags
173 # ############################################################
174 flags.DQ.Steering.doGlobalMon = False
175 # JetInputsMon
176 flags.DQ.Steering.doHLTMon = False
177 # doZDCmon
178 if '_hi' in flags.Input.ProjectName:
179 flags.DQ.Steering.doZDCMon = True
180 flags.Reco.EnableZDC = True
181 # LVL1Calo
182 flags.DQ.Steering.doLVL1CaloMon = False
183 flags.DQ.Steering.doLVL1InterfacesMon = False
184 # DataFlowMon - Do we want this? If so, set False
185 flags.DQ.Steering.doDataFlowMon = False
186 # CTPMon - If we want this in ATLAS partition, set to True
187 # under the if statement below
188 flags.DQ.Steering.doCTPMon = False
189 if partitionName not in ['ATLAS', 'ATLAS_MP1']:
190 flags.DQ.useTrigger = False
191 flags.DQ.triggerDataAvailable = False
192 flags.Reco.EnableTrigger = False
193
194 log.info('FINAL CONFIG FLAGS SETTINGS FOLLOW')
195 if (args.loglevel is None or
196 getattr(Constants, args.loglevel) <= Constants.INFO):
197 flags.dump()
198 flags.lock()
199
200 # Initialize configuration object, add accumulator, merge, and run.
201 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
202 acc = MainServicesCfg(flags)
203 acc.addService(CompFactory.ByteStreamCnvSvc(), primary=True)
204 # if args.offline:
205 from ByteStreamCnvSvc.ByteStreamConfig import ByteStreamReadCfg
206 acc.merge(ByteStreamReadCfg(flags))
207 if not args.offline and not args.filesInput:
208 from ByteStreamEmonSvc.EmonByteStreamConfig import EmonByteStreamCfg
209 acc.merge(EmonByteStreamCfg(flags,
210 type_names=['CTP_RDO/CTP_RDO']))
211 bytestreamInput = acc.getService("ByteStreamInputSvc")
212
213 # ############################################################
214 # The name of the partition you want to connect
215 # ############################################################
216 bytestreamInput.Partition = partitionName
217
218 bytestreamInput.Key = "dcm"
219 bytestreamInput.KeyCount = 40
220 bytestreamInput.BufferSize = 120 # event buffersize
221
222 # #######################################################
223 # TimeOut (in milliseconds) - Prevent job with low rates
224 # to reconnect too often to SFIs
225 # ######################################################
226 bytestreamInput.Timeout = 600000
227
228 bytestreamInput.UpdatePeriod = 200
229
230 bytestreamInput.StreamNames = ['express']
231 bytestreamInput.StreamType = "physics"
232 bytestreamInput.StreamLogic = "Or"
233
234 bytestreamInput.PublishName = os.environ.get(
235 "TDAQ_APPLICATION_NAME", "GlobalMonitoring")
236 # Ak: 26-05-2014 - needed to write out the gathered histograms
237 # to the correct server
238 bytestreamInput.ISServer = 'Histogramming-Global-iss'
239 if partitionName != 'ATLAS' and partitionName != 'ATLAS_MP1':
240 bytestreamInput.ISServer = 'Histogramming'
241
242 if partitionName == 'ATLAS' or partitionName == 'ATLAS_MP1':
243 from PyUtils.OnlineISConfig import GetAtlasReady
244 if beamType == BeamType.Cosmics:
245 bytestreamInput.StreamNames = ['express', 'IDCosmic',
246 'HLT_IDCosmic', 'CosmicMuons',
247 'CosmicCalo']
248 else:
249 if GetAtlasReady():
250 # printfunc ("ATLAS READY, reading express stream")
251 bytestreamInput.StreamNames = ['express']
252 bytestreamInput.StreamType = "express"
253 else:
254 # printfunc ("ATLAS NOT READY, reading standby stream")
255 bytestreamInput.StreamNames = ['express', 'IDCosmic',
256 'HLT_IDCosmic',
257 'CosmicMuons', 'MinBias',
258 'Standby', 'Main',
259 'CosmicCalo']
260 # bytestreamInput.StreamNames = ['MinBias']
261 else:
262 bytestreamInput.StreamLogic = 'Ignore'
263 bytestreamInput.PublishName = 'GMT9_sdahbi_R55'
264
265 from xAODEventInfoCnv.xAODEventInfoCnvConfig import (
266 EventInfoBeamSpotDecoratorAlgCfg)
267 acc.merge(EventInfoBeamSpotDecoratorAlgCfg(flags))
268
269 # Calo
270 acc.flagPerfmonDomain('Calo')
271 if flags.Detector.EnableCalo:
272 from CaloRec.CaloRecoConfig import CaloRecoCfg
273 acc.merge(CaloRecoCfg(flags))
274
275 # ZDC monitoring
276 acc.flagPerfmonDomain('ZDC')
277 if flags.Reco.EnableZDC:
278 from ZdcRec.ZdcRecConfig import ZdcRecCfg
279 acc.merge(ZdcRecCfg(flags))
280
281 # CaloExtension
282 acc.flagPerfmonDomain('CaloExtension')
283 if flags.Reco.EnableCaloExtension:
284 from TrackToCalo.CaloExtensionBuilderAlgCfg import (
285 CaloExtensionBuilderCfg)
286 acc.merge(CaloExtensionBuilderCfg(flags))
287 acc.flagPerfmonDomain('CaloRings')
288 if flags.Reco.EnableCaloRinger:
289 from CaloRingerAlgs.CaloRingerAlgsConfig import CaloRingerSteeringCfg
290 acc.merge(CaloRingerSteeringCfg(flags))
291
292 acc.flagPerfmonDomain('ID')
293 if flags.Reco.EnableTracking:
294 from InDetConfig.TrackRecoConfig import InDetTrackRecoCfg
295 acc.merge(InDetTrackRecoCfg(flags))
296 # Muon
297 acc.flagPerfmonDomain('Muon')
298 if flags.Detector.EnableMuon:
299 from MuonConfig.MuonReconstructionConfig import MuonReconstructionCfg
300 acc.merge(MuonReconstructionCfg(flags))
301 # Muon Combined
302 acc.flagPerfmonDomain('CombinedMuon')
303 if flags.Reco.EnableCombinedMuon:
304 from MuonCombinedConfig.MuonCombinedReconstructionConfig import (
305 MuonCombinedReconstructionCfg)
306 acc.merge(MuonCombinedReconstructionCfg(flags))
307
308 # Jet
309 acc.flagPerfmonDomain('Jets')
310 if flags.Reco.EnableJet:
311 from JetRecConfig.JetRecoSteering import JetRecoSteeringCfg
312 acc.merge(JetRecoSteeringCfg(flags))
313
314 # TrackParticleCellAssociation
315 # add cells crossed by high pt ID tracks
316 acc.flagPerfmonDomain('TrackCellAssociation')
317 if flags.Reco.EnableTrackCellAssociation:
318 from TrackParticleAssociationAlgs.TrackParticleAssociationAlgsConfig import ( # noqa: E501
319 TrackParticleCellAssociationCfg)
320 acc.merge(TrackParticleCellAssociationCfg(flags))
321 acc.flagPerfmonDomain('Jets')
322 if flags.Reco.EnableGlobalFELinking:
323 # We also need to build links between the newly
324 # created jet constituents (GlobalFE)
325 # and electrons,photons,muons and taus
326 from eflowRec.PFCfg import PFGlobalFlowElementLinkingCfg
327 acc.merge(PFGlobalFlowElementLinkingCfg(flags))
328
329 acc.flagPerfmonDomain('PFlow')
330 if flags.Reco.EnablePFlow:
331 from eflowRec.PFRun3Config import PFCfg
332 acc.merge(PFCfg(flags))
333 # EGamma
334 acc.flagPerfmonDomain('EGamma')
335 if flags.Reco.EnableEgamma:
336 from egammaConfig.egammaSteeringConfig import EGammaSteeringCfg
337 acc.merge(EGammaSteeringCfg(flags))
338 # Tau
339 acc.flagPerfmonDomain('Tau')
340 if flags.Reco.EnableTau:
341 from tauRec.TauConfig import TauReconstructionCfg
342 acc.merge(TauReconstructionCfg(flags))
343
344 # Trigger
345 acc.flagPerfmonDomain('Trigger')
346 if flags.Reco.EnableTrigger:
347 from TriggerJobOpts.TriggerRecoConfig import TriggerRecoCfg
348 acc.merge(TriggerRecoCfg(flags))
349
350 # MET
351 acc.flagPerfmonDomain('MET')
352 if flags.Reco.EnableMet:
353 from METReconstruction.METRecCfg import METCfg
354 acc.merge(METCfg(flags))
355
356 # Isolation
357 acc.flagPerfmonDomain('Isolation')
358 if flags.Reco.EnableIsolation:
359 from IsolationAlgs.IsolationSteeringConfig import IsolationSteeringCfg
360 acc.merge(IsolationSteeringCfg(flags))
361
362 # Lucid
363 acc.flagPerfmonDomain('Lucid')
364 if flags.Detector.EnableLucid:
365 from ForwardRec.LucidRecConfig import LucidRecCfg
366 acc.merge(LucidRecCfg(flags))
367
368 # Heavy Ion
369 acc.flagPerfmonDomain('HI')
370 if flags.Reco.EnableHI:
371 from HIRecConfig.HIRecConfig import HIRecCfg
372 acc.merge(HIRecCfg(flags))
373
374 # Btagging
375 acc.flagPerfmonDomain('FTag')
376 if flags.Reco.EnableBTagging:
377 from BTagging.BTagConfig import BTagRecoSplitCfg
378 acc.merge(BTagRecoSplitCfg(flags))
379 # #####################################################
380 # Load Monitoring
381 # #####################################################
382 # if flags.Reco.EnablePostProcessing:
383 # acc.merge(RecoPostProcessingCfg(flags))
384
385 if not args.offline:
386 # Monitoring
387 acc.flagPerfmonDomain('DQM')
388 if flags.DQ.doMonitoring:
389 from AthenaMonitoring.AthenaMonitoringCfg import (
390 AthenaMonitoringCfg, AthenaMonitoringPostprocessingCfg)
391 acc.merge(AthenaMonitoringCfg(flags))
392 if flags.DQ.doPostProcessing:
393 acc.merge(AthenaMonitoringPostprocessingCfg(flags))
394
395 if flags.DQ.Steering.doInDetMon:
396 if flags.DQ.Steering.InDet.doGlobalMon:
397 # info('Set up InDet Global monitoring')
398 from InDetGlobalMonitoringRun3Test.InDetGlobalMonitoringRun3TestConfig import ( # noqa: E501
399 InDetGlobalMonitoringRun3TestConfig)
401 if flags.DQ.Steering.InDet.doAlignMon:
402 # info('Set up Alignment monitoring')
403 from InDetAlignmentMonitoringRun3.InDetAlignmentMonitoringRun3Config import ( # noqa: E501
404 InDetAlignmentMonitoringRun3Config)
405 acc.merge(InDetAlignmentMonitoringRun3Config(flags))
406 if flags.DQ.Steering.doPixelMon:
407 from PixelMonitoring.PixelMonitoringConfig import (
408 PixelMonitoringConfig)
409 acc.merge(PixelMonitoringConfig(flags))
410
411 if flags.DQ.Steering.doSCTMon:
412 # info('Set up SCT monitoring')
413 from SCT_Monitoring.SCTMonitoringConfig import SCTMonitoringConfig
414 acc.merge(SCTMonitoringConfig(flags))
415
416 if flags.DQ.Steering.doTRTMon:
417 # info('Set up TRT monitoring')
418 from TRTMonitoringRun3.TRTMonitoringRun3Config import (
419 TRTMonitoringRun3Cfg)
420 acc.merge(TRTMonitoringRun3Cfg(flags))
421
422 if flags.DQ.Steering.doLArMon:
423 # info('Set up LAr monitoring')
424 from LArConfiguration.LArMonitoringConfig import (
425 LArMonitoringConfig)
426 acc.merge(LArMonitoringConfig(flags))
427
428 if flags.DQ.Steering.doTileMon:
429 # info('Set up Tile monitoring')
430 from TileMonitoring.TileMonitoringConfig import TileMonitoringCfg
431 acc.merge(TileMonitoringCfg(flags))
432
433 if flags.DQ.Steering.doCaloGlobalMon:
434 # info('Set up Calo monitoring')
435 from CaloMonitoring.CaloMonitoringConfig import CaloMonitoringCfg
436 acc.merge(CaloMonitoringCfg(flags))
437
438 if flags.DQ.Steering.doMuonMon:
439 # info('Set up Muon monitoring')
440 from MuonDQAMonitoring.MuonDQAMonitoringConfig import (
441 MuonDQAMonitoringConfig)
442 acc.merge(MuonDQAMonitoringConfig(flags))
443
444 if flags.DQ.Steering.doHLTMon:
445 # info('Set up HLT monitoring')
446 from TrigHLTMonitoring.TrigHLTMonitorAlgorithm import (
447 TrigHLTMonTopConfig)
448 acc.merge(TrigHLTMonTopConfig(flags))
449
450 if flags.DQ.Steering.doJetTagMon:
451 # info('Set up JetTagging monitoring')
452 from JetTagMonitoring.JetTagMonitorAlgorithm import (
453 JetTagMonitorConfig)
454 acc.merge(JetTagMonitorConfig(flags))
455
456 if flags.DQ.Steering.doEgammaMon:
457 # info('Set up Egamma monitoring')
458 from egammaPerformance.egammaMonitoringConfig import (
459 egammaMonitoringConfig)
460 acc.merge(egammaMonitoringConfig(flags))
461
462 if flags.DQ.Steering.doJetMon:
463 # info('Set up Jet monitoring')
464 from JetMonitoring.JetMonitoringStandard import (
465 standardJetMonitoring)
466 acc.merge(standardJetMonitoring(flags))
467 # Need to create links between global FE, created in jet finding,
468 # and other objects
469 # MET monitoring will need these in some workflows
470 # (but not in tier0ESD)
471 if flags.DQ.Environment != 'tier0ESD':
472 # Only run PFlow linking for ion runs in UPC mode
473 if (not flags.Reco.EnableHI or
474 (flags.Reco.EnableHI and flags.Tracking.doUPC)):
475 from eflowRec.PFCfg import PFGlobalFlowElementLinkingCfg
476 acc.merge(PFGlobalFlowElementLinkingCfg(flags))
477
478 # Set TRT expert flags
479 acc.getEventAlgo("AlgTRTMonitoringRun3RAW").doExpert = True
480
481 from IOVDbSvc.IOVDbSvcConfig import addOverride
482 acc.merge(addOverride(flags, "/TRT/Onl/Calib/PID_NN",
483 "TRTCalibPID_NN_v2", db=""))
484
485 # Need to add this line since it was needed as explained in the below link.
486 # Otherwise jobs crash
487 # https://gitlab.cern.ch/atlas/athena/-/blob/master/Reconstruction/
488 # RecExample/RecExOnline/share/RecExOnline_postconfig.py#L12
489 acc.getService("PoolSvc").ReadCatalog += [
490 "xmlcatalog_file:/det/dqm/GlobalMonitoring/"
491 "PoolFileCatalog_M7/PoolFileCatalog.xml"]
492
493 # Run
494 sc = acc.run()
495 sys.exit(0 if sc.isSuccess() else 1)
void print(char *figname, TCanvas *c1)
Definition PFCfg.py:1