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
78 app_dal = db.get_dal(app.class_name, app.id)
79 if "ReadoutApplication" in app_dal.oksTypes():
80 ru_apps.append(app_dal)
81
82 if len(ru_apps) == 0:
83 print(f"No enabled readout applicatios in session")
84 errcount += 1
85 d2d_seen = {}
86 d2d_dals = []
87 snd_dals = []
88 senders_seen = {}
89 for ru in ru_apps:
90 connections = 0
91 for d2d in ru.detector_connections:
92 if d2d.id in d2d_seen:
93 print(f"Error {ru.id} contains {d2d.id}"+
94 f" which is already read out by {d2d_seen[d2d.id]}")
95 errcount += 1
96 continue
97
98 senders = 0
99 for sndr in confmodel.d2d_senders(db._obj, d2d.id):
100 if sndr in senders_seen:
101 print(f"Error sender {sndr.id} already seen in {senders_seen[sndr.id]}")
102 errcount += 1
103 continue
104 senders_seen[sndr] = d2d.id
105 snd_dals.append(db.get_dal("DetDataSender", sndr))
106 senders += 1
107 if senders == 0:
108 print(f"Error {d2d.id} does not have any senders")
109 errcount += 1
110 continue
111 if confmodel.d2d_receiver(db._obj, d2d.id) == "":
112 print(f"Error {d2d.id} does not have a receiver")
113 errcount += 1
114 continue
115 d2d_seen[d2d.id] = ru.id
116 d2d_dals.append(d2d)
117 connections += 1
118 if connections == 0:
119 print(f"Error {ru.id} contains 0 detector connections")
120 errcount += 1
121
122 print (f"\nChecking data senders for duplicate streams");
123 if not check_unique_relationship(snd_dals, "DetectorStream"):
124 errcount += 1
125
126 print (f"\nChecking detector connections for duplicate geio ids")
127 if not check_unique_relationship(d2d_dals, "GeoId"):
128 errcount += 1
129
130 print (f"Session {session.id} readout validated with {errcount} errors:"+
131 f" contains {len(d2d_seen)} Detector connections"+
132 f" in {len(ru_apps)} readout applications")
133
134 return errcount
135