From bf92cad05244ab539437fc4eaf5f19715ba02f94 Mon Sep 17 00:00:00 2001 From: ozgury Date: Thu, 7 Nov 2024 15:04:28 +0000 Subject: [PATCH 1/7] initial metabolights integration --- mars-cli/mars_cli.py | 24 ++++++++ mars-cli/mars_lib/authentication.py | 36 ++++++++++++ mars-cli/mars_lib/submit.py | 88 +++++++++++++++++++++++++++-- 3 files changed, 143 insertions(+), 5 deletions(-) diff --git a/mars-cli/mars_cli.py b/mars-cli/mars_cli.py index eb6b0b1..2aa407e 100644 --- a/mars-cli/mars_cli.py +++ b/mars-cli/mars_cli.py @@ -81,6 +81,18 @@ fallback="https://wwwdev.ebi.ac.uk/ena/submit/webin/auth/token", ), }, + "METABOLIGHTS": { + "SERVICE": config.get( + "metabolights", + "development-url", + fallback="https://www-test.ebi.ac.uk/metabolights/mars/ws3/submissions/", + ), + "TOKEN": config.get( + "metabolights", + "development-token-url", + fallback="https://www-test.ebi.ac.uk/metabolights/mars/ws3/auth/token", + ), + }, "BIOSAMPLES": { "SERVICE": config.get( "biosamples", @@ -124,6 +136,18 @@ fallback="https://wwwdev.ebi.ac.uk/ena/dev/submit/webin/auth/token", ), }, + "METABOLIGHTS": { + "SERVICE": config.get( + "metabolights", + "production-url", + fallback="https://www-test.ebi.ac.uk/metabolights/mars/ws3/submissions/", + ), + "TOKEN": config.get( + "metabolights", + "production-token-url", + fallback="https://www-test.ebi.ac.uk/metabolights/mars/ws3/auth/token", + ), + }, "BIOSAMPLES": { "SERVICE": config.get( "biosamples", diff --git a/mars-cli/mars_lib/authentication.py b/mars-cli/mars_lib/authentication.py index 5155873..c50a94e 100644 --- a/mars-cli/mars_lib/authentication.py +++ b/mars-cli/mars_lib/authentication.py @@ -41,3 +41,39 @@ def get_webin_auth_token( raise ValueError(error_message) return token + + +def get_metabolights_auth_token( + credentials_dict: dict[str, str], + headers: dict[str, str] = {"Content-Type": "application/json"}, + auth_url: str = "https://www-test.ebi.ac.uk/metabolights/mars/auth/token", +) -> Optional[str]: + """ + Obtain Webin authentication token. + + Args: + credentials_dict (dict): The password dictionary for authentication. + header (dict): The header information. + auth__url (str): The URL for MetaboLights authentication. + + Returns: + str: The obtained token. + """ + try: + response = requests.post( + auth_url, + headers=headers, + json={"username": credentials_dict["username"], "password": credentials_dict["password"]}, + timeout=5, + ) + response.raise_for_status() + + except Exception as ex: + raise ex + + response_content = response.content.decode("utf-8") + if response and "Jwt" in response.headers and response.headers["Jwt"]: + return response.headers["Jwt"] + else: + error_message = f"ERROR when generating token. See response's content below:\n{response_content}" + raise Exception(error_message) \ No newline at end of file diff --git a/mars-cli/mars_lib/submit.py b/mars-cli/mars_lib/submit.py index 3ee2fa9..cebc85b 100644 --- a/mars-cli/mars_lib/submit.py +++ b/mars-cli/mars_lib/submit.py @@ -1,8 +1,9 @@ from io import TextIOWrapper +import time import requests import json from typing import Any -from mars_lib.authentication import get_webin_auth_token +from mars_lib.authentication import get_metabolights_auth_token, get_webin_auth_token from mars_lib.biosamples_external_references import ( get_header, biosamples_endpoints, @@ -96,10 +97,16 @@ def submission( ) # TODO: Update `isa_json`, based on the receipt returned elif TargetRepository.METABOLIGHTS in target_repositories: - # Submit to MetaboLights - # TODO: Filter out other assays + metabolights_result = upload_to_metabolights( + file_paths=data_file_paths, + file_transfer=file_transfer, + isa_json=isa_json, + metabolights_credentials=user_credentials, + metabolights_url=urls["METABOLIGHTS"]["SUBMISSION"], + metabolights_token_url=urls["METABOLIGHTS"]["TOKEN"], + ) print_and_log( - f"Submission to {TargetRepository.METABOLIGHTS} was successful", + f"Submission to {TargetRepository.METABOLIGHTS} was successful. Result:\n{metabolights_result}", level="info", ) # TODO: Update `isa_json`, based on the receipt returned @@ -107,7 +114,7 @@ def submission( # Submit to EVA # TODO: Filter out other assays print_and_log( - f"Submission to {TargetRepository.EVA} was successful", level="info" + f"Submission to {TargetRepository.EVA} was successful.", level="info" ) # TODO: Update `isa_json`, based on the receipt returned else: @@ -147,6 +154,77 @@ def submit_to_biosamples( return result +def upload_to_metabolights( + file_paths: list[str], + isa_json: IsaJson, + metabolights_credentials: dict[str, str], + metabolights_url: str, + metabolights_token_url: str, + file_transfer: str = "ftp", +): + data_upload_protocol = "ftp" if not file_transfer or file_transfer.lower() == "ftp" else "" + + if not data_upload_protocol == "ftp": + raise ValueError(f"Data upload protocol {data_upload_protocol} is not supported") + + token = get_metabolights_auth_token( + metabolights_credentials, auth_url=metabolights_token_url + ) + headers = {"accept": "*/*", "Content-Type": "application/json", 'Authorization': f'Bearer {token}',} + result = requests.post( + metabolights_url, + headers=headers, + json=isa_json.model_dump(by_alias=True, exclude_none=True), + ) + result.raise_for_status() + validation_url = find_value_in_info_section("validation-url", result["info"]) + validation_status_url = find_value_in_info_section("validation-status-url", result["info"]) + ftp_credentials_url = find_value_in_info_section("ftp-credentials-url", result["info"]) + + if file_transfer == "ftp": + ftp_credentials_url = find_value_in_info_section("validation-url", result["info"]) + ftp_credentials_response = requests.get(ftp_credentials_url, headers=headers) + ftp_credentials_response.raise_for_status() + ftp_credentials = ftp_credentials_response.json() + ftp_base_path = ftp_credentials["ftpPath"] + uploader = FTPUploader( + ftp_credentials["ftpHost"], + ftp_credentials["ftpUsername"], + ftp_credentials["ftpPassword"], + ) + + uploader.upload(file_paths, target_location=ftp_base_path) + + validation_response = requests.get(validation_url, headers=headers) + validation_response.raise_for_status() + pool_time_in_seconds = 10 + max_pool_count = 100 + validation_status_response = None + for _ in range(max_pool_count): + validation_status_response = requests.get(validation_status_url, headers=headers) + validation_status_response.raise_for_status() + validation_status = validation_status_response.json() + validation_time = find_value_in_info_section("validation-time", validation_status["info"], fail_gracefully=True) + if validation_time: + break + time.sleep(pool_time_in_seconds) + else: + raise ValueError(f"Validation failed after {max_pool_count} iterations") + + if validation_status_response: + return validation_status_response.text + + return None + +def find_value_in_info_section(key: str, info_section: list[Any], fail_gracefully: bool = False) -> Any: + for info in info_section: + if info["name"] == key: + return info["message"] + if fail_gracefully: + return None + raise ValueError(f"Name {key} not found in info section") + + def submit_to_ena( isa_json: IsaJson, user_credentials: dict[str, str], submission_url: str From 85e9bee280441c641a56db46662fe0649484f12f Mon Sep 17 00:00:00 2001 From: ozgury Date: Thu, 7 Nov 2024 20:10:24 +0000 Subject: [PATCH 2/7] initial metabolights integration updates --- mars-cli/mars_cli.py | 14 +++++- mars-cli/mars_lib/authentication.py | 16 ++++--- mars-cli/mars_lib/submit.py | 70 +++++++++++++++++++---------- 3 files changed, 68 insertions(+), 32 deletions(-) diff --git a/mars-cli/mars_cli.py b/mars-cli/mars_cli.py index 83ea9d5..8c56906 100644 --- a/mars-cli/mars_cli.py +++ b/mars-cli/mars_cli.py @@ -87,6 +87,11 @@ "development-url", fallback="https://www-test.ebi.ac.uk/metabolights/mars/ws3/submissions/", ), + "SUBMISSION": config.get( + "metabolights", + "development-submission-url", + fallback="https://www-test.ebi.ac.uk/metabolights/mars/ws3/submissions/", + ), "TOKEN": config.get( "metabolights", "development-token-url", @@ -142,6 +147,11 @@ "production-url", fallback="https://www-test.ebi.ac.uk/metabolights/mars/ws3/submissions/", ), + "SUBMISSION": config.get( + "metabolights", + "production-submission-url", + fallback="https://www-test.ebi.ac.uk/metabolights/mars/ws3/submissions/", + ), "TOKEN": config.get( "metabolights", "production-token-url", @@ -263,7 +273,7 @@ def submit( target_repositories.append(TargetRepository.METABOLIGHTS) print_and_log( - f"Staring submission of the ISA JSON to the target repositories: {', '.join(target_repositories)}." + f"Starting submission of the ISA JSON to the target repositories: {', '.join(target_repositories)}." ) urls_dict = ctx.obj["FILTERED_URLS"] @@ -312,7 +322,7 @@ def health_check(ctx): print_and_log("Checking the health of the target repositories.") filtered_urls = ctx.obj["FILTERED_URLS"] - for repo in ["WEBIN", "ENA", "BIOSAMPLES"]: + for repo in ["WEBIN", "ENA", "BIOSAMPLES", "METABOLIGHTS"]: repo_url = filtered_urls[repo]["SERVICE"] try: health_response = requests.get(repo_url) diff --git a/mars-cli/mars_lib/authentication.py b/mars-cli/mars_lib/authentication.py index c50a94e..bf8fe8e 100644 --- a/mars-cli/mars_lib/authentication.py +++ b/mars-cli/mars_lib/authentication.py @@ -45,8 +45,8 @@ def get_webin_auth_token( def get_metabolights_auth_token( credentials_dict: dict[str, str], - headers: dict[str, str] = {"Content-Type": "application/json"}, - auth_url: str = "https://www-test.ebi.ac.uk/metabolights/mars/auth/token", + headers: dict[str, str] = {"Content-Type": "application/x-www-form-urlencoded"}, + auth_url: str = "https://www-test.ebi.ac.uk/metabolights/mars/ws3/auth/token", ) -> Optional[str]: """ Obtain Webin authentication token. @@ -59,21 +59,23 @@ def get_metabolights_auth_token( Returns: str: The obtained token. """ + headers = {"Content-Type": "application/x-www-form-urlencoded", "Accept": "application/json"} + form_data = f'grant_type=password&username={credentials_dict["username"]}&password={credentials_dict["password"]}' try: response = requests.post( auth_url, headers=headers, - json={"username": credentials_dict["username"], "password": credentials_dict["password"]}, - timeout=5, + data=form_data, + timeout=20, ) response.raise_for_status() except Exception as ex: raise ex - response_content = response.content.decode("utf-8") - if response and "Jwt" in response.headers and response.headers["Jwt"]: - return response.headers["Jwt"] + response_content = response.json() + if response and "access_token" in response_content and response_content["access_token"]: + return response_content["access_token"] else: error_message = f"ERROR when generating token. See response's content below:\n{response_content}" raise Exception(error_message) \ No newline at end of file diff --git a/mars-cli/mars_lib/submit.py b/mars-cli/mars_lib/submit.py index c95dcc4..80e94e8 100644 --- a/mars-cli/mars_lib/submit.py +++ b/mars-cli/mars_lib/submit.py @@ -1,3 +1,4 @@ +import io import os from datetime import datetime from io import TextIOWrapper @@ -19,7 +20,7 @@ reduce_isa_json_for_target_repo, update_isa_json, ) -from mars_lib.models.isa_json import IsaJson +from mars_lib.models.isa_json import Comment, IsaJson from mars_lib.models.repository_response import RepositoryResponse from mars_lib.target_repo import TargetRepository from mars_lib.logging import print_and_log @@ -145,13 +146,19 @@ def submission( metabolights_url=urls["METABOLIGHTS"]["SUBMISSION"], metabolights_token_url=urls["METABOLIGHTS"]["TOKEN"], ) - # TODO: Filter out other assays + metabolights_receipt_obj = metabolights_result.json() print_and_log( - f"Submission to {TargetRepository.METABOLIGHTS} was successful. Result:\n{metabolights_result.json()}", + f"Submission to {TargetRepository.METABOLIGHTS} was successful. Result:\n{metabolights_receipt_obj}", level="info", ) - metabolights_receipt = RepositoryResponse.from_json(str(metabolights_result.content)) - isa_json = update_isa_json(isa_json, metabolights_receipt) + metabolights_receipt = RepositoryResponse.model_validate(metabolights_receipt_obj) + #TODO: MetaboLights creates accession number with errors. Errors are not handled. + isa_json.investigation.studies[0].comments.append( + Comment( + name="metabolights_accession", + value=metabolights_receipt.accessions[0].value + ) + ) if DEBUG: save_step_to_file(time_stamp, "3_after_metabolights", isa_json) @@ -217,43 +224,60 @@ def upload_to_metabolights( token = get_metabolights_auth_token( metabolights_credentials, auth_url=metabolights_token_url ) - headers = {"accept": "*/*", "Content-Type": "application/json", 'Authorization': f'Bearer {token}',} - result = requests.post( - metabolights_url, - headers=headers, - json=isa_json.model_dump(by_alias=True, exclude_none=True), - ) - result.raise_for_status() + headers = {"accept": "application/json", 'Authorization': f'Bearer {token}',} + isa_json_str = isa_json.investigation.model_dump_json(by_alias=True, exclude_none=True) + json_file = io.StringIO(isa_json_str) + + files = { + 'isa_json_file': ('isa_json.json', json_file) + } + result = None + try: + submission_response = requests.post( + metabolights_url, + headers=headers, + files=files, + timeout=120, + ) + submission_response.raise_for_status() + result = submission_response.json() + except Exception as exc: + raise exc + validation_url = find_value_in_info_section("validation-url", result["info"]) validation_status_url = find_value_in_info_section("validation-status-url", result["info"]) ftp_credentials_url = find_value_in_info_section("ftp-credentials-url", result["info"]) if file_transfer == "ftp": - ftp_credentials_url = find_value_in_info_section("validation-url", result["info"]) ftp_credentials_response = requests.get(ftp_credentials_url, headers=headers) ftp_credentials_response.raise_for_status() ftp_credentials = ftp_credentials_response.json() ftp_base_path = ftp_credentials["ftpPath"] uploader = FTPUploader( ftp_credentials["ftpHost"], - ftp_credentials["ftpUsername"], + ftp_credentials["ftpUser"], ftp_credentials["ftpPassword"], ) - - uploader.upload(file_paths, target_location=ftp_base_path) + # TODO: Update after the uploader is implemented/tested + # uploader.upload(file_paths, target_location=ftp_base_path) - validation_response = requests.get(validation_url, headers=headers) + validation_response = requests.post(validation_url, headers=headers) validation_response.raise_for_status() pool_time_in_seconds = 10 max_pool_count = 100 validation_status_response = None for _ in range(max_pool_count): - validation_status_response = requests.get(validation_status_url, headers=headers) - validation_status_response.raise_for_status() - validation_status = validation_status_response.json() - validation_time = find_value_in_info_section("validation-time", validation_status["info"], fail_gracefully=True) - if validation_time: - break + timeout = False + try: + validation_status_response = requests.get(validation_status_url, headers=headers, timeout=30) + validation_status_response.raise_for_status() + except requests.exceptions.Timeout: + timeout = True + if not timeout: + validation_status = validation_status_response.json() + validation_time = find_value_in_info_section("validation-time", validation_status["info"], fail_gracefully=True) + if validation_time: + break time.sleep(pool_time_in_seconds) else: raise ValueError(f"Validation failed after {max_pool_count} iterations") From adbda44a6eac63f9673a0e72ad52d4db23efe81d Mon Sep 17 00:00:00 2001 From: Kevin De Pelseneer Date: Thu, 7 Nov 2024 21:45:35 +0100 Subject: [PATCH 3/7] Formatting / linting --- mars-cli/mars_lib/authentication.py | 15 +++++-- mars-cli/mars_lib/submit.py | 70 ++++++++++++++++++----------- 2 files changed, 56 insertions(+), 29 deletions(-) diff --git a/mars-cli/mars_lib/authentication.py b/mars-cli/mars_lib/authentication.py index bf8fe8e..eaf0bec 100644 --- a/mars-cli/mars_lib/authentication.py +++ b/mars-cli/mars_lib/authentication.py @@ -59,7 +59,10 @@ def get_metabolights_auth_token( Returns: str: The obtained token. """ - headers = {"Content-Type": "application/x-www-form-urlencoded", "Accept": "application/json"} + headers = { + "Content-Type": "application/x-www-form-urlencoded", + "Accept": "application/json", + } form_data = f'grant_type=password&username={credentials_dict["username"]}&password={credentials_dict["password"]}' try: response = requests.post( @@ -72,10 +75,14 @@ def get_metabolights_auth_token( except Exception as ex: raise ex - + response_content = response.json() - if response and "access_token" in response_content and response_content["access_token"]: + if ( + response + and "access_token" in response_content + and response_content["access_token"] + ): return response_content["access_token"] else: error_message = f"ERROR when generating token. See response's content below:\n{response_content}" - raise Exception(error_message) \ No newline at end of file + raise Exception(error_message) diff --git a/mars-cli/mars_lib/submit.py b/mars-cli/mars_lib/submit.py index 80e94e8..12b7516 100644 --- a/mars-cli/mars_lib/submit.py +++ b/mars-cli/mars_lib/submit.py @@ -151,12 +151,14 @@ def submission( f"Submission to {TargetRepository.METABOLIGHTS} was successful. Result:\n{metabolights_receipt_obj}", level="info", ) - metabolights_receipt = RepositoryResponse.model_validate(metabolights_receipt_obj) - #TODO: MetaboLights creates accession number with errors. Errors are not handled. + metabolights_receipt = RepositoryResponse.model_validate( + metabolights_receipt_obj + ) + # TODO: MetaboLights creates accession number with errors. Errors are not handled. isa_json.investigation.studies[0].comments.append( Comment( name="metabolights_accession", - value=metabolights_receipt.accessions[0].value + value=metabolights_receipt.accessions[0].value, ) ) if DEBUG: @@ -208,6 +210,7 @@ def submit_to_biosamples( return result + def upload_to_metabolights( file_paths: list[str], isa_json: IsaJson, @@ -216,21 +219,28 @@ def upload_to_metabolights( metabolights_token_url: str, file_transfer: str = "ftp", ): - data_upload_protocol = "ftp" if not file_transfer or file_transfer.lower() == "ftp" else "" - + data_upload_protocol = ( + "ftp" if not file_transfer or file_transfer.lower() == "ftp" else "" + ) + if not data_upload_protocol == "ftp": - raise ValueError(f"Data upload protocol {data_upload_protocol} is not supported") - + raise ValueError( + f"Data upload protocol {data_upload_protocol} is not supported" + ) + token = get_metabolights_auth_token( - metabolights_credentials, auth_url=metabolights_token_url + metabolights_credentials, auth_url=metabolights_token_url + ) + headers = { + "accept": "application/json", + "Authorization": f"Bearer {token}", + } + isa_json_str = isa_json.investigation.model_dump_json( + by_alias=True, exclude_none=True ) - headers = {"accept": "application/json", 'Authorization': f'Bearer {token}',} - isa_json_str = isa_json.investigation.model_dump_json(by_alias=True, exclude_none=True) json_file = io.StringIO(isa_json_str) - files = { - 'isa_json_file': ('isa_json.json', json_file) - } + files = {"isa_json_file": ("isa_json.json", json_file)} result = None try: submission_response = requests.post( @@ -243,11 +253,15 @@ def upload_to_metabolights( result = submission_response.json() except Exception as exc: raise exc - + validation_url = find_value_in_info_section("validation-url", result["info"]) - validation_status_url = find_value_in_info_section("validation-status-url", result["info"]) - ftp_credentials_url = find_value_in_info_section("ftp-credentials-url", result["info"]) - + validation_status_url = find_value_in_info_section( + "validation-status-url", result["info"] + ) + ftp_credentials_url = find_value_in_info_section( + "ftp-credentials-url", result["info"] + ) + if file_transfer == "ftp": ftp_credentials_response = requests.get(ftp_credentials_url, headers=headers) ftp_credentials_response.raise_for_status() @@ -260,7 +274,7 @@ def upload_to_metabolights( ) # TODO: Update after the uploader is implemented/tested # uploader.upload(file_paths, target_location=ftp_base_path) - + validation_response = requests.post(validation_url, headers=headers) validation_response.raise_for_status() pool_time_in_seconds = 10 @@ -269,32 +283,38 @@ def upload_to_metabolights( for _ in range(max_pool_count): timeout = False try: - validation_status_response = requests.get(validation_status_url, headers=headers, timeout=30) + validation_status_response = requests.get( + validation_status_url, headers=headers, timeout=30 + ) validation_status_response.raise_for_status() except requests.exceptions.Timeout: timeout = True if not timeout: validation_status = validation_status_response.json() - validation_time = find_value_in_info_section("validation-time", validation_status["info"], fail_gracefully=True) + validation_time = find_value_in_info_section( + "validation-time", validation_status["info"], fail_gracefully=True + ) if validation_time: break time.sleep(pool_time_in_seconds) else: raise ValueError(f"Validation failed after {max_pool_count} iterations") - + if validation_status_response: return validation_status_response - - raise ValueError(f"Submission failed for MetaboLights") -def find_value_in_info_section(key: str, info_section: list[Any], fail_gracefully: bool = False) -> Any: + raise ValueError("Submission failed for MetaboLights") + + +def find_value_in_info_section( + key: str, info_section: list[Any], fail_gracefully: bool = False +) -> Any: for info in info_section: if info["name"] == key: return info["message"] if fail_gracefully: return None raise ValueError(f"Name {key} not found in info section") - def submit_to_ena( From 32830dfa66f6f2ebd80ec2696248faf5165d1139 Mon Sep 17 00:00:00 2001 From: Kevin De Pelseneer Date: Thu, 7 Nov 2024 21:45:49 +0100 Subject: [PATCH 4/7] Add guard clause --- mars-cli/mars_lib/submit.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mars-cli/mars_lib/submit.py b/mars-cli/mars_lib/submit.py index 12b7516..5a79cbc 100644 --- a/mars-cli/mars_lib/submit.py +++ b/mars-cli/mars_lib/submit.py @@ -290,6 +290,8 @@ def upload_to_metabolights( except requests.exceptions.Timeout: timeout = True if not timeout: + if validation_status_response is None: + raise ValueError("Validation status response is None") validation_status = validation_status_response.json() validation_time = find_value_in_info_section( "validation-time", validation_status["info"], fail_gracefully=True From ab6c1ed5f6a5bd5468199aa11ae681a44203a8d1 Mon Sep 17 00:00:00 2001 From: Kevin De Pelseneer Date: Thu, 7 Nov 2024 21:49:21 +0100 Subject: [PATCH 5/7] Keep linter quiet --- mars-cli/mars_lib/submit.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mars-cli/mars_lib/submit.py b/mars-cli/mars_lib/submit.py index 5a79cbc..ac34de5 100644 --- a/mars-cli/mars_lib/submit.py +++ b/mars-cli/mars_lib/submit.py @@ -266,8 +266,8 @@ def upload_to_metabolights( ftp_credentials_response = requests.get(ftp_credentials_url, headers=headers) ftp_credentials_response.raise_for_status() ftp_credentials = ftp_credentials_response.json() - ftp_base_path = ftp_credentials["ftpPath"] - uploader = FTPUploader( + ftp_base_path = ftp_credentials["ftpPath"] # noqa F841 + uploader = FTPUploader( # noqa F841 ftp_credentials["ftpHost"], ftp_credentials["ftpUser"], ftp_credentials["ftpPassword"], From e5173becd7a4b7a438ead957e8d2c71cedfaf6cb Mon Sep 17 00:00:00 2001 From: April Shen Date: Fri, 8 Nov 2024 10:44:53 +0100 Subject: [PATCH 6/7] add metabolights input file --- test-data/metabolights-input-isa.json | 1901 +++++++++++++++++++++++++ 1 file changed, 1901 insertions(+) create mode 100644 test-data/metabolights-input-isa.json diff --git a/test-data/metabolights-input-isa.json b/test-data/metabolights-input-isa.json new file mode 100644 index 0000000..d898928 --- /dev/null +++ b/test-data/metabolights-input-isa.json @@ -0,0 +1,1901 @@ +{ + "identifier": "", + "title": "", + "description": "", + "publicReleaseDate": "", + "submissionDate": "", + "comments": [], + "ontologySourceReferences": [ + { + "name": "CHEBI", + "file": "https://www.example.org/CHEBI", + "version": "1.0", + "description": "Chemical Entity of Biological Interest", + "comments": [] + }, + { + "name": "EFO", + "file": "", + "version": "", + "description": "Experimental Factor Ontology", + "comments": [] + }, + { + "name": "OBI", + "file": "", + "version": "", + "description": "Ontology for Biomedical Investigations", + "comments": [] + }, + { + "name": "PATO", + "file": "", + "version": "", + "description": "Phenotype and Trait Ontology", + "comments": [] + }, + { + "name": "NCBITaxon", + "file": "", + "version": "", + "description": "NCBI Taxonomy", + "comments": [ + { + "name": "onto-test", + "value": "onto-value" + } + ] + }, + { + "name": "MSIO", + "file": "", + "version": "", + "description": "Metabolomics Standards Initiative Ontology", + "comments": [] + }, + { + "name": "UO", + "file": "", + "version": "", + "description": "Unit Ontology", + "comments": [] + } + ], + "people": [], + "publications": [], + "studies": [ + { + "filename": "s_BH2024-study.txt", + "identifier": "BH2024", + "title": "synthetic experiment BH2024", + "description": "this is a test file for the MARS project used at BioHackathon 2024", + "submissionDate": "2021-08-15", + "publicReleaseDate": "2021-08-15", + "publications": [ + { + "authorList": "Min,W. and Everest H", + "doi": "10.1371/journal.pone.0000000", + "pubMedID": "36007233", + "status": { + "@id": "#ontology_annotation/29d43123-2398-4194-a083-738a9e2c5a88", + "annotationValue": "indexed in PubMed", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + }, + "title": "Decyphering new cancer pathways with stable isotope resolved metabolomics in MCF7 cell lines", + "comments": [] + } + ], + "people": [ + { + "address": "Prospect Street, Beijing, People's Republic of China", + "affiliation": "Beijing Institute of Metabolism", + "comments": [ + { + "name": "Study Person REF", + "value": "" + } + ], + "email": "weng.min@bim.edu.cn", + "fax": "", + "firstName": "Weng", + "lastName": "Min", + "midInitials": "", + "phone": "", + "roles": [ + { + "@id": "#ontology_annotation/4001e040-a4df-4cbe-9f13-1b8561fd79e3", + "annotationValue": "principal investigator role", + "termSource": "", + "termAccession": "", + "comments": [] + }, + { + "@id": "#ontology_annotation/10921e28-68d1-46b0-b041-a6d7adfcbd1f", + "annotationValue": "SRA Inform On Status", + "termSource": "", + "termAccession": "", + "comments": [] + }, + { + "@id": "#ontology_annotation/2eb22405-67cf-47ac-aa5e-0258c0842d1b", + "annotationValue": "SRA Inform On Error", + "termSource": "", + "termAccession": "", + "comments": [] + } + ] + }, + { + "address": "CCM, Edinborough, United Kingdom", + "affiliation": "Centre for Cell Metabolism", + "comments": [ + { + "name": "Study Person REF", + "value": "" + } + ], + "email": "", + "fax": "", + "firstName": "Hillary", + "lastName": "Everest", + "midInitials": "", + "phone": "", + "roles": [ + { + "@id": "#ontology_annotation/a6d2d82b-d8b1-42b0-b9d9-d38a1dbf9a4c", + "annotationValue": "principal investigator role", + "termSource": "", + "termAccession": "", + "comments": [] + } + ] + } + ], + "comments": [ + { + "name": "EMBL Broker Name", + "value": "OXFORD" + }, + { + "name": "EMBL Center Name", + "value": "OXFORD" + }, + { + "name": "EMBL Center Project Name", + "value": "OXFORD" + }, + { + "name": "EMBL Lab Name", + "value": "Oxford e-Research Centre" + }, + { + "name": "EMBL Submission Action", + "value": "ADD" + }, + { + "name": "Study Funding Agency", + "value": "" + }, + { + "name": "Study Grant Number", + "value": "" + } + ], + "studyDesignDescriptors": [ + { + "@id": "#ontology_annotation/3daec9fc-107d-4b7d-9110-da0f04224e67", + "annotationValue": "intervention design", + "termSource": "OBI", + "termAccession": "http://purl.obolibrary.org/obo/OBI_0000115", + "comments": [] + }, + { + "@id": "#ontology_annotation/d7d1ef8e-a23d-4dc4-86fb-9119ee28ea2b", + "annotationValue": "stable isotope resolved metabolomics study", + "termSource": "MSIO", + "termAccession": "http://purl.obolibrary.org/obo/MSIO_0000096", + "comments": [] + } + ], + "protocols": [ + { + "@id": "#protocol/26a3818f-b548-46db-8c98-abdf3b85f219", + "name": "cell culture and isotopic labeling", + "description": "SOP for growing MCF7 cells and incubating them with the tracer molecule", + "uri": "", + "version": "", + "comments": [], + "parameters": [ + { + "@id": "#protocol_parameter/f1a27554-b049-4524-94e8-f1342d8ed65c", + "parameterName": { + "@id": "#ontology_annotation/780c8dfd-5d45-4160-84bd-6bfecc4c25b8", + "annotationValue": "tracer molecule", + "termSource": "", + "termAccession": "", + "comments": [] + } + } + ], + "protocolType": { + "@id": "#ontology_annotation/9db93cdb-1786-4fc0-b7cb-4fc152a53d3d", + "annotationValue": "sample collection", + "termSource": "", + "termAccession": "", + "comments": [] + }, + "components": [] + }, + { + "@id": "#protocol/5723fddd-f8ff-4d3b-a960-2dd9a24f1463", + "name": "metabolite extraction", + "description": "SOP for extracting metabolites from harvested cells", + "uri": "", + "version": "", + "comments": [], + "parameters": [ + { + "@id": "#protocol_parameter/a8c14edf-81d9-4253-8dfa-379f80f3832d", + "parameterName": { + "@id": "#ontology_annotation/7d68083e-cac7-4270-a726-fc779699ec7f", + "annotationValue": "Post Extraction", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/0324592c-4f66-4df4-aa6b-50df68692345", + "parameterName": { + "@id": "#ontology_annotation/a6052fbb-24aa-4863-89f7-fe3f81690c3d", + "annotationValue": "Derivatization", + "termSource": "", + "termAccession": "", + "comments": [] + } + } + ], + "protocolType": { + "@id": "#ontology_annotation/de9146c5-7c90-40c9-aa3f-41f8f95c4ba5", + "annotationValue": "Extraction", + "termSource": "", + "termAccession": "", + "comments": [] + }, + "components": [] + }, + { + "@id": "#protocol/b7b502bf-b8b2-4c13-8456-2fc3dee751d4", + "name": "liquid chromatography", + "description": "SOP for Liquid Chromatography", + "uri": "", + "version": "", + "comments": [], + "parameters": [], + "protocolType": { + "@id": "#ontology_annotation/4c3d73cb-e786-4fd6-a82e-4c78b731d18c", + "annotationValue": "liquid chromatography", + "termSource": "", + "termAccession": "", + "comments": [] + }, + "components": [] + }, + { + "@id": "#protocol/f52550a3-644d-4c01-93c1-1624292253d5", + "name": "mass spectrometry", + "description": "SOP for MS data acquisition", + "uri": "", + "version": "", + "comments": [], + "parameters": [ + { + "@id": "#protocol_parameter/41427aee-109f-4229-9363-276f4116fdd0", + "parameterName": { + "@id": "#ontology_annotation/9acb6c33-2e68-4a32-b366-1e15f18e4bac", + "annotationValue": "Chromatography instrument", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/76b16631-851e-4be0-ab3e-7f9e2e64696f", + "parameterName": { + "@id": "#ontology_annotation/41b3311c-0151-417a-8076-56103da6f46a", + "annotationValue": "Column model", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/3717e406-1b82-48ff-a78a-1f6265d96255", + "parameterName": { + "@id": "#ontology_annotation/8b1e896f-e222-42d0-b087-1e5e92d9d521", + "annotationValue": "Guard column", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/35679370-16b4-4f1a-9490-328b7bbdb230", + "parameterName": { + "@id": "#ontology_annotation/ebd94747-be01-4f9e-b217-ffbb769ad1ce", + "annotationValue": "Instrument", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/46b07e07-59d3-4116-a248-b097bfb4a8bc", + "parameterName": { + "@id": "#ontology_annotation/1bdc4dfb-8f46-4ebc-82a1-c0fd02f09b78", + "annotationValue": "Scan polarity", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/983e2739-eedd-4453-939e-325ab700babe", + "parameterName": { + "@id": "#ontology_annotation/e4b22adb-3b8c-459c-9884-ba9b03877ac4", + "annotationValue": "Scan m/z range", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/d97a1e92-41e1-4fbf-89b8-a0c77be5bd98", + "parameterName": { + "@id": "#ontology_annotation/35ff4e78-ac73-456b-8cfd-cf05876e281e", + "annotationValue": "Ion source", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/b16206c7-d751-4e03-925d-49f5e27dc290", + "parameterName": { + "@id": "#ontology_annotation/1bd82262-a901-4e3c-b687-df34501ec7d8", + "annotationValue": "Mass analyzer", + "termSource": "", + "termAccession": "", + "comments": [] + } + } + ], + "protocolType": { + "@id": "#ontology_annotation/90964db0-078c-4492-91fe-ced8a984645d", + "annotationValue": "mass spectrometry", + "termSource": "", + "termAccession": "", + "comments": [] + }, + "components": [] + }, + { + "@id": "#protocol/8cc50264-b744-4898-a8f9-f9b8b13447da", + "name": "1D 13C NMR spectroscopy for isotopomer analysis", + "description": "SOP for 1D 13C NMR data acquisition for isotopomer analysis", + "uri": "", + "version": "", + "comments": [], + "parameters": [ + { + "@id": "#protocol_parameter/313b95be-738c-4b5f-ad61-c26b45ecc5fe", + "parameterName": { + "@id": "#ontology_annotation/8521f562-194b-403d-9a82-fa0684b734f7", + "annotationValue": "magnetic field strength", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/ff1d1d0b-1345-43da-904a-6dde4b83fa21", + "parameterName": { + "@id": "#ontology_annotation/78d2cbe0-cee6-4077-8c1a-916bfb5c2589", + "annotationValue": "nmr tube", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/9e2f8901-442b-4c58-ac56-706882b90e36", + "parameterName": { + "@id": "#ontology_annotation/4a9b7c41-dde9-4205-8351-547a1f6767da", + "annotationValue": "pulse sequence", + "termSource": "", + "termAccession": "", + "comments": [] + } + } + ], + "protocolType": { + "@id": "#ontology_annotation/6477f8c9-dbc8-4602-9b4a-085e627cf0b7", + "annotationValue": "NMR spectroscopy", + "termSource": "", + "termAccession": "", + "comments": [] + }, + "components": [] + }, + { + "@id": "#protocol/51a74b5f-b26e-4321-b410-2b60e8e46b1a", + "name": "1D 13C NMR spectroscopy for metabolite profiling", + "description": "SOP for 1D 13C NMR data acquisition for metabolite profiling", + "uri": "", + "version": "", + "comments": [], + "parameters": [ + { + "@id": "#protocol_parameter/0bd9f0c0-c420-4f43-8cf6-2352d16f8eac", + "parameterName": { + "@id": "#ontology_annotation/da39b84e-7cc1-4bfc-a84c-38cf214b0f7a", + "annotationValue": "magnetic field strength", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/d9d837d4-6345-4d0a-80db-e1bcd6afa0f7", + "parameterName": { + "@id": "#ontology_annotation/45fe6777-0484-49f4-b9b8-549f807f5b9d", + "annotationValue": "nmr tube", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/39659093-6fb1-4c18-81ed-1325f5256591", + "parameterName": { + "@id": "#ontology_annotation/f3b1cd53-3278-4245-be26-32768a165d89", + "annotationValue": "pulse sequence", + "termSource": "", + "termAccession": "", + "comments": [] + } + } + ], + "protocolType": { + "@id": "#ontology_annotation/e654cd21-5aed-4cb1-a0f4-cad28badd7bc", + "annotationValue": "NMR spectroscopy", + "termSource": "", + "termAccession": "", + "comments": [] + }, + "components": [] + }, + { + "@id": "#protocol/1eb9c21e-a726-4d32-847b-251da964f8f8", + "name": "MS metabolite identification", + "description": "SOP for MS signal processing and metabolite and isotopologue identification", + "uri": "", + "version": "", + "comments": [], + "parameters": [ + { + "@id": "#protocol_parameter/b4c43239-b230-4a1e-8e1e-e0f913c8331d", + "parameterName": { + "@id": "#ontology_annotation/87caebac-43c8-4666-9c8d-abb44df9a4ab", + "annotationValue": "ms software", + "termSource": "", + "termAccession": "", + "comments": [] + } + } + ], + "protocolType": { + "@id": "#ontology_annotation/e8da3c51-939a-4d06-adf7-c4610f4ae692", + "annotationValue": "metabolite identification", + "termSource": "", + "termAccession": "", + "comments": [] + }, + "components": [] + }, + { + "@id": "#protocol/edea8ca4-a8a1-4f9b-aa47-e5bf167a4156", + "name": "NMR metabolite identification", + "description": "SOP for NMR signal processing and metabolite and isotopomer identification", + "uri": "https://doi.org/10.1021/acs.analchem.1c01064", + "version": "", + "comments": [], + "parameters": [ + { + "@id": "#protocol_parameter/a106fc47-87a1-4ca2-8b25-09810623a0b2", + "parameterName": { + "@id": "#ontology_annotation/20525d62-a1b7-403c-b99b-f258e93371d7", + "annotationValue": "nmr software", + "termSource": "", + "termAccession": "", + "comments": [] + } + } + ], + "protocolType": { + "@id": "#ontology_annotation/03253d7c-8d68-48aa-9a5d-6ffe19248fa7", + "annotationValue": "data transformation", + "termSource": "", + "termAccession": "", + "comments": [] + }, + "components": [] + }, + { + "@id": "#protocol/a243d1a4-b44f-4c32-84c9-6fd153c6d0f3", + "name": "mRNA extraction", + "description": "procedure for isolating messenger RNA for transcriptomics analysis", + "uri": "", + "version": "", + "comments": [], + "parameters": [], + "protocolType": { + "@id": "#ontology_annotation/0b6f157c-bf69-4dc7-94d2-c32c855a7fae", + "annotationValue": "material separation", + "termSource": "", + "termAccession": "", + "comments": [] + }, + "components": [] + }, + { + "@id": "#protocol/76f3474c-f122-462d-bd5b-abaef371dbd9", + "name": "gDNA extraction", + "description": "procedure for isolating genomic DNA for copy number variation analysis", + "uri": "", + "version": "", + "comments": [], + "parameters": [], + "protocolType": { + "@id": "#ontology_annotation/11da1689-282f-4e58-87de-8a22b83757a8", + "annotationValue": "material separation", + "termSource": "", + "termAccession": "", + "comments": [] + }, + "components": [] + }, + { + "@id": "#protocol/5b1d1061-cdef-43b4-bd7e-037f15aa9bbb", + "name": "gDNA library preparation", + "description": "procedure for isolating genoic DNA for copy number variation analysis", + "uri": "", + "version": "", + "comments": [], + "parameters": [ + { + "@id": "#protocol_parameter/e76b2ce9-6add-40e3-a0a0-4a2ed42e862f", + "parameterName": { + "@id": "#ontology_annotation/6dfd83e6-8614-4e31-8b1d-16ce52bc0f3c", + "annotationValue": "library strategy", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/e0d14afa-4e48-4c92-93e3-3cb385deaf91", + "parameterName": { + "@id": "#ontology_annotation/fb8a5b6a-de04-4875-8a1a-df4f7aba18f3", + "annotationValue": "library selection", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/e3152443-785b-4c67-a149-69f330d8451a", + "parameterName": { + "@id": "#ontology_annotation/4e4bed8f-61d6-47ab-b911-aa675bf4a176", + "annotationValue": "library source", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/fd3859f3-ce24-44b5-a71b-71744748f45c", + "parameterName": { + "@id": "#ontology_annotation/2c930ce5-eea8-4832-8ff3-dd0ec1e9ec7d", + "annotationValue": "library orientation", + "termSource": "", + "termAccession": "", + "comments": [] + } + } + ], + "protocolType": { + "@id": "#ontology_annotation/fe7ad9bf-8bb4-44e2-906b-c0772ef93bb1", + "annotationValue": "library construction", + "termSource": "", + "termAccession": "", + "comments": [] + }, + "components": [] + }, + { + "@id": "#protocol/9166d570-293b-4661-ae55-00c3202812f7", + "name": "mRNA library preparation", + "description": "procedure for isolating genoic DNA for gene expression analysis", + "uri": "", + "version": "", + "comments": [], + "parameters": [ + { + "@id": "#protocol_parameter/7e9fdb24-e763-463f-b0b1-48629caf3f88", + "parameterName": { + "@id": "#ontology_annotation/cd326b0e-1803-46a5-ad51-48c79368b69b", + "annotationValue": "library strategy", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/7ac46ea4-ae00-4b70-8a51-d50571e0ddd2", + "parameterName": { + "@id": "#ontology_annotation/1feace4a-a81a-4c6b-9eca-393736f75ef0", + "annotationValue": "library selection", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/d697269f-c619-4856-80d7-99c97f1c00ab", + "parameterName": { + "@id": "#ontology_annotation/7b47ff99-370a-4091-8158-9e6b92a2b1b4", + "annotationValue": "library source", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/2e9545de-60e8-4441-8284-e756ed946847", + "parameterName": { + "@id": "#ontology_annotation/20cc9d8e-ef63-46a2-ab2b-b88072fc2dd7", + "annotationValue": "library orientation", + "termSource": "", + "termAccession": "", + "comments": [] + } + } + ], + "protocolType": { + "@id": "#ontology_annotation/17a7741f-fbe0-45a1-9ece-f9016899da22", + "annotationValue": "library construction", + "termSource": "", + "termAccession": "", + "comments": [] + }, + "components": [] + }, + { + "@id": "#protocol/a939ed68-51b5-4e7a-8ddb-4e7230ee0e41", + "name": "nucleic acid sequencing", + "description": "SOP for nucleic acid sequencing", + "uri": "", + "version": "", + "comments": [], + "parameters": [ + { + "@id": "#protocol_parameter/9fc60aa3-5dca-47ad-ab73-6516b97904fb", + "parameterName": { + "@id": "#ontology_annotation/19327079-1b1f-4443-90e6-c01aa10addd5", + "annotationValue": "sequencing instrument", + "termSource": "", + "termAccession": "", + "comments": [] + } + } + ], + "protocolType": { + "@id": "#ontology_annotation/c7c3ad59-2955-4248-b55d-fa2d6a34e2a1", + "annotationValue": "nucleic acid sequencing", + "termSource": "", + "termAccession": "", + "comments": [] + }, + "components": [] + }, + { + "@id": "#protocol/6ccf0660-c2f3-4f25-a455-c4a7ec96ad90", + "name": "transcription analysis", + "description": "SOP for transcriptomics analysis", + "uri": "", + "version": "", + "comments": [], + "parameters": [ + { + "@id": "#protocol_parameter/6699d956-e0ce-45a2-8730-0fe467ca9a12", + "parameterName": { + "@id": "#ontology_annotation/be12ee42-4dbe-4d94-92be-94c69eb91540", + "annotationValue": "sequence analysis software", + "termSource": "", + "termAccession": "", + "comments": [] + } + } + ], + "protocolType": { + "@id": "#ontology_annotation/42ef7ef7-6e24-465a-8b6e-4accaf5dfc60", + "annotationValue": "data transformation", + "termSource": "", + "termAccession": "", + "comments": [] + }, + "components": [] + }, + { + "@id": "#protocol/2ac237e8-c37e-4bda-b023-c57f4061cea1", + "name": "CNV analysis", + "description": "SOP for CNV ", + "uri": "", + "version": "", + "comments": [], + "parameters": [ + { + "@id": "#protocol_parameter/ad99d6f3-8cff-4e2a-8029-d7c9b9a20ee0", + "parameterName": { + "@id": "#ontology_annotation/ff373f76-e598-4077-a1d6-b693c98108a4", + "annotationValue": "variant calling software", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#protocol_parameter/d4a96710-7356-450d-8016-9315db085c58", + "parameterName": { + "@id": "#ontology_annotation/6834e4cc-8eb9-453a-b48e-62a5474d36ff", + "annotationValue": "genome assembly accession number", + "termSource": "", + "termAccession": "", + "comments": [] + } + } + ], + "protocolType": { + "@id": "#ontology_annotation/816bd07c-d930-4b14-95ec-c4a5b64e724a", + "annotationValue": "data transformation", + "termSource": "", + "termAccession": "", + "comments": [] + }, + "components": [] + } + ], + "materials": { + "sources": [ + { + "@id": "#source/e038efd9-fbc6-4716-a5e6-c7b255f749bd", + "name": "culture-1", + "characteristics": [ + { + "category": {"@id": "#characteristic_category/642b1d0e-57d3-4c52-ae98-528048036e92"}, + "value": { + "@id": "#ontology_annotation/e67b4803-74b8-4986-a077-82af89180db1", + "annotationValue": "SRC:", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + }, + "comments": [] + }, + { + "category": {"@id": "#characteristic_category/d6cb6699-3ef3-4808-ab4b-3b19c811d8d9"}, + "value": { + "@id": "#ontology_annotation/5708304a-ebd0-433f-8ea5-d851a225cee1", + "annotationValue": "Homo sapiens", + "termSource": "NCBITaxon", + "termAccession": "http://purl.obolibrary.org/obo/NCBITaxon_9606", + "comments": [] + }, + "comments": [] + }, + { + "category": {"@id": "#characteristic_category/70cb49dc-2097-43df-83c0-517e1d93c978"}, + "value": { + "@id": "#ontology_annotation/0e960902-9b23-4fc3-8988-656830acae85", + "annotationValue": "MCF-7", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + }, + "comments": [] + } + ], + "comments": [] + }, + { + "@id": "#source/7f3d0289-70a3-4d1e-8238-d7b7807113b6", + "name": "culture-2", + "characteristics": [ + { + "category": {"@id": "#characteristic_category/642b1d0e-57d3-4c52-ae98-528048036e92"}, + "value": { + "@id": "#ontology_annotation/e67b4803-74b8-4986-a077-82af89180db1", + "annotationValue": "SRC:", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + }, + "comments": [] + }, + { + "category": {"@id": "#characteristic_category/d6cb6699-3ef3-4808-ab4b-3b19c811d8d9"}, + "value": { + "@id": "#ontology_annotation/5708304a-ebd0-433f-8ea5-d851a225cee1", + "annotationValue": "Homo sapiens", + "termSource": "NCBITaxon", + "termAccession": "http://purl.obolibrary.org/obo/NCBITaxon_9606", + "comments": [] + }, + "comments": [] + }, + { + "category": {"@id": "#characteristic_category/70cb49dc-2097-43df-83c0-517e1d93c978"}, + "value": { + "@id": "#ontology_annotation/0e960902-9b23-4fc3-8988-656830acae85", + "annotationValue": "MCF-7", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + }, + "comments": [] + } + ], + "comments": [] + } + ], + "samples": [ + { + "@id": "#sample/903a9d8b-e2f2-4152-81a9-9a70c7e784a9", + "name": "culture-1-sample-0", + "characteristics": [ + { + "category": {"@id": "#characteristic_category/06384b60-0920-41e8-bba6-e9a978795b93"}, + "value": { + "@id": "#ontology_annotation/f241aaaf-199a-44c0-ae2d-9d8e61d0c1e3", + "annotationValue": "SAME:0", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + }, + "comments": [] + } + ], + "factorValues": [ + { + "category": {"@id": "#study_factor/e563297b-790b-4924-8cf9-0d1d93b202cd"}, + "value": { + "@id": "#ontology_annotation/8c74463d-225e-446d-8139-1159086d1bed", + "annotationValue": "dioxygen", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + } + }, + { + "category": {"@id": "#study_factor/496a5730-6d0e-473b-b708-f92811c3cbc8"}, + "value": { + "@id": "#ontology_annotation/b2535315-2d67-4335-83a0-ae583d34dfe7", + "annotationValue": "high", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + } + }, + { + "category": {"@id": "#study_factor/462f5827-7351-4715-abf4-89ca9cb43561"}, + "value": { + "@id": "#ontology_annotation/ca5180f0-2365-4e3d-9093-d0d4e7eae269", + "annotationValue": "hour", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + } + } + ], + "derivesFrom": [], + "comments": [] + }, + { + "@id": "#sample/1ae54051-302e-425c-9b96-b205494b56c5", + "name": "culture-2-sample-0", + "characteristics": [ + { + "category": {"@id": "#characteristic_category/06384b60-0920-41e8-bba6-e9a978795b93"}, + "value": { + "@id": "#ontology_annotation/f241aaaf-199a-44c0-ae2d-9d8e61d0c1e3", + "annotationValue": "SAME:0", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + }, + "comments": [] + } + ], + "factorValues": [ + { + "category": {"@id": "#study_factor/e563297b-790b-4924-8cf9-0d1d93b202cd"}, + "value": { + "@id": "#ontology_annotation/8c74463d-225e-446d-8139-1159086d1bed", + "annotationValue": "dioxygen", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + } + }, + { + "category": {"@id": "#study_factor/496a5730-6d0e-473b-b708-f92811c3cbc8"}, + "value": { + "@id": "#ontology_annotation/8fc47a1c-27e2-46c9-9dbb-3808995a724a", + "annotationValue": "normal", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + } + }, + { + "category": {"@id": "#study_factor/462f5827-7351-4715-abf4-89ca9cb43561"}, + "value": { + "@id": "#ontology_annotation/ca5180f0-2365-4e3d-9093-d0d4e7eae269", + "annotationValue": "hour", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + } + } + ], + "derivesFrom": [], + "comments": [] + }, + { + "@id": "#sample/7972d092-7b45-4fce-83a3-276771479aef", + "name": "culture-1-sample-1", + "characteristics": [ + { + "category": {"@id": "#characteristic_category/f5a45baf-4cf4-4923-82ce-fef0c1f16d98"}, + "value": { + "@id": "#ontology_annotation/ed53f946-01ac-4617-bc51-4070fc974af1", + "annotationValue": "SAME:1", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + }, + "comments": [] + } + ], + "factorValues": [ + { + "category": {"@id": "#study_factor/e563297b-790b-4924-8cf9-0d1d93b202cd"}, + "value": { + "@id": "#ontology_annotation/8c74463d-225e-446d-8139-1159086d1bed", + "annotationValue": "dioxygen", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + } + }, + { + "category": {"@id": "#study_factor/496a5730-6d0e-473b-b708-f92811c3cbc8"}, + "value": { + "@id": "#ontology_annotation/b2535315-2d67-4335-83a0-ae583d34dfe7", + "annotationValue": "high", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + } + }, + { + "category": {"@id": "#study_factor/462f5827-7351-4715-abf4-89ca9cb43561"}, + "value": { + "@id": "#ontology_annotation/ca5180f0-2365-4e3d-9093-d0d4e7eae269", + "annotationValue": "hour", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + } + } + ], + "derivesFrom": [], + "comments": [] + }, + { + "@id": "#sample/e10bb6ab-1a60-4495-b286-91a8e9bfbe4f", + "name": "culture-2-sample-1", + "characteristics": [ + { + "category": {"@id": "#characteristic_category/f5a45baf-4cf4-4923-82ce-fef0c1f16d98"}, + "value": { + "@id": "#ontology_annotation/ed53f946-01ac-4617-bc51-4070fc974af1", + "annotationValue": "SAME:1", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + }, + "comments": [] + } + ], + "factorValues": [ + { + "category": {"@id": "#study_factor/e563297b-790b-4924-8cf9-0d1d93b202cd"}, + "value": { + "@id": "#ontology_annotation/8c74463d-225e-446d-8139-1159086d1bed", + "annotationValue": "dioxygen", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + } + }, + { + "category": {"@id": "#study_factor/496a5730-6d0e-473b-b708-f92811c3cbc8"}, + "value": { + "@id": "#ontology_annotation/8fc47a1c-27e2-46c9-9dbb-3808995a724a", + "annotationValue": "normal", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + } + }, + { + "category": {"@id": "#study_factor/462f5827-7351-4715-abf4-89ca9cb43561"}, + "value": { + "@id": "#ontology_annotation/ca5180f0-2365-4e3d-9093-d0d4e7eae269", + "annotationValue": "hour", + "termSource": "OBI", + "termAccession": "https://purl.org/", + "comments": [] + } + } + ], + "derivesFrom": [], + "comments": [] + } + ], + "otherMaterials": [] + }, + "processSequence": [ + { + "@id": "#process/4de77a19-d25a-4558-9f8b-c84a711e521d", + "name": "sample-collection-process-mbx", + "performer": "", + "date": "", + "executesProtocol": {"@id": "#protocol/26a3818f-b548-46db-8c98-abdf3b85f219"}, + "parameterValues": [ + { + "category": {"@id": "#protocol_parameter/f1a27554-b049-4524-94e8-f1342d8ed65c"}, + "value": { + "@id": "#ontology_annotation/9d4d5e23-a94f-40aa-b428-660e92524a89", + "annotationValue": "80% [1-13C1]-D-glucose + 20% [U-13C6]-D-glucose", + "termSource": "CHEBI", + "termAccession": "https://purl.org/chebi_1212", + "comments": [] + } + } + ], + "inputs": [ + {"@id": "#source/e038efd9-fbc6-4716-a5e6-c7b255f749bd"} + ], + "outputs": [ + {"@id": "#sample/903a9d8b-e2f2-4152-81a9-9a70c7e784a9"}, + {"@id": "#sample/7972d092-7b45-4fce-83a3-276771479aef"} + ], + "comments": [] + }, + { + "@id": "#process/f23ed110-5f3b-4bc8-b5d4-9bd2aca52518", + "name": "sample-collection-process-gtx", + "performer": "", + "date": "", + "executesProtocol": {"@id": "#protocol/26a3818f-b548-46db-8c98-abdf3b85f219"}, + "parameterValues": [ + { + "category": {"@id": "#protocol_parameter/f1a27554-b049-4524-94e8-f1342d8ed65c"}, + "value": { + "@id": "#ontology_annotation/9d4d5e23-a94f-40aa-b428-660e92524a89", + "annotationValue": "80% [1-13C1]-D-glucose + 20% [U-13C6]-D-glucose", + "termSource": "CHEBI", + "termAccession": "https://purl.org/chebi_1212", + "comments": [] + } + } + ], + "inputs": [ + {"@id": "#source/7f3d0289-70a3-4d1e-8238-d7b7807113b6"} + ], + "outputs": [ + {"@id": "#sample/1ae54051-302e-425c-9b96-b205494b56c5"}, + {"@id": "#sample/e10bb6ab-1a60-4495-b286-91a8e9bfbe4f"} + ], + "comments": [] + } + ], + "factors": [ + { + "@id": "#study_factor/e563297b-790b-4924-8cf9-0d1d93b202cd", + "factorName": "compound", + "factorType": { + "@id": "#ontology_annotation/36443ff4-fade-4485-b3df-227e1b083a24", + "annotationValue": "chemical substance", + "termSource": "CHEBI", + "termAccession": "http://purl.obolibrary.org/obo/CHEBI_59999", + "comments": [] + }, + "comments": [] + }, + { + "@id": "#study_factor/496a5730-6d0e-473b-b708-f92811c3cbc8", + "factorName": "dose", + "factorType": { + "@id": "#ontology_annotation/2edf2c88-ee98-4713-8631-de12ec18fae8", + "annotationValue": "dose", + "termSource": "EFO", + "termAccession": "http://www.ebi.ac.uk/efo/EFO_0000428", + "comments": [] + }, + "comments": [] + }, + { + "@id": "#study_factor/462f5827-7351-4715-abf4-89ca9cb43561", + "factorName": "duration", + "factorType": { + "@id": "#ontology_annotation/982fa168-6f36-4414-b772-181517cff80f", + "annotationValue": "time", + "termSource": "PATO", + "termAccession": "http://purl.obolibrary.org/obo/PATO_0000165", + "comments": [] + }, + "comments": [] + } + ], + "characteristicCategories": [ + { + "@id": "#characteristic_category/642b1d0e-57d3-4c52-ae98-528048036e92", + "characteristicType": { + "@id": "#ontology_annotation/642b1d0e-57d3-4c52-ae98-528048036e92", + "annotationValue": "namespace:biosample:src", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#characteristic_category/d6cb6699-3ef3-4808-ab4b-3b19c811d8d9", + "characteristicType": { + "@id": "#ontology_annotation/d6cb6699-3ef3-4808-ab4b-3b19c811d8d9", + "annotationValue": "Organism", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#characteristic_category/70cb49dc-2097-43df-83c0-517e1d93c978", + "characteristicType": { + "@id": "#ontology_annotation/70cb49dc-2097-43df-83c0-517e1d93c978", + "annotationValue": "cell line", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#characteristic_category/06384b60-0920-41e8-bba6-e9a978795b93", + "characteristicType": { + "@id": "#ontology_annotation/06384b60-0920-41e8-bba6-e9a978795b93", + "annotationValue": "namespace:biosample:smp", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "@id": "#characteristic_category/f5a45baf-4cf4-4923-82ce-fef0c1f16d98", + "characteristicType": { + "@id": "#ontology_annotation/f5a45baf-4cf4-4923-82ce-fef0c1f16d98", + "annotationValue": "namespace:biosample:smp", + "termSource": "", + "termAccession": "", + "comments": [] + } + } + ], + "unitCategories": [], + "assays": [ + { + "measurementType": { + "@id": "#ontology_annotation/9c0e3587-10bf-4206-928a-2dc1d4a34f19", + "annotationValue": "metabolite profiling", + "termSource": "MSIO", + "termAccession": "http://purl.obolibrary.org/obo/msio.owl#metabolite_profiling", + "comments": [] + }, + "technologyType": { + "@id": "#ontology_annotation/0b72e94a-75ac-4d53-88ff-ca51607bfb85", + "annotationValue": "mass spectrometry", + "termSource": "MSIO", + "termAccession": "http://purl.obolibrary.org/obo/CHMO_0000470", + "comments": [] + }, + "technologyPlatform": "", + "filename": "a_BH2024-lc-ms-assay.txt", + "characteristicCategories": [], + "unitCategories": [], + "comments": [ + { + "name": "target_repository", + "value": "metabolights" + } + ], + "materials": { + "samples": [ + {"@id": "#sample/903a9d8b-e2f2-4152-81a9-9a70c7e784a9"}, + {"@id": "#sample/1ae54051-302e-425c-9b96-b205494b56c5"}, + {"@id": "#sample/7972d092-7b45-4fce-83a3-276771479aef"}, + {"@id": "#sample/e10bb6ab-1a60-4495-b286-91a8e9bfbe4f"} + ], + "otherMaterials": [ + { + "@id": "#material/4f11f8ee-9710-48ea-8239-fb6a7967410f", + "name": "extract-ms-metpro-0", + "type": "Extract Name", + "characteristics": [], + "comments": [] + }, + { + "@id": "#material/df35feec-d58e-4b26-b5c3-962b4e936753", + "name": "extract-ms-metpro-1", + "type": "Extract Name", + "characteristics": [], + "comments": [] + }, + { + "@id": "#material/c34aa969-eae1-4dd2-80ab-dab88df8e9b9", + "name": "extract-ms-metpro-2", + "type": "Extract Name", + "characteristics": [], + "comments": [] + }, + { + "@id": "#material/2ad608a2-3713-4140-bf82-f7955fbfaaa8", + "name": "extract-ms-metpro-3", + "type": "Extract Name", + "characteristics": [], + "comments": [] + } + ] + }, + "dataFiles": [ + { + "@id": "#data_file/887c4595-01e5-4f65-95c7-59fccef9b2c6", + "name": "metpro-analysis.txt", + "type": "Derived Spectral Data File", + "comments": [] + }, + { + "@id": "#data_file/ccb95813-a566-48f1-bbf2-72ee36f22edc", + "name": "ms-data-metpro--1.mzml", + "type": "Raw Spectral Data File", + "comments": [] + }, + { + "@id": "#data_file/f8ac0067-3f3d-450d-9c00-03a7d71f17fb", + "name": "ms-data-metpro--2.mzml", + "type": "Raw Spectral Data File", + "comments": [] + }, + { + "@id": "#data_file/83a8d59d-40b8-453a-bae1-ce5806441588", + "name": "ms-data-metpro--3.mzml", + "type": "Raw Spectral Data File", + "comments": [] + }, + { + "@id": "#data_file/0b54fbc4-9190-4a6b-a5d8-de9868ede179", + "name": "ms-data-metpro--4.mzml", + "type": "Raw Spectral Data File", + "comments": [] + } + ], + "processSequence": [ + { + "@id": "#process/38cbf56e-d063-424a-a72f-29cd61e74d21", + "name": "extract-process-0", + "performer": "", + "date": "", + "executesProtocol": {"@id": "#protocol/5723fddd-f8ff-4d3b-a960-2dd9a24f1463"}, + "parameterValues": [ + { + "category": {"@id": "#protocol_parameter/0324592c-4f66-4df4-aa6b-50df68692345"}, + "value": { + "@id": "#ontology_annotation/73255b4e-6bd0-4082-abb1-31a5d0d0761c", + "annotationValue": "sylilation", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_1266445", + "comments": [] + } + } + ], + "inputs": [ + {"@id": "#sample/903a9d8b-e2f2-4152-81a9-9a70c7e784a9"} + ], + "outputs": [ + {"@id": "#material/4f11f8ee-9710-48ea-8239-fb6a7967410f"} + ], + "comments": [], + "nextProcess": {"@id": "#process/1cd87619-a018-4660-9731-eae3b3ec8a86"} + }, + { + "@id": "#process/1cd87619-a018-4660-9731-eae3b3ec8a86", + "name": "assay-name-ms-metpro--1", + "performer": "", + "date": "", + "executesProtocol": {"@id": "#protocol/f52550a3-644d-4c01-93c1-1624292253d5"}, + "parameterValues": [ + { + "category": {"@id": "#protocol_parameter/41427aee-109f-4229-9363-276f4116fdd0"}, + "value": { + "@id": "#ontology_annotation/abe29c20-ad67-4f14-b063-ebfd994f8fee", + "annotationValue": "Agilent LC234", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_2245", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/76b16631-851e-4be0-ab3e-7f9e2e64696f"}, + "value": { + "@id": "#ontology_annotation/3386d74f-ca86-48f6-bb59-341a4a067ef7", + "annotationValue": "C18", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_12314245", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/3717e406-1b82-48ff-a78a-1f6265d96255"}, + "value": { + "@id": "#ontology_annotation/91e574e2-737a-483e-bf3e-bcd2b0a43713", + "annotationValue": "X15", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_23145", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/35679370-16b4-4f1a-9490-328b7bbdb230"}, + "value": { + "@id": "#ontology_annotation/e4480644-55b4-472d-8ed7-c388c9db5994", + "annotationValue": "Orbitrap Astral MS", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_232334", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/46b07e07-59d3-4116-a248-b097bfb4a8bc"}, + "value": { + "@id": "#ontology_annotation/ebfa3163-48a7-4e94-b6cf-2869cdb05912", + "annotationValue": "positive mode", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_22224", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/983e2739-eedd-4453-939e-325ab700babe"}, + "value": { + "@id": "#ontology_annotation/fac9c24a-3621-4334-8c3f-cad62a8f4ac5", + "annotationValue": "220-340", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/d97a1e92-41e1-4fbf-89b8-a0c77be5bd98"}, + "value": { + "@id": "#ontology_annotation/a3664b94-49e8-486d-a402-6a0ea06881d3", + "annotationValue": "Chromeleon 7.2 Chromatography Data System", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_123245", + "comments": [] + } + } + ], + "inputs": [ + {"@id": "#material/4f11f8ee-9710-48ea-8239-fb6a7967410f"} + ], + "outputs": [ + {"@id": "#data_file/ccb95813-a566-48f1-bbf2-72ee36f22edc"} + ], + "comments": [], + "previousProcess": {"@id": "#process/38cbf56e-d063-424a-a72f-29cd61e74d21"}, + "nextProcess": {"@id": "#process/bb7fcc6a-4af0-46aa-9cbc-882d3d224612"} + }, + { + "@id": "#process/bb7fcc6a-4af0-46aa-9cbc-882d3d224612", + "name": "MS-metpro-DT-ident", + "performer": "", + "date": "", + "executesProtocol": {"@id": "#protocol/1eb9c21e-a726-4d32-847b-251da964f8f8"}, + "parameterValues": [ + { + "category": {"@id": "#protocol_parameter/b4c43239-b230-4a1e-8e1e-e0f913c8331d"}, + "value": { + "@id": "#ontology_annotation/2fc99447-ae56-4e11-988d-6705da037b81", + "annotationValue": "ThermoFisher", + "termSource": "OBI", + "termAccession": "https://purl.org/OBI_121332", + "comments": [] + } + } + ], + "inputs": [ + {"@id": "#data_file/ccb95813-a566-48f1-bbf2-72ee36f22edc"}, + {"@id": "#data_file/f8ac0067-3f3d-450d-9c00-03a7d71f17fb"}, + {"@id": "#data_file/83a8d59d-40b8-453a-bae1-ce5806441588"}, + {"@id": "#data_file/0b54fbc4-9190-4a6b-a5d8-de9868ede179"} + ], + "outputs": [ + {"@id": "#data_file/887c4595-01e5-4f65-95c7-59fccef9b2c6"} + ], + "comments": [], + "previousProcess": {"@id": "#process/1cd87619-a018-4660-9731-eae3b3ec8a86"} + }, + { + "@id": "#process/4e8a8d6b-31fa-4224-b248-2e7b25813878", + "name": "extract-process-1", + "performer": "", + "date": "", + "executesProtocol": {"@id": "#protocol/5723fddd-f8ff-4d3b-a960-2dd9a24f1463"}, + "parameterValues": [ + { + "category": {"@id": "#protocol_parameter/0324592c-4f66-4df4-aa6b-50df68692345"}, + "value": { + "@id": "#ontology_annotation/3da4cf02-b645-4e82-98c0-842ca4bec5f5", + "annotationValue": "sylilation", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_1266445", + "comments": [] + } + } + ], + "inputs": [ + {"@id": "#sample/1ae54051-302e-425c-9b96-b205494b56c5"} + ], + "outputs": [ + {"@id": "#material/df35feec-d58e-4b26-b5c3-962b4e936753"} + ], + "comments": [], + "nextProcess": {"@id": "#process/f6727039-2313-4817-ac5d-10eb9dc28783"} + }, + { + "@id": "#process/f6727039-2313-4817-ac5d-10eb9dc28783", + "name": "assay-name-ms-metpro--2", + "performer": "", + "date": "", + "executesProtocol": {"@id": "#protocol/f52550a3-644d-4c01-93c1-1624292253d5"}, + "parameterValues": [ + { + "category": {"@id": "#protocol_parameter/41427aee-109f-4229-9363-276f4116fdd0"}, + "value": { + "@id": "#ontology_annotation/0d32aca0-70a3-4f3f-bfe0-0087d381bee5", + "annotationValue": "Agilent LC234", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_2245", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/76b16631-851e-4be0-ab3e-7f9e2e64696f"}, + "value": { + "@id": "#ontology_annotation/eca1e203-02ac-4b5f-a648-61a247fdea32", + "annotationValue": "C18", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_12314245", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/3717e406-1b82-48ff-a78a-1f6265d96255"}, + "value": { + "@id": "#ontology_annotation/0eddc9ac-d4d7-44fc-ab8b-d49939ddf67d", + "annotationValue": "X15", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_23145", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/35679370-16b4-4f1a-9490-328b7bbdb230"}, + "value": { + "@id": "#ontology_annotation/9fabcf87-cb0c-40e3-85a1-d010e46256c0", + "annotationValue": "Orbitrap Astral MS", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_232334", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/46b07e07-59d3-4116-a248-b097bfb4a8bc"}, + "value": { + "@id": "#ontology_annotation/7a6cef4d-0617-4719-8255-6d5358decac7", + "annotationValue": "positive mode", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_22224", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/983e2739-eedd-4453-939e-325ab700babe"}, + "value": { + "@id": "#ontology_annotation/fb1835d9-7ec5-427b-9ba0-89c637ab1b5c", + "annotationValue": "220-340", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/d97a1e92-41e1-4fbf-89b8-a0c77be5bd98"}, + "value": { + "@id": "#ontology_annotation/db51351a-6910-4b33-b8c6-ee4618d7f001", + "annotationValue": "Chromeleon 7.2 Chromatography Data System", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_123245", + "comments": [] + } + } + ], + "inputs": [ + {"@id": "#material/df35feec-d58e-4b26-b5c3-962b4e936753"} + ], + "outputs": [ + {"@id": "#data_file/f8ac0067-3f3d-450d-9c00-03a7d71f17fb"} + ], + "comments": [], + "previousProcess": {"@id": "#process/4e8a8d6b-31fa-4224-b248-2e7b25813878"}, + "nextProcess": {"@id": "#process/bb7fcc6a-4af0-46aa-9cbc-882d3d224612"} + }, + { + "@id": "#process/bb7fcc6a-4af0-46aa-9cbc-882d3d224612", + "name": "MS-metpro-DT-ident", + "performer": "", + "date": "", + "executesProtocol": {"@id": "#protocol/1eb9c21e-a726-4d32-847b-251da964f8f8"}, + "parameterValues": [ + { + "category": {"@id": "#protocol_parameter/b4c43239-b230-4a1e-8e1e-e0f913c8331d"}, + "value": { + "@id": "#ontology_annotation/2fc99447-ae56-4e11-988d-6705da037b81", + "annotationValue": "ThermoFisher", + "termSource": "OBI", + "termAccession": "https://purl.org/OBI_121332", + "comments": [] + } + } + ], + "inputs": [ + {"@id": "#data_file/ccb95813-a566-48f1-bbf2-72ee36f22edc"}, + {"@id": "#data_file/f8ac0067-3f3d-450d-9c00-03a7d71f17fb"}, + {"@id": "#data_file/83a8d59d-40b8-453a-bae1-ce5806441588"}, + {"@id": "#data_file/0b54fbc4-9190-4a6b-a5d8-de9868ede179"} + ], + "outputs": [ + {"@id": "#data_file/887c4595-01e5-4f65-95c7-59fccef9b2c6"} + ], + "comments": [], + "previousProcess": {"@id": "#process/1cd87619-a018-4660-9731-eae3b3ec8a86"} + }, + { + "@id": "#process/bca8c729-831d-4b2d-967b-3de79af3f74c", + "name": "extract-process-2", + "performer": "", + "date": "", + "executesProtocol": {"@id": "#protocol/5723fddd-f8ff-4d3b-a960-2dd9a24f1463"}, + "parameterValues": [ + { + "category": {"@id": "#protocol_parameter/0324592c-4f66-4df4-aa6b-50df68692345"}, + "value": { + "@id": "#ontology_annotation/2651041b-3f42-43c8-91a9-31b5dce46a30", + "annotationValue": "sylilation", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_1266445", + "comments": [] + } + } + ], + "inputs": [ + {"@id": "#sample/7972d092-7b45-4fce-83a3-276771479aef"} + ], + "outputs": [ + {"@id": "#material/c34aa969-eae1-4dd2-80ab-dab88df8e9b9"} + ], + "comments": [], + "nextProcess": {"@id": "#process/f7db3d22-22da-42d4-9736-eb6fba4d0a38"} + }, + { + "@id": "#process/f7db3d22-22da-42d4-9736-eb6fba4d0a38", + "name": "assay-name-ms-metpro--3", + "performer": "", + "date": "", + "executesProtocol": {"@id": "#protocol/f52550a3-644d-4c01-93c1-1624292253d5"}, + "parameterValues": [ + { + "category": {"@id": "#protocol_parameter/41427aee-109f-4229-9363-276f4116fdd0"}, + "value": { + "@id": "#ontology_annotation/42d9225b-2bba-4a07-ae58-7c34397600c3", + "annotationValue": "Agilent LC234", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_2245", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/76b16631-851e-4be0-ab3e-7f9e2e64696f"}, + "value": { + "@id": "#ontology_annotation/4d607c65-6aa4-446e-bdc0-3d817ba1aeea", + "annotationValue": "C18", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_12314245", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/3717e406-1b82-48ff-a78a-1f6265d96255"}, + "value": { + "@id": "#ontology_annotation/9940ac2a-ba79-4f26-abe5-b816b4b75de3", + "annotationValue": "X15", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_23145", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/35679370-16b4-4f1a-9490-328b7bbdb230"}, + "value": { + "@id": "#ontology_annotation/316206fc-e0f3-4e7a-a534-af16214da4d1", + "annotationValue": "Orbitrap Astral MS", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_232334", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/46b07e07-59d3-4116-a248-b097bfb4a8bc"}, + "value": { + "@id": "#ontology_annotation/525679c5-a7e1-466d-8748-3e0d31b7c097", + "annotationValue": "positive mode", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_22224", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/983e2739-eedd-4453-939e-325ab700babe"}, + "value": { + "@id": "#ontology_annotation/05bc0762-b9bf-47b5-9a0a-c2ffdb926a20", + "annotationValue": "220-340", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/d97a1e92-41e1-4fbf-89b8-a0c77be5bd98"}, + "value": { + "@id": "#ontology_annotation/992361ed-3473-4b34-85d9-c5ad15ecceda", + "annotationValue": "Chromeleon 7.2 Chromatography Data System", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_123245", + "comments": [] + } + } + ], + "inputs": [ + {"@id": "#material/c34aa969-eae1-4dd2-80ab-dab88df8e9b9"} + ], + "outputs": [ + {"@id": "#data_file/83a8d59d-40b8-453a-bae1-ce5806441588"} + ], + "comments": [], + "previousProcess": {"@id": "#process/bca8c729-831d-4b2d-967b-3de79af3f74c"}, + "nextProcess": {"@id": "#process/bb7fcc6a-4af0-46aa-9cbc-882d3d224612"} + }, + { + "@id": "#process/bb7fcc6a-4af0-46aa-9cbc-882d3d224612", + "name": "MS-metpro-DT-ident", + "performer": "", + "date": "", + "executesProtocol": {"@id": "#protocol/1eb9c21e-a726-4d32-847b-251da964f8f8"}, + "parameterValues": [ + { + "category": {"@id": "#protocol_parameter/b4c43239-b230-4a1e-8e1e-e0f913c8331d"}, + "value": { + "@id": "#ontology_annotation/2fc99447-ae56-4e11-988d-6705da037b81", + "annotationValue": "ThermoFisher", + "termSource": "OBI", + "termAccession": "https://purl.org/OBI_121332", + "comments": [] + } + } + ], + "inputs": [ + {"@id": "#data_file/ccb95813-a566-48f1-bbf2-72ee36f22edc"}, + {"@id": "#data_file/f8ac0067-3f3d-450d-9c00-03a7d71f17fb"}, + {"@id": "#data_file/83a8d59d-40b8-453a-bae1-ce5806441588"}, + {"@id": "#data_file/0b54fbc4-9190-4a6b-a5d8-de9868ede179"} + ], + "outputs": [ + {"@id": "#data_file/887c4595-01e5-4f65-95c7-59fccef9b2c6"} + ], + "comments": [], + "previousProcess": {"@id": "#process/1cd87619-a018-4660-9731-eae3b3ec8a86"} + }, + { + "@id": "#process/d37ff250-65bc-4482-94a1-35c6d8d27dcc", + "name": "extract-process-3", + "performer": "", + "date": "", + "executesProtocol": {"@id": "#protocol/5723fddd-f8ff-4d3b-a960-2dd9a24f1463"}, + "parameterValues": [ + { + "category": {"@id": "#protocol_parameter/0324592c-4f66-4df4-aa6b-50df68692345"}, + "value": { + "@id": "#ontology_annotation/cb1a9d7c-aad4-45c3-b3ad-0cf4b192a562", + "annotationValue": "sylilation", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_1266445", + "comments": [] + } + } + ], + "inputs": [ + {"@id": "#sample/e10bb6ab-1a60-4495-b286-91a8e9bfbe4f"} + ], + "outputs": [ + {"@id": "#material/2ad608a2-3713-4140-bf82-f7955fbfaaa8"} + ], + "comments": [], + "nextProcess": {"@id": "#process/2e4932f2-7083-42b5-8a89-743b9d477e09"} + }, + { + "@id": "#process/2e4932f2-7083-42b5-8a89-743b9d477e09", + "name": "assay-name-ms-metpro--4", + "performer": "", + "date": "", + "executesProtocol": {"@id": "#protocol/f52550a3-644d-4c01-93c1-1624292253d5"}, + "parameterValues": [ + { + "category": {"@id": "#protocol_parameter/41427aee-109f-4229-9363-276f4116fdd0"}, + "value": { + "@id": "#ontology_annotation/bb7e93cc-5bd5-4cb6-86eb-22a197356f2b", + "annotationValue": "Agilent LC234", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_2245", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/76b16631-851e-4be0-ab3e-7f9e2e64696f"}, + "value": { + "@id": "#ontology_annotation/a7c00fde-07ad-4aac-94a4-291479660b24", + "annotationValue": "C18", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_12314245", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/3717e406-1b82-48ff-a78a-1f6265d96255"}, + "value": { + "@id": "#ontology_annotation/d48cffc8-786a-42ee-b463-7c7e627d69ee", + "annotationValue": "X15", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_23145", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/35679370-16b4-4f1a-9490-328b7bbdb230"}, + "value": { + "@id": "#ontology_annotation/05df05d7-4162-418a-9ed3-8e481bea01ea", + "annotationValue": "Orbitrap Astral MS", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_232334", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/46b07e07-59d3-4116-a248-b097bfb4a8bc"}, + "value": { + "@id": "#ontology_annotation/c96140d9-f9d2-4386-a426-3623c95eac37", + "annotationValue": "positive mode", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_22224", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/983e2739-eedd-4453-939e-325ab700babe"}, + "value": { + "@id": "#ontology_annotation/4cf11956-787e-4183-8081-a53a3974ade7", + "annotationValue": "220-340", + "termSource": "", + "termAccession": "", + "comments": [] + } + }, + { + "category": {"@id": "#protocol_parameter/d97a1e92-41e1-4fbf-89b8-a0c77be5bd98"}, + "value": { + "@id": "#ontology_annotation/97c94466-36e4-48c7-b9ba-5cd6ec70137a", + "annotationValue": "Chromeleon 7.2 Chromatography Data System", + "termSource": "MSIO", + "termAccession": "https://purl.org/MSIO_123245", + "comments": [] + } + } + ], + "inputs": [ + {"@id": "#material/2ad608a2-3713-4140-bf82-f7955fbfaaa8"} + ], + "outputs": [ + {"@id": "#data_file/0b54fbc4-9190-4a6b-a5d8-de9868ede179"} + ], + "comments": [], + "previousProcess": {"@id": "#process/d37ff250-65bc-4482-94a1-35c6d8d27dcc"}, + "nextProcess": {"@id": "#process/bb7fcc6a-4af0-46aa-9cbc-882d3d224612"} + }, + { + "@id": "#process/bb7fcc6a-4af0-46aa-9cbc-882d3d224612", + "name": "MS-metpro-DT-ident", + "performer": "", + "date": "", + "executesProtocol": {"@id": "#protocol/1eb9c21e-a726-4d32-847b-251da964f8f8"}, + "parameterValues": [ + { + "category": {"@id": "#protocol_parameter/b4c43239-b230-4a1e-8e1e-e0f913c8331d"}, + "value": { + "@id": "#ontology_annotation/2fc99447-ae56-4e11-988d-6705da037b81", + "annotationValue": "ThermoFisher", + "termSource": "OBI", + "termAccession": "https://purl.org/OBI_121332", + "comments": [] + } + } + ], + "inputs": [ + {"@id": "#data_file/ccb95813-a566-48f1-bbf2-72ee36f22edc"}, + {"@id": "#data_file/f8ac0067-3f3d-450d-9c00-03a7d71f17fb"}, + {"@id": "#data_file/83a8d59d-40b8-453a-bae1-ce5806441588"}, + {"@id": "#data_file/0b54fbc4-9190-4a6b-a5d8-de9868ede179"} + ], + "outputs": [ + {"@id": "#data_file/887c4595-01e5-4f65-95c7-59fccef9b2c6"} + ], + "comments": [], + "previousProcess": {"@id": "#process/1cd87619-a018-4660-9731-eae3b3ec8a86"} + } + ] + } + ] + } + ] +} \ No newline at end of file From 0c96d8fcc735c1a513343f564c1ea1df42a69db1 Mon Sep 17 00:00:00 2001 From: April Shen Date: Fri, 8 Nov 2024 11:42:21 +0100 Subject: [PATCH 7/7] update README with WIP metabolights submission command --- mars-cli/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mars-cli/README.md b/mars-cli/README.md index 8a6cd5e..885e9a0 100644 --- a/mars-cli/README.md +++ b/mars-cli/README.md @@ -351,6 +351,14 @@ python mars_cli.py --development submit --submit-to-metabolights False --submit- python mars_cli.py --credential-service-name biosamples --username-credentials --file-transfer ftp --data-files ../data/ENA_data.R1.fastq.gz --submit-to-metabolights False --output final-isa ../data/biosamples-input-isa.json ``` +### Submit data files and isa-json to Metabolights + +Work in progress, currently data transfer is not supported yet. + +```bash +python mars_cli.py --credential-service-name metabolights --username-credentials --file-transfer ftp --data-files ../data/ISA-BH2024-ALL/metpro-analysis.txt --submit-to-biosamples False --submit-to-ena False --output final-isa ../data/metabolights-input-isa.json +``` + ## Deploy repository services [To set up and run the MARS tool locally using Docker, follow these steps](../repository-services/README.md)