From 758af55d34ef5e444ab2240e474aebe00092e45f Mon Sep 17 00:00:00 2001 From: Brent Yates Date: Fri, 29 Aug 2025 08:44:32 -0500 Subject: [PATCH 01/15] First pass at restrict cards --- mcgeneration/configure_gridpack.py | 3 +- mcgeneration/helpers/Gridpack.py | 6 + mcgeneration/helpers/helper_tools.py | 340 +++++++++++++++++++++++++++ 3 files changed, 348 insertions(+), 1 deletion(-) diff --git a/mcgeneration/configure_gridpack.py b/mcgeneration/configure_gridpack.py index 637446e..f23ec45 100644 --- a/mcgeneration/configure_gridpack.py +++ b/mcgeneration/configure_gridpack.py @@ -458,6 +458,7 @@ def main(): stype = ScanType.FROMFILE btype = BatchType.CMSCONNECT tag = 'Run3_52WCs_SMEFTsim_top' + restrict = False runs = 1 # if set to 0, will only make a single gridpack npts = 0 #scan_files = [ @@ -565,7 +566,7 @@ def main(): sm_pt = {} for dof in dof_list: sm_pt[dof.getName()] = 0.0 - gridpack = Gridpack(stype=stype,btype=btype,default_limits=[-20.0,20.0]) + gridpack = Gridpack(stype=stype,btype=btype,default_limits=[-20.0,20.0],restrict=restrict) gridpack.setOptions(runcard_ops=rc_ops) # For using a different model gridpack.setOptions(coupling_string="SMHLOOP=0 NP=1 NPprop=0",replace_model=["SMEFTsim_topU3l_MwScheme_UFO","SMEFTsim_top_MwScheme_UFO"]) diff --git a/mcgeneration/helpers/Gridpack.py b/mcgeneration/helpers/Gridpack.py index 489ecd1..a5d4612 100644 --- a/mcgeneration/helpers/Gridpack.py +++ b/mcgeneration/helpers/Gridpack.py @@ -65,6 +65,7 @@ def __init__(self,**kwargs): 'replace_model': None, # If not None overwrites the import model line of the process card 'flavor_scheme': 5, 'default_limits': [-10,10], + 'restrict': False, } self.setOptions(**kwargs) @@ -203,6 +204,7 @@ def saveProcessCard(self,indent=0): if self.ops['replace_model']: old = self.ops['replace_model'][0] new = self.ops['replace_model'][1] + if self.ops['restrict']: new += '_' + self.ops['process'] print("{ind}Using {model} model".format(model=new,ind=indent_str)) sed_str = "s|import model {old}|import model {new}|g".format(old=old,new=new) subprocess.Popen(['sed','-i','-e',sed_str,fpath]).communicate() @@ -229,6 +231,10 @@ def saveReweightCard(self): save_scan_points(scanfile,self.ops['coeffs'],self.scan_pts) make_reweight_card(rwgt_tar,self.ops['coeffs'],self.scan_pts) + # FIXME automate paths + if self.ops['restrict']: + mpath = 'addons/models/SMEFTsim_topU3l_MwScheme_UFO_ctGpatched/restrict_massless_q_{ops}.dat'.format(ops=self.ops["process"]) + make_restrict_card(mpath, self.ops['coeffs']) return rwgt_tar diff --git a/mcgeneration/helpers/helper_tools.py b/mcgeneration/helpers/helper_tools.py index b00868d..b5eedce 100644 --- a/mcgeneration/helpers/helper_tools.py +++ b/mcgeneration/helpers/helper_tools.py @@ -96,6 +96,346 @@ def make_reweight_card(file_name,dofs,pts): f.write("\nset %s %.6f" % (k2,v2)) f.write("\n") +# Create the MadGraph restrict card with scans over the specified W.C. phase space points +def make_restrict_card(file_name,dofs): + wc_dict = OrderedDict() + wc_dict["cG"] = (" 1", "0.200000e+00" ) + wc_dict["cW"] = (" 2", "0.300000e+00" ) + wc_dict["cH"] = (" 3", "0.400000e+00" ) + wc_dict["cHbox"] = (" 4", "0.500000e+00" ) + wc_dict["cHDD"] = (" 5", "0.600000e+00" ) + wc_dict["cHG"] = (" 6", "0.700000e+00" ) + wc_dict["cHW"] = (" 7", "0.800000e+00" ) + wc_dict["cHB"] = (" 8", "0.900000e+00" ) + wc_dict["cHWB"] = (" 9", "0.020000e+00" ) + wc_dict["cuHRe"] = (" 10", "0.030000e+00" ) + wc_dict["ctHRe"] = (" 11", "0.040000e+00" ) + wc_dict["cdHRe"] = (" 12", "0.050000e+00" ) + wc_dict["cbHRe"] = (" 13", "0.060000e+00" ) + wc_dict["cuGRe"] = (" 14", "0.070000e+00" ) + wc_dict["ctGRe"] = (" 15", "0.080000e+00" ) + wc_dict["cuWRe"] = (" 16", "0.090000e+00" ) + wc_dict["ctWRe"] = (" 17", "0.002000e+00" ) + wc_dict["cuBRe"] = (" 18", "0.003000e+00" ) + wc_dict["ctBRe"] = (" 19", "0.004000e+00" ) + wc_dict["cdGRe"] = (" 20", "0.005000e+00" ) + wc_dict["cbGRe"] = (" 21", "0.006000e+00" ) + wc_dict["cdWRe"] = (" 22", "0.007000e+00" ) + wc_dict["cbWRe"] = (" 23", "0.008000e+00" ) + wc_dict["cdBRe"] = (" 24", "0.009000e+00" ) + wc_dict["cbBRe"] = (" 25", "0.000200e+00" ) + wc_dict["cHj1"] = (" 26", "0.000300e+00" ) + wc_dict["cHQ1"] = (" 27", "0.000400e+00" ) + wc_dict["cHj3"] = (" 28", "0.000500e+00" ) + wc_dict["cHQ3"] = (" 29", "0.000600e+00" ) + wc_dict["cHu"] = (" 30", "0.000700e+00" ) + wc_dict["cHt"] = (" 31", "0.000800e+00" ) + wc_dict["cHd"] = (" 32", "0.000900e+00" ) + wc_dict["cHbq"] = (" 33", "0.000020e+00" ) + wc_dict["cHudRe"] = (" 34", "0.000030e+00" ) + wc_dict["cHtbRe"] = (" 35", "0.000040e+00" ) + wc_dict["cjj11"] = (" 36", "0.000050e+00" ) + wc_dict["cjj18"] = (" 37", "0.000060e+00" ) + wc_dict["cjj31"] = (" 38", "0.000070e+00" ) + wc_dict["cjj38"] = (" 39", "0.000080e+00" ) + wc_dict["cQj11"] = (" 40", "0.000090e+00" ) + wc_dict["cQj18"] = (" 41", "0.000002e+00" ) + wc_dict["cQj31"] = (" 42", "0.000003e+00" ) + wc_dict["cQj38"] = (" 43", "0.000004e+00" ) + wc_dict["cQQ1"] = (" 44", "0.000005e+00" ) + wc_dict["cQQ8"] = (" 45", "0.000006e+00" ) + wc_dict["cuu1"] = (" 46", "0.000007e+00" ) + wc_dict["cuu8"] = (" 47", "0.000008e+00" ) + wc_dict["ctt"] = (" 48", "0.000009e+00" ) + wc_dict["ctu1"] = (" 49", "0.1100000e+00") + wc_dict["ctu8"] = (" 50", "0.1200000e+00") + wc_dict["cdd1"] = (" 51", "0.1300000e+00") + wc_dict["cdd8"] = (" 52", "0.1400000e+00") + wc_dict["cbb"] = (" 53", "0.1500000e+00") + wc_dict["cbd1"] = (" 54", "0.1600000e+00") + wc_dict["cbd8"] = (" 55", "0.1700000e+00") + wc_dict["cud1"] = (" 56", "0.1800000e+00") + wc_dict["ctb1"] = (" 57", "0.1900000e+00") + wc_dict["ctd1"] = (" 58", "0.2100000e+00") + wc_dict["cbu1"] = (" 59", "0.2200000e+00") + wc_dict["cud8"] = (" 60", "0.2300000e+00") + wc_dict["ctb8"] = (" 61", "0.2400000e+00") + wc_dict["ctd8"] = (" 62", "0.2500000e+00") + wc_dict["cbu8"] = (" 63", "0.2600000e+00") + wc_dict["cutbd1Re"] = (" 64", "0.2700000e+00") + wc_dict["cutbd8Re"] = (" 65", "0.2800000e+00") + wc_dict["cju1"] = (" 66", "0.2900000e+00") + wc_dict["cQu1"] = (" 67", "0.3100000e+00") + wc_dict["cju8"] = (" 68", "0.3200000e+00") + wc_dict["cQu8"] = (" 69", "0.3300000e+00") + wc_dict["ctj1"] = (" 70", "0.3400000e+00") + wc_dict["ctj8"] = (" 71", "0.3500000e+00") + wc_dict["cQt1"] = (" 72", "0.3600000e+00") + wc_dict["cQt8"] = (" 73", "0.3700000e+00") + wc_dict["cjd1"] = (" 74", "0.3800000e+00") + wc_dict["cjd8"] = (" 75", "0.3900000e+00") + wc_dict["cQd1"] = (" 76", "0.4100000e+00") + wc_dict["cQd8"] = (" 77", "0.4200000e+00") + wc_dict["cbj1"] = (" 78", "0.4300000e+00") + wc_dict["cbj8"] = (" 79", "0.4400000e+00") + wc_dict["cQb1"] = (" 80", "0.4500000e+00") + wc_dict["cQb8"] = (" 81", "0.4600000e+00") + wc_dict["cjQtu1Re"] = (" 82", "0.4700000e+00") + wc_dict["cjQtu8Re"] = (" 83", "0.4800000e+00") + wc_dict["cjQbd1Re"] = (" 84", "0.4900000e+00") + wc_dict["cjQbd8Re"] = (" 85", "0.5100000e+00") + wc_dict["cjujd1Re"] = (" 86", "0.5200000e+00") + wc_dict["cjujd8Re"] = (" 87", "0.5300000e+00") + wc_dict["cjujd11Re"] = (" 88", "0.5400000e+00") + wc_dict["cjujd81Re"] = (" 89", "0.5500000e+00") + wc_dict["cQtjd1Re"] = (" 90", "0.5600000e+00") + wc_dict["cQtjd8Re"] = (" 91", "0.5700000e+00") + wc_dict["cjuQb1Re"] = (" 92", "0.5800000e+00") + wc_dict["cjuQb8Re"] = (" 93", "0.5900000e+00") + wc_dict["cQujb1Re"] = (" 94", "0.6100000e+00") + wc_dict["cQujb8Re"] = (" 95", "0.6200000e+00") + wc_dict["cjtQd1Re"] = (" 96", "0.6300000e+00") + wc_dict["cjtQd8Re"] = (" 97", "0.6400000e+00") + wc_dict["cQtQb1Re"] = (" 98", "0.6500000e+00") + wc_dict["cQtQb8Re"] = (" 99", "0.6600000e+00") + wc_dict["ceHRe"] = (100, "0.6700000e+00") + wc_dict["ceWRe"] = (101, "0.6800000e+00") + wc_dict["ceBRe"] = (102, "0.6900000e+00") + wc_dict["cHl1"] = (103, "0.7100000e+00") + wc_dict["cHl3"] = (104, "0.7200000e+00") + wc_dict["cHe"] = (105, "0.7300000e+00") + wc_dict["cll"] = (106, "0.7400000e+00") + wc_dict["cll1"] = (107, "0.7500000e+00") + wc_dict["clj1"] = (108, "0.7600000e+00") + wc_dict["clj3"] = (109, "0.7700000e+00") + wc_dict["cQl1"] = (110, "0.7800000e+00") + wc_dict["cQl3"] = (111, "0.7900000e+00") + wc_dict["cee"] = (112, "0.8100000e+00") + wc_dict["ceu"] = (113, "0.8200000e+00") + wc_dict["cte"] = (114, "0.8300000e+00") + wc_dict["ced"] = (115, "0.8400000e+00") + wc_dict["cbe"] = (116, "0.8500000e+00") + wc_dict["cje"] = (117, "0.8600000e+00") + wc_dict["cQe"] = (118, "0.8700000e+00") + wc_dict["clu"] = (119, "0.8800000e+00") + wc_dict["ctl"] = (120, "0.8900000e+00") + wc_dict["cld"] = (121, "0.9100000e+00") + wc_dict["cbl"] = (122, "0.9200000e+00") + wc_dict["cle"] = (123, "0.9300000e+00") + wc_dict["cledjRe"] = (124, "0.9400000e+00") + wc_dict["clebQRe"] = (125, "0.9500000e+00") + wc_dict["cleju1Re"] = (126, "0.9600000e+00") + wc_dict["cleQt1Re"] = (127, "0.9700000e+00") + wc_dict["cleju3Re"] = (128, "0.9800000e+00") + wc_dict["cleQt3Re"] = (129, "0.9900000e+00") + + header = "" + header += "######################################################################\n" + header += "## PARAM_CARD AUTOMATICALY GENERATED BY THE UFO #####################\n" + header += "######################################################################\n" + header += "\n" + header += "###################################\n" + header += "## INFORMATION FOR SMINPUTS\n" + header += "###################################\n" + header += "Block SMINPUTS \n" + header += " 1 8.038700e+01 # MW \n" + header += " 2 1.166379e-05 # Gf \n" + header += " 3 1.179000e-01 # aS \n" + header += "\n" + header += "###################################\n" + header += "## INFORMATION FOR MASS\n" + header += "###################################\n" + header += "Block MASS \n" + header += " 1 0.000000e+00 # MD \n" + header += " 2 0.000000e+00 # MU \n" + header += " 3 0.000000e+00 # MS \n" + header += " 4 0.000000e+00 # MC \n" + header += " 5 0.000000e+00 # MB \n" + header += " 6 1.727600e+02 # MT \n" + header += " 11 1.727600e+02 # Me\n" + header += " 13 1.740691e+02 # MMU\n" + header += " 15 1.742157e+02 # MTA\n" + #header += " 11 0.000000e+00 # Me \n" + #header += " 13 0.000000e+00 # MMU \n" + #header += " 15 0.000000e+00 # MTA \n" + header += " 23 9.118760e+01 # MZ \n" + header += " 25 1.250900e+02 # MH \n" + header += "## Not dependent paramater.\n" + header += "## Those values should be edited following analytical the \n" + header += "## analytical expression. Some generator could simply ignore \n" + header += "## those values and use the analytical expression\n" + header += " 22 0.000000 # a : 0.0 \n" + header += " 21 0.000000 # g : 0.0 \n" + header += " 9000005 91.187600 # Z1 : MZ \n" + header += " 9000006 80.387000 # W1+ : MWsm \n" + header += " 12 0.000000 # ve : 0.0 \n" + header += " 14 0.000000 # vm : 0.0 \n" + header += " 16 0.000000 # vt : 0.0 \n" + header += " 9000007 172.760000 # t1 : MT \n" + header += " 9000008 125.090000 # H1 : MH \n" + header += " 24 80.387000 # W+ : MW \n" + header += "\n" + header += "###################################\n" + header += "## INFORMATION FOR DECAY\n" + header += "###################################\n" + header += "DECAY 6 1.330000e+00 \n" + header += "DECAY 23 2.495200e+00 \n" + header += "DECAY 24 2.085000e+00 \n" + header += "DECAY 25 4.070000e-03 \n" + header += "## Not dependent paramater.\n" + header += "## Those values should be edited following analytical the \n" + header += "## analytical expression. Some generator could simply ignore \n" + header += "## those values and use the analytical expression\n" + header += "DECAY 22 0.000000 # a : 0.0 \n" + header += "DECAY 21 0.000000 # g : 0.0 \n" + header += "DECAY 9000005 2.495200 # Z1 : WZ \n" + header += "DECAY 9000006 2.085000 # W1+ : WW \n" + header += "DECAY 12 0.000000 # ve : 0.0 \n" + header += "DECAY 14 0.000000 # vm : 0.0 \n" + header += "DECAY 16 0.000000 # vt : 0.0 \n" + header += "DECAY 11 0.000000 # e- : 0.0 \n" + header += "DECAY 13 0.000000 # mu- : 0.0 \n" + header += "DECAY 15 0.000000 # ta- : 0.0 \n" + header += "DECAY 2 0.000000 # u : 0.0 \n" + header += "DECAY 4 0.000000 # c : 0.0 \n" + header += "DECAY 1 0.000000 # d : 0.0 \n" + header += "DECAY 3 0.000000 # s : 0.0 \n" + header += "DECAY 5 0.000000 # b : 0.0 \n" + header += "DECAY 9000007 1.330000 # t1 : WT \n" + header += "DECAY 9000008 0.004070 # H1 : WH \n" + header += "\n" + header += "###################################\n" + header += "## INFORMATION FOR SWITCHES\n" + header += "###################################\n" + header += "Block SWITCHES \n" + header += " 1 0.000000e+00 # linearPropCorrections \n" + header += "\n" + header += "###################################\n" + header += "## INFORMATION FOR SMEFTCUTOFF\n" + header += "###################################\n" + header += "Block SMEFTcutoff \n" + header += " 1 1.000000e+03 # LambdaSMEFT \n" + header += "\n" + header += "###################################\n" + header += "## INFORMATION FOR SMEFT\n" + header += "###################################\n" + header += "Block SMEFT \n" + + footer = "" + footer += "\n" + footer += "###################################\n" + footer += "## INFORMATION FOR SMEFTCPV\n" + footer += "###################################\n" + footer += "Block SMEFTcpv \n" + footer += " 1 0.000000e+00 # cGtil \n" + footer += " 2 0.000000e+00 # cWtil \n" + footer += " 3 0.000000e+00 # cHGtil \n" + footer += " 4 0.000000e+00 # cHWtil \n" + footer += " 5 0.000000e+00 # cHBtil \n" + footer += " 6 0.000000e+00 # cHWBtil \n" + footer += " 7 0.000000e+00 # cuGIm \n" + footer += " 8 0.000000e+00 # ctGIm \n" + footer += " 9 0.000000e+00 # cuWIm \n" + footer += " 10 0.000000e+00 # ctWIm \n" + footer += " 11 0.000000e+00 # cuBIm \n" + footer += " 12 0.000000e+00 # ctBIm \n" + footer += " 13 0.000000e+00 # cdGIm \n" + footer += " 14 0.000000e+00 # cbGIm \n" + footer += " 15 0.000000e+00 # cdWIm \n" + footer += " 16 0.000000e+00 # cbWIm \n" + footer += " 17 0.000000e+00 # cdBIm \n" + footer += " 18 0.000000e+00 # cbBIm \n" + footer += " 19 0.000000e+00 # cuHIm \n" + footer += " 20 0.000000e+00 # ctHIm \n" + footer += " 21 0.000000e+00 # cdHIm \n" + footer += " 22 0.000000e+00 # cbHIm \n" + footer += " 23 0.000000e+00 # cHudIm \n" + footer += " 24 0.000000e+00 # cHtbIm \n" + footer += " 25 0.000000e+00 # cutbd1Im \n" + footer += " 26 0.000000e+00 # cutbd8Im \n" + footer += " 27 0.000000e+00 # cjQtu1Im \n" + footer += " 28 0.000000e+00 # cjQtu8Im \n" + footer += " 29 0.000000e+00 # cjQbd1Im \n" + footer += " 30 0.000000e+00 # cjQbd8Im \n" + footer += " 31 0.000000e+00 # cjujd1Im \n" + footer += " 32 0.000000e+00 # cjujd8Im \n" + footer += " 33 0.000000e+00 # cjujd11Im \n" + footer += " 34 0.000000e+00 # cjujd81Im \n" + footer += " 35 0.000000e+00 # cQtjd1Im \n" + footer += " 36 0.000000e+00 # cQtjd8Im \n" + footer += " 37 0.000000e+00 # cjuQb1Im \n" + footer += " 38 0.000000e+00 # cjuQb8Im \n" + footer += " 39 0.000000e+00 # cQujb1Im \n" + footer += " 40 0.000000e+00 # cQujb8Im \n" + footer += " 41 0.000000e+00 # cjtQd1Im \n" + footer += " 42 0.000000e+00 # cjtQd8Im \n" + footer += " 43 0.000000e+00 # cQtQb1Im \n" + footer += " 44 0.000000e+00 # cQtQb8Im \n" + footer += " 45 0.000000e+00 # ceHIm \n" + footer += " 46 0.000000e+00 # ceWIm \n" + footer += " 47 0.000000e+00 # ceBIm \n" + footer += " 48 0.000000e+00 # cledjIm \n" + footer += " 49 0.000000e+00 # clebQIm \n" + footer += " 50 0.000000e+00 # cleju1Im \n" + footer += " 51 0.000000e+00 # cleju3Im \n" + footer += " 52 0.000000e+00 # cleQt1Im \n" + footer += " 53 0.000000e+00 # cleQt3Im \n" + footer += "\n" + footer += "###################################\n" + footer += "## INFORMATION FOR YUKAWA\n" + footer += "###################################\n" + footer += "Block YUKAWA \n" + footer += " 1 0.000000e+00 # ymdo \n" + footer += " 2 0.000000e+00 # ymup \n" + footer += " 3 0.000000e+00 # yms \n" + footer += " 4 0.000000e+00 # ymc \n" + footer += " 5 0.000000e+00 # ymb \n" + footer += " 6 1.727600e+02 # ymt \n" + # massless + #footer += " 11 0.000000e+00 # yme \n" + #footer += " 13 0.000000e+00 # ymm \n" + #footer += " 15 0.000000e+00 # ymtau \n" + # massless_q + footer += " 11 1.727600e+02 # yme \n" + footer += " 13 1.740691e+02 # ymm \n" + footer += " 15 1.742157e+02 # ymtau \n" + #footer += " 11 5.110000e-04 # yme \n" + #footer += " 13 1.056600e-01 # ymm \n" + #footer += " 15 1.777000e+00 # ymtau \n" + footer += "#===========================================================\n" + footer += "# QUANTUM NUMBERS OF NEW STATE(S) (NON SM PDG CODE)\n" + footer += "#===========================================================\n" + footer += "\n" + footer += "Block QNUMBERS 9000005 # Z1 \n" + footer += " 1 0 # 3 times electric charge\n" + footer += " 2 3 # number of spin states (2S+1)\n" + footer += " 3 1 # colour rep (1: singlet, 3: triplet, 8: octet)\n" + footer += " 4 0 # Particle/Antiparticle distinction (0=own anti)\n" + footer += "Block QNUMBERS 9000006 # W1+ \n" + footer += " 1 3 # 3 times electric charge\n" + footer += " 2 3 # number of spin states (2S+1)\n" + footer += " 3 1 # colour rep (1: singlet, 3: triplet, 8: octet)\n" + footer += " 4 1 # Particle/Antiparticle distinction (0=own anti)\n" + footer += "Block QNUMBERS 9000007 # t1 \n" + footer += " 1 2 # 3 times electric charge\n" + footer += " 2 2 # number of spin states (2S+1)\n" + footer += " 3 3 # colour rep (1: singlet, 3: triplet, 8: octet)\n" + footer += " 4 1 # Particle/Antiparticle distinction (0=own anti)\n" + footer += "Block QNUMBERS 9000008 # H1 \n" + footer += " 1 0 # 3 times electric charge\n" + footer += " 2 1 # number of spin states (2S+1)\n" + footer += " 3 1 # colour rep (1: singlet, 3: triplet, 8: octet)\n" + footer += " 4 0 # Particle/Antiparticle distinction (0=own anti)\n" + + with open(file_name,'w') as f: + f.write(header) + for wc,(num,val) in wc_dict.items(): + if wc in dofs: + f.write(" {num} {val} # {wc}\n".format(num=num, val=val, wc=wc)) + else: + f.write(" {num} 0.0000000e+00 # {wc}\n".format(num=num, wc=wc)) + f.write(footer) + # Reads a limit file and returns a dictionary mapping the WCs to their respective high,low limits to use def parse_limit_file(fpath): wc_limits = {} From 4e6d762d0fa0f79ea9698fd469698a1215021a07 Mon Sep 17 00:00:00 2001 From: Andrew42 Date: Fri, 29 Aug 2025 17:10:12 -0500 Subject: [PATCH 02/15] Change default example tag back to Example1 --- mcgeneration/configure_gridpack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcgeneration/configure_gridpack.py b/mcgeneration/configure_gridpack.py index f23ec45..aa6ecd7 100644 --- a/mcgeneration/configure_gridpack.py +++ b/mcgeneration/configure_gridpack.py @@ -457,7 +457,7 @@ def main(): random.seed() stype = ScanType.FROMFILE btype = BatchType.CMSCONNECT - tag = 'Run3_52WCs_SMEFTsim_top' + tag = 'Example1' restrict = False runs = 1 # if set to 0, will only make a single gridpack npts = 0 From e44e52a475cea407548e1765f0c8e88dcf641099 Mon Sep 17 00:00:00 2001 From: Andrew42 Date: Fri, 29 Aug 2025 17:35:25 -0500 Subject: [PATCH 03/15] Rework function to create restrict card --- mcgeneration/helpers/helper_tools.py | 402 +++++---------------------- 1 file changed, 63 insertions(+), 339 deletions(-) diff --git a/mcgeneration/helpers/helper_tools.py b/mcgeneration/helpers/helper_tools.py index b5eedce..afc4962 100644 --- a/mcgeneration/helpers/helper_tools.py +++ b/mcgeneration/helpers/helper_tools.py @@ -96,345 +96,69 @@ def make_reweight_card(file_name,dofs,pts): f.write("\nset %s %.6f" % (k2,v2)) f.write("\n") -# Create the MadGraph restrict card with scans over the specified W.C. phase space points -def make_restrict_card(file_name,dofs): - wc_dict = OrderedDict() - wc_dict["cG"] = (" 1", "0.200000e+00" ) - wc_dict["cW"] = (" 2", "0.300000e+00" ) - wc_dict["cH"] = (" 3", "0.400000e+00" ) - wc_dict["cHbox"] = (" 4", "0.500000e+00" ) - wc_dict["cHDD"] = (" 5", "0.600000e+00" ) - wc_dict["cHG"] = (" 6", "0.700000e+00" ) - wc_dict["cHW"] = (" 7", "0.800000e+00" ) - wc_dict["cHB"] = (" 8", "0.900000e+00" ) - wc_dict["cHWB"] = (" 9", "0.020000e+00" ) - wc_dict["cuHRe"] = (" 10", "0.030000e+00" ) - wc_dict["ctHRe"] = (" 11", "0.040000e+00" ) - wc_dict["cdHRe"] = (" 12", "0.050000e+00" ) - wc_dict["cbHRe"] = (" 13", "0.060000e+00" ) - wc_dict["cuGRe"] = (" 14", "0.070000e+00" ) - wc_dict["ctGRe"] = (" 15", "0.080000e+00" ) - wc_dict["cuWRe"] = (" 16", "0.090000e+00" ) - wc_dict["ctWRe"] = (" 17", "0.002000e+00" ) - wc_dict["cuBRe"] = (" 18", "0.003000e+00" ) - wc_dict["ctBRe"] = (" 19", "0.004000e+00" ) - wc_dict["cdGRe"] = (" 20", "0.005000e+00" ) - wc_dict["cbGRe"] = (" 21", "0.006000e+00" ) - wc_dict["cdWRe"] = (" 22", "0.007000e+00" ) - wc_dict["cbWRe"] = (" 23", "0.008000e+00" ) - wc_dict["cdBRe"] = (" 24", "0.009000e+00" ) - wc_dict["cbBRe"] = (" 25", "0.000200e+00" ) - wc_dict["cHj1"] = (" 26", "0.000300e+00" ) - wc_dict["cHQ1"] = (" 27", "0.000400e+00" ) - wc_dict["cHj3"] = (" 28", "0.000500e+00" ) - wc_dict["cHQ3"] = (" 29", "0.000600e+00" ) - wc_dict["cHu"] = (" 30", "0.000700e+00" ) - wc_dict["cHt"] = (" 31", "0.000800e+00" ) - wc_dict["cHd"] = (" 32", "0.000900e+00" ) - wc_dict["cHbq"] = (" 33", "0.000020e+00" ) - wc_dict["cHudRe"] = (" 34", "0.000030e+00" ) - wc_dict["cHtbRe"] = (" 35", "0.000040e+00" ) - wc_dict["cjj11"] = (" 36", "0.000050e+00" ) - wc_dict["cjj18"] = (" 37", "0.000060e+00" ) - wc_dict["cjj31"] = (" 38", "0.000070e+00" ) - wc_dict["cjj38"] = (" 39", "0.000080e+00" ) - wc_dict["cQj11"] = (" 40", "0.000090e+00" ) - wc_dict["cQj18"] = (" 41", "0.000002e+00" ) - wc_dict["cQj31"] = (" 42", "0.000003e+00" ) - wc_dict["cQj38"] = (" 43", "0.000004e+00" ) - wc_dict["cQQ1"] = (" 44", "0.000005e+00" ) - wc_dict["cQQ8"] = (" 45", "0.000006e+00" ) - wc_dict["cuu1"] = (" 46", "0.000007e+00" ) - wc_dict["cuu8"] = (" 47", "0.000008e+00" ) - wc_dict["ctt"] = (" 48", "0.000009e+00" ) - wc_dict["ctu1"] = (" 49", "0.1100000e+00") - wc_dict["ctu8"] = (" 50", "0.1200000e+00") - wc_dict["cdd1"] = (" 51", "0.1300000e+00") - wc_dict["cdd8"] = (" 52", "0.1400000e+00") - wc_dict["cbb"] = (" 53", "0.1500000e+00") - wc_dict["cbd1"] = (" 54", "0.1600000e+00") - wc_dict["cbd8"] = (" 55", "0.1700000e+00") - wc_dict["cud1"] = (" 56", "0.1800000e+00") - wc_dict["ctb1"] = (" 57", "0.1900000e+00") - wc_dict["ctd1"] = (" 58", "0.2100000e+00") - wc_dict["cbu1"] = (" 59", "0.2200000e+00") - wc_dict["cud8"] = (" 60", "0.2300000e+00") - wc_dict["ctb8"] = (" 61", "0.2400000e+00") - wc_dict["ctd8"] = (" 62", "0.2500000e+00") - wc_dict["cbu8"] = (" 63", "0.2600000e+00") - wc_dict["cutbd1Re"] = (" 64", "0.2700000e+00") - wc_dict["cutbd8Re"] = (" 65", "0.2800000e+00") - wc_dict["cju1"] = (" 66", "0.2900000e+00") - wc_dict["cQu1"] = (" 67", "0.3100000e+00") - wc_dict["cju8"] = (" 68", "0.3200000e+00") - wc_dict["cQu8"] = (" 69", "0.3300000e+00") - wc_dict["ctj1"] = (" 70", "0.3400000e+00") - wc_dict["ctj8"] = (" 71", "0.3500000e+00") - wc_dict["cQt1"] = (" 72", "0.3600000e+00") - wc_dict["cQt8"] = (" 73", "0.3700000e+00") - wc_dict["cjd1"] = (" 74", "0.3800000e+00") - wc_dict["cjd8"] = (" 75", "0.3900000e+00") - wc_dict["cQd1"] = (" 76", "0.4100000e+00") - wc_dict["cQd8"] = (" 77", "0.4200000e+00") - wc_dict["cbj1"] = (" 78", "0.4300000e+00") - wc_dict["cbj8"] = (" 79", "0.4400000e+00") - wc_dict["cQb1"] = (" 80", "0.4500000e+00") - wc_dict["cQb8"] = (" 81", "0.4600000e+00") - wc_dict["cjQtu1Re"] = (" 82", "0.4700000e+00") - wc_dict["cjQtu8Re"] = (" 83", "0.4800000e+00") - wc_dict["cjQbd1Re"] = (" 84", "0.4900000e+00") - wc_dict["cjQbd8Re"] = (" 85", "0.5100000e+00") - wc_dict["cjujd1Re"] = (" 86", "0.5200000e+00") - wc_dict["cjujd8Re"] = (" 87", "0.5300000e+00") - wc_dict["cjujd11Re"] = (" 88", "0.5400000e+00") - wc_dict["cjujd81Re"] = (" 89", "0.5500000e+00") - wc_dict["cQtjd1Re"] = (" 90", "0.5600000e+00") - wc_dict["cQtjd8Re"] = (" 91", "0.5700000e+00") - wc_dict["cjuQb1Re"] = (" 92", "0.5800000e+00") - wc_dict["cjuQb8Re"] = (" 93", "0.5900000e+00") - wc_dict["cQujb1Re"] = (" 94", "0.6100000e+00") - wc_dict["cQujb8Re"] = (" 95", "0.6200000e+00") - wc_dict["cjtQd1Re"] = (" 96", "0.6300000e+00") - wc_dict["cjtQd8Re"] = (" 97", "0.6400000e+00") - wc_dict["cQtQb1Re"] = (" 98", "0.6500000e+00") - wc_dict["cQtQb8Re"] = (" 99", "0.6600000e+00") - wc_dict["ceHRe"] = (100, "0.6700000e+00") - wc_dict["ceWRe"] = (101, "0.6800000e+00") - wc_dict["ceBRe"] = (102, "0.6900000e+00") - wc_dict["cHl1"] = (103, "0.7100000e+00") - wc_dict["cHl3"] = (104, "0.7200000e+00") - wc_dict["cHe"] = (105, "0.7300000e+00") - wc_dict["cll"] = (106, "0.7400000e+00") - wc_dict["cll1"] = (107, "0.7500000e+00") - wc_dict["clj1"] = (108, "0.7600000e+00") - wc_dict["clj3"] = (109, "0.7700000e+00") - wc_dict["cQl1"] = (110, "0.7800000e+00") - wc_dict["cQl3"] = (111, "0.7900000e+00") - wc_dict["cee"] = (112, "0.8100000e+00") - wc_dict["ceu"] = (113, "0.8200000e+00") - wc_dict["cte"] = (114, "0.8300000e+00") - wc_dict["ced"] = (115, "0.8400000e+00") - wc_dict["cbe"] = (116, "0.8500000e+00") - wc_dict["cje"] = (117, "0.8600000e+00") - wc_dict["cQe"] = (118, "0.8700000e+00") - wc_dict["clu"] = (119, "0.8800000e+00") - wc_dict["ctl"] = (120, "0.8900000e+00") - wc_dict["cld"] = (121, "0.9100000e+00") - wc_dict["cbl"] = (122, "0.9200000e+00") - wc_dict["cle"] = (123, "0.9300000e+00") - wc_dict["cledjRe"] = (124, "0.9400000e+00") - wc_dict["clebQRe"] = (125, "0.9500000e+00") - wc_dict["cleju1Re"] = (126, "0.9600000e+00") - wc_dict["cleQt1Re"] = (127, "0.9700000e+00") - wc_dict["cleju3Re"] = (128, "0.9800000e+00") - wc_dict["cleQt3Re"] = (129, "0.9900000e+00") - - header = "" - header += "######################################################################\n" - header += "## PARAM_CARD AUTOMATICALY GENERATED BY THE UFO #####################\n" - header += "######################################################################\n" - header += "\n" - header += "###################################\n" - header += "## INFORMATION FOR SMINPUTS\n" - header += "###################################\n" - header += "Block SMINPUTS \n" - header += " 1 8.038700e+01 # MW \n" - header += " 2 1.166379e-05 # Gf \n" - header += " 3 1.179000e-01 # aS \n" - header += "\n" - header += "###################################\n" - header += "## INFORMATION FOR MASS\n" - header += "###################################\n" - header += "Block MASS \n" - header += " 1 0.000000e+00 # MD \n" - header += " 2 0.000000e+00 # MU \n" - header += " 3 0.000000e+00 # MS \n" - header += " 4 0.000000e+00 # MC \n" - header += " 5 0.000000e+00 # MB \n" - header += " 6 1.727600e+02 # MT \n" - header += " 11 1.727600e+02 # Me\n" - header += " 13 1.740691e+02 # MMU\n" - header += " 15 1.742157e+02 # MTA\n" - #header += " 11 0.000000e+00 # Me \n" - #header += " 13 0.000000e+00 # MMU \n" - #header += " 15 0.000000e+00 # MTA \n" - header += " 23 9.118760e+01 # MZ \n" - header += " 25 1.250900e+02 # MH \n" - header += "## Not dependent paramater.\n" - header += "## Those values should be edited following analytical the \n" - header += "## analytical expression. Some generator could simply ignore \n" - header += "## those values and use the analytical expression\n" - header += " 22 0.000000 # a : 0.0 \n" - header += " 21 0.000000 # g : 0.0 \n" - header += " 9000005 91.187600 # Z1 : MZ \n" - header += " 9000006 80.387000 # W1+ : MWsm \n" - header += " 12 0.000000 # ve : 0.0 \n" - header += " 14 0.000000 # vm : 0.0 \n" - header += " 16 0.000000 # vt : 0.0 \n" - header += " 9000007 172.760000 # t1 : MT \n" - header += " 9000008 125.090000 # H1 : MH \n" - header += " 24 80.387000 # W+ : MW \n" - header += "\n" - header += "###################################\n" - header += "## INFORMATION FOR DECAY\n" - header += "###################################\n" - header += "DECAY 6 1.330000e+00 \n" - header += "DECAY 23 2.495200e+00 \n" - header += "DECAY 24 2.085000e+00 \n" - header += "DECAY 25 4.070000e-03 \n" - header += "## Not dependent paramater.\n" - header += "## Those values should be edited following analytical the \n" - header += "## analytical expression. Some generator could simply ignore \n" - header += "## those values and use the analytical expression\n" - header += "DECAY 22 0.000000 # a : 0.0 \n" - header += "DECAY 21 0.000000 # g : 0.0 \n" - header += "DECAY 9000005 2.495200 # Z1 : WZ \n" - header += "DECAY 9000006 2.085000 # W1+ : WW \n" - header += "DECAY 12 0.000000 # ve : 0.0 \n" - header += "DECAY 14 0.000000 # vm : 0.0 \n" - header += "DECAY 16 0.000000 # vt : 0.0 \n" - header += "DECAY 11 0.000000 # e- : 0.0 \n" - header += "DECAY 13 0.000000 # mu- : 0.0 \n" - header += "DECAY 15 0.000000 # ta- : 0.0 \n" - header += "DECAY 2 0.000000 # u : 0.0 \n" - header += "DECAY 4 0.000000 # c : 0.0 \n" - header += "DECAY 1 0.000000 # d : 0.0 \n" - header += "DECAY 3 0.000000 # s : 0.0 \n" - header += "DECAY 5 0.000000 # b : 0.0 \n" - header += "DECAY 9000007 1.330000 # t1 : WT \n" - header += "DECAY 9000008 0.004070 # H1 : WH \n" - header += "\n" - header += "###################################\n" - header += "## INFORMATION FOR SWITCHES\n" - header += "###################################\n" - header += "Block SWITCHES \n" - header += " 1 0.000000e+00 # linearPropCorrections \n" - header += "\n" - header += "###################################\n" - header += "## INFORMATION FOR SMEFTCUTOFF\n" - header += "###################################\n" - header += "Block SMEFTcutoff \n" - header += " 1 1.000000e+03 # LambdaSMEFT \n" - header += "\n" - header += "###################################\n" - header += "## INFORMATION FOR SMEFT\n" - header += "###################################\n" - header += "Block SMEFT \n" - - footer = "" - footer += "\n" - footer += "###################################\n" - footer += "## INFORMATION FOR SMEFTCPV\n" - footer += "###################################\n" - footer += "Block SMEFTcpv \n" - footer += " 1 0.000000e+00 # cGtil \n" - footer += " 2 0.000000e+00 # cWtil \n" - footer += " 3 0.000000e+00 # cHGtil \n" - footer += " 4 0.000000e+00 # cHWtil \n" - footer += " 5 0.000000e+00 # cHBtil \n" - footer += " 6 0.000000e+00 # cHWBtil \n" - footer += " 7 0.000000e+00 # cuGIm \n" - footer += " 8 0.000000e+00 # ctGIm \n" - footer += " 9 0.000000e+00 # cuWIm \n" - footer += " 10 0.000000e+00 # ctWIm \n" - footer += " 11 0.000000e+00 # cuBIm \n" - footer += " 12 0.000000e+00 # ctBIm \n" - footer += " 13 0.000000e+00 # cdGIm \n" - footer += " 14 0.000000e+00 # cbGIm \n" - footer += " 15 0.000000e+00 # cdWIm \n" - footer += " 16 0.000000e+00 # cbWIm \n" - footer += " 17 0.000000e+00 # cdBIm \n" - footer += " 18 0.000000e+00 # cbBIm \n" - footer += " 19 0.000000e+00 # cuHIm \n" - footer += " 20 0.000000e+00 # ctHIm \n" - footer += " 21 0.000000e+00 # cdHIm \n" - footer += " 22 0.000000e+00 # cbHIm \n" - footer += " 23 0.000000e+00 # cHudIm \n" - footer += " 24 0.000000e+00 # cHtbIm \n" - footer += " 25 0.000000e+00 # cutbd1Im \n" - footer += " 26 0.000000e+00 # cutbd8Im \n" - footer += " 27 0.000000e+00 # cjQtu1Im \n" - footer += " 28 0.000000e+00 # cjQtu8Im \n" - footer += " 29 0.000000e+00 # cjQbd1Im \n" - footer += " 30 0.000000e+00 # cjQbd8Im \n" - footer += " 31 0.000000e+00 # cjujd1Im \n" - footer += " 32 0.000000e+00 # cjujd8Im \n" - footer += " 33 0.000000e+00 # cjujd11Im \n" - footer += " 34 0.000000e+00 # cjujd81Im \n" - footer += " 35 0.000000e+00 # cQtjd1Im \n" - footer += " 36 0.000000e+00 # cQtjd8Im \n" - footer += " 37 0.000000e+00 # cjuQb1Im \n" - footer += " 38 0.000000e+00 # cjuQb8Im \n" - footer += " 39 0.000000e+00 # cQujb1Im \n" - footer += " 40 0.000000e+00 # cQujb8Im \n" - footer += " 41 0.000000e+00 # cjtQd1Im \n" - footer += " 42 0.000000e+00 # cjtQd8Im \n" - footer += " 43 0.000000e+00 # cQtQb1Im \n" - footer += " 44 0.000000e+00 # cQtQb8Im \n" - footer += " 45 0.000000e+00 # ceHIm \n" - footer += " 46 0.000000e+00 # ceWIm \n" - footer += " 47 0.000000e+00 # ceBIm \n" - footer += " 48 0.000000e+00 # cledjIm \n" - footer += " 49 0.000000e+00 # clebQIm \n" - footer += " 50 0.000000e+00 # cleju1Im \n" - footer += " 51 0.000000e+00 # cleju3Im \n" - footer += " 52 0.000000e+00 # cleQt1Im \n" - footer += " 53 0.000000e+00 # cleQt3Im \n" - footer += "\n" - footer += "###################################\n" - footer += "## INFORMATION FOR YUKAWA\n" - footer += "###################################\n" - footer += "Block YUKAWA \n" - footer += " 1 0.000000e+00 # ymdo \n" - footer += " 2 0.000000e+00 # ymup \n" - footer += " 3 0.000000e+00 # yms \n" - footer += " 4 0.000000e+00 # ymc \n" - footer += " 5 0.000000e+00 # ymb \n" - footer += " 6 1.727600e+02 # ymt \n" - # massless - #footer += " 11 0.000000e+00 # yme \n" - #footer += " 13 0.000000e+00 # ymm \n" - #footer += " 15 0.000000e+00 # ymtau \n" - # massless_q - footer += " 11 1.727600e+02 # yme \n" - footer += " 13 1.740691e+02 # ymm \n" - footer += " 15 1.742157e+02 # ymtau \n" - #footer += " 11 5.110000e-04 # yme \n" - #footer += " 13 1.056600e-01 # ymm \n" - #footer += " 15 1.777000e+00 # ymtau \n" - footer += "#===========================================================\n" - footer += "# QUANTUM NUMBERS OF NEW STATE(S) (NON SM PDG CODE)\n" - footer += "#===========================================================\n" - footer += "\n" - footer += "Block QNUMBERS 9000005 # Z1 \n" - footer += " 1 0 # 3 times electric charge\n" - footer += " 2 3 # number of spin states (2S+1)\n" - footer += " 3 1 # colour rep (1: singlet, 3: triplet, 8: octet)\n" - footer += " 4 0 # Particle/Antiparticle distinction (0=own anti)\n" - footer += "Block QNUMBERS 9000006 # W1+ \n" - footer += " 1 3 # 3 times electric charge\n" - footer += " 2 3 # number of spin states (2S+1)\n" - footer += " 3 1 # colour rep (1: singlet, 3: triplet, 8: octet)\n" - footer += " 4 1 # Particle/Antiparticle distinction (0=own anti)\n" - footer += "Block QNUMBERS 9000007 # t1 \n" - footer += " 1 2 # 3 times electric charge\n" - footer += " 2 2 # number of spin states (2S+1)\n" - footer += " 3 3 # colour rep (1: singlet, 3: triplet, 8: octet)\n" - footer += " 4 1 # Particle/Antiparticle distinction (0=own anti)\n" - footer += "Block QNUMBERS 9000008 # H1 \n" - footer += " 1 0 # 3 times electric charge\n" - footer += " 2 1 # number of spin states (2S+1)\n" - footer += " 3 1 # colour rep (1: singlet, 3: triplet, 8: octet)\n" - footer += " 4 0 # Particle/Antiparticle distinction (0=own anti)\n" - - with open(file_name,'w') as f: - f.write(header) - for wc,(num,val) in wc_dict.items(): - if wc in dofs: - f.write(" {num} {val} # {wc}\n".format(num=num, val=val, wc=wc)) - else: - f.write(" {num} 0.0000000e+00 # {wc}\n".format(num=num, wc=wc)) - f.write(footer) +def make_restrict_card(file_name,out_fname,keep=True,**blocks): + ''' + file_name: Name of the restrict card to read, which will serve as the basis for the new restrict card + out_fname: Name of the modified restrict card + keep: If true, then for a given block, the listed parameters will be NOT zero'd out. + If false, then for a given block, the listed parameters will be zero'd out. + blocks: { + "block_A" : ["param1"."param2", ...], + "block_B" : [ ... ], + } + ''' + counter = 1 + indent = " "*2 + lines = [] + block = None + with open(file_name,'r') as f: + for l in f.readlines(): + # Check if this ENTIRE line is a comment + is_comment = l.startswith("#") + # Check if this line specifies the start of a new LHA block section + is_block_header = l.lower().startswith("block") + # Check if this line is an empty line + is_empty_line = len(l) == 0 + # Skip lines we know we won't need to edit + skip = is_comment or is_block_header or is_empty_line + + if is_block_header: + # Store the name of the current block + block = l.split()[1] + + if l.lower().startswith("decay"): + # Decay lines are their own thing separate from LHA block stuff, so don't mess with them + skip = True + elif block == "QNUMBERS": + # QNUMBERS blocks have a bit different syntax then other blocks, so avoid them as well + skip = True + + + # Avoid dealing with lines that should never need to be edited + if not skip: + data, param_name = [x.strip() for x in l.split(" # ")] + # data should always be 2 numbers separated by a single space + idx, value = data.split() + if blocks.has_key(block): + params = blocks[block] + if keep: + # Zero out any params that aren't specified + if param_name in params: + l = f"{indent}{idx:>3} 0.{counter:0>7}e+00 # {param_name}" + counter += 1 + else: + l = f"{indent}{idx:>3} 0.0000000e+00 # {param_name}" + else: + # Zero out any params that are specified + if param_name in params: + l = f"{indent}{idx:>3} 0.0000000e+00 # {param_name}" + else: + l = f"{indent}{idx:>3} 0.{counter:0>7}e+00 # {param_name}" + counter += 1 + # The new restrict card should be (as far as lines go) a 1-to-1 mirror of the base card + lines.append(l) + with open(out_file,'w') as f: + f.write("\n".join(lines)) # Reads a limit file and returns a dictionary mapping the WCs to their respective high,low limits to use def parse_limit_file(fpath): From ee18f977fa7b5bc3c32c19ff33bbb2215c3f92d6 Mon Sep 17 00:00:00 2001 From: Brent Yates Date: Tue, 2 Sep 2025 10:14:26 -0500 Subject: [PATCH 04/15] Minor fixes for restrict cards --- mcgeneration/helpers/Gridpack.py | 12 ++++++++---- mcgeneration/helpers/helper_tools.py | 9 ++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/mcgeneration/helpers/Gridpack.py b/mcgeneration/helpers/Gridpack.py index a5d4612..88f3e52 100644 --- a/mcgeneration/helpers/Gridpack.py +++ b/mcgeneration/helpers/Gridpack.py @@ -204,7 +204,9 @@ def saveProcessCard(self,indent=0): if self.ops['replace_model']: old = self.ops['replace_model'][0] new = self.ops['replace_model'][1] - if self.ops['restrict']: new += '_' + self.ops['process'] + if self.ops['restrict']: new += f'-massless_{self.ops["process"]}' + if len(list(self.ops['coeffs'])) == 1: + new += f'_{list(self.ops["coeffs"])[0]}' print("{ind}Using {model} model".format(model=new,ind=indent_str)) sed_str = "s|import model {old}|import model {new}|g".format(old=old,new=new) subprocess.Popen(['sed','-i','-e',sed_str,fpath]).communicate() @@ -231,10 +233,12 @@ def saveReweightCard(self): save_scan_points(scanfile,self.ops['coeffs'],self.scan_pts) make_reweight_card(rwgt_tar,self.ops['coeffs'],self.scan_pts) - # FIXME automate paths if self.ops['restrict']: - mpath = 'addons/models/SMEFTsim_topU3l_MwScheme_UFO_ctGpatched/restrict_massless_q_{ops}.dat'.format(ops=self.ops["process"]) - make_restrict_card(mpath, self.ops['coeffs']) + mpath = 'addons/models/SMEFTsim_top_MwScheme_UFO/restrict_massless.dat' + ompath = f'addons/models/SMEFTsim_top_MwScheme_UFO/restrict_massless_{self.ops["process"]}.dat' + if len(list(self.ops['coeffs'])) == 1: + ompath = ompath[:-4] + f'_{list(self.ops["coeffs"])[0]}.dat' + make_restrict_card(mpath, ompath, keep=True, SMEFT=list(self.ops['coeffs'])) return rwgt_tar diff --git a/mcgeneration/helpers/helper_tools.py b/mcgeneration/helpers/helper_tools.py index afc4962..6da50d9 100644 --- a/mcgeneration/helpers/helper_tools.py +++ b/mcgeneration/helpers/helper_tools.py @@ -136,10 +136,13 @@ def make_restrict_card(file_name,out_fname,keep=True,**blocks): # Avoid dealing with lines that should never need to be edited if not skip: + x = l.split(' # ') + if len(x) == 1: + continue data, param_name = [x.strip() for x in l.split(" # ")] # data should always be 2 numbers separated by a single space idx, value = data.split() - if blocks.has_key(block): + if block in blocks: params = blocks[block] if keep: # Zero out any params that aren't specified @@ -156,8 +159,8 @@ def make_restrict_card(file_name,out_fname,keep=True,**blocks): l = f"{indent}{idx:>3} 0.{counter:0>7}e+00 # {param_name}" counter += 1 # The new restrict card should be (as far as lines go) a 1-to-1 mirror of the base card - lines.append(l) - with open(out_file,'w') as f: + lines.append(l.rstrip()) + with open(out_fname,'w') as f: f.write("\n".join(lines)) # Reads a limit file and returns a dictionary mapping the WCs to their respective high,low limits to use From 311e0cf2e20679128cae17ac971f654e4e8a527f Mon Sep 17 00:00:00 2001 From: Andrew42 Date: Wed, 3 Sep 2025 17:22:23 -0500 Subject: [PATCH 05/15] First complete implementation of restrict card machinery --- mcgeneration/configure_gridpack.py | 39 ++++++++++++++++++-- mcgeneration/helpers/Gridpack.py | 46 ++++++++++++++++++++++-- mcgeneration/helpers/helper_tools.py | 54 +++++++++++++++++----------- 3 files changed, 114 insertions(+), 25 deletions(-) diff --git a/mcgeneration/configure_gridpack.py b/mcgeneration/configure_gridpack.py index aa6ecd7..70e7bf9 100644 --- a/mcgeneration/configure_gridpack.py +++ b/mcgeneration/configure_gridpack.py @@ -370,6 +370,33 @@ def submit_1dim_jobs(gp,dofs,npts,runs,tag_postfix='',max_submits=-1,run_wl={}): high_lim = round(wc_limits[lim_key][1],6) else: low_lim,high_lim = gp.getOption('default_limits') + + ############################### + restrict_ops = gp.getOption('restrict') + if restrict_ops: + # The getModel() method takes care of the case where we've specified a different model than + # what the MGProcess process card uses + model = gp.getModel() + model_dir = "addons/models/{model}".format(model=model) + ref_restrict = restrict_ops['ref'] + new_restrict = "{ref}_{name}.dat".format(ref=ref_restrict.removesuffix('.dat'),name=dof.getName()) + ref_restrict = os.path.join(model_dir,ref_restrict) + new_restrict = os.path.join(model_dir,new_restrict) + # Create a new restrict card in the directory of the model specified by the MGProcess + keep = restrict_ops['keep'] + # Its ok to specify a parameter that doesn't show up in a particular lhablock. Also, + # for operators that have been defined as linear combinations, we need to use the actual + # parameter names, rather than what we get from dof.getName() + blocks = {k: list(dof.getCoefficients()) for k in restrict_ops['blocks']} + make_restrict_card(ref_restrict,new_restrict,keep=keep,**blocks) + # We can't use the 'replace_model' option to set the restrict card as this will overwrite + # that option, which might have already been used to specify a different model. Modifying + # the gridpack options like this feels rather dangerous, but not sure how to do this + # any other way + restrict_ops['replace'] = [model,new_model] + gp.setOptions(restrict=restrict_ops) + ############################### + for idx,start in enumerate(linspace(low_lim,high_lim,runs)): if run_wl.has_key(dof_name) and idx not in run_wl[dof_name]: continue @@ -458,7 +485,14 @@ def main(): stype = ScanType.FROMFILE btype = BatchType.CMSCONNECT tag = 'Example1' - restrict = False + # Set the restrict option to None or False to avoid using the restrict card machinary + restrict = { + "ref": "restrict_massless.dat", # Name of the restrict card to use as the reference + "blocks": ["SMEFT","SMEFTcpv"], # Name of the lhablock(s) that we want to modify + "keep": True, # Keep only the parameters we specify + "replace": None, # This needs to be set prior to each Gridpack.setup() call + } + # restrict = None runs = 1 # if set to 0, will only make a single gridpack npts = 0 #scan_files = [ @@ -566,10 +600,11 @@ def main(): sm_pt = {} for dof in dof_list: sm_pt[dof.getName()] = 0.0 - gridpack = Gridpack(stype=stype,btype=btype,default_limits=[-20.0,20.0],restrict=restrict) + gridpack = Gridpack(stype=stype,btype=btype,default_limits=[-20.0,20.0]) gridpack.setOptions(runcard_ops=rc_ops) # For using a different model gridpack.setOptions(coupling_string="SMHLOOP=0 NP=1 NPprop=0",replace_model=["SMEFTsim_topU3l_MwScheme_UFO","SMEFTsim_top_MwScheme_UFO"]) + gridpack.setOptions(restrict=restrict) # For creating feynman diagrams #gridpack.setOptions(btype=BatchType.LOCAL,save_diagrams=True,replace_model="dim6top_LO_UFO_each_coupling_order_v2020-05-19") #gridpack.setOptions(coupling_string="FCNC=0 DIM6^2=1 DIM6_ctB^2=1 DIM6_ctW^2=1") # For example diff --git a/mcgeneration/helpers/Gridpack.py b/mcgeneration/helpers/Gridpack.py index 88f3e52..257487c 100644 --- a/mcgeneration/helpers/Gridpack.py +++ b/mcgeneration/helpers/Gridpack.py @@ -111,6 +111,35 @@ def setProcess(self,p): flavor_scheme=p.getFlavorScheme(self.CARD_DIR) ) + # The (baseline) model is defined for the process card, which is specified by the MGProcess. If + # the user has specified a new model via the 'replace_model' option, then the model we get from + # the template process card likely won't be the same model that gets used in the actual process + # card that MG reads. This is b/c we replace the 'import model' line in the >copied< version of + # the process card. + def getModel(self): + if not self.getOption("process"): + raise RuntimeError("No process set") + if self.getOption("replace_model"): + # User has specified a different model to use, so we return that one + old, new = self.getOption("replace_model") + # If the new model actually corresponds to a restrict card, we need to only return the + # piece that corresponds to the model as a whole. MG syntax for restrict cards is of + # the form: MODEL-RESTRICT, this also means that we should never use a '-' anywhere in + # the name of a model or a restrict card + new = new.split('-')[0] + return new + process_card = os.path.join(self.HOME_DIR,self.CARD_DIR,self.ops['template_dir'],self.ops['process_card']) + search_str = "import model" + with open(process_card,'r') as f: + for l in f.readlines(): + # Ignore comments + l = l.split(sep="#",maxsplit=1)[0] + l = l.strip() + if l.startswith(search_str): + model = l[len(search_str):] + return model.strip() + raise RuntimeError("Unable to find 'import model' line in {pcard} for {pname}".format(pcard=self.ops['process_card'],pname=self.ops['process'])) + def loadRunCard(self): """ Parses a MadGraph run card, which can then be modified independent @@ -204,13 +233,24 @@ def saveProcessCard(self,indent=0): if self.ops['replace_model']: old = self.ops['replace_model'][0] new = self.ops['replace_model'][1] - if self.ops['restrict']: new += f'-massless_{self.ops["process"]}' - if len(list(self.ops['coeffs'])) == 1: - new += f'_{list(self.ops["coeffs"])[0]}' print("{ind}Using {model} model".format(model=new,ind=indent_str)) sed_str = "s|import model {old}|import model {new}|g".format(old=old,new=new) subprocess.Popen(['sed','-i','-e',sed_str,fpath]).communicate() + # Note: It is assumed that the user has made sure that the 'replace' info matches what the + # current state of the copied process card is, e.g. if 'replace_model' has been used, + # then the 'model' part of the 'replace' info should already correspond to w/e the + # 'replace_model' option changed things to. + # TODO: Since the getModel() method does take care to consider the case where the user has + # specified the 'replace_model' option, we might be able to use that to help ensure + # things are a little more consistent. The user would still be responsible for making + # sure the restrict card exists and is placed in the correct location. + if self.ops['restrict']: + model, restrict = self.ops['restrict']['replace'] + print("{ind}Using restrict card {restrict} for model {model}".format(model=model,restrict=restrict)) + sed_str = "s|import model {model}|import model {restrict}|g".format(model=model,restrict=restrict) + subprocess.Popen(['sed','-i','-e',sed_str,fpath]).communicate() + # Replace SUBSETUP in the process card with the correct name sed_str = "s|SUBSETUP|{setup}|g".format(setup=setup) subprocess.Popen(['sed','-i','-e',sed_str,fpath]).communicate() diff --git a/mcgeneration/helpers/helper_tools.py b/mcgeneration/helpers/helper_tools.py index 6da50d9..768adfa 100644 --- a/mcgeneration/helpers/helper_tools.py +++ b/mcgeneration/helpers/helper_tools.py @@ -96,49 +96,61 @@ def make_reweight_card(file_name,dofs,pts): f.write("\nset %s %.6f" % (k2,v2)) f.write("\n") -def make_restrict_card(file_name,out_fname,keep=True,**blocks): +def make_restrict_card(ref_fpath,out_fpath,keep=True,**blocks): ''' - file_name: Name of the restrict card to read, which will serve as the basis for the new restrict card - out_fname: Name of the modified restrict card + ref_fpath: Full path to the reference restrict card to read, which will serve as the basis + for the new restrict card + out_fpath: Full path to write the modified restrict card to. keep: If true, then for a given block, the listed parameters will be NOT zero'd out. If false, then for a given block, the listed parameters will be zero'd out. blocks: { - "block_A" : ["param1"."param2", ...], + "block_A" : ["param1", "param2", ...], "block_B" : [ ... ], } + + NOTE: If a lhablock is not included as part of the 'blocks' dictionary, then all parameters + in that block will be untouched. If you want to zero out all parameters for a particular + block, then simply include that block and give it an empty list (with keep=True). + + NOTE: The keys of the 'blocks' dictionary are case sensitive and need to match exactly with + how they are spelled in the reference restrict card. The same goes for the parameter + names. + + NOTE: The newly made restrict card needs to be placed in the directory of the model that the + process card intends to use, e.g. "addons/models/NAME_OF_MODEL". The gridpack_generation.sh + script has a line that will copy everything under "addons/models" into the MG base + directory that gets created on the fly in gridpack_generation.sh. This is how MG is able + to find custom models that aren't default included in MG. + + NOTE: The 'for' loop explicitly avoids using any 'continue' statements, since we want the + new restrict card to be a 1-to-1 match of the original, with the only changes being + the values of specific parameters in certain lhablocks. ''' counter = 1 indent = " "*2 lines = [] block = None - with open(file_name,'r') as f: - for l in f.readlines(): + with open(ref_fpath,'r') as f: + for line_no,l in enumerate(f.readlines()): # Check if this ENTIRE line is a comment is_comment = l.startswith("#") # Check if this line specifies the start of a new LHA block section is_block_header = l.lower().startswith("block") # Check if this line is an empty line - is_empty_line = len(l) == 0 + is_empty_line = len(l.strip()) == 0 # Skip lines we know we won't need to edit skip = is_comment or is_block_header or is_empty_line - if is_block_header: # Store the name of the current block block = l.split()[1] - if l.lower().startswith("decay"): # Decay lines are their own thing separate from LHA block stuff, so don't mess with them skip = True elif block == "QNUMBERS": # QNUMBERS blocks have a bit different syntax then other blocks, so avoid them as well skip = True - - # Avoid dealing with lines that should never need to be edited if not skip: - x = l.split(' # ') - if len(x) == 1: - continue data, param_name = [x.strip() for x in l.split(" # ")] # data should always be 2 numbers separated by a single space idx, value = data.split() @@ -147,21 +159,23 @@ def make_restrict_card(file_name,out_fname,keep=True,**blocks): if keep: # Zero out any params that aren't specified if param_name in params: - l = f"{indent}{idx:>3} 0.{counter:0>7}e+00 # {param_name}" + l = f"{indent}{idx:>3} 0.{counter:0<7}e+00 # {param_name} " counter += 1 else: - l = f"{indent}{idx:>3} 0.0000000e+00 # {param_name}" + l = f"{indent}{idx:>3} 0.0000000e+00 # {param_name} " else: # Zero out any params that are specified if param_name in params: - l = f"{indent}{idx:>3} 0.0000000e+00 # {param_name}" + l = f"{indent}{idx:>3} 0.0000000e+00 # {param_name} " else: - l = f"{indent}{idx:>3} 0.{counter:0>7}e+00 # {param_name}" + l = f"{indent}{idx:>3} 0.{counter:0<7}e+00 # {param_name} " counter += 1 # The new restrict card should be (as far as lines go) a 1-to-1 mirror of the base card - lines.append(l.rstrip()) - with open(out_fname,'w') as f: + lines.append(l.rstrip("\n")) + + with open(out_fpath,'w') as f: f.write("\n".join(lines)) + f.write("\n") # Reads a limit file and returns a dictionary mapping the WCs to their respective high,low limits to use def parse_limit_file(fpath): From bfbdde5087906ccb726ca345f2ab76b68b59657d Mon Sep 17 00:00:00 2001 From: Andrew42 Date: Wed, 3 Sep 2025 17:30:04 -0500 Subject: [PATCH 06/15] Remove code associated with temporary workaround --- mcgeneration/helpers/Gridpack.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/mcgeneration/helpers/Gridpack.py b/mcgeneration/helpers/Gridpack.py index 257487c..ff47f82 100644 --- a/mcgeneration/helpers/Gridpack.py +++ b/mcgeneration/helpers/Gridpack.py @@ -273,12 +273,6 @@ def saveReweightCard(self): save_scan_points(scanfile,self.ops['coeffs'],self.scan_pts) make_reweight_card(rwgt_tar,self.ops['coeffs'],self.scan_pts) - if self.ops['restrict']: - mpath = 'addons/models/SMEFTsim_top_MwScheme_UFO/restrict_massless.dat' - ompath = f'addons/models/SMEFTsim_top_MwScheme_UFO/restrict_massless_{self.ops["process"]}.dat' - if len(list(self.ops['coeffs'])) == 1: - ompath = ompath[:-4] + f'_{list(self.ops["coeffs"])[0]}.dat' - make_restrict_card(mpath, ompath, keep=True, SMEFT=list(self.ops['coeffs'])) return rwgt_tar From 58b6abef5d2f87816625b94d4c81eeee71696067 Mon Sep 17 00:00:00 2001 From: Andrew42 Date: Wed, 3 Sep 2025 17:37:37 -0500 Subject: [PATCH 07/15] Forgot to define new_model string --- mcgeneration/configure_gridpack.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mcgeneration/configure_gridpack.py b/mcgeneration/configure_gridpack.py index 70e7bf9..9636aa1 100644 --- a/mcgeneration/configure_gridpack.py +++ b/mcgeneration/configure_gridpack.py @@ -380,6 +380,8 @@ def submit_1dim_jobs(gp,dofs,npts,runs,tag_postfix='',max_submits=-1,run_wl={}): model_dir = "addons/models/{model}".format(model=model) ref_restrict = restrict_ops['ref'] new_restrict = "{ref}_{name}.dat".format(ref=ref_restrict.removesuffix('.dat'),name=dof.getName()) + new_model = "{model}-{restrict}".format(model=model,restrict=new_restrict.removesuffix('.dat')) + ref_restrict = os.path.join(model_dir,ref_restrict) new_restrict = os.path.join(model_dir,new_restrict) # Create a new restrict card in the directory of the model specified by the MGProcess From aa17392f85b7adcfa9d2bb5584a23b5bb29f5d9c Mon Sep 17 00:00:00 2001 From: Andrew42 Date: Sun, 7 Sep 2025 21:35:09 -0500 Subject: [PATCH 08/15] Add missing import for make_restrict_card --- mcgeneration/configure_gridpack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcgeneration/configure_gridpack.py b/mcgeneration/configure_gridpack.py index 9636aa1..fe93933 100644 --- a/mcgeneration/configure_gridpack.py +++ b/mcgeneration/configure_gridpack.py @@ -4,7 +4,7 @@ import random import time -from helpers.helper_tools import linspace, parse_limit_file, find_process +from helpers.helper_tools import linspace, parse_limit_file, find_process, make_restrict_card from helpers.ScanType import ScanType from helpers.BatchType import BatchType from helpers.DegreeOfFreedom import DegreeOfFreedom From 84eac73797c3a39bd18ae9c07bfbe962a546bd91 Mon Sep 17 00:00:00 2001 From: Andrew42 Date: Tue, 9 Sep 2025 18:11:16 -0500 Subject: [PATCH 09/15] Fix missing string format argument --- mcgeneration/helpers/Gridpack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcgeneration/helpers/Gridpack.py b/mcgeneration/helpers/Gridpack.py index ff47f82..722f0dd 100644 --- a/mcgeneration/helpers/Gridpack.py +++ b/mcgeneration/helpers/Gridpack.py @@ -247,7 +247,7 @@ def saveProcessCard(self,indent=0): # sure the restrict card exists and is placed in the correct location. if self.ops['restrict']: model, restrict = self.ops['restrict']['replace'] - print("{ind}Using restrict card {restrict} for model {model}".format(model=model,restrict=restrict)) + print("{ind}Using restrict card {restrict} for model {model}".format(ind=indent_str,model=model,restrict=restrict)) sed_str = "s|import model {model}|import model {restrict}|g".format(model=model,restrict=restrict) subprocess.Popen(['sed','-i','-e',sed_str,fpath]).communicate() From da97f531d2e5dfa20141ae7272673e6c19e15c9c Mon Sep 17 00:00:00 2001 From: Andrew42 Date: Tue, 9 Sep 2025 18:11:57 -0500 Subject: [PATCH 10/15] Fix restrict card naming to match MG expectations --- mcgeneration/configure_gridpack.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/mcgeneration/configure_gridpack.py b/mcgeneration/configure_gridpack.py index fe93933..37397bc 100644 --- a/mcgeneration/configure_gridpack.py +++ b/mcgeneration/configure_gridpack.py @@ -258,7 +258,8 @@ def cmsconnect_chain_submit(gridpack,dofs,proc_list,tag_postfix,rwgt_pts,runs,st if tracker.getTarballTime(job) > 3*(tar_cut+delay): # Skip checking jobs that finished sufficiently long ago continue - if tracker.resubmitted.has_key(job) and tracker.resubmitted[job] >= resubmits: + # if tracker.resubmitted.has_key(job) and tracker.resubmitted[job] >= resubmits: + if job in tracker.resubmitted and tracker.resubmitted[job] >= resubmits: # Stop trying to resubmit the job continue p,c,r = job.split('_') @@ -278,7 +279,8 @@ def cmsconnect_chain_submit(gridpack,dofs,proc_list,tag_postfix,rwgt_pts,runs,st gridpack.setProcess(p) #TODO: Might not want to split it up like this if stype == ScanType.SLINSPACE: - if proc_run_wl.has_key(p.getName()): + # if proc_run_wl.has_key(p.getName()): + if p.getName() in proc_run_wl: submitted += submit_1dim_jobs( gp=gridpack, dofs=dofs, @@ -364,7 +366,8 @@ def submit_1dim_jobs(gp,dofs,npts,runs,tag_postfix='',max_submits=-1,run_wl={}): # The dof already has limits, re-use them low_lim = dof.getLow() high_lim = dof.getHigh() - elif wc_limits.has_key(lim_key): + # elif wc_limits.has_key(lim_key): + elif lim_key in wc_limits: # Use limits from the limits file for this process low_lim = round(wc_limits[lim_key][0],6) high_lim = round(wc_limits[lim_key][1],6) @@ -379,8 +382,13 @@ def submit_1dim_jobs(gp,dofs,npts,runs,tag_postfix='',max_submits=-1,run_wl={}): model = gp.getModel() model_dir = "addons/models/{model}".format(model=model) ref_restrict = restrict_ops['ref'] - new_restrict = "{ref}_{name}.dat".format(ref=ref_restrict.removesuffix('.dat'),name=dof.getName()) - new_model = "{model}-{restrict}".format(model=model,restrict=new_restrict.removesuffix('.dat')) + # We can't use str.removesuffix since it isn't available in python3.6 + if ref_restrict.endswith('.dat'): + new_restrict = "{ref}_{name}".format(ref=ref_restrict.replace('.dat',''),name=dof.getName()) + # The model import syntax in MG expects a specific naming convention -> MODEL-massless_NAME, + # where _NAME corresponds to the restrict .dat card and would look like: restrict_massless_NAME.dat + new_model = "{model}-massless_{restrict}".format(model=model,restrict=dof.getName()) + new_restrict = new_restrict + ".dat" ref_restrict = os.path.join(model_dir,ref_restrict) new_restrict = os.path.join(model_dir,new_restrict) @@ -400,7 +408,8 @@ def submit_1dim_jobs(gp,dofs,npts,runs,tag_postfix='',max_submits=-1,run_wl={}): ############################### for idx,start in enumerate(linspace(low_lim,high_lim,runs)): - if run_wl.has_key(dof_name) and idx not in run_wl[dof_name]: + # if run_wl.has_key(dof_name) and idx not in run_wl[dof_name]: + if dof_name in run_wl and idx not in run_wl[dof_name]: continue pt = {} pt[dof.getName()] = start From 400c6b1e6639b417b048d42fdb36d160163682c6 Mon Sep 17 00:00:00 2001 From: Andrew42 Date: Wed, 10 Sep 2025 12:52:28 -0500 Subject: [PATCH 11/15] Update README with description of restrict option --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index 93300ee..e1d03cd 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,33 @@ gp = Gridpack(replace_model=['dim6top_LO_UFO','smloop']) # Alternatively via setOptions gp.setOptions(replace_model=['dim6top_LO_UFO','smloop']) ``` +- The `restrict` option will tell the code to create a restrict card for the model you choose to use. The value you pass when setting the `restrict` option is a dictionary with the following structure. +```python +restrict = { + "ref": "restrict_massless.dat", + "blocks": ["SMEFT","SMEFTcpv"], + "keep": True +} +gp.setOptions(restrict=restrict) +``` +- The `restrict` option will tell the code to create a restrict card for the model you choose to use. The value you pass when setting the `restrict` option is a dictionary with the following structure. At the moment, the `restrict` option only has an effect when using `ScanType.SLINSPACE`. +```python +restrict = { + "ref": "restrict_massless.dat", + "blocks": ["SMEFT","SMEFTcpv"], + "keep": True +} +gp.setOptions(restrict=restrict) +``` +`ref` +: This should be the name of a restrict card that is already located in the directory of the model you intend to use. It will be used as a template reference to create the actual restrict card that Madgraph will be pointed to. + +`blocks` +: This is a list of UFO block names that the code will consider when deciding to keep or exclude certain parameters. Any parameters specified under other blocks will be kept at the values they had in the reference restrict card. The block names _are_ case sensitive! + +`keep` +: A booleon value that indicates how to treat matched parameters. If `True`, then only matched parameters are kept and all others in the block are set to 0. If `False`, then only the matched parameters are set to 0. + # Resubmitting failed gridpacks: Sometimes a gridpack will get past the `codegen` stage but fail in the `integrate`, resulting in a `.tar.xz` file less than 10 MB.
From 12e09d901d4f3cf3de892bc2ad5550f28c9a436c Mon Sep 17 00:00:00 2001 From: Andrew42 Date: Wed, 10 Sep 2025 12:53:14 -0500 Subject: [PATCH 12/15] Remove duplicated text --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index e1d03cd..dd78389 100644 --- a/README.md +++ b/README.md @@ -31,15 +31,6 @@ gp = Gridpack(replace_model=['dim6top_LO_UFO','smloop']) # Alternatively via setOptions gp.setOptions(replace_model=['dim6top_LO_UFO','smloop']) ``` -- The `restrict` option will tell the code to create a restrict card for the model you choose to use. The value you pass when setting the `restrict` option is a dictionary with the following structure. -```python -restrict = { - "ref": "restrict_massless.dat", - "blocks": ["SMEFT","SMEFTcpv"], - "keep": True -} -gp.setOptions(restrict=restrict) -``` - The `restrict` option will tell the code to create a restrict card for the model you choose to use. The value you pass when setting the `restrict` option is a dictionary with the following structure. At the moment, the `restrict` option only has an effect when using `ScanType.SLINSPACE`. ```python restrict = { From 003b62a0fac913b6b77ecc173ded339fbda0a134 Mon Sep 17 00:00:00 2001 From: Brent Yates Date: Thu, 11 Sep 2025 11:30:09 -0500 Subject: [PATCH 13/15] Updating limits to SMEFTsim naming scheme --- .../addons/limits/SMEFTsim_top_limits.txt | 141 ++++++++++++++++++ mcgeneration/configure_gridpack.py | 2 +- 2 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 mcgeneration/addons/limits/SMEFTsim_top_limits.txt diff --git a/mcgeneration/addons/limits/SMEFTsim_top_limits.txt b/mcgeneration/addons/limits/SMEFTsim_top_limits.txt new file mode 100644 index 0000000..bad4119 --- /dev/null +++ b/mcgeneration/addons/limits/SMEFTsim_top_limits.txt @@ -0,0 +1,141 @@ +tllq_cQe1 -92.96 93.19 +tllq_cQe2 -92.96 93.19 +tllq_cQe3 -92.96 93.19 +tllq_cQl31 -28.4 27.92 +tllq_cQl32 -28.4 27.92 +tllq_cQl33 -28.4 27.92 +tllq_cQl11 -94.39 91.73 +tllq_cQl12 -94.39 91.73 +tllq_cQl13 -94.39 91.73 +tllq_cbWRe -6.67 6.67 +tllq_cHQ3 -13.93 8.09 +tllq_cHQ1 -70.28 50.89 +tllq_cHtb -96.82 83.65 +tllq_cHtbRe -25.33 25.33 +tllq_ctG -157.91 157.91 +tllq_ctWRe -5.88 5.53 +tllq_ctBRe -13.36 13.71 +tllq_cte1 -157.91 157.91 +tllq_cte2 -157.91 157.91 +tllq_cte3 -157.91 157.91 +tllq_cleQt1Re1 -157.91 157.91 +tllq_cleQt1Re2 -157.91 157.91 +tllq_cleQt1Re3 -157.91 157.91 +tllq_cleQt3Re1 -22.84 22.84 +tllq_cleQt3Re2 -22.84 22.84 +tllq_cleQt3Re3 -22.84 22.84 +tllq_ctl -157.91 157.91 +tllq_ctH -78.02 80.42 +ttH_cQe1 -157.91 157.91 +ttH_cQe2 -157.91 157.91 +ttH_cQe3 -157.91 157.91 +ttH_cQl31 -157.91 157.91 +ttH_cQl32 -157.91 157.91 +ttH_cQl33 -157.91 157.91 +ttH_cQl11 -157.91 157.91 +ttH_cQl12 -157.91 157.91 +ttH_cQl13 -157.91 157.91 +ttH_cbWRe -46.59 46.59 +ttH_cHQ3 -41.29 40.46 +ttH_cHQ1 -157.91 157.91 +ttH_cHtb -157.91 157.91 +ttH_cHtbRe -108.22 108.22 +ttH_ctG -2.53 1.61 +ttH_ctWRe -10.96 10.58 +ttH_ctBRe -12.86 13.11 +ttH_cte1 -157.91 157.91 +ttH_cte2 -157.91 157.91 +ttH_cte3 -157.91 157.91 +ttH_cleQt1Re1 -157.91 157.91 +ttH_cleQt1Re2 -157.91 157.91 +ttH_cleQt1Re3 -157.91 157.91 +ttH_cleQt3Re1 -157.91 157.91 +ttH_cleQt3Re2 -157.91 157.91 +ttH_cleQt3Re3 -157.91 157.91 +ttH_ctl -157.91 157.91 +ttH_ctH -20.06 52.09 +ttbar_cQe1 -157.91 157.91 +ttbar_cQe2 -157.91 157.91 +ttbar_cQe3 -157.91 157.91 +ttbar_cQl31 -157.91 157.91 +ttbar_cQl32 -157.91 157.91 +ttbar_cQl33 -157.91 157.91 +ttbar_cQl11 -157.91 157.91 +ttbar_cQl12 -157.91 157.91 +ttbar_cQl13 -157.91 157.91 +ttbar_cbWRe -157.91 157.91 +ttbar_cHQ3 -157.91 157.91 +ttbar_cHQ1 -157.91 157.91 +ttbar_cHtb -157.91 157.91 +ttbar_cHtbRe -157.91 157.91 +ttbar_ctG -13.58 6.92 +ttbar_ctWRe -56.29 55.34 +ttbar_ctBRe -66.05 66.81 +ttbar_cte1 -157.91 157.91 +ttbar_cte2 -157.91 157.91 +ttbar_cte3 -157.91 157.91 +ttbar_cleQt1Re1 -157.91 157.91 +ttbar_cleQt1Re2 -157.91 157.91 +ttbar_cleQt1Re3 -157.91 157.91 +ttbar_cleQt3Re1 -157.91 157.91 +ttbar_cleQt3Re2 -157.91 157.91 +ttbar_cleQt3Re3 -157.91 157.91 +ttbar_ctl -157.91 157.91 +ttbar_ctH -157.91 157.91 +ttll_cQe1 -43.53 43.91 +ttll_cQe2 -43.53 43.91 +ttll_cQe3 -43.53 43.91 +ttll_cQl31 -157.91 157.91 +ttll_cQl32 -157.91 157.91 +ttll_cQl33 -157.91 157.91 +ttll_cQl11 -42.99 44.86 +ttll_cQl12 -42.99 44.86 +ttll_cQl13 -42.99 44.86 +ttll_cbWRe -50.64 50.64 +ttll_cHQ3 -54.68 52.25 +ttll_cHQ1 -27.8 52.66 +ttll_cHtb -47.45 30.7 +ttll_cHtbRe -135.45 135.45 +ttll_ctG -3.76 2.62 +ttll_ctWRe -9.89 9.7 +ttll_ctBRe -6.95 7.01 +ttll_cte1 -43.43 44.73 +ttll_cte2 -43.43 44.73 +ttll_cte3 -43.43 44.73 +ttll_cleQt1Re1 -61.47 61.47 +ttll_cleQt1Re2 -61.47 61.47 +ttll_cleQt1Re3 -61.47 61.47 +ttll_cleQt3Re1 -8.21 8.21 +ttll_cleQt3Re2 -8.21 8.21 +ttll_cleQt3Re2 -8.21 8.21 +ttll_cleQt3Re3 -8.21 8.21 +ttll_ctl -43.53 44.26 +ttll_ctH -47.35 79.26 +ttlnu_cQe1 -157.91 157.91 +ttlnu_cQe2 -157.91 157.91 +ttlnu_cQe3 -157.91 157.91 +ttlnu_cQl31 -157.91 157.91 +ttlnu_cQl32 -157.91 157.91 +ttlnu_cQl33 -157.91 157.91 +ttlnu_cQl11 -157.91 157.91 +ttlnu_cQl12 -157.91 157.91 +ttlnu_cQl13 -157.91 157.91 +ttlnu_cbWRe -157.91 157.91 +ttlnu_cHQ3 -157.91 157.82 +ttlnu_cHQ1 -157.91 157.91 +ttlnu_cHtb -157.91 157.91 +ttlnu_cHtbRe -157.91 157.91 +ttlnu_ctG -19.14 8.5 +ttlnu_ctWRe -12.73 12.16 +ttlnu_ctBRe -52.97 52.75 +ttlnu_cte1 -157.91 157.91 +ttlnu_cte2 -157.91 157.91 +ttlnu_cte3 -157.91 157.91 +ttlnu_cleQt1Re1 -157.91 157.91 +ttlnu_cleQt1Re2 -157.91 157.91 +ttlnu_cleQt1Re3 -157.91 157.91 +ttlnu_cleQt3Re1 -157.91 157.91 +ttlnu_cleQt3Re2 -157.91 157.91 +ttlnu_cleQt3Re3 -157.91 157.91 +ttlnu_ctl -157.91 157.91 +ttlnu_ctH -157.91 157.91 diff --git a/mcgeneration/configure_gridpack.py b/mcgeneration/configure_gridpack.py index 37397bc..2cf2451 100644 --- a/mcgeneration/configure_gridpack.py +++ b/mcgeneration/configure_gridpack.py @@ -357,7 +357,7 @@ def cmsconnect_chain_submit(gridpack,dofs,proc_list,tag_postfix,rwgt_pts,runs,st def submit_1dim_jobs(gp,dofs,npts,runs,tag_postfix='',max_submits=-1,run_wl={}): submitted = 0 delay = 10.0 # Time between successful submits (in seconds) - wc_limits = parse_limit_file(os.path.join("addons/limits","dim6top_LO_UFO_limits.txt")) + wc_limits = parse_limit_file(os.path.join("addons/limits","SMEFTsim_top_limits.txt")) for dof in dofs: dof_name = dof.getName() lim_key = "{process}_{wc}".format(process=gp.getOption('process'),wc=dof_name) From f8456bc3ffecd8cc02ceac6d12e7b66a550fca5f Mon Sep 17 00:00:00 2001 From: Brent Yates Date: Fri, 12 Sep 2025 11:33:03 -0500 Subject: [PATCH 14/15] Fix ctH --- mcgeneration/addons/limits/SMEFTsim_top_limits.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mcgeneration/addons/limits/SMEFTsim_top_limits.txt b/mcgeneration/addons/limits/SMEFTsim_top_limits.txt index bad4119..e15141c 100644 --- a/mcgeneration/addons/limits/SMEFTsim_top_limits.txt +++ b/mcgeneration/addons/limits/SMEFTsim_top_limits.txt @@ -25,7 +25,7 @@ tllq_cleQt3Re1 -22.84 22.84 tllq_cleQt3Re2 -22.84 22.84 tllq_cleQt3Re3 -22.84 22.84 tllq_ctl -157.91 157.91 -tllq_ctH -78.02 80.42 +tllq_ctHRe -78.02 80.42 ttH_cQe1 -157.91 157.91 ttH_cQe2 -157.91 157.91 ttH_cQe3 -157.91 157.91 @@ -53,7 +53,7 @@ ttH_cleQt3Re1 -157.91 157.91 ttH_cleQt3Re2 -157.91 157.91 ttH_cleQt3Re3 -157.91 157.91 ttH_ctl -157.91 157.91 -ttH_ctH -20.06 52.09 +ttH_ctHRe -20.06 52.09 ttbar_cQe1 -157.91 157.91 ttbar_cQe2 -157.91 157.91 ttbar_cQe3 -157.91 157.91 @@ -81,7 +81,7 @@ ttbar_cleQt3Re1 -157.91 157.91 ttbar_cleQt3Re2 -157.91 157.91 ttbar_cleQt3Re3 -157.91 157.91 ttbar_ctl -157.91 157.91 -ttbar_ctH -157.91 157.91 +ttbar_ctHRe -157.91 157.91 ttll_cQe1 -43.53 43.91 ttll_cQe2 -43.53 43.91 ttll_cQe3 -43.53 43.91 @@ -110,7 +110,7 @@ ttll_cleQt3Re2 -8.21 8.21 ttll_cleQt3Re2 -8.21 8.21 ttll_cleQt3Re3 -8.21 8.21 ttll_ctl -43.53 44.26 -ttll_ctH -47.35 79.26 +ttll_ctHRe -47.35 79.26 ttlnu_cQe1 -157.91 157.91 ttlnu_cQe2 -157.91 157.91 ttlnu_cQe3 -157.91 157.91 @@ -138,4 +138,4 @@ ttlnu_cleQt3Re1 -157.91 157.91 ttlnu_cleQt3Re2 -157.91 157.91 ttlnu_cleQt3Re3 -157.91 157.91 ttlnu_ctl -157.91 157.91 -ttlnu_ctH -157.91 157.91 +ttlnu_ctHRe -157.91 157.91 From 432478b589467669ecb3c8ed9e8e3a5d41600134 Mon Sep 17 00:00:00 2001 From: Brent Yates Date: Fri, 12 Sep 2025 11:37:39 -0500 Subject: [PATCH 15/15] Updated proc names --- .../addons/limits/SMEFTsim_top_limits.txt | 226 +++++++++--------- 1 file changed, 113 insertions(+), 113 deletions(-) diff --git a/mcgeneration/addons/limits/SMEFTsim_top_limits.txt b/mcgeneration/addons/limits/SMEFTsim_top_limits.txt index e15141c..38547fe 100644 --- a/mcgeneration/addons/limits/SMEFTsim_top_limits.txt +++ b/mcgeneration/addons/limits/SMEFTsim_top_limits.txt @@ -1,59 +1,59 @@ -tllq_cQe1 -92.96 93.19 -tllq_cQe2 -92.96 93.19 -tllq_cQe3 -92.96 93.19 -tllq_cQl31 -28.4 27.92 -tllq_cQl32 -28.4 27.92 -tllq_cQl33 -28.4 27.92 -tllq_cQl11 -94.39 91.73 -tllq_cQl12 -94.39 91.73 -tllq_cQl13 -94.39 91.73 -tllq_cbWRe -6.67 6.67 -tllq_cHQ3 -13.93 8.09 -tllq_cHQ1 -70.28 50.89 -tllq_cHtb -96.82 83.65 -tllq_cHtbRe -25.33 25.33 -tllq_ctG -157.91 157.91 -tllq_ctWRe -5.88 5.53 -tllq_ctBRe -13.36 13.71 -tllq_cte1 -157.91 157.91 -tllq_cte2 -157.91 157.91 -tllq_cte3 -157.91 157.91 -tllq_cleQt1Re1 -157.91 157.91 -tllq_cleQt1Re2 -157.91 157.91 -tllq_cleQt1Re3 -157.91 157.91 -tllq_cleQt3Re1 -22.84 22.84 -tllq_cleQt3Re2 -22.84 22.84 -tllq_cleQt3Re3 -22.84 22.84 -tllq_ctl -157.91 157.91 -tllq_ctHRe -78.02 80.42 -ttH_cQe1 -157.91 157.91 -ttH_cQe2 -157.91 157.91 -ttH_cQe3 -157.91 157.91 -ttH_cQl31 -157.91 157.91 -ttH_cQl32 -157.91 157.91 -ttH_cQl33 -157.91 157.91 -ttH_cQl11 -157.91 157.91 -ttH_cQl12 -157.91 157.91 -ttH_cQl13 -157.91 157.91 -ttH_cbWRe -46.59 46.59 -ttH_cHQ3 -41.29 40.46 -ttH_cHQ1 -157.91 157.91 -ttH_cHtb -157.91 157.91 -ttH_cHtbRe -108.22 108.22 -ttH_ctG -2.53 1.61 -ttH_ctWRe -10.96 10.58 -ttH_ctBRe -12.86 13.11 -ttH_cte1 -157.91 157.91 -ttH_cte2 -157.91 157.91 -ttH_cte3 -157.91 157.91 -ttH_cleQt1Re1 -157.91 157.91 -ttH_cleQt1Re2 -157.91 157.91 -ttH_cleQt1Re3 -157.91 157.91 -ttH_cleQt3Re1 -157.91 157.91 -ttH_cleQt3Re2 -157.91 157.91 -ttH_cleQt3Re3 -157.91 157.91 -ttH_ctl -157.91 157.91 -ttH_ctHRe -20.06 52.09 +tllq4fNoSchanWNoHiggs0p_cQe1 -92.96 93.19 +tllq4fNoSchanWNoHiggs0p_cQe2 -92.96 93.19 +tllq4fNoSchanWNoHiggs0p_cQe3 -92.96 93.19 +tllq4fNoSchanWNoHiggs0p_cQl31 -28.4 27.92 +tllq4fNoSchanWNoHiggs0p_cQl32 -28.4 27.92 +tllq4fNoSchanWNoHiggs0p_cQl33 -28.4 27.92 +tllq4fNoSchanWNoHiggs0p_cQl11 -94.39 91.73 +tllq4fNoSchanWNoHiggs0p_cQl12 -94.39 91.73 +tllq4fNoSchanWNoHiggs0p_cQl13 -94.39 91.73 +tllq4fNoSchanWNoHiggs0p_cbWRe -6.67 6.67 +tllq4fNoSchanWNoHiggs0p_cHQ3 -13.93 8.09 +tllq4fNoSchanWNoHiggs0p_cHQ1 -70.28 50.89 +tllq4fNoSchanWNoHiggs0p_cHtb -96.82 83.65 +tllq4fNoSchanWNoHiggs0p_cHtbRe -25.33 25.33 +tllq4fNoSchanWNoHiggs0p_ctG -157.91 157.91 +tllq4fNoSchanWNoHiggs0p_ctWRe -5.88 5.53 +tllq4fNoSchanWNoHiggs0p_ctBRe -13.36 13.71 +tllq4fNoSchanWNoHiggs0p_cte1 -157.91 157.91 +tllq4fNoSchanWNoHiggs0p_cte2 -157.91 157.91 +tllq4fNoSchanWNoHiggs0p_cte3 -157.91 157.91 +tllq4fNoSchanWNoHiggs0p_cleQt1Re1 -157.91 157.91 +tllq4fNoSchanWNoHiggs0p_cleQt1Re2 -157.91 157.91 +tllq4fNoSchanWNoHiggs0p_cleQt1Re3 -157.91 157.91 +tllq4fNoSchanWNoHiggs0p_cleQt3Re1 -22.84 22.84 +tllq4fNoSchanWNoHiggs0p_cleQt3Re2 -22.84 22.84 +tllq4fNoSchanWNoHiggs0p_cleQt3Re3 -22.84 22.84 +tllq4fNoSchanWNoHiggs0p_ctl -157.91 157.91 +tllq4fNoSchanWNoHiggs0p_ctHRe -78.02 80.42 +ttHJet_cQe1 -157.91 157.91 +ttHJet_cQe2 -157.91 157.91 +ttHJet_cQe3 -157.91 157.91 +ttHJet_cQl31 -157.91 157.91 +ttHJet_cQl32 -157.91 157.91 +ttHJet_cQl33 -157.91 157.91 +ttHJet_cQl11 -157.91 157.91 +ttHJet_cQl12 -157.91 157.91 +ttHJet_cQl13 -157.91 157.91 +ttHJet_cbWRe -46.59 46.59 +ttHJet_cHQ3 -41.29 40.46 +ttHJet_cHQ1 -157.91 157.91 +ttHJet_cHtb -157.91 157.91 +ttHJet_cHtbRe -108.22 108.22 +ttHJet_ctG -2.53 1.61 +ttHJet_ctWRe -10.96 10.58 +ttHJet_ctBRe -12.86 13.11 +ttHJet_cte1 -157.91 157.91 +ttHJet_cte2 -157.91 157.91 +ttHJet_cte3 -157.91 157.91 +ttHJet_cleQt1Re1 -157.91 157.91 +ttHJet_cleQt1Re2 -157.91 157.91 +ttHJet_cleQt1Re3 -157.91 157.91 +ttHJet_cleQt3Re1 -157.91 157.91 +ttHJet_cleQt3Re2 -157.91 157.91 +ttHJet_cleQt3Re3 -157.91 157.91 +ttHJet_ctl -157.91 157.91 +ttHJet_ctHRe -20.06 52.09 ttbar_cQe1 -157.91 157.91 ttbar_cQe2 -157.91 157.91 ttbar_cQe3 -157.91 157.91 @@ -82,60 +82,60 @@ ttbar_cleQt3Re2 -157.91 157.91 ttbar_cleQt3Re3 -157.91 157.91 ttbar_ctl -157.91 157.91 ttbar_ctHRe -157.91 157.91 -ttll_cQe1 -43.53 43.91 -ttll_cQe2 -43.53 43.91 -ttll_cQe3 -43.53 43.91 -ttll_cQl31 -157.91 157.91 -ttll_cQl32 -157.91 157.91 -ttll_cQl33 -157.91 157.91 -ttll_cQl11 -42.99 44.86 -ttll_cQl12 -42.99 44.86 -ttll_cQl13 -42.99 44.86 -ttll_cbWRe -50.64 50.64 -ttll_cHQ3 -54.68 52.25 -ttll_cHQ1 -27.8 52.66 -ttll_cHtb -47.45 30.7 -ttll_cHtbRe -135.45 135.45 -ttll_ctG -3.76 2.62 -ttll_ctWRe -9.89 9.7 -ttll_ctBRe -6.95 7.01 -ttll_cte1 -43.43 44.73 -ttll_cte2 -43.43 44.73 -ttll_cte3 -43.43 44.73 -ttll_cleQt1Re1 -61.47 61.47 -ttll_cleQt1Re2 -61.47 61.47 -ttll_cleQt1Re3 -61.47 61.47 -ttll_cleQt3Re1 -8.21 8.21 -ttll_cleQt3Re2 -8.21 8.21 -ttll_cleQt3Re2 -8.21 8.21 -ttll_cleQt3Re3 -8.21 8.21 -ttll_ctl -43.53 44.26 -ttll_ctHRe -47.35 79.26 -ttlnu_cQe1 -157.91 157.91 -ttlnu_cQe2 -157.91 157.91 -ttlnu_cQe3 -157.91 157.91 -ttlnu_cQl31 -157.91 157.91 -ttlnu_cQl32 -157.91 157.91 -ttlnu_cQl33 -157.91 157.91 -ttlnu_cQl11 -157.91 157.91 -ttlnu_cQl12 -157.91 157.91 -ttlnu_cQl13 -157.91 157.91 -ttlnu_cbWRe -157.91 157.91 -ttlnu_cHQ3 -157.91 157.82 -ttlnu_cHQ1 -157.91 157.91 -ttlnu_cHtb -157.91 157.91 -ttlnu_cHtbRe -157.91 157.91 -ttlnu_ctG -19.14 8.5 -ttlnu_ctWRe -12.73 12.16 -ttlnu_ctBRe -52.97 52.75 -ttlnu_cte1 -157.91 157.91 -ttlnu_cte2 -157.91 157.91 -ttlnu_cte3 -157.91 157.91 -ttlnu_cleQt1Re1 -157.91 157.91 -ttlnu_cleQt1Re2 -157.91 157.91 -ttlnu_cleQt1Re3 -157.91 157.91 -ttlnu_cleQt3Re1 -157.91 157.91 -ttlnu_cleQt3Re2 -157.91 157.91 -ttlnu_cleQt3Re3 -157.91 157.91 -ttlnu_ctl -157.91 157.91 -ttlnu_ctHRe -157.91 157.91 +ttllNuNuJetNoHiggs_cQe1 -43.53 43.91 +ttllNuNuJetNoHiggs_cQe2 -43.53 43.91 +ttllNuNuJetNoHiggs_cQe3 -43.53 43.91 +ttllNuNuJetNoHiggs_cQl31 -157.91 157.91 +ttllNuNuJetNoHiggs_cQl32 -157.91 157.91 +ttllNuNuJetNoHiggs_cQl33 -157.91 157.91 +ttllNuNuJetNoHiggs_cQl11 -42.99 44.86 +ttllNuNuJetNoHiggs_cQl12 -42.99 44.86 +ttllNuNuJetNoHiggs_cQl13 -42.99 44.86 +ttllNuNuJetNoHiggs_cbWRe -50.64 50.64 +ttllNuNuJetNoHiggs_cHQ3 -54.68 52.25 +ttllNuNuJetNoHiggs_cHQ1 -27.8 52.66 +ttllNuNuJetNoHiggs_cHtb -47.45 30.7 +ttllNuNuJetNoHiggs_cHtbRe -135.45 135.45 +ttllNuNuJetNoHiggs_ctG -3.76 2.62 +ttllNuNuJetNoHiggs_ctWRe -9.89 9.7 +ttllNuNuJetNoHiggs_ctBRe -6.95 7.01 +ttllNuNuJetNoHiggs_cte1 -43.43 44.73 +ttllNuNuJetNoHiggs_cte2 -43.43 44.73 +ttllNuNuJetNoHiggs_cte3 -43.43 44.73 +ttllNuNuJetNoHiggs_cleQt1Re1 -61.47 61.47 +ttllNuNuJetNoHiggs_cleQt1Re2 -61.47 61.47 +ttllNuNuJetNoHiggs_cleQt1Re3 -61.47 61.47 +ttllNuNuJetNoHiggs_cleQt3Re1 -8.21 8.21 +ttllNuNuJetNoHiggs_cleQt3Re2 -8.21 8.21 +ttllNuNuJetNoHiggs_cleQt3Re2 -8.21 8.21 +ttllNuNuJetNoHiggs_cleQt3Re3 -8.21 8.21 +ttllNuNuJetNoHiggs_ctl -43.53 44.26 +ttllNuNuJetNoHiggs_ctHRe -47.35 79.26 +ttlnuJet_cQe1 -157.91 157.91 +ttlnuJet_cQe2 -157.91 157.91 +ttlnuJet_cQe3 -157.91 157.91 +ttlnuJet_cQl31 -157.91 157.91 +ttlnuJet_cQl32 -157.91 157.91 +ttlnuJet_cQl33 -157.91 157.91 +ttlnuJet_cQl11 -157.91 157.91 +ttlnuJet_cQl12 -157.91 157.91 +ttlnuJet_cQl13 -157.91 157.91 +ttlnuJet_cbWRe -157.91 157.91 +ttlnuJet_cHQ3 -157.91 157.82 +ttlnuJet_cHQ1 -157.91 157.91 +ttlnuJet_cHtb -157.91 157.91 +ttlnuJet_cHtbRe -157.91 157.91 +ttlnuJet_ctG -19.14 8.5 +ttlnuJet_ctWRe -12.73 12.16 +ttlnuJet_ctBRe -52.97 52.75 +ttlnuJet_cte1 -157.91 157.91 +ttlnuJet_cte2 -157.91 157.91 +ttlnuJet_cte3 -157.91 157.91 +ttlnuJet_cleQt1Re1 -157.91 157.91 +ttlnuJet_cleQt1Re2 -157.91 157.91 +ttlnuJet_cleQt1Re3 -157.91 157.91 +ttlnuJet_cleQt3Re1 -157.91 157.91 +ttlnuJet_cleQt3Re2 -157.91 157.91 +ttlnuJet_cleQt3Re3 -157.91 157.91 +ttlnuJet_ctl -157.91 157.91 +ttlnuJet_ctHRe -157.91 157.91