From dcd3b261c898c7afe6383f261975f09657749947 Mon Sep 17 00:00:00 2001 From: Taisiia Sherstiukova Date: Tue, 17 Dec 2024 11:29:27 -0700 Subject: [PATCH 1/3] encoding functions using URIs and sequence search --- .DS_Store | Bin 0 -> 6148 bytes .github/.DS_Store | Bin 0 -> 6148 bytes excelutils/.DS_Store | Bin 0 -> 6148 bytes excelutils/excel_sbol_utils/library2.py | 440 ++++++++++++++++++------ 4 files changed, 338 insertions(+), 102 deletions(-) create mode 100644 .DS_Store create mode 100644 .github/.DS_Store create mode 100644 excelutils/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..dd80af8b4b49531f7807ad6c70b9a64ba9e256a5 GIT binary patch literal 6148 zcmeHK!AiqG5S^_7t5PhU^p=aD7omR;OT2mO57Z>m3aKfy1&_g#|Kwf4kCB3YfNyrz znl-7tiO3Ahyv^*)?(9q0%@UF6FR~s{mx$U>#?}r@gK$4F7{^_{#Z5$wzX!~YlfMHx^Alz|Nl@RkN??+L0^29yD1V8sCM z4a##x5tpmnh0e}JAR?z0V1m}bfBZs9RdLTwpfs$(66~jn6{Gp4B9F~HTPR3n6 zjGNiG8;Y^BWBkyDlZgb?Dg(-Z&%l;EcKQ6jSbzWblk`a$PzL@L115+EaUV-^XKQV7 ueAb50A(VyVO2JhM8ulngEFZ;(P%H3<+yF)nOF?)b`XgXzP@@d|Dgz%ro_B@- literal 0 HcmV?d00001 diff --git a/.github/.DS_Store b/.github/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..81cac08efa99e03ce47baa6ae5a2699023c26201 GIT binary patch literal 6148 zcmeHK%}T>S5dOCIkRnKr9`gv+CrC?j5ER7dS#9eNn3AGMuQ~b(zK{nW#fz`tH#ZCJ^yMszyIwvjCsR#6dfntdDbsXVltcPO?`Maf*Q2-o=9uxX zW2X1Zc^yc49n4VT5f8XU!PyK?YuUdvdoAbuaWl`kVZTYa$nNV2GepGmZ963@h-d;A9GxM2U~*r4U?a<%0y#e;(vmu=DN!6$d*U}L zAZu69Ej?0$xW9f&+R_8vBiFTE6YG>B7WwPqxSB4SwBG1!pI66l)~TxMm}=Bco~|xm zWAipUj@N#Rx4GN@#uxomkFJ0#;0pX31!OyiP0kfPx&p3%E3i{Q_J;r$EDd|bymcVt z763R#Ivd8)O9&?zmWI6|?!Z{7K&7&^7_4;UgVmLWy`s{It@&VkGh2tk`R#aq$mPVP zqDNQ26*yGjL@x_D|F1vq{|`xi6r6aWAK literal 0 HcmV?d00001 diff --git a/excelutils/excel_sbol_utils/library2.py b/excelutils/excel_sbol_utils/library2.py index e320936..cfca938 100644 --- a/excelutils/excel_sbol_utils/library2.py +++ b/excelutils/excel_sbol_utils/library2.py @@ -2,6 +2,9 @@ import excel_sbol_utils.helpers as hf import re import logging +import requests +import sys +import os # might be better if some of the ones like data sources were put in a library # which contained both sbol2 and sbol3. Then excel converter could check # if in lib2 or lib_both for version 2 and lib3 or lib_both for version 3 @@ -67,27 +70,145 @@ def definedFunComponent(rowobj): #NOT IMPLEMENTED # # print(self.obj, fcobj) # self.obj.functionalComponents.add(fcobj.copy()) pass +def sequence_authentication(email, password, base_url,uri): + login_data = { + 'email': email, + 'password': password + } + if email is None or password is None or base_url is None: + seq_search = requests.get( + f'https://synbiohub.org/{uri}', + headers={ + 'Accept': 'application/json' + } + ) + if seq_search.status_code == 200: + public_results = seq_search.json() + if public_results: + if len(public_results) > 1: + print("Number of duplicate sequences found: ", len(public_results)) + for result in public_results: + print("The sequence already exists in the public repository. The URI is: ", result['uri']) + return False + else: + print("Sequence not found in public repository.") + # double check the logic fo public repos and sequence search + return True + else: + login_response = requests.post( + f"{base_url}/login", + headers={ + 'Accept': 'plain/text' + }, + data= login_data + ) + if login_response.status_code == 200: + sequence_search_response = requests.get( + uri, + headers={ + 'Accept': 'application/json', + 'X-authorization': login_response.content + } + ) + if sequence_search_response.status_code == 200: + search_results = sequence_search_response.json() + if search_results: + if len(search_results) > 1: + + print("Number of duplicate sequences found: ", len(search_results)) + for result in search_results: + print("The sequence already exists in the database. The URI is: ", result['uri']) + + return False + else: + print("Sequence does not exist in the database. Adding sequence.") + return True + + + return True + else: + print("Login failed.") + return False + +def link_validation(email, password, base_url, target_url): + # initial check w/out auth + # print("Checking link: ", target_url) + login_data = { + 'email': email, + 'password': password + } + initial_response = requests.get(target_url, headers={'Accept': 'application/json'}) + # print("Initital response status code: ", initial_response.status_code) + if initial_response.status_code == 200: + print("Link is accessible without authentication.") + return True + + # the link is not accessible without authentication, try logging in + elif initial_response.status_code in {401, 403, 404}: + if email is None or password is None or base_url is None: + print("Need login credentials to access the link.") + return False + else: + login_response = requests.post( + f"{base_url}/login", + headers={ + 'Accept': 'plain/text' + }, + data= login_data + ) + # print("Login response status code: ", login_response.status_code) + + + # check if login was successful + if login_response.status_code == 200: + # retry accessing the link after logging in + final_response = requests.get(target_url,headers = {'Accept': 'application/json', 'X-authorization': login_response.content}) + if final_response.status_code == 200: + print("Link is accessible after authentication.") + return True + else: + print("Link is not accessible after authentication.") + return False + + print("Link is not accessible.") + return False + + def encodesFor(rowobj): module_name_pref = rowobj.obj_uri.split("/")[-1] - + module_name_suf = None + username = os.getenv("SBOL_USERNAME") + password = os.getenv("SBOL_PASSWORD") + url = os.getenv("SBOL_URL") + # print(rowobj.col_cell_dict) for col in rowobj.col_cell_dict.keys(): val = rowobj.col_cell_dict[col] + # print("Val: ", val) if isinstance(val, str): - if col == "Encodes for": + if col == "Encodes for": module_name_suf = val.split("/")[-1] protein_comp_uri = val break - - if not module_name_suf: - raise ValueError("No 'Encodes for' value found in rowobj.") + elif col == "Encodes for (URI)": + valid_uri = link_validation(username, password, url, val) + + if not valid_uri: + print(f"URI '{val}' is invalid. Skipping addition for {col}.") + print("Terminating") + sys.exit(1) + # return + module_name_suf = val.split("/")[-2] + protein_comp_uri = val + break + # create a new module definitions module_name = f"{module_name_pref}_{module_name_suf}" module_def = sbol2.ModuleDefinition(module_name) - + #create a fc for the protein if module_name_suf not in [fc.displayId for fc in module_def.functionalComponents]: protein_fc = module_def.functionalComponents.create(module_name_suf) @@ -103,12 +224,14 @@ def encodesFor(rowobj): dna_fc = module_def.functionalComponents.get(module_name_pref) - + # participation_name = f'{module_name_pref}_template' participation = sbol2.Participation(uri = f'{module_name_pref}_template') participation.participant = dna_fc participation.uri = f'{module_name_pref}_template' participation.roles = [sbol2.SBOL_TEMPLATE] + + # participation_name2 = f'{module_name_suf}_product' participation2 = sbol2.Participation(uri= f'{module_name_suf}_product') participation2.participant = protein_fc participation2.uri = f'{module_name_suf}_product' @@ -125,72 +248,112 @@ def encodesFor(rowobj): rowobj.doc.addModuleDefinition(module_def) - def repressor(rowobj): - module_name_pref = rowobj.obj_uri.split("/")[-1] - if not any(isinstance(val, (list, str)) and val for val in rowobj.col_cell_dict.values()): - raise ValueError("No 'Repressors' value found in rowobj.") - - module_name_suf = None - for col in rowobj.col_cell_dict.keys(): - val = rowobj.col_cell_dict[col] - - protein_comp_uris = val - - for protein_comp_uri in protein_comp_uris: - module_name_suf = protein_comp_uri.split("/")[-1] - - module_name = f"{module_name_pref}_{module_name_suf}" - module_def = sbol2.ModuleDefinition(module_name) - - if module_name_suf not in [fc.displayId for fc in module_def.functionalComponents]: - protein_fc = module_def.functionalComponents.create(module_name_suf) - protein_fc.definition = protein_comp_uri - else: - protein_fc = module_def.functionalComponents.get(module_name_suf) - - - if module_name_pref not in [fc.displayId for fc in module_def.functionalComponents]: - dna_fc = module_def.functionalComponents.create(module_name_pref) - dna_fc.definition = rowobj.obj_uri - else: - dna_fc = module_def.functionalComponents.get(module_name_pref) - - - participation = sbol2.Participation(uri = f'{module_name_pref}_inhibited') - participation.participant = dna_fc - participation.uri = f'{module_name_pref}_inhibited' - participation.roles = [sbol2.SBO_INHIBITED] - - - participation2 = sbol2.Participation(uri= f'{module_name_suf}_inhibition') - participation2.participant = protein_fc - participation2.uri = f'{module_name_suf}_inhibitor' - participation2.roles = [sbol2.SBO_INHIBITOR] - - interaction_name = f'{module_name_suf}_repression' - interaction_type = sbol2.SBO_INHIBITION - interaction = sbol2.Interaction(interaction_name, interaction_type) - interaction.participations.add(participation) - interaction.participations.add(participation2) + module_name_pref = rowobj.obj_uri.split("/")[-1] + # print(rowobj.col_cell_dict) + module_name_suf = None + for col in rowobj.col_cell_dict.keys(): + val = rowobj.col_cell_dict[col] + username = os.getenv("SBOL_USERNAME") + password = os.getenv("SBOL_PASSWORD") + url = os.getenv("SBOL_URL") + # print(username, password, url) + if col == "Repressors (URI)" and isinstance(val, str): + protein_comp_uris = val.split(",") + # print("Protein comp uris: ", protein_comp_uris) + + for uri in protein_comp_uris: + valid_uri = link_validation(username, password, url, uri) + if not valid_uri: + print(f"URI '{val}' is invalid. Skipping addition for {col}.") + print("Terminating") + sys.exit(1) + continue + else: + protein_comp_uris = [val] if isinstance(val, str) else val + + for protein_comp_uri in protein_comp_uris: + if col == "Repressors": + module_name_suf = protein_comp_uri.split("/")[-1] + + elif col == "Repressors (URI)": + module_name_suf = protein_comp_uri.split("/")[-2] + + module_name = f"{module_name_pref}_{module_name_suf}" + module_def = sbol2.ModuleDefinition(module_name) + + if module_name_suf not in [fc.displayId for fc in module_def.functionalComponents]: + protein_fc = module_def.functionalComponents.create(module_name_suf) + protein_fc.definition = protein_comp_uri + else: + protein_fc = module_def.functionalComponents.get(module_name_suf) + + # create a dna functional component + if module_name_pref not in [fc.displayId for fc in module_def.functionalComponents]: + dna_fc = module_def.functionalComponents.create(module_name_pref) + dna_fc.definition = rowobj.obj_uri + else: + dna_fc = module_def.functionalComponents.get(module_name_pref) + + # participation_name = f'{module_name_pref}_template' + participation = sbol2.Participation(uri = f'{module_name_pref}_inhibited') + participation.participant = dna_fc + participation.uri = f'{module_name_pref}_inhibited' + participation.roles = [sbol2.SBO_INHIBITED] + + + # participation_name2 = f'{module_name_suf}_product' + participation2 = sbol2.Participation(uri= f'{module_name_suf}_inhibition') + participation2.participant = protein_fc + participation2.uri = f'{module_name_suf}_inhibitor' + participation2.roles = [sbol2.SBO_INHIBITOR] + + interaction_name = f'{module_name_suf}_repression' + interaction_type = sbol2.SBO_INHIBITION + interaction = sbol2.Interaction(interaction_name, interaction_type) + interaction.participations.add(participation) + interaction.participations.add(participation2) + + module_def.interactions.add(interaction) + rowobj.doc.addModuleDefinition(module_def) - module_def.interactions.add(interaction) - rowobj.doc.addModuleDefinition(module_def) def activator(rowobj): module_name_pref = rowobj.obj_uri.split("/")[-1] - if not any(isinstance(val, (list, str)) and val for val in rowobj.col_cell_dict.values()): - raise ValueError("No 'Activators' value found in rowobj.") - module_name_suf = None + # print(rowobj.col_cell_dict) for col in rowobj.col_cell_dict.keys(): val = rowobj.col_cell_dict[col] + username = os.getenv("SBOL_USERNAME") + password = os.getenv("SBOL_PASSWORD") + url = os.getenv("SBOL_URL") - protein_comp_uris = val + if col == "Activators (URI)" and isinstance(val, str): + # print("Protein comp uris: ", val) + protein_comp_uris = val.split(",") + + for uri in protein_comp_uris: + # print(uri) + valid_uri = link_validation(username, password, url, uri) + if not valid_uri: + print(f"URI in '{uri}' is invalid. Skipping addition for {col}.") + print("Terminating") + sys.exit(1) + continue + else: + protein_comp_uris = [val] if isinstance(val, str) else val + # print("Val: ", val) for protein_comp_uri in protein_comp_uris: - module_name_suf = protein_comp_uri.split("/")[-1] + + if col == "Activators": + # print("Protein comp uri: ", protein_comp_uri) + module_name_suf = protein_comp_uri.split("/")[-1] + + elif col == "Activators (URI)": + # print("Protein comp uri: ", protein_comp_uri) + module_name_suf = protein_comp_uri.split("/")[-2] module_name = f"{module_name_pref}_{module_name_suf}" module_def = sbol2.ModuleDefinition(module_name) @@ -227,12 +390,7 @@ def activator(rowobj): interaction.participations.add(participation2) module_def.interactions.add(interaction) - rowobj.doc.addModuleDefinition(module_def) - - - - - + rowobj.doc.addModuleDefinition(module_def) def complexComponent(rowobj): @@ -241,22 +399,61 @@ def complexComponent(rowobj): protein_comp_uri = None molecule_name = None molecule_comp_uri = None + components = [] + # print(rowobj.col_cell_dict) + username = os.getenv("SBOL_USERNAME") + password = os.getenv("SBOL_PASSWORD") + url = os.getenv("SBOL_URL") + # print(rowobj.col_cell_dict) + # if Components column present + for col in rowobj.col_cell_dict.keys(): val = rowobj.col_cell_dict[col] + if col == "Components Ids": + if isinstance(val, list) and len(val) > 0: + module_name_suf = val[0].split("/")[-1] + protein_comp_uri = val[0] + for i in val[1:]: + components.append((i.split("/")[-1], i)) + break + elif isinstance(val, str): + module_name_suf = val.split("/")[-1] + protein_comp_uri = val + break + elif col == "Components (URI)": + if isinstance(val, list) and len(val) > 0: + if isinstance(val, list) and len(val) > 0: + invalid_uris = [] + for uri in val: + valid_uri = link_validation(username, password, url, uri) + if not valid_uri: + print(f"URI '{uri}' is invalid. Skipping addition for {col}.") + invalid_uris.append(uri) + + if invalid_uris: + print(f"Invalid URIs detected: {invalid_uris}. Skipping entire complex formation.") + print("Terminating") + sys.exit(1) + + return + else: + # Process valid URIs + module_name_suf = val[0].split("/")[-2] + protein_comp_uri = val[0] + for i in val[1:]: + components.append((i.split("/")[-2], i)) + + + elif isinstance(val, str): + valid_uri = link_validation(username, password, url, val) + if not valid_uri: + print("URI in '{val}' is invalid. Skipping addition for {col}.") + print("Terminating") + sys.exit(1) + module_name_suf = val.split("/")[-2] + protein_comp_uri = val + break - if isinstance(val, list) and len(val) > 0: - module_name_suf = val[0].split("/")[-1] - protein_comp_uri = val[0] - if len(val) > 1: - molecule_name = val[1].split("/")[-1] - molecule_comp_uri = val[1] - break - elif isinstance(val, str): - module_name_suf = val.split("/")[-1] - protein_comp_uri = val - break - if not module_name_suf: - raise ValueError("No 'Components' value found in rowobj.") module_name = f"{module_name_pref}_complex_formation" # create a new module definition @@ -276,15 +473,16 @@ def complexComponent(rowobj): else: prod_fc = module_def.functionalComponents.get(module_name_pref) - # if exists, create molecule functional component - if molecule_name: - if molecule_name not in [fc.displayId for fc in module_def.functionalComponents]: - molecule_fc = module_def.functionalComponents.create(molecule_name) - molecule_fc.definition = molecule_comp_uri + # if exists, create functional components + components_FC = [] + for name, uri in components: + if name not in [fc.displayId for fc in module_def.functionalComponents]: + elem_fc = module_def.functionalComponents.create(name) + elem_fc.definition = uri + components_FC.append(elem_fc) else: - molecule_fc = module_def.functionalComponents.get(molecule_name) - - + elem_fc = module_def.functionalComponents.get(name) + components_FC.append(elem_fc) # participation for product participation = sbol2.Participation(uri = f'{module_name_pref}_product') @@ -298,29 +496,30 @@ def complexComponent(rowobj): participation2.uri = f'{module_name_suf}_reactant' participation2.roles = [sbol2.SBO_REACTANT] - #if molecule exists, create participation for molecule - if molecule_name: - participation3 = sbol2.Participation(uri= f'{molecule_name}_reactor') - participation3.participant = molecule_fc - participation3.uri = f'{molecule_name}_reactant' + #create participation for each component + components_participants = [] + for elem_fc in components_FC: + participation3 = sbol2.Participation(uri= f'{elem_fc.displayId}_reactor') + participation3.participant = elem_fc + participation3.uri = f'{elem_fc.displayId}_reactor' participation3.roles = [sbol2.SBO_REACTANT] - - + components_participants.append(participation3) + + # define the interaction interaction_name = f'{module_name_pref}_complex_formation' - interaction_type = sbol2.SBO_NONCOVALENT_BINDING interaction = sbol2.Interaction(interaction_name, interaction_type) interaction.participations.add(participation) interaction.participations.add(participation2) - - if molecule_name: - interaction.participations.add(participation3) + for part in components_participants: + interaction.participations.add(part) module_def.interactions.add(interaction) rowobj.doc.addModuleDefinition(module_def) + def subcomponents(rowobj): sbol2.Config.setOption(sbol2.ConfigOptions.SBOL_TYPED_URIS, True) if 'subcomp' in rowobj.col_cell_dict: @@ -431,14 +630,28 @@ def dataSource(rowobj): logging.warning('Literal data sources are not yet supported.') def sequence(rowobj): + for col in rowobj.col_cell_dict.keys(): + val = rowobj.col_cell_dict[col] + # print(val) + username = os.getenv("SBOL_USERNAME") + password = os.getenv("SBOL_PASSWORD") + url = os.getenv("SBOL_URL") + if isinstance(val, str): # might need to be careful if the object type is sequence! # THIS MIGHT HAVE BUGS IF MULTIPLE SEQUENCES ARE PROVIDED FOR # ONE OBJECT. E.g overwrite in self.obj.sequences = [val] ? if re.fullmatch(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', val): # if a url + # rowobj.obj.sequences = [val] + + valid_uri = link_validation(username, password, url, val) + if not valid_uri: + print("Terminating") + sys.exit(1) + return rowobj.obj.sequences = [val] elif re.match(r'^[a-zA-Z \s*]+$', val): @@ -448,6 +661,13 @@ def sequence(rowobj): val = "".join(val.split()) val = val.replace(u"\ufeff", "").lower() + uri = f'{url}/search/sequence={val}&' + valid_uri = sequence_authentication(username, password, url,uri) + if not valid_uri: + print("Part name: ", rowobj.obj.identity.split('/')[-2]) + # print("Terminating") + # sys.exit(1) + return # create sequence object sequence = sbol2.Sequence(f"{rowobj.obj.displayId}_sequence", elements=val) @@ -469,11 +689,14 @@ def sequence(rowobj): rowobj.obj.sequences = [val] else: raise TypeError(f"A multicolumn value was unexpectedly given in sequence, {rowobj.col_cell_dict}") - + def proteinSequence(rowobj): for col in rowobj.col_cell_dict.keys(): val = rowobj.col_cell_dict[col] + username = os.getenv("SBOL_USERNAME") + password = os.getenv("SBOL_PASSWORD") + url = os.getenv("SBOL_URL") if isinstance(val, str): # might need to be careful if the object type is sequence! # THIS MIGHT HAVE BUGS IF MULTIPLE SEQUENCES ARE PROVIDED FOR @@ -481,6 +704,13 @@ def proteinSequence(rowobj): if re.fullmatch(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', val): # if a url rowobj.obj.sequences = [val] + valid_uri = link_validation(username, password, url, val) + if not valid_uri: + print(f"URI '{val}' is invalid. Skipping addition for {col}.") + print("Terminating") + sys.exit(1) + return + rowobj.obj.sequences = [val] elif re.match(r'^[ACDEFGHIKLMNPQRSTVWY\s*]+$', val): # if a sequence string @@ -490,8 +720,14 @@ def proteinSequence(rowobj): # removes * val = val.replace('*', '') val = val.replace(u"\ufeff", "").upper() - - + uri = f'{url}/search/sequence={val}&' + valid_uri = sequence_authentication(username, password, url,uri) + if not valid_uri: + print("Part name: ", rowobj.obj.identity.split('/')[-2]) + # print("Terminating") + # sys.exit(1) + return + # create sequence object protein_sequence = sbol2.Sequence(f"{rowobj.obj.displayId}_proteinSequence", elements=val, encoding='http://www.chem.qmul.ac.uk/iupac/AminoAcid/') From de7f7636b5c6b3c3a6353829812d354052074869 Mon Sep 17 00:00:00 2001 From: Taisiia Sherstiukova Date: Wed, 22 Jan 2025 15:40:45 -0700 Subject: [PATCH 2/3] changes as of 1/22/2025 --- .DS_Store | Bin 6148 -> 6148 bytes excelutils/.DS_Store | Bin 6148 -> 6148 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/.DS_Store b/.DS_Store index dd80af8b4b49531f7807ad6c70b9a64ba9e256a5..f29492cf8b9d9ddb774fe8406caba1f4826368c6 100644 GIT binary patch delta 128 zcmZoMXffEJ#uWQah=GBDg+Y%YogtH5lW{Sms(LMuE)_nblY(7O-w+=lIJH04if8P5=M^ delta 128 zcmZoMXffEJ#uR(%GXnzy3xgg*IzuKyNp8N2OHxjL5>SleLr0TjUh*+VRQVLV@&y@& s!O8i#1wcIv3_=W(o0)Df?S3~ombsRR;lt*K%xWwX3s^U^bNuB80OPMDcmMzZ diff --git a/excelutils/.DS_Store b/excelutils/.DS_Store index a5e43bc9b05da4e871771eeab4720c8a308cd082..60c3c92a45e3d8c0d52bb6fa39eaa1c203ccf68f 100644 GIT binary patch delta 26 icmZoMXffE3&BSzY&*WUDMT{3V3o?IW+04fAj~@VvMG6T3 delta 26 icmZoMXffE3&BU}YeR3|-BE}7y1)0CGY-Z#5#}5F3010#e From 153b8b384c67b1990819ae8237f259ee8d94e6a5 Mon Sep 17 00:00:00 2001 From: Taisiia Sherstiukova Date: Thu, 23 Jan 2025 11:48:51 -0700 Subject: [PATCH 3/3] partID checker, URIs, sequence duplicates --- .DS_Store | Bin 6148 -> 6148 bytes excelutils/.DS_Store | Bin 6148 -> 6148 bytes excelutils/excel_sbol_utils/.DS_Store | Bin 0 -> 6148 bytes excelutils/excel_sbol_utils/library2.py | 91 +++++++++++++++++++++--- 4 files changed, 80 insertions(+), 11 deletions(-) create mode 100644 excelutils/excel_sbol_utils/.DS_Store diff --git a/.DS_Store b/.DS_Store index f29492cf8b9d9ddb774fe8406caba1f4826368c6..33cc33118a997f1ac0feed270112df21a253afae 100644 GIT binary patch delta 196 zcmZoMXffEJ$`mK)FpGhKfrUYjA)O(Up(Hoo#U&{xKM5$t;Xi5Ky@Z9w98u*{;PS1n z&rFU(lP}0H3{K9^Edc6aV30PL+|1<2CL@0usBZEHCXvban0OG}EM~_00h42yRXBF@ lLQDd3q=XO_APGxMKFiF@#I#`ZLuNIWi3O~i**X650|22>Pjj0WsG+00000 diff --git a/excelutils/.DS_Store b/excelutils/.DS_Store index 60c3c92a45e3d8c0d52bb6fa39eaa1c203ccf68f..b6f68addcdee7f72c938544c8192bdb87261ada5 100644 GIT binary patch delta 325 zcmZoMXfc=|#>B!ku~2NHo+2aH#(>?7ixrre7`Z0rGO0{9V6tLnJh%hMHsH9XcKJ@i z!efp=j@snYOk8Z|uN;^aw{Y@pCS!Ic1`v>(T*#y#&!ESU%8(9(x(t~Nc?@X``6Oa|^%*F)$0ljMKtYnw#(9l9ZF51XRNDHnrm3tp&#%@hVTj vsaz4$^nwgzha_w)oWZ!6or9kP7)YB1nZGkn<`;3~U}RtbdwFw&$QotB)qu~2NHo+2ab#(>?7jI5J$SyUz)uvjrO9NYtB8*t1w)jF7ye9RHZ zQJZ|4g^LX$F!?r%F%!du&4L_aEE5|ZZf57;=KvZ8xN diff --git a/excelutils/excel_sbol_utils/.DS_Store b/excelutils/excel_sbol_utils/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e50e3379c180be3dbf7ce8b7e48e7482e451ea13 GIT binary patch literal 6148 zcmeHKF-`+P474G|Noi72?iccdCAz#IbvVccks{HZkSOT(1$hJfgPI@k0U91agQytW zn?S^o1_?#TmUhSMwfB5;y7ev*@#tngBpMJ=fhNeJbcmQcr;f6756HSkO&3(tf-b4* zSm+Qwd!`}Oqx@pPZ}eCxd) zpFKU_?elIIU$S8NPA<-XGvEw31J1y&7(mSyDf))qI|I&uGq7bq_J@Eb7&9hA-8#_e z6#yv5Xcg#sMg;~j0At2v2n&QQ6lkHGuNZ9Mu!rmyGbTd|C)Oupo&4m@