Hi, I’m new to Pylabrobot, and very excited to set up imaging on Cytation 5! Unfortunately, the objectives I have are not in the set of supported objectives. Looking through the files, it seems that I could simply add the relevant entries to the Objective class and the dictionary in the biotek_backend file. Is there something I’m not considering, or would this be fine?
welcome to the forum!
for cytation1 i added them earlier this week.
for cytation5, the one odd thing is we need the annulus part number, not the objective part number. you can get this by exporting the objective information from gen5.exe, or by looking at a wireshark pcap.
after that, yes that’s all you need to do.
i actually have all xml files so will create a PR to add support for all objectives (at least the ones known to our gen5.exe installation)
Thanks for the quick response!
Unfortunately, after further investigation it seems like there is a bit more to my problem as the call to await self.send_command(“i”, f"h{spot + 1}") always returns b’**********2101\x03’ regardless of what objective is in the spot in question.
It seems like this is probably some sort of error code, or indication that the slot is empty.
The obvious workaround is simply to specify what objective is in each slot during the setup since I do actually know that, but I would certainly prefer to do things properly.
In any case, thank you very much for your help!
this is actually because those values need to be written to the machine. currently the only way to do that is through gen5.exe. if you like i can look into reverse engineering this? my thinking: if we reverse engineer writing, the only purpose would be reading it again after that, which is pointless (within context of plr) because, as you say, you can just tell plr. when switching indices later, the only thing we care about is index into the objective array, not actually the objective itself.
yes, **** means spot is empty (in configuration)
afaik, the machine has no sensor for telling which objective is installed
Yeah, I agree with you. There isn’t much point in reverse engineering writing just to be able to read it back again.
I had been working under the misconception that there was a mechanism for the microscope to detect which objectives are mounted. Things make a lot more sense without that false assumption.
I do believe I have things working properly now! Thanks again for your help!
should we accept an optional list objectives
from the user at cytation init? if not passed, we can load from the configuration stored on the instrument
That might not be a bad idea. It seems like the most straightforward way to deal with misconfiguration. Regardless, it was pretty easy to work around, though maybe I should just fix my config.