Ejemplo n.º 1
0
    def evaluate_subtraction_current(
        self, current,
        higher_PS_point=None, lower_PS_point=None,
        leg_numbers_map=None, reduced_process=None, hel_config=None,
        Q=None, **opts ):

        if higher_PS_point is None or lower_PS_point is None:
            raise CurrentImplementationError(
                self.name() + " needs the phase-space points before and after mapping." )
        if leg_numbers_map is None:
            raise CurrentImplementationError(
                self.name() + " requires a leg numbers map, i.e. a momentum dictionary." )
        if reduced_process is None:
            raise CurrentImplementationError(
                self.name() + " requires a reduced_process.")
        if not hel_config is None:
            raise CurrentImplementationError(
                self.name() + " does not support helicity assignment." )
        if Q is None:
            raise CurrentImplementationError(
                self.name() + " requires the total mapping momentum Q." )

        # misc.sprint(self.__class__.__name__)
        # misc.sprint(higher_PS_point)
        # misc.sprint(lower_PS_point)

        # Retrieve alpha_s and mu_r
        model_param_dict = self.model.get('parameter_dict')
        alpha_s = model_param_dict['aS']
        mu_r = model_param_dict['MU_R']

        # Include the counterterm only in a part of the phase space
        children = self.get_sorted_children(current, self.model)
        parent = leg_numbers_map.inv[frozenset(children)]
        pC = sum(higher_PS_point[child] for child in children)
        qC = lower_PS_point[parent]
        if self.is_cut(Q=Q, pC=pC):
            return utils.SubtractionCurrentResult.zero(
                current=current, hel_config=hel_config)

        # Evaluate collinear subtracted kernel
        zs, kTs = self.variables(higher_PS_point, qC, children, Q=Q)
        pr = higher_PS_point[children[0]]
        ps = higher_PS_point[children[1]]
        pi = higher_PS_point[children[2]]
        sir = 2*pi.dot(pr)
        sis = 2*pi.dot(ps)
        srs = 2*pr.dot(ps)
        evaluation = utils.SubtractionCurrentEvaluation.zero()
        ker = 0
        ker += 2*self.C123_kernel(zs[0], zs[1], zs[2], srs, sir, sis, sir+sis+srs)
        ker -= 2*self.C123S12_kernel(zs[0], zs[1], zs[2], srs, sir, sis, sir+sis+srs)
        ker -= self.C123C12_kernel(
            higher_PS_point, lower_PS_point[parent], children, Q=Q, **opts)
        ker += self.C123S12C12_kernel(
            higher_PS_point, lower_PS_point[parent], children, Q=Q, **opts)
        evaluation['values'][(0, 0)]['finite'] += 0.5*self.CF*self.TR*ker

        # Find all colored leg numbers except for the parent in the reduced process
        all_colored_parton_numbers = []
        for leg in reduced_process.get('legs'):
            if self.model.get_particle(leg.get('id')).get('color') == 1:
                continue
            all_colored_parton_numbers.append(leg.get('number'))

        color_correlation_index = 1

        # Now loop over the colored parton number pairs (parent, k)
        # and add the corresponding contributions to this current
        emitter = children[2]
        for k in all_colored_parton_numbers:
            spectator = k
            if k == parent:
                spectator = children[2]
            evaluation['color_correlations'].append(((parent, k),))
            weight = 0
            if k != parent:
                pk = higher_PS_point[k]
                sik = 2*pi.dot(pk)
                skr = 2*pk.dot(pr)
                sks = 2*pk.dot(ps)
                weight += self.S12_kernel(sir, sis, sik, skr, sks, srs)
                weight -= 2*self.S12C12_kernel(
                    higher_PS_point, children, emitter, spectator, Q=Q, **opts)
            evaluation['values'][(0, color_correlation_index)] = {'finite': weight}
            color_correlation_index += 1

        # Add the normalization factors
        norm = (8. * math.pi * alpha_s) ** 2
        norm *= self.factor(Q=Q, pC=pC, qC=qC)
        for k in evaluation['values']:
            evaluation['values'][k]['finite'] *= norm

        # Construct and return result
        result = utils.SubtractionCurrentResult()
        result.add_result(
            evaluation,
            hel_config=hel_config,
            squared_orders=tuple(sorted(current.get('squared_orders').items())))
        return result
Ejemplo n.º 2
0
    def evaluate_subtraction_current(self,
                                     current,
                                     higher_PS_point=None,
                                     lower_PS_point=None,
                                     leg_numbers_map=None,
                                     reduced_process=None,
                                     hel_config=None,
                                     Q=None,
                                     **opts):
        """Add the distributed partial fractioned soft eikonal approximation
        to this hard collinear current
        """

        if higher_PS_point is None or lower_PS_point is None:
            raise CurrentImplementationError(
                self.name() +
                " needs the phase-space points before and after mapping.")
        if leg_numbers_map is None:
            raise CurrentImplementationError(
                self.name() +
                " requires a leg numbers map, i.e. a momentum dictionary.")
        if reduced_process is None:
            raise CurrentImplementationError(self.name() +
                                             " requires a reduced_process.")
        if not hel_config is None:
            raise CurrentImplementationError(
                self.name() + " does not support helicity assignment.")
        if Q is None:
            raise CurrentImplementationError(
                self.name() + " requires the total mapping momentum Q.")

        # Retrieve alpha_s and mu_r
        model_param_dict = self.model.get('parameter_dict')
        alpha_s = model_param_dict['aS']
        mu_r = model_param_dict['MU_R']

        # Include the counterterm only in a part of the phase space
        children = self.get_sorted_children(current, self.model)
        parent = leg_numbers_map.inv[frozenset(children)]
        pC = higher_PS_point[children[0]]
        pC -= sum(higher_PS_point[child] for child in children[1:])
        if self.is_cut(Q=Q, pC=pC):
            return utils.SubtractionCurrentResult.zero(current=current,
                                                       hel_config=hel_config)

        # Evaluate collinear subtracted kernel
        zs, kTs = self.variables(higher_PS_point,
                                 lower_PS_point[parent],
                                 children,
                                 Q=Q)
        evaluation = self.evaluate_kernel(zs, kTs, parent)

        # Find all colored leg numbers except for the parent in the reduced process
        all_colored_parton_numbers = []
        for leg in reduced_process.get('legs'):
            if self.model.get_particle(leg.get('id')).get('color') == 1:
                continue
            all_colored_parton_numbers.append(leg.get('number'))

        color_correlation_index = 1
        ps = higher_PS_point[children[1]]
        pi = higher_PS_point[children[0]]
        # pi = lower_PS_point[parent]

        # Loop over the colored parton number pairs (parent, j)
        # and add the corresponding contributions to this current
        for j in all_colored_parton_numbers:
            # Write the eikonal for that pair
            # (positive here since the dipole end 'children[0]' is in the initial state)
            if j == parent:
                continue
            pj = higher_PS_point[j]
            # pj = sum(higher_PS_point[child] for child in leg_numbers_map[j])
            # pj = lower_PS_point[j]
            eik1 = mod_eikonal(pi, pj, ps)
            evaluation['color_correlations'].append(((parent, j), ))
            evaluation['values'][(0, color_correlation_index)] = {
                'finite': eik1
            }
            color_correlation_index += 1

        # Add the normalization factors
        pC2 = pC.square()
        norm = 8. * math.pi * alpha_s / pC2
        norm *= self.factor(Q=Q, pC=pC)
        for k in evaluation['values']:
            evaluation['values'][k]['finite'] *= norm

        # Construct and return result
        result = utils.SubtractionCurrentResult()
        result.add_result(evaluation,
                          hel_config=hel_config,
                          squared_orders=tuple(
                              sorted(current.get('squared_orders').items())))
        return result