Source code for pipeline.Embedding.process_custom

"""Custom functions for filtering and alterning an event.
"""

import torch
from torch_geometric.data import Data
from utils.tools import tarray
from utils.graphutils import batch2df


[docs]def edges_at_least_3_hits(batch: Data) -> Data: # at least 3 hits to be classified as valid edges # not_reconstructible_mask = batch.n_unique_planes < 3 df_hits_particles = batch2df.get_df_hits_particles( batch=batch, particle_columns=["nhits_velo"] ) df_edges = batch2df.get_df_edges(batch=batch) df_edges_particles = batch2df.merge_df_hits_particles_to_edges( df_edges=df_edges, df_hits_particles=df_hits_particles ) df_edges_particles["nhits_velo_left"] = df_edges_particles[ "nhits_velo_left" ].fillna(0) df_edges_particles["nhits_velo_right"] = df_edges_particles[ "nhits_velo_right" ].fillna(0) df_edges_particles["y"] = ( df_edges_particles["y"] & ( df_edges_particles["nhits_velo_left"] == df_edges_particles["nhits_velo_right"] ) & (df_edges_particles["nhits_velo_left"] >= 3) ) df_combined_edges = ( df_edges_particles.groupby(["hit_idx_left", "hit_idx_right"])["y"] .max() .rename("combined_y") .reset_index() ) df_edges = df_edges.merge( df_combined_edges, on=["hit_idx_left", "hit_idx_right"], how="left", ).sort_values("edge_idx") batch["y"] = tarray.series_to_tensor(df_edges["combined_y"]) return batch
[docs]def edges_at_least_3_planes(batch: Data) -> Data: # at least 3 hits to be classified as valid edges # not_reconstructible_mask = batch.n_unique_planes < 3 df_hits_particles = batch2df.get_df_hits_particles( batch=batch, particle_columns=["n_unique_planes"] ) df_edges = batch2df.get_df_edges(batch=batch) df_edges_particles = batch2df.merge_df_hits_particles_to_edges( df_edges=df_edges, df_hits_particles=df_hits_particles ) df_edges_particles["n_unique_planes_left"] = df_edges_particles[ "n_unique_planes_left" ].fillna(0) df_edges_particles["n_unique_planes_right"] = df_edges_particles[ "n_unique_planes_right" ].fillna(0) df_edges_particles["y"] = ( df_edges_particles["y"] & ( df_edges_particles["n_unique_planes_left"] == df_edges_particles["n_unique_planes_right"] ) & (df_edges_particles["n_unique_planes_left"] >= 3) ) df_combined_edges = ( df_edges_particles.groupby(["hit_idx_left", "hit_idx_right"])["y"] .max() .rename("combined_y") .reset_index() ) df_edges = df_edges.merge( df_combined_edges, on=["hit_idx_left", "hit_idx_right"], how="left", ).sort_values("edge_idx") batch["y"] = tarray.series_to_tensor(df_edges["combined_y"]) return batch
[docs]def remove_edges_in_same_plane(batch: Data) -> Data: edge_index_plane = batch.plane[batch.edge_index] no_self_edge_mask = edge_index_plane[0] != edge_index_plane[1] batch["edge_index"] = batch.edge_index[:, no_self_edge_mask] batch["y"] = batch.y[no_self_edge_mask] return batch
[docs]def edge_features_as_slope(batch: Data) -> Data: """Build edge features that correspond to the slope.""" norm_x = batch.un_x / 14.5 norm_y = batch.un_y / 14.5 xe = batch.un_x[batch.edge_index] ye = batch.un_y[batch.edge_index] ze = batch.un_z[batch.edge_index] slopes_yz = (ye[1] - ye[0]) / (ze[1] - ze[0]) / 0.17 slopes_xz = (xe[1] - xe[0]) / (ze[1] - ze[0]) / 0.17 assert not torch.isnan(slopes_yz).any() assert not torch.isnan(slopes_xz).any() # Modify batch definition batch["x"] = torch.stack((norm_x, norm_y, batch["x"][:, 2]), dim=1).float() batch["edge_features"] = torch.stack((slopes_xz, slopes_yz), dim=1).float() return batch
[docs]def weights_inversely_proportional_to_nhits(batch: Data) -> Data: """Define edge weights that are inversely proportional to the number of hits.""" node_weights = 7.0 / batch.n_unique_planes node_weights = torch.nan_to_num(node_weights, nan=1.0) edge_weights = torch.mean(node_weights[batch.edge_index], dim=0) batch.edge_weights = edge_weights * batch.edge_index.shape[1] / edge_weights.sum() assert not torch.isnan(batch.edge_weights).any(), str(batch.edge_weights) return batch