445 def run_card_consistency_check(self):
446 """Checks the consistency of runCardDict.
447 This function should be called before writing runCardDict to disk to ensure that the run card is consistent and has appropriate settings.
448 """
449 self.compare_runCardCasing()
450
451
452
453 if self.runCardDict.
get(
'event_norm',
None) ==
'sum':
454 self.runCardDict['event_norm'] = 'average'
455 mglog.warning("setting event_norm to average, there is basically no use case where event_norm=sum is a good idea")
456
457 if not self.isNLO:
458
459 if 'ktdurham' in self.runCardDict and float(self.runCardDict['ktdurham']) > 0 and int(self.runCardDict['ickkw']) != 0:
460 log='Bad combination of settings for CKKW-L merging! ktdurham=%s and ickkw=%s.'%(self.runCardDict['ktdurham'],self.runCardDict['ickkw'])
461 mglog.error(log)
462 raise RuntimeError(log)
463
464
465 if 'systematics_program' not in self.runCardDict or self.runCardDict['systematics_program']=='systematics':
466 syscalc_settings = ['sys_pdf', 'sys_scalefact', 'sys_alpsfact', 'sys_matchscale']
467 found_syscalc_setting = False
468 for s in syscalc_settings:
469 if s in self.runCardDict:
470 mglog.warning('Using syscalc setting '+s+' with new systematics script. Systematics script is default from 2.6.2 and steered differently (https://cp3.irmp.ucl.ac.be/projects/madgraph/wiki/Systematics#Systematicspythonmodule)')
471 found_syscalc_setting = True
472 if found_syscalc_setting:
473 syst_arguments = convertSysCalcArguments(self.runCardDict)
474 mglog.info('Converted syscalc arguments to systematics arguments: '+syst_arguments)
475 syst_settings_update = {'systematics_arguments':syst_arguments}
476 for s in syscalc_settings:
477 syst_settings_update[s] = None
478 self.runCardDict.update(syst_settings_update)
479
480
481 mglog.info('Checking PDF and systematics settings')
482 if not self.base_fragment_setup_check(MADGRAPH_PDFSETTING,self.runCardDict,self.isNLO):
483
484 syst_settings = get_pdf_and_systematic_settings(MADGRAPH_PDFSETTING,self.isNLO)
485 self.runCardDict.update(syst_settings)
486
487 if 'systematics_arguments' in self.runCardDict:
488 systematics_arguments = parse_systematics_arguments(self.runCardDict['systematics_arguments'])
489 if 'weight_info' not in systematics_arguments:
490 mglog.info('Enforcing systematic weight name convention')
491 dyn = None
492 if '--dyn' in systematics_arguments or ' dyn' in systematics_arguments:
493 if '--dyn' in systematics_arguments:
494 dyn = systematics_arguments.split('--dyn')[1]
495 if ' dyn' in systematics_arguments:
496 dyn = systematics_arguments.split(' dyn')[1]
498 if dyn is not None and len(dyn.split(','))>1:
499 systematics_arguments['weight_info'] = SYSTEMATICS_WEIGHT_INFO_ALTDYNSCALES
500 else:
501 systematics_arguments['weight_info'] = SYSTEMATICS_WEIGHT_INFO
502 self.runCardDict['systematics_arguments'] = write_systematics_arguments(systematics_arguments)
503
504 if not self.isNLO:
505 if 'python_seed' not in self.runCardDict:
506 mglog.warning('No python seed set in run_card -- adding one with same value as iseed')
507 self.runCardDict['python_seed'] = self.runCardDict['iseed']
508
509
510
511 FS_updates={}
512 proton_5flav = False
513 jet_5flav = False
514 with open(self.process_dir+'/Cards/proc_card_mg5.dat', 'r') as file:
515 content = file.readlines()
516
517 for rawline in content:
518 line = rawline.split('#')[0]
519 if line.startswith("define p"):
520 if ('b' in line.split() and 'b~' in line.split()) or ('5' in line.split() and '-5' in line.split()):
521
522 proton_5flav = True
523 if 'j' in line.split() and jet_5flav:
524 proton_5flav = True
525 if line.startswith("define j"):
526 if ('b' in line.split() and 'b~' in line.split()) or ('5' in line.split() and '-5' in line.split()):
527
528 jet_5flav = True
529 if 'p' in line.split() and proton_5flav:
530 jet_5flav = True
531 if proton_5flav or jet_5flav:
532 FS_updates['asrwgtflavor'] = 5
533
534 if not proton_5flav:
535 mglog.warning('Found 5-flavour jets but 4-flavour proton. This is inconsistent - please pick one.')
536 mglog.warning('Will proceed assuming 5-flavour scheme.')
537 if not jet_5flav:
538 mglog.warning('Found 5-flavour protons but 4-flavour jets. This is inconsistent - please pick one.')
539 mglog.warning('Will proceed assuming 5-flavour scheme.')
540 else:
541 FS_updates['asrwgtflavor'] = 4
542
543 if len(FS_updates)==0:
544 mglog.warning(f'Could not identify 4- or 5-flavor scheme from process card {self.process_dir}/Cards/proc_card_mg5.dat')
545
546
547 if 'asrwgtflavor' in self.runCardDict or 'maxjetflavor' in self.runCardDict or 'pdgs_for_merging_cut' in self.runCardDict:
548 if FS_updates['asrwgtflavor'] == 5:
549
550 if ('asrwgtflavor' in self.runCardDict and int(self.runCardDict['asrwgtflavor']) != 5) or ('maxjetflavor' in self.runCardDict and int(self.runCardDict['maxjetflavor']) != 5) or ('pdgs_for_merging_cut' in self.runCardDict and '5' not in self.runCardDict['pdgs_for_merging_cut']):
551
552 mglog.warning('b and b~ included in p and j for 5-flavor scheme but run card settings are inconsistent; adjusting run card')
553 run_card_updates = {'asrwgtflavor': 5, 'maxjetflavor': 5, 'pdgs_for_merging_cut': '1, 2, 3, 4, 5, 21'}
554
555 self.runCardDict.update( run_card_updates )
556 modify_param_card(process_dir=self.process_dir, params={'MASS': {'5': '0.000000e+00'}})
557 else:
558 mglog.debug('Consistent 5-flavor scheme setup detected.')
559
560 if FS_updates['asrwgtflavor'] == 4:
561
562 if ('asrwgtflavor' in self.runCardDict and int(self.runCardDict['asrwgtflavor']) != 4) or ('maxjetflavor' in self.runCardDict and int(self.runCardDict['maxjetflavor']) != 4) or ('pdgs_for_merging_cut' in self.runCardDict and '5' in self.runCardDict['pdgs_for_merging_cut']):
563
564 mglog.warning('b and b~ not included in p and j (4-flavor scheme) but run card settings are inconsistent; adjusting run card')
565 run_card_updates = {'asrwgtflavor': 4, 'maxjetflavor': 4, 'pdgs_for_merging_cut': '1, 2, 3, 4, 21'}
566
567 self.runCardDict.update( run_card_updates )
568 modify_param_card(process_dir=self.process_dir, params={'MASS': {'5': '4.700000e+00'}})
569 else:
570 mglog.debug('Consistent 4-flavor scheme setup detected.')
571 else:
572
573 if FS_updates['asrwgtflavor'] == 4:
574
575 mglog.warning('Flavor scheme setup is missing, adding by hand according to process card - b and b~ not included in p and j, 4-flavor scheme setup will be used; adjusting run card.')
576 run_card_updates = {'asrwgtflavor': 4, 'maxjetflavor': 4, 'pdgs_for_merging_cut': '1, 2, 3, 4, 21'}
577 self.runCardDict.update( run_card_updates )
578 modify_param_card(process_dir=self.process_dir, params={'MASS': {'5': '4.700000e+00'}})
579 elif FS_updates['asrwgtflavor'] == 5:
580 mglog.warning('Flavor scheme setup is missing, adding by hand according to process card - b and b~ included in p and j, 5-flavor scheme setup will be used; adjusting run card.')
581 run_card_updates = {'asrwgtflavor': 5, 'maxjetflavor': 5, 'pdgs_for_merging_cut': '1, 2, 3, 4, 5, 21'}
582 self.runCardDict.update( run_card_updates )
583 modify_param_card(process_dir=self.process_dir, params={'MASS': {'5': '0.000000e+00'}})
584
585 mglog.info('Finished checking run card - All OK!')
586
587
std::string replace(std::string s, const std::string &s2, const std::string &s3)
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)