diff --git a/cmsdb/processes/hh2bbtautau.py b/cmsdb/processes/hh2bbtautau.py index 9bc426cb..5a28683d 100644 --- a/cmsdb/processes/hh2bbtautau.py +++ b/cmsdb/processes/hh2bbtautau.py @@ -61,12 +61,12 @@ ] from scinum import Number +import cmsdb.constants as const from cmsdb.processes.higgs import ( hh_ggf, radion_hh_ggf, graviton_hh_ggf, radion_hh_vbf, graviton_hh_vbf, ) - - +from cmsdb.scripts.xsec_bsm_nodes import calc_xsec_bsm_node # # ggF -> H -> HH # @@ -75,91 +75,115 @@ name="hh_ggf_bbtautau", id=21100, label=r"$HH_{ggf} \rightarrow bb\tau\tau$", - xsecs={13: Number(0.1)}, # TODO + xsecs={13: Number(hh_ggf.get_xsec(13) * const.br_hh.bbtt)}, # TODO ) hh_ggf_bbtautau_node1 = hh_ggf.add_process( name="hh_ggf_bbtautau_node1", id=21101, label=f"{hh_ggf_bbtautau.label} (node 1)", - xsecs={13: Number(0.1)}, # TODO + xsecs={ + 13: calc_xsec_bsm_node(13, hh_ggf_bbtautau.get_xsec(13), node_number=1), + }, ) hh_ggf_bbtautau_node2 = hh_ggf.add_process( name="hh_ggf_bbtautau_node2", id=21102, label=f"{hh_ggf_bbtautau.label} (node 2)", - xsecs={13: Number(0.1)}, # TODO + xsecs={ + 13: calc_xsec_bsm_node(13, hh_ggf_bbtautau.get_xsec(13), node_number=2), + }, ) hh_ggf_bbtautau_node3 = hh_ggf.add_process( name="hh_ggf_bbtautau_node3", id=21103, label=f"{hh_ggf_bbtautau.label} (node 3)", - xsecs={13: Number(0.1)}, # TODO + xsecs={ + 13: calc_xsec_bsm_node(13, hh_ggf_bbtautau.get_xsec(13), node_number=3), + }, ) hh_ggf_bbtautau_node4 = hh_ggf.add_process( name="hh_ggf_bbtautau_node4", id=21104, label=f"{hh_ggf_bbtautau.label} (node 4)", - xsecs={13: Number(0.1)}, # TODO + xsecs={ + 13: calc_xsec_bsm_node(13, hh_ggf_bbtautau.get_xsec(13), node_number=4), + }, ) hh_ggf_bbtautau_node5 = hh_ggf.add_process( name="hh_ggf_bbtautau_node5", id=21105, label=f"{hh_ggf_bbtautau.label} (node 5)", - xsecs={13: Number(0.1)}, # TODO + xsecs={ + 13: calc_xsec_bsm_node(13, hh_ggf_bbtautau.get_xsec(13), node_number=5), + }, ) hh_ggf_bbtautau_node6 = hh_ggf.add_process( name="hh_ggf_bbtautau_node6", id=21106, label=f"{hh_ggf_bbtautau.label} (node 6)", - xsecs={13: Number(0.1)}, # TODO + xsecs={ + 13: calc_xsec_bsm_node(13, hh_ggf_bbtautau.get_xsec(13), node_number=6), + }, ) hh_ggf_bbtautau_node7 = hh_ggf.add_process( name="hh_ggf_bbtautau_node7", id=21107, label=f"{hh_ggf_bbtautau.label} (node 7)", - xsecs={13: Number(0.1)}, # TODO + xsecs={ + 13: calc_xsec_bsm_node(13, hh_ggf_bbtautau.get_xsec(13), node_number=7), + }, ) hh_ggf_bbtautau_node8 = hh_ggf.add_process( name="hh_ggf_bbtautau_node8", id=21108, label=f"{hh_ggf_bbtautau.label} (node 8)", - xsecs={13: Number(0.1)}, # TODO + xsecs={ + 13: calc_xsec_bsm_node(13, hh_ggf_bbtautau.get_xsec(13), node_number=8), + }, ) hh_ggf_bbtautau_node9 = hh_ggf.add_process( name="hh_ggf_bbtautau_node9", id=21109, label=f"{hh_ggf_bbtautau.label} (node 9)", - xsecs={13: Number(0.1)}, # TODO + xsecs={ + 13: calc_xsec_bsm_node(13, hh_ggf_bbtautau.get_xsec(13), node_number=9), + }, ) hh_ggf_bbtautau_node10 = hh_ggf.add_process( name="hh_ggf_bbtautau_node10", id=21110, label=f"{hh_ggf_bbtautau.label} (node 10)", - xsecs={13: Number(0.1)}, # TODO + xsecs={ + 13: calc_xsec_bsm_node(13, hh_ggf_bbtautau.get_xsec(13), node_number=10), + }, ) hh_ggf_bbtautau_node11 = hh_ggf.add_process( name="hh_ggf_bbtautau_node11", id=21111, label=f"{hh_ggf_bbtautau.label} (node 11)", - xsecs={13: Number(0.1)}, # TODO + xsecs={ + 13: calc_xsec_bsm_node(13, hh_ggf_bbtautau.get_xsec(13), node_number=11), + }, ) hh_ggf_bbtautau_node12 = hh_ggf.add_process( name="hh_ggf_bbtautau_node12", id=21112, label=f"{hh_ggf_bbtautau.label} (node 12)", - xsecs={13: Number(0.1)}, # TODO + xsecs={ + 13: calc_xsec_bsm_node(13, hh_ggf_bbtautau.get_xsec(13), node_number=12), + }, ) @@ -171,7 +195,7 @@ name="radion_hh_ggf_bbtautau", id=23100, label=rf"{radion_hh_ggf.label} $\rightarrow bb\tau\tau$", - xsecs={13: Number(0.1)}, # TODO + xsecs={13: Number(radion_hh_ggf.get_xsec(13) * const.br_hh.bbtt)}, # TODO ) radion_hh_ggf_bbtautau_m250 = radion_hh_ggf_bbtautau.add_process( @@ -333,7 +357,7 @@ name="graviton_hh_ggf_bbtautau", id=24100, label=rf"{graviton_hh_ggf.label} $\rightarrow bb\tau\tau$", - xsecs={13: Number(0.1)}, # TODO + xsecs={13: Number(graviton_hh_ggf.get_xsec(13) * const.br_hh.bbtt)}, # TODO ) graviton_hh_ggf_bbtautau_m250 = graviton_hh_ggf_bbtautau.add_process( @@ -495,7 +519,7 @@ name="radion_hh_vbf_bbtautau", id=25100, label=rf"{radion_hh_vbf.label} $\rightarrow bb\tau\tau$", - xsecs={13: Number(0.1)}, # TODO + xsecs={13: Number(radion_hh_vbf.get_xsec(13) * const.br_hh.bbtt)}, # TODO ) radion_hh_vbf_bbtautau_m250 = radion_hh_vbf_bbtautau.add_process( @@ -657,7 +681,7 @@ name="graviton_hh_vbf_bbtautau", id=26100, label=rf"{graviton_hh_vbf.label} $\rightarrow bb\tau\tau$", - xsecs={13: Number(0.1)}, # TODO + xsecs={13: Number(graviton_hh_vbf.get_xsec(13) * const.br_hh.bbtt)}, # TODO ) graviton_hh_vbf_bbtautau_m250 = graviton_hh_vbf_bbtautau.add_process( diff --git a/scripts/xsec_bsm_nodes.py b/scripts/xsec_bsm_nodes.py new file mode 100644 index 00000000..60ca1a53 --- /dev/null +++ b/scripts/xsec_bsm_nodes.py @@ -0,0 +1,187 @@ +from __future__ import annotations + +# A_i fitparameter according to recommendation in "https://arxiv.org/pdf/1610.07922.pdf" S.201 +_a_fit_parameter = { + 13: { + "A_1": 2.09, + "A_2": 10.15, + "A_3": 0.28, + "A_4": 0.10, + "A_5": 1.33, + "A_6": -8.51, + "A_7": -1.37, + "A_8": 2.83, + "A_9": 1.46, + "A_10": -4.92, + "A_11": -0.68, + "A_12": 1.86, + "A_13": 0.32, + "A_14": -0.84, + "A_15": -0.57, + }, + 14: { + "A_1": 2.08, + "A_2": 10.20, + "A_3": 0.28, + "A_4": 0.10, + "A_5": 1.37, + "A_6": -8.49, + "A_7": -1.36, + "A_8": 2.80, + "A_9": 1.44, + "A_10": -4.90, + "A_11": -0.66, + "A_12": 1.84, + "A_13": 0.32, + "A_14": -0.83, + "A_15": -0.56, + }, +} + +# chosen EFT parameter according to "https://arxiv.org/pdf/1610.07922.pdf" S.202 +_coefficient_EFT_benchmarks = { + 1: { + "k_l": 7.5, + "k_t": 1.0, + "c_2": -1.0, + "c_g": 0.0, + "c_2_g": 0.0, + }, + 2: { + "k_l": 1.0, + "k_t": 1.0, + "c_2": 0.5, + "c_g": -0.8, + "c_2_g": 0.6, + }, + 3: { + "k_l": 1.0, + "k_t": 1.0, + "c_2": -1.5, + "c_g": 0.0, + "c_2_g": -0.8, + }, + 4: { + "k_l": -3.5, + "k_t": 1.5, + "c_2": -3.0, + "c_g": 0.0, + "c_2_g": 0.0, + }, + 5: { + "k_l": 1.0, + "k_t": 1.0, + "c_2": 0.0, + "c_g": 0.8, + "c_2_g": -1, + }, + 6: { + "k_l": 2.4, + "k_t": 1.0, + "c_2": 0.0, + "c_g": 0.2, + "c_2_g": -0.2, + }, + 7: { + "k_l": 5.0, + "k_t": 1.0, + "c_2": 0.0, + "c_g": 0.2, + "c_2_g": -0.2, + }, + 8: { + "k_l": 15.0, + "k_t": 1.0, + "c_2": 0.0, + "c_g": -1, + "c_2_g": 1, + }, + 9: { + "k_l": 1.0, + "k_t": 1.0, + "c_2": 1.0, + "c_g": -0.6, + "c_2_g": 0.6, + }, + 10: { + "k_l": 10.0, + "k_t": 1.5, + "c_2": -1.0, + "c_g": 0.0, + "c_2_g": 0.0, + }, + 11: { + "k_l": 2.4, + "k_t": 1.0, + "c_2": 0.0, + "c_g": 1, + "c_2_g": -1, + }, + 12: { + "k_l": 15.0, + "k_t": 1.0, + "c_2": 1.0, + "c_g": 0.0, + "c_2_g": 0.0, + }, + "SM": { + "k_l": 1.0, + "k_t": 1.0, + "c_2": 0.0, + "c_g": 0.0, + "c_2_g": 0.0, + }, +} + + +def calculate_r_hh(center_of_mass_energy: float, k_l: float, k_t: float, c_2: float, c_g: float, c_2_g: float): # noqa + # formula for r_hh is defined in https://arxiv.org/pdf/1610.07922.pdf S.200 + # rename fit parameter + a = _a_fit_parameter[center_of_mass_energy] + + # split calculation in parts for more readability + formular = [ + a["A_1"] * k_t ** 4, + a["A_2"] * c_2 ** 2, + a["A_3"] * k_t ** 2 * k_l ** 2, + a["A_4"] * c_g ** 2 * k_l ** 2, + a["A_5"] * c_2_g ** 2, + a["A_6"] * c_2 * k_t ** 2, + a["A_7"] * k_t * k_l * k_t ** 2, + a["A_8"] * k_t * k_l * c_2, + a["A_9"] * c_g * k_l * c_2, + a["A_10"] * c_2 * c_2_g, + a["A_11"] * c_g * k_l * k_t ** 2, + a["A_12"] * c_2_g * k_t ** 2, + a["A_13"] * k_l * c_g * k_t * k_l, + a["A_14"] * c_2_g * k_t * k_l, + a["A_15"] * c_g * c_2_g * k_l, + ] + return sum(formular) + + +def calculate_xsec_node(center_of_mass_energy: float, xsec_sm: float, node_number: int): # noqa + """ + + Formula to calculate cross section for BSM nodes in EFT in pb. + The exact procedure is described in the Yellow Pages Report 4. + https://arxiv.org/pdf/1610.07922.pdf S.200 + + For 13.6 TeV no table values are given. + TODO: maybe do an interpolation between 13 and 14 TeV? Or wait for further information + + Args: + center_of_mass_energy (float): Energy in TeV + xsec_sm (float): Cross section of the Standard Model process in pb + node_numbers int): Node number for which you want to calculate the xsec. + + Returns: + TYPE: Description + """ + if node_number not in list(range(1,13)): + raise ValueError(f"Node number is {node_number}, but must be between 1 and 12") + + eft_coefficients = _coefficient_EFT_benchmarks[node_number] + r_hh = calculate_r_hh(center_of_mass_energy, **eft_coefficients) + xsec_bsm = xsec_sm * r_hh + return xsec_bsm