import json import org.python.core.PyDictionary as PyDictionary SAMPLE_INFO_KEYS = ["userName", "dewarName", "puckName", "puckBarcode", "puckType", "puckAddress", "sampleName", "samplePosition", "sampleBarcode", "sampleStatus", "sampleMountCount"] samples_info = [] def set_samples_info(info): global samples_info if (is_string(info)): info = json.loads(info) if not is_list(info): raise Exception("Sample info must be a list (given object type is " + str(type(info)) + ")") #Sanitize list remove = [] for sample in info: try: if set(sample.keys()) != set(SAMPLE_INFO_KEYS): raise Exception() except: remove.append(sample) for el in remove: info.remove(el) print "Invalid samples info element: " + str(el) samples_info = info save_samples_info() #Trust beamline on assignments, so update puck info update_puck_table() def clear_samples_info(): set_samples_info([]) def save_samples_info(): data = get_samples_info(True) output_file = open( get_context().setup.expandPath("{context}/samples_info.json") , "w") output_file.write(data) output_file.close() def restore_samples_info(): try: inputfile = open(get_context().setup.expandPath("{context}/samples_info.json"), "r") info = inputfile.read() except: print >> sys.stderr, "Error reading sample info file: " + str(sys.exc_info()[1]) info = [] set_samples_info(info) def get_samples_info(as_json=True): global samples_info return json.dumps(to_list(samples_info)) if as_json else samples_info def has_puck_datamatrix(datamatrix): if samples_info is not None: for si in samples_info: if si["puckBarcode"] == datamatrix: return True return False def add_puck_datamatrix(barcode, address = "", dewar = "Unknown", user = "Unknown", puck = "Unknown", type = "unipuck", sample_prefix = "Sample"): if has_puck_datamatrix(barcode): raise Exception("Datamatrix already defined: " + str(barcode)) for s in range(1,17): info = \ { "userName": user, \ "dewarName": dewar, \ "puckName": puck, \ "puckBarcode": address if barcode is None else barcode, \ "puckType": type, \ "puckAddress": address,\ "sampleName": sample_prefix + " " + str(s), \ "samplePosition": str(s),\ "sampleStatus": "Unknown", \ "sampleMountCount": "0", } samples_info.append(info) save_samples_info() def remove_puck_datamatrix(barcode): remove = [] for si in samples_info: if si["puckBarcode"] == barcode: remove.append(si) for el in remove: samples_info.remove(el) save_samples_info() def set_puck_datamatrix(puck, datamatrix): if puck is None: puck = "" if datamatrix is None: datamatrix = "" if samples_info is not None: for si in samples_info: if si["puckBarcode"] == datamatrix: si["puckAddress"] = puck elif si["puckAddress"] == puck: si["puckAddress"] = "" save_samples_info() def reset_puck_datamatrix(puck = None): if samples_info is not None: for si in samples_info: if (si["puckAddress"] == puck) or (puck is None): si["puckAddress"] = "" save_samples_info() for p in BasePlate.getChildren(): if (p.name == puck) or (puck is None): p.id = None def get_puck_datamatrix(): ret = {} for si in samples_info: if si["puckBarcode"] is not None and si["puckBarcode"]!="": ret[si["puckBarcode"]] = si["puckAddress"] return ret def get_puck_address(barcode): try: return get_puck_datamatrix()[barcode] except: return None def update_puck_table(): dms = get_puck_datamatrix() for barcode in dms.keys(): address = dms[barcode] puck = get_puck_obj(address) if puck is not None: puck.id = barcode #Sample mount/unmount def update_samples_info_sample_mount(puck_address, sample_position, sample_detected, sample_id): try: if (samples_info is not None) and (puck_address is not None): for si in samples_info: if str(si["puckAddress"]) == str(puck_address) and str(si["samplePosition"]) == str(sample_position): if sample_detected: if si["sampleStatus"] != "Mounted": si["sampleStatus"] = "Mounted" try: mount_count = int(si["sampleMountCount"]) except: mount_count = 0 si["sampleMountCount"] = mount_count + 1 else: si["sampleStatus"] = "Unknown" if sample_id is not None: si["sampleBarcode"] = sample_id save_samples_info() return except: pass def update_samples_info_sample_unmount(puck_address, sample_position): try: if (samples_info is not None) and (puck_address is not None): for si in samples_info: if str(si["puckAddress"]) == str(puck_address) and str(si["samplePosition"]) == str(sample_position): si["sampleStatus"] = "HasBeenMounted" save_samples_info() return except: pass def update_samples_info_sample_scan(puck_address, sample_position, sample_detected, sample_id): try: if (samples_info is not None) and (puck_address is not None): for si in samples_info: if str(si["puckAddress"]) == str(puck_address) and str(si["samplePosition"]) == str(sample_position): if sample_detected: if si["sampleStatus"] == "Unknown": si["sampleStatus"] = "Present" else: if si["sampleStatus"] == "Present": si["sampleStatus"] = "Unknown" if sample_id is not None: si["sampleBarcode"] = sample_id save_samples_info() return except: pass test_sample_data = [ \ { "userName": "Alexandre", \ "dewarName": "TEST", \ "puckName": "My puck", \ "puckBarcode": "AAA0001", \ "puckType": "unipuck", \ "puckAddress": "A1",\ "sampleName": "MySample 1", \ "samplePosition": 1,\ "sampleBarcode": "", \ "sampleStatus": "Present", \ "sampleMountCount": 0, } , \ { "userName": "Alexandre", \ "dewarName": "TEST", \ "puckName": "My puck", \ "puckBarcode": "AAA0001", \ "puckType": "unipuck", \ "puckAddress": "A1",\ "sampleName": "MySample 2", \ "samplePosition": 2,\ "sampleBarcode": "", \ "sampleStatus": "Present", \ "sampleMountCount": 0, } , \ { "userName": "Alexandre", \ "dewarName": "TEST", \ "puckName": "My puck", \ "puckBarcode": "AAA0001", \ "puckType": "unipuck", \ "puckAddress": "A1",\ "sampleName": "MySample 3", \ "samplePosition": 3,\ "sampleBarcode": "", \ "sampleStatus": "Present", \ "sampleMountCount": 0, } , \ { "userName": "Alexandre", \ "dewarName": "TEST", \ "puckName": "My puck", \ "puckBarcode": "AAA0001", \ "puckType": "unipuck", \ "puckAddress": "A1",\ "sampleName": "MySample 4", \ "samplePosition": 4,\ "sampleBarcode": "", \ "sampleStatus": "Present", \ "sampleMountCount": 0, } , \ { "userName": "Alexandre", \ "dewarName": "TEST", \ "puckName": "My puck", \ "puckBarcode": "AAA0001", \ "puckType": "unipuck", \ "puckAddress": "A1",\ "sampleName": "MySample 5", \ "sampleBarcode": "", \ "samplePosition": 5,\ "sampleStatus": "Present", \ "sampleMountCount": 0, } , \ { "userName": "Alexandre", \ "dewarName": "TEST", \ "puckName": "My puck", \ "puckBarcode": "AAA0002", \ "puckType": "unipuck", \ "puckAddress": "C2",\ "sampleName": "MySample 1", \ "samplePosition": 1,\ "sampleBarcode": "", \ "sampleStatus": "Present", \ "sampleMountCount": 0, } , \ { "userName": "Alexandre", \ "dewarName": "TEST", \ "puckName": "My puck", \ "puckBarcode": "AAA0002", \ "puckType": "unipuck", \ "puckAddress": "C2",\ "sampleName": "MySample 2", \ "samplePosition": 2,\ "sampleBarcode": "", \ "sampleStatus": "Present", \ "sampleMountCount": 0, } , \ { "userName": "Alexandre", \ "dewarName": "TEST", \ "puckName": "My puck", \ "puckBarcode": "AAA0002", \ "puckType": "unipuck", \ "puckAddress": "C2",\ "sampleName": "MySample 3", \ "samplePosition": 3,\ "sampleBarcode": "", \ "sampleStatus": "Present", \ "sampleMountCount": 0, } , \ { "userName": "Alexandre", \ "dewarName": "TEST", \ "puckName": "My puck", \ "puckBarcode": "AAA0002", \ "puckType": "unipuck", \ "puckAddress": "C2",\ "sampleName": "MySample 4", \ "samplePosition": 4,\ "sampleBarcode": "", \ "sampleStatus": "Present", \ "sampleMountCount": 0, } , \ { "userName": "Alexandre", \ "dewarName": "TEST", \ "puckName": "My puck", \ "puckBarcode": "AAA0002", \ "puckType": "unipuck", \ "puckAddress": "C2",\ "sampleName": "MySample 5", \ "samplePosition": 5,\ "sampleBarcode": "", \ "sampleStatus": "Present", \ "sampleMountCount": 0, } , \ ]