DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
plot_emulated_triggers Namespace Reference

Functions

dict[str, Any] parse ()
 
None plot_all_event_displays (list[NDArray] tc_data, list[NDArray] tc_data_tas, list[NDArray] ta_data, list[NDArray] ta_data_tps, int run_id, int file_index, bool batch)
 
 main ()
 

Detailed Description

Plot the trigger candidates, with their trigger activities & trigger primitives
for a given tpstream file

Function Documentation

◆ main()

plot_emulated_triggers.main ( )

Definition at line 122 of file plot_emulated_triggers.py.

122def main():
123 args = parse()
124 filename = args.filename
125 verbosity = args.verbose
126 #start_frag = args.start_frag
127 #end_frag = args.end_frag
128 batch = args.batch
129
130 # Getting the ta data
131 ta_reader = trgtools.TAReader(filename, verbosity, batch)
132 ta_reader.read_all_fragments()
133
134 # Getting the tc data
135 tc_reader = trgtools.TCReader(filename, verbosity, batch)
136 tc_reader.read_all_fragments()
137
138 # Make the displays
139 plot_all_event_displays(tc_reader.tc_data, tc_reader.ta_data, ta_reader.ta_data, ta_reader.tp_data, tc_reader.run_id, tc_reader.file_index, batch)
140
141 print(f"From TCReader: number of TCs: {len(tc_reader.tc_data)}, all the TAs in TCs: {len(np.concatenate(tc_reader.ta_data))}")
142 print(f"From TAReader: number of TAs: {len(ta_reader.tp_data)}")
143
int main(int argc, char **argv)

◆ parse()

dict[str, Any] plot_emulated_triggers.parse ( )
Parses CLI input arguments.

Returns:
    (dict[str, Any]): A dictionary of argument names vs argument values

Definition at line 21 of file plot_emulated_triggers.py.

21def parse() -> dict[str, Any]:
22 """
23 Parses CLI input arguments.
24
25 Returns:
26 (dict[str, Any]): A dictionary of argument names vs argument values
27 """
28 parser = argparse.ArgumentParser(
29 description="Display diagnostic information for TCs for a given HDF5 file."
30 )
31 parser.add_argument(
32 "filename",
33 help="Absolute path to tpstream file to display."
34 )
35 parser.add_argument(
36 "--verbose", "-v",
37 action="count",
38 help="Increment the verbose level (errors, warnings, all)."
39 "Save names and skipped writes are always printed. Default: 0.",
40 default=0
41 )
42 parser.add_argument(
43 "--start-frag",
44 type=int,
45 help="Starting fragment index to process from. Takes negative indexing (Default: -10), NOT SUPPORTED YET).",
46 default=-10
47 )
48 parser.add_argument(
49 "--end-frag",
50 type=int,
51 help="Fragment index to stop processing (i.e. not inclusive). Takes negative indexing (Default: N(0), NOT SUPPORTED YET).",
52 default=0
53 )
54 parser.add_argument(
55 "--batch", "-b",
56 action="store_true",
57 help="Do you want to run in batch mode (e.g. without loading bars/tqdm)?"
58 )
59
60 return parser.parse_args()
61

◆ plot_all_event_displays()

None plot_emulated_triggers.plot_all_event_displays ( list[NDArray] tc_data,
list[NDArray] tc_data_tas,
list[NDArray] ta_data,
list[NDArray] ta_data_tps,
int run_id,
int file_index,
bool batch )
Plots all the event displays, one per TC.

Each event display will contain TriggerActivities (red boxes), and
TriggerPrimitives (black points) for each TriggerActivity.

Args:
    tc_data (list[NDArray]): A list of TriggerCandidates
    tc_data_tas (list[NDArray]): A list of TriggerActivityData per TriggerCandidate
    ta_data (list[NDArray]): A full list of TriggerActivities
    ta_data_tps (list[NDArray]): A list of TriggerPrimitives per TriggerActivity
    run_id (int): Run ID number
    file_index (int): File index

Definition at line 62 of file plot_emulated_triggers.py.

68 batch: bool) -> None:
69 """
70
71 Plots all the event displays, one per TC.
72
73 Each event display will contain TriggerActivities (red boxes), and
74 TriggerPrimitives (black points) for each TriggerActivity.
75
76 Args:
77 tc_data (list[NDArray]): A list of TriggerCandidates
78 tc_data_tas (list[NDArray]): A list of TriggerActivityData per TriggerCandidate
79 ta_data (list[NDArray]): A full list of TriggerActivities
80 ta_data_tps (list[NDArray]): A list of TriggerPrimitives per TriggerActivity
81 run_id (int): Run ID number
82 file_index (int): File index
83 """
84
85 time_unit = "Ticks"
86
87 with PdfPages(f"event_displays_{run_id}.{file_index:04}.pdf") as pdf:
88 for tcdx, (tc, tas) in tqdm(enumerate(zip(tc_data, tc_data_tas)), total=len(tc_data), desc="Saving event displays", disable=batch):
89 plt.figure(figsize=(6, 4))
90
91 yend = tc["time_end"] - tc["time_start"]
92 ta_times_starts = tas['time_start'] - tc["time_start"]
93 ta_times_ends = tas['time_end'] - tc["time_start"]
94
95 channel_start = np.min(tas['channel_start'])
96 channel_end = np.max(tas['channel_end'])
97
98 # Only change the xlim if there is more than one TP.
99 yexpansion = yend * 0.05
100 xexpansion = (channel_end - channel_start) * 0.05
101
102 currentAxis = plt.gca()
103 for tadx, ta in enumerate(tas):
104 rectangle = mtp.patches.Rectangle((ta['channel_start'], ta_times_starts[tadx]), ta['channel_end'] - ta['channel_start'], ta_times_ends[tadx] - ta_times_starts[tadx], linewidth=1, edgecolor='r', facecolor='none')
105 currentAxis.add_patch(rectangle)
106
107 for tatmpdx, tatmp in enumerate(ta_data):
108 if (tatmp['time_start'] == ta['time_start']) and (tatmp['time_end'] == ta['time_end']) and (tatmp['channel_start'] == ta['channel_start']) and (tatmp['channel_end'] == ta['channel_end']):
109 time_starts = ta_data_tps[tatmpdx]['time_start'] - tc["time_start"]
110 plt.scatter(ta_data_tps[tatmpdx]['channel'], time_starts, lw=0, color='black', marker=',', s=1)
111
112 plt.title(f'Run {run_id}.{file_index:04} Event Display: {tcdx:03}')
113 plt.ylabel(f"Relative Start Time ({time_unit})")
114 plt.xlabel("Channel")
115 plt.ylim(0 - yexpansion, yend + yexpansion)
116 plt.xlim(channel_start - xexpansion, channel_end + xexpansion)
117
118 plt.tight_layout()
119 pdf.savefig()
120 plt.close()
121