def recalculate(eventWise_path):
    eventWise = Components.EventWise.from_file(eventWise_path)
    n_events = len(eventWise.X)
    #n_events = 200
    mean_distance = np.full((n_events, max_particles), np.nan)
    dimension_remove = np.zeros((n_events, max_particles))
    dimension_add = np.zeros((n_events, max_particles))
    merged_change = np.zeros((n_events, max_particles))
    eigenvalues = np.full((n_events, max_particles, max_particles), np.nan)
    break_point = np.full(n_events, -1)

    for event_n in range(n_events):
        if event_n % 100 == 0:
            print(f"{event_n/n_events:%}   ", end='\r', flush=True)
        eventWise.selected_event = event_n
        # make the jets
        jets = FormJets.SpectralFull(eventWise,
                                     assign=False,
                                     dict_jet_params=spectral_jet_params)
        # get the initial embedding
        embedding = np.copy(jets._eigenspace)
        num_particles = embedding.shape[0]
        num_dims = embedding.shape[1]
        if len(jets._distances2):
            mean = np.nanmean(
                np.sqrt(jets._distances2[np.tril_indices_from(
                    jets._distances2, -1)]))
        else:
            continue
        mean_distance[event_n, jets.currently_avalible] = mean
        p = 1
        while jets.currently_avalible:
            p = jets.currently_avalible
            #p+=1
            np.fill_diagonal(jets._distances2, np.inf)
            row, column = np.unravel_index(np.argmin(jets._distances2),
                                           jets._distances2.shape)
            jets._merge_pseudojets(row, column, jets._distances2[row, column])
            new_embedding = np.copy(jets._eigenspace)
            new_mean = np.nanmean(
                np.sqrt(jets._distances2[np.tril_indices_from(
                    jets._distances2, -1)]))
            if new_mean > R and break_point[event_n] < 0:
                break_point[event_n] = p
            mean_distance[event_n, p - 1] = new_mean
            new_num_dims = jets._eigenspace.shape[1]
            eigenvalues[event_n, p, :new_num_dims] = jets.eigenvalues[-1]
            if new_num_dims > num_dims:
                lower_dim = jets.eigenspace_distance2(
                    new_embedding[:, :num_dims], new_embedding[:, :num_dims],
                    [], [])
                lower_mean = np.nanmean(
                    np.sqrt(lower_dim[np.tril_indices_from(lower_dim, -1)]))
                dimension_shift = new_mean - lower_mean
                dimension_add[event_n, p] = dimension_shift
            elif new_num_dims < num_dims:
                # old embedding had more particles
                lower_dim = jets.eigenspace_distance2(
                    embedding[:, :new_num_dims], embedding[:, :new_num_dims],
                    [], [])
                lower_mean = np.nanmean(
                    np.sqrt(lower_dim[np.tril_indices_from(lower_dim, -1)]))
                dimension_shift = lower_mean - mean
                dimension_remove[event_n, p] = dimension_shift
            remaining_shift = new_mean - mean - dimension_shift
            merged_change[event_n, p] = remaining_shift
            mean = new_mean
            embedding = new_embedding
            num_dims = new_num_dims
    return mean_distance, dimension_remove, dimension_add, merged_change, break_point, eigenvalues
예제 #2
0
def get_data(eventWise):
    spectral_jet_params = dict(
        ExpofPTMultiplier=0,
        ExpofPTPosition='input',
        ExpofPTFormat='Luclus',
        NumEigenvectors=np.inf,
        StoppingCondition='meandistance',
        EigNormFactor=0.,
        EigenvalueLimit=0.4,
        #  BaseJump=0.05,
        #  JumpEigenFactor=10,
        #  MaxCutScore=0.2,
        Laplacien='symmetric',
        DeltaR=1.26,
        AffinityType='exponent',
        AffinityExp=2.,
        Sigma=.15,
        CombineSize='sum',
        EigDistance='abscos',
        CutoffKNN=5,
        CutoffDistance=None,
        PhyDistance='angular')

    jets = FormJets.SpectralFull(eventWise,
                                 assign=False,
                                 dict_jet_params=spectral_jet_params)

    solution = eventWise.Solution
    source = eventWise.JetInputs_SourceIdx
    truth = np.fromiter((next(j for j, jet in enumerate(solution) if i in jet)
                         for i in source),
                        dtype=int)

    affinities = [jets._affinity]
    energies = [jets.Energy]
    pts = [jets.PT]
    rapidities = [jets.Rapidity]
    phis = [jets.Phi]
    showers = [truth]
    old_phys_space = np.array(list(zip(rapidities[-1], phis[-1])))

    num_showers = np.max(truth) + 1
    input_idxs = [jets.InputIdx[:jets.currently_avalible]]
    embedding_coordinates = [jets._eigenspace]

    continuations = []
    joins = []
    embedding_continuations = []
    continuation_showers = []
    embedding_joins = []
    join_types = []

    while True:
        jets._step_assign_parents()
        if jets.currently_avalible == 0:
            break

        input_idxs.append(jets.InputIdx[:jets.currently_avalible])
        carried_to = np.fromiter((i in input_idxs[-2] for i in input_idxs[-1]),
                                 dtype=bool)
        carried_from = np.fromiter(
            (i in input_idxs[-1] for i in input_idxs[-2]), dtype=bool)

        new_embedding = jets._eigenspace

        new_showers = np.empty(new_embedding.shape[0], dtype=int)
        new_showers[carried_to] = showers[-1][carried_from]

        merged_showers = showers[-1][~carried_from]
        heavier = np.argmax(energies[-1][~carried_from])
        good_merge = len(set(merged_showers)) == 1
        join_types.append(good_merge)
        # in a good merge it won't matter
        new_showers[~carried_to] = merged_showers[heavier]
        showers.append(new_showers)
        energies.append(jets.Energy)

        pts.append(jets.PT)
        rapidities.append(jets.Rapidity)
        phis.append(jets.Phi)
        phys_space = np.array(list(zip(rapidities[-1], phis[-1])))
        affinities.append(jets._affinity)

        orientations = FormJets.parity(input_idxs[-2],
                                       embedding_coordinates[-1],
                                       input_idxs[-1], new_embedding)
        new_embedding[:, :len(orientations)] *= orientations[np.newaxis]
        embedding_coordinates.append(new_embedding)

        continuations += [[[
            old_phys_space[~carried_from][0], phys_space[~carried_to][0]
        ]], [[old_phys_space[~carried_from][1], phys_space[~carried_to][0]]]]

        embedding_continuations += [
            list(
                zip(embedding_coordinates[-2][carried_from],
                    embedding_coordinates[-1][carried_to])) + [[
                        embedding_coordinates[-2][~carried_from][heavier],
                        embedding_coordinates[-1][~carried_to][0]
                    ]]
        ]
        continuation_showers += [
            list(showers[-2][carried_from]) +
            [merged_showers[0], merged_showers[1]]
        ]

        embedding_joins += [[
            embedding_coordinates[-2][~carried_from][0],
            embedding_coordinates[-2][~carried_from][1]
        ]]
        joins += [[
            old_phys_space[~carried_from][0], old_phys_space[~carried_from][1]
        ]]
        old_phys_space = phys_space
    data = {
        'num_showers': num_showers,
        'PT': pts,
        'Rapidity': rapidities,
        'Phi': phis,
        'Energy': energies,
        'affinity': affinities,
        'embed_coords': embedding_coordinates,
        'shower': showers,
        'embed_cont': embedding_continuations,
        'cont': continuations,
        'cont_shower': continuation_showers,
        'join': joins,
        'embed_join': embedding_joins,
        'join_type': join_types,
    }
    return data