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
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