ATLAS Offline Software
TileRawChannelTimeMonitorAlgorithm.py
Go to the documentation of this file.
1 #
2 # Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 #
4 
5 from TileConfiguration.TileConfigFlags import TileRunType
6 
7 '''
8 @file TileRawChannelTimeMonitorAlgorithm.py
9 @brief Python configuration of TileRawChannelTimeMonitorAlgorithm algorithm for the Run III
10 '''
12 
13  ''' Function to configure TileRawChannelTimeMonitorAlgorithm algorithm in the monitoring system.'''
14 
15  # Define one top-level monitoring algorithm. The new configuration
16  # framework uses a component accumulator.
17  from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
18  result = ComponentAccumulator()
19 
20  from TileRecUtils.TileDQstatusConfig import TileDQstatusAlgCfg
21  result.merge( TileDQstatusAlgCfg(flags) )
22 
23  from TileGeoModel.TileGMConfig import TileGMCfg
24  result.merge(TileGMCfg(flags))
25 
26  from TileConditions.TileCablingSvcConfig import TileCablingSvcCfg
27  result.merge( TileCablingSvcCfg(flags) )
28 
29  from TileConditions.TileBadChannelsConfig import TileBadChannelsCondAlgCfg
30  result.merge( TileBadChannelsCondAlgCfg(flags, **kwargs) )
31 
32  from TileConditions.TileEMScaleConfig import TileEMScaleCondAlgCfg
33  result.merge( TileEMScaleCondAlgCfg(flags) )
34 
35  kwargs.setdefault('CheckDCS', flags.Tile.useDCS)
36  if kwargs['CheckDCS']:
37  from TileConditions.TileDCSConfig import TileDCSCondAlgCfg
38  result.merge( TileDCSCondAlgCfg(flags) )
39 
40  kwargs.setdefault('TriggerChain', '')
41  kwargs.setdefault('TriggerTypes', [0x34]) # Laser event Trigger type - 0x34, CIS trigger type - 0x32
42 
43  # Partition pairs to monitor average time difference between partitions (ROS - 1)
44  partitionPairs = [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]
45  kwargs.setdefault('PartitionTimeDiffferncePairs', partitionPairs)
46 
47  runType = flags.Tile.RunType
48  partitionTimeCorrections = [0, 0, 0, 0]
49  if flags.Input.RunNumbers[0] > 400000: # Update partition time corrections for Run 3
50  if runType is TileRunType.GAPLAS:
51  partitionTimeCorrections = [-28.65, -45.2, 25.24, 24.94]
52  elif runType is TileRunType.GAPCIS:
53  partitionTimeCorrections = [0, 0, 0, 0]
54  else:
55  partitionTimeCorrections = [-15.18, -15.37, 47.65, 47.42]
56 
57  kwargs.setdefault('PartitionTimeCorrections', partitionTimeCorrections)
58 
59  # The following class will make a sequence, configure algorithms, and link
60  # them to GenericMonitoringTools
61  from AthenaMonitoring import AthMonitorCfgHelper
62  helper = AthMonitorCfgHelper(flags,'TileRawChannelTimeMonitoring')
63 
64  # Adding an TileCellMonitorAlgorithm algorithm to the helper
65  from AthenaConfiguration.ComponentFactory import CompFactory
66  TileRawChannelTimeMonitorAlgorithm = CompFactory.TileRawChannelTimeMonitorAlgorithm
67  tileRawChanTimeMonAlg = helper.addAlgorithm(TileRawChannelTimeMonitorAlgorithm, 'TileRawChanTimeMonAlg')
68 
69  for k, v in kwargs.items():
70  setattr(tileRawChanTimeMonAlg, k, v)
71 
72  run = str(flags.Input.RunNumbers[0])
73  eventsType = 'CIS' if runType.getCommonType() is TileRunType.CIS else 'Laser'
74 
75  # 1) Configure histogram with TileRawChannelTimeMonAlg algorithm execution time
76  executeTimeGroup = helper.addGroup(tileRawChanTimeMonAlg, 'TileRawChanTimeMonExecuteTime', 'Tile/')
77  executeTimeGroup.defineHistogram('TIME_execute', path = 'RawChannelTime', type='TH1F',
78  title = 'Time for execute TileRawChanTimeMonAlg algorithm;time [#mus]',
79  xbins = 100, xmin = 0, xmax = 100000)
80 
81 
82  from TileMonitoring.TileMonitoringCfgHelper import addTileModuleChannelMapsArray, getPartitionName
83 
84  # 2) Configure histograms with status of Tile channel time per partition
85  addTileModuleChannelMapsArray(helper, tileRawChanTimeMonAlg, name = 'TileAverageTime',
86  title = f'Tile average time with {eventsType} (partition average time is subracted)',
87  path = 'Tile/RawChannelTime/Summary',
88  type = 'TProfile2D', value = 'time', run = run)
89 
90  # 2.b) Configure histograms with average of Tile channel uncorrected time per partition
91  addTileModuleChannelMapsArray(helper, tileRawChanTimeMonAlg, name = 'TileAverageUncorrectedTime',
92  title = f'Tile average uncorrected time with {eventsType}',
93  path = 'Tile/RawChannelTime/Summary',
94  type = 'TProfile2D', value = 'time', run = run)
95 
96  # 2.c) Configure histograms with average of Tile channel amplitude per partition
97  addTileModuleChannelMapsArray(helper, tileRawChanTimeMonAlg, name = 'TileAverageAmplitude',
98  title = f'Tile average amplitude [pC] with {eventsType}',
99  path = 'Tile/RawChannelTime/Summary',
100  type = 'TProfile2D', value = 'amplitude', run = run)
101 
102  from TileMonitoring.TileMonitoringCfgHelper import addTile2DHistogramsArray
103 
104  # 3) Configure histograms with Tile partition average time vs luminosity block per partition
105  partitionAverageTimeTitle = {}
106  partitionAverageTimeTitleTemplate = f'Tile average time with {eventsType} corrected by %+0.0f [ns] vs LumiBlock;LumiBlock;t [ns]'
107  for ros in range(1,5):
108  partitionAverageTimeTitle[getPartitionName(ros)] = partitionAverageTimeTitleTemplate % (-partitionTimeCorrections[ros - 1])
109  addTile2DHistogramsArray(helper, tileRawChanTimeMonAlg, name = 'TileAverageTimeLB',
110  xvalue = 'lumiBlock', yvalue = 'time', type='TH2D',
111  title = partitionAverageTimeTitle, opt = 'kAddBinsDynamically', merge = 'merge',
112  path = 'Tile/RawChannelTime/Summary', run = run, perPartition = True,
113  xbins = 3000, xmin = -0.5, xmax = 2999.5, ybins = 149, ymin = -74.5, ymax = 74.5)
114 
115 
116  # 4) Configure histograms with Tile partition average time difference vs luminosity block
117  partitionPairs = kwargs['PartitionTimeDiffferncePairs']
118  partTimeDiffVsLBArray = helper.addArray([len(partitionPairs)], tileRawChanTimeMonAlg,
119  'TileAverageTimeDifferenceLB', topPath = 'Tile/RawChannelTime')
120  for postfix, tool in partTimeDiffVsLBArray.Tools.items():
121  pairIdx = int(postfix.split('_').pop())
122  partitionName1, partitionName2 = [getPartitionName(ros + 1) for ros in partitionPairs[pairIdx]]
123  ros1, ros2 = partitionPairs[pairIdx]
124  partitionTimeCorrection1 = partitionTimeCorrections[ros1]
125  partitionTimeCorrection2 = partitionTimeCorrections[ros2]
126 
127  title = f'Run {run}: Average time with {eventsType} between {partitionName1} and {partitionName2}'
128  title += ' corrected by %+0.0f [ns]' % (partitionTimeCorrection1 - partitionTimeCorrection2)
129  title += ' vs luminosity block;LumiBlock;t [ns]'
130  name = 'lumiBlock,time;TileAverageTimeDifferenceLB_%s-%s' % (partitionName1, partitionName2)
131 
132  tool.defineHistogram(name, title = title, path = 'Summary', type = 'TProfile',
133  xbins = 1000, xmin = -0.5, xmax = 999.5, opt = 'kAddBinsDynamically', merge = 'merge')
134 
135 
136  from TileCalibBlobObjs.Classes import TileCalibUtils as Tile
137 
138  # 5) Configure histograms with Tile digitizer time vs luminosity block per digitizer
139  maxDigitizer = 8
140  digiTimeVsLBArray = helper.addArray([int(Tile.MAX_ROS - 1), int(Tile.MAX_DRAWER), maxDigitizer],
141  tileRawChanTimeMonAlg, 'TileDigitizerTimeLB', topPath = 'Tile/RawChannelTime')
142  for postfix, tool in digiTimeVsLBArray.Tools.items():
143  ros, module, digitizer = [int(x) for x in postfix.split('_')[1:]]
144  digitizer += 1
145 
146  moduleName = Tile.getDrawerString(ros + 1, module)
147  title = 'Run ' + run + ' ' + moduleName + ' Digitizer ' + str(digitizer)
148  title += ': Time vs luminosity block (partition average time is subracted);LumiBlock;t [ns]'
149  name = 'lumiBlock,time;TileDigitizerTimeLB_' + moduleName + '_DIGI_' + str(digitizer)
150  path = getPartitionName(ros + 1) + '/' + moduleName
151 
152  tool.defineHistogram(name, title = title, path = path, type = 'TProfile',
153  xbins = 1000, xmin = -0.5, xmax = 999.5, opt = 'kAddBinsDynamically', merge = 'merge')
154 
155  accumalator = helper.result()
156  result.merge(accumalator)
157  return result
158 
159 if __name__=='__main__':
160 
161  # Setup logs
162  from AthenaCommon.Logging import log
163  from AthenaCommon.Constants import INFO
164  log.setLevel(INFO)
165 
166  # Set the Athena configuration flags
167  from AthenaConfiguration.AllConfigFlags import initConfigFlags
168  from AthenaConfiguration.TestDefaults import defaultConditionsTags, defaultGeometryTags
169  flags = initConfigFlags()
170  inputDirectory = '/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TileByteStream/TileByteStream-02-00-00'
171  inputFile = 'data18_tilecomm.00363899.calibration_tile.daq.RAW._lb0000._TileREB-ROS._0005-200ev.data'
172  flags.Input.Files = [inputDirectory + '/' + inputFile]
173  flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN2
174  flags.IOVDb.GlobalTag = defaultConditionsTags.RUN2_DATA
175  flags.Output.HISTFileName = 'TileRawChannelTimeMonitorOutput.root'
176  flags.DQ.useTrigger = False
177  flags.DQ.enableLumiAccess = False
178 
179  flags.Tile.RunType = TileRunType.GAPLAS
180  flags.Tile.doFit = True
181  flags.Tile.correctTime = True
182  flags.Tile.doOverflowFit = False
183  flags.Tile.BestPhaseFromCOOL = True
184  flags.Tile.NoiseFilter = 1
185  flags.Exec.MaxEvents = 3
186  flags.fillFromArgs()
187 
188  flags.lock()
189 
190  # Initialize configuration object, add accumulator, merge, and run.
191  from AthenaConfiguration.MainServicesConfig import MainServicesCfg
192  cfg = MainServicesCfg(flags)
193 
194  from TileByteStream.TileByteStreamConfig import TileRawDataReadingCfg
195  cfg.merge( TileRawDataReadingCfg(flags, readMuRcv=False, readBeamElem=True) )
196 
197  from TileRecUtils.TileRawChannelMakerConfig import TileRawChannelMakerCfg
198  cfg.merge( TileRawChannelMakerCfg(flags) )
199 
200  cfg.merge( TileRawChannelTimeMonitoringConfig(flags) )
201 
202  cfg.printConfig(withDetails = True, summariseProps = True)
203  flags.dump()
204 
205  cfg.store( open('TileRawChannelTimeMonitorAlgorithm.pkl','wb') )
206 
207  sc = cfg.run()
208 
209  import sys
210  # Success should be 0
211  sys.exit(not sc.isSuccess())
TileMonitoringCfgHelper.addTileModuleChannelMapsArray
def addTileModuleChannelMapsArray(helper, algorithm, name, title, path, weight='', subDirectory=False, type='TH2D', value='', run='', triggers=[], perGain=False, separator='_')
Definition: TileMonitoringCfgHelper.py:370
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
TileMonitoringCfgHelper.addTile2DHistogramsArray
def addTile2DHistogramsArray(helper, algorithm, name='', xvalue='', yvalue='', value='', title='', path='', weight='', xbins=0, xmin=0., xmax=0., ybins=0, ymin=0., ymax=0., type='TH2D', run='', triggers=[], xlabels=(), ylabels=(), opt='', subDirectory=False, perPartition=False, perSample=False, perGain=False, allPartitions=False, separator='_', merge=None)
Definition: TileMonitoringCfgHelper.py:300
TileRawChannelTimeMonitorAlgorithm.TileRawChannelTimeMonitoringConfig
def TileRawChannelTimeMonitoringConfig(flags, **kwargs)
Definition: TileRawChannelTimeMonitorAlgorithm.py:11
TileDQstatusConfig.TileDQstatusAlgCfg
def TileDQstatusAlgCfg(flags, **kwargs)
Definition: TileDQstatusConfig.py:31
python.TileBadChannelsConfig.TileBadChannelsCondAlgCfg
def TileBadChannelsCondAlgCfg(flags, **kwargs)
Definition: TileBadChannelsConfig.py:10
python.MainServicesConfig.MainServicesCfg
def MainServicesCfg(flags, LoopMgr='AthenaEventLoopMgr')
Definition: MainServicesConfig.py:256
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
Constants
some useful constants -------------------------------------------------—
TileMonitoringCfgHelper.getPartitionName
def getPartitionName(ros)
Definition: TileMonitoringCfgHelper.py:40
python.TileEMScaleConfig.TileEMScaleCondAlgCfg
def TileEMScaleCondAlgCfg(flags, **kwargs)
Definition: TileEMScaleConfig.py:10
python.TileDCSConfig.TileDCSCondAlgCfg
def TileDCSCondAlgCfg(flags, **kwargs)
Definition: TileDCSConfig.py:8
Trk::open
@ open
Definition: BinningType.h:40
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19
TileByteStreamConfig.TileRawDataReadingCfg
def TileRawDataReadingCfg(flags, readDigits=True, readRawChannel=True, readMuRcv=None, readMuRcvDigits=False, readMuRcvRawCh=False, readBeamElem=None, readLaserObj=None, readDigitsFlx=False, readL2=False, stateless=False, **kwargs)
Definition: TileByteStreamConfig.py:87
TileRawChannelMakerConfig.TileRawChannelMakerCfg
def TileRawChannelMakerCfg(flags, **kwargs)
Definition: TileRawChannelMakerConfig.py:10
str
Definition: BTagTrackIpAccessor.cxx:11
python.TileCablingSvcConfig.TileCablingSvcCfg
def TileCablingSvcCfg(flags)
Definition: TileCablingSvcConfig.py:11
TileGMConfig.TileGMCfg
def TileGMCfg(flags)
Definition: TileGMConfig.py:7