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