def test_factorized_jet_corrector(): from coffea.jetmet_tools import FactorizedJetCorrector counts, test_eta, test_pt = dummy_jagged_eta_pt() test_Rho = np.full_like(test_eta, 100.) test_A = np.full_like(test_eta, 5.) jec_names = [ 'Summer16_23Sep2016V3_MC_L1FastJet_AK4PFPuppi', 'Summer16_23Sep2016V3_MC_L2Relative_AK4PFPuppi', 'Summer16_23Sep2016V3_MC_L2L3Residual_AK4PFPuppi', 'Summer16_23Sep2016V3_MC_L3Absolute_AK4PFPuppi' ] corrector = FactorizedJetCorrector( **{name: evaluator[name] for name in jec_names}) print(corrector) pt_copy = np.copy(test_pt) corrs = corrector.getCorrection(JetEta=test_eta, Rho=test_Rho, JetPt=test_pt, JetA=test_A) assert ((np.abs(pt_copy - test_pt) < 1e-6).all())
def test_factorized_jet_corrector(): from coffea.jetmet_tools import FactorizedJetCorrector counts, test_eta, test_pt = dummy_jagged_eta_pt() test_Rho = np.full_like(test_eta, 100.) test_A = np.full_like(test_eta, 5.) jec_names = [ 'Summer16_23Sep2016V3_MC_L1FastJet_AK4PFPuppi', 'Summer16_23Sep2016V3_MC_L2Relative_AK4PFPuppi', 'Summer16_23Sep2016V3_MC_L2L3Residual_AK4PFPuppi', 'Summer16_23Sep2016V3_MC_L3Absolute_AK4PFPuppi' ] corrector = FactorizedJetCorrector( **{name: evaluator[name] for name in jec_names}) print(corrector) pt_copy = np.copy(test_pt) corrs = corrector.getCorrection(JetEta=test_eta, Rho=test_Rho, JetPt=test_pt, JetA=test_A) assert ((np.abs(pt_copy - test_pt) < 1e-6).all()) # Test for bug #320 def make_starts_stops(counts, data, padding): cumcounts = np.cumsum(counts) first_nonempty_event = cumcounts[np.nonzero(counts > 1)[0][0]] data_pad = np.empty(data.size + padding) data_pad[:first_nonempty_event] = data[:first_nonempty_event] data_pad[first_nonempty_event + padding:] = data[first_nonempty_event:] starts = np.r_[0, cumcounts[:-1]] starts[starts >= first_nonempty_event] += padding return awkward.JaggedArray(starts, starts + counts, data_pad) test_pt_jag = make_starts_stops(counts, test_pt, 5) test_eta_jag = make_starts_stops(counts, test_eta, 3) test_Rho_jag = awkward.JaggedArray.fromcounts(counts, test_Rho) test_A_jag = awkward.JaggedArray.fromcounts(counts, test_A) corrs_jag = corrector.getCorrection(JetEta=test_eta_jag, Rho=test_Rho_jag, JetPt=test_pt_jag, JetA=test_A_jag) assert ((np.abs(pt_copy - test_pt_jag.flatten()) < 1e-6).all()) assert ((np.abs(corrs - corrs_jag.flatten()) < 1e-6).all())
def test_jet_resolution(): from coffea.jetmet_tools import JetResolution counts, test_eta, test_pt = dummy_jagged_eta_pt() test_Rho = np.full_like(test_eta, 10.0) test_pt_jag = ak.unflatten(test_pt, counts) test_eta_jag = ak.unflatten(test_eta, counts) test_Rho_jag = ak.unflatten(test_Rho, counts) jer_names = ["Spring16_25nsV10_MC_PtResolution_AK4PFPuppi"] reso = JetResolution(**{name: evaluator[name] for name in jer_names}) print(reso) resos = reso.getResolution(JetEta=test_eta, Rho=test_Rho, JetPt=test_pt) resos_jag = reso.getResolution(JetEta=test_eta_jag, Rho=test_Rho_jag, JetPt=test_pt_jag) assert ak.all(np.abs(resos - ak.flatten(resos_jag)) < 1e-6) test_pt_jag = test_pt_jag[0:3] test_eta_jag = test_eta_jag[0:3] test_Rho_jag = test_Rho_jag[0:3] test_Rho_jag = ak.concatenate( [test_Rho_jag[:-1], [ak.concatenate([test_Rho_jag[-1, :-1], 100.0])]]) counts = counts[0:3] print("Raw jet values:") print("pT:", test_pt_jag) print("eta:", test_eta_jag) print("rho:", test_Rho_jag, "\n") resos_jag_ref = ak.unflatten( np.array([ 0.21974642, 0.32421591, 0.33702479, 0.27420327, 0.13940689, 0.48134521, 0.26564994, 1.0, ]), counts, ) resos_jag = reso.getResolution(JetEta=test_eta_jag, Rho=test_Rho_jag, JetPt=test_pt_jag) print("Reference Resolution (jagged):", resos_jag_ref) print("Resolution (jagged):", resos_jag) # NB: 5e-4 tolerance was agreed upon by lgray and aperloff, if the differences get bigger over time # we need to agree upon how these numbers are evaluated (double/float conversion is kinda random) assert ak.all( np.abs(ak.flatten(resos_jag_ref) - ak.flatten(resos_jag)) < 5e-4)
def dummy_four_momenta(): np.random.seed(12345) nrows = 1000 counts = np.minimum(np.random.exponential(0.5, size=nrows).astype(int), 20) px = np.random.normal(loc=20.0, scale=5.0, size=np.sum(counts)) py = np.random.normal(loc=20.0, scale=5.0, size=np.sum(counts)) pz = np.random.normal(loc=0, scale=55, size=np.sum(counts)) m_pi = np.full_like(px, fill_value=0.135) energy = np.sqrt(px * px + py * py + pz * pz + m_pi * m_pi) return (counts, px, py, pz, energy)
def test_jet_resolution(): from coffea.jetmet_tools import JetResolution counts, test_eta, test_pt = dummy_jagged_eta_pt() test_Rho = np.full_like(test_eta, 100.) jer_names = ['Spring16_25nsV10_MC_PtResolution_AK4PFPuppi'] reso = JetResolution(**{name: evaluator[name] for name in jer_names}) print(reso) resos = reso.getResolution(JetEta=test_eta, Rho=test_Rho, JetPt=test_pt)
def test_factorized_jet_corrector(): from coffea.jetmet_tools import FactorizedJetCorrector counts, test_eta, test_pt = dummy_jagged_eta_pt() test_Rho = np.full_like(test_eta, 100.0) test_A = np.full_like(test_eta, 5.0) # Check that the FactorizedJetCorrector is functional jec_names = [ "Summer16_23Sep2016V3_MC_L1FastJet_AK4PFPuppi", "Summer16_23Sep2016V3_MC_L2Relative_AK4PFPuppi", "Summer16_23Sep2016V3_MC_L2L3Residual_AK4PFPuppi", "Summer16_23Sep2016V3_MC_L3Absolute_AK4PFPuppi", ] corrector = FactorizedJetCorrector( **{name: evaluator[name] for name in jec_names}) print(corrector) pt_copy = np.copy(test_pt) # Check that the corrector can be evaluated for flattened arrays corrs = corrector.getCorrection(JetEta=test_eta, Rho=test_Rho, JetPt=test_pt, JetA=test_A) assert (np.abs(pt_copy - test_pt) < 1e-6).all() test_pt_jag = ak.unflatten(test_pt, counts) test_eta_jag = ak.unflatten(test_eta, counts) test_Rho_jag = ak.unflatten(test_Rho, counts) test_A_jag = ak.unflatten(test_A, counts) # Check that the corrector can be evaluated for jagges arrays corrs_jag = corrector.getCorrection(JetEta=test_eta_jag, Rho=test_Rho_jag, JetPt=test_pt_jag, JetA=test_A_jag) assert ak.all(np.abs(pt_copy - ak.flatten(test_pt_jag)) < 1e-6) assert ak.all(np.abs(corrs - ak.flatten(corrs_jag)) < 1e-6) # Check that the corrector returns the correct answers for each level of correction # Use a subset of the values so that we can check the corrections by hand test_pt_jag = test_pt_jag[0:3] test_eta_jag = test_eta_jag[0:3] test_Rho_jag = test_Rho_jag[0:3] test_A_jag = test_A_jag[0:3] counts = counts[0:3] print("Raw jet values:") print("pT:", test_pt_jag) print("eta:", test_eta_jag) print("rho:", test_Rho_jag) print("area:", test_A_jag, "\n") # Start by checking the L1 corrections corrs_L1_jag_ref = ak.full_like(test_pt_jag, 1.0) corrector = FactorizedJetCorrector( **{name: evaluator[name] for name in jec_names[0:1]}) corrs_L1_jag = corrector.getCorrection(JetEta=test_eta_jag, Rho=test_Rho_jag, JetPt=test_pt_jag, JetA=test_A_jag) print("Reference L1 corrections:", corrs_L1_jag_ref) print("Calculated L1 corrections:", corrs_L1_jag) assert ak.all( np.abs(ak.flatten(corrs_L1_jag_ref) - ak.flatten(corrs_L1_jag)) < 1e-6) # Apply the L1 corrections and save the result test_ptL1_jag = test_pt_jag * corrs_L1_jag print("L1 corrected pT values:", test_ptL1_jag, "\n") assert ak.all( np.abs(ak.flatten(test_pt_jag) - ak.flatten(test_ptL1_jag)) < 1e-6) # Check the L2 corrections on a subset of jets # Look up the parameters for the L2 corrections by hand and calculate the corrections # [(1.37906,35.8534,-0.00829227,7.96644e-05,5.18988e-06), # (1.38034,17.9841,-0.00729638,-0.000127141,5.70889e-05), # (1.74466,18.6372,-0.0367036,0.00310864,-0.000277062), # (1.4759,24.8882,-0.0155333,0.0020836,-0.000198039), # (1.14606,36.4215,-0.00174801,-1.76393e-05,1.91863e-06), # (0.999657,4.02981,1.06597,-0.619679,-0.0494)], # [(1.54524,23.9023,-0.0162807,0.000665243,-4.66608e-06), # (1.48431,8.68725,0.00642424,0.0252104,-0.0335696)]]) corrs_L2_jag_ref = ak.unflatten( np.array([ 1.37038741364, 1.37710384514, 1.65148641108, 1.46840446827, 1.1328319784, 1.0, 1.50762056349, 1.48719866989, ]), counts, ) corrector = FactorizedJetCorrector( **{name: evaluator[name] for name in jec_names[1:2]}) corrs_L2_jag = corrector.getCorrection(JetEta=test_eta_jag, JetPt=test_pt_jag) print("Reference L2 corrections:", corrs_L2_jag_ref.tolist()) print("Calculated L2 corrections:", corrs_L2_jag.tolist()) assert ak.all( np.abs(ak.flatten(corrs_L2_jag_ref) - ak.flatten(corrs_L2_jag)) < 1e-6) # Apply the L2 corrections and save the result test_ptL1L2_jag = test_ptL1_jag * corrs_L2_jag print("L1L2 corrected pT values:", test_ptL1L2_jag, "\n") # Apply the L3 corrections and save the result corrs_L3_jag = ak.full_like(test_pt_jag, 1.0) test_ptL1L2L3_jag = test_ptL1L2_jag * corrs_L3_jag print("L1L2L3 corrected pT values:", test_ptL1L2L3_jag, "\n") # Check that the corrections can be chained together corrs_L1L2L3_jag_ref = ak.unflatten( np.array([ 1.37038741364, 1.37710384514, 1.65148641108, 1.46840446827, 1.1328319784, 1.0, 1.50762056349, 1.48719866989, ]), counts, ) corrector = FactorizedJetCorrector( **{name: evaluator[name] for name in (jec_names[0:2] + jec_names[3:])}) corrs_L1L2L3_jag = corrector.getCorrection(JetEta=test_eta_jag, Rho=test_Rho_jag, JetPt=test_pt_jag, JetA=test_A_jag) print("Reference L1L2L3 corrections:", corrs_L1L2L3_jag_ref) print("Calculated L1L2L3 corrections:", corrs_L1L2L3_jag) assert ak.all( np.abs( ak.flatten(corrs_L1L2L3_jag_ref) - ak.flatten(corrs_L1L2L3_jag)) < 1e-6) # Apply the L1L2L3 corrections and save the result test_ptL1L2L3chain_jag = test_pt_jag * corrs_L1L2L3_jag print("Chained L1L2L3 corrected pT values:", test_ptL1L2L3chain_jag, "\n") assert ak.all( np.abs( ak.flatten(test_ptL1L2L3_jag) - ak.flatten(test_ptL1L2L3chain_jag)) < 1e-6)