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