diff --git a/TileCalorimeter/TileRecUtils/CMakeLists.txt b/TileCalorimeter/TileRecUtils/CMakeLists.txt index 6d193e46c8baba970f12120d76401c3a32cf4c27..66d0acb27e79ea84d55c4bdc1151b7fe6d8eb930 100644 --- a/TileCalorimeter/TileRecUtils/CMakeLists.txt +++ b/TileCalorimeter/TileRecUtils/CMakeLists.txt @@ -100,7 +100,22 @@ atlas_add_test( flake8 SCRIPT flake8 --select=ATL,F,E7,E9,W6 ${CMAKE_CURRENT_SOURCE_DIR}/python ${CMAKE_CURRENT_SOURCE_DIR}/test/*.py POST_EXEC_SCRIPT nopost.sh ) +atlas_add_test( TileRawChannelBuilderFitConfig_test + SCRIPT python -m TileRecUtils.TileRawChannelBuilderFitConfig + PROPERTIES TIMEOUT 300 + POST_EXEC_SCRIPT nopost.sh) + +atlas_add_test( TileRawChannelBuilderOptConfig_test + SCRIPT python -m TileRecUtils.TileRawChannelBuilderOptConfig + PROPERTIES TIMEOUT 300 + POST_EXEC_SCRIPT nopost.sh) + atlas_add_test( TileRawChannelCorrectionConfig_test SCRIPT python -m TileRecUtils.TileRawChannelCorrectionConfig PROPERTIES TIMEOUT 300 POST_EXEC_SCRIPT nopost.sh) + +atlas_add_test( TileRawChannelMakerConfig_test + SCRIPT python -m TileRecUtils.TileRawChannelMakerConfig + PROPERTIES TIMEOUT 300 + POST_EXEC_SCRIPT nopost.sh) diff --git a/TileCalorimeter/TileRecUtils/python/TileRawChannelBuilderFitConfig.py b/TileCalorimeter/TileRecUtils/python/TileRawChannelBuilderFitConfig.py new file mode 100644 index 0000000000000000000000000000000000000000..ad146a793b59f62d9d0b97041fa58647cd8275f0 --- /dev/null +++ b/TileCalorimeter/TileRecUtils/python/TileRawChannelBuilderFitConfig.py @@ -0,0 +1,91 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + +"""Define method to construct configured Tile Fit raw channel builder tool""" + +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator + +_runTypes = {'PHY' : 1, 'LAS' : 2, 'BILAS' : 2, 'PED' : 4, 'CIS' : 8, 'MONOCIS' : 8} + + +def TileRawChannelBuilderFitFilterCfg(flags, **kwargs): + """Return component accumulator with configured private Tile Fit raw channel builder tool + + Arguments: + flags -- Athena configuration flags (ConfigFlags) + """ + + acc = ComponentAccumulator() + + runType = flags.Tile.RunType + runType = runType.upper() + + if runType not in _runTypes.keys(): + raise(Exception("Invalid Tile run type: %s" % runType)) + + from TileRecUtils.TileDQstatusConfig import TileDQstatusAlgCfg + acc.merge( TileDQstatusAlgCfg(flags) ) + + from TileConditions.TileInfoLoaderConfig import TileInfoLoaderCfg + acc.merge( TileInfoLoaderCfg(flags) ) + + from TileRecUtils.TileRecUtilsConf import TileRawChannelBuilderFitFilter + tileRawChannelBuilderFit = TileRawChannelBuilderFitFilter() + + from TileConditions.TileSampleNoiseConfig import TileCondToolNoiseSampleCfg + sampleNoiseTool = acc.popToolsAndMerge( TileCondToolNoiseSampleCfg(flags) ) + tileRawChannelBuilderFit.TileCondToolNoiseSample = sampleNoiseTool + + tileRawChannelBuilderFit.RunType = _runTypes[runType] + tileRawChannelBuilderFit.calibrateEnergy = flags.Tile.calibrateEnergy + tileRawChannelBuilderFit.correctTime = flags.Tile.correctTime + tileRawChannelBuilderFit.FrameLength = 7 + tileRawChannelBuilderFit.TileRawChannelContainer = 'TileRawChannelFit' + + if flags.Tile.correctTime: + from TileConditions.TileTimingConfig import TileCondToolTimingCfg + timingTool = acc.popToolsAndMerge( TileCondToolTimingCfg(flags) ) + tileRawChannelBuilderFit.TileCondToolTiming = timingTool + + tileRawChannelContainerDSP = "" + if flags.Tile.NoiseFilter == 1: + from TileRecUtils.TileRawChannelCorrectionConfig import TileRawChannelCorrectionToolsCfg + correctionTools = acc.popToolsAndMerge( TileRawChannelCorrectionToolsCfg(flags) ) + tileRawChannelBuilderFit.NoiseFilterTools = correctionTools + + if not (flags.Input.isMC or flags.Overlay.DataOverlay): + tileRawChannelContainerDSP = 'TileRawChannelCntCorrected' + from TileRecUtils.TileRawChannelCorrectionConfig import TileRawChannelCorrectionAlgCfg + acc.merge( TileRawChannelCorrectionAlgCfg(flags) ) + + tileRawChannelBuilderFit.DSPContainer = tileRawChannelContainerDSP + + acc.setPrivateTools( tileRawChannelBuilderFit ) + + return acc + + +if __name__ == "__main__": + + from AthenaCommon.Configurable import Configurable + Configurable.configurableRun3Behavior = 1 + from AthenaConfiguration.AllConfigFlags import ConfigFlags + from AthenaConfiguration.TestDefaults import defaultTestFiles + from AthenaCommon.Logging import log + from AthenaCommon.Constants import DEBUG + + # Test setup + log.setLevel(DEBUG) + + ConfigFlags.Input.Files = defaultTestFiles.RAW + ConfigFlags.Tile.RunType = 'PHY' + ConfigFlags.Tile.NoiseFilter = 1 + ConfigFlags.lock() + + ConfigFlags.dump() + + acc = ComponentAccumulator() + + print( acc.popToolsAndMerge( TileRawChannelBuilderFitFilterCfg(ConfigFlags) ) ) + + acc.printConfig(withDetails = True, summariseProps = True) + acc.store( open('TileRawChannelBuilderFit.pkl','w') ) diff --git a/TileCalorimeter/TileRecUtils/python/TileRawChannelBuilderOptConfig.py b/TileCalorimeter/TileRecUtils/python/TileRawChannelBuilderOptConfig.py new file mode 100644 index 0000000000000000000000000000000000000000..eb6e62548ad61b6a14af9294a794414656d3cffe --- /dev/null +++ b/TileCalorimeter/TileRecUtils/python/TileRawChannelBuilderOptConfig.py @@ -0,0 +1,136 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + +"""Define methods to construct configured Tile raw channel builder tools using Optimal Filtering methods""" + +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator + +_runTypes = {'PHY' : 1, 'LAS' : 2, 'BILAS' : 2, 'PED' : 4, 'CIS' : 8, 'MONOCIS' : 8} + +def TileRawChannelBuilderOpt2FilterCfg(flags, **kwargs): + """Return component accumulator with configured private Tile raw channel builder tool (Opt2) + + Arguments: + flags -- Athena configuration flags (ConfigFlags) + Method -- flavour of Tile Optimal Filtering method. Defaults to Opt2. Possible values: Opt2, OptATLAS, OF1 + """ + + acc = ComponentAccumulator() + + method = kwargs.get('Method', 'Opt2') + if method not in ['Opt2', 'OptATLAS', 'OF1']: + raise(Exception("Invalid Tile Optimal Filtering method: %s" % method)) + + name = 'TileRawChannelBuilder' + method + + runType = flags.Tile.RunType + runType = runType.upper() + + if runType not in _runTypes.keys(): + raise(Exception("Invalid Tile run type: %s" % runType)) + + from TileRecUtils.TileDQstatusConfig import TileDQstatusAlgCfg + acc.merge( TileDQstatusAlgCfg(flags) ) + + from TileConditions.TileInfoLoaderConfig import TileInfoLoaderCfg + acc.merge( TileInfoLoaderCfg(flags) ) + + from TileRecUtils.TileRecUtilsConf import TileRawChannelBuilderOpt2Filter + tileRawChannelBuilderOpt = TileRawChannelBuilderOpt2Filter(name) + + if flags.Tile.OfcFromCOOL: + ofcType = 'OF2' if method != 'OF1' else 'OF1' + from TileConditions.TileOFCConfig import TileCondToolOfcCoolCfg + ofcTool = acc.popToolsAndMerge( TileCondToolOfcCoolCfg(flags, OfcType = ofcType) ) + else: + from TileConditions.TileOFCConfig import TileCondToolOfcCfg + ofcTool = acc.popToolsAndMerge( TileCondToolOfcCfg(flags) ) + + tileRawChannelBuilderOpt.TileCondToolOfc = ofcTool + + outputContainer = 'TileRawChannel' + {'OptATLAS':flags.Tile.RawChannelContainer}.get(method, method) + + tileRawChannelBuilderOpt.TileRawChannelContainer = outputContainer + tileRawChannelBuilderOpt.RunType = _runTypes[runType] + tileRawChannelBuilderOpt.calibrateEnergy = False + tileRawChannelBuilderOpt.BestPhase = False if method == 'Opt2' else flags.Tile.BestPhaseFromCOOL + tileRawChannelBuilderOpt.OF2 = True if method != 'OF1' else False + tileRawChannelBuilderOpt.MaxIterations = 5 if method == 'Opt2' else 1 + tileRawChannelBuilderOpt.Minus1Iteration = True if method == 'Opt2' else False + tileRawChannelBuilderOpt.AmplitudeCorrection = False if method == 'Opt2' else flags.Tile.correctAmplitude + tileRawChannelBuilderOpt.TimeCorrection = False if method != 'OptATLAS' else flags.Tile.correctTimeNI + tileRawChannelBuilderOpt.AmpMinForAmpCorrection = flags.Tile.AmpMinForAmpCorrection + tileRawChannelBuilderOpt.TimeMinForAmpCorrection = flags.Tile.TimeMinForAmpCorrection + tileRawChannelBuilderOpt.TimeMaxForAmpCorrection = flags.Tile.TimeMaxForAmpCorrection + + if (flags.Tile.BestPhaseFromCOOL and method != 'Opt2') or flags.Tile.correctTime: + from TileConditions.TileTimingConfig import TileCondToolTimingCfg + timingTool = acc.popToolsAndMerge( TileCondToolTimingCfg(flags) ) + tileRawChannelBuilderOpt.TileCondToolTiming = timingTool + + if flags.Tile.BestPhaseFromCOOL and method != 'Opt2': + # Can't correct time and use best phase at the same time without iteration + tileRawChannelBuilderOpt.correctTime = False + else: + tileRawChannelBuilderOpt.correctTime = flags.Tile.correctTime + + if method == 'OF1': + tileRawChannelBuilderOpt.PedestalMode = -1 + + tileRawChannelContainerDSP = "" + if flags.Tile.NoiseFilter == 1: + from TileRecUtils.TileRawChannelCorrectionConfig import TileRawChannelCorrectionToolsCfg + correctionTools = acc.popToolsAndMerge( TileRawChannelCorrectionToolsCfg(flags) ) + tileRawChannelBuilderOpt.NoiseFilterTools = correctionTools + + if not (flags.Input.isMC or flags.Overlay.DataOverlay): + tileRawChannelContainerDSP = 'TileRawChannelCntCorrected' + from TileRecUtils.TileRawChannelCorrectionConfig import TileRawChannelCorrectionAlgCfg + acc.merge( TileRawChannelCorrectionAlgCfg(flags) ) + + tileRawChannelBuilderOpt.DSPContainer = tileRawChannelContainerDSP + + acc.setPrivateTools( tileRawChannelBuilderOpt ) + + return acc + + + +def TileRawChannelBuilderOF1Cfg(flags): + return TileRawChannelBuilderOpt2FilterCfg(flags, Method = 'OF1') + +def TileRawChannelBuilderOpt2Cfg(flags): + return TileRawChannelBuilderOpt2FilterCfg(flags, Method = 'Opt2') + +def TileRawChannelBuilderOptATLASCfg(flags): + return TileRawChannelBuilderOpt2FilterCfg(flags, Method = 'OptATLAS') + + +if __name__ == "__main__": + + from AthenaCommon.Configurable import Configurable + Configurable.configurableRun3Behavior = 1 + from AthenaConfiguration.AllConfigFlags import ConfigFlags + from AthenaConfiguration.TestDefaults import defaultTestFiles + from AthenaCommon.Logging import log + from AthenaCommon.Constants import DEBUG + + # Test setup + log.setLevel(DEBUG) + + ConfigFlags.Input.Files = defaultTestFiles.RAW + ConfigFlags.Tile.RunType = 'PHY' + ConfigFlags.Tile.NoiseFilter = 1 + ConfigFlags.lock() + + ConfigFlags.dump() + + acc = ComponentAccumulator() + + print( acc.popToolsAndMerge( TileRawChannelBuilderOpt2Cfg(ConfigFlags) ) ) + print( acc.popToolsAndMerge( TileRawChannelBuilderOptATLASCfg(ConfigFlags) ) ) + print( acc.popToolsAndMerge( TileRawChannelBuilderOF1Cfg(ConfigFlags) ) ) + + acc.printConfig(withDetails = True, summariseProps = True) + acc.store( open('TileRawChannelBuilder.pkl','w') ) + + diff --git a/TileCalorimeter/TileRecUtils/python/TileRawChannelMakerConfig.py b/TileCalorimeter/TileRecUtils/python/TileRawChannelMakerConfig.py new file mode 100644 index 0000000000000000000000000000000000000000..9ffd6bd84a18a2d816b51fc0e3140d2959fb249b --- /dev/null +++ b/TileCalorimeter/TileRecUtils/python/TileRawChannelMakerConfig.py @@ -0,0 +1,104 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + +"""Define method to construct configured Tile raw channel maker algorithm""" + +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator + +def TileRawChannelMakerCfg(flags, **kwargs): + """Return component accumulator with configured Tile raw channel maker algorithm + + Arguments: + flags -- Athena configuration flags (ConfigFlags) + """ + + acc = ComponentAccumulator() + + from AthenaCommon.Logging import logging + mlog = logging.getLogger( 'TileRawChannelMakerCfg' ) + + from TileRecUtils.TileRecUtilsConf import TileRawChannelMaker + tileRawChannelMaker = TileRawChannelMaker("TileRChMaker") + + if flags.Tile.doOverflowFit or flags.Tile.doFit: + from TileRecUtils.TileRawChannelBuilderFitConfig import TileRawChannelBuilderFitFilterCfg + tileRawChannelBuilderFitFilter = acc.popToolsAndMerge( TileRawChannelBuilderFitFilterCfg(flags) ) + + if flags.Tile.doOverflowFit: + tileRawChannelMaker.FitOverflow = True + tileRawChannelMaker.TileRawChannelBuilderFitOverflow = tileRawChannelBuilderFitFilter + else: + tileRawChannelMaker.FitOverflow = False + + if flags.Tile.doFit: + tileRawChannelMaker.TileRawChannelBuilder += [tileRawChannelBuilderFitFilter] + mlog.info(" adding now TileRawChannelBuilderFitFilter with name %s to the algorithm: %s", + tileRawChannelBuilderFitFilter.name(), tileRawChannelMaker.name()) + + if flags.Tile.doOF1: + from TileRecUtils.TileRawChannelBuilderOptConfig import TileRawChannelBuilderOF1Cfg + tileRawChannelBuilderOF1 = acc.popToolsAndMerge( TileRawChannelBuilderOF1Cfg(flags) ) + tileRawChannelMaker.TileRawChannelBuilder += [tileRawChannelBuilderOF1] + mlog.info(" adding now TileRawChannelBuilderOpt2Filter with name %s to the algorithm: %s", + tileRawChannelBuilderOF1.name(), tileRawChannelMaker.name()) + + if flags.Tile.doOpt2: + from TileRecUtils.TileRawChannelBuilderOptConfig import TileRawChannelBuilderOpt2Cfg + tileRawChannelBuilderOpt2 = acc.popToolsAndMerge( TileRawChannelBuilderOpt2Cfg(flags) ) + tileRawChannelMaker.TileRawChannelBuilder += [tileRawChannelBuilderOpt2] + mlog.info(" adding now TileRawChannelBuilderOpt2Filter with name %s to the algorithm: %s", + tileRawChannelBuilderOpt2.name(), tileRawChannelMaker.name()) + + if flags.Tile.doOptATLAS: + from TileRecUtils.TileRawChannelBuilderOptConfig import TileRawChannelBuilderOptATLASCfg + tileRawChannelBuilderOptATLAS = acc.popToolsAndMerge( TileRawChannelBuilderOptATLASCfg(flags) ) + tileRawChannelMaker.TileRawChannelBuilder += [tileRawChannelBuilderOptATLAS] + mlog.info(" adding now TileRawChannelBuilderOpt2Filter with name %s to the algorithm: %s", + tileRawChannelBuilderOptATLAS.name(), tileRawChannelMaker.name()) + + + acc.addEventAlgo(tileRawChannelMaker, primary = True) + + return acc + + + +if __name__ == "__main__": + + from AthenaCommon.Configurable import Configurable + Configurable.configurableRun3Behavior = 1 + from AthenaConfiguration.AllConfigFlags import ConfigFlags + from AthenaConfiguration.TestDefaults import defaultTestFiles + from AthenaCommon.Logging import log + from AthenaCommon.Constants import DEBUG + + # Test setup + log.setLevel(DEBUG) + + ConfigFlags.Input.Files = defaultTestFiles.RAW + ConfigFlags.Tile.RunType = 'PHY' + ConfigFlags.Tile.doFit = True + ConfigFlags.Tile.doOF1 = True + ConfigFlags.Tile.doOpt2 = True + ConfigFlags.Tile.doOptATLAS = True + ConfigFlags.Tile.NoiseFilter = 1 + ConfigFlags.lock() + + from AthenaConfiguration.MainServicesConfig import MainServicesSerialCfg + acc = MainServicesSerialCfg() + + from ByteStreamCnvSvc.ByteStreamConfig import TrigBSReadCfg + acc.merge( TrigBSReadCfg(ConfigFlags) ) + acc.getService('ByteStreamAddressProviderSvc').TypeNames += ['TileDigitsContainer/TileDigitsCnt'] + + acc.merge( TileRawChannelMakerCfg(ConfigFlags) ) + + ConfigFlags.dump() + acc.printConfig(withDetails = True, summariseProps = True) + acc.store( open('TileRawChannelMaker.pkl','w') ) + + sc = acc.run(maxEvents = 3) + + import sys + # Success should be 0 + sys.exit(not sc.isSuccess()) +