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)
Beispiel #2
0
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)
Beispiel #3
0
    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)
Beispiel #4
0
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)
Beispiel #5
0
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)
Beispiel #6
0
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)
Beispiel #7
0
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)
Beispiel #8
0
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)
Beispiel #9
0
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)
Beispiel #10
0
# 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