Back to home page

EIC code displayed by LXR

 
 

    


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     # Logic for processing the particle initial states
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     # Logic for processing the particle final states
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     # Logic for processing hits
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     # Logic for processing measurements
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     # Logic for building the simhit map
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     # Logic for processing cells
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()