ATLAS Offline Software
EventCleaningConfig.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2 
3 # AnaAlgorithm import(s):
4 from AnalysisAlgorithmsConfig.ConfigBlock import ConfigBlock
5 from AnalysisAlgorithmsConfig.ConfigAccumulator import DataType
6 
7 
8 class EventCleaningBlock (ConfigBlock):
9  """the ConfigBlock for event cleaning"""
10 
11  def __init__ (self) :
12  super (EventCleaningBlock, self).__init__ ()
13  self.addOption ('runPrimaryVertexSelection', True, type=bool,
14  info="whether to run primary vertex selection. The default is True.")
15  self.addOption ('runEventCleaning', False, type=bool,
16  info="whether to run event cleaning (sets up an instance of "
17  "CP::EventFlagSelectionAlg). The default is False.")
18  self.addOption ('runGRL', True, type=bool,
19  info="whether to run GRL decoration/selection. The default is True.")
20  self.addOption ('userGRLFiles', [], type=None,
21  info="a list of GRL files (list of strings) to select data from. "
22  "The default is [] (empty list).")
23  self.addOption ('minTracksPerVertex', 2, type=int,
24  info="minimum number (integer) of tracks per vertex. The default is 2.")
25  self.addOption ('selectionFlags', ['DFCommonJets_eventClean_LooseBad'], type=None,
26  info="lags (list of strings) to use for jet cleaning. The default is "
27  "['DFCommonJets_eventClean_LooseBad'].")
28  # This is a vector<bool>, so parsing True/False is not handled
29  # in AnalysisBase, but we can evade this with numerical values
30  self.addOption ('invertFlags', [0], type=None,
31  info="list of booleans determining whether to invert the cut of the "
32  "above selectionFlags. The default is [0].")
33  self.addOption ('GRLDict', {}, type=None)
34  self.addOption ('noFilter', False, type=bool,
35  info="do apply event decoration, but do not filter. The default is False, i.e. 'We decorate events but do not filter' ")
36  self.addOption ('useRandomRunNumber', False, type=bool,
37  info="use RandomRunNumber to compute GRL info. Only supported for MC. The default is False")
38 
39  if self.runGRL and self.userGRLFiles:
40  raise ValueError("No userGRLFiles should be specified if runGRL=False")
41 
42  def getDefaultGRLs (self, data_year) :
43  """ returns a reasonable set of GRLs that should be suited for most analyses """
44  from GoodRunsLists.GoodRunsListsDictionary import getGoodRunsLists
45  GRLDict = getGoodRunsLists()
46 
47  if data_year == 2015:
48  return GRLDict['GRL2015']
49  elif data_year == 2016:
50  return GRLDict['GRL2016']
51  elif data_year == 2017:
52  return GRLDict['GRL2017_Triggerno17e33prim']
53  elif data_year == 2018:
54  return GRLDict['GRL2018_Triggerno17e33prim']
55  elif data_year == 2022:
56  return GRLDict['GRL2022']
57  elif data_year == 2023:
58  return GRLDict['GRL2023']
59  else:
60  raise ValueError (f"Data year {data_year} is not recognised for automatic GRL retrieval!")
61 
62  def makeAlgs (self, config) :
63 
64  # Apply GRL
65  if self.runGRL and (config.dataType() is DataType.Data or self.useRandomRunNumber):
66  if config.dataType() is DataType.Data and self.useRandomRunNumber:
67  raise ValueError ("UseRandomRunNumber is only supported for MC!")
68 
69  if self.noFilter:
70  # here we only decorate the PHYSLITE events with a boolean and don't do any cleaning
71  # Set up the GRL Decoration
72  for GRLDecoratorName,GRLFile in (self.GRLDict).items():
73  alg = config.createAlgorithm( 'GRLSelectorAlg', GRLDecoratorName )
74  config.addPrivateTool( 'Tool', 'GoodRunsListSelectionTool' )
75  alg.Tool.UseRandomRunNumber = self.useRandomRunNumber
76  alg.Tool.GoodRunsListVec = GRLFile
77  alg.noFilter = True
78  alg.grlKey = "EventInfo." + GRLDecoratorName
79  # Using WriteDecorHandle thus no need for addOutputVar
80  else:
81  # Set up the GRL selection:
82  alg = config.createAlgorithm( 'GRLSelectorAlg', 'GRLSelectorAlg' )
83  config.addPrivateTool( 'Tool', 'GoodRunsListSelectionTool' )
84  alg.Tool.UseRandomRunNumber = self.useRandomRunNumber
85  if self.userGRLFiles:
86  alg.Tool.GoodRunsListVec = self.userGRLFiles
87  else:
88  alg.Tool.GoodRunsListVec = self.getDefaultGRLs( config.dataYear() )
89 
90  # Skip events with no primary vertex:
91  if self.runPrimaryVertexSelection:
92  alg = config.createAlgorithm( 'CP::VertexSelectionAlg',
93  'PrimaryVertexSelectorAlg' )
94  alg.VertexContainer = 'PrimaryVertices'
95  alg.MinVertices = 1
96  alg.MinTracks = self.minTracksPerVertex
97 
98  # Set up the event cleaning selection:
99  if self.runEventCleaning:
100  if config.dataType() is DataType.Data:
101  alg = config.createAlgorithm( 'CP::EventStatusSelectionAlg', 'EventStatusSelectionAlg' )
102  alg.FilterKey = 'EventErrorState'
103  alg.FilterDescription = 'selecting events without any error state set'
104 
105  alg = config.createAlgorithm( 'CP::EventFlagSelectionAlg', 'EventFlagSelectionAlg' )
106  alg.FilterKey = 'JetCleaning'
107  alg.selectionFlags = [f'{sel},as_char' for sel in self.selectionFlags]
108  alg.invertFlags = self.invertFlags
109  alg.FilterDescription = f"selecting events passing: {','.join(alg.selectionFlags)}"
110 
111 
112 
python.EventCleaningConfig.EventCleaningBlock.__init__
def __init__(self)
Definition: EventCleaningConfig.py:11
python.GoodRunsListsDictionary.getGoodRunsLists
def getGoodRunsLists()
Definition: GoodRunsListsDictionary.py:3
python.EventCleaningConfig.EventCleaningBlock
Definition: EventCleaningConfig.py:8
python.EventCleaningConfig.EventCleaningBlock.makeAlgs
def makeAlgs(self, config)
Definition: EventCleaningConfig.py:62
python.EventCleaningConfig.EventCleaningBlock.getDefaultGRLs
def getDefaultGRLs(self, data_year)
Definition: EventCleaningConfig.py:42
TrigJetMonitorAlgorithm.items
items
Definition: TrigJetMonitorAlgorithm.py:79