diff --git a/Generators/PowhegControl/python/processes/powheg/ttbb.py b/Generators/PowhegControl/python/processes/powheg/ttbb.py index f912e14d567f06aed28368c59b7678987b54d1ac..02f52b0a19a077468512def4cfe729ea3fd646c3 100644 --- a/Generators/PowhegControl/python/processes/powheg/ttbb.py +++ b/Generators/PowhegControl/python/processes/powheg/ttbb.py @@ -2,6 +2,7 @@ from AthenaCommon import Logging from ..powheg_RES import PowhegRES +from ..external import ExternalMadSpin ## Get handle to Athena logging logger = Logging.logging.getLogger("PowhegControl") @@ -23,160 +24,188 @@ class ttbb(PowhegRES): """ super(ttbb, self).__init__(base_directory, "ttbb", **kwargs) + # Add algorithms to the sequence + #self.add_algorithm(ExternalMadSpin(process="generate p p > t t~ b b~ [QCD]")) + # Add parameter validation functions - # self.validation_functions.append("validate_decays") + self.validation_functions.append("validate_decays") ## List of allowed decay modes - # TODO: adapt! - # self.allowed_decay_modes = ["t t~ > all", "t t~ > b j j b~ j j", "t t~ > b l+ vl b~ l- vl~", "t t~ > b emu+ vemu b~ emu- vemu~", "t t~ > semileptonic"] + self.allowed_decay_modes = ["t t~ > all", "t t~ > b j j b~ j j", "t t~ > b l+ vl b~ l- vl~", "t t~ > b emu+ vemu b~ emu- vemu~", "t t~ > semileptonic", "t t~ > undecayed"] # Add all keywords for this process, overriding defaults if required - self.add_keyword("allrad", 1) - self.add_keyword("alpha") self.add_keyword("alphas_from_lhapdf", 1) - self.add_keyword("bmass") - self.add_keyword("bornktmin") - self.add_keyword("bornonly") - self.add_keyword("bornsuppfact") - self.add_keyword("bornzerodamp") - self.add_keyword("bottomthr") - self.add_keyword("bottomthrpdf") - self.add_keyword("btildeborn") - self.add_keyword("btildecoll") - self.add_keyword("btildereal") - self.add_keyword("btildevirt") - self.add_keyword("btlscalect") - self.add_keyword("btlscalereal") - self.add_keyword("charmthr") - self.add_keyword("charmthrpdf") - self.add_keyword("chklimseed") + # self.add_keyword("bornktmin") + # self.add_keyword("bornonly") + # self.add_keyword("bornsuppfact") + # self.add_keyword("bornzerodamp") + # self.add_keyword("bottomthr") + # self.add_keyword("bottomthrpdf") + # self.add_keyword("btildeborn") + # self.add_keyword("btildecoll") + # self.add_keyword("btildereal") + # self.add_keyword("btildevirt") + self.add_keyword("btlscalect", 1) + self.add_keyword("btlscalereal", 1) + # self.add_keyword("charmthr") + # self.add_keyword("charmthrpdf") + # self.add_keyword("check_bad_st2") self.add_keyword("clobberlhe") - self.add_keyword("colltest") - self.add_keyword("complexGFermi") - self.add_keyword("compress_lhe") - self.add_keyword("compress_upb") - self.add_keyword("compute_rwgt") - self.add_keyword("doublefsr") - self.add_keyword("enhancereg") - self.add_keyword("evenmaxrat") - self.add_keyword("ewscheme") + # self.add_keyword("colltest") + self.add_keyword("compress_lhe", 1) + self.add_keyword("compress_upb", 1) + # self.add_keyword("compute_rwgt") + # self.add_keyword("doublefsr") + # self.add_keyword("evenmaxrat") self.add_keyword("facscfact", self.default_scales[0]) - self.add_keyword("fastbtlbound") - self.add_keyword("fixedscale") - self.add_keyword("flg_debug") + self.add_keyword("fastbtlbound", 1) + # self.add_keyword("fixedgrid") + # self.add_keyword("fixedscale") + # self.add_keyword("flg_debug") self.add_keyword("foldcsi", 5) self.add_keyword("foldphi", 1) self.add_keyword("foldy", 5) self.add_keyword("for_reweighting", 1) self.add_keyword("fullrwgt") - self.add_keyword("hdamp", 172.5) - self.add_keyword("hfact") - self.add_keyword("hmass") - self.add_keyword("hwidth") - self.add_keyword("icsimax") + self.add_keyword("fullrwgtmode") + # self.add_keyword("hdamp") + # self.add_keyword("hfact") + self.add_keyword("icsimax", 1) self.add_keyword("ih1") self.add_keyword("ih2") self.add_keyword("itmx1", 2) - self.add_keyword("itmx1btl") - self.add_keyword("itmx1btlbrn") - self.add_keyword("itmx1rm") + # self.add_keyword("itmx1btl") + # self.add_keyword("itmx1btlbrn") + # self.add_keyword("itmx1rm") self.add_keyword("itmx2", 3) - self.add_keyword("itmx2btl") - self.add_keyword("itmx2btlbrn") - self.add_keyword("itmx2rm") - self.add_keyword("iupperfsr") - self.add_keyword("iupperisr") - self.add_keyword("iymax") + # self.add_keyword("itmx2btl") + # self.add_keyword("itmx2btlbrn") + # self.add_keyword("itmx2rm") + # self.add_keyword("iupperfsr") + # self.add_keyword("iupperisr") + self.add_keyword("iymax", 1) self.add_keyword("lhans1", self.default_PDFs) self.add_keyword("lhans2", self.default_PDFs) - self.add_keyword("lhrwgt_descr") - self.add_keyword("lhrwgt_group_combine") - self.add_keyword("lhrwgt_group_name") - self.add_keyword("lhrwgt_id") - self.add_keyword("LOevents") - self.add_keyword("manyseeds") - self.add_keyword("max_io_bufsize") - self.add_keyword("maxseeds") - self.add_keyword("minlo") - self.add_keyword("mint_density_map") - self.add_keyword("mintupbratlim") - self.add_keyword("MSbarscheme") + # self.add_keyword("lhrwgt_descr") + # self.add_keyword("lhrwgt_group_combine") + # self.add_keyword("lhrwgt_group_name") + # self.add_keyword("lhrwgt_id") + # self.add_keyword("LOevents") + self.add_keyword("manyseeds", 1) + # self.add_keyword("max_io_bufsize") + self.add_keyword("maxseeds", 1000) + # self.add_keyword("minlo") + # self.add_keyword("mint_density_map") + # self.add_keyword("mintupbratlim") + # # self.add_keyword("MSbarscheme") self.add_keyword("ncall1", 40000) - self.add_keyword("ncall1btl") - self.add_keyword("ncall1btlbrn") - self.add_keyword("ncall1rm") + # self.add_keyword("ncall1btl") + # self.add_keyword("ncall1btlbrn") + # self.add_keyword("ncall1rm") self.add_keyword("ncall2", 40000) - self.add_keyword("ncall2btl") - self.add_keyword("ncall2btlbrn") + # self.add_keyword("ncall2btl") + # self.add_keyword("ncall2btlbrn") self.add_keyword("ncall2rm", 80000) - self.add_keyword("ncallfrominput") - self.add_keyword("noevents") - self.add_keyword("nores") - self.add_keyword("novirtual") + # self.add_keyword("ncallfrominput") + # self.add_keyword("noevents") + # self.add_keyword("nores") + # self.add_keyword("novirtual") self.add_keyword("nubound", 10000) - self.add_keyword("olpreset") - self.add_keyword("olverbose") - self.add_keyword("openloops-stability") - self.add_keyword("openloopsreal") - self.add_keyword("openloopsvirtual") - self.add_keyword("par_2gsupp") - self.add_keyword("par_diexp") - self.add_keyword("par_dijexp") + # self.add_keyword("olpreset") + self.add_keyword("olverbose", 0) + # self.add_keyword("openloops-stability") + # self.add_keyword("openloopsreal") + # self.add_keyword("openloopsvirtual") + # # self.add_keyword("par_2gsupp") + # # self.add_keyword("par_diexp") + # # self.add_keyword("par_dijexp") self.add_keyword("parallelstage") - self.add_keyword("pdfreweight") - self.add_keyword("ptsqmin") - self.add_keyword("ptsupp") - self.add_keyword("radregion") - self.add_keyword("rand1") - self.add_keyword("rand2") - self.add_keyword("regridfix") + # self.add_keyword("pdfreweight") + # # self.add_keyword("ptsqmin") + # # self.add_keyword("ptsupp") + # # self.add_keyword("radregion") + # self.add_keyword("rand1") + # self.add_keyword("rand2") + # self.add_keyword("regridfix") self.add_keyword("renscfact", self.default_scales[1]) self.add_keyword("runningscales", 2) self.add_keyword("rwl_add") self.add_keyword("rwl_file") self.add_keyword("rwl_format_rwgt") self.add_keyword("rwl_group_events") - self.add_keyword("smartsig") - self.add_keyword("softmismch") - self.add_keyword("softonly") - self.add_keyword("softtest") - self.add_keyword("stage2init") - self.add_keyword("storeinfo_rwgt") - self.add_keyword("storemintupb") - self.add_keyword("testplots") - self.add_keyword("testsuda") - self.add_keyword("tmass_phsp") - self.add_keyword("tmass") - self.add_keyword("twidth") - self.add_keyword("ubexcess_correct") - self.add_keyword("ubsigmadetails", 0) # having this set to the global default '1' causes a crash during parallelstage 2! - self.add_keyword("use-old-grid") - self.add_keyword("use-old-ubound") - self.add_keyword("user_reshists_sep") - self.add_keyword("verytinypars") - self.add_keyword("virtonly") - self.add_keyword("whichpwhgevent") - self.add_keyword("withbtilde") + self.add_keyword("semileptonic", hidden=True) + # self.add_keyword("smartsig") + # self.add_keyword("softmismch") + # self.add_keyword("softonly") + # self.add_keyword("softtest") + # self.add_keyword("stage2init") + # self.add_keyword("storeinfo_rwgt") + self.add_keyword("storemintupb", 1) + self.add_keyword("tdec/bmass") + self.add_keyword("tdec/cmass") + self.add_keyword("tdec/dmass") + self.add_keyword("tdec/elbranching") + self.add_keyword("elbranching") + self.add_keyword("tdec/emass") + self.add_keyword("tdec/mumass") + self.add_keyword("tdec/sin2cabibbo") + self.add_keyword("tdec/smass") + self.add_keyword("tdec/taumass") + self.add_keyword("tdec/twidth") + self.add_keyword("tdec/umass") + self.add_keyword("tdec/wmass") + self.add_keyword("tdec/wwidth") + # # self.add_keyword("testplots") + # # self.add_keyword("testsuda") + # self.add_keyword("tmass_phsp") + # self.add_keyword("tmass") + self.add_keyword("topdecaymode", "t t~ > all", name="decay_mode") + # self.add_keyword("twidth") + # self.add_keyword("ubexcess_correct") + # self.add_keyword("ubsigmadetails", 0) # having this set to the global default '1' causes a crash during parallelstage 2! + self.add_keyword("use-old-grid", 1) + self.add_keyword("use-old-ubound", 1) + # self.add_keyword("user_reshists_sep") + # self.add_keyword("verytinypars") + # self.add_keyword("virtonly") + # self.add_keyword("whichpwhgevent") + # self.add_keyword("withbtilde") self.add_keyword("withdamp", 1) - self.add_keyword("withnegweights") - self.add_keyword("withremnants") - self.add_keyword("withsubtr") - self.add_keyword("wmass") - self.add_keyword("wwidth") + # self.add_keyword("withnegweights") + # self.add_keyword("withremnants") + # self.add_keyword("withsubtr") + # self.add_keyword("wmass") + # self.add_keyword("wwidth") self.add_keyword("xgriditeration") self.add_keyword("xupbound", 2) - self.add_keyword("zerowidth") - self.add_keyword("zmass") - self.add_keyword("zwidth") + # self.add_keyword("zerowidth") + # self.add_keyword("zmass") + # self.add_keyword("zwidth") + + def validate_decays(self): + """ + Validate semileptonic and topdecaymode keywords and translate them from ATLAS input to Powheg input + Also inform MadSpin whether Powheg will perform the top decays or not + """ + self.expose() # convenience call to simplify syntax + if self.decay_mode not in self.allowed_decay_modes: + error_message = "Decay mode '{given}' not recognised, valid choices are: '{choices}'!".format(given=self.decay_mode, choices="', '".join(self.allowed_decay_modes)) + logger.warning(error_message) + raise ValueError(error_message) + # Convert to appropriate decay mode numbers for the Powheg input: + __decay_mode_lookup = { + "t t~ > all": "22222", + "t t~ > b j j b~ j j": "00022", + "t t~ > b l+ vl b~ l- vl~": "22200", + "t t~ > b emu+ vemu b~ emu- vemu~": "22000", + "t t~ > semileptonic": "11111", + "t t~ > undecayed" : "00000", + } + self.parameters_by_keyword("topdecaymode")[0].value = __decay_mode_lookup[self.decay_mode] + if "semileptonic" in self.decay_mode: + # Parameter semileptonic must be set to 1 to actually get semileptonic decays, because the topdecaymode=11111 also allows fully hadronic decays (with one up and one charm quark) + self.parameters_by_keyword("semileptonic")[0].value = 1 + # Let MadSpin know whether tops have been decayed + if "undecayed" in self.decay_mode: + self.externals["MadSpin"].parameters_by_keyword("powheg_top_decays_enabled")[0].value = False - # def validate_decays(self): - # """! Validate semileptonic and topdecaymode keywords.""" - # self.expose() # convenience call to simplify syntax - # if self.decay_mode not in self.allowed_decay_modes: - # logger.warning("Decay mode {} not recognised!".format(self.decay_mode)) - # raise ValueError("Decay mode {} not recognised!".format(self.decay_mode)) - # # Calculate appropriate decay mode numbers - # __decay_mode_lookup = {"t t~ > all": "22222", "t t~ > b j j b~ j j": "00022", "t t~ > b l+ vl b~ l- vl~": "22200", "t t~ > b emu+ vemu b~ emu- vemu~": "22000", "t t~ > semileptonic": "11111"} - # self.parameters_by_keyword("topdecaymode")[0].value = __decay_mode_lookup[self.decay_mode] - # if self.decay_mode == "semileptonic": - # self.parameters_by_keyword("semileptonic")[0].value = 1