491 def run_card_consistency_check(self):
492 """Checks the consistency of runCardDict.
493 This function should be called before writing runCardDict to disk to ensure that the run card is consistent and has appropriate settings.
494 """
495 self.compare_runCardCasing()
496
497
498
499 if self.runCardDict.
get(
'event_norm',
None) ==
'sum':
500 self.runCardDict['event_norm'] = 'average'
501 mglog.warning("setting event_norm to average, there is basically no use case where event_norm=sum is a good idea")
502
503 if not self.isNLO:
504
505 if 'ktdurham' in self.runCardDict and float(self.runCardDict['ktdurham']) > 0 and int(self.runCardDict['ickkw']) != 0:
506 log='Bad combination of settings for CKKW-L merging! ktdurham=%s and ickkw=%s.'%(self.runCardDict['ktdurham'],self.runCardDict['ickkw'])
507 mglog.error(log)
508 raise RuntimeError(log)
509
510
511 if 'systematics_program' not in self.runCardDict or self.runCardDict['systematics_program']=='systematics':
512 syscalc_settings = ['sys_pdf', 'sys_scalefact', 'sys_alpsfact', 'sys_matchscale']
513 found_syscalc_setting = False
514 for s in syscalc_settings:
515 if s in self.runCardDict:
516 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)')
517 found_syscalc_setting = True
518 if found_syscalc_setting:
519 syst_arguments = convertSysCalcArguments(self.runCardDict)
520 mglog.info('Converted syscalc arguments to systematics arguments: '+syst_arguments)
521 syst_settings_update = {'systematics_arguments':syst_arguments}
522 for s in syscalc_settings:
523 syst_settings_update[s] = None
524 self.runCardDict.update(syst_settings_update)
525
526
527 mglog.info('Checking PDF and systematics settings')
528 if not self.base_fragment_setup_check(self.pdf_setting,self.runCardDict,self.isNLO):
529
530 syst_settings = get_pdf_and_systematic_settings(self.pdf_setting,self.isNLO)
531 self.runCardDict.update(syst_settings)
532
533 if 'systematics_arguments' in self.runCardDict:
534 systematics_arguments = parse_systematics_arguments(self.runCardDict['systematics_arguments'])
535 if 'weight_info' not in systematics_arguments:
536 mglog.info('Enforcing systematic weight name convention')
537 dyn = None
538 if '--dyn' in systematics_arguments or ' dyn' in systematics_arguments:
539 if '--dyn' in systematics_arguments:
540 dyn = systematics_arguments.split('--dyn')[1]
541 if ' dyn' in systematics_arguments:
542 dyn = systematics_arguments.split(' dyn')[1]
544 if dyn is not None and len(dyn.split(','))>1:
545 systematics_arguments['weight_info'] = SYSTEMATICS_WEIGHT_INFO_ALTDYNSCALES
546 else:
547 systematics_arguments['weight_info'] = SYSTEMATICS_WEIGHT_INFO
548 self.runCardDict['systematics_arguments'] = write_systematics_arguments(systematics_arguments)
549
550 if not self.isNLO:
551 if 'python_seed' not in self.runCardDict:
552 mglog.warning('No python seed set in run_card -- adding one with same value as iseed')
553 self.runCardDict['python_seed'] = self.runCardDict['iseed']
554
555
556
557 FS_updates={}
558 proton_5flav = False
559 jet_5flav = False
560 with open(self.process_dir+'/Cards/proc_card_mg5.dat', 'r') as file:
561 content = file.readlines()
562
563 for rawline in content:
564 line = rawline.split('#')[0]
565 if line.startswith("define p"):
566 if ('b' in line.split() and 'b~' in line.split()) or ('5' in line.split() and '-5' in line.split()):
567
568 proton_5flav = True
569 if 'j' in line.split() and jet_5flav:
570 proton_5flav = True
571 if line.startswith("define j"):
572 if ('b' in line.split() and 'b~' in line.split()) or ('5' in line.split() and '-5' in line.split()):
573
574 jet_5flav = True
575 if 'p' in line.split() and proton_5flav:
576 jet_5flav = True
577 if proton_5flav or jet_5flav:
578 FS_updates['asrwgtflavor'] = 5
579
580 if not proton_5flav:
581 mglog.warning('Found 5-flavour jets but 4-flavour proton. This is inconsistent - please pick one.')
582 mglog.warning('Will proceed assuming 5-flavour scheme.')
583 if not jet_5flav:
584 mglog.warning('Found 5-flavour protons but 4-flavour jets. This is inconsistent - please pick one.')
585 mglog.warning('Will proceed assuming 5-flavour scheme.')
586 else:
587 FS_updates['asrwgtflavor'] = 4
588
589 if len(FS_updates)==0:
590 mglog.warning(f'Could not identify 4- or 5-flavor scheme from process card {self.process_dir}/Cards/proc_card_mg5.dat')
591
592
593 if 'asrwgtflavor' in self.runCardDict or 'maxjetflavor' in self.runCardDict or 'pdgs_for_merging_cut' in self.runCardDict:
594 if FS_updates['asrwgtflavor'] == 5:
595
596 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']):
597
598 mglog.warning('b and b~ included in p and j for 5-flavor scheme but run card settings are inconsistent; adjusting run card')
599 run_card_updates = {'asrwgtflavor': 5, 'maxjetflavor': 5, 'pdgs_for_merging_cut': '1, 2, 3, 4, 5, 21'}
600
601 self.runCardDict.update( run_card_updates )
602 modify_param_card(process_dir=self.process_dir, params={'MASS': {'5': '0.000000e+00'}})
603 else:
604 mglog.debug('Consistent 5-flavor scheme setup detected.')
605
606 if FS_updates['asrwgtflavor'] == 4:
607
608 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']):
609
610 mglog.warning('b and b~ not included in p and j (4-flavor scheme) but run card settings are inconsistent; adjusting run card')
611 run_card_updates = {'asrwgtflavor': 4, 'maxjetflavor': 4, 'pdgs_for_merging_cut': '1, 2, 3, 4, 21'}
612
613 self.runCardDict.update( run_card_updates )
614 modify_param_card(process_dir=self.process_dir, params={'MASS': {'5': '4.700000e+00'}})
615 else:
616 mglog.debug('Consistent 4-flavor scheme setup detected.')
617 else:
618
619 if FS_updates['asrwgtflavor'] == 4:
620
621 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.')
622 run_card_updates = {'asrwgtflavor': 4, 'maxjetflavor': 4, 'pdgs_for_merging_cut': '1, 2, 3, 4, 21'}
623 self.runCardDict.update( run_card_updates )
624 modify_param_card(process_dir=self.process_dir, params={'MASS': {'5': '4.700000e+00'}})
625 elif FS_updates['asrwgtflavor'] == 5:
626 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.')
627 run_card_updates = {'asrwgtflavor': 5, 'maxjetflavor': 5, 'pdgs_for_merging_cut': '1, 2, 3, 4, 5, 21'}
628 self.runCardDict.update( run_card_updates )
629 modify_param_card(process_dir=self.process_dir, params={'MASS': {'5': '0.000000e+00'}})
630
631
632 if '91.188' not in self.runCardDict.
get(
'scale',
'91.188')
and self.runCardDict.
get(
'fixed_ren_scale',
'f').lower()
in [
'f',
'false']:
633 mglog.error('Seems you set "scale" in the run card without setting "fixed_ren_scale" to True. Not sure what to do here, throwing an error.')
634 raise ValueError("Renormalization scale setting incorrect")
635 if (
'91.188' not in self.runCardDict.
get(
'dsqrt_q2fact1',
'91.188')
or '91.188' not in self.runCardDict.
get(
'dsqrt_q2fact2',
'91.188')) \
636 and self.runCardDict.
get(
'fixed_fac_scale',
'f').lower()
in [
'f',
'false']:
637 mglog.error('Seems you set "dsqrt_q2fact1" or "dsqrt_q2fact2" in the run card without setting "fixed_fac_scale" to True. Not sure what to do here, throwing an error.')
638 raise ValueError("Factorization scale setting incorrect")
639
640 mglog.info('Finished checking run card - All OK!')
641
642
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?)