diff --git a/Control/AthenaCommon/python/AthenaCommonFlags.py b/Control/AthenaCommon/python/AthenaCommonFlags.py index 8bdf9fc99842917b5bf08a87e53c5642be77f31f..321b3ef4b1708d2a3f3473dd90b16921e7e5ef74 100755 --- a/Control/AthenaCommon/python/AthenaCommonFlags.py +++ b/Control/AthenaCommon/python/AthenaCommonFlags.py @@ -348,6 +348,12 @@ class MCChannelNumber(JobProperty): allowedTypes=['int'] StoredValue = 0 +class MCCampaign(JobProperty): + """MC campaign""" + statusOn=True + allowedTypes=['str'] + StoredValue = '' + ##----------------------------------------------------------------------------- ## 2nd step ## Definition of the AthenaCommon flag container @@ -392,6 +398,7 @@ jobproperties.AthenaCommonFlags.add_JobProperty(isOnlineStateless) jobproperties.AthenaCommonFlags.add_JobProperty(RuntimeStrictness) jobproperties.AthenaCommonFlags.add_JobProperty(DoFullChain) jobproperties.AthenaCommonFlags.add_JobProperty(MCChannelNumber) +jobproperties.AthenaCommonFlags.add_JobProperty(MCCampaign) ##----------------------------------------------------------------------------- ## 5th step diff --git a/Control/AthenaConfiguration/python/AllConfigFlags.py b/Control/AthenaConfiguration/python/AllConfigFlags.py index 93373eac8e6bf47e7ed28917e14455785618e41b..3fb0d4c1740e9f8c6cb32739b11b7c291816bf0a 100644 --- a/Control/AthenaConfiguration/python/AllConfigFlags.py +++ b/Control/AthenaConfiguration/python/AllConfigFlags.py @@ -4,6 +4,7 @@ from AthenaCommon.SystemOfUnits import TeV from AthenaConfiguration.AthConfigFlags import AthConfigFlags, isGaudiEnv from AthenaConfiguration.AutoConfigFlags import GetFileMD, getInitialTimeStampsFromRunNumbers, getRunToTimestampDict, getSpecialConfigurationMetadata from AthenaConfiguration.Enums import BeamType, Format, ProductionStep, BunchStructureSource, Project +from Campaigns.Utils import Campaign from PyUtils.moduleExists import moduleExists @@ -46,6 +47,7 @@ def _createCfgFlags(): acf.addFlag('Input.FailOnUnknownCollections', False) acf.addFlag('Input.ProjectName', lambda prevFlags : GetFileMD(prevFlags.Input.Files).get("project_name", "data17_13TeV")) # former global.ProjectName + acf.addFlag('Input.MCCampaign', lambda prevFlags : Campaign(GetFileMD(prevFlags.Input.Files).get("mc_campaign", "")), enum=Campaign) acf.addFlag('Input.TriggerStream', lambda prevFlags : GetFileMD(prevFlags.Input.Files).get("stream", "") if prevFlags.Input.Format == Format.BS else GetFileMD(prevFlags.Input.Files).get("triggerStreamOfFile", "")) # former global.TriggerStream acf.addFlag('Input.Format', lambda prevFlags : Format.BS if GetFileMD(prevFlags.Input.Files).get("file_type", "BS") == "BS" else Format.POOL, enum=Format) # former global.InputFormat diff --git a/Event/EventInfoMgt/python/TagInfoMgrConfig.py b/Event/EventInfoMgt/python/TagInfoMgrConfig.py index c2ba4a315cc111a87b49c6cb314f8f6a9584ace7..a3e9badaf9e10eaef220bc7c3548b83dc498b624 100644 --- a/Event/EventInfoMgt/python/TagInfoMgrConfig.py +++ b/Event/EventInfoMgt/python/TagInfoMgrConfig.py @@ -1,24 +1,27 @@ # Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator, ConfigurationError from AthenaConfiguration.ComponentFactory import CompFactory -import os -def TagInfoMgrCfg(configFlags,tagValuePairs={}): - - #Sanity check: - if not isinstance(tagValuePairs,dict): +def TagInfoMgrCfg(flags, tagValuePairs={}): + # Sanity check: + if not isinstance(tagValuePairs, dict): raise ConfigurationError("Parameter extraTagValuePairs is supposed to be a dictionary") - #Build project-version string for the TagInfoMgr - project = os.getenv('AtlasProject',"Unknown") - version = os.getenv('AtlasVersion',"Unknown") + # Build project-version string for the TagInfoMgr + from os import getenv + project = getenv("AtlasProject", "Unknown") + version = getenv("AtlasVersion", "Unknown") atlasRelease=project+"-"+version tagValuePairs.update({"AtlasRelease" : atlasRelease}) - result=ComponentAccumulator() - result.addService(CompFactory.TagInfoMgr(ExtraTagValuePairs = tagValuePairs), primary=True) + from Campaigns.Utils import Campaign + if flags.Input.isMC and flags.Input.MCCampaign is not Campaign.Unknown: + tagValuePairs.update({"mc_campaign" : flags.Input.MCCampaign.value}) + + result = ComponentAccumulator() + result.addService(CompFactory.TagInfoMgr(ExtraTagValuePairs=tagValuePairs), primary=True) return result @@ -30,7 +33,7 @@ if __name__ == "__main__": ConfigFlags.lock() acc = TagInfoMgrCfg( ConfigFlags, {"SomeKey": "SomeValue"} ) - acc2 = TagInfoMgrCfg( ConfigFlags, {"OtherKey":"OtherValue", "SomeKey": "SomeValue"} ) + acc2 = TagInfoMgrCfg( ConfigFlags, {"OtherKey": "OtherValue", "SomeKey": "SomeValue"} ) acc.merge(acc2) assert "SomeKey" in acc.getService("TagInfoMgr").ExtraTagValuePairs diff --git a/Event/xAOD/xAODMetaData/Root/FileMetaDataAccessors_v1.cxx b/Event/xAOD/xAODMetaData/Root/FileMetaDataAccessors_v1.cxx index 0f3d9b573c4188e2986a4136e16b52b789c95fe0..8d24b96c5d13586fb61f29443d20f68ffc5a4c92 100644 --- a/Event/xAOD/xAODMetaData/Root/FileMetaDataAccessors_v1.cxx +++ b/Event/xAOD/xAODMetaData/Root/FileMetaDataAccessors_v1.cxx @@ -50,6 +50,7 @@ namespace xAOD { DECLARE_STRING_ACCESSOR( conditionsTag ); DECLARE_STRING_ACCESSOR( beamType ); DECLARE_STRING_ACCESSOR( simFlavour ); + DECLARE_STRING_ACCESSOR( mcCampaign ); default: std::cerr << "xAOD::FileMetaData_v1 ERROR No string accessor for " diff --git a/Event/xAOD/xAODMetaData/Root/FileMetaData_v1.cxx b/Event/xAOD/xAODMetaData/Root/FileMetaData_v1.cxx index e082fc11dcd3fbbdaaf2815064eed9a73535377a..171e7c7c8d5c5f83d95b0c31a8c9b426d6c5fc82 100644 --- a/Event/xAOD/xAODMetaData/Root/FileMetaData_v1.cxx +++ b/Event/xAOD/xAODMetaData/Root/FileMetaData_v1.cxx @@ -432,6 +432,7 @@ std::ostream& operator<< ( std::ostream& out, PRINT_TYPE( mcProcID ); PRINT_TYPE( simFlavour ); PRINT_TYPE( isDataOverlay ); + PRINT_TYPE( mcCampaign ); default: out << "UNKNOWN (" << static_cast< int >( type ) << ")"; diff --git a/Event/xAOD/xAODMetaData/xAODMetaData/versions/FileMetaData_v1.h b/Event/xAOD/xAODMetaData/xAODMetaData/versions/FileMetaData_v1.h index d54539dac8979a00b6ba33f2a6c527dfb78a76dc..22a3aa4a51f518657bfd98c6193b225dc2722320 100644 --- a/Event/xAOD/xAODMetaData/xAODMetaData/versions/FileMetaData_v1.h +++ b/Event/xAOD/xAODMetaData/xAODMetaData/versions/FileMetaData_v1.h @@ -75,8 +75,10 @@ namespace xAOD { simFlavour = 10, /// Used data overlay for backgrounds [bool] isDataOverlay = 11, + /// MC campaign [string] + mcCampaign = 12, /// End marker - END = 12 + END = 13 }; // enum MetaDataType /// Get a pre-defined string value out of the object diff --git a/Event/xAOD/xAODMetaDataCnv/src/FileMetaDataCreatorTool.cxx b/Event/xAOD/xAODMetaDataCnv/src/FileMetaDataCreatorTool.cxx index 6a6b9daca8ec7b10a6994f17820f7483d183d293..6092039167cd6d459b8c0ca37e069590a8adbfe7 100644 --- a/Event/xAOD/xAODMetaDataCnv/src/FileMetaDataCreatorTool.cxx +++ b/Event/xAOD/xAODMetaDataCnv/src/FileMetaDataCreatorTool.cxx @@ -223,6 +223,8 @@ StatusCode set(xAOD::FileMetaData::beamType, m_tagInfoMgr->findTag("beam_type")); + set(xAOD::FileMetaData::mcCampaign, m_tagInfoMgr->findTag("mc_campaign")); + std::string beamEnergy = m_tagInfoMgr->findTag("beam_energy"); try { set(xAOD::FileMetaData::beamEnergy, diff --git a/PhysicsAnalysis/Algorithms/AsgAnalysisAlgorithms/python/PileupAnalysisSequence.py b/PhysicsAnalysis/Algorithms/AsgAnalysisAlgorithms/python/PileupAnalysisSequence.py index 59d8cd9f965f5cde03d6e6673881cd0af4797c97..c646852cb82d0ef05a6abdefb57b5e7a03a990b9 100644 --- a/PhysicsAnalysis/Algorithms/AsgAnalysisAlgorithms/python/PileupAnalysisSequence.py +++ b/PhysicsAnalysis/Algorithms/AsgAnalysisAlgorithms/python/PileupAnalysisSequence.py @@ -3,6 +3,7 @@ # AnaAlgorithm import(s): from AnaAlgorithm.AnaAlgSequence import AnaAlgSequence from AnaAlgorithm.DualUseConfig import createAlgorithm, addPrivateTool +from Campaigns.Utils import Campaign try: from AthenaCommon.Logging import logging @@ -27,10 +28,10 @@ def makePileupAnalysisSequence( dataType, campaign=None, files=None, useDefaultC toolConfigFiles = [] toolLumicalcFiles = [] - if files is not None and (campaign is None or userPileupConfigs is None): - if campaign is None: + if files is not None and (campaign is None or campaign is Campaign.Unknown or userPileupConfigs is None): + if campaign is None or campaign is Campaign.Unknown: from Campaigns.Utils import getMCCampaign - campaign = getMCCampaign(files=files) + campaign = getMCCampaign(files) if campaign: log.info(f'Autoconfiguring PRW with campaign: {campaign}') else: diff --git a/PhysicsAnalysis/AnalysisCommon/PileupReweighting/python/AutoconfigurePRW.py b/PhysicsAnalysis/AnalysisCommon/PileupReweighting/python/AutoconfigurePRW.py index b4d7ad02292c7ab49f2636b5d3c43f50a6e42a1c..65c90ea4d9b7f1d5e19d13defc5d6813d61cfca1 100644 --- a/PhysicsAnalysis/AnalysisCommon/PileupReweighting/python/AutoconfigurePRW.py +++ b/PhysicsAnalysis/AnalysisCommon/PileupReweighting/python/AutoconfigurePRW.py @@ -1,11 +1,11 @@ # Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration -from Campaigns.Utils import getMCCampaign +from Campaigns.Utils import Campaign, getMCCampaign def getLumicalcFiles(campaign): list = [] - if campaign in ['mc16a', 'mc20a']: + if campaign in [Campaign.MC16a, Campaign.MC20a]: list.append( 'GoodRunsLists/data15_13TeV/20170619/PHYS_StandardGRL_All_Good_25ns_276262-284484_OflLumi-13TeV-008.root' ) @@ -13,17 +13,17 @@ def getLumicalcFiles(campaign): 'GoodRunsLists/data16_13TeV/20180129/PHYS_StandardGRL_All_Good_25ns_297730-311481_OflLumi-13TeV-009.root' ) - elif campaign in ['mc16d', 'mc20d']: + elif campaign in [Campaign.MC16d, Campaign.MC20d]: list.append( 'GoodRunsLists/data17_13TeV/20180619/physics_25ns_Triggerno17e33prim.lumicalc.OflLumi-13TeV-010.root' ) - elif campaign in ['mc16e', 'mc20e']: + elif campaign in [Campaign.MC16e, Campaign.MC20e]: list.append( 'GoodRunsLists/data18_13TeV/20190318/ilumicalc_histograms_None_348885-364292_OflLumi-13TeV-010.root' ) - elif campaign in ['mc21a']: + elif campaign in [Campaign.MC21a]: list.append( 'GoodRunsLists/data22_13p6TeV/20220902/ilumicalc_histograms_None_430536-430648_OflLumi-Run3-001.root' ) @@ -31,7 +31,7 @@ def getLumicalcFiles(campaign): else: raise ValueError(f'Unsupported campaign {campaign}') - if campaign in ['mc16a', 'mc20a']: + if campaign in [Campaign.MC16a, Campaign.MC20a]: assert(len(list) == 2) else: assert(len(list) == 1) @@ -42,16 +42,16 @@ def getLumicalcFiles(campaign): def actualMuFiles(campaign): list = [] - if campaign in ['mc16d', 'mc20d']: + if campaign in [Campaign.MC16d, Campaign.MC20d]: list.append( 'GoodRunsLists/data17_13TeV/20180619/physics_25ns_Triggerno17e33prim.actualMu.OflLumi-13TeV-010.root' ) - elif campaign in ['mc16e', 'mc20e']: + elif campaign in [Campaign.MC16e, Campaign.MC20e]: list.append( 'GoodRunsLists/data18_13TeV/20190318/physics_25ns_Triggerno17e33prim.actualMu.OflLumi-13TeV-010.root' ) - if campaign in ['mc16d', 'mc20d', 'mc16e', 'mc20e']: + if campaign in [Campaign.MC16d, Campaign.MC20d, Campaign.MC16e, Campaign.MC20e]: assert(len(list) == 1) else: assert(len(list) == 0) @@ -62,19 +62,19 @@ def actualMuFiles(campaign): def defaultConfigFiles(campaign): list = [] - if campaign in ['mc20a']: + if campaign in [Campaign.MC20a]: list.append( 'PileupReweighting/mc20_common/mc20a.284500.physlite.prw.v1.root' ) - elif campaign in ['mc20d']: + elif campaign in [Campaign.MC20d]: list.append( 'PileupReweighting/mc20_common/mc20d.300000.physlite.prw.v1.root' ) - elif campaign in ['mc20e']: + elif campaign in [Campaign.MC20e]: list.append( 'PileupReweighting/mc20_common/mc20e.310000.physlite.prw.v1.root' ) - elif campaign in ['mc21a']: + elif campaign in [Campaign.MC21a]: list.append( 'PileupReweighting/mc21_common/mc21a.410000.physlite.prw.v1.root' ) @@ -93,7 +93,7 @@ def getConfigurationFiles(campaign=None, dsid=None, data_type=None, files=None, if files is not None and (campaign is None or dsid is None or data_type is None): if campaign is None: - campaign = getMCCampaign(files=files) + campaign = getMCCampaign(files) if dsid is None or data_type is None: from AthenaConfiguration.AutoConfigFlags import GetFileMD diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/python/PHYSLITE.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/python/PHYSLITE.py index b14fb05e3d8fb42c64a946e88cd2e5bd21666399..c0c3cf3bf994e4293986b4a16aa4a0e913c7f26a 100755 --- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/python/PHYSLITE.py +++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/python/PHYSLITE.py @@ -151,11 +151,12 @@ def PHYSLITEKernelCfg(ConfigFlags, name='PHYSLITEKernel', **kwargs): # acc.merge(GeoModelCfg(ConfigFlags)) # Create a pile-up analysis sequence - from AsgAnalysisAlgorithms.PileupAnalysisSequence import makePileupAnalysisSequence - pileupSequence = makePileupAnalysisSequence( dataType, files=ConfigFlags.Input.Files, useDefaultConfig=True ) - pileupSequence.configure( inputName = {}, outputName = {} ) - for element in pileupSequence.getGaudiConfig2Components(): - acc.addEventAlgo(element) + if ConfigFlags.Input.isMC: + from AsgAnalysisAlgorithms.PileupAnalysisSequence import makePileupAnalysisSequence + pileupSequence = makePileupAnalysisSequence( dataType, campaign=ConfigFlags.Input.MCCampaign, files=ConfigFlags.Input.Files, useDefaultConfig=True ) + pileupSequence.configure( inputName = {}, outputName = {} ) + for element in pileupSequence.getGaudiConfig2Components(): + acc.addEventAlgo(element) # Include, and then set up the electron analysis sequence: from EgammaAnalysisAlgorithms.ElectronAnalysisSequence import makeElectronAnalysisSequence diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/share/PHYSLITE.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/share/PHYSLITE.py index ead80a314c5524e9b33b23d93baaa924df2e3791..36b36c0c90c87b16eff4dddaf4200e70b511d717 100644 --- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/share/PHYSLITE.py +++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/share/PHYSLITE.py @@ -209,12 +209,15 @@ if DerivationFrameworkIsMonteCarlo: dataType = "mc" # Create a pile-up analysis sequence -from AsgAnalysisAlgorithms.PileupAnalysisSequence import makePileupAnalysisSequence -from RecExConfig.RecoFunctions import InputFileNames -pileupSequence = makePileupAnalysisSequence( dataType, files=InputFileNames(), useDefaultConfig=True ) -pileupSequence.configure( inputName = {}, outputName = {} ) -print( pileupSequence ) # For debugging -SeqPHYSLITE += pileupSequence +if DerivationFrameworkIsMonteCarlo: + from AsgAnalysisAlgorithms.PileupAnalysisSequence import makePileupAnalysisSequence + from RecExConfig.RecoFunctions import InputFileNames + from AthenaCommon.AthenaCommonFlags import athenaCommonFlags + from Campaigns.Utils import Campaign + pileupSequence = makePileupAnalysisSequence( dataType, campaign=Campaign(athenaCommonFlags.MCCampaign()), files=InputFileNames(), useDefaultConfig=True ) + pileupSequence.configure( inputName = {}, outputName = {} ) + print( pileupSequence ) # For debugging + SeqPHYSLITE += pileupSequence # Include, and then set up the electron analysis sequence: from EgammaAnalysisAlgorithms.ElectronAnalysisSequence import makeElectronAnalysisSequence diff --git a/Projects/AnalysisBase/package_filters.txt b/Projects/AnalysisBase/package_filters.txt index df1b2c20ffebc564763ee25a064085bb5e4563e5..3cf1e9ec538e896471336462e864534e232ea790 100644 --- a/Projects/AnalysisBase/package_filters.txt +++ b/Projects/AnalysisBase/package_filters.txt @@ -113,6 +113,7 @@ + Reconstruction/LwtnnUtils + Simulation/SimulationConfig + Tools/ART ++ Tools/Campaigns + Tools/DirectIOART + Tools/PathResolver + Tools/PyUtils diff --git a/Projects/AthAnalysis/package_filters.txt b/Projects/AthAnalysis/package_filters.txt index a920a63552b76c7ceae0a40190242da7f12951ea..1508639ec4624ea3c4ff981f32bc887f1c620eaf 100644 --- a/Projects/AthAnalysis/package_filters.txt +++ b/Projects/AthAnalysis/package_filters.txt @@ -108,8 +108,10 @@ + Reconstruction/egamma/egammaRecEvent + Reconstruction/egamma/egammaUtils + Reconstruction/tauRecTools ++ Simulation/SimulationConfig + Tools/PathResolver + Tools/ART ++ Tools/Campaigns + Tools/DirectIOART + Trigger/TrigAnalysis/TrigAnalysisInterfaces + Trigger/TrigAnalysis/TrigBunchCrossingTool diff --git a/Projects/AthGeneration/package_filters.txt b/Projects/AthGeneration/package_filters.txt index 5b8f763d98a5522eebcdab80e906a31a5061d32c..6091772fd3bac498044626db002fc3b0d0e99957 100644 --- a/Projects/AthGeneration/package_filters.txt +++ b/Projects/AthGeneration/package_filters.txt @@ -191,6 +191,7 @@ + Reconstruction/RecExample/RecExConfig + Simulation/Tools/AtlasCLHEP_RandomGenerators + Tools/ART ++ Tools/Campaigns + Tools/PathResolver + Tools/PmbCxxUtils + Tools/PyJobTransforms diff --git a/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py b/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py index ef414ef76759a98187c64eafa1ba040be656328c..29b6f4bfe22bb856d1610233491c01035c630ca1 100644 --- a/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py +++ b/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py @@ -137,6 +137,9 @@ svcMgr.TagInfoMgr.ExtraTagValuePairs.update({"beam_type": jobproperties.Beam.bea "project_name": str(rec.projectName()), "AtlasRelease_" + rec.OutputFileNameForRecoStep(): rec.AtlasReleaseVersion() }) +if athenaCommonFlags.MCCampaign(): + svcMgr.TagInfoMgr.ExtraTagValuePairs.update({"mc_campaign": athenaCommonFlags.MCCampaign()}) + # Set AMITag in /TagInfo from PyUtils import AMITagHelper AMITagHelper.SetAMITag(outputTag=rec.AMITag()) diff --git a/Tools/Campaigns/python/MC16.py b/Tools/Campaigns/python/MC16.py index 69a60c54a1be343c845e4f9bfb7270621b160280..6515cb995c66d4475420c2ae7e4d53ea5d2c0113 100644 --- a/Tools/Campaigns/python/MC16.py +++ b/Tools/Campaigns/python/MC16.py @@ -1,12 +1,14 @@ # Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration -from SimulationConfig.SimEnums import SimulationFlavour, TruthStrategy -from LArConfiguration.LArConfigRun2 import LArConfigRun2PileUp, LArConfigRun2NoPileUp +from Campaigns.Utils import Campaign def MC16a(flags): """MC16a flags for MC to match 2015 and 2016 data""" + flags.Input.MCCampaign = Campaign.MC16a + flags.Beam.NumberOfCollisions = 20. + from LArConfiguration.LArConfigRun2 import LArConfigRun2PileUp LArConfigRun2PileUp(flags) flags.Digitization.HighGainEMECIW = True @@ -22,8 +24,11 @@ def MC16a(flags): def MC16d(flags): """MC16d flags for MC to match 2017 data""" + flags.Input.MCCampaign = Campaign.MC16d + flags.Beam.NumberOfCollisions = 20. + from LArConfiguration.LArConfigRun2 import LArConfigRun2PileUp LArConfigRun2PileUp(flags) flags.Tile.BestPhaseFromCOOL = False @@ -38,8 +43,11 @@ def MC16d(flags): def MC16e(flags): """MC16e flags for MC to match 2018 data""" + flags.Input.MCCampaign = Campaign.MC16e + flags.Beam.NumberOfCollisions = 20. + from LArConfiguration.LArConfigRun2 import LArConfigRun2PileUp LArConfigRun2PileUp(flags) flags.Tile.BestPhaseFromCOOL = False @@ -56,6 +64,7 @@ def MC16NoPileUp(flags): """MC16 flags for MC without pile-up""" flags.Beam.NumberOfCollisions = 0. + from LArConfiguration.LArConfigRun2 import LArConfigRun2NoPileUp LArConfigRun2NoPileUp(flags) flags.Tile.BestPhaseFromCOOL = False @@ -64,6 +73,7 @@ def MC16NoPileUp(flags): def MC16Simulation(flags): """MC16 flags for simulation""" + from SimulationConfig.SimEnums import SimulationFlavour, TruthStrategy flags.Sim.PhysicsList = 'FTFP_BERT_ATL' flags.Sim.TruthStrategy = TruthStrategy.MC15aPlus diff --git a/Tools/Campaigns/python/MC20.py b/Tools/Campaigns/python/MC20.py index d84fd6e0adaeae568564a39b571226f665c95f85..e9c3bcc8be16ce86d913471f87ba9dfe633357c8 100644 --- a/Tools/Campaigns/python/MC20.py +++ b/Tools/Campaigns/python/MC20.py @@ -1,16 +1,18 @@ # Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration - from AthenaConfiguration.Enums import ProductionStep -from LArConfiguration.LArConfigRun2 import LArConfigRun2PileUp, LArConfigRun2NoPileUp +from Campaigns.Utils import Campaign def MC20a(flags): """MC20a flags for MC to match 2015 and 2016 data""" + flags.Input.MCCampaign = Campaign.MC20a + flags.Beam.NumberOfCollisions = 20. flags.Digitization.InputBeamSigmaZ = 42 flags.Digitization.UseUpdatedTGCConditions = True + from LArConfiguration.LArConfigRun2 import LArConfigRun2PileUp LArConfigRun2PileUp(flags) flags.Digitization.HighGainEMECIW = True @@ -35,11 +37,14 @@ def MC20a(flags): def MC20d(flags): """MC20d flags for MC to match 2017 data""" + flags.Input.MCCampaign = Campaign.MC20d + flags.Beam.NumberOfCollisions = 20. flags.Digitization.InputBeamSigmaZ = 42 flags.Digitization.UseUpdatedTGCConditions = True + from LArConfiguration.LArConfigRun2 import LArConfigRun2PileUp LArConfigRun2PileUp(flags) flags.Tile.BestPhaseFromCOOL = False @@ -63,11 +68,14 @@ def MC20d(flags): def MC20e(flags): """MC20e flags for MC to match 2018 data""" + flags.Input.MCCampaign = Campaign.MC20e + flags.Beam.NumberOfCollisions = 20. flags.Digitization.InputBeamSigmaZ = 42 flags.Digitization.UseUpdatedTGCConditions = True + from LArConfiguration.LArConfigRun2 import LArConfigRun2PileUp LArConfigRun2PileUp(flags) flags.Tile.BestPhaseFromCOOL = False @@ -96,6 +104,7 @@ def MC20NoPileUp(flags): flags.Digitization.UseUpdatedTGCConditions = True + from LArConfiguration.LArConfigRun2 import LArConfigRun2NoPileUp LArConfigRun2NoPileUp(flags) flags.Tile.BestPhaseFromCOOL = False diff --git a/Tools/Campaigns/python/MC21.py b/Tools/Campaigns/python/MC21.py index bd2ed515bcc3517b28cdfeeb35fac5dd138cfdfe..29e905c39300b61e1446b8c7df4cb9cd06f6e3f9 100644 --- a/Tools/Campaigns/python/MC21.py +++ b/Tools/Campaigns/python/MC21.py @@ -1,13 +1,15 @@ # Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration -from SimulationConfig.SimEnums import SimulationFlavour, TruthStrategy from AthenaConfiguration.Enums import ProductionStep -from LArConfiguration.LArConfigRun3 import LArConfigRun3PileUp, LArConfigRun3NoPileUp +from Campaigns.Utils import Campaign def MC21a(flags): """MC21a flags for MC to match initial Run 3 data""" + flags.Input.MCCampaign = Campaign.MC21a + flags.Beam.NumberOfCollisions = 60. + from LArConfiguration.LArConfigRun3 import LArConfigRun3PileUp LArConfigRun3PileUp(flags) flags.Tile.BestPhaseFromCOOL = False @@ -45,6 +47,7 @@ def MC21NoPileUp(flags): flags.Beam.NumberOfCollisions = 0. flags.Input.ConditionsRunNumber = 410000 + from LArConfiguration.LArConfigRun3 import LArConfigRun3NoPileUp LArConfigRun3NoPileUp(flags) flags.Tile.BestPhaseFromCOOL = False @@ -64,6 +67,7 @@ def BeamspotSplitMC21a(): def MC21SimulationBase(flags): """MC21 base flags for simulation""" + from SimulationConfig.SimEnums import SimulationFlavour, TruthStrategy flags.Sim.PhysicsList = 'FTFP_BERT_ATL' flags.Sim.TruthStrategy = TruthStrategy.MC15aPlus diff --git a/Tools/Campaigns/python/PhaseII.py b/Tools/Campaigns/python/PhaseII.py index c659b5af36201b168d753b51b11a38e815f93234..d18b1404a4f03c2254d8324098e0b891f5e4bc1b 100644 --- a/Tools/Campaigns/python/PhaseII.py +++ b/Tools/Campaigns/python/PhaseII.py @@ -1,6 +1,4 @@ # Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration -from SimulationConfig.SimEnums import TruthStrategy - def PhaseIIPileUpBase(flags, collisions=200): """Phase-II Upgrade / Run 4 flags for MC with pile-up""" @@ -131,6 +129,7 @@ def PhaseIINoPileUp(flags): def PhaseIISimulation(flags): """Phase-II Upgrade / Run 4 flags for simulation""" + from SimulationConfig.SimEnums import TruthStrategy flags.Sim.PhysicsList = 'FTFP_BERT_ATL' flags.Sim.TruthStrategy = TruthStrategy.MC15aPlus diff --git a/Tools/Campaigns/python/Utils.py b/Tools/Campaigns/python/Utils.py index 541735aa14c0a835135a965dacccb0334caf0662..f8da028647e3d8eb6dfef4c76979cbd640165e61 100644 --- a/Tools/Campaigns/python/Utils.py +++ b/Tools/Campaigns/python/Utils.py @@ -1,39 +1,46 @@ # Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration +from AthenaConfiguration.Enums import FlagEnum +class Campaign(FlagEnum): + Unknown = '' + MC16a = 'mc16a' + MC16d = 'mc16d' + MC16e = 'mc16e' + MC20a = 'mc20a' + MC20d = 'mc20d' + MC20e = 'mc20e' + MC21a = 'mc21a' -# Production r-tags for different campaigns -reco_campaigns = { - 'mc16a': ['r9280', 'r9287', 'r9364'], - 'mc16d': ['r10069', 'r10201', 'r10211','r10212'], - 'mc16e': ['r10724'], - 'mc20a': ['r13167'], - 'mc20d': ['r13144'], - 'mc20e': ['r13145'], - 'mc21a': ['r13768', 'r13829'], +# Campaign run numbers (only latest campaigns) +campaign_runs = { + 284500: Campaign.MC20a, + 300000: Campaign.MC20d, + 310000: Campaign.MC20e, + 410000: Campaign.MC21a, } # Function to get the campaign -def getMCCampaign(ami_tag=None, project_name=None, files=None): +def getMCCampaign(files): # Auto-configure from file - if files is not None and ami_tag is None and project_name is None: - from AthenaConfiguration.AutoConfigFlags import GetFileMD - metadata = GetFileMD(files) - ami_tag = metadata.get('AMITag', '') - project_name = metadata.get('project_name', '') + from AthenaConfiguration.AutoConfigFlags import GetFileMD + metadata = GetFileMD(files) + mc_campaign = Campaign(metadata.get('mc_campaign', '')) + project_name = metadata.get('project_name', '') + run_numbers = metadata.get('runNumbers', []) - assert ami_tag is not None - assert project_name is not None + if mc_campaign is not Campaign.Unknown: + return mc_campaign - for c in reco_campaigns: - for r in reco_campaigns[c]: - if r in ami_tag: - return c + if run_numbers: + mc_campaign = campaign_runs.get(run_numbers[0], Campaign.Unknown) # MC-equivalent projects for data - if 'data18' in project_name: - return 'mc20e' + if 'data22' in project_name: + return Campaign.MC21a + elif 'data18' in project_name: + return Campaign.MC20e elif 'data17' in project_name: - return 'mc20d' + return Campaign.MC20d elif 'data16' in project_name or 'data15' in project_name: - return 'mc20a' + return Campaign.MC20a - return None + return mc_campaign diff --git a/Tools/Campaigns/share/MC16a.py b/Tools/Campaigns/share/MC16a.py index 01e21645530f32cbbbcee21dcc576ada8a60dd01..23ea9265ea00b7a8da58759e1ddc467e3d8ad04f 100644 --- a/Tools/Campaigns/share/MC16a.py +++ b/Tools/Campaigns/share/MC16a.py @@ -1,4 +1,7 @@ # Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +from AthenaCommon.AthenaCommonFlags import athenaCommonFlags +from Campaigns.Utils import Campaign +athenaCommonFlags.MCCampaign.set_Value_and_Lock(Campaign.MC16a.value) from AthenaCommon.BeamFlags import jobproperties as bf bf.Beam.numberOfCollisions.set_Value_and_Lock(20.0) diff --git a/Tools/Campaigns/share/MC16d.py b/Tools/Campaigns/share/MC16d.py index e2faff8472f2dd67c7277fed02a5c8825ccdd9a1..50e7bcc7dfedaef1d1c7da6037b9b3389ccc5d1f 100644 --- a/Tools/Campaigns/share/MC16d.py +++ b/Tools/Campaigns/share/MC16d.py @@ -1,4 +1,7 @@ # Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +from AthenaCommon.AthenaCommonFlags import athenaCommonFlags +from Campaigns.Utils import Campaign +athenaCommonFlags.MCCampaign.set_Value_and_Lock(Campaign.MC16d.value) from AthenaCommon.BeamFlags import jobproperties as bf bf.Beam.numberOfCollisions.set_Value_and_Lock(20.0) diff --git a/Tools/Campaigns/share/MC16e.py b/Tools/Campaigns/share/MC16e.py index e2faff8472f2dd67c7277fed02a5c8825ccdd9a1..b733099e8dde32022b4e2fc8841e8dc18961081a 100644 --- a/Tools/Campaigns/share/MC16e.py +++ b/Tools/Campaigns/share/MC16e.py @@ -1,4 +1,7 @@ # Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +from AthenaCommon.AthenaCommonFlags import athenaCommonFlags +from Campaigns.Utils import Campaign +athenaCommonFlags.MCCampaign.set_Value_and_Lock(Campaign.MC16e.value) from AthenaCommon.BeamFlags import jobproperties as bf bf.Beam.numberOfCollisions.set_Value_and_Lock(20.0) diff --git a/Tools/Campaigns/share/MC20a.py b/Tools/Campaigns/share/MC20a.py index 829ee9589fcf59b0b1b454823ef573e4d969bc5a..687e958e126bf074ed5ed21cd6fe9357161c7af0 100644 --- a/Tools/Campaigns/share/MC20a.py +++ b/Tools/Campaigns/share/MC20a.py @@ -1,4 +1,7 @@ # Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +from AthenaCommon.AthenaCommonFlags import athenaCommonFlags +from Campaigns.Utils import Campaign +athenaCommonFlags.MCCampaign.set_Value_and_Lock(Campaign.MC20a.value) from AthenaCommon.BeamFlags import jobproperties as bf bf.Beam.numberOfCollisions.set_Value_and_Lock(20.0) diff --git a/Tools/Campaigns/share/MC20d.py b/Tools/Campaigns/share/MC20d.py index 9ce673b5a1bc0e6aa0ad165b79ea7670b3eb386d..b114282ac46dfffdf55773e39557aa6ab5f824e0 100644 --- a/Tools/Campaigns/share/MC20d.py +++ b/Tools/Campaigns/share/MC20d.py @@ -1,4 +1,7 @@ # Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +from AthenaCommon.AthenaCommonFlags import athenaCommonFlags +from Campaigns.Utils import Campaign +athenaCommonFlags.MCCampaign.set_Value_and_Lock(Campaign.MC20d.value) from AthenaCommon.BeamFlags import jobproperties as bf bf.Beam.numberOfCollisions.set_Value_and_Lock(20.0) diff --git a/Tools/Campaigns/share/MC20e.py b/Tools/Campaigns/share/MC20e.py index 9ce673b5a1bc0e6aa0ad165b79ea7670b3eb386d..552389304fcd2e5e751dc4f39d7ac763e257e6b2 100644 --- a/Tools/Campaigns/share/MC20e.py +++ b/Tools/Campaigns/share/MC20e.py @@ -1,4 +1,7 @@ # Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +from AthenaCommon.AthenaCommonFlags import athenaCommonFlags +from Campaigns.Utils import Campaign +athenaCommonFlags.MCCampaign.set_Value_and_Lock(Campaign.MC20e.value) from AthenaCommon.BeamFlags import jobproperties as bf bf.Beam.numberOfCollisions.set_Value_and_Lock(20.0) diff --git a/Tools/Campaigns/share/MC21a.py b/Tools/Campaigns/share/MC21a.py index 526c7afd32fcc5d4a909b0fa8da64851b30b6de1..5336ee2d30a6483007624c0a0310b5e6df239157 100644 --- a/Tools/Campaigns/share/MC21a.py +++ b/Tools/Campaigns/share/MC21a.py @@ -1,4 +1,7 @@ # Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration +from AthenaCommon.AthenaCommonFlags import athenaCommonFlags +from Campaigns.Utils import Campaign +athenaCommonFlags.MCCampaign.set_Value_and_Lock(Campaign.MC21a.value) from AthenaCommon.BeamFlags import jobproperties as bf bf.Beam.numberOfCollisions.set_Value_and_Lock(60.0) diff --git a/Tools/PROCTools/data/q443_AOD_content.ref b/Tools/PROCTools/data/q443_AOD_content.ref index 494fe7c500bca3c0b842aacd6475a716948fb5b3..5e8d8299aee68a49fcc98762fb8ef32de837764e 100644 --- a/Tools/PROCTools/data/q443_AOD_content.ref +++ b/Tools/PROCTools/data/q443_AOD_content.ref @@ -726,6 +726,7 @@ FileMetaDataAuxDyn.beamType FileMetaDataAuxDyn.conditionsTag FileMetaDataAuxDyn.geometryVersion FileMetaDataAuxDyn.isDataOverlay +FileMetaDataAuxDyn.mcCampaign FileMetaDataAuxDyn.mcProcID FileMetaDataAuxDyn.simFlavour ForwardElectronClusters diff --git a/Tools/PROCTools/data/q445_AOD_content.ref b/Tools/PROCTools/data/q445_AOD_content.ref index 37ff340933be0f2c622d2d7965de2b027bb391c7..14a660aed09a434f2b31027dc0d108b5ec1666cc 100644 --- a/Tools/PROCTools/data/q445_AOD_content.ref +++ b/Tools/PROCTools/data/q445_AOD_content.ref @@ -346,6 +346,7 @@ FileMetaDataAuxDyn.beamType FileMetaDataAuxDyn.conditionsTag FileMetaDataAuxDyn.geometryVersion FileMetaDataAuxDyn.isDataOverlay +FileMetaDataAuxDyn.mcCampaign FileMetaDataAuxDyn.mcProcID FileMetaDataAuxDyn.simFlavour ForwardElectronClusters diff --git a/Tools/PROCTools/data/q446_AOD_content.ref b/Tools/PROCTools/data/q446_AOD_content.ref index 505f70eef0d5221448da44fff294c264167e7a78..24c0133b66a155b578255eec7d1b026c84af3e7b 100644 --- a/Tools/PROCTools/data/q446_AOD_content.ref +++ b/Tools/PROCTools/data/q446_AOD_content.ref @@ -246,6 +246,7 @@ FileMetaDataAuxDyn.beamType FileMetaDataAuxDyn.conditionsTag FileMetaDataAuxDyn.geometryVersion FileMetaDataAuxDyn.isDataOverlay +FileMetaDataAuxDyn.mcCampaign FileMetaDataAuxDyn.mcProcID FileMetaDataAuxDyn.simFlavour ForwardElectronClusters diff --git a/Tools/PyUtils/CMakeLists.txt b/Tools/PyUtils/CMakeLists.txt index b132ef9f967ff85add07b9998e23029eafc12d71..6de3adc1bbbdac773b1b49ba9d9ce823ce4a338e 100644 --- a/Tools/PyUtils/CMakeLists.txt +++ b/Tools/PyUtils/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration # Declare the package name: atlas_subdir( PyUtils ) @@ -11,6 +11,11 @@ if( XAOD_STANDALONE ) python/RootUtils.py python/Helpers.py POST_BUILD_CMD ${ATLAS_FLAKE8} ) + atlas_install_scripts( bin/meta-reader.py bin/meta-diff.py + POST_BUILD_CMD ${ATLAS_FLAKE8} ) + + atlas_add_alias( meta-reader "meta-reader.py" ) + atlas_add_alias( meta-diff "meta-diff.py" ) else() # External dependencies: find_package( decorator ) diff --git a/Tools/PyUtils/python/MetaReader.py b/Tools/PyUtils/python/MetaReader.py index 2f179dd8740aa32a31ff5f6bb49834fe9778304d..c6e69352a9ce5aca34c399c372146998e79c4851 100644 --- a/Tools/PyUtils/python/MetaReader.py +++ b/Tools/PyUtils/python/MetaReader.py @@ -392,7 +392,7 @@ def read_metadata(filenames, file_type = None, mode = 'lite', promote = None, me meta_dict = make_peeker(meta_dict) if promote: - meta_dict = promote_keys(meta_dict) + meta_dict = promote_keys(meta_dict, mode) # If AnalysisBase the itemList must be grabbed another way if not isGaudiEnv(): @@ -957,11 +957,15 @@ def make_lite(meta_dict): meta_dict[filename][key].pop(item) if '/TagInfo' in file_content: - keys_to_keep = ['beam_energy', 'beam_type', 'GeoAtlas', 'IOVDbGlobalTag', 'AODFixVersion', 'project_name'] + keys_to_keep = ['beam_energy', 'beam_type', 'GeoAtlas', 'IOVDbGlobalTag', 'AODFixVersion', 'project_name', 'mc_campaign'] for item in list(meta_dict[filename]['/TagInfo']): if item not in keys_to_keep: meta_dict[filename]['/TagInfo'].pop(item) + + # default values: + if 'mc_campaign' not in meta_dict[filename]['/TagInfo']: + meta_dict[filename]['/TagInfo']['mc_campaign'] = '' return meta_dict @@ -993,7 +997,8 @@ def make_peeker(meta_dict): 'project_name', 'triggerStreamOfFile', 'AtlasRelease', - 'specialConfiguration' + 'specialConfiguration', + 'mc_campaign', ] for item in list(meta_dict[filename]['/TagInfo']): if item not in keys_to_keep: @@ -1029,7 +1034,7 @@ def make_peeker(meta_dict): return meta_dict -def promote_keys(meta_dict): +def promote_keys(meta_dict, mode): for filename, file_content in meta_dict.items(): md = meta_dict[filename] for key in file_content: @@ -1056,22 +1061,23 @@ def promote_keys(meta_dict): break if not isGaudiEnv() and key in md['metadata_items'] and 'FileMetaData' in key: - md.update(md[key]) - if 'beamType' in md[key]: md['beam_type'] = md[key]['beamType'] if 'runNumbers' in md[key]: - md['mc_event_number'] = md[key]['runNumbers'][0] + md['runNumbers'] = md[key]['runNumbers'] if 'mcProcID' in md[key]: md['mc_channel_number'] = int(md[key]['mcProcID']) + if 'mcCampaign' in md[key]: + md['mc_campaign'] = md[key]['mcCampaign'] + if 'lumiBlocks' in md[key]: md['lumiBlockNumbers'] = md[key]['lumiBlocks'] - if 'amiTag' in md[key]: - md['processingTags'] = md[key]['amiTag'] + if mode == 'peeker' and 'amiTag' in md[key]: + md['AMITag'] = md[key]['amiTag'] if 'beamEnergy' in md[key]: md['beam_energy'] = md[key]['beamEnergy'] @@ -1081,6 +1087,9 @@ def promote_keys(meta_dict): # EventType checks md['eventTypes'] = [] + if mode == 'peeker' and 'simFlavour' in md[key]: + md['SimulationFlavour'] = md[key]['simFlavour'] + if 'simFlavour' in md[key] and ('FullG4' in md[key]['simFlavour'] or 'ATLFAST' in md[key]['simFlavour']): md['eventTypes'].append('IS_SIMULATION') else: @@ -1091,7 +1100,14 @@ def promote_keys(meta_dict): else: md['eventTypes'].append('IS_TESTBEAM') - meta_dict[filename].pop(key) + if 'dataType' in md[key]: + md['processingTags'] = [md[key]['dataType']] + + if mode == 'peeker' and 'productionRelease' in md[key]: + md['AtlasRelease'] = md[key]['productionRelease'] + + if mode == 'lite': + meta_dict[filename].pop(key) break if '/TagInfo' in file_content: