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