6 @file TileDQFragMonitorAlgorithm.py 
    7 @brief Python configuration of TileDQFragMonitorAlgorithm algorithm for the Run III 
   12     ''' Function to configure TileDQFragMonitorAlgorithm algorithm in the monitoring system.''' 
   14     from AthenaConfiguration.ComponentAccumulator 
import ComponentAccumulator
 
   17     from DetDescrCnvSvc.DetDescrCnvSvcConfig 
import DetDescrCnvSvcCfg
 
   20     from TileConditions.TileCablingSvcConfig 
import TileCablingSvcCfg
 
   23     from TileRecUtils.TileDQstatusConfig 
import TileDQstatusAlgCfg
 
   26     from TileConditions.TileInfoLoaderConfig 
import TileInfoLoaderCfg
 
   29     from TileConditions.TileEMScaleConfig 
import TileEMScaleCondAlgCfg
 
   32     from TileConditions.TileBadChannelsConfig 
import TileBadChannelsCondAlgCfg
 
   35     kwargs.setdefault(
'CheckDCS', flags.Tile.useDCS)
 
   36     if kwargs[
'CheckDCS']:
 
   37         from TileConditions.TileDCSConfig 
import TileDCSCondAlgCfg
 
   40     rawChannelContainer = flags.Tile.RawChannelContainer
 
   42     from AthenaConfiguration.Enums 
import Format
 
   43     if flags.Input.Format 
is Format.POOL:
 
   44         kwargs.setdefault(
'TileDigitsContainer', 
'TileDigitsFlt')
 
   45         if rawChannelContainer 
not in flags.Input.Collections:
 
   46             rawChannelContainer = 
'' 
   48     kwargs.setdefault(
'TileRawChannelContainer', rawChannelContainer)
 
   51     kwargs.setdefault(
'MinEnergyChan', -5.0 * GeV)
 
   52     kwargs.setdefault(
'MinEnergyGap', -10.0 * GeV)
 
   53     kwargs.setdefault(
'fillDigiErrorsHistogramsPerLB', flags.Common.isOnline)
 
   54     fillDigiErrorsHistogramsPerLB = kwargs[
'fillDigiErrorsHistogramsPerLB']
 
   56     runNumber = flags.Input.RunNumbers[0]
 
   61     from AthenaMonitoring 
import AthMonitorCfgHelper
 
   62     helper = AthMonitorCfgHelper(flags, 
'TileDQFragMonAlgCfg')
 
   64     from AthenaConfiguration.ComponentFactory 
import CompFactory
 
   65     tileDQFragMonAlg = helper.addAlgorithm(CompFactory.TileDQFragMonitorAlgorithm, 
'TileDQFragMonAlg')
 
   67     for k, v 
in kwargs.items():
 
   68         setattr(tileDQFragMonAlg, k, v)
 
   71     executeTimeGroup = helper.addGroup(tileDQFragMonAlg, 
'TileDQFragMonExecuteTime', 
'Tile/')
 
   72     executeTimeGroup.defineHistogram(
'TIME_execute', path = 
'DMUErrors', type=
'TH1F',
 
   73                                      title = 
'Time for execute TileDQFragMonAlg algorithm;time [#mus]',
 
   74                                      xbins = 300, xmin = 0, xmax = 300000)
 
   77     errorStateGroup = helper.addGroup(tileDQFragMonAlg, 
'TileEventsWithErrEventInfoLB', 
'Tile/DMUErrors')
 
   78     errorStateGroup.defineHistogram(
'lumiBlock;TileEventsWithErrEventInfo', path = 
'BadDrawers', type=
'TH1F',
 
   79                                     title = 
'Run ' + run + 
': # events with Tile error state in EventInfo;LumiBlock;# events with error',
 
   80                                     xbins = 1000, xmin = -0.5, xmax = 999.5, opt = 
'kAddBinsDynamically', merge = 
'merge')
 
   83     consecutiveBadGroup = helper.addGroup(tileDQFragMonAlg, 
'TileConsecutiveBadModules', 
'Tile/DMUErrors')
 
   84     consecutiveBadGroup.defineHistogram(
'TileConsecutiveBad', path = 
'BadDrawers', type=
'TH1F',
 
   85                                         title = 
'Run ' + run + 
': Max # Tile consecutive bad modules;# consecutive bad modules;N',
 
   86                                         xbins = 17, xmin = -0.5, xmax = 16.5)
 
   89     consecutiveBadLBGroup = helper.addGroup(tileDQFragMonAlg, 
'TileConsecutiveBadModulesLB', 
'Tile/DMUErrors')
 
   90     consecutiveBadLBGroup.defineHistogram(
'lumiBlock,TileConsecutiveBad;TileConsecutiveBadLB', path = 
'BadDrawers', type=
'TH2F',
 
   91                                           title = 
'Run ' + run + 
': Max # Tile consecutive bad modules;LumiBlock;# consecutive bad modules',
 
   92                                           xbins = 1000, xmin = -0.5, xmax = 999.5, ybins = 17, ymin = -0.5, ymax = 16.5,
 
   93                                           opt = 
'kAddBinsDynamically', merge = 
'merge')
 
   96     from TileMonitoring.TileMonitoringCfgHelper 
import getPartitionName
 
   97     from TileCalibBlobObjs.Classes 
import TileCalibUtils 
as Tile
 
  100     moduleLabels = [
str(module) 
for module 
in range(1, Tile.MAX_DRAWER + 1)]
 
  103     mismatchedLVL1Group = helper.addGroup(tileDQFragMonAlg, 
'TileMismatchedL1TriggerType', 
'Tile/')
 
  104     mismatchedLVL1Group.defineHistogram(
'module,ROS;TileMismatchedL1TriggerType', path = 
'DMUErrors',
 
  105                                         title = 
'Run ' + run + 
': Tile mismatched L1 Trigger Type;Module;Partition',
 
  106                                         type = 
'TH2F', xlabels = moduleLabels, ylabels = partitionLabels,
 
  107                                         xbins = Tile.MAX_DRAWER, xmin = -0.5, xmax = Tile.MAX_DRAWER - 0.5,
 
  108                                         ybins = Tile.MAX_ROS - 1, ymin = 1.0, ymax = Tile.MAX_ROS)
 
  111     noAllDigitsGroup = helper.addGroup(tileDQFragMonAlg, 
'TileNoAllDigits', 
'Tile/')
 
  112     noAllDigitsGroup.defineHistogram(
'module,ROS;TileNoalldigits', path = 
'DMUErrors', type = 
'TH2F',
 
  113                                      title = 
'Run ' + run + 
': No All Tile digits in event with Trigger Type = 0x82;Module;Partition',
 
  114                                      xlabels = moduleLabels, ylabels = partitionLabels,
 
  115                                      xbins = Tile.MAX_DRAWER, xmin = -0.5, xmax = Tile.MAX_DRAWER - 0.5,
 
  116                                      ybins = Tile.MAX_ROS - 1, ymin = 1.0, ymax = Tile.MAX_ROS)
 
  119     globalCRCGroup = helper.addGroup(tileDQFragMonAlg, 
'TileBadGlobalCRC', 
'Tile/')
 
  120     globalCRCGroup.defineHistogram(
'module,ROS;TileBadGlobalCRC', path = 
'DMUErrors', type = 
'TH2F',
 
  121                                    title = 
'Run ' + run + 
': Global CRC errors;Module;Partition',
 
  122                                    xlabels = moduleLabels, ylabels = partitionLabels,
 
  123                                    xbins = Tile.MAX_DRAWER, xmin = -0.5, xmax = Tile.MAX_DRAWER - 0.5,
 
  124                                    ybins = Tile.MAX_ROS - 1, ymin = 1.0, ymax = Tile.MAX_ROS)
 
  128     dmuLabels = [
str(dmu) 
for dmu 
in range(0, maxDMUs)]
 
  130     dmuErrorLabels = [
'OK', 
'HEADER_FORM', 
'HEADER_PAR', 
'MEMO_PAR', 
'FE_CRC', 
'ROD_CRC', 
'BCID']
 
  131     dmuErrorLabels += [
'SAMPLE_FORM', 
'SAMPLE_PAR', 
'DOUBLE_STB', 
'SINGLE_STB', 
'GLOBAL_CRC']
 
  132     dmuErrorLabels += [
'DUMMY_FRAG', 
'NO_RECO_FRAG', 
'MASKED', 
'ALL_M_BAD_DCS', 
'ANY_CH_BAD_HV']
 
  134     dmuErrorLabels += [
'0 -> 1023', 
'Zeros', 
'Two 1023 + ped', 
'Jump 2 levels', 
'Single Up + ped']
 
  135     dmuErrorLabels += [
'Single Dn + ped', 
'Single Up + sig', 
'Single Dn + sig', 
'Ped > 200 LG']
 
  136     dmuErrorLabels += [
'Single Dn LG_s0', 
'Single Dn LG_s6', 
'Up LG_s0_s6 or Gap', 
'Dn LG_s0_s6 or Gap']
 
  137     dmuErrorLabels += [
'Bad quality', 
'Big negative ene']
 
  139     maxErrors = len(dmuErrorLabels)
 
  141     errorsArray = helper.addArray([
int(Tile.MAX_ROS - 1), 
int(Tile.MAX_DRAWER)],
 
  142                                   tileDQFragMonAlg, 
'TileDigiErrors', topPath = 
'Tile/')
 
  143     for postfix, tool 
in errorsArray.Tools.items():
 
  144         ros, module = [
int(x) 
for x 
in postfix.split(
'_')[1:]]
 
  146         moduleName = Tile.getDrawerString(ros + 1, module)
 
  147         title = 
'Run ' + run + 
': ' + moduleName + 
' Channel and DMU Header Errors;DMU' 
  148         name = 
'DMU,Error;TileDigiErrors' + moduleName
 
  150         tool.defineHistogram(name, title = title, type = 
'TH2F', path = 
'DMUErrors',
 
  151                              xlabels = dmuLabels, ylabels = dmuErrorLabels,
 
  152                              xbins = maxDMUs, xmin = 0.0, xmax = maxDMUs,
 
  153                              ybins = maxErrors, ymin = 0.0, ymax = maxErrors)
 
  156     if fillDigiErrorsHistogramsPerLB:
 
  158         errorsInLBArray = helper.addArray([
int(Tile.MAX_ROS - 1), 
int(Tile.MAX_DRAWER)],
 
  159                                           tileDQFragMonAlg, 
'TileDigiErrorsInLB', topPath = 
'Tile/')
 
  160         for postfix, tool 
in errorsInLBArray.Tools.items():
 
  161             ros, module = [
int(x) 
for x 
in postfix.split(
'_')[1:]]
 
  163             moduleName = Tile.getDrawerString(ros + 1, module)
 
  164             title = 
'Run ' + run + 
': ' + moduleName + f
' Channel and DMU Header Errors (reset every {kLBNHistoryDepth} LBs);DMU' 
  165             name = 
'DMU,Error;TileDigiErrors' + moduleName
 
  167             tool.defineHistogram(name, title = title, type = 
'TH2F', path = 
'DMUErrors/LB',
 
  168                                  opt = f
'kLBNHistoryDepth={kLBNHistoryDepth}', xlabels = dmuLabels, ylabels = dmuErrorLabels,
 
  169                                  xbins = maxDMUs, xmin = 0.0, xmax = maxDMUs,
 
  170                                  ybins = maxErrors, ymin = 0.0, ymax = maxErrors)
 
  174     errorsVsLBArray = helper.addArray([
int(Tile.MAX_ROS - 1), 
int(Tile.MAX_DRAWER)],
 
  175                                       tileDQFragMonAlg, 
'FracTileDigiErrors', topPath = 
'Tile/')
 
  176     for postfix, tool 
in errorsVsLBArray.Tools.items():
 
  177         ros, module = [
int(x) 
for x 
in postfix.split(
'_')[1:]]
 
  179         moduleName = Tile.getDrawerString(ros + 1, module)
 
  180         title = 
'Run ' + run + 
': ' + moduleName + 
' (#total_events - #ok_events)/(#total_events)' 
  181         title += 
';LumiBlock;Fraction of Digital errors' 
  182         name = 
'lumiBlock,fractionOfBadDMUs;FracTileDigiErrors' + moduleName
 
  184         tool.defineHistogram(name, title = title, path = 
'DMUErrors', type = 
'TProfile',
 
  185                              xbins = 1000, xmin = -0.5, xmax = 999.5, opt = 
'kAddBinsDynamically', merge = 
'merge')
 
  189     from TileMonitoring.TileMonitoringCfgHelper 
import addTileModuleChannelMapsArray
 
  193                                   name = 
'TileBadChannelsJumpMap', title = 
'# Jump errors',
 
  198                                   name = 
'TileBadChannelsJumpNotMaskMap', title = 
'# Not masked Jump errors',
 
  204                                   name = 
'TileBadPulseQualityMap', run = run,
 
  205                                   title = 
'Bad pulse shape or #chi^{2} from Optimal Filtering algirithm')
 
  209                                   name = 
'TileBadChannelsNegMap', title = 
'# Negative amplitude',
 
  214                                   name = 
'TileBadChannelsNegNotMaskMap', run = run,
 
  215                                   title = 
'# Not masked negative amplitude')
 
  219     negEneMapTitle = f
"# Negative energy below {kwargs['MinEnergyChan']/GeV} ({kwargs['MinEnergyGap']/GeV} for E cels) GeV" 
  221                                   name = 
'TileNegativeEnergyMap', run = run, title = negEneMapTitle)
 
  223     accumalator = helper.result()
 
  224     result.merge(accumalator)
 
  228 if __name__==
'__main__':
 
  231     from AthenaCommon.Logging 
import log
 
  236     from AthenaConfiguration.AllConfigFlags 
import initConfigFlags
 
  237     from AthenaConfiguration.TestDefaults 
import defaultConditionsTags, defaultGeometryTags, defaultTestFiles
 
  239     flags.Input.Files = defaultTestFiles.RAW_RUN2
 
  240     flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN2
 
  241     flags.IOVDb.GlobalTag = defaultConditionsTags.RUN2_DATA
 
  242     flags.Output.HISTFileName = 
'TileDQFragMonitorOutput.root' 
  243     flags.DQ.useTrigger = 
False 
  244     flags.DQ.enableLumiAccess = 
False 
  245     flags.Tile.doOptATLAS = 
True 
  246     flags.Exec.MaxEvents = 3
 
  251     from AthenaConfiguration.MainServicesConfig 
import MainServicesCfg
 
  254     from TileByteStream.TileByteStreamConfig 
import TileRawDataReadingCfg
 
  257     from TileRecUtils.TileRawChannelMakerConfig 
import TileRawChannelMakerCfg
 
  262     cfg.printConfig(withDetails = 
True, summariseProps = 
True)
 
  264     cfg.store( 
open(
'TileDQFragMonitorAlgorithm.pkl',
'wb') )
 
  270     sys.exit(
not sc.isSuccess())