46def compareTextBuilder(yamlPath='', *, checkOrder=False) :
47 """
48 Create a configSequence using provided YAML file and a
49 configSequence using ConfigText python commands and compare.
50
51 Will raise an exception if configSequences differ
52 """
53
54 from AnalysisAlgorithmsConfig.ConfigText import TextConfig
55 config = TextConfig()
56
57
58 config.addBlock('CommonServices')
59 config.setOptions(systematicsHistogram='systematicsList')
60 config.setOptions(enableExpertMode=True)
61
62
63 config.addBlock('PileupReweighting')
64
65
66 config.addBlock('EventCleaning')
67 config.setOptions (runEventCleaning=True)
68
69
70 config.addBlock('Jets')
71 config.setOptions (containerName='AnaJets')
72 config.setOptions (jetCollection='AntiKt4EMPFlowJets')
73 config.setOptions (runJvtUpdate=False)
74 config.setOptions (runNNJvtUpdate=True)
75 config.setOptions (runJvtSelection=False)
76 config.setOptions (recalibratePhyslite=False)
77
78 config.addBlock('Jets.JVTWorkingPoint')
79 config.setOptions (containerName='AnaJets')
80 config.setOptions (selectionName='baselineJvt')
81 config.setOptions (jvtWP='FixedEffPt')
82
83 config.addBlock( 'Jets.FlavourTagging')
84 config.setOptions (containerName='AnaJets')
85 config.setOptions (selectionName='ftag')
86 config.setOptions (btagger='GN2v01')
87 config.setOptions (btagWP='FixedCutBEff_65')
88 config.setOptions (saveScores='All')
89
90 bjetTriggerChainsPerYear = {
91 2022: ['HLT_2j45_0eta290_020jvt_bdl1d60_2j45_pf_ftf_presel2j25XX2j25b85_L14J15p0ETA25'],
92 2023: ['HLT_2j45_0eta290_020jvt_bgn160_2j45_pf_ftf_presel2j25XX2j25b85_L14J15p0ETA25'],
93 }
94 config.addBlock( 'Jets.FTagTriggerMatching' )
95 config.setOptions (containerName='AnaJets')
96 config.setOptions (triggerChainsPerYear=bjetTriggerChainsPerYear)
97
98 config.addBlock( 'Jets.FlavourTaggingEventSF')
99 config.setOptions (containerName='AnaJets.baselineJvt')
100 config.setOptions (btagger='GN2v01')
101 config.setOptions (triggerChainsPerYear=bjetTriggerChainsPerYear)
102
103
104 config.addBlock('Jets')
105 config.setOptions (containerName='AnaLargeRJets')
106 config.setOptions (jetCollection='AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets')
107 config.setOptions (recalibratePhyslite=False)
108
109
110 config.addBlock ('Electrons')
111 config.setOptions (containerName='AnaElectrons')
112 config.setOptions (forceFullSimConfigForIso=True)
113 config.setOptions (recalibratePhyslite=False)
114 config.setOptions (decorateTruth=True)
115 config.setOptions (decorateCaloClusterEta=True)
116 config.setOptions (writeTrackD0Z0=True)
117 config.setOptions (minPt=10000.0)
118
119 config.addBlock ('Electrons.WorkingPoint')
120 config.setOptions (containerName='AnaElectrons')
121 config.setOptions (selectionName='loose')
122 config.setOptions (forceFullSimConfig=True)
123 config.setOptions (identificationWP='LooseBLayerLH')
124 config.setOptions (isolationWP='Tight_VarRad')
125 config.setOptions (chargeIDSelectionRun2=True)
126 config.setOptions (addChargeMisIDSF=True)
127
128 config.addBlock ('Electrons.TriggerSF')
129 config.setOptions (containerName='AnaElectrons')
130 config.setOptions (electronID='LooseBLayerLH')
131 config.setOptions (electronIsol='Tight_VarRad')
132 triggerChainsPerYear = {
133 2015: ['HLT_e24_lhmedium_L1EM20VH || HLT_e60_lhmedium || HLT_e120_lhloose', 'HLT_mu20_iloose_L1MU15 || HLT_mu40', 'HLT_2g20_tight'],
134 2016: ['HLT_e26_lhtight_nod0_ivarloose || HLT_e60_lhmedium_nod0 || HLT_e140_lhloose_nod0', 'HLT_mu26_ivarmedium || HLT_mu50', 'HLT_g35_loose_g25_loose'],
135 2017: ['HLT_e26_lhtight_nod0_ivarloose || HLT_e60_lhmedium_nod0 || HLT_e140_lhloose_nod0', 'HLT_2g22_tight_L12EM15VHI', 'HLT_mu50'],
136 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'],
137 }
138 config.setOptions (triggerChainsPerYear=triggerChainsPerYear)
139
140 config.addBlock ('Electrons.PtEtaSelection')
141 config.setOptions (containerName='AnaElectrons')
142 config.setOptions (minPt=10000.0)
143
144 config.addBlock ('Electrons.IFFClassification')
145 config.setOptions (containerName='AnaElectrons')
146
147 config.addBlock ('Electrons.MCTCClassification')
148 config.setOptions (containerName='AnaElectrons')
149 config.setOptions (prefix='truth_')
150
151
152
153 config.addBlock ('Photons', containerName='AnaPhotons')
154 config.setOptions (forceFullSimConfigForIso=True)
155 config.setOptions (recomputeIsEM=False)
156 config.setOptions (recalibratePhyslite=False)
157 config.setOptions (decorateTruth=True)
158
159 config.addBlock ('Photons.WorkingPoint')
160 config.setOptions (containerName='AnaPhotons')
161 config.setOptions (selectionName='tight')
162 config.setOptions (forceFullSimConfigForID=True)
163 config.setOptions (forceFullSimConfigForIso=True)
164 config.setOptions (qualityWP='Tight')
165 config.setOptions (isolationWP='FixedCutTight')
166 config.setOptions (recomputeIsEM=False)
167
168 config.addBlock ('Photons.PtEtaSelection')
169 config.setOptions (containerName='AnaPhotons')
170 config.setOptions (minPt=10000.0)
171
172
173 config.addBlock ('Muons', containerName='AnaMuons')
174 config.setOptions (recalibratePhyslite=False)
175 config.setOptions (decorateTruth=True)
176 config.setOptions (writeTrackD0Z0=True)
177
178 config.addBlock ('Muons.WorkingPoint')
179 config.setOptions (containerName='AnaMuons')
180 config.setOptions (selectionName='medium')
181 config.setOptions (quality='Medium')
182 config.setOptions (isolation='Loose_VarRad')
183
184 config.addBlock ('Muons.IFFClassification')
185 config.setOptions (containerName='AnaMuons')
186
187 config.addBlock ('Muons.MCTCClassification')
188 config.setOptions (containerName='AnaMuons')
189 config.setOptions (prefix='truth_')
190
191
192 config.addBlock ('TauJets', containerName='AnaTauJets')
193 config.setOptions (decorateTruth=True)
194
195 config.addBlock ('TauJets.WorkingPoint')
196 config.setOptions (containerName='AnaTauJets')
197 config.setOptions (selectionName='tight')
198 config.setOptions (quality='Tight')
199
200 tauTriggerChainsSF = {
201 2015: ['HLT_tau25_medium1_tracktwo', 'HLT_tau35_medium1_tracktwo'],
202 2016: ['HLT_tau25_medium1_tracktwo', 'HLT_tau35_medium1_tracktwo'],
203 2017: ['HLT_tau25_medium1_tracktwo', 'HLT_tau35_medium1_tracktwo'],
204 2018: ['HLT_tau25_medium1_tracktwoEF', 'HLT_tau35_medium1_tracktwoEF'],
205 2022: ['HLT_tau25_mediumRNN_tracktwoMVA', 'HLT_tau35_mediumRNN_tracktwoMVA'],
206 2023: ['HLT_tau25_mediumRNN_tracktwoMVA', 'HLT_tau35_mediumRNN_tracktwoMVA'],
207 }
208 config.addBlock ('TauJets.TriggerSF')
209 config.setOptions (containerName='AnaTauJets')
210 config.setOptions (tauID='Tight')
211 config.setOptions (triggerChainsPerYear=tauTriggerChainsSF)
212
213 config.addBlock ('TauJets.MCTCClassification')
214 config.setOptions (containerName='AnaTauJets')
215 config.setOptions (prefix='truth_')
216
217
218 config.addBlock ('InDetTracks')
219 config.setOptions (containerName='AnaTracks')
220 config.setOptions (minPt=500)
221 config.setOptions (maxEta=2.5)
222 config.setOptions (outputTrackSummaryInfo=True)
223
224 config.addBlock ('InDetTracks.WorkingPoint')
225 config.setOptions (containerName='AnaTracks')
226 config.setOptions (selectionName='tight')
227 config.setOptions (cutLevel='TightPrimary')
228
229 config.addBlock ('SystObjectLink')
230 config.setOptions (containerName='AnaJets')
231 config.addBlock ('SystObjectLink')
232 config.setOptions (containerName='AnaLargeRJets')
233 config.addBlock ('SystObjectLink')
234 config.setOptions (containerName='AnaElectrons')
235 config.addBlock ('SystObjectLink')
236 config.setOptions (containerName='AnaPhotons')
237 config.addBlock ('SystObjectLink')
238 config.setOptions (containerName='AnaMuons')
239 config.addBlock ('SystObjectLink')
240 config.setOptions (containerName='AnaTauJets')
241
242 config.addBlock ('ObjectCutFlow')
243 config.setOptions (containerName='AnaJets')
244 config.setOptions (selectionName='jvt')
245 config.addBlock ('ObjectCutFlow')
246 config.setOptions (containerName='AnaElectrons')
247 config.setOptions (selectionName='loose')
248 config.addBlock ('ObjectCutFlow')
249 config.setOptions (containerName='AnaPhotons')
250 config.setOptions (selectionName='tight')
251 config.addBlock ('ObjectCutFlow')
252 config.setOptions (containerName='AnaMuons')
253 config.setOptions (selectionName='medium')
254 config.addBlock ('ObjectCutFlow')
255 config.setOptions (containerName='AnaTauJets')
256 config.setOptions (selectionName='tight')
257 config.addBlock ('ObjectCutFlow')
258 config.setOptions (containerName='AnaTracks')
259 config.setOptions (selectionName='tight')
260
261
262 config.addBlock( 'GeneratorLevelAnalysis')
263
264
265 config.addBlock ('MissingET')
266 config.setOptions (containerName='AnaMET')
267 config.setOptions (jets='AnaJets')
268 config.setOptions (taus='AnaTauJets.tight')
269 config.setOptions (electrons='AnaElectrons.loose')
270 config.setOptions (photons='AnaPhotons.tight')
271 config.setOptions (muons='AnaMuons.medium')
272
273
274 config.addBlock( 'OverlapRemoval' )
275 config.setOptions (inputLabel='preselectOR')
276 config.setOptions (outputLabel='passesOR' )
277 config.setOptions (jets='AnaJets.baselineJvt')
278 config.setOptions (taus='AnaTauJets.tight')
279 config.setOptions (electrons='AnaElectrons.loose')
280 config.setOptions (photons='AnaPhotons.tight')
281 config.setOptions (muons='AnaMuons.medium')
282
283
284 config.addBlock ('PL_Electrons')
285 config.setOptions (containerName='TruthElectrons')
286 config.addBlock ('PL_Electrons.PtEtaSelection')
287 config.setOptions (containerName='TruthElectrons')
288 config.setOptions (skipOnData=True)
289 config.setOptions (useDressedProperties=True)
290 config.setOptions (minPt=20e3)
291 config.addBlock ('PL_Electrons.MCTCClassification')
292 config.setOptions (containerName='TruthElectrons')
293 config.setOptions (prefix='')
294
295 config.addBlock ('PL_Photons')
296 config.setOptions (containerName='TruthPhotons')
297 config.addBlock ('PL_Photons.PtEtaSelection')
298 config.setOptions (containerName='TruthPhotons')
299 config.setOptions (skipOnData=True)
300 config.setOptions (minPt=20e3)
301
302 config.addBlock ('PL_Muons')
303 config.setOptions (containerName='TruthMuons')
304 config.addBlock ('PL_Muons.PtEtaSelection')
305 config.setOptions (containerName='TruthMuons')
306 config.setOptions (skipOnData=True)
307 config.setOptions (useDressedProperties=True)
308 config.setOptions (minPt=20e3)
309 config.addBlock ('PL_Muons.MCTCClassification')
310 config.setOptions (containerName='TruthMuons')
311 config.setOptions (prefix='')
312
313 config.addBlock ('PL_Taus')
314 config.setOptions (containerName='TruthTaus')
315 config.addBlock ('PL_Taus.PtEtaSelection')
316 config.setOptions (containerName='TruthTaus')
317 config.setOptions (skipOnData=True)
318 config.setOptions (minPt=20e3)
319 config.addBlock ('PL_Taus.MCTCClassification')
320 config.setOptions (containerName='TruthTaus')
321 config.setOptions (prefix='')
322
323 config.addBlock ('PL_Jets')
324 config.setOptions (containerName='AntiKt4TruthDressedWZJets')
325 config.addBlock ('PL_Jets.PtEtaSelection')
326 config.setOptions (containerName='AntiKt4TruthDressedWZJets')
327 config.setOptions (skipOnData=True)
328 config.setOptions (minPt=20e3)
329
330 config.addBlock ('PL_Neutrinos')
331 config.setOptions (skipOnData=True)
332 config.addBlock ('PL_MissingET')
333 config.setOptions (skipOnData=True)
334
335 config.addBlock ('PL_OverlapRemoval')
336 config.setOptions (skipOnData=True)
337 config.setOptions (electrons='TruthElectrons')
338 config.setOptions (muons='TruthMuons')
339 config.setOptions (photons='TruthPhotons')
340 config.setOptions (jets='AntiKt4TruthDressedWZJets')
341 config.setOptions (useRapidityForDeltaR=False)
342
343
344 config.addBlock ('PartonHistory')
345 config.setOptions (history='Ttbar')
346
347
348 config.addBlock ('Thinning')
349 config.setOptions (containerName='AnaElectrons')
350 config.setOptions (selectionName='loose')
351 config.setOptions (outputName='OutElectrons')
352 config.addBlock ('Thinning')
353 config.setOptions (containerName='AnaPhotons')
354 config.setOptions (selectionName='tight')
355 config.setOptions (outputName='OutPhotons')
356 config.addBlock ('Thinning')
357 config.setOptions (containerName='AnaMuons')
358 config.setOptions (selectionName='medium')
359 config.setOptions (outputName='OutMuons')
360 config.addBlock ('Thinning')
361 config.setOptions (containerName='AnaTauJets')
362 config.setOptions (selectionName='tight')
363 config.setOptions (outputName='OutTauJets')
364 config.addBlock ('Thinning')
365 config.setOptions (containerName='AnaJets')
366 config.setOptions (outputName='OutJets')
367 config.addBlock ('Thinning')
368 config.setOptions (containerName='AnaLargeRJets')
369 config.setOptions (outputName='OutLargeRJets')
370 config.addBlock ('Thinning')
371 config.setOptions (containerName='AnaTracks')
372 config.setOptions (selectionName='tight')
373 config.setOptions (outputName='OutTracks')
374 config.addBlock ('Thinning')
375 config.setOptions (containerName='TruthElectrons')
376 config.setOptions (skipOnData=True)
377 config.setOptions (outputName='OutTruthElectrons')
378 config.addBlock ('Thinning')
379 config.setOptions (containerName='TruthPhotons')
380 config.setOptions (skipOnData=True)
381 config.setOptions (outputName='OutTruthPhotons')
382 config.addBlock ('Thinning')
383 config.setOptions (containerName='TruthMuons')
384 config.setOptions (skipOnData=True)
385 config.setOptions (outputName='OutTruthMuons')
386 config.addBlock ('Thinning')
387 config.setOptions (containerName='TruthTaus')
388 config.setOptions (skipOnData=True)
389 config.setOptions (outputName='OutTruthTaus')
390 config.addBlock ('Thinning')
391 config.setOptions (containerName='AntiKt4TruthDressedWZJets')
392 config.setOptions (outputName='OutTruthJets')
393 config.setOptions (skipOnData=True)
394
395
396 triggerMatchingChainsPerYear = {
397 2015: ['HLT_e24_lhmedium_L1EM20VH || HLT_e60_lhmedium || HLT_e120_lhloose', 'HLT_mu20_iloose_L1MU15 || HLT_mu40'],
398 2016: ['HLT_e26_lhtight_nod0_ivarloose || HLT_e60_lhmedium_nod0 || HLT_e140_lhloose_nod0', 'HLT_mu26_ivarmedium || HLT_mu50'],
399 2017: ['HLT_e26_lhtight_nod0_ivarloose || HLT_e60_lhmedium_nod0 || HLT_e140_lhloose_nod0', 'HLT_mu50'],
400 2018: ['HLT_e26_lhtight_nod0_ivarloose || HLT_e60_lhmedium_nod0 || HLT_e140_lhloose_nod0', 'HLT_mu26_ivarmedium'],
401 }
402 config.addBlock ('Trigger')
403 config.setOptions (triggerChainsPerYear=triggerChainsPerYear)
404 config.setOptions (noFilter=True)
405 config.setOptions (electrons='AnaElectrons.loose')
406 config.setOptions (photons='AnaPhotons.tight')
407 config.setOptions (muons='AnaMuons.medium')
408 config.setOptions (taus='AnaTauJets.tight')
409 config.setOptions (electronID='Tight')
410 config.setOptions (electronIsol='Tight_VarRad')
411 config.setOptions (photonIsol='TightCaloOnly')
412 config.setOptions (muonID='Tight')
413 config.setOptions (triggerMatchingChainsPerYear=triggerMatchingChainsPerYear)
414
415
416
417 exampleSelectionCuts = {
418 'SUBcommon': """JET_N_BTAG >= 2
419JET_N 25000 >= 4
420MET >= 20000
421SAVE
422""",
423 'ejets': """IMPORT SUBcommon
424EL_N 5000 == 1
425MU_N 3000 == 0
426MWT < 170000
427MET+MWT > 40000
428SAVE
429""",
430 'mujets': """IMPORT SUBcommon
431EL_N 5000 == 0
432MU_N medium 25000 > 0
433SAVE
434"""
435 }
436 for sel_name,sel_cuts in exampleSelectionCuts.items():
437 config.addBlock ('EventSelection')
438 config.setOptions (electrons='AnaElectrons.loose')
439 config.setOptions (muons='AnaMuons.medium')
440 config.setOptions (jets='AnaJets.baselineJvt')
441 config.setOptions (met='AnaMET')
442 config.setOptions (btagDecoration='ftag_select_ftag')
443 config.setOptions (noFilter=True)
444 config.setOptions (cutFlowHistograms=True)
445 config.setOptions (selectionName=sel_name)
446 config.setOptions (selectionCuts=sel_cuts)
447
448
449 config.addBlock ('Bootstraps')
450 config.setOptions (nReplicas=2000)
451 config.setOptions (skipOnMC=False)
452
453
454 config.addBlock ('LeptonSF')
455 config.setOptions (muons='AnaMuons.medium')
456 config.setOptions (photons='AnaPhotons.tight')
457 config.setOptions (lepton_postfix='nominal')
458
459
460 outputContainers = {
461 'mu_': 'OutMuons',
462 'el_': 'OutElectrons',
463 'ph_' : 'OutPhotons',
464 'tau_': 'OutTauJets',
465 'jet_': 'OutJets',
466 'larger_jet_': 'OutLargeRJets',
467 'met_': 'AnaMET',
468 'trk_': 'OutTracks',
469 '': 'EventInfo'}
470 outputContainersForMC = {'truth_mu_' : 'OutTruthMuons',
471 'truth_el_' : 'OutTruthElectrons',
472 'truth_ph_' : 'OutTruthPhotons',
473 'truth_tau_': 'OutTruthTaus',
474 'truth_jet_': 'OutTruthJets',
475 'truth_met_': 'TruthMET'}
476 config.addBlock ('Output')
477 config.setOptions (treeName='analysis')
478 config.setOptions (vars=[
479 'EventInfo.actualInteractionsPerCrossing -> actualMuScaled',
480 'OutMuons_NOSYS.muonType -> mu_muonType type=uint16'
481 ])
482 config.setOptions (metVars=[
483 'AnaMET_%SYS%.met -> met_%SYS%',
484 ])
485 config.setOptions (truthMetVars=[
486 'TruthMET_NOSYS.met -> truth_met',
487 ])
488 config.setOptions (containers=outputContainers)
489 config.setOptions (containersOnlyForMC=outputContainersForMC)
490 config.setOptions (commands=[
491 "disable actualInteractionsPerCrossing",
492 ])
493
494
495 config.addBlock ('PrintConfiguration')
496
497
498 configSeq = config.configure()
499
500
501 textConfig = TextConfig(yamlPath)
502 textConfigSeq = textConfig.configure()
503
504
505 compareConfigSeq(configSeq, textConfigSeq, checkOrder=checkOrder)
506
507