From fd4c3b718a78d9a085eb6313d103cd8218ca3ea305faa8185729e858212ab122 Mon Sep 17 00:00:00 2001 From: PioApocalypse Date: Thu, 12 Feb 2026 14:58:48 +0100 Subject: [PATCH] creates chain functions to expand the dataset from the entrypoint --- src/main.py | 115 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 44 deletions(-) diff --git a/src/main.py b/src/main.py index a6d82f0..b98cd33 100644 --- a/src/main.py +++ b/src/main.py @@ -60,60 +60,87 @@ def call_layers_from_list(elabid_list): ) return list_of_layers # list of Layer-class objects -def call_batch_from_entrypoint(sample_object): +def chain_entrypoint_to_batch(sample_object): ''' Takes an Entrypoint-class object, looks at its .batch_elabid attribute and returns a Material-class object containing data on the substrate batch associated to the starting sample. + + Dependency: call_material_from_elabid. ''' material_elabid = sample_object.batch_elabid material_object = call_material_from_elabid(material_elabid) return material_object -sample_object = call_entrypoint_from_elabid(elabid) -from_entrypoint_to_material(sample_object) +def chain_entrypoint_to_layers(sample_object): + ''' + Takes an Entrypoint-class object, looks at its .linked_experiments_elabid attribute (list) and returns a list of Layer-class objects containing data on the deposition layers associated to the starting sample - using the function call_layers_from_list. + + The list is sorted by progressive layer number (layer_number attribute). + + Dependency: call_layers_from_list. + ''' + linked_experiments_elabid = sample_object.linked_experiments_elabid # list of elabid + layer_object_list = call_layers_from_list(linked_experiments_elabid) + layer_object_list.sort(key=lambda x: x.layer_number) + return layer_object_list + + + +#sample_object = call_entrypoint_from_elabid(elabid) +#from_entrypoint_to_material(sample_object) if __name__=="__main__": print(f"=======================\n===== DEBUG MODE! =====\n=======================\n") ELABFTW_API_URL = "https://elabftw.fisica.unina.it/api/v2" apikey = getpass("Paste API key here: ") - # TEST. In production the entryType will probably just be "items" since the entrypoint is an item (sample). - entryType = None - while entryType not in ["items", "experiments"]: - eT = input("Enter a valid entry type [items, experiments]: ") - # This allows for a shortcut: instead of prompting the type before and the elabid after I can just prompt both at the same time - e.g. e51 is exp. 51, i1108 is item 1108... - if eT[0] in ["e", "i"] and eT[-1].isnumeric(): - try: - elabid = int(eT[1:]) - eT = eT[0] - except Exception: - print("Usage: i|item|items|i[ELABID] for items, e|experiment|experiments|e[ELABID] for experiments.") - continue - match eT: - case "items" | "i" | "item": - entryType = "items" - case "experiments" | "e" | "exp" | "experiment": - entryType = "experiments" - case _: - continue - # This will probably be reworked in production - try: - elabid = elabid - except NameError: - elabid = input("Input elabid here [default = 1111]: ") or 1111 - data = APIHandler(apikey).get_entry_from_elabid(elabid, entryType) - if entryType == "experiments": - layer = Layer(data) - result = layer.__dict__ - result.pop("extra") - print(result) - elif entryType == "items": - if data.get("category_title") == "Sample": - item = Entrypoint(data) - elif data.get("category_title") in ["PLD Target", "Substrate"]: - item = Material(data) - print(item.get_compound_formula(apikey)) - else: - raise Exception("The selected item or experiment is not in one of the following categories: [Sample, PLD Target, Substrate, PLD Deposition].") - result = item.__dict__ - result.pop("extra") - print(result) \ No newline at end of file + elabid = input("Enter elabid of your starting sample [default= 1111]: ") or 1111 + data = APIHandler(apikey).get_entry_from_elabid(elabid) + sample = Entrypoint(data) + layers = chain_entrypoint_to_layers(sample) + print(f"Sample name:\n{sample.name}\n") + print(f"Layers data:") + for layer in layers: + ld = layer.__dict__ + ld.pop("extra") + print(ld) + + # entryType = None + # while entryType not in ["items", "experiments"]: + # eT = input("Enter a valid entry type [items, experiments]: ") + # # This allows for a shortcut: instead of prompting the type before and the elabid after I can just prompt both at the same time - e.g. e51 is exp. 51, i1108 is item 1108... + # if eT[0] in ["e", "i"] and eT[-1].isnumeric(): + # try: + # elabid = int(eT[1:]) + # eT = eT[0] + # except Exception: + # print("Usage: i|item|items|i[ELABID] for items, e|experiment|experiments|e[ELABID] for experiments.") + # continue + # match eT: + # case "items" | "i" | "item": + # entryType = "items" + # case "experiments" | "e" | "exp" | "experiment": + # entryType = "experiments" + # case _: + # continue + # # This will probably be reworked in production + # try: + # elabid = elabid + # except NameError: + # elabid = input("Input elabid here [default = 1111]: ") or 1111 + # data = APIHandler(apikey).get_entry_from_elabid(elabid, entryType) + # if entryType == "experiments": + # layer = Layer(data) + # result = layer.__dict__ + # result.pop("extra") + # print(result) + # elif entryType == "items": + # if data.get("category_title") == "Sample": + # item = Entrypoint(data) + # elif data.get("category_title") in ["PLD Target", "Substrate"]: + # item = Material(data) + # print(item.get_compound_formula(apikey)) + # else: + # raise Exception("The selected item or experiment is not in one of the following categories: [Sample, PLD Target, Substrate, PLD Deposition].") + # result = item.__dict__ + # result.pop("extra") + # print(result) \ No newline at end of file