def event_mass_4jet(self): self.event_mass_4jet = [] for event_4_vector in event_stats_added_4: event_4_list = list(event_4_vector) event_4_array = np.array(event_4_list) event_mass = ef.ms_from_p4s(event_4_array) self.event_mass_4jet.append(event_mass)
def test_ms_from_ps(dim, nevents, nparticles): masses = np.random.rand(nevents, nparticles) events = ef.gen_random_events(nevents, nparticles, mass=masses, dim=dim) masses = masses.reshape(events.shape[:-1]) results = ef.ms_from_ps(events) assert epsilon_diff(results, masses, 1e-10) if dim == 4: assert epsilon_diff(results, ef.ms_from_p4s(events), 1e-10)
def fit_pfn(self, model_settings): # convert labels to categorical Y_PFN = energyflow.utils.to_categorical(self.y, num_classes=2) # preprocess by centering jets and normalizing pts X_PFN = self.X_particles for x_PFN in X_PFN: mask = x_PFN[:,0] > 0 yphi_avg = np.average(x_PFN[mask,1:3], weights=x_PFN[mask,0], axis=0) x_PFN[mask,1:3] -= yphi_avg x_PFN[mask,0] /= x_PFN[:,0].sum() # handle particle id channel if model_settings['use_pids']: self.my_remap_pids(X_PFN) else: X_PFN = X_PFN[:,:,:3] # Split data into train, val and test sets (X_PFN_train, X_PFN_val, X_PFN_test,Y_PFN_train, Y_PFN_val, Y_PFN_test) = energyflow.utils.data_split(X_PFN, Y_PFN, val=self.n_val, test=self.n_test) # build architecture pfn = energyflow.archs.PFN(input_dim=X_PFN.shape[-1], Phi_sizes=model_settings['Phi_sizes'], F_sizes=model_settings['F_sizes']) # train model pfn.fit(X_PFN_train, Y_PFN_train, epochs=model_settings['epochs'], batch_size=model_settings['batch_size'], validation_data=(X_PFN_val, Y_PFN_val), verbose=1) # get predictions on test data preds_PFN = pfn.predict(X_PFN_test, batch_size=1000) # Get AUC and ROC curve + make plot auc_PFN = sklearn.metrics.roc_auc_score(Y_PFN_test[:,1], preds_PFN[:,1]) print('Particle Flow Networks/Deep Sets: AUC = {} (test set)'.format(auc_PFN)) self.roc_curve_dict['PFN'] = sklearn.metrics.roc_curve(Y_PFN_test[:,1], preds_PFN[:,1]) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # Now we compare the PFN ROC curve to single observables # 1. Jet mass (Note: This takes in (pt,y,phi) and converts it to 4-vectors and computes jet mass) # (Note: X_PFN_train is centered and normalized .. should be ok) masses = np.asarray([energyflow.ms_from_p4s(energyflow.p4s_from_ptyphims(x).sum(axis=0)) for x in X_PFN_train]) self.roc_curve_dict['Jet_mass'] = sklearn.metrics.roc_curve(Y_PFN_train[:,1], -masses) # 2. Multiplicity (Is this a useful observable for pp vs AA?) mults = np.asarray([np.count_nonzero(x[:,0]) for x in X_PFN_train]) self.roc_curve_dict['Multiplicity'] = sklearn.metrics.roc_curve(Y_PFN_train[:,1], -mults)
def test_ms_from_p4s(nevents, nparticles): p4s = ef.gen_random_events(nevents, nparticles, dim=4, mass='random').reshape(nevents, nparticles, 4) ms = ef.ms_from_p4s(p4s) slow_ms = [] for i in range(nevents): event_ms = [] for j in range(nparticles): event_ms.append( np.sqrt(p4s[i, j, 0]**2 - p4s[i, j, 1]**2 - p4s[i, j, 2]**2 - p4s[i, j, 3]**2)) slow_ms.append(event_ms) slow_ms = np.asarray(slow_ms) assert epsilon_diff(slow_ms, ms)
def test_ys_from_pts_etas_ms(nevents, nparticles): p4s = ef.gen_random_events(nevents, nparticles, dim=4, mass='random').reshape(nevents, nparticles, 4) ys = ef.ys_from_p4s(p4s) y_primes = ef.ys_from_pts_etas_ms(ef.pts_from_p4s(p4s), ef.etas_from_p4s(p4s), ef.ms_from_p4s(p4s)) assert epsilon_diff(ys, y_primes, 1e-12) # test cutoff pts, ms = 1000 * np.random.rand(25), 10 * np.random.rand(25) etas = np.random.choice([-1., 1.], size=25) * 100 * np.random.rand(25) for c1, c2 in zip(np.linspace(20, 100, 5), 20 + 80 * np.random.rand(5)): ys_c1 = ef.ys_from_pts_etas_ms(pts, etas, ms, _cutoff=c1) ys_c2 = ef.ys_from_pts_etas_ms(pts, etas, ms, _cutoff=c2) assert epsilon_diff(ys_c1, ys_c2, 1e-12)
auc = roc_auc_score(Y_test[:, 1], preds[:, 1]) print() print('EFN AUC:', auc) print() # some nicer plot settings plt.rcParams['font.family'] = 'serif' plt.rcParams['figure.autolayout'] = True fig, axes = plt.subplots(1, 2, figsize=(8, 4)) ######################### ROC Curve Plot ######################### # get multiplicity and mass for comparison masses = np.asarray( [ef.ms_from_p4s(ef.p4s_from_ptyphims(x).sum(axis=0)) for x in X]) mults = np.asarray([np.count_nonzero(x[:, 0]) for x in X]) mass_fp, mass_tp, threshs = roc_curve(Y[:, 1], -masses) mult_fp, mult_tp, threshs = roc_curve(Y[:, 1], -mults) # plot the ROC curves axes[0].plot(efn_tp, 1 - efn_fp, '-', color='black', label='EFN') axes[0].plot(mass_tp, 1 - mass_fp, '-', color='blue', label='Jet Mass') axes[0].plot(mult_tp, 1 - mult_fp, '-', color='red', label='Multiplicity') # axes labels axes[0].set_xlabel('Quark Jet Efficiency') axes[0].set_ylabel('Gluon Jet Rejection') # axes limits axes[0].set_xlim(0, 1)
def test_gen_random_events_mcom(nevents, nparticles, dim): events = ef.gen_random_events_mcom(nevents, nparticles, dim=dim) assert events.shape == (nevents, nparticles, dim) assert epsilon_diff(ef.ms_from_p4s(events)**2 / dim, 0, 10**-12) assert epsilon_diff(np.sum(events, axis=1), 0, 10**-12)
def test_gen_random_events(nevents, nparticles, dim, mass): events = ef.gen_random_events(nevents, nparticles, dim=dim, mass=mass) assert events.shape == (nevents, nparticles, dim) assert epsilon_diff(ef.ms_from_p4s(events)**2, mass**2, 10**-13)
def test_gen_massless_phase_space(nevents, nparticles): events = ef.gen_massless_phase_space(nevents, nparticles) assert events.shape == (nevents, nparticles, 4) assert epsilon_diff(ef.ms_from_p4s(events)**2, 0, 10**-13)
# get ROC curve if we have sklearn if roc_curve: cnn_fp, cnn_tp, threshs = roc_curve(Y_test[:,1], preds[:,1]) # get area under the ROC curve auc = roc_auc_score(Y_test[:,1], preds[:,1]) print() print('CNN AUC:', auc) print() # make ROC curve plot if we have matplotlib if plt: # get multiplicity and mass for comparison masses = np.asarray([ef.ms_from_p4s(ef.p4s_from_ptyphims(x).sum(axis=0)) for x in X]) mults = np.asarray([np.count_nonzero(x[:,0]) for x in X]) mass_fp, mass_tp, threshs = roc_curve(Y[:,1], -masses) mult_fp, mult_tp, threshs = roc_curve(Y[:,1], -mults) # some nicer plot settings plt.rcParams['figure.figsize'] = (4,4) plt.rcParams['font.family'] = 'serif' plt.rcParams['figure.autolayout'] = True # plot the ROC curves plt.plot(cnn_tp, 1-cnn_fp, '-', color='black', label='CNN') plt.plot(mass_tp, 1-mass_fp, '-', color='blue', label='Jet Mass') plt.plot(mult_tp, 1-mult_fp, '-', color='red', label='Multiplicity') # axes labels