5 '''@file InDetPhysValMonitoringConfig.py 
    8 @brief Main CA-based python configuration for InDetPhysValMonitoring 
   11 from AthenaConfiguration.ComponentAccumulator 
import ComponentAccumulator
 
   12 from AthenaConfiguration.ComponentFactory 
import CompFactory
 
   16     suffixes = [
'Tracks', 
'TrackParticles']
 
   17     for suffix 
in suffixes:
 
   18         if track_collection_name.endswith(suffix):
 
   19             return track_collection_name.removesuffix(suffix)
 
   20     return track_collection_name
 
   25     if flags.Detector.GeometryID:
 
   26         if flags.PhysVal.IDPVM.doValidateLargeD0Tracks 
or flags.PhysVal.IDPVM.doValidateMergedLargeD0Tracks:
 
   27             kwargs.setdefault(
"DefinitionSource", 
"InDetPVMPlotDefLRT.xml")
 
   29             kwargs.setdefault(
"DefinitionSource", 
"InDetPVMPlotDefRun2.xml")
 
   30     elif flags.Detector.GeometryITk:
 
   31         kwargs.setdefault(
"DefinitionSource", 
"InDetPVMPlotDefITK.xml")
 
   32     kwargs.setdefault(
"DefinitionFormat", 
"text/xml")
 
   33     histoSvc = CompFactory.HistogramDefinitionSvc(**kwargs)
 
   34     acc.addService(histoSvc)
 
   39         flags, name="InDetRttTruthSelectionTool", **kwargs):
 
   42     kwargs.setdefault(
"requireStable", 
True)
 
   43     kwargs.setdefault(
"requireCharged", 
True)
 
   44     kwargs.setdefault(
"selectedCharge", flags.PhysVal.IDPVM.selectedCharge)
 
   45     kwargs.setdefault(
"requireOnlyPrimary",
 
   46                       True if kwargs.pop(
"OnlyDressPrimaryTracks", 
True)
 
   48     kwargs.setdefault(
"maxProdVertRadius",
 
   49                       flags.PhysVal.IDPVM.maxProdVertRadius)
 
   51     if flags.Detector.GeometryID:
 
   52         if flags.PhysVal.IDPVM.doValidateLargeD0Tracks 
or flags.PhysVal.IDPVM.doValidateMergedLargeD0Tracks:
 
   53             kwargs.setdefault(
"maxEta", 3.0)
 
   55             kwargs.setdefault(
"maxEta", 2.5)
 
   56     elif flags.Detector.GeometryITk:
 
   57         kwargs.setdefault(
"maxEta", 4.0)
 
   59     kwargs.setdefault(
"minPt", flags.PhysVal.IDPVM.truthMinPt)
 
   60     kwargs.setdefault(
"ancestorList", flags.PhysVal.IDPVM.ancestorIDs)
 
   61     kwargs.setdefault(
"requireSiHit", flags.PhysVal.IDPVM.requiredSiHits)
 
   62     kwargs.setdefault(
"vetoPdgId", flags.PhysVal.IDPVM.vetoPdgId)
 
   63     kwargs.setdefault(
"pdgId", flags.PhysVal.IDPVM.pdgId)
 
   65     if "radiusCylinder" in kwargs 
or "zDisc" in kwargs:
 
   66         from TrkConfig.AtlasExtrapolatorConfig 
import AtlasExtrapolatorCfg
 
   68         acc.addPublicTool(extrapolator)  
 
   69         kwargs.setdefault(
"Extrapolator", extrapolator)
 
   71         kwargs.setdefault(
"Extrapolator", 
None)
 
   73     acc.setPrivateTools(CompFactory.AthTruthSelectionTool(name, **kwargs))
 
   80     from GoodRunsLists.GoodRunsListsDictionary 
import getGoodRunsLists
 
   83     cvmfs = 
'/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/' 
   85         '2015': cvmfs + 
''.
join(GRLDict[
'GRL2015']),
 
   86         '2016': cvmfs + 
''.
join(GRLDict[
'GRL2016']),
 
   87         '2017': cvmfs + 
''.
join(GRLDict[
'GRL2017_Triggerno17e33prim']),
 
   88         '2018': cvmfs + 
''.
join(GRLDict[
'GRL2018_Triggerno17e33prim']),
 
   89         '2022': cvmfs + 
''.
join(GRLDict[
'GRL2022']),
 
   90         '2023': cvmfs + 
''.
join(GRLDict[
'GRL2023']),
 
   91         '2024': cvmfs + 
''.
join(GRLDict[
'GRL2024'])
 
   94     acc.setPrivateTools(CompFactory.GoodRunsListSelectionTool(
 
   95         name=
"GoodRunsListSelectionTool",
 
   96         GoodRunsListVec=[grldict[p] 
for p 
in flags.PhysVal.IDPVM.GRL],
 
  104     acc.setPrivateTools(CompFactory.InDetVertexTruthMatchTool(**kwargs))
 
  109     from InDetPhysValMonitoring.InDetPhysValDecorationConfig 
import (
 
  110         AddDecoratorIfNeededCfg)
 
  112     kwargs.setdefault(
"useTrackSelection", 
False)
 
  113     kwargs.setdefault(
"EnableLumi", 
False)
 
  116     kwargs.setdefault(
'VertexContainerName', flags.PhysVal.IDPVM.PrimaryVertexContainer)
 
  119     if flags.PhysVal.IDPVM.hardScatterStrategy 
in [2, 3]:
 
  121         from InDetPhysValMonitoring.addRecoJetsConfig 
import (
 
  122             AddRecoJetsIfNotExistingCfg)
 
  124             flags, flags.PhysVal.IDPVM.jetsNameForHardScatter))
 
  127     if flags.PhysVal.IDPVM.hardScatterStrategy == 3:
 
  128         from InDetConfig.InDetGNNHardScatterSelectionConfig 
import (
 
  133     if flags.PhysVal.IDPVM.hardScatterStrategy == 4:
 
  134         from DerivationFrameworkHiggs.HIGG1D1CustomVertexConfig 
import DiPhotonVertexCfg
 
  137     if flags.PhysVal.IDPVM.GRL:
 
  138         kwargs.setdefault(
"useGRL", 
True)
 
  139         kwargs.setdefault(
'GoodRunsListSelectionTool', acc.popToolsAndMerge(
 
  142     kwargs.setdefault(
"doIDTIDEPlots", flags.PhysVal.IDPVM.doIDTIDE)
 
  143     kwargs.setdefault(
"setCSVName", flags.PhysVal.IDPVM.setCSVName)
 
  145     if flags.PhysVal.IDPVM.doValidateTracksInJets:
 
  146         kwargs.setdefault(
"JetContainerName", flags.PhysVal.IDPVM.jetCollection)
 
  147         kwargs.setdefault(
"FillTrackInJetPlots", 
True)
 
  148         kwargs.setdefault(
'JetAbsEtaMin', 0)
 
  149         kwargs.setdefault(
'JetAbsEtaMax', flags.PhysVal.IDPVM.JetAbsEtaMax)
 
  150         kwargs.setdefault(
'JetPtMin', flags.PhysVal.IDPVM.JetPtMin)
 
  151         kwargs.setdefault(
'JetPtMax', flags.PhysVal.IDPVM.JetPtMax)
 
  152         kwargs.setdefault(
'maxTrkJetDR', flags.PhysVal.IDPVM.maxTrkJetDR)
 
  153         kwargs.setdefault(
"FillTrackInBJetPlots",
 
  154                           flags.PhysVal.IDPVM.doValidateTracksInBJets)
 
  156         kwargs.setdefault(
"JetContainerName", 
'')
 
  157         kwargs.setdefault(
"FillTrackInJetPlots", 
False)
 
  159     kwargs.setdefault(
"doPerAuthorPlots",
 
  160                       flags.PhysVal.IDPVM.doPerAuthorPlots)
 
  162     if flags.Input.isMC 
and not flags.PhysVal.IDPVM.doRecoOnly:
 
  163         kwargs.setdefault(
"TruthParticleContainerName", 
"TruthParticles")
 
  164         if 'TruthSelectionTool' not in kwargs:
 
  165             kwargs.setdefault(
"TruthSelectionTool", acc.popToolsAndMerge(
 
  168         doHyyHSSelection = flags.PhysVal.IDPVM.hardScatterStrategy == 4
 
  169         if 'hardScatterSelectionTool' not in kwargs:
 
  170             from InDetConfig.InDetHardScatterSelectionToolConfig 
import (
 
  171                 InDetHardScatterSelectionToolCfg)
 
  172             kwargs.setdefault(
"hardScatterSelectionTool", acc.popToolsAndMerge(
 
  175                     RedoHardScatter=
not doHyyHSSelection,
 
  176                     SelectionMode=flags.PhysVal.IDPVM.hardScatterStrategy,
 
  178                     JetContainer=flags.PhysVal.IDPVM.jetsNameForHardScatter,
 
  179                     VertexContainer=flags.PhysVal.IDPVM.PrimaryVertexContainer
 
  183             assert flags.PhysVal.IDPVM.PrimaryVertexContainer == 
'HggPrimaryVertices' 
  185         kwargs.setdefault(
"FillTruthToRecoNtuple",
 
  186                           flags.PhysVal.IDPVM.doValidateTruthToRecoNtuple)
 
  187         kwargs.setdefault(
"doTruthOriginPlots",
 
  188                           flags.PhysVal.IDPVM.doTruthOriginPlots)
 
  189         kwargs.setdefault(
"doDuplicatePlots",
 
  190                           flags.PhysVal.IDPVM.doDuplicatePlots)
 
  191         kwargs.setdefault(
"doHitLevelPlots",
 
  192                           flags.PhysVal.IDPVM.doHitLevelPlots)
 
  195         if not flags.PhysVal.IDPVM.doIDTIDE:
 
  196             kwargs.setdefault(
"useVertexTruthMatchTool", 
True)
 
  197             kwargs.setdefault(
"VertexTruthMatchTool", acc.popToolsAndMerge(
 
  200         if "trackTruthOriginTool" not in kwargs:
 
  201             from InDetTrackSystematicsTools.InDetTrackSystematicsToolsConfig 
import InDetTrackTruthOriginToolCfg
 
  202             kwargs.setdefault(
"trackTruthOriginTool", acc.popToolsAndMerge(
 
  206         if flags.PhysVal.IDPVM.setTruthStrategy 
in [
'All', 
'PileUp']:
 
  207             if not(
"xAOD::TruthPileupEventContainer#TruthPileupEvents" 
  208                    in flags.Input.TypedCollections):
 
  209                 print(
'WARNING Truth Strategy for InDetPhysValMonitoring set to %s but TruthPileupEvents are missing in the input' % (flags.PhysVal.IDPVM.setTruthStrategy))
 
  210             kwargs.setdefault(
"PileupSwitch",
 
  211                               flags.PhysVal.IDPVM.setTruthStrategy)
 
  213         elif flags.PhysVal.IDPVM.setTruthStrategy != 
'HardScatter':
 
  214             print(
'WARNING Truth Strategy for for InDetPhysValMonitoring set to invalid option %s; valid flags are ["HardScatter", "All", "PileUp"]' % (
 
  215                 flags.PhysVal.IDPVM.setTruthStrategy))
 
  219         kwargs.setdefault(
"TruthParticleContainerName", 
'')
 
  220         kwargs.setdefault(
"TruthVertexContainerName", 
'')
 
  221         kwargs.setdefault(
"TruthEvents", 
'')
 
  222         kwargs.setdefault(
"TruthPileupEvents", 
'')
 
  223         kwargs.setdefault(
"TruthSelectionTool", 
None)
 
  224         kwargs.setdefault(
"FillTruthToRecoNtuple", 
False)
 
  226     if flags.Detector.GeometryITk:
 
  228         kwargs.setdefault(
"doTRTExtensionPlots", 
False)
 
  229         kwargs.setdefault(
"isITk", 
True)
 
  231     if flags.PhysVal.IDPVM.doTechnicalEfficiency:
 
  232         kwargs.setdefault(
"fillTechnicalEfficiency", 
True)
 
  233         kwargs.setdefault(
"EtaBins", flags.Tracking.ITkMainPass.etaBins 
if flags.Detector.GeometryITk
 
  235         kwargs.setdefault(
"MinNumberClusters", flags.Tracking.ITkMainPass.minClusters 
if flags.Detector.GeometryITk
 
  236                                                else [flags.Tracking.MainPass.minClusters]) 
 
  239     kwargs.setdefault(
"DetailLevel", 200 
if flags.PhysVal.IDPVM.doExpertOutput 
else 100)
 
  242     if flags.PhysVal.IDPVM.doIDTIDE:
 
  243         kwargs.setdefault(
"doIDTIDEPlots", 
True)
 
  244         kwargs.setdefault(
"JetContainerName", 
'AntiKt4EMPFlowJets')
 
  245         kwargs.setdefault(
"FillTrackInJetPlots", 
True)
 
  248         kwargs.setdefault(
'JetAbsEtaMin', 0)
 
  249         kwargs.setdefault(
'JetAbsEtaMax', 
 
  250                           flags.PhysVal.IDPVM.JetAbsEtaMax)
 
  251         kwargs.setdefault(
'maxTrkJetDR', 
 
  252                           flags.PhysVal.IDPVM.maxTrkJetDR)
 
  254         kwargs.setdefault(
'JetPtMin', 100)
 
  255         kwargs.setdefault(
'JetPtMax', 5000)
 
  257     kwargs.setdefault(
"doPRW", flags.PhysVal.IDPVM.doPRW)
 
  259     acc.setPrivateTools(CompFactory.InDetPhysValMonitoringTool(**kwargs))
 
  266     if 'TrackSelectionTool' not in kwargs:
 
  267         from InDetConfig.InDetTrackSelectionToolConfig 
import (
 
  268             InDetTrackSelectionTool_Loose_Cfg)
 
  269         kwargs.setdefault(
"TrackSelectionTool", acc.popToolsAndMerge(
 
  272     kwargs.setdefault(
"SubFolder", 
'Loose/')
 
  273     kwargs.setdefault(
"useTrackSelection", 
True)
 
  276         flags, name=
"InDetPhysValMonitoringToolLoose", **kwargs)))
 
  283     if 'TrackSelectionTool' not in kwargs:
 
  284         from InDetConfig.InDetTrackSelectionToolConfig 
import (
 
  285             InDetTrackSelectionTool_TightPrimary_Cfg)
 
  286         kwargs.setdefault(
"TrackSelectionTool", acc.popToolsAndMerge(
 
  289     kwargs.setdefault(
"SubFolder", 
'TightPrimary/')
 
  290     kwargs.setdefault(
"useTrackSelection", 
True)
 
  293         flags, name=
"InDetPhysValMonitoringToolTightPrimary", **kwargs)))
 
  300     if 'TrackSelectionTool' not in kwargs:
 
  301         from InDetConfig.InDetTrackSelectionToolConfig 
import (
 
  302             InDetTrackSelectionTool_HILoose_Cfg)
 
  303         kwargs.setdefault(
"TrackSelectionTool", acc.popToolsAndMerge(
 
  306     kwargs.setdefault(
"SubFolder", 
'HILoose/')
 
  307     kwargs.setdefault(
"useTrackSelection", 
True)
 
  310         flags, name=
"InDetPhysValMonitoringToolHILoose", **kwargs)))
 
  315     kwargs.setdefault(
"SubFolder", 
'GSF/')
 
  316     kwargs.setdefault(
"TrackParticleContainerName", 
'GSFTrackParticles')
 
  317     kwargs.setdefault(
"useTrackSelection", 
True)
 
  319         flags, name=
"InDetPhysValMonitoringToolGSF", **kwargs)
 
  325     kwargs.setdefault(
"TruthSelectionTool", acc.popToolsAndMerge(
 
  327             flags, name=
"AthTruthSelectionToolForIDPVM_Electrons",
 
  331     kwargs.setdefault(
"onlyFillTruthMatched", 
True)
 
  332     kwargs.setdefault(
"SubFolder", 
'Electrons/')
 
  335         flags, name=
'InDetPhysValMonitoringToolElectrons', **kwargs)))
 
  342     kwargs.setdefault(
"TruthSelectionTool", acc.popToolsAndMerge(
 
  344             flags, name=
"AthTruthSelectionToolForIDPVM_Muons",
 
  348     kwargs.setdefault(
"onlyFillTruthMatched", 
True)
 
  349     kwargs.setdefault(
"SubFolder", 
'Muons/')
 
  352         flags, name=
'InDetPhysValMonitoringToolMuons', **kwargs)))
 
  359     kwargs.setdefault(
"SubFolder", 
'LRT/')
 
  360     kwargs.setdefault(
"TruthSelectionTool", acc.popToolsAndMerge(
 
  362     kwargs.setdefault(
"TrackParticleContainerName",
 
  363                       flags.PhysVal.IDPVM.largeD0TrackCollection
 
  364                       if flags.Tracking.storeSeparateLargeD0Container 
else 
  365                       'InDetTrackParticles')
 
  366     kwargs.setdefault(
"useTrackSelection", 
True)
 
  369         flags, name=
'InDetPhysValMonitoringToolLargeD0', **kwargs)))
 
  376     kwargs.setdefault(
"SubFolder", 
'LRTMerged/')
 
  377     kwargs.setdefault(
"TruthSelectionTool", acc.popToolsAndMerge(
 
  379     kwargs.setdefault(
"TrackParticleContainerName",
 
  380                       'InDetWithLRTTrackParticles' 
  381                       if flags.Tracking.storeSeparateLargeD0Container 
else 
  382                       'InDetTrackParticles')
 
  383     kwargs.setdefault(
"useTrackSelection", 
True)
 
  386         flags, name=
'InDetPhysValMonitoringToolMergedLargeD0', **kwargs)))
 
  391     kwargs.setdefault(
"SubFolder", 
'LowPtRoI/') 
 
  392     kwargs.setdefault(
"TruthSelectionTool", acc.popToolsAndMerge(
 
  394     kwargs.setdefault(
"TrackParticleContainerName",
 
  395                      'InDetLowPtRoITrackParticles')
 
  397         flags, name=
'InDetPhysValMonitoringToolLowPtRoI', **kwargs)))
 
  405     if flags.PhysVal.IDPVM.doValidateMergedLargeD0Tracks:
 
  406         from DerivationFrameworkInDet.InDetToolsConfig 
import InDetLRTMergeCfg
 
  410              InDetPhysValMonitoringToolCfg),
 
  411             (flags.PhysVal.IDPVM.doValidateMuonMatchedTracks,
 
  412              InDetPhysValMonitoringToolMuonsCfg),
 
  413             (flags.PhysVal.IDPVM.doValidateElectronMatchedTracks,
 
  414              InDetPhysValMonitoringToolElectronsCfg),
 
  415             (flags.PhysVal.IDPVM.doValidateLargeD0Tracks,
 
  416              InDetLargeD0PhysValMonitoringToolCfg),
 
  417             (flags.PhysVal.IDPVM.doValidateMergedLargeD0Tracks,
 
  418              InDetMergedLargeD0PhysValMonitoringToolCfg),
 
  419             (flags.PhysVal.IDPVM.doValidateLowPtRoITracks,
 
  420              InDetLowPtRoIPhysValMonitoringToolCfg),
 
  421             (flags.PhysVal.IDPVM.doValidateLooseTracks,
 
  422              InDetPhysValMonitoringToolLooseCfg),
 
  423             (flags.PhysVal.IDPVM.doValidateTightPrimaryTracks,
 
  424              InDetPhysValMonitoringToolTightPrimaryCfg),
 
  425             (flags.PhysVal.IDPVM.doValidateHILoose,
 
  426              InDetPhysValMonitoringToolHILooseCfg),
 
  427             (flags.PhysVal.IDPVM.doValidateGSFTracks,
 
  428              InDetPhysValMonitoringToolGSFCfg)
 
  432     for enabled, creator 
in mons:
 
  434             tools.append(acc.popToolsAndMerge(creator(flags)))
 
  436     for col 
in flags.PhysVal.IDPVM.validateExtraTrackCollections:
 
  439             flags, name=
'InDetPhysValMonitoringTool'+prefix,
 
  440             SubFolder=prefix+
'Tracks/',
 
  441             TrackParticleContainerName=prefix+
'TrackParticles' 
  444     from PhysValMonitoring.PhysValMonitoringConfig 
import PhysValMonitoringCfg