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,
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 ('.recalibratePhyslite', False)
200 configSeq.setOptionValue ('.minPt', electronMinPt)
201 configSeq += config.makeConfig ('Electrons.WorkingPoint')
202 configSeq.setOptionValue ('.containerName', 'AnaElectrons')
203 configSeq.setOptionValue ('.selectionName', 'loose')
204 if likelihood:
205 configSeq.setOptionValue ('.identificationWP', 'LooseBLayerLH')
206 else:
207 configSeq.setOptionValue ('.identificationWP', 'LooseDNN')
208 configSeq.setOptionValue ('.isolationWP', 'Tight_VarRad')
209 configSeq.setOptionValue ('.chargeIDSelectionRun2', True)
210 configSeq.setOptionValue ('.addChargeMisIDSF', geometry is LHCPeriod.Run2)
211 configSeq += config.makeConfig('Electrons.TriggerSF')
212 configSeq.setOptionValue('.containerName', 'AnaElectrons')
213 configSeq.setOptionValue('.electronID', 'LooseBLayerLH')
214 configSeq.setOptionValue('.electronIsol', 'Tight_VarRad')
215 configSeq.setOptionValue('.triggerChainsPerYear', triggerChainsPerYear)
216
217 configSeq += config.makeConfig ('Electrons.IFFClassification')
218 configSeq.setOptionValue ('.containerName', 'AnaElectrons')
219 configSeq += config.makeConfig ('Electrons.MCTCClassification')
220 configSeq.setOptionValue ('.containerName', 'AnaElectrons')
221 configSeq.setOptionValue ('.prefix', 'truth_')
222
223 configSeq += config.makeConfig ('Electrons.PtEtaSelection')
224 configSeq.setOptionValue ('.containerName', 'AnaElectrons')
225 configSeq.setOptionValue ('.minPt', electronMinPt)
226
227
228 # Include, and then set up the photon analysis algorithm sequence:
229 configSeq += config.makeConfig ('Photons')
230 configSeq.setOptionValue ('.containerName', 'AnaPhotons')
231 configSeq.setOptionValue ('.decorateTruth', True)
232 configSeq.setOptionValue ('.recomputeIsEM', False)
233 configSeq.setOptionValue ('.recalibratePhyslite', False)
234 configSeq += config.makeConfig ('Photons.WorkingPoint')
235 configSeq.setOptionValue ('.containerName', 'AnaPhotons')
236 configSeq.setOptionValue ('.selectionName', 'tight')
237 configSeq.setOptionValue ('.qualityWP', 'Tight')
238 configSeq.setOptionValue ('.isolationWP', 'FixedCutTight')
239 configSeq.setOptionValue ('.recomputeIsEM', False)
240
241 configSeq += config.makeConfig ('Photons.PtEtaSelection')
242 configSeq.setOptionValue ('.containerName', 'AnaPhotons')
243 configSeq.setOptionValue ('.minPt', photonMinPt)
244
245
246 # TODO: MCP should restore this when the recommendations for Tight WP exist in R23
247 # configSeq += config.makeConfig ('Muons.Selection', 'AnaMuons.tight')
248 # configSeq.setOptionValue ('.quality', 'Tight')
249 # configSeq.setOptionValue ('.isolation', 'Loose_VarRad')
250
251 # Include, and then set up the tau analysis algorithm sequence:
252 configSeq += config.makeConfig ('TauJets')
253 configSeq.setOptionValue ('.containerName', 'AnaTauJets')
254 configSeq.setOptionValue ('.decorateTruth', True)
255 configSeq += config.makeConfig ('TauJets.WorkingPoint')
256 configSeq.setOptionValue ('.containerName', 'AnaTauJets')
257 configSeq.setOptionValue ('.selectionName', 'tight')
258 configSeq.setOptionValue ('.quality', 'Tight')
259
260 configSeq += config.makeConfig('TauJets.TriggerSF')
261 configSeq.setOptionValue('.containerName', 'AnaTauJets')
262 configSeq.setOptionValue('.tauID', 'Tight')
263 configSeq.setOptionValue('.triggerChainsPerYear', tauTriggerChainsSF)
264
265 configSeq += config.makeConfig ('TauJets.MCTCClassification')
266 configSeq.setOptionValue ('.containerName', 'AnaTauJets')
267 configSeq.setOptionValue ('.prefix', 'truth_')
268
269
270 # Include, and then set up the tracks analysis algorithm sequence:
271 configSeq += config.makeConfig ('InDetTracks')
272 configSeq.setOptionValue ('.containerName', 'AnaTracks')
273 configSeq.setOptionValue ('.minPt', 500)
274 configSeq.setOptionValue ('.maxEta', 2.5)
275 configSeq.setOptionValue ('.outputTrackSummaryInfo', True)
276
277 configSeq += config.makeConfig ('InDetTracks.WorkingPoint')
278 configSeq.setOptionValue ('.containerName', 'AnaTracks')
279 configSeq.setOptionValue ('.selectionName', 'tight')
280 configSeq.setOptionValue ('.cutLevel', 'TightPrimary')
281
282
283 # Add systematic object links
284 configSeq += config.makeConfig('SystObjectLink')
285 configSeq.setOptionValue ('.containerName', 'AnaJets')
286 if largeRJets:
287 configSeq += config.makeConfig('SystObjectLink')
288 configSeq.setOptionValue ('.containerName', 'AnaLargeRJets')
289 configSeq += config.makeConfig('SystObjectLink')
290 configSeq.setOptionValue ('.containerName', 'AnaElectrons')
291 configSeq += config.makeConfig('SystObjectLink')
292 configSeq.setOptionValue ('.containerName', 'AnaPhotons')
293 configSeq += config.makeConfig('SystObjectLink')
294 configSeq.setOptionValue ('.containerName', 'AnaMuons')
295 configSeq += config.makeConfig('SystObjectLink')
296 configSeq.setOptionValue ('.containerName', 'AnaTauJets')
297
298
299 # Particle-level objects
300 configSeq += config.makeConfig ('PL_Electrons')
301 configSeq.setOptionValue ('.containerName', 'TruthElectrons')
302 configSeq += config.makeConfig ('PL_Electrons.MCTCClassification')
303 configSeq.setOptionValue ('.containerName', 'TruthElectrons')
304 configSeq.setOptionValue ('.prefix', '')
305 configSeq += config.makeConfig ('PL_Electrons.PtEtaSelection')
306 configSeq.setOptionValue ('.containerName', 'TruthElectrons')
307 configSeq.setOptionValue ('.skipOnData', True)
308 configSeq.setOptionValue ('.useDressedProperties', True)
309 configSeq.setOptionValue ('.minPt', 20e3)
310
311 configSeq += config.makeConfig ('PL_Muons')
312 configSeq.setOptionValue ('.containerName', 'TruthMuons')
313 configSeq += config.makeConfig ('PL_Muons.MCTCClassification')
314 configSeq.setOptionValue ('.containerName', 'TruthMuons')
315 configSeq.setOptionValue ('.prefix', '')
316 configSeq += config.makeConfig ('PL_Muons.PtEtaSelection')
317 configSeq.setOptionValue ('.containerName', 'TruthMuons')
318 configSeq.setOptionValue ('.skipOnData', True)
319 configSeq.setOptionValue ('.useDressedProperties', True)
320 configSeq.setOptionValue ('.minPt', 20e3)
321
322 configSeq += config.makeConfig ('PL_Neutrinos')
323 configSeq.setOptionValue ('.skipOnData', True)
324
325 configSeq += config.makeConfig ('PL_Jets')
326 configSeq.setOptionValue ('.containerName', 'AntiKt4TruthDressedWZJets')
327 configSeq += config.makeConfig ('PL_Jets.PtEtaSelection')
328 configSeq.setOptionValue ('.containerName', 'AntiKt4TruthDressedWZJets')
329 configSeq.setOptionValue ('.skipOnData', True)
330 configSeq.setOptionValue ('.minPt', 20e3)
331
332 configSeq += config.makeConfig ('PL_Taus')
333 configSeq.setOptionValue ('.containerName', 'TruthTaus')
334 configSeq += config.makeConfig ('PL_Taus.MCTCClassification')
335 configSeq.setOptionValue ('.containerName', 'TruthTaus')
336 configSeq.setOptionValue ('.prefix', '')
337 configSeq += config.makeConfig ('PL_Taus.PtEtaSelection')
338 configSeq.setOptionValue ('.containerName', 'TruthTaus')
339 configSeq.setOptionValue ('.skipOnData', True)
340 configSeq.setOptionValue ('.minPt', 20e3)
341
342 configSeq += config.makeConfig ('PL_Photons')
343 configSeq.setOptionValue ('.containerName', 'TruthPhotons')
344 configSeq += config.makeConfig ('PL_Photons.PtEtaSelection')
345 configSeq.setOptionValue ('.containerName', 'TruthPhotons')
346 configSeq.setOptionValue ('.skipOnData', True)
347 configSeq.setOptionValue ('.minPt', 20e3)
348
349 configSeq += config.makeConfig ('PL_MissingET')
350 configSeq.setOptionValue ('.skipOnData', True)
351
352 configSeq += config.makeConfig ('PL_OverlapRemoval')
353 configSeq.setOptionValue ('.skipOnData', True)
354 configSeq.setOptionValue ('.electrons', 'TruthElectrons')
355 configSeq.setOptionValue ('.muons', 'TruthMuons')
356 configSeq.setOptionValue ('.photons', 'TruthPhotons')
357 configSeq.setOptionValue ('.jets', 'AntiKt4TruthDressedWZJets')
358 configSeq.setOptionValue ('.useRapidityForDeltaR', False)
359
360 # Parton history
361 configSeq += config.makeConfig ('PartonHistory')
362 configSeq.setOptionValue ('.history', 'Ttbar')
363
364 # Include, and then set up the met analysis algorithm config:
365 configSeq += config.makeConfig ('MissingET')
366 configSeq.setOptionValue ('.containerName', 'AnaMET')
367 configSeq.setOptionValue ('.jets', 'AnaJets')
368 configSeq.setOptionValue ('.taus', 'AnaTauJets.tight')
369 configSeq.setOptionValue ('.electrons', 'AnaElectrons.loose')
370 configSeq.setOptionValue ('.photons', 'AnaPhotons.tight')
371 # Note that the configuration for the muons is not what you'd
372 # normally do. This is specifically here because this is a unit
373 # test and I wanted to make sure that selection expressions work.
374 # For an actual analysis that would just be `AnaMuons.medium`, but
375 # since `tight` is a strict subset of `medium` it doesn't matter
376 # if we do an "or" of the two.
377 # TODO: MCP should restore this when the recommendations for Tight WP exist in R23
378 # configSeq.setOptionValue ('.muons', 'AnaMuons.medium||tight')
379 configSeq.setOptionValue ('.muons', 'AnaMuons.medium')
380
381
382 # Include, and then set up the overlap analysis algorithm config:
383 configSeq += config.makeConfig( 'OverlapRemoval' )
384 configSeq.setOptionValue ('.electrons', 'AnaElectrons.loose')
385 configSeq.setOptionValue ('.photons', 'AnaPhotons.tight')
386 # TODO: MCP should restore this when the recommendations for Tight WP exist in R23
387 # configSeq.setOptionValue ('.muons', 'AnaMuons.medium||tight')
388 configSeq.setOptionValue ('.muons', 'AnaMuons.medium')
389 configSeq.setOptionValue ('.jets', 'AnaJets.baselineJvt')
390 configSeq.setOptionValue ('.taus', 'AnaTauJets.tight')
391 configSeq.setOptionValue ('.inputLabel', 'preselectOR')
392 configSeq.setOptionValue ('.outputLabel', 'passesOR' )
393 configSeq.setOptionValue ('.nominalOnly', onlyNominalOR )
394
395
396 # ObjectCutFlow blocks
397 configSeq += config.makeConfig ('ObjectCutFlow')
398 configSeq.setOptionValue ('.containerName', 'AnaJets')
399 configSeq.setOptionValue ('.selectionName', 'jvt')
400 configSeq += config.makeConfig ('ObjectCutFlow')
401 configSeq.setOptionValue ('.containerName', 'AnaElectrons')
402 configSeq.setOptionValue ('.selectionName', 'loose')
403 configSeq += config.makeConfig ('ObjectCutFlow')
404 configSeq.setOptionValue ('.containerName', 'AnaPhotons')
405 configSeq.setOptionValue ('.selectionName', 'tight')
406 configSeq += config.makeConfig ('ObjectCutFlow')
407 configSeq.setOptionValue ('.containerName', 'AnaMuons')
408 configSeq.setOptionValue ('.selectionName', 'medium')
409 configSeq += config.makeConfig ('ObjectCutFlow')
410 configSeq.setOptionValue ('.containerName', 'AnaTauJets')
411 configSeq.setOptionValue ('.selectionName', 'tight')
412 configSeq += config.makeConfig ('ObjectCutFlow')
413 configSeq.setOptionValue ('.containerName', 'AnaTracks')
414 configSeq.setOptionValue ('.selectionName', 'tight')
415
416 # Include and set up a basic run of the event selection algorithm config:
417 if geometry is not LHCPeriod.Run4:
418 for sel_name, sel_cuts in exampleSelectionCuts.items():
419 configSeq += config.makeConfig( 'EventSelection' )
420 configSeq.setOptionValue ('.electrons', 'AnaElectrons.loose')
421 configSeq.setOptionValue ('.muons', 'AnaMuons.medium')
422 configSeq.setOptionValue ('.jets', 'AnaJets.baselineJvt')
423 configSeq.setOptionValue ('.met', 'AnaMET')
424 configSeq.setOptionValue ('.btagDecoration', 'ftag_select_ftag')
425 configSeq.setOptionValue ('.selectionName', sel_name)
426 configSeq.setOptionValue ('.selectionCuts', sel_cuts)
427 configSeq.setOptionValue ('.cutFlowHistograms', True)
428 configSeq.setOptionValue ('.noFilter', True)
429
430 if dataType is not DataType.Data :
431 # Include, and then set up the generator analysis sequence:
432 configSeq += config.makeConfig( 'GeneratorLevelAnalysis')
433
434 configSeq += config.makeConfig ('Bootstraps')
435 configSeq.setOptionValue ('.nReplicas', 2000 )
436 configSeq.setOptionValue ('.skipOnMC', False)
437
438 # per-event lepton SF
439 configSeq += config.makeConfig ('LeptonSF')
440 if geometry is not LHCPeriod.Run2:
441 configSeq.setOptionValue ('.electrons', 'AnaElectrons.loose')
442 configSeq.setOptionValue ('.muons', 'AnaMuons.medium')
443 configSeq.setOptionValue ('.photons', 'AnaPhotons.tight')
444 configSeq.setOptionValue ('.lepton_postfix', 'nominal')
445
446 # Thinning blocks
447 configSeq += config.makeConfig ('Thinning')
448 configSeq.setOptionValue ('.containerName', 'AnaElectrons')
449 configSeq.setOptionValue ('.selectionName', 'loose')
450 configSeq.setOptionValue ('.outputName', 'OutElectrons')
451 configSeq += config.makeConfig ('Thinning')
452 configSeq.setOptionValue ('.containerName', 'AnaPhotons')
453 configSeq.setOptionValue ('.selectionName', 'tight')
454 configSeq.setOptionValue ('.outputName', 'OutPhotons')
455 configSeq += config.makeConfig ('Thinning')
456 configSeq.setOptionValue ('.containerName', 'AnaMuons')
457 configSeq.setOptionValue ('.selectionName', 'medium')
458 configSeq.setOptionValue ('.outputName', 'OutMuons')
459 configSeq += config.makeConfig ('Thinning')
460 configSeq.setOptionValue ('.containerName', 'AnaTauJets')
461 configSeq.setOptionValue ('.selectionName', 'tight')
462 configSeq.setOptionValue ('.outputName', 'OutTauJets')
463 configSeq += config.makeConfig ('Thinning')
464 configSeq.setOptionValue ('.containerName', 'AnaJets')
465 configSeq.setOptionValue ('.outputName', 'OutJets')
466 if largeRJets :
467 configSeq += config.makeConfig ('Thinning')
468 configSeq.setOptionValue ('.containerName', 'AnaLargeRJets')
469 configSeq.setOptionValue ('.outputName', 'OutLargeRJets')
470 configSeq += config.makeConfig ('Thinning')
471 configSeq.setOptionValue ('.containerName', 'AnaTracks')
472 configSeq.setOptionValue ('.selectionName', 'tight')
473 configSeq.setOptionValue ('.outputName', 'OutTracks')
474
475 configSeq += config.makeConfig ('Thinning')
476 configSeq.setOptionValue ('.containerName', 'TruthElectrons')
477 configSeq.setOptionValue ('.skipOnData', True)
478 configSeq.setOptionValue ('.outputName', 'OutTruthElectrons')
479 configSeq += config.makeConfig ('Thinning')
480 configSeq.setOptionValue ('.containerName', 'TruthPhotons')
481 configSeq.setOptionValue ('.skipOnData', True)
482 configSeq.setOptionValue ('.outputName', 'OutTruthPhotons')
483 configSeq += config.makeConfig ('Thinning')
484 configSeq.setOptionValue ('.containerName', 'TruthMuons')
485 configSeq.setOptionValue ('.skipOnData', True)
486 configSeq.setOptionValue ('.outputName', 'OutTruthMuons')
487 configSeq += config.makeConfig ('Thinning')
488 configSeq.setOptionValue ('.containerName', 'TruthTaus')
489 configSeq.setOptionValue ('.skipOnData', True)
490 configSeq.setOptionValue ('.outputName', 'OutTruthTaus')
491 configSeq += config.makeConfig ('Thinning')
492 configSeq.setOptionValue ('.containerName', 'AntiKt4TruthDressedWZJets')
493 configSeq.setOptionValue ('.outputName', 'OutTruthJets')
494 configSeq.setOptionValue ('.skipOnData', True)
495
496 configSeq += config.makeConfig ('Output')
497 configSeq.setOptionValue ('.treeName', 'analysis')
498 configSeq.setOptionValue ('.vars', [
499 'EventInfo.actualInteractionsPerCrossing -> actualMuScaled',
500 'OutMuons_NOSYS.muonType -> mu_muonType type=uint16' #types are typically not needed, but if needed this is how you add them
501 ])
502 configSeq.setOptionValue ('.metVars', [
503 'AnaMET_%SYS%.met -> met_%SYS%',
504 ])
505 configSeq.setOptionValue ('.truthMetVars', [
506 'TruthMET_NOSYS.met -> truth_met',
507 ])
508 configSeq.setOptionValue ('.containers', outputContainers)
509 configSeq.setOptionValue ('.containersOnlyForMC', outputContainersForMC)
510 configSeq.setOptionValue ('.commands', [
511 'disable actualInteractionsPerCrossing',
512 ])
513
514 # save the tool configuration to a txt file
515 configSeq += config.makeConfig ('PrintConfiguration')
516
517 # return configSeq for unit test
518 if returnConfigSeq:
519 return configSeq
520
521 configAccumulator = ConfigAccumulator (algSeq=algSeq, flags=autoconfigFromFlags, noSystematics=noSystematics)
522 configSeq.fullConfigure (configAccumulator)
523
524 # order can change during fullConfigure
525 configSeq.printOptions()
526
527 return configAccumulator.CA if isAthena else None
528
529
530def printSequenceAlgs (sequence) :
531 """print the algorithms in the sequence without the sequence structure
532
533 This is mostly meant for easy comparison of different sequences
534 during configuration, particularly the sequences resulting from
535 the old sequence configuration and the new block configuration.
536 Those have different sequence structures in the output, but the
537 algorithms should essentially be configured the same way."""
538 if isinstance (sequence, AlgSequence) :
539 for alg in sequence :
540 printSequenceAlgs (alg)
541 else :
542 # assume this is an algorithm then
543 print (sequence)
544
545
546def makeSequence (dataType, noSystematics,
547 yamlPath=None,
548 isPhyslite = False, geometry = None,
549 autoconfigFromFlags = None, onlyNominalOR = False,
550 bleedingEdge = False) :
551
552 algSeq = AlgSequence('AnalysisSequence')
553
554 ca = None
555 if not yamlPath:
556 ca = makeTestSequenceBlocks (dataType, algSeq,
557 isPhyslite=isPhyslite,
558 geometry=geometry, onlyNominalOR=onlyNominalOR,
559 autoconfigFromFlags=autoconfigFromFlags,
560 noSystematics=noSystematics,
561 bleedingEdge=bleedingEdge)
562 else:
563 from AnalysisAlgorithmsConfig.ConfigText import makeSequence as makeSequenceText
564 ca = makeSequenceText(yamlPath, algSeq=algSeq, flags=autoconfigFromFlags,
565 noSystematics=noSystematics)
566
567 if ca is not None:
568 return ca
569 else:
570 return algSeq
makeSequence(dataType, noSystematics, yamlPath=None, isPhyslite=False, geometry=None, autoconfigFromFlags=None, onlyNominalOR=False, bleedingEdge=False)
makeTestSequenceBlocks(dataType, algSeq, isPhyslite, geometry=None, autoconfigFromFlags=None, noSystematics=None, onlyNominalOR=False, returnConfigSeq=False, bleedingEdge=False # Enabled for CI tests running on new derivations from derivation CI output)