8 """Compares two ConfigSequences"""
10 blocks2 = seq2._blocks
11 print(
"Block order for each config sequence")
12 print(
"\033[4m{0:<30} {1:<30}\033[0m".
format(
"Sequence1",
"Sequence2"))
13 for i
in range(
max(len(blocks1), len(blocks2))):
16 name1 = blocks1[i].__class__.__name__
18 name2 = blocks2[i].__class__.__name__
19 print(f
"{name1:<30} {name2}")
21 print(
"Sorting blocks by name (will not sort blocks with same name)")
22 blocks1.sort(key=
lambda x: x.__class__.__name__)
23 blocks2.sort(key=
lambda x: x.__class__.__name__)
24 if len(blocks1) != len(blocks2):
25 raise Exception(
"Number of blocks are different")
26 for i
in range(len(blocks1)):
29 name1 = block1.__class__.__name__
30 name2 = block2.__class__.__name__
32 raise Exception(f
"In position {i} "
33 f
"the first sequence results in {name1} "
34 f
"and the second sequence results in {name2}")
35 for name
in block1.getOptions():
36 if name ==
'groupName':
38 value1 = block1.getOptionValue(name)
39 value2 = block2.getOptionValue(name)
41 raise Exception(f
"For block {name1}, the block "
42 f
"option {name} the first sequence results in {value1} "
43 f
"and the second sequence results in {value2}")
48 Create a configSequence using provided YAML file and a
49 configSequence using ConfigText python commands and compare.
51 Will raise an exception if configSequences differ
54 from AnalysisAlgorithmsConfig.ConfigText
import TextConfig
58 config.addBlock(
'CommonServices')
59 config.setOptions(systematicsHistogram=
'systematicsList')
62 config.addBlock(
'PileupReweighting')
65 config.addBlock(
'EventCleaning')
66 config.setOptions (runEventCleaning=
True)
69 config.addBlock(
'Jets')
70 config.setOptions (containerName=
'AnaJets')
71 config.setOptions (jetCollection=
'AntiKt4EMPFlowJets')
72 config.setOptions (runJvtUpdate=
False)
73 config.setOptions (runNNJvtUpdate=
True)
74 config.setOptions (recalibratePhyslite=
False)
76 config.addBlock(
'Jets.FlavourTagging')
77 config.setOptions (containerName=
'AnaJets')
78 config.setOptions (selectionName=
'ftag')
79 config.setOptions (btagger=
'GN2v01')
80 config.setOptions (btagWP=
'FixedCutBEff_65')
81 config.setOptions (saveScores=
'All')
83 config.addBlock(
'Jets.JVT', containerName=
'AnaJets')
85 bjetTriggerChainsPerYear = {
86 2022: [
'HLT_2j45_0eta290_020jvt_bdl1d60_2j45_pf_ftf_presel2j25XX2j25b85_L14J15p0ETA25'],
87 2023: [
'HLT_2j45_0eta290_020jvt_bgn160_2j45_pf_ftf_presel2j25XX2j25b85_L14J15p0ETA25'],
88 2024: [
'HLT_2j45_0eta290_020jvt_bgn260_2j45_pf_ftf_presel2j25XX2j25bgtwo85_L14jJ40p0ETA25'],
90 config.addBlock(
'Jets.FTagTriggerMatching' )
91 config.setOptions (containerName=
'AnaJets')
92 config.setOptions (triggerChainsPerYear=bjetTriggerChainsPerYear)
94 config.addBlock(
'Jets.FlavourTaggingEventSF')
95 config.setOptions (containerName=
'AnaJets.baselineJvt')
96 config.setOptions (btagger=
'GN2v01')
99 config.addBlock(
'Jets')
100 config.setOptions (containerName=
'AnaLargeRJets')
101 config.setOptions (jetCollection=
'AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets')
102 config.setOptions (recalibratePhyslite=
False)
105 config.addBlock (
'Electrons')
106 config.setOptions (containerName=
'AnaElectrons')
107 config.setOptions (forceFullSimConfigForIso=
True)
108 config.setOptions (recalibratePhyslite=
False)
109 config.setOptions (decorateTruth=
True)
110 config.setOptions (decorateCaloClusterEta=
True)
111 config.setOptions (writeTrackD0Z0=
True)
112 config.setOptions (minPt=10000.0)
114 config.addBlock (
'Electrons.WorkingPoint')
115 config.setOptions (containerName=
'AnaElectrons')
116 config.setOptions (selectionName=
'loose')
117 config.setOptions (forceFullSimConfig=
True)
118 config.setOptions (identificationWP=
'LooseBLayerLH')
119 config.setOptions (isolationWP=
'Tight_VarRad')
120 config.setOptions (chargeIDSelectionRun2=
True)
121 config.setOptions (addChargeMisIDSF=
True)
123 config.addBlock (
'Electrons.PtEtaSelection')
124 config.setOptions (containerName=
'AnaElectrons')
125 config.setOptions (minPt=10000.0)
127 config.addBlock (
'Electrons.IFFClassification')
128 config.setOptions (containerName=
'AnaElectrons')
130 config.addBlock (
'Electrons.MCTCClassification')
131 config.setOptions (containerName=
'AnaElectrons')
132 config.setOptions (prefix=
'truth_')
135 config.addBlock (
'Photons', containerName=
'AnaPhotons')
136 config.setOptions (forceFullSimConfigForIso=
True)
137 config.setOptions (recomputeIsEM=
False)
138 config.setOptions (recalibratePhyslite=
False)
139 config.setOptions (decorateTruth=
True)
141 config.addBlock (
'Photons.WorkingPoint')
142 config.setOptions (containerName=
'AnaPhotons')
143 config.setOptions (selectionName=
'tight')
144 config.setOptions (forceFullSimConfigForID=
True)
145 config.setOptions (forceFullSimConfigForIso=
True)
146 config.setOptions (qualityWP=
'Tight')
147 config.setOptions (isolationWP=
'FixedCutTight')
148 config.setOptions (recomputeIsEM=
False)
150 config.addBlock (
'Photons.PtEtaSelection')
151 config.setOptions (containerName=
'AnaPhotons')
152 config.setOptions (minPt=10000.0)
155 config.addBlock (
'Muons', containerName=
'AnaMuons')
156 config.setOptions (recalibratePhyslite=
False)
157 config.setOptions (decorateTruth=
True)
158 config.setOptions (writeTrackD0Z0=
True)
160 config.addBlock (
'Muons.WorkingPoint')
161 config.setOptions (containerName=
'AnaMuons')
162 config.setOptions (selectionName=
'medium')
163 config.setOptions (quality=
'Medium')
164 config.setOptions (isolation=
'Loose_VarRad')
166 config.addBlock (
'Muons.IFFClassification')
167 config.setOptions (containerName=
'AnaMuons')
169 config.addBlock (
'Muons.MCTCClassification')
170 config.setOptions (containerName=
'AnaMuons')
171 config.setOptions (prefix=
'truth_')
174 config.addBlock (
'TauJets', containerName=
'AnaTauJets')
175 config.setOptions (decorateTruth=
True)
177 config.addBlock (
'TauJets.WorkingPoint')
178 config.setOptions (containerName=
'AnaTauJets')
179 config.setOptions (selectionName=
'tight')
180 config.setOptions (quality=
'Tight')
182 tauTriggerChainsSF = {
183 2015: [
'HLT_tau25_medium1_tracktwo',
'HLT_tau35_medium1_tracktwo'],
184 2016: [
'HLT_tau25_medium1_tracktwo',
'HLT_tau35_medium1_tracktwo'],
185 2017: [
'HLT_tau25_medium1_tracktwo',
'HLT_tau35_medium1_tracktwo'],
186 2018: [
'HLT_tau25_medium1_tracktwoEF',
'HLT_tau35_medium1_tracktwoEF'],
187 2022: [
'HLT_tau25_mediumRNN_tracktwoMVA',
'HLT_tau35_mediumRNN_tracktwoMVA'],
188 2023: [
'HLT_tau25_mediumRNN_tracktwoMVA',
'HLT_tau35_mediumRNN_tracktwoMVA'],
190 config.addBlock (
'TauJets.TriggerSF')
191 config.setOptions (containerName=
'AnaTauJets')
192 config.setOptions (tauID=
'Tight')
193 config.setOptions (triggerChainsPerYear=tauTriggerChainsSF)
195 config.addBlock (
'TauJets.MCTCClassification')
196 config.setOptions (containerName=
'AnaTauJets')
197 config.setOptions (prefix=
'truth_')
199 config.addBlock (
'SystObjectLink')
200 config.setOptions (containerName=
'AnaJets')
201 config.addBlock (
'SystObjectLink')
202 config.setOptions (containerName=
'AnaLargeRJets')
203 config.addBlock (
'SystObjectLink')
204 config.setOptions (containerName=
'AnaElectrons')
205 config.addBlock (
'SystObjectLink')
206 config.setOptions (containerName=
'AnaPhotons')
207 config.addBlock (
'SystObjectLink')
208 config.setOptions (containerName=
'AnaMuons')
209 config.addBlock (
'SystObjectLink')
210 config.setOptions (containerName=
'AnaTauJets')
212 config.addBlock (
'ObjectCutFlow')
213 config.setOptions (containerName=
'AnaJets')
214 config.setOptions (selectionName=
'jvt')
215 config.addBlock (
'ObjectCutFlow')
216 config.setOptions (containerName=
'AnaElectrons')
217 config.setOptions (selectionName=
'loose')
218 config.addBlock (
'ObjectCutFlow')
219 config.setOptions (containerName=
'AnaPhotons')
220 config.setOptions (selectionName=
'tight')
221 config.addBlock (
'ObjectCutFlow')
222 config.setOptions (containerName=
'AnaMuons')
223 config.setOptions (selectionName=
'medium')
224 config.addBlock (
'ObjectCutFlow')
225 config.setOptions (containerName=
'AnaTauJets')
226 config.setOptions (selectionName=
'tight')
229 config.addBlock(
'GeneratorLevelAnalysis')
232 config.addBlock (
'MissingET')
233 config.setOptions (containerName=
'AnaMET')
234 config.setOptions (jets=
'AnaJets')
235 config.setOptions (taus=
'AnaTauJets.tight')
236 config.setOptions (electrons=
'AnaElectrons.loose')
237 config.setOptions (photons=
'AnaPhotons.tight')
238 config.setOptions (muons=
'AnaMuons.medium')
241 config.addBlock(
'OverlapRemoval' )
242 config.setOptions (inputLabel=
'preselectOR')
243 config.setOptions (outputLabel=
'passesOR' )
244 config.setOptions (jets=
'AnaJets.baselineJvt')
245 config.setOptions (taus=
'AnaTauJets.tight')
246 config.setOptions (electrons=
'AnaElectrons.loose')
247 config.setOptions (photons=
'AnaPhotons.tight')
248 config.setOptions (muons=
'AnaMuons.medium')
251 config.addBlock (
'PL_Electrons')
252 config.setOptions (containerName=
'TruthElectrons')
253 config.addBlock (
'PL_Electrons.PtEtaSelection')
254 config.setOptions (containerName=
'TruthElectrons')
255 config.setOptions (skipOnData=
True)
256 config.setOptions (useDressedProperties=
True)
257 config.setOptions (minPt=20e3)
258 config.addBlock (
'PL_Electrons.MCTCClassification')
259 config.setOptions (containerName=
'TruthElectrons')
260 config.setOptions (prefix=
'')
262 config.addBlock (
'PL_Photons')
263 config.setOptions (containerName=
'TruthPhotons')
264 config.addBlock (
'PL_Photons.PtEtaSelection')
265 config.setOptions (containerName=
'TruthPhotons')
266 config.setOptions (skipOnData=
True)
267 config.setOptions (minPt=20e3)
269 config.addBlock (
'PL_Muons')
270 config.setOptions (containerName=
'TruthMuons')
271 config.addBlock (
'PL_Muons.PtEtaSelection')
272 config.setOptions (containerName=
'TruthMuons')
273 config.setOptions (skipOnData=
True)
274 config.setOptions (useDressedProperties=
True)
275 config.setOptions (minPt=20e3)
276 config.addBlock (
'PL_Muons.MCTCClassification')
277 config.setOptions (containerName=
'TruthMuons')
278 config.setOptions (prefix=
'')
280 config.addBlock (
'PL_Taus')
281 config.setOptions (containerName=
'TruthTaus')
282 config.addBlock (
'PL_Taus.PtEtaSelection')
283 config.setOptions (containerName=
'TruthTaus')
284 config.setOptions (skipOnData=
True)
285 config.setOptions (minPt=20e3)
286 config.addBlock (
'PL_Taus.MCTCClassification')
287 config.setOptions (containerName=
'TruthTaus')
288 config.setOptions (prefix=
'')
290 config.addBlock (
'PL_Jets')
291 config.setOptions (containerName=
'AntiKt4TruthDressedWZJets')
292 config.addBlock (
'PL_Jets.PtEtaSelection')
293 config.setOptions (containerName=
'AntiKt4TruthDressedWZJets')
294 config.setOptions (skipOnData=
True)
295 config.setOptions (minPt=20e3)
297 config.addBlock (
'PL_Neutrinos')
298 config.setOptions (skipOnData=
True)
299 config.addBlock (
'PL_MissingET')
300 config.setOptions (skipOnData=
True)
302 config.addBlock (
'PL_OverlapRemoval')
303 config.setOptions (skipOnData=
True)
304 config.setOptions (electrons=
'TruthElectrons')
305 config.setOptions (muons=
'TruthMuons')
306 config.setOptions (photons=
'TruthPhotons')
307 config.setOptions (jets=
'AntiKt4TruthDressedWZJets')
308 config.setOptions (useRapidityForDeltaR=
False)
311 config.addBlock (
'Thinning')
312 config.setOptions (containerName=
'AnaElectrons')
313 config.setOptions (selectionName=
'loose')
314 config.setOptions (outputName=
'OutElectrons')
315 config.addBlock (
'Thinning')
316 config.setOptions (containerName=
'AnaPhotons')
317 config.setOptions (selectionName=
'tight')
318 config.setOptions (outputName=
'OutPhotons')
319 config.addBlock (
'Thinning')
320 config.setOptions (containerName=
'AnaMuons')
321 config.setOptions (selectionName=
'medium')
322 config.setOptions (outputName=
'OutMuons')
323 config.addBlock (
'Thinning')
324 config.setOptions (containerName=
'AnaTauJets')
325 config.setOptions (selectionName=
'tight')
326 config.setOptions (outputName=
'OutTauJets')
327 config.addBlock (
'Thinning')
328 config.setOptions (containerName=
'AnaJets')
329 config.setOptions (outputName=
'OutJets')
330 config.addBlock (
'Thinning')
331 config.setOptions (containerName=
'AnaLargeRJets')
332 config.setOptions (outputName=
'OutLargeRJets')
333 config.addBlock (
'Thinning')
334 config.setOptions (containerName=
'TruthElectrons')
335 config.setOptions (skipOnData=
True)
336 config.setOptions (outputName=
'OutTruthElectrons')
337 config.addBlock (
'Thinning')
338 config.setOptions (containerName=
'TruthPhotons')
339 config.setOptions (skipOnData=
True)
340 config.setOptions (outputName=
'OutTruthPhotons')
341 config.addBlock (
'Thinning')
342 config.setOptions (containerName=
'TruthMuons')
343 config.setOptions (skipOnData=
True)
344 config.setOptions (outputName=
'OutTruthMuons')
345 config.addBlock (
'Thinning')
346 config.setOptions (containerName=
'TruthTaus')
347 config.setOptions (skipOnData=
True)
348 config.setOptions (outputName=
'OutTruthTaus')
349 config.addBlock (
'Thinning')
350 config.setOptions (containerName=
'AntiKt4TruthDressedWZJets')
351 config.setOptions (outputName=
'OutTruthJets')
352 config.setOptions (skipOnData=
True)
355 triggerChainsPerYear = {
356 2015: [
'HLT_e24_lhmedium_L1EM20VH || HLT_e60_lhmedium || HLT_e120_lhloose',
'HLT_mu20_iloose_L1MU15 || HLT_mu40',
'HLT_2g20_tight'],
357 2016: [
'HLT_e26_lhtight_nod0_ivarloose || HLT_e60_lhmedium_nod0 || HLT_e140_lhloose_nod0',
'HLT_mu26_ivarmedium || HLT_mu50',
'HLT_g35_loose_g25_loose'],
358 2017: [
'HLT_e26_lhtight_nod0_ivarloose || HLT_e60_lhmedium_nod0 || HLT_e140_lhloose_nod0',
'HLT_2g22_tight_L12EM15VHI',
'HLT_mu50'],
359 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'],
361 triggerMatchingChainsPerYear = {
362 2015: [
'HLT_e24_lhmedium_L1EM20VH || HLT_e60_lhmedium || HLT_e120_lhloose',
'HLT_mu20_iloose_L1MU15 || HLT_mu40'],
363 2016: [
'HLT_e26_lhtight_nod0_ivarloose || HLT_e60_lhmedium_nod0 || HLT_e140_lhloose_nod0',
'HLT_mu26_ivarmedium || HLT_mu50'],
364 2017: [
'HLT_e26_lhtight_nod0_ivarloose || HLT_e60_lhmedium_nod0 || HLT_e140_lhloose_nod0',
'HLT_mu50'],
365 2018: [
'HLT_e26_lhtight_nod0_ivarloose || HLT_e60_lhmedium_nod0 || HLT_e140_lhloose_nod0',
'HLT_mu26_ivarmedium'],
367 config.addBlock (
'Trigger')
368 config.setOptions (triggerChainsPerYear=triggerChainsPerYear)
369 config.setOptions (noFilter=
True)
370 config.setOptions (electrons=
'AnaElectrons.loose')
371 config.setOptions (photons=
'AnaPhotons.tight')
372 config.setOptions (muons=
'AnaMuons.medium')
373 config.setOptions (taus=
'AnaTauJets.tight')
374 config.setOptions (electronID=
'Tight')
375 config.setOptions (electronIsol=
'Tight_VarRad')
376 config.setOptions (photonIsol=
'TightCaloOnly')
377 config.setOptions (muonID=
'Tight')
378 config.setOptions (triggerMatchingChainsPerYear=triggerMatchingChainsPerYear)
382 exampleSelectionCuts = {
383 'SUBcommon':
"""JET_N_BTAG >= 2
388 'ejets':
"""IMPORT SUBcommon
395 'mujets':
"""IMPORT SUBcommon
397 MU_N medium 25000 > 0
401 config.addBlock (
'EventSelection')
402 config.setOptions (electrons=
'AnaElectrons.loose')
403 config.setOptions (muons=
'AnaMuons.medium')
404 config.setOptions (jets=
'AnaJets.baselineJvt')
405 config.setOptions (met=
'AnaMET')
406 config.setOptions (btagDecoration=
'ftag_select_ftag')
407 config.setOptions (noFilter=
True)
408 config.setOptions (cutFlowHistograms=
True)
409 config.setOptions (selectionCutsDict=exampleSelectionCuts)
412 config.addBlock (
'Bootstraps')
413 config.setOptions (nReplicas=2000)
414 config.setOptions (skipOnMC=
False)
417 config.addBlock (
'LeptonSF')
418 config.setOptions (muons=
'AnaMuons.medium')
419 config.setOptions (photons=
'AnaPhotons.tight')
420 config.setOptions (lepton_postfix=
'nominal')
425 'el_':
'OutElectrons',
426 'ph_' :
'OutPhotons',
427 'tau_':
'OutTauJets',
429 'larger_jet_':
'OutLargeRJets',
432 outputContainersForMC = {
'truth_mu_' :
'OutTruthMuons',
433 'truth_el_' :
'OutTruthElectrons',
434 'truth_ph_' :
'OutTruthPhotons',
435 'truth_tau_':
'OutTruthTaus',
436 'truth_jet_':
'OutTruthJets',
437 'truth_met_':
'TruthMET'}
438 config.addBlock (
'Output')
439 config.setOptions (treeName=
'analysis')
440 config.setOptions (vars=[
441 'EventInfo.actualInteractionsPerCrossing -> actualMuScaled',
443 config.setOptions (metVars=[
444 'AnaMET_%SYS%.met -> met_%SYS%',
446 config.setOptions (truthMetVars=[
447 'TruthMET_NOSYS.met -> truth_met',
449 config.setOptions (containers=outputContainers)
450 config.setOptions (containersOnlyForMC=outputContainersForMC)
451 config.setOptions (commands=[
452 "disable actualInteractionsPerCrossing",
456 config.addBlock (
'PrintConfiguration')
459 configSeq = config.configure()
462 textConfig = TextConfig(yamlPath)
463 textConfigSeq = textConfig.configure()
471 Create a configSequence using provided YAML file and a
472 configSequence using the block configuration and compare.
474 Will raise an exception if configSequences differ
476 from AthenaConfiguration.Enums
import LHCPeriod
478 from AnalysisAlgorithmsConfig.FullCPAlgorithmsTest
import makeTestSequenceBlocks
480 geometry=LHCPeriod.Run2,
481 isPhyslite=
False, forceEGammaFullSimConfig=
True,
482 returnConfigSeq=
True)
485 from AnalysisAlgorithmsConfig.ConfigText
import TextConfig
486 textConfig = TextConfig(yamlPath)
487 textConfigSeq = textConfig.configure()
493 if __name__ ==
'__main__':
496 parser = optparse.OptionParser()
497 parser.add_option(
'--text-config', dest=
'text_config',
498 default=
'', action=
'store',
499 help=
'YAML file used in unit test')
500 parser.add_option(
'--compare-block', dest=
'compare_block',
501 default=
False, action=
'store_true',
502 help=
'Compare config sequence from YAML and block configuration')
503 parser.add_option(
'--compare-builder', dest=
'compare_builder',
504 default=
False, action=
'store_true',
505 help=
'Compare config sequence from YAML and python configuration')
506 parser.add_option(
'--check-order', dest=
'check_order',
507 default=
False, action=
'store_true',
508 help=
'Require blocks to be in the same order')
509 (options, args) = parser.parse_args()
510 textConfig = options.text_config
511 compareBlock = options.compare_block
512 compareBuilder = options.compare_builder
513 checkOrder = options.check_order
515 from PathResolver
import PathResolver
518 if not os.path.isfile(textConfig):
519 raise FileNotFoundError(f
"{textConfig} is not a file")
523 print(
"Comparing config sequences from the block and text"
524 "configuration methods")
528 print(
"Comparing config sequences from the block and block"
529 "configuration methods")