File indexing completed on 2026-07-26 08:22:17
0001 import argparse
0002 import logging
0003 import os
0004 import pandas
0005 import pathlib
0006
0007 log = logging.getLogger("event_trimmer")
0008
0009
0010 def main():
0011 parser = argparse.ArgumentParser()
0012
0013 parser.add_argument(
0014 "input",
0015 type=pathlib.Path,
0016 help="input event directory",
0017 )
0018
0019 parser.add_argument(
0020 "output",
0021 type=pathlib.Path,
0022 help="output event directory",
0023 )
0024
0025 parser.add_argument(
0026 "-i", "--event-id", help="event ID in input directory", default=0, type=int
0027 )
0028
0029 parser.add_argument(
0030 "-p",
0031 "--particle-id",
0032 help="particle ID to filter",
0033 type=int,
0034 required=True,
0035 action="append",
0036 )
0037
0038 args = parser.parse_args()
0039
0040 logging.basicConfig(
0041 level=logging.INFO,
0042 format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
0043 )
0044
0045 to_keep = args.particle_id
0046
0047 log.info(
0048 "Keeping %d particles: %s", len(to_keep), ", ".join(str(x) for x in to_keep)
0049 )
0050
0051 origin_event_prefix = "event%09d-" % args.event_id
0052 destination_event_prefix = "event%09d-" % 0
0053
0054
0055 origin_particles_initial_file = args.input / (
0056 origin_event_prefix + "particles_initial.csv"
0057 )
0058 particles_initial_df = pandas.read_csv(origin_particles_initial_file)
0059 log.info(
0060 "Read data for %d initial input particles from %s",
0061 particles_initial_df.shape[0],
0062 origin_particles_initial_file,
0063 )
0064 filtered_particles_initial_df = particles_initial_df[
0065 particles_initial_df["particle_id"].isin(to_keep)
0066 ]
0067 destination_particles_initial_file = args.output / (
0068 destination_event_prefix + "particles_initial.csv"
0069 )
0070 filtered_particles_initial_df.to_csv(
0071 destination_particles_initial_file, index=False
0072 )
0073 log.info(
0074 "Wrote data for %d initial output particles to %s",
0075 filtered_particles_initial_df.shape[0],
0076 destination_particles_initial_file,
0077 )
0078
0079
0080 origin_particles_final_file = args.input / (
0081 origin_event_prefix + "particles_final.csv"
0082 )
0083 if os.path.isfile(origin_particles_final_file):
0084 particles_final_df = pandas.read_csv(origin_particles_final_file)
0085 log.info(
0086 "Read data for %d final input particles from %s",
0087 particles_final_df.shape[0],
0088 origin_particles_final_file,
0089 )
0090 filtered_particles_final_df = particles_final_df[
0091 particles_final_df["particle_id"].isin(to_keep)
0092 ]
0093 destination_particles_final_file = args.output / (
0094 destination_event_prefix + "particles_final.csv"
0095 )
0096 filtered_particles_final_df.to_csv(
0097 destination_particles_final_file, index=False
0098 )
0099 log.info(
0100 "Wrote data for %d final output particles to %s",
0101 filtered_particles_final_df.shape[0],
0102 destination_particles_final_file,
0103 )
0104 else:
0105 log.warning(
0106 f"Final particle input file {origin_particles_final_file} does not exits - skipping"
0107 )
0108
0109
0110 origin_hits_file = args.input / (origin_event_prefix + "hits.csv")
0111 hits_df = pandas.read_csv(origin_hits_file)
0112 log.info("Read data for %d input hits from %s", hits_df.shape[0], origin_hits_file)
0113 hits_filtered_df = hits_df[hits_df["particle_id"].isin(to_keep)]
0114 destination_hits_file = args.output / (destination_event_prefix + "hits.csv")
0115 hits_filtered_df.to_csv(destination_hits_file, index=False)
0116 log.info(
0117 "Wrote data for %d output hits to %s",
0118 hits_filtered_df.shape[0],
0119 destination_hits_file,
0120 )
0121
0122
0123 origin_measurements_file = args.input / (origin_event_prefix + "measurements.csv")
0124 measurements_df = pandas.read_csv(origin_measurements_file)
0125 log.info(
0126 "Read data for %d input measurements from %s",
0127 measurements_df.shape[0],
0128 origin_measurements_file,
0129 )
0130 measurements_filtered_df = measurements_df[hits_df["particle_id"].isin(to_keep)]
0131 measurement_ids = list(measurements_filtered_df.index)
0132 meas_id_map = {a: b for (b, a) in enumerate(measurement_ids)}
0133 measurements_df["measurement_id"] = measurements_df["measurement_id"].apply(
0134 lambda x: meas_id_map.get(x, -1)
0135 )
0136 measurements_filtered_df = measurements_df[hits_df["particle_id"].isin(to_keep)]
0137 destination_measurements_file = args.output / (
0138 destination_event_prefix + "measurements.csv"
0139 )
0140 measurements_filtered_df.to_csv(destination_measurements_file, index=False)
0141 log.info(
0142 "Wrote data for %d output measurements to %s",
0143 measurements_filtered_df.shape[0],
0144 destination_measurements_file,
0145 )
0146
0147
0148 new_df = pandas.DataFrame(
0149 {
0150 "measurement_id": list(range(measurements_filtered_df.shape[0])),
0151 "hit_id": list(range(measurements_filtered_df.shape[0])),
0152 }
0153 )
0154 destination_simhit_map_file = args.output / (
0155 destination_event_prefix + "measurement-simhit-map.csv"
0156 )
0157 new_df.to_csv(destination_simhit_map_file, index=False)
0158 log.info(
0159 "Wrote data for %d output measurement-to-hit mappings to %s",
0160 new_df.shape[0],
0161 destination_simhit_map_file,
0162 )
0163
0164
0165 origin_cells_file = args.input / (origin_event_prefix + "cells.csv")
0166 cells_df = pandas.read_csv(origin_cells_file)
0167 log.info(
0168 "Read data for %d input cells from %s", cells_df.shape[0], origin_cells_file
0169 )
0170 filter = cells_df["measurement_id"].isin(measurement_ids)
0171 cells_df["measurement_id"] = cells_df["measurement_id"].apply(
0172 lambda x: meas_id_map.get(x, -1)
0173 )
0174 cells_filtered_df = cells_df[filter]
0175 destination_cells_file = args.output / (destination_event_prefix + "cells.csv")
0176 cells_filtered_df.to_csv(destination_cells_file, index=False)
0177 log.info(
0178 "Wrote data for %d output cells to %s",
0179 cells_filtered_df.shape[0],
0180 destination_cells_file,
0181 )
0182
0183
0184 if __name__ == "__main__":
0185 main()