@@ -150,6 +150,45 @@ class Instrument(AindCoreModel):
150150 com_ports : Optional [List [Com ]] = Field (None , title = "COM ports" , unique_items = True )
151151 notes : Optional [str ] = None
152152
153+ @root_validator
154+ def validate_device_names (cls , values ): # noqa: C901
155+ """validate that all DAQ channels are connected to devices that
156+ actually exist
157+ """
158+
159+ device_names = []
160+
161+ optical_tables = values .get ("optical_tables" )
162+ enclosure = values .get ("enclosure" )
163+ lenses = values .get ("lenses" )
164+ fluorescence_filters = values .get ("fluorescence_filters" )
165+ motorized_stages = values .get ("motorized_stages" )
166+ scanning_stages = values .get ("scanning_stages" )
167+ light_sources = values .get ("light_sources" )
168+ detectors = values .get ("detectors" )
169+ additional_devices = values .get ("additional_devices" )
170+ daqs = values .get ("daqs" )
171+
172+ if daqs is None :
173+ return values
174+
175+ for device_type in [daqs , light_sources , detectors , additional_devices , optical_tables , enclosure , lenses , fluorescence_filters , motorized_stages , scanning_stages ]:
176+ if device_type is not None :
177+ device_names += [device .name for device in device_type ]
178+
179+
180+ for daq in daqs :
181+ if daq .channels is not None :
182+ for channel in daq .channels :
183+ if channel .device_name not in device_names :
184+ raise ValueError (
185+ f"Device name validation error: '{ channel .device_name } ' "
186+ + f"is connected to '{ channel .channel_name } ' on '{ daq .name } ', but "
187+ + "this device is not part of the rig."
188+ )
189+
190+ return values
191+
153192 @root_validator
154193 def validate_other (cls , v ):
155194 """Validator for other/notes"""
0 commit comments