ATLAS Offline Software
FullCPAlgorithmsTest.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2 #
3 # @author Nils Krumnack
4 
5 from AnaAlgorithm.AlgSequence import AlgSequence
6 from AnalysisAlgorithmsConfig.ConfigSequence import ConfigSequence
7 from AnalysisAlgorithmsConfig.ConfigAccumulator import ConfigAccumulator, DataType
8 from AthenaConfiguration.Enums import LHCPeriod
9 from AthenaCommon.SystemOfUnits import GeV
10 
11 # Config:
12 triggerChainsPerYear = {
13  2015: ['HLT_e24_lhmedium_L1EM20VH || HLT_e60_lhmedium || HLT_e120_lhloose', 'HLT_mu20_iloose_L1MU15 || HLT_mu40', 'HLT_2g20_tight'],
14  2016: ['HLT_e26_lhtight_nod0_ivarloose || HLT_e60_lhmedium_nod0 || HLT_e140_lhloose_nod0', 'HLT_mu26_ivarmedium || HLT_mu50', 'HLT_g35_loose_g25_loose'],
15  2017: ['HLT_e26_lhtight_nod0_ivarloose || HLT_e60_lhmedium_nod0 || HLT_e140_lhloose_nod0', 'HLT_2g22_tight_L12EM15VHI', 'HLT_mu50'],
16  2018: ['HLT_e26_lhtight_nod0_ivarloose || HLT_e60_lhmedium_nod0 || HLT_e140_lhloose_nod0', 'HLT_g35_medium_g25_medium_L12EM20VH', 'HLT_mu26_ivarmedium', 'HLT_2mu14'],
17  # '2022': ['HLT_e26_lhtight_ivarloose_L1EM22VHI || HLT_e60_lhmedium_L1EM22VHI || HLT_e140_lhloose_L1EM22VHI'],
18  # '2023': ['HLT_e26_lhtight_ivarloose_L1EM22VHI || HLT_e60_lhmedium_L1EM22VHI || HLT_e140_lhloose_L1EM22VHI'],
19 }
20 triggerMatchingChainsPerYear = {
21  2015: ['HLT_e24_lhmedium_L1EM20VH || HLT_e60_lhmedium || HLT_e120_lhloose', 'HLT_mu20_iloose_L1MU15 || HLT_mu40'],
22  2016: ['HLT_e26_lhtight_nod0_ivarloose || HLT_e60_lhmedium_nod0 || HLT_e140_lhloose_nod0', 'HLT_mu26_ivarmedium || HLT_mu50'],
23  2017: ['HLT_e26_lhtight_nod0_ivarloose || HLT_e60_lhmedium_nod0 || HLT_e140_lhloose_nod0', 'HLT_mu50'],
24  2018: ['HLT_e26_lhtight_nod0_ivarloose || HLT_e60_lhmedium_nod0 || HLT_e140_lhloose_nod0', 'HLT_mu26_ivarmedium'],
25 }
26 tauTriggerChainsSF = {
27  2015: ['HLT_tau25_medium1_tracktwo', 'HLT_tau35_medium1_tracktwo'],
28  2016: ['HLT_tau25_medium1_tracktwo', 'HLT_tau35_medium1_tracktwo'],
29  2017: ['HLT_tau25_medium1_tracktwo', 'HLT_tau35_medium1_tracktwo'],
30  2018: ['HLT_tau25_medium1_tracktwoEF', 'HLT_tau35_medium1_tracktwoEF'],
31  2022: ['HLT_tau25_mediumRNN_tracktwoMVA', 'HLT_tau35_mediumRNN_tracktwoMVA'],
32  2023: ['HLT_tau25_mediumRNN_tracktwoMVA', 'HLT_tau35_mediumRNN_tracktwoMVA'],
33 }
34 bjetTriggerChainsPerYear = {
35  2022: ['HLT_2j45_0eta290_020jvt_bdl1d60_2j45_pf_ftf_presel2j25XX2j25b85_L14J15p0ETA25'],
36  2023: ['HLT_2j45_0eta290_020jvt_bgn160_2j45_pf_ftf_presel2j25XX2j25b85_L14J15p0ETA25'],
37  2024: ['HLT_2j45_0eta290_020jvt_bgn260_2j45_pf_ftf_presel2j25XX2j25bgtwo85_L14jJ40p0ETA25'],
38 }
39 
40 # Example cuts used for event selection algorithm test
41 exampleSelectionCuts = {
42  'SUBcommon': """JET_N_BTAG >= 2
43 JET_N 25000 >= 4
44 MET >= 20000
45 SAVE
46 """,
47  'ejets': """IMPORT SUBcommon
48 EL_N 5000 == 1
49 MU_N 3000 == 0
50 MWT < 170000
51 MET+MWT > 40000
52 SAVE
53 """,
54  'mujets': """IMPORT SUBcommon
55 EL_N 5000 == 0
56 MU_N medium 25000 > 0
57 SAVE
58 """
59 }
60 
61 electronMinPt = 10*GeV
62 photonMinPt = 10*GeV
63 
64 
65 def makeTestSequenceBlocks (dataType, algSeq, isPhyslite,
66  geometry=None, autoconfigFromFlags=None, noSystematics=None,
67  onlyNominalOR=False, forceEGammaFullSimConfig=False,
68  returnConfigSeq=False,
69  bleedingEdge=False # Enabled for CI tests running on new derivations from derivation CI output
70  ) :
71 
72  largeRJets = True
73 
74  if autoconfigFromFlags is not None:
75  if geometry is None:
76  geometry = autoconfigFromFlags.GeoModel.Run
77 
78  configSeq = ConfigSequence ()
79 
80  outputContainers = {'mu_' : 'OutMuons',
81  'el_' : 'OutElectrons',
82  'ph_' : 'OutPhotons',
83  'tau_': 'OutTauJets',
84  'jet_': 'OutJets',
85  'met_': 'AnaMET',
86  '' : 'EventInfo'}
87  outputContainersForMC = {'truth_mu_' : 'OutTruthMuons',
88  'truth_el_' : 'OutTruthElectrons',
89  'truth_ph_' : 'OutTruthPhotons',
90  'truth_tau_': 'OutTruthTaus',
91  'truth_jet_': 'OutTruthJets',
92  'truth_met_': 'TruthMET'}
93 
94  # create factory object to build block configurations
95  from AnalysisAlgorithmsConfig.ConfigFactory import ConfigFactory
96  config = ConfigFactory()
97 
98  configSeq += config.makeConfig('CommonServices')
99  configSeq.setOptionValue('.systematicsHistogram', 'systematicsList')
100 
101  configSeq += config.makeConfig('PileupReweighting')
102 
103  # Skip events with no primary vertex,
104  # and perform loose jet cleaning
105  configSeq += config.makeConfig ('EventCleaning')
106  configSeq.setOptionValue ('.runEventCleaning', True)
107 
108  # disabling comparisons for triggers, because the config blocks do a
109  # lot more than the sequences. Also disabling for Run 3+4, as there is no SF yet
110  if geometry is LHCPeriod.Run2:
111  # Include, and then set up the trigger analysis sequence:
112  configSeq += config.makeConfig( 'Trigger' )
113  configSeq.setOptionValue ('.triggerChainsPerYear', triggerChainsPerYear )
114  configSeq.setOptionValue ('.noFilter', True )
115  configSeq.setOptionValue ('.electrons', 'AnaElectrons.loose' )
116  configSeq.setOptionValue ('.photons', 'AnaPhotons.tight' )
117  configSeq.setOptionValue ('.muons', 'AnaMuons.medium' )
118  configSeq.setOptionValue ('.taus', 'AnaTauJets.tight' )
119  configSeq.setOptionValue ('.electronID', 'Tight' )
120  configSeq.setOptionValue ('.electronIsol', 'Tight_VarRad')
121  configSeq.setOptionValue ('.photonIsol', 'TightCaloOnly')
122  configSeq.setOptionValue ('.muonID', 'Tight')
123  configSeq.setOptionValue ('.triggerMatchingChainsPerYear', triggerMatchingChainsPerYear)
124 
125  # Include, and then set up the jet analysis algorithm sequence:
126  configSeq += config.makeConfig( 'Jets',
127  containerName='AnaJets',
128  jetCollection='AntiKt4EMPFlowJets')
129  configSeq.setOptionValue ('.runJvtUpdate', False )
130  configSeq.setOptionValue ('.runNNJvtUpdate', True )
131  configSeq.setOptionValue ('.recalibratePhyslite', False)
132 
133  configSeq += config.makeConfig( 'Jets.JVT' )
134  configSeq.setOptionValue ('.containerName', 'AnaJets')
135 
136  configSeq += config.makeConfig( 'Jets.FTagTriggerMatching' )
137  configSeq.setOptionValue('.containerName', 'AnaJets')
138  configSeq.setOptionValue('.triggerChainsPerYear', bjetTriggerChainsPerYear)
139 
140  # disabling flavor tagging for Run 4, as the configuration just
141  # refuses to work on that
142  if geometry is not LHCPeriod.Run4:
143 
144  btagger = "GN2v01"
145  btagWP = "FixedCutBEff_65"
146  configSeq += config.makeConfig( 'Jets.FlavourTagging' )
147  configSeq.setOptionValue ('.containerName', 'AnaJets')
148  configSeq.setOptionValue ('.selectionName', 'ftag')
149  configSeq.setOptionValue ('.btagger', btagger)
150  configSeq.setOptionValue ('.btagWP', btagWP)
151  configSeq.setOptionValue ('.saveScores', 'All')
152 
153  configSeq += config.makeConfig( 'Jets.FlavourTaggingEventSF' )
154  configSeq.setOptionValue ('.containerName', 'AnaJets.baselineJvt')
155  configSeq.setOptionValue ('.btagger', btagger)
156 
157  if largeRJets :
158  configSeq += config.makeConfig( 'Jets',
159  containerName='AnaLargeRJets',
160  jetCollection='AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets' )
161  outputContainers['larger_jet_'] = 'OutLargeRJets'
162  configSeq.setOptionValue ('.recalibratePhyslite', False)
163 
164 
165  # Include, and then set up the electron analysis algorithm sequence:
166  likelihood = True
167  configSeq += config.makeConfig ('Electrons')
168  configSeq.setOptionValue ('.containerName', 'AnaElectrons')
169  configSeq.setOptionValue ('.decorateTruth', True)
170  configSeq.setOptionValue ('.decorateCaloClusterEta', True)
171  configSeq.setOptionValue ('.writeTrackD0Z0', True)
172  configSeq.setOptionValue ('.forceFullSimConfigForIso', forceEGammaFullSimConfig)
173  configSeq.setOptionValue ('.recalibratePhyslite', False)
174  configSeq.setOptionValue ('.minPt', electronMinPt)
175  configSeq += config.makeConfig ('Electrons.WorkingPoint')
176  configSeq.setOptionValue ('.containerName', 'AnaElectrons')
177  configSeq.setOptionValue ('.selectionName', 'loose')
178  configSeq.setOptionValue ('.forceFullSimConfig', forceEGammaFullSimConfig)
179  if likelihood:
180  configSeq.setOptionValue ('.identificationWP', 'LooseBLayerLH')
181  else:
182  configSeq.setOptionValue ('.identificationWP', 'LooseDNN')
183  configSeq.setOptionValue ('.isolationWP', 'Tight_VarRad')
184  configSeq.setOptionValue ('.chargeIDSelectionRun2', True)
185  configSeq.setOptionValue ('.addChargeMisIDSF', geometry is LHCPeriod.Run2)
186 
187  configSeq += config.makeConfig ('Electrons.IFFClassification')
188  configSeq.setOptionValue ('.containerName', 'AnaElectrons')
189  configSeq += config.makeConfig ('Electrons.MCTCClassification')
190  configSeq.setOptionValue ('.containerName', 'AnaElectrons')
191  configSeq.setOptionValue ('.prefix', 'truth_')
192 
193  configSeq += config.makeConfig ('Electrons.PtEtaSelection')
194  configSeq.setOptionValue ('.containerName', 'AnaElectrons')
195  configSeq.setOptionValue ('.minPt', electronMinPt)
196 
197 
198  # Include, and then set up the photon analysis algorithm sequence:
199  configSeq += config.makeConfig ('Photons')
200  configSeq.setOptionValue ('.containerName', 'AnaPhotons')
201  configSeq.setOptionValue ('.decorateTruth', True)
202  configSeq.setOptionValue ('.forceFullSimConfigForIso', forceEGammaFullSimConfig)
203  configSeq.setOptionValue ('.recomputeIsEM', False)
204  configSeq.setOptionValue ('.recalibratePhyslite', False)
205  configSeq += config.makeConfig ('Photons.WorkingPoint')
206  configSeq.setOptionValue ('.containerName', 'AnaPhotons')
207  configSeq.setOptionValue ('.selectionName', 'tight')
208  configSeq.setOptionValue ('.forceFullSimConfigForID', forceEGammaFullSimConfig)
209  configSeq.setOptionValue ('.forceFullSimConfigForIso', forceEGammaFullSimConfig)
210  configSeq.setOptionValue ('.qualityWP', 'Tight')
211  configSeq.setOptionValue ('.isolationWP', 'FixedCutTight')
212  configSeq.setOptionValue ('.recomputeIsEM', False)
213 
214  configSeq += config.makeConfig ('Photons.PtEtaSelection')
215  configSeq.setOptionValue ('.containerName', 'AnaPhotons')
216  configSeq.setOptionValue ('.minPt', photonMinPt)
217 
218 
219  # set up the muon analysis algorithm sequence:
220  configSeq += config.makeConfig ('Muons')
221  configSeq.setOptionValue ('.containerName', 'AnaMuons')
222  configSeq.setOptionValue ('.decorateTruth', True)
223  configSeq.setOptionValue ('.writeTrackD0Z0', True)
224  configSeq.setOptionValue ('.recalibratePhyslite', False)
225 
226  configSeq += config.makeConfig ('Muons.WorkingPoint')
227  configSeq.setOptionValue ('.containerName', 'AnaMuons')
228  configSeq.setOptionValue ('.selectionName', 'medium')
229  configSeq.setOptionValue ('.quality', 'Medium')
230  configSeq.setOptionValue ('.isolation', 'Loose_VarRad')
231 
232  configSeq += config.makeConfig ('Muons.IFFClassification')
233  configSeq.setOptionValue ('.containerName', 'AnaMuons')
234  configSeq += config.makeConfig ('Muons.MCTCClassification')
235  configSeq.setOptionValue ('.containerName', 'AnaMuons')
236  configSeq.setOptionValue ('.prefix', 'truth_')
237 
238 
239  # TODO: MCP should restore this when the recommendations for Tight WP exist in R23
240  # configSeq += config.makeConfig ('Muons.Selection', 'AnaMuons.tight')
241  # configSeq.setOptionValue ('.quality', 'Tight')
242  # configSeq.setOptionValue ('.isolation', 'Loose_VarRad')
243 
244  # Include, and then set up the tau analysis algorithm sequence:
245  configSeq += config.makeConfig ('TauJets')
246  configSeq.setOptionValue ('.containerName', 'AnaTauJets')
247  configSeq.setOptionValue ('.decorateTruth', True)
248  configSeq += config.makeConfig ('TauJets.WorkingPoint')
249  configSeq.setOptionValue ('.containerName', 'AnaTauJets')
250  configSeq.setOptionValue ('.selectionName', 'tight')
251  configSeq.setOptionValue ('.quality', 'Tight')
252 
253  configSeq += config.makeConfig('TauJets.TriggerSF')
254  configSeq.setOptionValue('.containerName', 'AnaTauJets')
255  configSeq.setOptionValue('.tauID', 'Tight')
256  configSeq.setOptionValue('.triggerChainsPerYear', tauTriggerChainsSF)
257 
258  configSeq += config.makeConfig ('TauJets.MCTCClassification')
259  configSeq.setOptionValue ('.containerName', 'AnaTauJets')
260  configSeq.setOptionValue ('.prefix', 'truth_')
261 
262 
263  # Add systematic object links
264  configSeq += config.makeConfig('SystObjectLink')
265  configSeq.setOptionValue ('.containerName', 'AnaJets')
266  if largeRJets:
267  configSeq += config.makeConfig('SystObjectLink')
268  configSeq.setOptionValue ('.containerName', 'AnaLargeRJets')
269  configSeq += config.makeConfig('SystObjectLink')
270  configSeq.setOptionValue ('.containerName', 'AnaElectrons')
271  configSeq += config.makeConfig('SystObjectLink')
272  configSeq.setOptionValue ('.containerName', 'AnaPhotons')
273  configSeq += config.makeConfig('SystObjectLink')
274  configSeq.setOptionValue ('.containerName', 'AnaMuons')
275  configSeq += config.makeConfig('SystObjectLink')
276  configSeq.setOptionValue ('.containerName', 'AnaTauJets')
277 
278 
279  # Particle-level objects
280  configSeq += config.makeConfig ('PL_Electrons')
281  configSeq.setOptionValue ('.containerName', 'TruthElectrons')
282  configSeq += config.makeConfig ('PL_Electrons.MCTCClassification')
283  configSeq.setOptionValue ('.containerName', 'TruthElectrons')
284  configSeq.setOptionValue ('.prefix', '')
285  configSeq += config.makeConfig ('PL_Electrons.PtEtaSelection')
286  configSeq.setOptionValue ('.containerName', 'TruthElectrons')
287  configSeq.setOptionValue ('.skipOnData', True)
288  configSeq.setOptionValue ('.useDressedProperties', True)
289  configSeq.setOptionValue ('.minPt', 20e3)
290 
291  configSeq += config.makeConfig ('PL_Muons')
292  configSeq.setOptionValue ('.containerName', 'TruthMuons')
293  configSeq += config.makeConfig ('PL_Muons.MCTCClassification')
294  configSeq.setOptionValue ('.containerName', 'TruthMuons')
295  configSeq.setOptionValue ('.prefix', '')
296  configSeq += config.makeConfig ('PL_Muons.PtEtaSelection')
297  configSeq.setOptionValue ('.containerName', 'TruthMuons')
298  configSeq.setOptionValue ('.skipOnData', True)
299  configSeq.setOptionValue ('.useDressedProperties', True)
300  configSeq.setOptionValue ('.minPt', 20e3)
301 
302  configSeq += config.makeConfig ('PL_Neutrinos')
303  configSeq.setOptionValue ('.skipOnData', True)
304 
305  configSeq += config.makeConfig ('PL_Jets')
306  configSeq.setOptionValue ('.containerName', 'AntiKt4TruthDressedWZJets')
307  configSeq += config.makeConfig ('PL_Jets.PtEtaSelection')
308  configSeq.setOptionValue ('.containerName', 'AntiKt4TruthDressedWZJets')
309  configSeq.setOptionValue ('.skipOnData', True)
310  configSeq.setOptionValue ('.minPt', 20e3)
311 
312  configSeq += config.makeConfig ('PL_Taus')
313  configSeq.setOptionValue ('.containerName', 'TruthTaus')
314  configSeq += config.makeConfig ('PL_Taus.MCTCClassification')
315  configSeq.setOptionValue ('.containerName', 'TruthTaus')
316  configSeq.setOptionValue ('.prefix', '')
317  configSeq += config.makeConfig ('PL_Taus.PtEtaSelection')
318  configSeq.setOptionValue ('.containerName', 'TruthTaus')
319  configSeq.setOptionValue ('.skipOnData', True)
320  configSeq.setOptionValue ('.minPt', 20e3)
321 
322  configSeq += config.makeConfig ('PL_Photons')
323  configSeq.setOptionValue ('.containerName', 'TruthPhotons')
324  configSeq += config.makeConfig ('PL_Photons.PtEtaSelection')
325  configSeq.setOptionValue ('.containerName', 'TruthPhotons')
326  configSeq.setOptionValue ('.skipOnData', True)
327  configSeq.setOptionValue ('.minPt', 20e3)
328 
329  configSeq += config.makeConfig ('PL_MissingET')
330  configSeq.setOptionValue ('.skipOnData', True)
331 
332  configSeq += config.makeConfig ('PL_OverlapRemoval')
333  configSeq.setOptionValue ('.skipOnData', True)
334  configSeq.setOptionValue ('.electrons', 'TruthElectrons')
335  configSeq.setOptionValue ('.muons', 'TruthMuons')
336  configSeq.setOptionValue ('.photons', 'TruthPhotons')
337  configSeq.setOptionValue ('.jets', 'AntiKt4TruthDressedWZJets')
338  configSeq.setOptionValue ('.useRapidityForDeltaR', False)
339 
340 
341  if dataType is not DataType.Data :
342  # Include, and then set up the generator analysis sequence:
343  configSeq += config.makeConfig( 'GeneratorLevelAnalysis')
344 
345 
346  # Include, and then set up the met analysis algorithm config:
347  configSeq += config.makeConfig ('MissingET')
348  configSeq.setOptionValue ('.containerName', 'AnaMET')
349  configSeq.setOptionValue ('.jets', 'AnaJets')
350  configSeq.setOptionValue ('.taus', 'AnaTauJets.tight')
351  configSeq.setOptionValue ('.electrons', 'AnaElectrons.loose')
352  configSeq.setOptionValue ('.photons', 'AnaPhotons.tight')
353  # Note that the configuration for the muons is not what you'd
354  # normally do. This is specifically here because this is a unit
355  # test and I wanted to make sure that selection expressions work.
356  # For an actual analysis that would just be `AnaMuons.medium`, but
357  # since `tight` is a strict subset of `medium` it doesn't matter
358  # if we do an "or" of the two.
359  # TODO: MCP should restore this when the recommendations for Tight WP exist in R23
360  # configSeq.setOptionValue ('.muons', 'AnaMuons.medium||tight')
361  configSeq.setOptionValue ('.muons', 'AnaMuons.medium')
362 
363 
364  # Include, and then set up the overlap analysis algorithm config:
365  configSeq += config.makeConfig( 'OverlapRemoval' )
366  configSeq.setOptionValue ('.electrons', 'AnaElectrons.loose')
367  configSeq.setOptionValue ('.photons', 'AnaPhotons.tight')
368  # TODO: MCP should restore this when the recommendations for Tight WP exist in R23
369  # configSeq.setOptionValue ('.muons', 'AnaMuons.medium||tight')
370  configSeq.setOptionValue ('.muons', 'AnaMuons.medium')
371  configSeq.setOptionValue ('.jets', 'AnaJets.baselineJvt')
372  configSeq.setOptionValue ('.taus', 'AnaTauJets.tight')
373  configSeq.setOptionValue ('.inputLabel', 'preselectOR')
374  configSeq.setOptionValue ('.outputLabel', 'passesOR' )
375  configSeq.setOptionValue ('.nominalOnly', onlyNominalOR )
376 
377 
378  # ObjectCutFlow blocks
379  configSeq += config.makeConfig ('ObjectCutFlow')
380  configSeq.setOptionValue ('.containerName', 'AnaJets')
381  configSeq.setOptionValue ('.selectionName', 'jvt')
382  configSeq += config.makeConfig ('ObjectCutFlow')
383  configSeq.setOptionValue ('.containerName', 'AnaElectrons')
384  configSeq.setOptionValue ('.selectionName', 'loose')
385  configSeq += config.makeConfig ('ObjectCutFlow')
386  configSeq.setOptionValue ('.containerName', 'AnaPhotons')
387  configSeq.setOptionValue ('.selectionName', 'tight')
388  configSeq += config.makeConfig ('ObjectCutFlow')
389  configSeq.setOptionValue ('.containerName', 'AnaMuons')
390  configSeq.setOptionValue ('.selectionName', 'medium')
391  configSeq += config.makeConfig ('ObjectCutFlow')
392  configSeq.setOptionValue ('.containerName', 'AnaTauJets')
393  configSeq.setOptionValue ('.selectionName', 'tight')
394 
395  # Include and set up a basic run of the event selection algorithm config:
396  if geometry is not LHCPeriod.Run4:
397  # configSeq += config.makeConfig( 'EventSelection', None )
398  # configSeq.setOptionValue ('.electrons', 'AnaElectrons.loose')
399  # configSeq.setOptionValue ('.muons', 'AnaMuons.medium')
400  # configSeq.setOptionValue ('.jets', 'AnaJets')
401  # configSeq.setOptionValue ('.met', 'AnaMET')
402  # configSeq.setOptionValue ('.selectionCutsDict', exampleSelectionCuts)
403  from EventSelectionAlgorithms.EventSelectionConfig import makeMultipleEventSelectionConfigs
404  makeMultipleEventSelectionConfigs(configSeq, electrons = 'AnaElectrons.loose', muons = 'AnaMuons.medium', jets = 'AnaJets.baselineJvt',
405  met = 'AnaMET', btagDecoration = 'ftag_select_ftag',
406  selectionCutsDict = exampleSelectionCuts, noFilter = True,
407  cutFlowHistograms = True)
408 
409  configSeq += config.makeConfig ('Bootstraps')
410  configSeq.setOptionValue ('.nReplicas', 2000 )
411  configSeq.setOptionValue ('.skipOnMC', False)
412 
413  # per-event lepton SF
414  configSeq += config.makeConfig ('LeptonSF')
415  if geometry is not LHCPeriod.Run2:
416  configSeq.setOptionValue ('.electrons', 'AnaElectrons.loose')
417  configSeq.setOptionValue ('.muons', 'AnaMuons.medium')
418  configSeq.setOptionValue ('.photons', 'AnaPhotons.tight')
419  configSeq.setOptionValue ('.lepton_postfix', 'nominal')
420 
421  # Thinning blocks
422  configSeq += config.makeConfig ('Thinning')
423  configSeq.setOptionValue ('.containerName', 'AnaElectrons')
424  configSeq.setOptionValue ('.selectionName', 'loose')
425  configSeq.setOptionValue ('.outputName', 'OutElectrons')
426  configSeq += config.makeConfig ('Thinning')
427  configSeq.setOptionValue ('.containerName', 'AnaPhotons')
428  configSeq.setOptionValue ('.selectionName', 'tight')
429  configSeq.setOptionValue ('.outputName', 'OutPhotons')
430  configSeq += config.makeConfig ('Thinning')
431  configSeq.setOptionValue ('.containerName', 'AnaMuons')
432  configSeq.setOptionValue ('.selectionName', 'medium')
433  configSeq.setOptionValue ('.outputName', 'OutMuons')
434  configSeq += config.makeConfig ('Thinning')
435  configSeq.setOptionValue ('.containerName', 'AnaTauJets')
436  configSeq.setOptionValue ('.selectionName', 'tight')
437  configSeq.setOptionValue ('.outputName', 'OutTauJets')
438  configSeq += config.makeConfig ('Thinning')
439  configSeq.setOptionValue ('.containerName', 'AnaJets')
440  configSeq.setOptionValue ('.outputName', 'OutJets')
441  if largeRJets :
442  configSeq += config.makeConfig ('Thinning')
443  configSeq.setOptionValue ('.containerName', 'AnaLargeRJets')
444  configSeq.setOptionValue ('.outputName', 'OutLargeRJets')
445 
446  configSeq += config.makeConfig ('Thinning')
447  configSeq.setOptionValue ('.containerName', 'TruthElectrons')
448  configSeq.setOptionValue ('.skipOnData', True)
449  configSeq.setOptionValue ('.outputName', 'OutTruthElectrons')
450  configSeq += config.makeConfig ('Thinning')
451  configSeq.setOptionValue ('.containerName', 'TruthPhotons')
452  configSeq.setOptionValue ('.skipOnData', True)
453  configSeq.setOptionValue ('.outputName', 'OutTruthPhotons')
454  configSeq += config.makeConfig ('Thinning')
455  configSeq.setOptionValue ('.containerName', 'TruthMuons')
456  configSeq.setOptionValue ('.skipOnData', True)
457  configSeq.setOptionValue ('.outputName', 'OutTruthMuons')
458  configSeq += config.makeConfig ('Thinning')
459  configSeq.setOptionValue ('.containerName', 'TruthTaus')
460  configSeq.setOptionValue ('.skipOnData', True)
461  configSeq.setOptionValue ('.outputName', 'OutTruthTaus')
462  configSeq += config.makeConfig ('Thinning')
463  configSeq.setOptionValue ('.containerName', 'AntiKt4TruthDressedWZJets')
464  configSeq.setOptionValue ('.outputName', 'OutTruthJets')
465  configSeq.setOptionValue ('.skipOnData', True)
466 
467  configSeq += config.makeConfig ('Output')
468  configSeq.setOptionValue ('.treeName', 'analysis')
469  configSeq.setOptionValue ('.vars', [
470  'EventInfo.actualInteractionsPerCrossing -> actualMuScaled',
471  ])
472  configSeq.setOptionValue ('.metVars', [
473  'AnaMET_%SYS%.met -> met_%SYS%',
474  ])
475  configSeq.setOptionValue ('.truthMetVars', [
476  'TruthMET_NOSYS.met -> truth_met',
477  ])
478  configSeq.setOptionValue ('.containers', outputContainers)
479  configSeq.setOptionValue ('.containersOnlyForMC', outputContainersForMC)
480  configSeq.setOptionValue ('.commands', [
481  'disable actualInteractionsPerCrossing',
482  ])
483 
484  # save the tool configuration to a txt file
485  configSeq += config.makeConfig ('PrintConfiguration')
486 
487  # return configSeq for unit test
488  if returnConfigSeq:
489  return configSeq
490 
491  configAccumulator = ConfigAccumulator (algSeq=algSeq, flags=autoconfigFromFlags, noSystematics=noSystematics)
492  configSeq.fullConfigure (configAccumulator)
493 
494  # order can change during fullConfigure
495  configSeq.printOptions()
496 
497  from AnaAlgorithm.DualUseConfig import isAthena, useComponentAccumulator
498  if isAthena and useComponentAccumulator:
499  return configAccumulator.CA
500  else:
501  return None
502 
503 
504 
505 def printSequenceAlgs (sequence) :
506  """print the algorithms in the sequence without the sequence structure
507 
508  This is mostly meant for easy comparison of different sequences
509  during configuration, particularly the sequences resulting from
510  the old sequence configuration and the new block configuration.
511  Those have different sequence structures in the output, but the
512  algorithms should essentially be configured the same way."""
513  if isinstance (sequence, AlgSequence) :
514  for alg in sequence :
515  printSequenceAlgs (alg)
516  else :
517  # assume this is an algorithm then
518  print (sequence)
519 
520 
521 def makeSequence (dataType, noSystematics,
522  yamlPath=None,
523  isPhyslite = False, geometry = None,
524  autoconfigFromFlags = None, onlyNominalOR = False,
525  forceEGammaFullSimConfig = False,
526  bleedingEdge = False) :
527 
528  algSeq = AlgSequence('AnalysisSequence')
529 
530  ca = None
531  if not yamlPath:
532  ca = makeTestSequenceBlocks (dataType, algSeq,
533  isPhyslite=isPhyslite,
534  geometry=geometry, onlyNominalOR=onlyNominalOR,
535  autoconfigFromFlags=autoconfigFromFlags,
536  noSystematics=noSystematics,
537  forceEGammaFullSimConfig=forceEGammaFullSimConfig,
538  bleedingEdge=bleedingEdge)
539  else:
540  from AnalysisAlgorithmsConfig.ConfigText import makeSequence as makeSequenceText
541  ca = makeSequenceText(yamlPath, algSeq=algSeq, flags=autoconfigFromFlags,
542  noSystematics=noSystematics)
543 
544  if ca is not None:
545  return ca
546  else:
547  return algSeq
SystemOfUnits
python.FullCPAlgorithmsTest.makeSequence
def makeSequence(dataType, noSystematics, yamlPath=None, isPhyslite=False, geometry=None, autoconfigFromFlags=None, onlyNominalOR=False, forceEGammaFullSimConfig=False, bleedingEdge=False)
Definition: FullCPAlgorithmsTest.py:521
python.AlgSequence.AlgSequence
AlgSequence
Definition: PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/AlgSequence.py:7
python.FullCPAlgorithmsTest.makeTestSequenceBlocks
def makeTestSequenceBlocks(dataType, algSeq, isPhyslite, geometry=None, autoconfigFromFlags=None, noSystematics=None, onlyNominalOR=False, forceEGammaFullSimConfig=False, returnConfigSeq=False, bleedingEdge=False # Enabled for CI tests running on new derivations from derivation CI output)
Definition: FullCPAlgorithmsTest.py:65
python.EventSelectionConfig.makeMultipleEventSelectionConfigs
def makeMultipleEventSelectionConfigs(seq, electrons=None, muons=None, jets=None, largeRjets=None, photons=None, taus=None, met=None, metTerm=None, btagDecoration=None, preselection=None, selectionCutsDict=None, noFilter=None, debugMode=None, cutFlowHistograms=None)
Definition: EventSelectionConfig.py:983
python.FullCPAlgorithmsTest.printSequenceAlgs
def printSequenceAlgs(sequence)
Definition: FullCPAlgorithmsTest.py:505