176 if len(sys.argv) < 2:
177 raise SystemExit(f"Usage: {sys.argv[0]} <input_root_file>")
178 input_file = sys.argv[1]
179 f = ROOT.TFile.Open(input_file)
180 if not f or f.IsZombie():
181 raise RuntimeError(f"Could not open file: {input_file}")
182 print(f
"Opened file: {input_file}\n")
183
184
185 tree = f.Get("FPGATrackSimDataPrepTree")
186 print_tree_info(tree, "FPGATrackSimDataPrepTree", check_content=True)
187 if tree:
188 for i in range(tree.GetEntries()):
189 tree.GetEntry(i)
190 for bname in ["LogicalEventInputHeader_PreCluster", "LogicalEventInputHeader_PostCluster"]:
191 try:
192 header = getattr(tree, bname, None)
193 if header is not None:
194 header.event()
195 header.nTowers()
196 except Exception as e:
197 raise RuntimeError(f"Event entry {i}: {bname} [error accessing: {e}]") from e
198
199 test_passed = False
200
201
202 for region in get_regions():
203 print(f
"\n=== Region {region} ===")
204 tree1 = f.Get(f"FPGATrackSimLogicalEventTree_reg{region}")
205 print_tree_info(tree1, f"FPGATrackSimLogicalEventTree_reg{region}", check_content=True)
206 if tree1:
207 check_tree_events(tree1, {
208 "LogicalEventStripHeader": "Strip",
209 "LogicalEventSpacepointHeader": "Spacepoint",
210 "LogicalEventFirstPixelHeader": "FirstPixel",
211 "LogicalEventSecondPixelHeader": "SecondPixel",
212 "LogicalEventOutputHeader": ("Output", "1st")
213 })
214 tree2 = f.Get(f"FPGATrackSimSecondStageTree_reg{region}")
215 print_tree_info(tree2, f"FPGATrackSimSecondStageTree_reg{region}", check_content=True)
216 if tree2:
217 check_tree_events(tree2, {
218 "LogicalEventOutputHeader": ("Output2nd", "2nd"),
219 "LogicalEventSlicedHeader": "Sliced2nd"
220 })
221
222 if not test_passed and tree1 and tree2:
223 events_1st = find_events_with_data(tree1, "1st")
224 events_2nd = find_events_with_data(tree2, "2nd")
225 common_events = sorted(
set(events_1st) &
set(events_2nd))
226 if common_events:
227 evtNum = common_events[0]
228 hit = events_2nd[evtNum]
229 try:
230 is_real = hit.isReal()
231 except Exception:
232 is_real = False
234 f" [PASS] Region {region} event {evtNum}: "
235 f"first hit x={hit.getX()}, y={hit.getY()}, z={hit.getZ()}, isReal={is_real}"
236 )
237 test_passed = True
238
239 f.Close()
240 if not test_passed:
241 raise RuntimeError(
242 "No event found with both 1st and 2nd stage roads/tracks and accessible hits "
243 "in the OutputHeader branch."
244 )
245 print(
"\nValidation complete.")
246
void print(char *figname, TCanvas *c1)