Skip to content

Incorrect MET correction method #1064

Open
@9GaoHong

Description

@9GaoHong

Hi @lgray

There are two questions about MET correction:

1. It seems that CorrectedMETFactory.py has not been updated according to the official correction formula.

In this script, propagate JEC effect to pfMET through the corrected_polar_met function:

$$ \rm E_T^{miss,corr} = E_T^{miss}+\sum_{jets}({p_{T,jet}^{JEC}-p_{T,jet}^{orig})} $$

def corrected_polar_met(
    met_pt, met_phi, jet_pt, jet_phi, jet_pt_orig, positive=None, dx=None, dy=None
):
    sj, cj = numpy.sin(jet_phi), numpy.cos(jet_phi)
    x = met_pt * numpy.cos(met_phi) + awkward.sum((jet_pt - jet_pt_orig) * cj, axis=1)
    y = met_pt * numpy.sin(met_phi) + awkward.sum((jet_pt - jet_pt_orig) * sj, axis=1)
    if positive is not None and dx is not None and dy is not None:
        x = x + dx if positive else x - dx
        y = y + dy if positive else y - dy

    return awkward.zip(
        {"pt": numpy.hypot(x, y), "phi": numpy.arctan2(y, x)}, depth_limit=1
    )

Can you illustrate where this correction method was referenced from?

And by checking this twiki link, I found that the formula for MET Type-I correction(mostly used when processing with NanoAOD) should be like:

$$ \rm E_T^{miss,corr} = E_T^{miss}-\sum_{jets}({p_{T,jet}^{L123}-p_{T,jet}^{L1})} $$

However, it is evident that in CorrectedMETFactory.py , jet_pt is the ${p_{T,\text{jet}}^{L123}}$, and jet_pt_orig is pTRaw instead of ${p_{T,\text{jet}}^{L1}}$. This will result in incorrect MET correction.

2. The target object for CorrectedMETFactory.py use with is MET, not RawMET.
According to the following code, it can be seen that this script is applicable to MET, not RawMET.
Because in NanoAOD samples, only MET has branchs related to UnClusteredEnergyDeltaX/Y, and RawMET does not have.

out_dict["MET_UnclusteredEnergy"] = dask_awkward.map_partitions(
            create_variants,
            MET,
            corrected_jets,
            MET[self.name_map["UnClusteredEnergyDeltaX"]],
            MET[self.name_map["UnClusteredEnergyDeltaY"]],
            label="UnclusteredEnergy_met",
)

But in NanoAOD samples, the branch names and what they correspond to are as follows:

  • RawMET: raw (i.e., uncorrected) PF MET
  • MET: Type-1 corrected PF MET
  • RawPuppiMET: raw PUPPI MET
  • PuppiMET: Type-1 corrected PUPPI MET

So it is unreasonable to use MET because it has already undergone Type-I correction, and RawMET should be used instead.
How do you think?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions