Description
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:
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:
However, it is evident that in CorrectedMETFactory.py
, jet_pt is the
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?