69def validate_readout(db, session):
70 errcount = 0
71
72
73 ru_apps = []
74 for app in confmodel.session_get_all_applications(db._obj, session.id):
75 if confmodel.component_disabled(db._obj, session.id, app.id):
76 continue
77 if app.class_name == "ReadoutApplication":
78 ru_apps.append(db.get_dal(app.class_name, app.id))
79 if len(ru_apps) == 0:
80 print(f"No enabled readout applicatios in session")
81 errcount += 1
82 d2d_seen = {}
83 d2d_dals = []
84 snd_dals = []
85 senders_seen = {}
86 for ru in ru_apps:
87 connections = 0
88 for d2d in ru.contains:
89 if d2d.className() != "DetectorToDaqConnection":
90 print(f"Error {ru.id} contains a {d2d.className()} where it should have a DetectorToDaqConnection")
91 errcount += 1
92 continue
93 if d2d.id in d2d_seen:
94 print(f"Error {ru.id} contains {d2d.id}"+
95 f" which is already read out by {d2d_seen[d2d.id]}")
96 errcount += 1
97 continue
98
99 senders = 0
100 receiver = 0
101 for d2d_res in d2d.contains:
102 if "DetDataReceiver" in d2d_res.oksTypes():
103 receiver += 1
104 elif "DetDataSender" in d2d_res.oksTypes():
105 if d2d_res.id in senders_seen:
106 print(f"Error sender {d2d_res.id} already seen in {senders_seen[d2d_res.id]}")
107 errcount += 1
108 continue
109 senders_seen[d2d_res.id] = d2d.id
110 snd_dals.append(d2d_res)
111 senders += 1
112 elif "ResourceSet" in d2d_res.oksTypes():
113 for snd_res in d2d_res.contains:
114 if "DetDataSender" in snd_res.oksTypes():
115 if snd_res.id in senders_seen:
116 print(f"Error sender {snd_res.id} already seen in {senders_seen[d2d_res.id]}")
117 errcount += 1
118 continue
119 senders_seen[snd_res.id] = d2d.id
120 snd_dals.append(snd_res)
121 senders += 1
122 if senders == 0:
123 print(f"Error {d2d.id} does not have any senders")
124 errcount += 1
125 continue
126 if receiver == 0:
127 print(f"Error {d2d.id} does not have a receiver")
128 errcount += 1
129 continue
130 d2d_seen[d2d.id] = ru.id
131 d2d_dals.append(d2d)
132 connections += 1
133 if connections == 0:
134 print(f"Error {ru.id} contains 0 detector connections")
135 errcount += 1
136
137 print (f"\nChecking data senders for duplicate streams");
138 if not check_unique_relationship(snd_dals, "DetectorStream"):
139 errcount += 1
140
141 print (f"\nChecking detector connections for duplicate geio ids")
142 if not check_unique_relationship(d2d_dals, "GeoId"):
143 errcount += 1
144
145 print (f"Session {session.id} readout validated with {errcount} errors:"+
146 f" contains {len(d2d_seen)} Detector connections"+
147 f" in {len(ru_apps)} readout applications")
148
149 return errcount
150