From dc69d6a7f30393e25baeac1cfbb296b681e118db Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sun, 18 Feb 2024 14:51:45 -0500 Subject: [PATCH 01/64] changes to view-portal-object script --- CHANGELOG.rst | 5 + dcicutils/scripts/view_portal_object.py | 231 ++++++++++++++++++------ pyproject.toml | 2 +- 3 files changed, 181 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 3e776de56..00a8382e3 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -7,6 +7,11 @@ Change Log ---------- +8.8.1 +===== +* Changes to troubleshooting utility script view-portal-object. + + 8.8.0 ===== * Changes to structured_data support date/time types. diff --git a/dcicutils/scripts/view_portal_object.py b/dcicutils/scripts/view_portal_object.py index 87eefcb56..1c24cd9eb 100644 --- a/dcicutils/scripts/view_portal_object.py +++ b/dcicutils/scripts/view_portal_object.py @@ -56,15 +56,15 @@ # -------------------------------------------------------------------------------------------------- import argparse +from functools import lru_cache import json import pyperclip import sys -from typing import Optional +from typing import List, Optional, Tuple import yaml from dcicutils.captured_output import captured_output, uncaptured_output -from dcicutils.misc_utils import get_error_message +from dcicutils.misc_utils import get_error_message, is_uuid from dcicutils.portal_utils import Portal -from dcicutils.structured_data import Schema def main(): @@ -88,20 +88,37 @@ def main(): parser.add_argument("--yaml", action="store_true", required=False, default=False, help="YAML output.") parser.add_argument("--copy", "-c", action="store_true", required=False, default=False, help="Copy object data to clipboard.") + parser.add_argument("--details", action="store_true", required=False, default=False, help="Detailed output.") + parser.add_argument("--more-details", action="store_true", required=False, default=False, + help="More detailed output.") parser.add_argument("--verbose", action="store_true", required=False, default=False, help="Verbose output.") parser.add_argument("--debug", action="store_true", required=False, default=False, help="Debugging output.") args = parser.parse_args() - portal = _create_portal(ini=args.ini, env=args.env, server=args.server, app=args.app, debug=args.debug) - if args.uuid == "schemas": - _print_all_schema_names(portal=portal, verbose=args.verbose) + if args.more_details: + args.details = True + + portal = _create_portal(ini=args.ini, env=args.env, server=args.server, + app=args.app, verbose=args.verbose, debug=args.debug) + + if args.uuid.lower() == "schemas" or args.uuid.lower() == "schema": + _print_all_schema_names(portal=portal, details=args.details, more_details=args.more_details, raw=args.raw) return - elif args.schema: - data = _get_schema(portal=portal, schema_name=args.uuid) - else: - data = _get_portal_object(portal=portal, uuid=args.uuid, raw=args.raw, - database=args.database, verbose=args.verbose) + if _is_maybe_schema_name(args.uuid): + args.schema = True + + if args.schema: + schema, schema_name = _get_schema(portal, args.uuid) + if schema: + if args.copy: + pyperclip.copy(json.dumps(schema, indent=4)) + if not args.raw: + _print(schema_name) + _print_schema(schema, details=args.details, more_details=args.details, raw=args.raw) + return + + data = _get_portal_object(portal=portal, uuid=args.uuid, raw=args.raw, database=args.database, verbose=args.verbose) if args.copy: pyperclip.copy(json.dumps(data, indent=4)) if args.yaml: @@ -111,25 +128,28 @@ def main(): def _create_portal(ini: str, env: Optional[str] = None, - server: Optional[str] = None, app: Optional[str] = None, debug: bool = False) -> Portal: + server: Optional[str] = None, app: Optional[str] = None, + verbose: bool = False, debug: bool = False) -> Portal: + portal = None with captured_output(not debug): - return Portal(env, server=server, app=app) if env or app else Portal(ini) + portal = Portal(env, server=server, app=app) if env or app else Portal(ini) + if portal: + if verbose: + if portal.env: + _print(f"Portal environment: {portal.env}") + if portal.keys_file: + _print(f"Portal keys file: {portal.keys_file}") + if portal.key_id: + _print(f"Portal key prefix: {portal.key_id[0:2]}******") + if portal.ini_file: + _print(f"Portal ini file: {portal.ini_file}") + if portal.server: + _print(f"Portal server: {portal.server}") + return portal def _get_portal_object(portal: Portal, uuid: str, raw: bool = False, database: bool = False, verbose: bool = False) -> dict: - if verbose: - _print(f"Getting object from Portal: {uuid}") - if portal.env: - _print(f"Portal environment: {portal.env}") - if portal.keys_file: - _print(f"Portal keys file: {portal.keys_file}") - if portal.key_id: - _print(f"Portal key prefix: {portal.key_id[0:2]}******") - if portal.ini_file: - _print(f"Portal ini file: {portal.ini_file}") - if portal.server: - _print(f"Portal server: {portal.server}") response = None try: if not uuid.startswith("/"): @@ -139,47 +159,146 @@ def _get_portal_object(portal: Portal, uuid: str, response = portal.get(path, raw=raw, database=database) except Exception as e: if "404" in str(e) and "not found" in str(e).lower(): - _print(f"Portal object not found: {uuid}") - _exit_without_action() - _exit_without_action(f"Exception getting Portal object: {uuid}\n{get_error_message(e)}") + _print(f"Portal object not found at {portal.server}: {uuid}") + _exit() + _exit(f"Exception getting Portal object from {portal.server}: {uuid}\n{get_error_message(e)}") if not response: - _exit_without_action(f"Null response getting Portal object: {uuid}") + _exit(f"Null response getting Portal object from {portal.server}: {uuid}") if response.status_code not in [200, 307]: # TODO: Understand why the /me endpoint returns HTTP status code 307, which is only why we mention it above. - _exit_without_action(f"Invalid status code ({response.status_code}) getting Portal object: {uuid}") + _exit(f"Invalid status code ({response.status_code}) getting Portal object from {portal.server}: {uuid}") if not response.json: - _exit_without_action(f"Invalid JSON getting Portal object: {uuid}") - if verbose: - _print("OK") + _exit(f"Invalid JSON getting Portal object: {uuid}") return response.json() -def _get_schema(portal: Portal, schema_name: str) -> Optional[dict]: - def rummage_for_schema_name(portal: Portal, schema_name: str) -> Optional[str]: # noqa - if schemas := portal.get_schemas(): - for schema in schemas: - if schema.lower() == schema_name.lower(): - return schema - schema = Schema.load_by_name(schema_name, portal) - if not schema: - if schema_name := rummage_for_schema_name(portal, schema_name): - schema = Schema.load_by_name(schema_name, portal) - return schema.data if schema else None +@lru_cache(maxsize=1) +def _get_schemas(portal: Portal) -> Optional[dict]: + return portal.get_schemas() + + +def _get_schema(portal: Portal, name: str) -> Tuple[Optional[dict], Optional[str]]: + if portal and name and (name := name.replace("_", "").replace("-", "").strip().lower()): + if schemas := _get_schemas(portal): + for schema_name in schemas: + if schema_name.replace("_", "").replace("-", "").strip().lower() == name: + return schemas[schema_name], schema_name + return None, None + + +def _is_maybe_schema_name(value: str) -> bool: + if value and not is_uuid(value) and not value.startswith("/"): + return True + return False + + +def _print_schema(schema: dict, details: bool = False, more_details: bool = False, raw: bool = False) -> None: + if raw: + _print(json.dumps(schema, indent=4)) + return + _print_schema_info(schema, details=details, more_details=more_details) + + +def _print_schema_info(schema: dict, level: int = 0, + details: bool = False, more_details: bool = False, + required: Optional[List[str]] = None) -> None: + if not schema or not isinstance(schema, dict): + return + if level == 0: + if required_properties := schema.get("required"): + _print("- required properties:") + for required_property in sorted(list(set(required_properties))): + if property_type := (info := schema.get("properties", {}).get(required_property, {})).get("type"): + if property_type == "array" and (array_type := info.get("items", {}).get("type")): + _print(f" - {required_property}: {property_type} of {array_type}") + else: + _print(f" - {required_property}: {property_type}") + else: + _print(f" - {required_property}") + if identifying_properties := schema.get("identifyingProperties"): + _print("- identifying properties:") + for identifying_property in sorted(list(set(identifying_properties))): + if property_type := (info := schema.get("properties", {}).get(identifying_property, {})).get("type"): + if property_type == "array" and (array_type := info.get("items", {}).get("type")): + _print(f" - {identifying_property}: {property_type} of {array_type}") + else: + _print(f" - {identifying_property}: {property_type}") + else: + _print(f" - {identifying_property}") + if schema.get("additionalProperties") is True: + _print(f" - additional properties are allowed") + pass + if not more_details: + return + if properties := (schema.get("properties") if level == 0 else schema): + if level == 0: + _print("- properties:") + for property_name in sorted(properties): + if property_name.startswith("@"): + continue + spaces = f"{' ' * (level + 1) * 2}" + property = properties[property_name] + property_required = required and property_name in required + if property_type := property.get("type"): + if property_type == "object": + suffix = "" + if not (object_properties := property.get("properties")): + if property.get("additionalProperties") is True: + property_type = "any object" + else: + property_type = "undefined object" + elif property.get("additionalProperties") is True: + property_type = "open ended object" + _print(f"{spaces}- {property_name}: {property_type}{suffix}") + _print_schema_info(object_properties, level=level + 1, + details=details, more_details=more_details, + required=property.get("required")) + elif property_type == "array": + suffix = "" + if property_required: + suffix += f" | required" + if property_items := property.get("items"): + if property_type := property_items.get("type"): + if property_type == "object": + suffix = "" + _print(f"{spaces}- {property_name}: array of object{suffix}") + _print_schema_info(property_items.get("properties"), + details=details, more_details=more_details, level=level + 1) + elif property_type == "array": + # This (array-of-array) never happens to occur at this time (February 2024). + _print(f"{spaces}- {property_name}: array of array{suffix}") + else: + _print(f"{spaces}- {property_name}: array of {property_type}{suffix}") + else: + _print(f"{spaces}- {property_name}: array{suffix}") + else: + _print(f"{spaces}- {property_name}: array{suffix}") + else: + if isinstance(property_type, list): + property_type = " | ".join(property_type) + suffix = "" + if property_required: + suffix += f" | required" + if pattern := property.get("pattern"): + suffix += f" | pattern: {pattern}" + if link_to := property.get("linkTo"): + suffix += f" | reference: {link_to}" + _print(f"{spaces}- {property_name}: {property_type}{suffix}") + else: + _print(f"{spaces}- {property_name}") -def _print_all_schema_names(portal: Portal, verbose: bool = False) -> None: - if schemas := portal.get_schemas(): +def _print_all_schema_names(portal: Portal, + details: bool = False, more_details: bool = False, + raw: bool = False) -> None: + if schemas := _get_schemas(portal): + if raw: + _print(json.dumps(schemas, indent=4)) + return for schema in sorted(schemas.keys()): _print(schema) - if verbose: - if identifying_properties := schemas[schema].get("identifyingProperties"): - _print("- identifying properties:") - for identifying_property in sorted(identifying_properties): - _print(f" - {identifying_property}") - if required_properties := schemas[schema].get("required"): - _print("- required properties:") - for required_property in sorted(required_properties): - _print(f" - {required_property}") + if details: + _print_schema(schemas[schema], details=details, more_details=more_details) def _print(*args, **kwargs): @@ -188,7 +307,7 @@ def _print(*args, **kwargs): sys.stdout.flush() -def _exit_without_action(message: Optional[str] = None) -> None: +def _exit(message: Optional[str] = None) -> None: if message: _print(f"ERROR: {message}") exit(1) diff --git a/pyproject.toml b/pyproject.toml index 0583b995f..4b6d36ca0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0" +version = "8.8.0.1b1" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From c38ea3f32e5338d10cf4c3dea2b65ba85a5b750e Mon Sep 17 00:00:00 2001 From: David Michaels Date: Mon, 19 Feb 2024 15:18:05 -0500 Subject: [PATCH 02/64] changes to view-portal-object script --- dcicutils/scripts/view_portal_object.py | 38 +++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/dcicutils/scripts/view_portal_object.py b/dcicutils/scripts/view_portal_object.py index 1c24cd9eb..95a9c43cc 100644 --- a/dcicutils/scripts/view_portal_object.py +++ b/dcicutils/scripts/view_portal_object.py @@ -63,7 +63,7 @@ from typing import List, Optional, Tuple import yaml from dcicutils.captured_output import captured_output, uncaptured_output -from dcicutils.misc_utils import get_error_message, is_uuid +from dcicutils.misc_utils import get_error_message, is_uuid, PRINT from dcicutils.portal_utils import Portal @@ -116,7 +116,7 @@ def main(): if not args.raw: _print(schema_name) _print_schema(schema, details=args.details, more_details=args.details, raw=args.raw) - return + return data = _get_portal_object(portal=portal, uuid=args.uuid, raw=args.raw, database=args.database, verbose=args.verbose) if args.copy: @@ -215,6 +215,7 @@ def _print_schema_info(schema: dict, level: int = 0, _print(f" - {required_property}: {property_type}") else: _print(f" - {required_property}") + required = required_properties if identifying_properties := schema.get("identifyingProperties"): _print("- identifying properties:") for identifying_property in sorted(list(set(identifying_properties))): @@ -225,6 +226,16 @@ def _print_schema_info(schema: dict, level: int = 0, _print(f" - {identifying_property}: {property_type}") else: _print(f" - {identifying_property}") + if properties := schema.get("properties"): + reference_properties = [] + for property_name in properties: + property = properties[property_name] + if link_to := property.get("linkTo"): + reference_properties.append({"name": property_name, "ref": link_to}) + if reference_properties: + _print("- reference properties:") + for reference_property in sorted(reference_properties, key=lambda key: key["name"]): + _print(f" - {reference_property['name']}: {reference_property['ref']}") if schema.get("additionalProperties") is True: _print(f" - additional properties are allowed") pass @@ -277,13 +288,34 @@ def _print_schema_info(schema: dict, level: int = 0, if isinstance(property_type, list): property_type = " | ".join(property_type) suffix = "" + if (enumeration := property.get("enum")) is not None: + suffix += f" | enum" if property_required: suffix += f" | required" if pattern := property.get("pattern"): suffix += f" | pattern: {pattern}" if link_to := property.get("linkTo"): suffix += f" | reference: {link_to}" + if property.get("calculatedProperty"): + suffix += f" | calculated" + if default := property.get("default"): + suffix += f" | default:" + if isinstance(default, dict): + suffix += f" object" + elif isinstance(default, list): + suffix += f" array" + else: + suffix += f" {default}" _print(f"{spaces}- {property_name}: {property_type}{suffix}") + if enumeration: + nenums = 0 + maxenums = 15 + for enum in enumeration: + if (nenums := nenums + 1) >= maxenums: + if (remaining := len(enumeration) - nenums) > 0: + _print(f"{spaces} - [{remaining} more ...]") + break + _print(f"{spaces} - {enum}") else: _print(f"{spaces}- {property_name}") @@ -303,7 +335,7 @@ def _print_all_schema_names(portal: Portal, def _print(*args, **kwargs): with uncaptured_output(): - print(*args, **kwargs) + PRINT(*args, **kwargs) sys.stdout.flush() From 160ec00717f0bf5c6f302ae167f83f016bdbda98 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Tue, 20 Feb 2024 07:47:46 -0500 Subject: [PATCH 03/64] changes to view-portal-object script --- dcicutils/scripts/view_portal_object.py | 27 ++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/dcicutils/scripts/view_portal_object.py b/dcicutils/scripts/view_portal_object.py index 95a9c43cc..d6f67c847 100644 --- a/dcicutils/scripts/view_portal_object.py +++ b/dcicutils/scripts/view_portal_object.py @@ -59,6 +59,7 @@ from functools import lru_cache import json import pyperclip +import os import sys from typing import List, Optional, Tuple import yaml @@ -114,7 +115,10 @@ def main(): if args.copy: pyperclip.copy(json.dumps(schema, indent=4)) if not args.raw: - _print(schema_name) + if parent_schema_name := _get_parent_schema_name(schema): + _print(f"{schema_name} | parent: {parent_schema_name}") + else: + _print(schema_name) _print_schema(schema, details=args.details, more_details=args.details, raw=args.raw) return @@ -294,6 +298,10 @@ def _print_schema_info(schema: dict, level: int = 0, suffix += f" | required" if pattern := property.get("pattern"): suffix += f" | pattern: {pattern}" + if (format := property.get("format")) and (format != "uuid"): + suffix += f" | format: {format}" + if property.get("anyOf") == [{"format": "date"}, {"format": "date-time"}]: + suffix += f" | format: date | date-time" if link_to := property.get("linkTo"): suffix += f" | reference: {link_to}" if property.get("calculatedProperty"): @@ -310,7 +318,7 @@ def _print_schema_info(schema: dict, level: int = 0, if enumeration: nenums = 0 maxenums = 15 - for enum in enumeration: + for enum in sorted(enumeration): if (nenums := nenums + 1) >= maxenums: if (remaining := len(enumeration) - nenums) > 0: _print(f"{spaces} - [{remaining} more ...]") @@ -327,10 +335,19 @@ def _print_all_schema_names(portal: Portal, if raw: _print(json.dumps(schemas, indent=4)) return - for schema in sorted(schemas.keys()): - _print(schema) + for schema_name in sorted(schemas.keys()): + if parent_schema_name := _get_parent_schema_name(schemas[schema_name]): + _print(f"{schema_name} | parent: {parent_schema_name}") + else: + _print(schema_name) if details: - _print_schema(schemas[schema], details=details, more_details=more_details) + _print_schema(schemas[schema_name], details=details, more_details=more_details) + + +def _get_parent_schema_name(schema: dict) -> Optional[str]: + if sub_class_of := schema.get("rdfs:subClassOf"): + if (parent_schema_name := os.path.basename(sub_class_of).replace(".json", "")) != "Item": + return parent_schema_name def _print(*args, **kwargs): From ff4db1c7982462687d7614b885569a7638073cf6 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Tue, 20 Feb 2024 10:01:19 -0500 Subject: [PATCH 04/64] changes to view-portal-object script --- dcicutils/scripts/view_portal_object.py | 45 +++++++++++++++++++------ 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/dcicutils/scripts/view_portal_object.py b/dcicutils/scripts/view_portal_object.py index d6f67c847..cc24b4ae6 100644 --- a/dcicutils/scripts/view_portal_object.py +++ b/dcicutils/scripts/view_portal_object.py @@ -103,7 +103,8 @@ def main(): app=args.app, verbose=args.verbose, debug=args.debug) if args.uuid.lower() == "schemas" or args.uuid.lower() == "schema": - _print_all_schema_names(portal=portal, details=args.details, more_details=args.more_details, raw=args.raw) + _print_all_schema_names(portal=portal, details=args.details, + more_details=args.more_details, raw=args.raw, raw_yaml=args.yaml) return if _is_maybe_schema_name(args.uuid): @@ -119,7 +120,7 @@ def main(): _print(f"{schema_name} | parent: {parent_schema_name}") else: _print(schema_name) - _print_schema(schema, details=args.details, more_details=args.details, raw=args.raw) + _print_schema(schema, details=args.details, more_details=args.details, raw=args.raw, raw_yaml=args.yaml) return data = _get_portal_object(portal=portal, uuid=args.uuid, raw=args.raw, database=args.database, verbose=args.verbose) @@ -196,9 +197,13 @@ def _is_maybe_schema_name(value: str) -> bool: return False -def _print_schema(schema: dict, details: bool = False, more_details: bool = False, raw: bool = False) -> None: +def _print_schema(schema: dict, details: bool = False, more_details: bool = False, + raw: bool = False, raw_yaml: bool = False) -> None: if raw: - _print(json.dumps(schema, indent=4)) + if raw_yaml: + _print(yaml.dump(schema)) + else: + _print(json.dumps(schema, indent=4)) return _print_schema_info(schema, details=details, more_details=more_details) @@ -219,6 +224,13 @@ def _print_schema_info(schema: dict, level: int = 0, _print(f" - {required_property}: {property_type}") else: _print(f" - {required_property}") + if isinstance(any_of := schema.get("anyOf"), list): + if ((any_of == [{"required": ["submission_centers"]}, {"required": ["consortia"]}]) or + (any_of == [{"required": ["consortia"]}, {"required": ["submission_centers"]}])): # noqa + # Very very special case. + _print(f" - at least one of:") + _print(f" - consortia: array of string | unique") + _print(f" - submission_centers: array of string | unique") required = required_properties if identifying_properties := schema.get("identifyingProperties"): _print("- identifying properties:") @@ -264,6 +276,8 @@ def _print_schema_info(schema: dict, level: int = 0, property_type = "undefined object" elif property.get("additionalProperties") is True: property_type = "open ended object" + if property.get("calculatedProperty"): + suffix += f" | calculated" _print(f"{spaces}- {property_name}: {property_type}{suffix}") _print_schema_info(object_properties, level=level + 1, details=details, more_details=more_details, @@ -272,13 +286,18 @@ def _print_schema_info(schema: dict, level: int = 0, suffix = "" if property_required: suffix += f" | required" + if property.get("uniqueItems"): + suffix += f" | unique" + if property.get("calculatedProperty"): + suffix += f" | calculated" if property_items := property.get("items"): if property_type := property_items.get("type"): if property_type == "object": suffix = "" _print(f"{spaces}- {property_name}: array of object{suffix}") - _print_schema_info(property_items.get("properties"), - details=details, more_details=more_details, level=level + 1) + _print_schema_info(property_items.get("properties"), level=level + 1, + details=details, more_details=more_details, + required=property_items.get("required")) elif property_type == "array": # This (array-of-array) never happens to occur at this time (February 2024). _print(f"{spaces}- {property_name}: array of array{suffix}") @@ -290,18 +309,21 @@ def _print_schema_info(schema: dict, level: int = 0, _print(f"{spaces}- {property_name}: array{suffix}") else: if isinstance(property_type, list): - property_type = " | ".join(property_type) + property_type = " or ".join(sorted(property_type)) suffix = "" if (enumeration := property.get("enum")) is not None: suffix += f" | enum" if property_required: suffix += f" | required" + if property.get("uniqueKey"): + suffix += f" | unique" if pattern := property.get("pattern"): suffix += f" | pattern: {pattern}" if (format := property.get("format")) and (format != "uuid"): suffix += f" | format: {format}" if property.get("anyOf") == [{"format": "date"}, {"format": "date-time"}]: - suffix += f" | format: date | date-time" + # Very special case. + suffix += f" | format: date/date-time" if link_to := property.get("linkTo"): suffix += f" | reference: {link_to}" if property.get("calculatedProperty"): @@ -330,10 +352,13 @@ def _print_schema_info(schema: dict, level: int = 0, def _print_all_schema_names(portal: Portal, details: bool = False, more_details: bool = False, - raw: bool = False) -> None: + raw: bool = False, raw_yaml: bool = False) -> None: if schemas := _get_schemas(portal): if raw: - _print(json.dumps(schemas, indent=4)) + if raw_yaml: + _print(yaml.dump(schemas)) + else: + _print(json.dumps(schemas, indent=4)) return for schema_name in sorted(schemas.keys()): if parent_schema_name := _get_parent_schema_name(schemas[schema_name]): From 26aaf61ca236c0b417c3a1018735b2a90191d77b Mon Sep 17 00:00:00 2001 From: David Michaels Date: Tue, 20 Feb 2024 11:34:00 -0500 Subject: [PATCH 05/64] changes to view-portal-object script --- dcicutils/scripts/view_portal_object.py | 51 ++++++++++++++++++------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/dcicutils/scripts/view_portal_object.py b/dcicutils/scripts/view_portal_object.py index cc24b4ae6..f61f2fa0f 100644 --- a/dcicutils/scripts/view_portal_object.py +++ b/dcicutils/scripts/view_portal_object.py @@ -68,6 +68,16 @@ from dcicutils.portal_utils import Portal +# Schema properties to ignore (by default) for the view schema usage. +_SCHEMAS_IGNORE_PROPERTIES = [ + "date_created", + "last_modified", + "principals_allowed", + "submitted_by", + "schema_version" +] + + def main(): parser = argparse.ArgumentParser(description="View Portal object.") @@ -83,6 +93,8 @@ def main(): help=f"Application name (one of: smaht, cgap, fourfront).") parser.add_argument("--schema", action="store_true", required=False, default=False, help="View named schema rather than object.") + parser.add_argument("--all", action="store_true", required=False, default=False, + help="Include all properties for schema usage.") parser.add_argument("--raw", action="store_true", required=False, default=False, help="Raw output.") parser.add_argument("--database", action="store_true", required=False, default=False, help="Read from database output.") @@ -104,7 +116,7 @@ def main(): if args.uuid.lower() == "schemas" or args.uuid.lower() == "schema": _print_all_schema_names(portal=portal, details=args.details, - more_details=args.more_details, raw=args.raw, raw_yaml=args.yaml) + more_details=args.more_details, all=args.all, raw=args.raw, raw_yaml=args.yaml) return if _is_maybe_schema_name(args.uuid): @@ -120,7 +132,8 @@ def main(): _print(f"{schema_name} | parent: {parent_schema_name}") else: _print(schema_name) - _print_schema(schema, details=args.details, more_details=args.details, raw=args.raw, raw_yaml=args.yaml) + _print_schema(schema, details=args.details, more_details=args.details, + all=args.all, raw=args.raw, raw_yaml=args.yaml) return data = _get_portal_object(portal=portal, uuid=args.uuid, raw=args.raw, database=args.database, verbose=args.verbose) @@ -197,7 +210,7 @@ def _is_maybe_schema_name(value: str) -> bool: return False -def _print_schema(schema: dict, details: bool = False, more_details: bool = False, +def _print_schema(schema: dict, details: bool = False, more_details: bool = False, all: bool = False, raw: bool = False, raw_yaml: bool = False) -> None: if raw: if raw_yaml: @@ -205,11 +218,11 @@ def _print_schema(schema: dict, details: bool = False, more_details: bool = Fals else: _print(json.dumps(schema, indent=4)) return - _print_schema_info(schema, details=details, more_details=more_details) + _print_schema_info(schema, details=details, more_details=more_details, all=all) def _print_schema_info(schema: dict, level: int = 0, - details: bool = False, more_details: bool = False, + details: bool = False, more_details: bool = False, all: bool = False, required: Optional[List[str]] = None) -> None: if not schema or not isinstance(schema, dict): return @@ -217,6 +230,8 @@ def _print_schema_info(schema: dict, level: int = 0, if required_properties := schema.get("required"): _print("- required properties:") for required_property in sorted(list(set(required_properties))): + if not all and required_property in _SCHEMAS_IGNORE_PROPERTIES: + continue if property_type := (info := schema.get("properties", {}).get(required_property, {})).get("type"): if property_type == "array" and (array_type := info.get("items", {}).get("type")): _print(f" - {required_property}: {property_type} of {array_type}") @@ -229,12 +244,14 @@ def _print_schema_info(schema: dict, level: int = 0, (any_of == [{"required": ["consortia"]}, {"required": ["submission_centers"]}])): # noqa # Very very special case. _print(f" - at least one of:") - _print(f" - consortia: array of string | unique") - _print(f" - submission_centers: array of string | unique") + _print(f" - consortia: array of string") + _print(f" - submission_centers: array of string") required = required_properties if identifying_properties := schema.get("identifyingProperties"): _print("- identifying properties:") for identifying_property in sorted(list(set(identifying_properties))): + if not all and identifying_property in _SCHEMAS_IGNORE_PROPERTIES: + continue if property_type := (info := schema.get("properties", {}).get(identifying_property, {})).get("type"): if property_type == "array" and (array_type := info.get("items", {}).get("type")): _print(f" - {identifying_property}: {property_type} of {array_type}") @@ -245,6 +262,8 @@ def _print_schema_info(schema: dict, level: int = 0, if properties := schema.get("properties"): reference_properties = [] for property_name in properties: + if not all and property_name in _SCHEMAS_IGNORE_PROPERTIES: + continue property = properties[property_name] if link_to := property.get("linkTo"): reference_properties.append({"name": property_name, "ref": link_to}) @@ -261,6 +280,8 @@ def _print_schema_info(schema: dict, level: int = 0, if level == 0: _print("- properties:") for property_name in sorted(properties): + if not all and property_name in _SCHEMAS_IGNORE_PROPERTIES: + continue if property_name.startswith("@"): continue spaces = f"{' ' * (level + 1) * 2}" @@ -280,7 +301,7 @@ def _print_schema_info(schema: dict, level: int = 0, suffix += f" | calculated" _print(f"{spaces}- {property_name}: {property_type}{suffix}") _print_schema_info(object_properties, level=level + 1, - details=details, more_details=more_details, + details=details, more_details=more_details, all=all, required=property.get("required")) elif property_type == "array": suffix = "" @@ -296,7 +317,7 @@ def _print_schema_info(schema: dict, level: int = 0, suffix = "" _print(f"{spaces}- {property_name}: array of object{suffix}") _print_schema_info(property_items.get("properties"), level=level + 1, - details=details, more_details=more_details, + details=details, more_details=more_details, all=all, required=property_items.get("required")) elif property_type == "array": # This (array-of-array) never happens to occur at this time (February 2024). @@ -321,9 +342,11 @@ def _print_schema_info(schema: dict, level: int = 0, suffix += f" | pattern: {pattern}" if (format := property.get("format")) and (format != "uuid"): suffix += f" | format: {format}" - if property.get("anyOf") == [{"format": "date"}, {"format": "date-time"}]: - # Very special case. - suffix += f" | format: date/date-time" + if isinstance(any_of := property.get("anyOf"), list): + if ((any_of == [{"format": "date"}, {"format": "date-time"}]) or + (any_of == [{"format": "date-time"}, {"format": "date"}])): # noqa + # Very special case. + suffix += f" | format: date or date-time" if link_to := property.get("linkTo"): suffix += f" | reference: {link_to}" if property.get("calculatedProperty"): @@ -351,7 +374,7 @@ def _print_schema_info(schema: dict, level: int = 0, def _print_all_schema_names(portal: Portal, - details: bool = False, more_details: bool = False, + details: bool = False, more_details: bool = False, all: bool = False, raw: bool = False, raw_yaml: bool = False) -> None: if schemas := _get_schemas(portal): if raw: @@ -366,7 +389,7 @@ def _print_all_schema_names(portal: Portal, else: _print(schema_name) if details: - _print_schema(schemas[schema_name], details=details, more_details=more_details) + _print_schema(schemas[schema_name], details=details, more_details=more_details, all=all) def _get_parent_schema_name(schema: dict) -> Optional[str]: From 313fa10586d4271de1938d07624881925c141928 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Tue, 20 Feb 2024 12:02:03 -0500 Subject: [PATCH 06/64] changes to view-portal-object script --- dcicutils/scripts/view_portal_object.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/dcicutils/scripts/view_portal_object.py b/dcicutils/scripts/view_portal_object.py index f61f2fa0f..37379fd7a 100644 --- a/dcicutils/scripts/view_portal_object.py +++ b/dcicutils/scripts/view_portal_object.py @@ -312,6 +312,12 @@ def _print_schema_info(schema: dict, level: int = 0, if property.get("calculatedProperty"): suffix += f" | calculated" if property_items := property.get("items"): + if pattern := property_items.get("pattern"): + suffix += f" | pattern: {pattern}" + if (format := property_items.get("format")) and (format != "uuid"): + suffix += f" | format: {format}" + if max_length := property_items.get("maxLength"): + suffix += f" | max items: {max_length}" if property_type := property_items.get("type"): if property_type == "object": suffix = "" @@ -359,6 +365,14 @@ def _print_schema_info(schema: dict, level: int = 0, suffix += f" array" else: suffix += f" {default}" + if minimum := property.get("minimum"): + suffix += f" | min: {minimum}" + if maximum := property.get("maximum"): + suffix += f" | max: {maximum}" + if max_length := property.get("maxLength"): + suffix += f" | max length: {max_length}" + if min_length := property.get("minLength"): + suffix += f" | min length: {min_length}" _print(f"{spaces}- {property_name}: {property_type}{suffix}") if enumeration: nenums = 0 From ee0733367a3254b2c583dc49936bf26ad6836437 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Wed, 21 Feb 2024 13:29:21 -0500 Subject: [PATCH 07/64] changes to view-portal-object script --- dcicutils/scripts/view_portal_object.py | 28 +++++++++++++++++-------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/dcicutils/scripts/view_portal_object.py b/dcicutils/scripts/view_portal_object.py index 37379fd7a..cff1bd637 100644 --- a/dcicutils/scripts/view_portal_object.py +++ b/dcicutils/scripts/view_portal_object.py @@ -111,8 +111,8 @@ def main(): if args.more_details: args.details = True - portal = _create_portal(ini=args.ini, env=args.env, server=args.server, - app=args.app, verbose=args.verbose, debug=args.debug) + portal = _create_portal(ini=args.ini, env=args.env or os.environ.get("SMAHT_ENV"), + server=args.server, app=args.app, verbose=args.verbose, debug=args.debug) if args.uuid.lower() == "schemas" or args.uuid.lower() == "schema": _print_all_schema_names(portal=portal, details=args.details, @@ -273,7 +273,6 @@ def _print_schema_info(schema: dict, level: int = 0, _print(f" - {reference_property['name']}: {reference_property['ref']}") if schema.get("additionalProperties") is True: _print(f" - additional properties are allowed") - pass if not more_details: return if properties := (schema.get("properties") if level == 0 else schema): @@ -312,11 +311,13 @@ def _print_schema_info(schema: dict, level: int = 0, if property.get("calculatedProperty"): suffix += f" | calculated" if property_items := property.get("items"): + if (enumeration := property_items.get("enum")) is not None: + suffix = f" | enum" + suffix if pattern := property_items.get("pattern"): suffix += f" | pattern: {pattern}" if (format := property_items.get("format")) and (format != "uuid"): suffix += f" | format: {format}" - if max_length := property_items.get("maxLength"): + if (max_length := property_items.get("maxLength")) is not None: suffix += f" | max items: {max_length}" if property_type := property_items.get("type"): if property_type == "object": @@ -334,6 +335,15 @@ def _print_schema_info(schema: dict, level: int = 0, _print(f"{spaces}- {property_name}: array{suffix}") else: _print(f"{spaces}- {property_name}: array{suffix}") + if enumeration: + nenums = 0 + maxenums = 15 + for enum in sorted(enumeration): + if (nenums := nenums + 1) >= maxenums: + if (remaining := len(enumeration) - nenums) > 0: + _print(f"{spaces} - [{remaining} more ...]") + break + _print(f"{spaces} - {enum}") else: if isinstance(property_type, list): property_type = " or ".join(sorted(property_type)) @@ -357,7 +367,7 @@ def _print_schema_info(schema: dict, level: int = 0, suffix += f" | reference: {link_to}" if property.get("calculatedProperty"): suffix += f" | calculated" - if default := property.get("default"): + if (default := property.get("default")) is not None: suffix += f" | default:" if isinstance(default, dict): suffix += f" object" @@ -365,13 +375,13 @@ def _print_schema_info(schema: dict, level: int = 0, suffix += f" array" else: suffix += f" {default}" - if minimum := property.get("minimum"): + if (minimum := property.get("minimum")) is not None: suffix += f" | min: {minimum}" - if maximum := property.get("maximum"): + if (maximum := property.get("maximum")) is not None: suffix += f" | max: {maximum}" - if max_length := property.get("maxLength"): + if (max_length := property.get("maxLength")) is not None: suffix += f" | max length: {max_length}" - if min_length := property.get("minLength"): + if (min_length := property.get("minLength")) is not None: suffix += f" | min length: {min_length}" _print(f"{spaces}- {property_name}: {property_type}{suffix}") if enumeration: From c2b6b5dbf7650764ce2516f0ee26e9ed1964bfa9 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Tue, 27 Feb 2024 18:44:20 -0500 Subject: [PATCH 08/64] view-portal-object script updates --- dcicutils/scripts/view_portal_object.py | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/dcicutils/scripts/view_portal_object.py b/dcicutils/scripts/view_portal_object.py index cff1bd637..5dea84a64 100644 --- a/dcicutils/scripts/view_portal_object.py +++ b/dcicutils/scripts/view_portal_object.py @@ -118,6 +118,32 @@ def main(): _print_all_schema_names(portal=portal, details=args.details, more_details=args.more_details, all=args.all, raw=args.raw, raw_yaml=args.yaml) return + elif args.uuid.lower() == "info": # TODO: need word for what consortiums and submission centers are collectively + if consortia := portal.get_metadata("/consortia?limit=1000"): + _print("Known Consortia:") + consortia = sorted(consortia.get("@graph", []), key=lambda key: key.get("identifier")) + for consortium in consortia: + if ((consortium_name := consortium.get("identifier")) and + (consortium_uuid := consortium.get("uuid"))): # noqa + _print(f"- {consortium_name}: {consortium_uuid}") + if submission_centers := portal.get_metadata("/submission-centers?limit=1000"): + _print("Known Submission Centers:") + submission_centers = sorted(submission_centers.get("@graph", []), key=lambda key: key.get("identifier")) + for submission_center in submission_centers: + if ((submission_center_name := submission_center.get("identifier")) and + (submission_center_uuid := submission_center.get("uuid"))): # noqa + _print(f"- {submission_center_name}: {submission_center_uuid}") + try: + if file_formats := portal.get_metadata("/file-formats?limit=1000"): + _print("Known File Formats:") + file_formats = sorted(file_formats.get("@graph", []), key=lambda key: key.get("identifier")) + for file_format in file_formats: + if ((file_format_name := file_format.get("identifier")) and + (file_format_uuid := file_format.get("uuid"))): # noqa + _print(f"- {file_format_name}: {file_format_uuid}") + except Exception: + _print("Known File Formats: None") + return if _is_maybe_schema_name(args.uuid): args.schema = True From 358a55f30368c3d5b02930899685a43af3db4dc3 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Tue, 5 Mar 2024 08:09:41 -0500 Subject: [PATCH 09/64] minor type hint update --- dcicutils/structured_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index ae3424203..6e8d2c51a 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -681,7 +681,7 @@ def is_file_schema(self, schema_name: str) -> bool: """ return self.is_schema_type(schema_name, FILE_SCHEMA_NAME) - def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[str]: + def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: if not value: if type_name.startswith("/") and len(parts := type_name[1:].split("/")) == 2: type_name = parts[0] From 8f621947ec497557a1f2e03bff2924d5cf29eaf8 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Wed, 6 Mar 2024 22:43:49 -0500 Subject: [PATCH 10/64] ref caching in structured_data --- CHANGELOG.rst | 1 + dcicutils/portal_utils.py | 8 +- dcicutils/scripts/view_portal_object.py | 115 ++++++++++++++++--- dcicutils/structured_data.py | 140 +++++++++++++++++++----- 4 files changed, 216 insertions(+), 48 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 00a8382e3..b19161a7d 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -10,6 +10,7 @@ Change Log 8.8.1 ===== * Changes to troubleshooting utility script view-portal-object. +* Support ref caching in structured_data etc. 8.8.0 diff --git a/dcicutils/portal_utils.py b/dcicutils/portal_utils.py index 9b4e9b05c..573ae9c40 100644 --- a/dcicutils/portal_utils.py +++ b/dcicutils/portal_utils.py @@ -331,15 +331,15 @@ def get_schemas_super_type_map(self) -> dict: Returns the "super type map" for all of the known schemas (via /profiles). This is a dictionary with property names which are all known schema type names which have (one or more) sub-types, and the value of each such property name is an array - of all of those sub-types (direct and all descendents), in breadth first order. + of all of those sub-type names (direct and all descendents), in breadth first order. """ def list_breadth_first(super_type_map: dict, super_type_name: str) -> dict: result = [] queue = deque(super_type_map.get(super_type_name, [])) while queue: - result.append(sub_type_name := queue.popleft()) - if sub_type_name in super_type_map: - queue.extend(super_type_map[sub_type_name]) + result.append(subtype_name := queue.popleft()) + if subtype_name in super_type_map: + queue.extend(super_type_map[subtype_name]) return result if not (schemas := self.get_schemas()): return {} diff --git a/dcicutils/scripts/view_portal_object.py b/dcicutils/scripts/view_portal_object.py index 5dea84a64..55b0430b1 100644 --- a/dcicutils/scripts/view_portal_object.py +++ b/dcicutils/scripts/view_portal_object.py @@ -61,7 +61,7 @@ import pyperclip import os import sys -from typing import List, Optional, Tuple +from typing import Callable, List, Optional, Tuple import yaml from dcicutils.captured_output import captured_output, uncaptured_output from dcicutils.misc_utils import get_error_message, is_uuid, PRINT @@ -96,6 +96,7 @@ def main(): parser.add_argument("--all", action="store_true", required=False, default=False, help="Include all properties for schema usage.") parser.add_argument("--raw", action="store_true", required=False, default=False, help="Raw output.") + parser.add_argument("--tree", action="store_true", required=False, default=False, help="Tree output for schemas.") parser.add_argument("--database", action="store_true", required=False, default=False, help="Read from database output.") parser.add_argument("--yaml", action="store_true", required=False, default=False, help="YAML output.") @@ -116,7 +117,8 @@ def main(): if args.uuid.lower() == "schemas" or args.uuid.lower() == "schema": _print_all_schema_names(portal=portal, details=args.details, - more_details=args.more_details, all=args.all, raw=args.raw, raw_yaml=args.yaml) + more_details=args.more_details, all=args.all, + tree=args.tree, raw=args.raw, raw_yaml=args.yaml) return elif args.uuid.lower() == "info": # TODO: need word for what consortiums and submission centers are collectively if consortia := portal.get_metadata("/consortia?limit=1000"): @@ -155,7 +157,10 @@ def main(): pyperclip.copy(json.dumps(schema, indent=4)) if not args.raw: if parent_schema_name := _get_parent_schema_name(schema): - _print(f"{schema_name} | parent: {parent_schema_name}") + if schema.get("isAbstract") is True: + _print(f"{schema_name} | parent: {parent_schema_name} | abstract") + else: + _print(f"{schema_name} | parent: {parent_schema_name}") else: _print(schema_name) _print_schema(schema, details=args.details, more_details=args.details, @@ -425,27 +430,103 @@ def _print_schema_info(schema: dict, level: int = 0, def _print_all_schema_names(portal: Portal, details: bool = False, more_details: bool = False, all: bool = False, - raw: bool = False, raw_yaml: bool = False) -> None: - if schemas := _get_schemas(portal): - if raw: - if raw_yaml: - _print(yaml.dump(schemas)) + tree: bool = False, raw: bool = False, raw_yaml: bool = False) -> None: + if not (schemas := _get_schemas(portal)): + return + + if raw: + if raw_yaml: + _print(yaml.dump(schemas)) + else: + _print(json.dumps(schemas, indent=4)) + return + + if tree: + _print_schemas_tree(schemas) + return + + for schema_name in sorted(schemas.keys()): + if parent_schema_name := _get_parent_schema_name(schemas[schema_name]): + if schemas[schema_name].get("isAbstract") is True: + _print(f"{schema_name} | parent: {parent_schema_name} | abstract") else: - _print(json.dumps(schemas, indent=4)) - return - for schema_name in sorted(schemas.keys()): - if parent_schema_name := _get_parent_schema_name(schemas[schema_name]): _print(f"{schema_name} | parent: {parent_schema_name}") + else: + if schemas[schema_name].get("isAbstract") is True: + _print(f"{schema_name} | abstract") else: _print(schema_name) - if details: - _print_schema(schemas[schema_name], details=details, more_details=more_details, all=all) + if details: + _print_schema(schemas[schema_name], details=details, more_details=more_details, all=all) def _get_parent_schema_name(schema: dict) -> Optional[str]: - if sub_class_of := schema.get("rdfs:subClassOf"): - if (parent_schema_name := os.path.basename(sub_class_of).replace(".json", "")) != "Item": - return parent_schema_name + if (isinstance(schema, dict) and + (parent_schema_name := schema.get("rdfs:subClassOf")) and + (parent_schema_name := parent_schema_name.replace("/profiles/", "").replace(".json", "")) and + (parent_schema_name != "Item")): # noqa + return parent_schema_name + return None + + +def _print_schemas_tree(schemas: dict) -> None: + def children_of(name: str) -> List[str]: + nonlocal schemas + children = [] + if not (name is None or isinstance(name, str)): + return children + if name and name.lower() == "schemas": + name = None + for schema_name in (schemas if isinstance(schemas, dict) else {}): + if _get_parent_schema_name(schemas[schema_name]) == name: + children.append(schema_name) + return sorted(children) + def name_of(name: str) -> str: # noqa + nonlocal schemas + if not (name is None or isinstance(name, str)): + return name + if (schema := schemas.get(name)) and schema.get("isAbstract") is True: + return f"{name} (abstact)" + return name + _print_tree(root_name="Schemas", children_of=children_of, name_of=name_of) + + +def _print_tree(root_name: Optional[str], + children_of: Callable, + has_children: Optional[Callable] = None, + name_of: Optional[Callable] = None, + print: Callable = print) -> None: + """ + Recursively prints as a tree structure the given root name and any of its + children (again, recursively) as specified by the given children_of callable; + the has_children may be specified, for efficiency, though if not specified + it will use the children_of function to determine this; the name_of callable + may be specified to modify the name before printing. + """ + first = "└─ " + space = " " + branch = "│ " + tee = "├── " + last = "└── " + + if not callable(children_of): + return + if not callable(has_children): + has_children = lambda name: children_of(name) is not None # noqa + + # This function adapted from stackoverflow. + # Ref: https://stackoverflow.com/questions/9727673/list-directory-tree-structure-in-python + def tree_generator(name: str, prefix: str = ""): + contents = children_of(name) + pointers = [tee] * (len(contents) - 1) + [last] + for pointer, path in zip(pointers, contents): + yield prefix + pointer + (name_of(path) if callable(name_of) else path) + if has_children(path): + extension = branch if pointer == tee else space + yield from tree_generator(path, prefix=prefix+extension) + print(first + ((name_of(root_name) if callable(name_of) else root_name) or "root")) + for line in tree_generator(root_name, prefix=" "): + print(line) def _print(*args, **kwargs): diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 6e8d2c51a..63dd635bb 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -47,11 +47,27 @@ class StructuredDataSet: + # Reference (linkTo) lookup strategies; on a per-reference (type/value) basis; + # controlled by optional ref_lookup_strategy callable; default is lookup at root path + # but after the named reference (linkTo) type path lookup, and then lookup all subtypes; + # can choose to lookup root path first, or not lookup root path at all, or not lookup + # subtypes at all; the ref_lookup_strategy callable if specified should take a type_name + # and value (string) arguements and return an integer of any of the below ORed together. + REF_LOOKUP_ROOT = 0x0001 + REF_LOOKUP_ROOT_FIRST = 0x0002 | REF_LOOKUP_ROOT + REF_LOOKUP_SUBTYPES = 0x0004 + REF_LOOKUP_MINIMAL = 0 + REF_LOOKUP_DEFAULT = REF_LOOKUP_ROOT | REF_LOOKUP_SUBTYPES + def __init__(self, file: Optional[str] = None, portal: Optional[Union[VirtualApp, TestApp, Portal]] = None, schemas: Optional[List[dict]] = None, autoadd: Optional[dict] = None, - order: Optional[List[str]] = None, prune: bool = True) -> None: + order: Optional[List[str]] = None, prune: bool = True, + ref_lookup_strategy: Optional[Callable] = None, + ref_lookup_nocache: bool = False) -> None: self._data = {} - self._portal = Portal(portal, data=self._data, schemas=schemas) if portal else None + self._portal = Portal(portal, data=self._data, schemas=schemas, + ref_lookup_strategy=ref_lookup_strategy, + ref_lookup_nocache=ref_lookup_nocache) if portal else None self._order = order self._prune = prune self._warnings = {} @@ -72,8 +88,11 @@ def portal(self) -> Optional[Portal]: @staticmethod def load(file: str, portal: Optional[Union[VirtualApp, TestApp, Portal]] = None, schemas: Optional[List[dict]] = None, autoadd: Optional[dict] = None, - order: Optional[List[str]] = None, prune: bool = True) -> StructuredDataSet: - return StructuredDataSet(file=file, portal=portal, schemas=schemas, autoadd=autoadd, order=order, prune=prune) + order: Optional[List[str]] = None, prune: bool = True, + ref_lookup_strategy: Optional[Callable] = None, + ref_lookup_nocache: bool = False) -> StructuredDataSet: + return StructuredDataSet(file=file, portal=portal, schemas=schemas, autoadd=autoadd, order=order, prune=prune, + ref_lookup_strategy=ref_lookup_strategy, ref_lookup_nocache=ref_lookup_nocache) def validate(self, force: bool = False) -> None: def data_without_deleted_properties(data: dict) -> dict: @@ -255,6 +274,23 @@ def _add_properties(self, structured_row: dict, properties: dict, schema: Option if name not in structured_row and (not schema or schema.data.get("properties", {}).get(name)): structured_row[name] = properties[name] + def _is_ref_lookup_root(ref_lookup_flags: int) -> bool: + return (ref_lookup_flags & StructuredDataSet.REF_LOOKUP_ROOT) == StructuredDataSet.REF_LOOKUP_ROOT + + def _is_ref_lookup_root_first(ref_lookup_flags: int) -> bool: + return (ref_lookup_flags & StructuredDataSet.REF_LOOKUP_ROOT_FIRST) == StructuredDataSet.REF_LOOKUP_ROOT_FIRST + + def _is_ref_lookup_subtypes(ref_lookup_flags: int) -> bool: + return (ref_lookup_flags & StructuredDataSet.REF_LOOKUP_SUBTYPES) == StructuredDataSet.REF_LOOKUP_SUBTYPES + + @property + def ref_cache_hit_count(self) -> int: + return self.portal.ref_cache_hit_count if self.portal else -1 + + @property + def ref_lookup_count(self) -> int: + return self.portal.ref_lookup_count if self.portal else -1 + def _note_warning(self, item: Optional[Union[dict, List[dict]]], group: str) -> None: self._note_issue(self._warnings, item, group) @@ -637,6 +673,8 @@ def __init__(self, env: Optional[str] = None, server: Optional[str] = None, app: Optional[OrchestratedApp] = None, data: Optional[dict] = None, schemas: Optional[List[dict]] = None, + ref_lookup_strategy: Optional[Callable] = None, + ref_lookup_nocache: bool = False, raise_exception: bool = True) -> None: super().__init__(arg, env=env, server=server, app=app, raise_exception=raise_exception) if isinstance(arg, Portal): @@ -645,10 +683,21 @@ def __init__(self, else: self._schemas = schemas self._data = data + if callable(ref_lookup_strategy): + self._ref_lookup_strategy = ref_lookup_strategy + else: + self._ref_lookup_strategy = lambda type_name, value: StructuredDataSet.REF_LOOKUP_DEFAULT + self._ref_cache = {} if not ref_lookup_nocache else None + self._ref_cache_hit_count = 0 + self._ref_lookup_count = 0 - @lru_cache(maxsize=256) - def get_metadata(self, object_name: str) -> Optional[dict]: + @lru_cache(maxsize=8092) + def get_metadata_cache(self, object_name: str) -> Optional[dict]: + return self.get_metadata_nocache(object_name) + + def get_metadata_nocache(self, object_name: str) -> Optional[dict]: try: + self._ref_lookup_count += 1 return super().get_metadata(object_name) except Exception: return None @@ -675,53 +724,90 @@ def get_schemas(self) -> Optional[dict]: schemas[user_specified_schema["title"]] = user_specified_schema return schemas + @lru_cache(maxsize=64) + def _get_schema_subtypes(self, type_name: str) -> Optional[List[str]]: + if not (schemas_super_type_map := self.get_schemas_super_type_map()): + return [] + return schemas_super_type_map.get(type_name) + def is_file_schema(self, schema_name: str) -> bool: """ Returns True iff the given schema name isa File type, i.e. has an ancestor which is of type File. """ return self.is_schema_type(schema_name, FILE_SCHEMA_NAME) + def _ref_exists_from_cache(self, type_name: str, value: str) -> Optional[List[dict]]: + if self._ref_cache is not None: + return self._ref_cache.get(f"/{type_name}/{value}", None) + return None + + def _cache_ref(self, type_name: str, value: str, resolved: List[str], + subtype_names: Optional[List[str]]) -> None: + if self._ref_cache is not None: + for type_name in [type_name] + (subtype_names or []): + object_path = f"/{type_name}/{value}" + if self._ref_cache.get(object_path, None) is None: + self._ref_cache[object_path] = resolved + def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: if not value: if type_name.startswith("/") and len(parts := type_name[1:].split("/")) == 2: type_name = parts[0] value = parts[1] else: - return [] + return [] # Should not happen. + if (resolved := self._ref_exists_from_cache(type_name, value)) is not None: + self._ref_cache_hit_count += 1 + return resolved + # Not cached here. resolved = [] - is_resolved, resolved_uuid = self._ref_exists_single(type_name, value) + ref_lookup_strategy = self._ref_lookup_strategy(type_name, value) + is_ref_lookup_root = StructuredDataSet._is_ref_lookup_root(ref_lookup_strategy) + is_ref_lookup_root_first = StructuredDataSet._is_ref_lookup_root_first(ref_lookup_strategy) + is_ref_lookup_subtypes = StructuredDataSet._is_ref_lookup_subtypes(ref_lookup_strategy) + is_resolved = False + subtype_names = self._get_schema_subtypes(type_name) + if is_ref_lookup_root_first: + is_resolved, resolved_uuid = self._ref_exists_single(type_name, value, root=True) + if not is_resolved: + is_resolved, resolved_uuid = self._ref_exists_single(type_name, value) + if not is_resolved and is_ref_lookup_root and not is_ref_lookup_root_first: + is_resolved, resolved_uuid = self._ref_exists_single(type_name, value, root=True) if is_resolved: resolved.append({"type": type_name, "uuid": resolved_uuid}) - # TODO: Added this return on 2024-01-14 (dmichaels). - # Why did I orginally check for multiple existing values? - # Why not just return right away if I find that the ref exists? - # Getting multiple values because, for example, we find - # both this /Sample/UW_CELL-CULTURE-SAMPLE_COLO-829BL_HI-C_1 - # and /CellSample/UW_CELL-CULTURE-SAMPLE_COLO-829BL_HI-C_1 - # Why does that matter at all? Same thing. - return resolved - # Check for the given ref in all sub-types of the given type. - if (schemas_super_type_map := self.get_schemas_super_type_map()): - if (sub_type_names := schemas_super_type_map.get(type_name)): - for sub_type_name in sub_type_names: - is_resolved, resolved_uuid = self._ref_exists_single(sub_type_name, value) - if is_resolved: - resolved.append({"type": type_name, "uuid": resolved_uuid}) - # TODO: Added this return on 2024-01-14 (dmichaels). See above TODO. - return resolved + # Check for the given ref in all subtypes of the given type. + elif subtype_names and is_ref_lookup_subtypes: + for subtype_name in subtype_names: + is_resolved, resolved_uuid = self._ref_exists_single(subtype_name, value) + if is_resolved: + resolved.append({"type": type_name, "uuid": resolved_uuid}) + break + # Cache this ref (and all subtype versions of it); whether or not found; + # if not found it will be an empty array (array because caching all matches; + # but TODO - do not think we should do this anymore - maybe test changes needed). + self._cache_ref(type_name, value, resolved, subtype_names) return resolved - def _ref_exists_single(self, type_name: str, value: str) -> Tuple[bool, Optional[str]]: + def _ref_exists_single(self, type_name: str, value: str, root: bool = False) -> Tuple[bool, Optional[str]]: + # Check first in our own data (i.e. e.g. within the given spreadsheet). if self._data and (items := self._data.get(type_name)) and (schema := self.get_schema(type_name)): iproperties = set(schema.get("identifyingProperties", [])) | {"identifier", "uuid"} for item in items: if (ivalue := next((item[iproperty] for iproperty in iproperties if iproperty in item), None)): if isinstance(ivalue, list) and value in ivalue or ivalue == value: return True, (ivalue if isinstance(ivalue, str) and is_uuid(ivalue) else None) - if (value := self.get_metadata(f"/{type_name}/{value}")) is None: + if (value := self.get_metadata(f"/{type_name}/{value}" if not root else f"/{value}")) is None: return False, None return True, value.get("uuid") + @property + def ref_cache_hit_count(self) -> int: + return self._ref_cache_hit_count + + @property + def ref_lookup_count(self) -> int: + return self._ref_lookup_count + @staticmethod def create_for_testing(arg: Optional[Union[str, bool, List[dict], dict, Callable]] = None, schemas: Optional[List[dict]] = None) -> Portal: From 8cff942dd63755f7d70a99b0f4a6df0c1344102b Mon Sep 17 00:00:00 2001 From: David Michaels Date: Thu, 7 Mar 2024 00:43:15 -0500 Subject: [PATCH 11/64] get_metadata nocache fix in structured_data --- dcicutils/structured_data.py | 7 ++++++- pyproject.toml | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 63dd635bb..05a70aaba 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -687,7 +687,12 @@ def __init__(self, self._ref_lookup_strategy = ref_lookup_strategy else: self._ref_lookup_strategy = lambda type_name, value: StructuredDataSet.REF_LOOKUP_DEFAULT - self._ref_cache = {} if not ref_lookup_nocache else None + if ref_lookup_nocache is True: + self.get_metadata = self.get_metadata_nocache + self._ref_cache = None + else: + self.get_metadata = self.get_metadata_cache + self._ref_cache = {} self._ref_cache_hit_count = 0 self._ref_lookup_count = 0 diff --git a/pyproject.toml b/pyproject.toml index 4b6d36ca0..66e222069 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b1" # TODO: To become 8.8.1 +version = "8.8.0.1b2" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 3a16630bf4a62300b1bd68d15bee5af90ffeb8b1 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Thu, 7 Mar 2024 06:37:13 -0500 Subject: [PATCH 12/64] minro update to structured_data --- dcicutils/structured_data.py | 37 ++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 05a70aaba..5ee9a844c 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -291,6 +291,18 @@ def ref_cache_hit_count(self) -> int: def ref_lookup_count(self) -> int: return self.portal.ref_lookup_count if self.portal else -1 + @property + def ref_lookup_found_count(self) -> int: + return self.portal.ref_lookup_found_count if self.portal else -1 + + @property + def ref_lookup_notfound_count(self) -> int: + return self.portal.ref_lookup_notfound_count if self.portal else -1 + + @property + def ref_lookup_error_count(self) -> int: + return self.portal.ref_lookup_error_count if self.portal else -1 + def _note_warning(self, item: Optional[Union[dict, List[dict]]], group: str) -> None: self._note_issue(self._warnings, item, group) @@ -695,6 +707,9 @@ def __init__(self, self._ref_cache = {} self._ref_cache_hit_count = 0 self._ref_lookup_count = 0 + self._ref_lookup_found_count = 0 + self._ref_lookup_notfound_count = 0 + self._ref_lookup_error_count = 0 @lru_cache(maxsize=8092) def get_metadata_cache(self, object_name: str) -> Optional[dict]: @@ -703,8 +718,14 @@ def get_metadata_cache(self, object_name: str) -> Optional[dict]: def get_metadata_nocache(self, object_name: str) -> Optional[dict]: try: self._ref_lookup_count += 1 - return super().get_metadata(object_name) - except Exception: + result = super().get_metadata(object_name) + self._ref_lookup_found_count += 1 + return result + except Exception as e: + if "HTTPNotFound" in str(e): + self._ref_lookup_notfound_count += 1 + else: + self._ref_lookup_error_count += 1 return None @lru_cache(maxsize=256) @@ -813,6 +834,18 @@ def ref_cache_hit_count(self) -> int: def ref_lookup_count(self) -> int: return self._ref_lookup_count + @property + def ref_lookup_found_count(self) -> int: + return self._ref_lookup_found_count + + @property + def ref_lookup_notfound_count(self) -> int: + return self._ref_lookup_notfound_count + + @property + def ref_lookup_error_count(self) -> int: + return self._ref_lookup_error_count + @staticmethod def create_for_testing(arg: Optional[Union[str, bool, List[dict], dict, Callable]] = None, schemas: Optional[List[dict]] = None) -> Portal: From 945374fd6a9b6c075032d1545210dcb28fb77be0 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Thu, 7 Mar 2024 12:54:03 -0500 Subject: [PATCH 13/64] ref cache stuff --- dcicutils/structured_data.py | 46 ++++++++++++++++++++++++++---------- pyproject.toml | 2 +- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 5ee9a844c..82baf7b55 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -284,12 +284,12 @@ def _is_ref_lookup_subtypes(ref_lookup_flags: int) -> bool: return (ref_lookup_flags & StructuredDataSet.REF_LOOKUP_SUBTYPES) == StructuredDataSet.REF_LOOKUP_SUBTYPES @property - def ref_cache_hit_count(self) -> int: - return self.portal.ref_cache_hit_count if self.portal else -1 + def ref_lookup_cache_hit_count(self) -> int: + return self.portal.ref_lookup_cache_hit_count if self.portal else -1 @property - def ref_lookup_count(self) -> int: - return self.portal.ref_lookup_count if self.portal else -1 + def ref_lookup_cache_miss_count(self) -> int: + return self.portal.ref_lookup_cache_miss_count if self.portal else -1 @property def ref_lookup_found_count(self) -> int: @@ -303,6 +303,14 @@ def ref_lookup_notfound_count(self) -> int: def ref_lookup_error_count(self) -> int: return self.portal.ref_lookup_error_count if self.portal else -1 + @property + def ref_exists_cache_hit_count(self) -> int: + return self.portal.ref_exists_cache_hit_count if self.portal else -1 + + @property + def ref_exists_cache_miss_count(self) -> int: + return self.portal.ref_exists_cache_miss_count if self.portal else -1 + def _note_warning(self, item: Optional[Union[dict, List[dict]]], group: str) -> None: self._note_issue(self._warnings, item, group) @@ -705,11 +713,11 @@ def __init__(self, else: self.get_metadata = self.get_metadata_cache self._ref_cache = {} - self._ref_cache_hit_count = 0 - self._ref_lookup_count = 0 self._ref_lookup_found_count = 0 self._ref_lookup_notfound_count = 0 self._ref_lookup_error_count = 0 + self._ref_exists_cache_hit_count = 0 + self._ref_exists_cache_miss_count = 0 @lru_cache(maxsize=8092) def get_metadata_cache(self, object_name: str) -> Optional[dict]: @@ -717,7 +725,6 @@ def get_metadata_cache(self, object_name: str) -> Optional[dict]: def get_metadata_nocache(self, object_name: str) -> Optional[dict]: try: - self._ref_lookup_count += 1 result = super().get_metadata(object_name) self._ref_lookup_found_count += 1 return result @@ -783,9 +790,10 @@ def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: else: return [] # Should not happen. if (resolved := self._ref_exists_from_cache(type_name, value)) is not None: - self._ref_cache_hit_count += 1 + self._ref_exists_cache_hit_count += 1 return resolved # Not cached here. + self._ref_exists_cache_miss_count += 1 resolved = [] ref_lookup_strategy = self._ref_lookup_strategy(type_name, value) is_ref_lookup_root = StructuredDataSet._is_ref_lookup_root(ref_lookup_strategy) @@ -827,12 +835,18 @@ def _ref_exists_single(self, type_name: str, value: str, root: bool = False) -> return True, value.get("uuid") @property - def ref_cache_hit_count(self) -> int: - return self._ref_cache_hit_count + def ref_lookup_cache_hit_count(self) -> int: + try: + return self.get_metadata_cache.cache_info().hits + except Exception: + return -1 @property - def ref_lookup_count(self) -> int: - return self._ref_lookup_count + def ref_lookup_cache_miss_count(self) -> int: + try: + return self.get_metadata_cache.cache_info().misses + except Exception: + return -1 @property def ref_lookup_found_count(self) -> int: @@ -846,6 +860,14 @@ def ref_lookup_notfound_count(self) -> int: def ref_lookup_error_count(self) -> int: return self._ref_lookup_error_count + @property + def ref_exists_cache_hit_count(self) -> int: + return self._ref_exists_cache_hit_count + + @property + def ref_exists_cache_miss_count(self) -> int: + return self._ref_exists_cache_miss_count + @staticmethod def create_for_testing(arg: Optional[Union[str, bool, List[dict], dict, Callable]] = None, schemas: Optional[List[dict]] = None) -> Portal: diff --git a/pyproject.toml b/pyproject.toml index 66e222069..885df0453 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b2" # TODO: To become 8.8.1 +version = "8.8.0.1b3" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 4aa02d0c927afe4414c6dce874c0439a359d0400 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Thu, 7 Mar 2024 13:09:33 -0500 Subject: [PATCH 14/64] update dcicutils --- dcicutils/structured_data.py | 10 ++++++++++ pyproject.toml | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 82baf7b55..c6a3787fe 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -303,6 +303,10 @@ def ref_lookup_notfound_count(self) -> int: def ref_lookup_error_count(self) -> int: return self.portal.ref_lookup_error_count if self.portal else -1 + @property + def ref_exists_internal_count(self) -> int: + return self.portal.ref_exists_internal_count if self.portal else -1 + @property def ref_exists_cache_hit_count(self) -> int: return self.portal.ref_exists_cache_hit_count if self.portal else -1 @@ -716,6 +720,7 @@ def __init__(self, self._ref_lookup_found_count = 0 self._ref_lookup_notfound_count = 0 self._ref_lookup_error_count = 0 + self._ref_exists_internal_count = 0 self._ref_exists_cache_hit_count = 0 self._ref_exists_cache_miss_count = 0 @@ -829,6 +834,7 @@ def _ref_exists_single(self, type_name: str, value: str, root: bool = False) -> for item in items: if (ivalue := next((item[iproperty] for iproperty in iproperties if iproperty in item), None)): if isinstance(ivalue, list) and value in ivalue or ivalue == value: + self._ref_exists_internal_count += 1 return True, (ivalue if isinstance(ivalue, str) and is_uuid(ivalue) else None) if (value := self.get_metadata(f"/{type_name}/{value}" if not root else f"/{value}")) is None: return False, None @@ -860,6 +866,10 @@ def ref_lookup_notfound_count(self) -> int: def ref_lookup_error_count(self) -> int: return self._ref_lookup_error_count + @property + def ref_exists_internal_count(self) -> int: + return self._ref_exists_internal_count + @property def ref_exists_cache_hit_count(self) -> int: return self._ref_exists_cache_hit_count diff --git a/pyproject.toml b/pyproject.toml index 885df0453..f5b38a21b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b3" # TODO: To become 8.8.1 +version = "8.8.0.1b4" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From fe9c517096749588d5f0017df53c8f2dc48a1b91 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Thu, 7 Mar 2024 13:54:39 -0500 Subject: [PATCH 15/64] update dcicutils --- dcicutils/structured_data.py | 12 ++++++++++++ pyproject.toml | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index c6a3787fe..889de38df 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -291,6 +291,10 @@ def ref_lookup_cache_hit_count(self) -> int: def ref_lookup_cache_miss_count(self) -> int: return self.portal.ref_lookup_cache_miss_count if self.portal else -1 + @property + def ref_lookup_count(self) -> int: + return self.portal.ref_lookup_count if self.portal else -1 + @property def ref_lookup_found_count(self) -> int: return self.portal.ref_lookup_found_count if self.portal else -1 @@ -842,6 +846,8 @@ def _ref_exists_single(self, type_name: str, value: str, root: bool = False) -> @property def ref_lookup_cache_hit_count(self) -> int: + if self._ref_cache is None: + return 0 try: return self.get_metadata_cache.cache_info().hits except Exception: @@ -849,11 +855,17 @@ def ref_lookup_cache_hit_count(self) -> int: @property def ref_lookup_cache_miss_count(self) -> int: + if self._ref_cache is None: + return self.ref_lookup_count try: return self.get_metadata_cache.cache_info().misses except Exception: return -1 + @property + def ref_lookup_count(self) -> int: + return self._ref_lookup_found_count + self._ref_lookup_notfound_count + self._ref_lookup_error_count + @property def ref_lookup_found_count(self) -> int: return self._ref_lookup_found_count diff --git a/pyproject.toml b/pyproject.toml index f5b38a21b..97a3a9600 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b4" # TODO: To become 8.8.1 +version = "8.8.0.1b5" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 73b887804c657505c3bd5b5d1b4e2b26eae18595 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Fri, 8 Mar 2024 08:49:56 -0500 Subject: [PATCH 16/64] ref lookup reworking in structured_data --- CHANGELOG.rst | 3 +- dcicutils/structured_data.py | 113 ++++++++++++++++++++++------------- pyproject.toml | 2 +- 3 files changed, 74 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index b19161a7d..633f85bc8 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -10,7 +10,8 @@ Change Log 8.8.1 ===== * Changes to troubleshooting utility script view-portal-object. -* Support ref caching in structured_data etc. +* Some reworking of ref lookup in structured_data. +* Support ref caching in structured_data. 8.8.0 diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 889de38df..5ea4cb04a 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -12,7 +12,7 @@ from dcicutils.data_readers import CsvReader, Excel, RowReader from dcicutils.datetime_utils import normalize_date_string, normalize_datetime_string from dcicutils.file_utils import search_for_file -from dcicutils.misc_utils import (create_dict, create_readonly_object, is_uuid, load_json_if, +from dcicutils.misc_utils import (create_dict, create_readonly_object, load_json_if, merge_objects, remove_empty_properties, right_trim, split_string, to_boolean, to_enum, to_float, to_integer, VirtualApp) from dcicutils.portal_object_utils import PortalObject @@ -53,6 +53,10 @@ class StructuredDataSet: # can choose to lookup root path first, or not lookup root path at all, or not lookup # subtypes at all; the ref_lookup_strategy callable if specified should take a type_name # and value (string) arguements and return an integer of any of the below ORed together. + # The main purpose of this is optimization; to minimum portal lookups; since for example, + # currently at least, /{type}/{accession} does not work but /{accession} does; so we + # currently (smaht-portal/.../ingestion_processors) use REF_LOOKUP_ROOT_FIRST for this. + # And current usage NEVER has REF_LOOKUP_SUBTYPES turned OFF; but support just in case. REF_LOOKUP_ROOT = 0x0001 REF_LOOKUP_ROOT_FIRST = 0x0002 | REF_LOOKUP_ROOT REF_LOOKUP_SUBTYPES = 0x0004 @@ -228,8 +232,10 @@ def _load_excel_file(self, file: str) -> None: if ref_errors := self.ref_errors: ref_errors_actual = [] for ref_error in ref_errors: - if not self.portal.ref_exists(ref_error["error"]): + if not (resolved := self.portal.ref_exists(ref := ref_error["error"])): ref_errors_actual.append(ref_error) + else: + self._resolved_refs.add((ref, resolved[0].get("uuid"))) if ref_errors_actual: self._errors["ref"] = ref_errors_actual else: @@ -565,7 +571,7 @@ def _create_typeinfo(self, schema_json: dict, parent_key: Optional[str] = None) the names of any nested properties (i.e objects within objects) flattened into a single property name in dot notation; and set the value of each of these flat property names to the type of the terminal/leaf value of the (either) top-level or nested type. N.B. We - do NOT currently support array-of-arry or array-of-multiple-types. E.g. for this schema: + do NOT currently support array-of-array or array-of-multiple-types. E.g. for this schema: { "properties": { "abc": { @@ -783,66 +789,89 @@ def _ref_exists_from_cache(self, type_name: str, value: str) -> Optional[List[di return self._ref_cache.get(f"/{type_name}/{value}", None) return None - def _cache_ref(self, type_name: str, value: str, resolved: List[str], - subtype_names: Optional[List[str]]) -> None: + def _cache_ref(self, type_name: str, value: str, resolved: List[str], subtype_names: Optional[List[str]]) -> None: if self._ref_cache is not None: - for type_name in [type_name] + (subtype_names or []): - object_path = f"/{type_name}/{value}" - if self._ref_cache.get(object_path, None) is None: - self._ref_cache[object_path] = resolved + for type_name in [type_name] + (subtype_names if subtype_names else []): + self._ref_cache[f"/{type_name}/{value}"] = resolved def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: if not value: if type_name.startswith("/") and len(parts := type_name[1:].split("/")) == 2: - type_name = parts[0] - value = parts[1] + if not (type_name := parts[0]) or not (value := parts[1]): + return [] else: - return [] # Should not happen. + return [] if (resolved := self._ref_exists_from_cache(type_name, value)) is not None: + # Found cached resolved reference. + if not resolved: + # Cached resolved reference is empty ([]). + # It might NOW be found internally, since the portal self._data can change. + # TODO + ref_lookup_strategy = self._ref_lookup_strategy(type_name, value) + subtype_names = self._get_schema_subtypes(type_name) if is_ref_lookup_subtypes else None + is_resolved, resolved_uuid = self._ref_exists_internally(type_name, value, subtype_names) + if is_resolved: + resolved = [{"type": type_name, "uuid": resolved_uuid}] + self._cache_ref(type_name, value, resolved, subtype_names) + return resolved self._ref_exists_cache_hit_count += 1 return resolved # Not cached here. self._ref_exists_cache_miss_count += 1 - resolved = [] + # Get the lookup strategy. ref_lookup_strategy = self._ref_lookup_strategy(type_name, value) is_ref_lookup_root = StructuredDataSet._is_ref_lookup_root(ref_lookup_strategy) is_ref_lookup_root_first = StructuredDataSet._is_ref_lookup_root_first(ref_lookup_strategy) is_ref_lookup_subtypes = StructuredDataSet._is_ref_lookup_subtypes(ref_lookup_strategy) - is_resolved = False - subtype_names = self._get_schema_subtypes(type_name) + subtype_names = self._get_schema_subtypes(type_name) if is_ref_lookup_subtypes else None + # Lookup internally first (including at subtypes if desired). + is_resolved, resolved_uuid = self._ref_exists_internally(type_name, value, subtype_names) + if is_resolved: + resolved = [{"type": type_name, "uuid": resolved_uuid}] + self._cache_ref(type_name, value, resolved, subtype_names) + return resolved + # Not found internally; perform actual portal lookup (included at root and subtypes if desired). + # First construct the list of lookup paths at which to look for the referenced item. + lookup_paths = [] if is_ref_lookup_root_first: - is_resolved, resolved_uuid = self._ref_exists_single(type_name, value, root=True) - if not is_resolved: - is_resolved, resolved_uuid = self._ref_exists_single(type_name, value) - if not is_resolved and is_ref_lookup_root and not is_ref_lookup_root_first: - is_resolved, resolved_uuid = self._ref_exists_single(type_name, value, root=True) + lookup_paths.append(f"/{value}") + lookup_paths.append(f"/{type_name}/{value}") + if is_ref_lookup_root and not is_ref_lookup_root_first: + lookup_paths.append(f"/{value}") + if subtype_names: + for subtype_name in subtype_names: + lookup_paths.append(f"/{subtype_name}/{value}") + # Do the actual lookup in the portal for each of the desired lookup paths. + for lookup_path in lookup_paths: + if isinstance(item := self.get_metadata(lookup_path), dict): + resolved = [{"type": type_name, "uuid": item.get("uuid", None)}] + self._cache_ref(type_name, value, resolved, subtype_names) + return resolved + return [] + + def _ref_exists_internally(self, type_name: str, value: str, + subtype_names: Optional[List[str]] = None) -> Tuple[bool, Optional[str]]: + is_resolved, resolved_uuid = self._ref_exists_single_internally(type_name, value) if is_resolved: - resolved.append({"type": type_name, "uuid": resolved_uuid}) - # Check for the given ref in all subtypes of the given type. - elif subtype_names and is_ref_lookup_subtypes: + return True, resolved_uuid + if subtype_names: for subtype_name in subtype_names: - is_resolved, resolved_uuid = self._ref_exists_single(subtype_name, value) + is_resolved, resolved_uuid = self._ref_exists_single_internally(subtype_name, value) if is_resolved: - resolved.append({"type": type_name, "uuid": resolved_uuid}) - break - # Cache this ref (and all subtype versions of it); whether or not found; - # if not found it will be an empty array (array because caching all matches; - # but TODO - do not think we should do this anymore - maybe test changes needed). - self._cache_ref(type_name, value, resolved, subtype_names) - return resolved - - def _ref_exists_single(self, type_name: str, value: str, root: bool = False) -> Tuple[bool, Optional[str]]: - # Check first in our own data (i.e. e.g. within the given spreadsheet). + return True, resolved_uuid + return False, None + + def _ref_exists_single_internally(self, type_name: str, value: str) -> Tuple[bool, Optional[str]]: if self._data and (items := self._data.get(type_name)) and (schema := self.get_schema(type_name)): - iproperties = set(schema.get("identifyingProperties", [])) | {"identifier", "uuid"} + identifying_properties = set(schema.get("identifyingProperties", [])) | {"identifier", "uuid"} for item in items: - if (ivalue := next((item[iproperty] for iproperty in iproperties if iproperty in item), None)): - if isinstance(ivalue, list) and value in ivalue or ivalue == value: - self._ref_exists_internal_count += 1 - return True, (ivalue if isinstance(ivalue, str) and is_uuid(ivalue) else None) - if (value := self.get_metadata(f"/{type_name}/{value}" if not root else f"/{value}")) is None: - return False, None - return True, value.get("uuid") + for identifying_property in identifying_properties: + if (identifying_value := item.get(identifying_property, None)) is not None: + if ((identifying_value == value) or + (isinstance(identifying_value, list) and (value in identifying_value))): # noqa + self._ref_exists_internal_count += 1 + return True, item.get("uuid", None) + return False, None @property def ref_lookup_cache_hit_count(self) -> int: diff --git a/pyproject.toml b/pyproject.toml index 97a3a9600..2ff2f9d83 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b5" # TODO: To become 8.8.1 +version = "8.8.0.1b6" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From ef6ca77adf4956542e45b774db9afccfb956bc6a Mon Sep 17 00:00:00 2001 From: David Michaels Date: Fri, 8 Mar 2024 08:53:16 -0500 Subject: [PATCH 17/64] lint --- dcicutils/structured_data.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 5ea4cb04a..c9d769260 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -808,6 +808,7 @@ def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: # It might NOW be found internally, since the portal self._data can change. # TODO ref_lookup_strategy = self._ref_lookup_strategy(type_name, value) + is_ref_lookup_subtypes = StructuredDataSet._is_ref_lookup_subtypes(ref_lookup_strategy) subtype_names = self._get_schema_subtypes(type_name) if is_ref_lookup_subtypes else None is_resolved, resolved_uuid = self._ref_exists_internally(type_name, value, subtype_names) if is_resolved: From d163071725ebbc56ad8af73906c169fed1cf1e29 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Fri, 8 Mar 2024 10:13:05 -0500 Subject: [PATCH 18/64] move structured_data test here from smaht-portal --- CHANGELOG.rst | 1 + pyproject.toml | 2 +- .../structured_data/analyte_20231119.csv | 2 + .../analyte_20231119.result.json | 35 + .../structured_data/cell_line_20231120.csv | 4 + .../cell_line_20231120.result.json | 51 + .../file_format_20231119.csv.gz | Bin 0 -> 273 bytes .../file_format_20231119.result.json | 43 + .../structured_data/library_20231119.csv | 4 + .../library_20231119.result.json | 92 + .../reference_file.flattened.json | 170 + .../reference_file_20231119.csv | 2 + .../reference_file_20231119.result.json | 26 + .../structured_data/schemas_dump.json | 21378 ++++++++++++++++ .../structured_data/sequencing_20231120.csv | 4 + .../sequencing_20231120.result.json | 98 + .../structured_data/software_20231119.csv | 3 + .../software_20231119.result.json | 66 + .../structured_data/some_type_four.json | 54 + .../structured_data/some_type_one.json | 63 + .../structured_data/some_type_three.json | 47 + .../structured_data/some_type_two.json | 140 + ...n_test_file_from_doug_20231106.result.json | 69 + ...bmission_test_file_from_doug_20231106.xlsx | Bin 0 -> 11746 bytes ...bmission_test_file_from_doug_20231130.xlsx | Bin 0 -> 8973 bytes ...ion_test_file_from_doug_20231204_1310.xlsx | Bin 0 -> 14988 bytes ...rmatted_submission_from_doug_20231212.xlsx | Bin 0 -> 56379 bytes ...matted_submission_from_doug_20231212b.xlsx | Bin 0 -> 65112 bytes ..._colo829bl_submission_20231117.result.json | 813 + ...colo829bl_submission_20231117.result.json+ | 809 + ..._uw_gcc_colo829bl_submission_20231117.xlsx | Bin 0 -> 577600 bytes ..._20231117_more_unaligned_reads.result.json | 6573 +++++ ...20231117_more_unaligned_reads.result.json+ | 6573 +++++ ...mission_20231117_more_unaligned_reads.xlsx | Bin 0 -> 577507 bytes .../unaligned_reads_20231120.csv | 4 + .../unaligned_reads_20231120.result.json | 127 + .../structured_data/workflow_20231119.csv | 3 + .../workflow_20231119.result.json | 78 + test/test_structured_data.py | 1528 ++ 39 files changed, 38861 insertions(+), 1 deletion(-) create mode 100644 test/data_files/structured_data/analyte_20231119.csv create mode 100644 test/data_files/structured_data/analyte_20231119.result.json create mode 100644 test/data_files/structured_data/cell_line_20231120.csv create mode 100644 test/data_files/structured_data/cell_line_20231120.result.json create mode 100644 test/data_files/structured_data/file_format_20231119.csv.gz create mode 100644 test/data_files/structured_data/file_format_20231119.result.json create mode 100644 test/data_files/structured_data/library_20231119.csv create mode 100644 test/data_files/structured_data/library_20231119.result.json create mode 100644 test/data_files/structured_data/reference_file.flattened.json create mode 100644 test/data_files/structured_data/reference_file_20231119.csv create mode 100644 test/data_files/structured_data/reference_file_20231119.result.json create mode 100644 test/data_files/structured_data/schemas_dump.json create mode 100644 test/data_files/structured_data/sequencing_20231120.csv create mode 100644 test/data_files/structured_data/sequencing_20231120.result.json create mode 100644 test/data_files/structured_data/software_20231119.csv create mode 100644 test/data_files/structured_data/software_20231119.result.json create mode 100644 test/data_files/structured_data/some_type_four.json create mode 100644 test/data_files/structured_data/some_type_one.json create mode 100644 test/data_files/structured_data/some_type_three.json create mode 100644 test/data_files/structured_data/some_type_two.json create mode 100644 test/data_files/structured_data/submission_test_file_from_doug_20231106.result.json create mode 100644 test/data_files/structured_data/submission_test_file_from_doug_20231106.xlsx create mode 100644 test/data_files/structured_data/submission_test_file_from_doug_20231130.xlsx create mode 100644 test/data_files/structured_data/submission_test_file_from_doug_20231204_1310.xlsx create mode 100644 test/data_files/structured_data/test_uw_formatted_submission_from_doug_20231212.xlsx create mode 100644 test/data_files/structured_data/test_uw_formatted_submission_from_doug_20231212b.xlsx create mode 100644 test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117.result.json create mode 100644 test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117.result.json+ create mode 100644 test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117.xlsx create mode 100644 test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117_more_unaligned_reads.result.json create mode 100644 test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117_more_unaligned_reads.result.json+ create mode 100644 test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117_more_unaligned_reads.xlsx create mode 100644 test/data_files/structured_data/unaligned_reads_20231120.csv create mode 100644 test/data_files/structured_data/unaligned_reads_20231120.result.json create mode 100644 test/data_files/structured_data/workflow_20231119.csv create mode 100644 test/data_files/structured_data/workflow_20231119.result.json create mode 100644 test/test_structured_data.py diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 633f85bc8..4b437629a 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -12,6 +12,7 @@ Change Log * Changes to troubleshooting utility script view-portal-object. * Some reworking of ref lookup in structured_data. * Support ref caching in structured_data. +* Moved/adapted test_structured_data.py from smaht-portal to here. 8.8.0 diff --git a/pyproject.toml b/pyproject.toml index 2ff2f9d83..61e8624c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b6" # TODO: To become 8.8.1 +version = "8.8.0.1b7" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" diff --git a/test/data_files/structured_data/analyte_20231119.csv b/test/data_files/structured_data/analyte_20231119.csv new file mode 100644 index 000000000..a6f89d7f5 --- /dev/null +++ b/test/data_files/structured_data/analyte_20231119.csv @@ -0,0 +1,2 @@ +a260_a280_ratio,components#,concentration,molecule#,protocols#,ribosomal_rna_ratio,rna_integrity_number,rna_integrity_number_instrument,sample_quantity,samples#,submitted_id,uuid,volume,weight,consortia,submission_centers +2.3,Total RNA,1.5,RNA,Protocol9,1.4,8.5,Agilent Bioanalyzer,2.0,Sample9,analyte-9,uuid9,0.9,13.0,smaht|another-consortia,somesubctr diff --git a/test/data_files/structured_data/analyte_20231119.result.json b/test/data_files/structured_data/analyte_20231119.result.json new file mode 100644 index 000000000..063a552cb --- /dev/null +++ b/test/data_files/structured_data/analyte_20231119.result.json @@ -0,0 +1,35 @@ +{ + "Analyte": [ + { + "a260_a280_ratio": 2.3, + "components": [ + "Total RNA" + ], + "concentration": 1.5, + "molecule": [ + "RNA" + ], + "protocols": [ + "Protocol9" + ], + "ribosomal_rna_ratio": 1.4, + "rna_integrity_number": 8.5, + "rna_integrity_number_instrument": "Agilent Bioanalyzer", + "sample_quantity": 2.0, + "samples": [ + "Sample9" + ], + "submitted_id": "analyte-9", + "uuid": "uuid9", + "volume": 0.9, + "weight": 13.0, + "consortia": [ + "smaht", + "another-consortia" + ], + "submission_centers": [ + "somesubctr" + ] + } + ] +} diff --git a/test/data_files/structured_data/cell_line_20231120.csv b/test/data_files/structured_data/cell_line_20231120.csv new file mode 100644 index 000000000..613821210 --- /dev/null +++ b/test/data_files/structured_data/cell_line_20231120.csv @@ -0,0 +1,4 @@ +accession,description,source,submitted_id,tags,title,url,submission_centers +CL000001,Description for Sample Cell Line 1,Vendor A,XY_CELL-LINE_ABC1,tag1|tag2,Sample Cell Line 1,https://vendorA.com/cellline/XY_CELL-LINE_ABC1,some-submission-center-a +CL000002,Description for Sample Cell Line 2,Institution B,XY_CELL-LINE_ABC2,tag3|tag4,Sample Cell Line 2,https://institutionB.com/cellline/XY_CELL-LINE_ABC2,some-submission-center-a|some-submission-center-b +CL000003,Description for Sample Cell Line 3,Vendor C,XY_CELL-LINE_ABC3,tag5|tag6,Sample Cell Line 3,https://vendorC.com/cellline/XY_CELL-LINE_ABC3,some-submission-center-b|some-submission-center-a diff --git a/test/data_files/structured_data/cell_line_20231120.result.json b/test/data_files/structured_data/cell_line_20231120.result.json new file mode 100644 index 000000000..624633ab1 --- /dev/null +++ b/test/data_files/structured_data/cell_line_20231120.result.json @@ -0,0 +1,51 @@ +{ + "CellLine": [ + { + "accession": "CL000001", + "description": "Description for Sample Cell Line 1", + "source": "Vendor A", + "submitted_id": "XY_CELL-LINE_ABC1", + "tags": [ + "tag1", + "tag2" + ], + "title": "Sample Cell Line 1", + "url": "https://vendorA.com/cellline/XY_CELL-LINE_ABC1", + "submission_centers": [ + "some-submission-center-a" + ] + }, + { + "accession": "CL000002", + "description": "Description for Sample Cell Line 2", + "source": "Institution B", + "submitted_id": "XY_CELL-LINE_ABC2", + "tags": [ + "tag3", + "tag4" + ], + "title": "Sample Cell Line 2", + "url": "https://institutionB.com/cellline/XY_CELL-LINE_ABC2", + "submission_centers": [ + "some-submission-center-a", + "some-submission-center-b" + ] + }, + { + "accession": "CL000003", + "description": "Description for Sample Cell Line 3", + "source": "Vendor C", + "submitted_id": "XY_CELL-LINE_ABC3", + "tags": [ + "tag5", + "tag6" + ], + "title": "Sample Cell Line 3", + "url": "https://vendorC.com/cellline/XY_CELL-LINE_ABC3", + "submission_centers": [ + "some-submission-center-b", + "some-submission-center-a" + ] + } + ] +} diff --git a/test/data_files/structured_data/file_format_20231119.csv.gz b/test/data_files/structured_data/file_format_20231119.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..b1ce7d3bf463952e4f1da829e1665e36f85cf164 GIT binary patch literal 273 zcmV+s0q*`EiwFq#!&_wl17>M#WnX4*a&2LBUotQad+39z% zd?^k{m#Qi%dR17;#p9Vsgiznd83?=9EOtRNP(K;4^I!&x-P9v=b8q!B^%KrLnYk;> zq3`Yn+}mhc7+XL;FRk~w2;a8Xt=c#F%0C$%EXv1pKvtzXi)n2Y?7W3iCjyi|j8U!Y XE57~z^Iq*^w2+!FGRKSb<^cczbWVZA literal 0 HcmV?d00001 diff --git a/test/data_files/structured_data/file_format_20231119.result.json b/test/data_files/structured_data/file_format_20231119.result.json new file mode 100644 index 000000000..77975f6ff --- /dev/null +++ b/test/data_files/structured_data/file_format_20231119.result.json @@ -0,0 +1,43 @@ +{ + "FileFormat": [ + { + "identifier": "vcf_gz_tbi", + "status": "public", + "description": "Tabix index file of vcf compressed", + "consortia": [ + "358aed10-9b9d-4e26-ab84-4bd162da182b" + ], + "submission_centers": [ + "9626d82e-8110-4213-ac75-0a50adf890ff" + ], + "standard_file_extension": "vcf.gz.tbi" + }, + { + "identifier": "txt", + "status": "public", + "description": "This format is used for aligned reads", + "consortia": [ + "358aed10-9b9d-4e26-ab84-4bd162da182b" + ], + "submission_centers": [ + "9626d82e-8110-4213-ac75-0a50adf890ff" + ], + "standard_file_extension": "txt" + }, + { + "identifier": "vcf", + "status": "public", + "description": "vcf compressed", + "consortia": [ + "358aed10-9b9d-4e26-ab84-4bd162da182b" + ], + "submission_centers": [ + "9626d82e-8110-4213-ac75-0a50adf890ff" + ], + "standard_file_extension": "vcf", + "other_allowed_extensions": [ + "foobar" + ] + } + ] +} diff --git a/test/data_files/structured_data/library_20231119.csv b/test/data_files/structured_data/library_20231119.csv new file mode 100644 index 000000000..00f94337f --- /dev/null +++ b/test/data_files/structured_data/library_20231119.csv @@ -0,0 +1,4 @@ +a260_a280_ratio,adapter_name,adapter_sequence,amplification_cycles,amplification_end_mass,amplification_start_mass,analyte,analyte_weight,barcode_sequences,consortia#,fragment_maximum_length,fragment_mean_length,fragment_minimum_length,fragment_standard_deviation_length,insert_maximum_length,insert_mean_length,insert_minimum_length,insert_standard_deviation_length,library_preparation,preparation_date,protocols,submission_centers#,submitted_id,uuid, +1.8,Adapter1,ATCGATCG,10,100,50,sample-analyte-1,5,BC001|BC002,Consortium1,500,300,100,50,450,250,80,40,,2023-01-01,protocol1,somesubctr,XY_LIBRARY_ABC1,uuid1, +1.9,Adapter2,GCTAGCTA,12,120,60,sample-analyte-2,6,BC003|BC004,,550,320,110,55,500,280,90,45,prep2,2023-02-01,,Center1,XY_LIBRARY_ABC2,uuid2, +2.0,Adapter3,TGCATGCA,15,150,70,sample-analyte-3,7,BC005|BC006,Consortium2,600,350,120,60,550,320,100,50,,2023-03-01,protocol3,anothersubctr,XY_LIBRARY_ABC3,uuid3, diff --git a/test/data_files/structured_data/library_20231119.result.json b/test/data_files/structured_data/library_20231119.result.json new file mode 100644 index 000000000..6eac66049 --- /dev/null +++ b/test/data_files/structured_data/library_20231119.result.json @@ -0,0 +1,92 @@ +{ + "Library": [ + { + "a260_a280_ratio": 1.8, + "adapter_name": "Adapter1", + "adapter_sequence": "ATCGATCG", + "amplification_cycles": 10, + "amplification_end_mass": 100.0, + "amplification_start_mass": 50.0, + "analyte": "sample-analyte-1", + "analyte_weight": 5.0, + "barcode_sequences": "BC001|BC002", + "consortia": [ + "Consortium1" + ], + "fragment_maximum_length": 500, + "fragment_mean_length": 300.0, + "fragment_minimum_length": 100, + "fragment_standard_deviation_length": 50.0, + "insert_maximum_length": 450, + "insert_mean_length": 250.0, + "insert_minimum_length": 80, + "insert_standard_deviation_length": 40.0, + "preparation_date": "2023-01-01", + "submission_centers": [ + "somesubctr" + ], + "protocols": [ + "protocol1" + ], + "submitted_id": "XY_LIBRARY_ABC1", + "uuid": "uuid1" + }, + { + "a260_a280_ratio": 1.9, + "adapter_name": "Adapter2", + "adapter_sequence": "GCTAGCTA", + "amplification_cycles": 12, + "amplification_end_mass": 120.0, + "amplification_start_mass": 60.0, + "analyte": "sample-analyte-2", + "analyte_weight": 6.0, + "barcode_sequences": "BC003|BC004", + "fragment_maximum_length": 550, + "fragment_mean_length": 320.0, + "fragment_minimum_length": 110, + "fragment_standard_deviation_length": 55.0, + "insert_maximum_length": 500, + "insert_mean_length": 280.0, + "insert_minimum_length": 90, + "insert_standard_deviation_length": 45.0, + "library_preparation": "prep2", + "preparation_date": "2023-02-01", + "submission_centers": [ + "Center1" + ], + "submitted_id": "XY_LIBRARY_ABC2", + "uuid": "uuid2" + }, + { + "a260_a280_ratio": 2.0, + "adapter_name": "Adapter3", + "adapter_sequence": "TGCATGCA", + "amplification_cycles": 15, + "amplification_end_mass": 150.0, + "amplification_start_mass": 70.0, + "analyte": "sample-analyte-3", + "analyte_weight": 7.0, + "barcode_sequences": "BC005|BC006", + "consortia": [ + "Consortium2" + ], + "fragment_maximum_length": 600, + "fragment_mean_length": 350.0, + "fragment_minimum_length": 120, + "fragment_standard_deviation_length": 60.0, + "insert_maximum_length": 550, + "insert_mean_length": 320.0, + "insert_minimum_length": 100, + "insert_standard_deviation_length": 50.0, + "preparation_date": "2023-03-01", + "submission_centers": [ + "anothersubctr" + ], + "protocols": [ + "protocol3" + ], + "submitted_id": "XY_LIBRARY_ABC3", + "uuid": "uuid3" + } + ] +} diff --git a/test/data_files/structured_data/reference_file.flattened.json b/test/data_files/structured_data/reference_file.flattened.json new file mode 100644 index 000000000..ce77d2ff5 --- /dev/null +++ b/test/data_files/structured_data/reference_file.flattened.json @@ -0,0 +1,170 @@ +{ + "schema_version": { + "type": "string", + "map": "" + }, + "accession": { + "type": "string", + "map": "" + }, + "status": { + "type": "string", + "map": "" + }, + "file_format": { + "type": "string", + "map": "" + }, + "filename": { + "type": "string", + "map": "" + }, + "file_size": { + "type": "integer", + "map": "" + }, + "md5sum": { + "type": "string", + "map": "" + }, + "content_md5sum": { + "type": "string", + "map": "" + }, + "quality_metrics#": { + "type": "string", + "map": "" + }, + "quality_metrics": "quality_metrics#", + "data_category#": { + "type": "string", + "map": "" + }, + "data_category": "data_category#", + "data_type#": { + "type": "string", + "map": "" + }, + "data_type": "data_type#", + "o2_path": { + "type": "string", + "map": "" + }, + "variant_type#": { + "type": "string", + "map": "" + }, + "variant_type": "variant_type#", + "uuid": { + "type": "string", + "map": "" + }, + "tags#": { + "type": "string", + "map": "" + }, + "tags": "tags#", + "date_created": { + "type": "string", + "map": "" + }, + "submitted_by": { + "type": "string", + "map": "" + }, + "last_modified.date_modified": { + "type": "string", + "map": "" + }, + "last_modified.modified_by": { + "type": "string", + "map": "" + }, + "description": { + "type": "string", + "map": "" + }, + "submission_centers#": { + "type": "string", + "map": "" + }, + "submission_centers": "submission_centers#", + "consortia#": { + "type": "string", + "map": "" + }, + "consortia": "consortia#", + "aliases#": { + "type": "string", + "map": "" + }, + "aliases": "aliases#", + "alternate_accessions#": { + "type": "string", + "map": "" + }, + "alternate_accessions": "alternate_accessions#", + "extra_files#.file_format": { + "type": "string", + "map": "" + }, + "extra_files.file_format": "extra_files#.file_format", + "extra_files#.file_size": { + "type": "integer", + "map": "" + }, + "extra_files.file_size": "extra_files#.file_size", + "extra_files#.filename": { + "type": "string", + "map": "" + }, + "extra_files.filename": "extra_files#.filename", + "extra_files#.href": { + "type": "string", + "map": "" + }, + "extra_files.href": "extra_files#.href", + "extra_files#.md5sum": { + "type": "string", + "map": "" + }, + "extra_files.md5sum": "extra_files#.md5sum", + "extra_files#.status": { + "type": "string", + "map": "" + }, + "extra_files.status": "extra_files#.status", + "@id": { + "type": "string", + "map": "" + }, + "@type#": { + "type": "string", + "map": "" + }, + "@type": "@type#", + "principals_allowed.view": { + "type": "string", + "map": "" + }, + "principals_allowed.edit": { + "type": "string", + "map": "" + }, + "display_title": { + "type": "string", + "map": "" + }, + "href": { + "type": "string", + "map": "" + }, + "upload_credentials": { + "type": "object", + "map": null + }, + "upload_key": { + "type": "string", + "map": "" + } +} diff --git a/test/data_files/structured_data/reference_file_20231119.csv b/test/data_files/structured_data/reference_file_20231119.csv new file mode 100644 index 000000000..0029950b3 --- /dev/null +++ b/test/data_files/structured_data/reference_file_20231119.csv @@ -0,0 +1,2 @@ +aliases,data_category,data_type,extra_files#.file_format,extra_files#.file_size,extra_files#.file_format,extra_files#.file_size,file_format,submission_centers#,uuid +some:alias,Variant Calls,Aligned Reads,BAM,1024,VCF,512,FASTA,Center1,1874B4CE-CC2B-4092-A249-4F3BFFD724C0 diff --git a/test/data_files/structured_data/reference_file_20231119.result.json b/test/data_files/structured_data/reference_file_20231119.result.json new file mode 100644 index 000000000..5c095ca00 --- /dev/null +++ b/test/data_files/structured_data/reference_file_20231119.result.json @@ -0,0 +1,26 @@ +{ + "ReferenceFile": [ + { + "aliases": [ + "some:alias" + ], + "data_category": [ + "Variant Calls" + ], + "data_type": [ + "Aligned Reads" + ], + "extra_files": [ + { + "file_format": "VCF", + "file_size": 512 + } + ], + "file_format": "FASTA", + "submission_centers": [ + "Center1" + ], + "uuid": "1874B4CE-CC2B-4092-A249-4F3BFFD724C0" + } + ] +} diff --git a/test/data_files/structured_data/schemas_dump.json b/test/data_files/structured_data/schemas_dump.json new file mode 100644 index 000000000..c52c10415 --- /dev/null +++ b/test/data_files/structured_data/schemas_dump.json @@ -0,0 +1,21378 @@ +{ + "AccessKey": { + "title": "Access Key", + "$id": "/profiles/access_key.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [], + "identifyingProperties": [ + "access_key_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "access_key_id": { + "title": "Access key ID", + "comment": "Only admins are allowed to set this value.", + "type": "string", + "uniqueKey": true, + "permission": "restricted_fields", + "readonly": true + }, + "expiration_date": { + "title": "Expiration Date", + "comment": "Only admins are allowed to set this value.", + "type": "string", + "permission": "restricted_fields", + "readonly": true + }, + "secret_access_key_hash": { + "title": "Secret access key Hash", + "type": "string", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "current", + "enum": [ + "current", + "deleted" + ], + "permission": "restricted_fields", + "readonly": true + }, + "user": { + "title": "User", + "type": "string", + "linkTo": "User" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/AccessKey", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "AlignedReads": { + "title": "Aligned Reads", + "$id": "/profiles/aligned_reads.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "data_category", + "data_type", + "file_format", + "file_sets", + "filename", + "reference_genome", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/reference_genome" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "file.json#/properties" + }, + { + "$ref": "submitted_file.json#/properties" + } + ], + "properties": { + "schema_version": { + "default": "1", + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [] + }, + "derived_from": { + "title": "Derived From", + "description": "Files used as input to create this file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmittedFile" + } + }, + "file_sets": { + "title": "File Sets", + "description": "File collections associated with this file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "FileSet" + } + }, + "software": { + "title": "Software", + "description": "Software used to create this file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Software" + } + }, + "accession": { + "accessionType": "AR", + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "uploading", + "enum": [ + "uploading", + "uploaded", + "upload failed", + "to be uploaded by workflow", + "released", + "in review", + "obsolete", + "archived", + "deleted", + "public" + ] + }, + "file_format": { + "ff_flag": "filter:valid_item_types", + "linkTo": "FileFormat", + "title": "File Format", + "type": "string" + }, + "filename": { + "description": "The local file name used at time of submission. Must be alphanumeric, with the exception of the following special characters: '+=,.@-_'", + "pattern": "^[\\w+=,.@-]*$", + "title": "File Name", + "type": "string" + }, + "file_size": { + "comment": "File size is specified in bytes - presumably this can be a calculated property as well", + "description": "Size of file on disk", + "exclude_from": [ + "FFedit-create" + ], + "permission": "restricted_fields", + "title": "File Size", + "type": "integer", + "readonly": true + }, + "md5sum": { + "comment": "This can vary for files of same content gzipped at different times", + "description": "The MD5 checksum of the file being transferred", + "exclude_from": [ + "FFedit-create" + ], + "format": "hex", + "permission": "restricted_fields", + "title": "MD5 Checksum", + "type": "string", + "readonly": true + }, + "content_md5sum": { + "comment": "This is only relavant for gzipped files", + "description": "The MD5 checksum of the uncompressed file", + "exclude_from": [ + "FFedit-create" + ], + "format": "hex", + "permission": "restricted_fields", + "title": "Content MD5 Checksum", + "type": "string", + "uniqueKey": "file:content_md5sum", + "readonly": true + }, + "quality_metrics": { + "description": "Associated QC reports", + "items": { + "description": "Associated QC report", + "linkTo": "QualityMetric", + "title": "Quality Metric", + "type": "string" + }, + "minItems": 1, + "permission": "restricted_fields", + "title": "Quality Metrics", + "type": "array", + "uniqueItems": true, + "readonly": true + }, + "data_category": { + "title": "Data Category", + "description": "Category for information in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Sequencing Reads" + ] + } + }, + "data_type": { + "title": "Data Type", + "description": "Detailed type of information in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Aligned Reads" + ] + } + }, + "o2_path": { + "title": "O2 Path", + "description": "Path to file on O2", + "type": "string" + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "reference_genome": { + "title": "Reference Genome", + "description": "Reference genome used for alignment", + "type": "string", + "linkTo": "ReferenceGenome" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + }, + "href": { + "title": "Download URL", + "type": "string", + "description": "Use this link to download this file", + "calculatedProperty": true + }, + "upload_credentials": { + "type": "object", + "calculatedProperty": true + }, + "upload_key": { + "title": "Upload Key", + "type": "string", + "description": "File object name in S3", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/AlignedReads", + "children": [], + "rdfs:subClassOf": "/profiles/SubmittedFile.json", + "isAbstract": false + }, + "Analyte": { + "title": "Analyte", + "$id": "/profiles/analyte.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "components", + "molecule", + "samples", + "submission_centers", + "submitted_id" + ], + "dependentRequired": { + "rna_integrity_number": [ + "rna_integrity_number_instrument" + ], + "rna_integrity_number_instrument": [ + "rna_integrity_number" + ] + }, + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/protocols" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "protocols": { + "title": "Protocols", + "description": "Protocols providing experimental details", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Protocol" + } + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "AN", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "a260_a280_ratio": { + "title": "A260/A280 Ratio", + "description": "Ratio of nucleic acid absorbance at 260 nm and 280 nm, used to determine a measure of DNA purity", + "type": "number", + "minimum": 0 + }, + "components": { + "title": "Components", + "description": "Biological features included in the analyte", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Total DNA", + "mRNA", + "tRNA", + "rRNA", + "MicroRNA", + "Total RNA" + ] + } + }, + "concentration": { + "title": "Concentration", + "description": "Analyte concentration (mg/mL)", + "type": "number", + "minimum": 0 + }, + "molecule": { + "title": "Molecule", + "description": "Molecule of interest for the analyte", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "DNA", + "RNA" + ] + } + }, + "ribosomal_rna_ratio": { + "title": "Ribosomal RNA Ratio", + "description": "The 28S/18S ribosomal RNA band ratio used to assess the quality of total RNA", + "type": "number", + "minimum": 0 + }, + "rna_integrity_number": { + "title": "RNA Integrity Number", + "description": "Assessment of the integrity of RNA based on electrophoresis", + "type": "number", + "minimum": 1, + "maximum": 10 + }, + "rna_integrity_number_instrument": { + "title": "RIN Instrument", + "description": "Instrument used for RIN assessment", + "type": "string", + "enum": [ + "Agilent Bioanalyzer", + "Caliper Life Sciences LabChip GX" + ] + }, + "sample_quantity": { + "title": "Sample Quantity", + "description": "The amount of sample used to generate the analyte (mg)", + "type": "number", + "minimum": 0 + }, + "volume": { + "title": "Volume", + "description": "Analyte volume (mL)", + "type": "number", + "minimum": 0 + }, + "weight": { + "title": "Weight", + "description": "Analyte weight (mg)", + "type": "number", + "minimum": 0 + }, + "analyte_preparation": { + "title": "Analyte Preparation", + "description": "Link to associated analyte preparation", + "type": "string", + "linkTo": "AnalytePreparation" + }, + "samples": { + "title": "Samples", + "description": "Link to associated samples", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Sample" + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Analyte", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "AnalytePreparation": { + "title": "Analyte Preparation", + "$id": "/profiles/analyte_preparation.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "AP", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "cell_lysis_method": { + "title": "Cell Lysis Method", + "description": "Cell lysis method for analyte extraction", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Chemical", + "Enzymatic", + "Mechanical", + "Thermal" + ] + } + }, + "extraction_method": { + "title": "Extraction Method", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Magnetic Beads", + "Not Applicable", + "Organic Chemicals", + "Silica Column" + ] + } + }, + "preparation_kits": { + "title": "Preparation Kits", + "description": "Links to associated preparation kit", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "PreparationKit" + } + }, + "treatments": { + "title": "Treatments", + "description": "Links to associated treatments", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Treatment" + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/AnalytePreparation", + "children": [], + "rdfs:subClassOf": "/profiles/Preparation.json", + "isAbstract": false + }, + "CellCulture": { + "title": "Cell Culture", + "$id": "/profiles/cell_culture.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "cell_line", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/protocols" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "sample_source.json#/properties" + } + ], + "properties": { + "accession": { + "accessionType": "CC", + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "readonly": true + }, + "schema_version": { + "default": "1", + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [] + }, + "sample_count": { + "title": "Sample Count", + "description": "Number of samples produced for this source", + "type": "integer", + "minimum": 1 + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "protocols": { + "title": "Protocols", + "description": "Protocols providing experimental details", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Protocol" + } + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "culture_duration": { + "title": "Culture Duration", + "description": "Total number of culturing days", + "type": "integer", + "minimum": 0 + }, + "culture_harvest_date": { + "title": "Culture Harvest Date", + "description": "YYYY-MM-DD format date for cell culture harvest", + "type": "string", + "format": "date" + }, + "culture_start_date": { + "title": "Culture Start Date", + "description": "YYYY-MM-DD format date for cell culture start date", + "type": "string", + "format": "date" + }, + "doubling_number": { + "title": "Doubling Number", + "description": "Number of times the population has doubled since the time of culture start date until harvest", + "type": "integer", + "minimum": 0 + }, + "doubling_time": { + "title": "Doubling Time", + "description": "Average time from culture start date until harvest it takes for the population to double (hours)", + "type": "number", + "minimum": 0 + }, + "growth_medium": { + "title": "Growth Medium", + "description": "Medium used for cell culture", + "type": "string" + }, + "karyotype": { + "title": "Karyotype", + "description": "Chromosome count and any noted rearrangements or copy number variation", + "type": "string" + }, + "lot_number": { + "title": "Lot Number", + "description": "Lot number of cell line", + "type": "integer", + "minimum": 0 + }, + "passage_number": { + "title": "Passage Number", + "description": "Number of times the cell line has been passaged since the culture start date until harvest", + "type": "integer", + "minimum": 0 + }, + "cell_line": { + "title": "Cell Line", + "description": "Cell line used for the cell culture", + "type": "string", + "linkTo": "CellLine" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/CellCulture", + "children": [], + "rdfs:subClassOf": "/profiles/SampleSource.json", + "isAbstract": false + }, + "CellCultureMixture": { + "title": "Cell Culture Mixture", + "$id": "/profiles/cell_culture_mixture.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "components", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/protocols" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "protocols": { + "title": "Protocols", + "description": "Protocols providing experimental details", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Protocol" + } + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "CM", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "components": { + "title": "Components", + "description": "Cultures in the mixture and their corresponding ratios", + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "ratio", + "cell_culture" + ], + "properties": { + "ratio": { + "title": "Ratio", + "description": "Ratio of the cell culture to the total mixture (percentage)", + "type": "number", + "minimum": 0 + }, + "cell_culture": { + "title": "Cell Culture", + "description": "Link to associated cell culture", + "type": "string", + "linkTo": "CellCulture" + } + } + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/CellCultureMixture", + "children": [], + "rdfs:subClassOf": "/profiles/SampleSource.json", + "isAbstract": false + }, + "CellCultureSample": { + "title": "Cell Culture Sample", + "$id": "/profiles/cell_culture_sample.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "preservation_type", + "sample_sources", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/protocols" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "sample.json#/properties" + } + ], + "properties": { + "accession": { + "accessionType": "CU", + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "readonly": true + }, + "schema_version": { + "default": "1", + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [] + }, + "preservation_medium": { + "title": "Preservation Medium", + "description": "Medium used for sample preservation", + "type": "string", + "enum": [ + "TBD" + ] + }, + "preservation_type": { + "title": "Preservation Type", + "description": "Method of sample preservation", + "type": "string", + "enum": [ + "Fresh", + "Frozen" + ] + }, + "sample_preparation": { + "title": "Sample Preparation", + "description": "Link to associated sample preparation", + "type": "string", + "linkTo": "SamplePreparation" + }, + "sample_sources": { + "title": "Sample Sources", + "description": "Link to associated sample sources", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "CellCulture" + }, + "maxItems": 1 + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "protocols": { + "title": "Protocols", + "description": "Protocols providing experimental details", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Protocol" + } + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/CellCultureSample", + "children": [], + "rdfs:subClassOf": "/profiles/Sample.json", + "isAbstract": false + }, + "CellLine": { + "title": "Cell Line", + "$id": "/profiles/cell_line.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "source", + "submission_centers", + "submitted_id", + "title" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "CL", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "source": { + "title": "Source", + "description": "Source of the cells (vendor or institution)", + "type": "string" + }, + "url": { + "title": "Url", + "description": "URL for vendor information on the cell line", + "type": "string", + "format": "uri" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/CellLine", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "CellSample": { + "title": "Cell Sample", + "$id": "/profiles/cell_sample.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "cell_ontology_id", + "preservation_type", + "sample_sources", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/protocols" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "sample.json#/properties" + } + ], + "properties": { + "accession": { + "accessionType": "CS", + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "readonly": true + }, + "schema_version": { + "default": "1", + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [] + }, + "preservation_medium": { + "title": "Preservation Medium", + "description": "Medium used for sample preservation", + "type": "string", + "enum": [ + "TBD" + ] + }, + "preservation_type": { + "title": "Preservation Type", + "description": "Method of sample preservation", + "type": "string", + "enum": [ + "Fresh", + "Frozen" + ] + }, + "sample_preparation": { + "title": "Sample Preparation", + "description": "Link to associated sample preparation", + "type": "string", + "linkTo": "SamplePreparation" + }, + "sample_sources": { + "title": "Sample Sources", + "description": "Link to associated sample sources", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SampleSource" + } + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "protocols": { + "title": "Protocols", + "description": "Protocols providing experimental details", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Protocol" + } + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "cell_count": { + "title": "Cell Count", + "description": "Number of cells collected", + "type": "integer", + "minimum": 0 + }, + "cell_ontology_id": { + "title": "Cell Ontology ID", + "description": "Cell Ontology identifier for the cell sample", + "type": "string", + "pattern": "^CL:[0-9]{7}$" + }, + "parent_samples": { + "title": "Parent Samples", + "desscription": "Samples from which the cells were isolated", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Sample" + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/CellSample", + "children": [], + "rdfs:subClassOf": "/profiles/Sample.json", + "isAbstract": false + }, + "Consortium": { + "title": "Consortium", + "$id": "/profiles/consortium.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "required": [ + "identifier", + "title" + ], + "identifyingProperties": [ + "aliases", + "identifier", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/identifier" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/url" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "type": "object", + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "url": { + "title": "URL", + "description": "An external resource with additional information about the item", + "type": "string", + "format": "uri" + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "released", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "identifier": { + "title": "Identifier", + "description": "Unique, identifying name for the item", + "type": "string", + "uniqueKey": true, + "pattern": "^[A-Za-z0-9-_]+$", + "minLength": 2, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Consortium", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "DeathCircumstances": { + "title": "Death Circumstances", + "$id": "/profiles/death_circumstances.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "donor", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "DC", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "autopsy_by_official": { + "title": "Autopsy By Official", + "description": "Whether an autopsy was performed by a licensed official", + "type": "string", + "enum": [ + "Yes", + "No", + "Unknown" + ] + }, + "blood_transfusion": { + "title": "Blood Transfusion", + "description": "Whether donor received a blood transfusion within 48 hours of death", + "type": "string", + "enum": [ + "Yes", + "No", + "Unknown" + ] + }, + "blood_transfusion_products": { + "title": "Blood Transfusion Products", + "description": "Blood transfusion products received by donor within 48 hours", + "type": "array", + "uniqueItems": true, + "minItems": 1, + "items": { + "type": "string", + "enum": [ + "Cryoprecipitate", + "Fresh Frozen PlasmaPacked Red Blood Cells", + "Platelets" + ] + } + }, + "brain_death_datetime": { + "title": "Brain Death Datetime", + "description": "Date and time when brain death was determined for the donor", + "type": "string", + "format": "date-time" + }, + "cardiac_cessation_datetime": { + "title": "Cardiac Cessation Datetime", + "description": "Date and time when cardiac activity was determined to have ceased for the donor", + "type": "string", + "format": "date-time" + }, + "cause_of_death_immediate": { + "title": "Cause Of Death Immediate", + "description": "Immediate cause of death", + "type": "string" + }, + "cause_of_death_immediate_interval": { + "title": "Cause Of Death Immediate Interval", + "description": "Interval of time from immediate cause of death to death in minutes", + "type": "number", + "minimum": 0 + }, + "cause_of_death_initial": { + "title": "Cause Of Death Initial", + "description": "Initial cause of death", + "type": "string" + }, + "cause_of_death_initial_interval": { + "title": "Cause Of Death Initial Interval", + "description": "Interval of time from initial cause of death to death in minutes", + "type": "number", + "minimum": 0 + }, + "cause_of_death_last_underlying": { + "title": "Cause Of Death Last Underlying", + "description": "Last underlying cause of death", + "type": "string" + }, + "cause_of_death_last_underlying_interval": { + "title": "Cause Of Death Last Underlying Interval", + "description": "Interval of time from last underlying cause of death to death in minutes", + "type": "number" + }, + "cause_of_death_official": { + "title": "Cause Of Death Official", + "description": "Official cause of death", + "type": "string" + }, + "city_of_death": { + "title": "City Of Death", + "description": "City of death of the donor", + "type": "string" + }, + "country_of_death": { + "title": "Country Of Death", + "description": "Country of death of the donor", + "type": "string" + }, + "death_certificate_available": { + "title": "Death Certificate Available", + "description": "Whether a death certificate is available for the donor", + "type": "string", + "enum": [ + "Yes", + "No", + "Unknown" + ] + }, + "death_pronounced_datetime": { + "title": "Death Pronounced Datetime", + "description": "Date and time when death of the donor was pronounced", + "type": "string", + "format": "date-time" + }, + "death_pronounced_interval": { + "title": "Death Pronounced Interval", + "description": "Interval of time from death until death was pronounced in minutes", + "type": "number", + "minimum": 0 + }, + "determiner_of_death": { + "title": "Determiner Of Death", + "description": "If death occurred outside hospital, role of person who determined death of the donor", + "type": "string", + "enum": [ + "TBD" + ] + }, + "hardy_scale": { + "title": "Hardy Scale", + "description": "Death classification based on the 4-point Hardy Scale", + "type": "integer", + "minimum": 1, + "maximum": 4 + }, + "icd_10_category": { + "title": "Icd 10 Category", + "description": "Category of death based on ICD-10 coding", + "type": "string" + }, + "icd_10_cause": { + "title": "Icd 10 Cause", + "description": "Specific cause of death based on ICD-10 coding ", + "type": "string" + }, + "icd_10_classification": { + "title": "Icd 10 Classification", + "description": "Classification of death based on ICD-10 coding ", + "type": "string" + }, + "icd_10_code": { + "title": "Icd 10 Code", + "description": "ICD-10 Code for cause of death", + "type": "string" + }, + "last_seen_alive_datetime": { + "title": "Last Seen Alive Datetime", + "description": "Date and time when the donor was last known to be alive", + "type": "string", + "format": "date-time" + }, + "manner_of_death": { + "title": "Manner Of Death", + "description": "Manner of death of the donor", + "type": "string", + "enum": [ + "TBD" + ] + }, + "place_of_death": { + "title": "Place Of Death", + "description": "Place of death of the donor", + "type": "string", + "enum": [ + "TBD" + ] + }, + "presumed_cardiac_cessation_datetime": { + "title": "Presumed Cardiac Cessation Datetime", + "description": "Date and time when cardiac activity was presumed to have ceased for the donor", + "type": "string", + "format": "date-time" + }, + "ventilator_at_death": { + "title": "Ventilator At Death", + "description": "Whether the donor was on a ventilator immediately prior to death", + "type": "string", + "enum": [ + "Yes", + "No", + "Unknown" + ] + }, + "ventilator_time": { + "title": "Ventilator Time", + "description": "Time in minutes the donor was on a ventilator prior to death", + "type": "number", + "minimum": 0 + }, + "witnessed_death": { + "title": "Witnessed Death", + "description": "Whether the death of the donor was witnessed directly", + "type": "string", + "enum": [ + "Yes", + "No", + "Unknown" + ] + }, + "donor": { + "title": "Donor", + "description": "Link to the associated donor", + "type": "string", + "linkTo": "Donor" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/DeathCircumstances", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "Demographic": { + "title": "Demographic", + "$id": "/profiles/demographic.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "donor", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "DG", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "city_of_birth": { + "title": "City Of Birth", + "description": "The birth city of the donor", + "type": "string" + }, + "country_of_birth": { + "title": "Country Of Birth", + "description": "The birth country of the donor", + "type": "string" + }, + "ethnicity": { + "title": "Ethnicity", + "description": "The ethnicity of the donor", + "type": "string", + "enum": [ + "Hispanic or Latino", + "Not Hispanic or Latino", + "Not Reported" + ] + }, + "occupation": { + "title": "Occupation", + "description": "The primary occupation of the donor", + "type": "string" + }, + "race": { + "title": "Race", + "description": "The race of the donor", + "type": "string", + "enum": [ + "American Indian or Alaska Native", + "Asian", + "Black or African American", + "Hispanic or Latino", + "Native Hawaiian or other Pacific Islander", + "White", + "Not Reported" + ] + }, + "donor": { + "title": "Donor", + "description": "Link to the associated donor", + "type": "string", + "linkTo": "Donor" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Demographic", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "Diagnosis": { + "title": "Diagnosis", + "$id": "/profiles/diagnosis.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "disease", + "medical_history", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "DX", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "age_at_diagnosis": { + "title": "Age At Diagnosis", + "description": "Age when the disease was diagnosed", + "type": "integer", + "minimum": 0 + }, + "age_at_resolution": { + "title": "Age At Resolution", + "description": "Age when the disease was determined to have resolved", + "type": "integer", + "minimum": 0 + }, + "comments": { + "title": "Comments", + "description": "Additional information on the diagnosis", + "type": "string" + }, + "disease": { + "title": "Disease", + "description": "Link to associated disease ontology term", + "type": "string", + "linkTo": "OntologyTerm" + }, + "medical_history": { + "title": "Medical History", + "description": "Link to the associated medical history", + "type": "string", + "linkTo": "MedicalHistory" + }, + "therapeutics": { + "title": "Therapeutics", + "description": "Links to associated therapeutics for the disease", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Therapeutic" + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Diagnosis", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "Document": { + "title": "Document", + "description": "Data content and metadata, typically for simple files (text, pdf, etc.)", + "$id": "/profiles/document.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "aliases", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attachment" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "attachment": { + "title": "Attached File", + "description": "File attached to this Item.", + "type": "object", + "additionalProperties": false, + "formInput": "file", + "attachment": true, + "ff_flag": "clear clone", + "properties": { + "download": { + "title": "File Name", + "description": "File Name of the attachment.", + "type": "string" + }, + "href": { + "internal_comment": "Internal webapp URL for document file", + "title": "href", + "description": "Path to download the file attached to this Item.", + "type": "string" + }, + "type": { + "title": "Media Type", + "type": "string", + "enum": [ + "application/msword", + "application/vnd.ms-excel", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/pdf", + "application/zip", + "application/proband+xml", + "text/plain", + "text/tab-separated-values", + "image/jpeg", + "image/tiff", + "image/gif", + "text/html", + "image/png", + "image/svs", + "text/autosql" + ] + }, + "md5sum": { + "title": "MD5 Checksum", + "description": "Use this to ensure that your file was downloaded without errors or corruption.", + "type": "string", + "format": "md5sum" + }, + "size": { + "title": "Attachment size", + "description": "Size of the attachment on disk", + "type": "integer" + }, + "width": { + "title": "Image width", + "description": "Width of the image attached, in pixels.", + "type": "integer" + }, + "height": { + "title": "Image height", + "description": "Height of the image attached, in pixels.", + "type": "integer" + }, + "blob_id": { + "title": "Blob ID", + "type": "string", + "internal_comment": "blob storage ID. Use to like with s3/rds" + } + } + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Document", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "Donor": { + "title": "Donor", + "$id": "/profiles/donor.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "age", + "sex", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "DO", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "age": { + "title": "Age", + "description": "Age of the donor in years", + "type": "integer", + "minimum": 0 + }, + "body_mass_index": { + "title": "Body Mass Index", + "description": "Body mass index of the donor (m/kg^2)", + "type": "number", + "minimum": 0 + }, + "height": { + "title": "Height", + "description": "Height of the donor in meters", + "type": "number", + "minimum": 0 + }, + "sex": { + "title": "Sex", + "description": "Sex of the donor", + "type": "string", + "enum": [ + "Male", + "Female", + "Unknown" + ] + }, + "weight": { + "title": "Weight", + "description": "Weight of the donor in kilograms", + "type": "number", + "minimum": 0 + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Donor", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "Exposure": { + "title": "Exposure", + "$id": "/profiles/exposure.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "medical_history", + "submission_centers", + "submitted_id", + "substance" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "EX", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "age_at_exposure_end": { + "title": "Age At Exposure End", + "description": "Age when the exposure resolved in years", + "type": "number", + "minimum": 0 + }, + "age_at_exposure_start": { + "title": "Age At Exposure Start", + "description": "Age when the exposure began in years", + "type": "number", + "minimum": 0 + }, + "comments": { + "title": "Comments", + "description": "Additional information on the exposure", + "type": "string" + }, + "medical_history": { + "title": "Medical History", + "description": "Link to the associated medical history", + "type": "string", + "linkTo": "MedicalHistory" + }, + "substance": { + "title": "Substance", + "description": "Link to the associated ontology term for the substance to which the donor was exposed", + "type": "string", + "linkTo": "OntologyTerm" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Exposure", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "FileFormat": { + "title": "File Format", + "description": "Data format for a file", + "$id": "/profiles/file_format.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "identifier", + "standard_file_extension" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "aliases", + "identifier", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/identifier" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "identifier": { + "title": "Identifier", + "description": "Unique, identifying name for the item", + "type": "string", + "uniqueKey": true, + "pattern": "^[A-Za-z0-9-_]+$", + "minLength": 2, + "permission": "restricted_fields", + "readonly": true + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "standard_file_extension": { + "description": "Standard extension added to files for download", + "permission": "restricted_fields", + "title": "Standard File Extension", + "type": "string", + "readonly": true + }, + "other_allowed_extensions": { + "description": "Additional allowable extensions for uploading files of this format", + "items": { + "title": "OK Extension", + "type": "string" + }, + "minItems": 1, + "permission": "restricted_fields", + "title": "Allowed Extensions", + "type": "array", + "uniqueItems": true, + "readonly": true + }, + "extra_file_formats": { + "items": { + "description": "A file format for an extra file", + "linkTo": "FileFormat", + "title": "Format", + "type": "string" + }, + "minItems": 1, + "permission": "restricted_fields", + "title": "Extra File Formats", + "type": "array", + "uniqueItems": true, + "readonly": true + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/FileFormat", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "FileSet": { + "title": "File Set", + "$id": "/profiles/file_set.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "libraries", + "sequencing", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/protocols" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "protocols": { + "title": "Protocols", + "description": "Protocols providing experimental details", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Protocol" + } + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "FS", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "libraries": { + "title": "Libraries", + "description": "Links to associated libraries", + "type": "array", + "minItems": 1, + "maxItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Library" + } + }, + "sequencing": { + "title": "Sequencing", + "description": "Link to associated sequencing", + "type": "string", + "linkTo": "Sequencing" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/FileSet", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "FilterSet": { + "title": "Filter Set", + "description": "Item for encapsulating multiple queries", + "$id": "/profiles/filter_set.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "title" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "aliases", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "draft", + "permission": "restricted_fields", + "enum": [ + "shared", + "obsolete", + "current", + "inactive", + "in review", + "draft", + "deleted" + ], + "notes": "Unlike the status definition in mixins, this lacks permission:restricted_fields so people may edit FilterSet statuses they've saved.", + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "filter_blocks": { + "title": "Filter Blocks", + "description": "Filter queries that will be joined.", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "title": "Filter Block", + "type": "object", + "properties": { + "name": { + "title": "Name", + "type": "string", + "description": "Name of the filter block" + }, + "query": { + "title": "Single query", + "description": "URL Query string", + "type": "string" + }, + "flags_applied": { + "title": "Flags applied", + "description": "Flag names that will be applied to this filter block", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "title": "Flag", + "type": "string" + } + } + } + } + }, + "flags": { + "title": "Flags", + "description": "Flags that will be applied to filter blocks with name mapping.", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "title": "Flag", + "type": "object", + "properties": { + "name": { + "title": "Name", + "type": "string", + "description": "Name of the flag" + }, + "query": { + "title": "Single query", + "description": "URL Query string", + "type": "string" + } + } + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/FilterSet", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "HiglassViewConfig": { + "title": "HiGlass View Configuration", + "description": "Configuration details for HiGlass", + "$id": "/profiles/higlass_view_config.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "identifier", + "view_config" + ], + "identifyingProperties": [ + "aliases", + "identifier", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/identifier" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "identifier": { + "title": "Identifier", + "description": "Unique, identifying name for the item", + "type": "string", + "uniqueKey": true, + "pattern": "^[A-Za-z0-9-_]+$", + "minLength": 2, + "permission": "restricted_fields", + "readonly": true + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "view_config": { + "additionalProperties": true, + "default": { + "views": [] + }, + "description": "The viewconfig JSON", + "exclude_from": [ + "FFedit-create" + ], + "formInput": "code", + "title": "View Configuration", + "type": "object" + }, + "instance_height": { + "default": 500, + "title": "Instance Height", + "type": "integer" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/HiglassViewConfig", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "Histology": { + "title": "Histology", + "$id": "/profiles/histology.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "submission_centers", + "submitted_id", + "tissue" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "HI", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "section_location": { + "title": "Section Location", + "description": "Location in the source material that was prepared for the slide", + "type": "string", + "enum": [ + "TBD" + ] + }, + "images": { + "title": "Images", + "description": "Histology images", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Image" + } + }, + "tissue": { + "title": "Tissue", + "description": "Tissue source for the sample", + "type": "string", + "linkTo": "Tissue" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Histology", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "Image": { + "title": "Image", + "$id": "/profiles/image.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "aliases", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attachment" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "mixins.json#/tags" + } + ], + "properties": { + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "attachment": { + "title": "Attached File", + "description": "File attached to this Item.", + "type": "object", + "additionalProperties": false, + "formInput": "file", + "attachment": true, + "ff_flag": "clear clone", + "properties": { + "download": { + "title": "File Name", + "description": "File Name of the attachment.", + "type": "string" + }, + "href": { + "internal_comment": "Internal webapp URL for document file", + "title": "href", + "description": "Path to download the file attached to this Item.", + "type": "string" + }, + "type": { + "title": "Media Type", + "type": "string", + "enum": [ + "application/msword", + "application/vnd.ms-excel", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/pdf", + "application/zip", + "application/proband+xml", + "text/plain", + "text/tab-separated-values", + "image/jpeg", + "image/tiff", + "image/gif", + "text/html", + "image/png", + "image/svs", + "text/autosql" + ] + }, + "md5sum": { + "title": "MD5 Checksum", + "description": "Use this to ensure that your file was downloaded without errors or corruption.", + "type": "string", + "format": "md5sum" + }, + "size": { + "title": "Attachment size", + "description": "Size of the attachment on disk", + "type": "integer" + }, + "width": { + "title": "Image width", + "description": "Width of the image attached, in pixels.", + "type": "integer" + }, + "height": { + "title": "Image height", + "description": "Height of the image attached, in pixels.", + "type": "integer" + }, + "blob_id": { + "title": "Blob ID", + "type": "string", + "internal_comment": "blob storage ID. Use to like with s3/rds" + } + } + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "caption": { + "title": "Caption", + "type": "string", + "formInput": "textarea" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Image", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "IngestionSubmission": { + "title": "Ingestion Submission", + "description": "Schema for metadata related to submitted ingestion requests", + "$id": "/profiles/ingestion_submission.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "ingestion_type" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "aliases", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/documents" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "documents": { + "title": "Documents", + "description": "Documents that provide additional information (not data file).", + "comment": "See Documents sheet or collection for existing items.", + "type": "array", + "uniqueItems": true, + "items": { + "title": "Document", + "description": "A document that provides additional information (not data file).", + "type": "string", + "linkTo": "Document" + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "additional_data": { + "title": "Additional Data", + "description": "Additional structured information resulting from processing, the nature of which may vary by ingestion_type and other factors.", + "type": "object", + "additionalProperties": true + }, + "errors": { + "title": "Errors", + "description": "A list of error messages if processing was aborted before results were obtained.", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "title": "Error Message", + "description": "One of possibly several reasons that processing was not completed.", + "type": "string" + } + }, + "ingestion_type": { + "title": "Ingestion Type", + "description": "The type of processing requested for this submission.", + "type": "string", + "enum": [ + "accessioning", + "data_bundle", + "metadata_bundle", + "simulated_bundle" + ] + }, + "object_bucket": { + "title": "Object Bucket", + "description": "The name of the S3 bucket in which the 'object_name' resides.", + "type": "string" + }, + "object_name": { + "title": "Object Name", + "description": "The name of the S3 object corresponding to the submitted document.", + "type": "string" + }, + "parameters": { + "title": "Parameters", + "description": "A record of explicitly offered form parameters in the submission request.", + "type": "object", + "additionalProperties": true + }, + "processing_status": { + "title": "Processing Status", + "description": "A structured description of what has happened so far as the submission is processed.", + "type": "object", + "additionalProperties": false, + "properties": { + "state": { + "title": "State", + "description": "A state machine description of how processing is progressing (created, submitted, processed, or done).", + "type": "string", + "enum": [ + "created", + "submitted", + "processing", + "done" + ], + "default": "created" + }, + "outcome": { + "title": "Outcome", + "description": "A token describing the nature of the final outcome, if any. Options are unknown, success, failure, or error.", + "type": "string", + "enum": [ + "unknown", + "success", + "failure", + "error" + ], + "default": "unknown" + }, + "progress": { + "title": "Progress", + "description": "An adjectival word or phrase assessing progress, such as 'started', 'awaiting prerequisites', '88% done', or 'unavailable'.", + "type": "string", + "default": "unavailable" + } + } + }, + "result": { + "title": "Result", + "description": "An object representing a result if processing ran to completion, whether the outcome was success or failure.", + "type": "object", + "additionalProperties": true + }, + "submission_id": { + "title": "Submission ID", + "description": "The name of a folder in the S3 bucket that contains all artifacts related to this submission.", + "type": "string" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/IngestionSubmission", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "Library": { + "title": "Library", + "$id": "/profiles/library.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "analyte", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/protocols" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "protocols": { + "title": "Protocols", + "description": "Protocols providing experimental details", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Protocol" + } + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "LI", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "a260_a280_ratio": { + "title": "A260 A280 Ratio", + "description": "Ratio of nucleic acid absorbance at 260 nm and 280 nm, used to determine a measure of DNA purity", + "type": "number", + "minimum": 0 + }, + "adapter_name": { + "title": "Adapter Name", + "description": "Name of sequencing adapter", + "type": "string" + }, + "adapter_sequence": { + "title": "Adapter Sequence", + "description": "Base sequence of sequencing adapter", + "type": "string" + }, + "amplification_cycles": { + "title": "Amplification Cycles", + "description": "Number of PCR Cycles used for additional amplification", + "type": "integer", + "minimum": 0 + }, + "amplification_end_mass": { + "title": "Amplification End Mass", + "description": "Weight of analyte after PCR (ng)", + "type": "number", + "minimum": 0 + }, + "amplification_start_mass": { + "title": "Amplification Start Mass", + "description": "Weight of analyte prior to PCR (ng)", + "type": "number", + "minimum": 0 + }, + "analyte_weight": { + "title": "Analyte Weight", + "description": "Weight of analyte used to prepare library (mg)", + "type": "number", + "minimum": 0 + }, + "barcode_sequences": { + "title": "Barcode Sequences", + "description": "Barcode sequence for multiplexed sequencing", + "type": "string" + }, + "fragment_maximum_length": { + "title": "Fragment Maximum Length", + "description": "Maximum length of the sequenced fragments (e.g., as predicted by Agilent Bioanalyzer)", + "type": "integer", + "minimum": 0 + }, + "fragment_mean_length": { + "title": "Fragment Mean Length", + "description": "Mean length of the sequenced fragments (e.g., as predicted by Agilent Bioanalyzer)", + "type": "number", + "minimum": 0 + }, + "fragment_minimum_length": { + "title": "Fragment Minimum Length", + "description": "Minimum length of the sequenced fragments (e.g., as predicted by Agilent Bioanalyzer)", + "type": "integer", + "minimum": 0 + }, + "fragment_standard_deviation_length": { + "title": "Fragment Standard Deviation Length", + "description": "Standard deviation of length of the sequenced fragments (e.g., as predicted by Agilent Bioanalyzer)", + "type": "number", + "minimum": 0 + }, + "insert_maximum_length": { + "title": "Insert Maximum Length", + "description": "Maximum length of the sample molecule in the fragments to be sequenced", + "type": "integer", + "minimum": 0 + }, + "insert_mean_length": { + "title": "Insert Mean Length", + "description": "Mean length of the sample molecule in the fragments to be sequenced", + "type": "number", + "minimum": 0 + }, + "insert_minimum_length": { + "title": "Insert Minimum Length", + "description": "Minimum length of the sample molecule in the fragments to be sequenced", + "type": "integer", + "minimum": 0 + }, + "insert_standard_deviation_length": { + "title": "Insert Standard Deviation Length", + "description": "Standard deviation of the length of the sample molecule in the fragments to be sequenced", + "type": "number", + "minimum": 0 + }, + "preparation_date": { + "title": "Preparation Date", + "description": "Date of library preparation", + "type": "string", + "format": "date" + }, + "analyte": { + "title": "Analyte", + "description": "Link to associated analyte", + "type": "string", + "linkTo": "Analyte" + }, + "library_preparation": { + "title": "Library Preparation", + "description": "Link to associated library preparation", + "type": "string", + "linkTo": "LibraryPreparation" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Library", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "LibraryPreparation": { + "title": "Library Preparation", + "$id": "/profiles/library_preparation.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "assay_name", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "LP", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "adapter_inclusion_method": { + "title": "Adapter Inclusion Method", + "description": "Method of library preparation from an analyte", + "type": "array", + "uniqueItems": true, + "minItems": 1, + "items": { + "type": "string", + "enum": [ + "Ligation", + "Tagmentation", + "Not Applicable" + ] + } + }, + "amplification_method": { + "title": "Amplification Method", + "description": "Amplification method used to increase library products", + "type": "array", + "uniqueItems": true, + "minItems": 1, + "items": { + "type": "string", + "enum": [ + "PCR", + "MALBAC", + "PTA", + "MDA", + "Not Applicable" + ] + } + }, + "assay_name": { + "title": "Assay Name", + "description": "Name of experimental approach", + "type": "array", + "uniqueItems": true, + "minItems": 1, + "items": { + "type": "string", + "enum": [ + "WGS", + "RNA-Seq", + "NanoSeq", + "CODEC", + "Duplex Sequencing", + "FiberSeq", + "ATAC-Seq", + "ScRNA-Seq", + "DLP+", + "MAS-Seq", + "STORM-Seq" + ] + } + }, + "fragmentation_method": { + "title": "Fragmentation Method", + "description": "Method used for nucleotide fragmentation", + "type": "array", + "uniqueItems": true, + "minItems": 1, + "items": { + "type": "string", + "enum": [ + "Sonication", + "Restriction Enzyme", + "Transposase", + "Not Applicable" + ] + } + }, + "insert_selection_method": { + "title": "Insert Selection Method", + "description": "Method for selecting inserts included in library", + "type": "array", + "uniqueItems": true, + "minItems": 1, + "items": { + "type": "string", + "enum": [ + "Affinity Enrichment", + "Hybrid Selection", + "PCR", + "PolyT Enrichment", + "RRNA Depletion", + "Not applicable" + ] + } + }, + "size_selection_method": { + "title": "Size Selection Method", + "description": "Method for selecting fragment sizes", + "type": "array", + "uniqueItems": true, + "minItems": 1, + "items": { + "type": "string", + "enum": [ + "Gel Electrophoresis", + "Magnetic Beads", + "Not Applicable" + ] + } + }, + "strand": { + "title": "Strand", + "description": "Library stranded-ness", + "type": "string", + "enum": [ + "Unstranded", + "First Stranded", + "Second Stranded", + "Not Applicable" + ] + }, + "target_fragment_length": { + "title": "Target Fragment Length", + "description": "Desired fragment length for the library", + "type": "integer" + }, + "target_insert_length": { + "title": "Target Insert Length", + "description": "Desired insert length for the library", + "type": "integer" + }, + "trim_adapter_sequence": { + "title": "Trim Adapter Sequence", + "description": "Whether trimming adapter sequence is recommended", + "type": "boolean" + }, + "preparation_kits": { + "title": "Preparation Kits", + "description": "Links to associated preparation kits", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "PreparationKit" + } + }, + "treatments": { + "title": "Treatments", + "description": "Link to associated treatments performed during library preparation", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Treatment" + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/LibraryPreparation", + "children": [], + "rdfs:subClassOf": "/profiles/Preparation.json", + "isAbstract": false + }, + "MedicalHistory": { + "title": "Medical History", + "$id": "/profiles/medical_history.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "MX", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "primary_source_of_information": { + "title": "Primary Source Of Information", + "description": "Source of information for the medical history", + "type": "string", + "enum": [ + "TBD" + ] + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/MedicalHistory", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "MetaWorkflow": { + "title": "Meta Workflow", + "description": "Bioinformatics pipeline to organize workflow steps", + "$id": "/profiles/meta_workflow.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "category", + "name", + "title", + "version", + "workflows" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "accession", + "aliases", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/name" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "mixins.json#/version" + } + ], + "properties": { + "version": { + "title": "Version", + "description": "Version for the item", + "type": "string", + "pattern": "^([0-9]+.)*[0-9]+$" + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "name": { + "title": "Name", + "description": "Name of the item", + "type": "string", + "pattern": "^[A-Za-z0-9-_]+$", + "minLength": 3, + "comment": "Not for identifying name; use 'identifier' for that purpose." + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "MW", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "category": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Alignment", + "Format Conversion", + "Read Manipulation", + "Quality Control", + "Variant Calling", + "Variant Manipulation" + ] + } + }, + "previous_versions": { + "description": "Link to the previous versions of the meta workflow.", + "items": { + "description": "Link to a previous version of the meta workflow.", + "linkTo": "MetaWorkflow", + "title": "Previous version", + "type": "string" + }, + "minItems": 1, + "title": "Previous versions", + "type": "array", + "uniqueItems": true + }, + "version_upgrade_log": { + "description": "Version upgrade log", + "title": "Version upgrade log", + "type": "string" + }, + "workflows": { + "title": "Workflows", + "type": "array", + "minItems": 1, + "items": { + "title": "Workflow", + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "workflow", + "input", + "config" + ], + "properties": { + "config": { + "title": "Tibanna Config", + "description": "Tibanna configuration for execution", + "type": "object", + "additionalProperties": false, + "required": [ + "instance_type", + "run_name" + ], + "properties": { + "behavior_on_capacity_limit": { + "title": "Behavior on Capacity Limit", + "type": "string", + "enum": [ + "wait_and_retry" + ], + "default": "wait_and_retry" + }, + "cpu": { + "title": "CPU", + "type": "integer" + }, + "ebs_iops": { + "title": "EBS IOPS", + "description": "EBS input/output operations per second", + "type": "integer", + "minimum": 0 + }, + "ebs_throughput": { + "title": "EBS Throughput", + "description": "EBS throughput, in MiB/s", + "type": "integer", + "minimum": 0 + }, + "ebs_optimized": { + "title": "EBS Optimized", + "type": "boolean" + }, + "ebs_size": { + "title": "EBS Size", + "type": [ + "string", + "integer" + ], + "pattern": "^([0-9]+[.])?[0-9]+[x]$", + "minimum": 0 + }, + "instance_type": { + "title": "Instance Type", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^[a-z][a-z0-9-]+[.][0-9]*[a-z-*]+$" + } + }, + "memory": { + "title": "Memory", + "type": "number" + }, + "run_name": { + "title": "Run Name", + "type": "string" + }, + "spot_instance": { + "title": "Spot Instance", + "type": "boolean" + } + } + }, + "custom_pf_fields": { + "title": "Custom PF fields", + "description": "Custom fields to be added to specified processed file items through Tibanna", + "type": "object", + "additionalProperties": { + "type": "object", + "comment": "ToDo: Make these properties sharable directly without needing to update here and in OutputFile schema", + "additional_properties": false, + "properties": { + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "variant_type": { + "title": "Variant Type", + "description": "Variant types included in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Copy Number Variant", + "Insertion-deletion", + "Mobile Element Insertion", + "Single Nucleotide Variant", + "Structural Variant" + ] + } + }, + "data_category": { + "title": "Data Category", + "description": "Category for information in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Genome Region", + "Quality Control", + "Reference Genome", + "Sequencing Reads", + "Variant Calls" + ] + } + }, + "data_type": { + "title": "Data Type", + "description": "Detailed type of information in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Aligned Reads", + "Germline Variant Calls", + "Image", + "Index", + "Reference Sequence", + "Sequence Interval", + "Somatic Variant Calls", + "Statistics", + "Unaligned Reads" + ] + } + } + } + } + }, + "dependencies": { + "title": "Dependencies", + "description": "forced dependencies (other than deduced from input-output connections)", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "title": "Dependency", + "description": "One of the forced dependencies", + "type": "string" + } + }, + "input": { + "title": "Workflow Inputs", + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "argument_name", + "argument_type" + ], + "if": { + "properties": { + "argument_type": { + "const": "QC ruleset" + } + } + }, + "then": { + "properties": { + "value": { + "type": "object", + "required": [ + "overall_quality_status_rule", + "qc_thresholds" + ], + "additionalProperties": false, + "properties": { + "overall_quality_status_rule": { + "title": "Overall Quality Status Rule", + "type": "string" + }, + "qc_thresholds": { + "title": "QC Thresholds", + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "metric", + "operator" + ], + "anyOf": [ + { + "required": [ + "pass_target" + ] + }, + { + "required": [ + "warn_target" + ] + }, + { + "required": [ + "fail_target" + ] + } + ], + "properties": { + "id": { + "title": "ID", + "type": "string" + }, + "metric": { + "title": "Metric", + "type": "string" + }, + "operator": { + "title": "Operator", + "type": "string", + "enum": [ + "==", + ">", + ">=", + "<", + "<=", + "!=" + ] + }, + "pass_target": { + "title": "Pass Target", + "type": [ + "string", + "number", + "boolean" + ] + }, + "fail_target": { + "title": "Fail Target", + "type": [ + "string", + "number", + "boolean" + ] + }, + "warn_target": { + "title": "Warn Target", + "type": [ + "string", + "number", + "boolean" + ] + }, + "use_as_qc_flag": { + "title": "Use as QC Flag", + "type": "boolean" + } + } + } + } + } + }, + "value_type": { + "type": "string", + "enum": [ + "object" + ] + } + } + }, + "properties": { + "argument_name": { + "title": "Input Argument Name", + "type": "string" + }, + "argument_type": { + "title": "Input Argument Type", + "type": "string", + "enum": [ + "file", + "parameter", + "QC ruleset" + ] + }, + "value": { + "title": "Value", + "description": "a specific input parameter value", + "type": [ + "string", + "integer", + "number", + "boolean", + "array", + "object" + ] + }, + "value_type": { + "title": "Expected Value Type", + "description": "Expected type of the specific input parameter value", + "type": "string", + "enum": [ + "string", + "integer", + "float", + "boolean", + "array", + "object" + ] + }, + "source": { + "title": "Source Workflow", + "description": "Where this input file came from (source workflow name). If this field is null or undefined, the input is global and not from another workflow's output.", + "type": "string" + }, + "source_argument_name": { + "title": "Argument name in the Source Workflow", + "description": "Output argument name in the source workflow", + "type": "string" + }, + "scatter": { + "title": "Scatter", + "description": "The input dimension decrease if scattered into mutiple runs (default: not set)", + "type": "integer" + }, + "gather": { + "title": "Gather", + "description": "The input dimension increase from multiple runs of the source workflow (default: not set)", + "type": "integer" + }, + "gather_input": { + "title": "Gather Input", + "type": "integer", + "minimum": 0 + }, + "input_dimension": { + "title": "Input Dimension", + "description": "Extra input dimension other than that defined by scatter", + "type": "integer", + "minimum": 0 + }, + "extra_dimension": { + "title": "Extra Dimension", + "description": "The extra input dimension increase other than that defined by gather (default: not set)", + "type": "integer" + }, + "mount": { + "title": "Mount", + "description": "Whether the input is mounted", + "type": "boolean" + }, + "rename": { + "title": "Rename", + "description": "What the input should be renamed to when downloaded to EC2 for execution", + "type": "string" + }, + "unzip": { + "title": "Unzip", + "description": "How the input should be decompressed when downloaded to EC2 for execution", + "type": "string", + "enum": [ + "gz", + "bz2" + ] + } + } + } + }, + "name": { + "title": "Name", + "description": "Name of the workflow, unique within the meta workflow", + "type": "string" + }, + "shards": { + "title": "Shards", + "type": "array", + "minItems": 1, + "items": { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + }, + "workflow": { + "title": "Workflow", + "description": "Link to Workflow", + "type": "string", + "linkTo": "Workflow" + } + } + } + }, + "input": { + "title": "Input Arguments", + "description": "Global input arguments of the meta-workflow", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "title": "Input Argument", + "description": "Individual global input argument of the MetaWorkflow", + "type": "object", + "additionalProperties": false, + "required": [ + "argument_name", + "argument_type" + ], + "if": { + "properties": { + "argument_type": { + "const": "QC ruleset" + } + } + }, + "then": { + "required": [ + "value" + ], + "properties": { + "value": { + "type": "object", + "required": [ + "overall_quality_status_rule", + "qc_thresholds" + ], + "additionalProperties": false, + "properties": { + "overall_quality_status_rule": { + "title": "Overall Quality Status Rule", + "type": "string" + }, + "qc_thresholds": { + "title": "QC Thresholds", + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "metric", + "operator" + ], + "anyOf": [ + { + "required": [ + "pass_target" + ] + }, + { + "required": [ + "warn_target" + ] + }, + { + "required": [ + "fail_target" + ] + } + ], + "properties": { + "id": { + "title": "ID", + "type": "string" + }, + "metric": { + "title": "Metric", + "type": "string" + }, + "operator": { + "title": "Operator", + "type": "string", + "enum": [ + "==", + ">", + ">=", + "<", + "<=", + "!=" + ] + }, + "pass_target": { + "title": "Pass Target", + "type": [ + "string", + "number", + "boolean" + ] + }, + "fail_target": { + "title": "Fail Target", + "type": [ + "string", + "number", + "boolean" + ] + }, + "warn_target": { + "title": "Warn Target", + "type": [ + "string", + "number", + "boolean" + ] + }, + "use_as_qc_flag": { + "title": "Use as QC Flag", + "type": "boolean" + } + } + } + } + } + }, + "value_type": { + "type": "string", + "enum": [ + "object" + ] + } + } + }, + "anyOf": [ + { + "required": [ + "value" + ] + }, + { + "required": [ + "value_type" + ] + }, + { + "required": [ + "files" + ] + }, + { + "required": [ + "dimensionality" + ] + } + ], + "properties": { + "argument_name": { + "title": "Input Argument Name", + "type": "string" + }, + "argument_type": { + "title": "Input Argument Type", + "type": "string", + "enum": [ + "file", + "parameter", + "QC ruleset" + ] + }, + "value": { + "title": "Value", + "description": "a specific input parameter value", + "type": [ + "string", + "integer", + "number", + "boolean", + "array", + "object" + ] + }, + "value_type": { + "title": "Expected Value Type", + "description": "Expected type of the specific input parameter value", + "type": "string", + "enum": [ + "string", + "integer", + "float", + "boolean", + "array", + "object" + ] + }, + "files": { + "title": "Default files", + "description": "Default file item(s) of the file argument", + "type": "array", + "minItems": 1, + "items": { + "title": "Default Files", + "description": "A list of objects describing default input file items", + "type": "object", + "additionalProperties": false, + "required": [ + "file" + ], + "properties": { + "file": { + "title": "File", + "type": "string", + "linkTo": "File" + }, + "dimension": { + "title": "Dimension", + "description": "Dimension of file in the input argument (unset for a singleton, '0', '1', '2'.. for a list, '0,0', '0,1' ... for a nested list)", + "type": "string" + } + } + } + }, + "dimensionality": { + "title": "Dimensionality", + "description": "The number of dimensions of input files", + "type": "integer", + "enum": [ + 1, + 2 + ] + } + } + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/MetaWorkflow", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "MetaWorkflowRun": { + "title": "Meta Workflow Run", + "description": "Run of a bioinformatics pipeline", + "$id": "/profiles/meta_workflow_run.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "meta_workflow" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "accession", + "aliases", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "MR", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "meta_workflow": { + "title": "Meta Workflow", + "description": "The meta workflow associated with the meta-workflow run.", + "type": "string", + "linkTo": "MetaWorkflow" + }, + "final_status": { + "title": "Final Status", + "type": "string", + "default": "pending", + "enum": [ + "pending", + "running", + "completed", + "failed", + "inactive", + "stopped", + "quality metric failed" + ] + }, + "failed_jobs": { + "title": "Failed Jobs", + "description": "List of failed Tibanna job ids for this meta workflow run", + "type": "array", + "items": { + "title": "Failed Job Id", + "description": "Failed Tibanna job in this meta workflow run", + "type": "string" + } + }, + "cost": { + "title": "Cost", + "description": "Total cost of the meta workflow run (includes failed jobs)", + "type": "number" + }, + "workflow_runs": { + "title": "Workflow Runs", + "description": "The list of workflow runs with their status and output files", + "type": "array", + "items": { + "title": "Workflow Run", + "description": "Individual workflow run the meta workflow run.", + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "title": "Name", + "description": "Name of the corresponding workflow defined in the meta-workflow", + "type": "string" + }, + "status": { + "title": "Status", + "description": "Status of the current workflow run", + "type": "string", + "enum": [ + "pending", + "running", + "completed", + "failed" + ] + }, + "shard": { + "title": "Shard", + "description": "Shard of the current workflow run in the format of x (1D) | x:x (2D) | x:x:x (3D)", + "type": "string" + }, + "dependencies": { + "title": "Dependencies", + "description": "Dependencies of the current workflow run", + "type": "array", + "items": { + "title": "Dependency", + "description": "A dependency of the current workflow run, in the format of name:shard.", + "type": "string" + }, + "minItems": 1, + "uniqueItems": true + }, + "output": { + "title": "Output", + "description": "Output of the current workflow run", + "type": "array", + "minItems": 1, + "items": { + "title": "Output", + "description": "An output of the current workflow run.", + "type": "object", + "additionalProperties": false, + "properties": { + "argument_name": { + "title": "Argument Name", + "description": "Name of the output argument", + "type": "string" + }, + "file": { + "title": "File", + "description": "the actual output file (link to a file item)", + "type": "string", + "linkTo": "File" + } + }, + "required": [ + "argument_name", + "file" + ] + } + }, + "workflow_run": { + "title": "Workflow Run", + "description": "Link to the corresponding workflow run item", + "type": "string", + "linkTo": "WorkflowRun" + }, + "job_id": { + "title": "Job ID", + "description": "Job ID of the current workflow run", + "type": "string" + } + } + } + }, + "input": { + "title": "Input", + "description": "The input files and parameters used for the meta workflow run.", + "type": "array", + "minItems": 1, + "items": { + "title": "Input", + "description": "Input files or parameters associated with an input argument of the meta workflow run.", + "type": "object", + "additionalProperties": false, + "required": [ + "argument_name", + "argument_type" + ], + "oneOf": [ + { + "required": [ + "value" + ] + }, + { + "required": [ + "files" + ] + } + ], + "if": { + "properties": { + "argument_type": { + "const": "QC ruleset" + } + } + }, + "then": { + "required": [ + "value" + ], + "properties": { + "value": { + "type": "object", + "required": [ + "overall_quality_status_rule", + "qc_thresholds" + ], + "additionalProperties": false, + "properties": { + "overall_quality_status_rule": { + "title": "Overall Quality Status Rule", + "type": "string" + }, + "qc_thresholds": { + "title": "QC Thresholds", + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "metric", + "operator" + ], + "anyOf": [ + { + "required": [ + "pass_target" + ] + }, + { + "required": [ + "warn_target" + ] + }, + { + "required": [ + "fail_target" + ] + } + ], + "properties": { + "id": { + "title": "ID", + "type": "string" + }, + "metric": { + "title": "Metric", + "type": "string" + }, + "operator": { + "title": "Operator", + "type": "string", + "enum": [ + "==", + ">", + ">=", + "<", + "<=", + "!=" + ] + }, + "pass_target": { + "title": "Pass Target", + "type": [ + "string", + "number", + "boolean" + ] + }, + "fail_target": { + "title": "Fail Target", + "type": [ + "string", + "number", + "boolean" + ] + }, + "warn_target": { + "title": "Warn Target", + "type": [ + "string", + "number", + "boolean" + ] + }, + "use_as_qc_flag": { + "title": "Use as QC Flag", + "type": "boolean" + } + } + } + } + } + }, + "value_type": { + "type": "string", + "enum": [ + "object" + ] + } + } + }, + "properties": { + "argument_name": { + "title": "Input Argument Name", + "type": "string" + }, + "argument_type": { + "title": "Input Argument Type", + "type": "string", + "enum": [ + "file", + "parameter", + "QC ruleset" + ] + }, + "value": { + "title": "Value", + "description": "a specific input parameter value", + "type": [ + "string", + "integer", + "number", + "boolean", + "array", + "object" + ] + }, + "files": { + "title": "Default files", + "description": "Default file item(s) of the file argument", + "type": "array", + "minItems": 1, + "items": { + "title": "Default Files", + "description": "A list of objects describing default input file items", + "type": "object", + "additionalProperties": false, + "required": [ + "file" + ], + "properties": { + "file": { + "title": "File", + "type": "string", + "linkTo": "File" + }, + "dimension": { + "title": "Dimension", + "description": "Dimension of file in the input argument (unset for a singleton, '0', '1', '2'.. for a list, '0,0', '0,1' ... for a nested list)", + "type": "string" + } + } + } + } + } + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/MetaWorkflowRun", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "MolecularTest": { + "title": "Molecular Test", + "$id": "/profiles/molecular_test.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "medical_history", + "result_classification", + "submission_centers", + "submitted_id", + "title" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3, + "enum": [ + "CMV Total Ab", + "EBV IgG Ab", + "EBV IgM Ab", + "HBcAb IgM", + "HBcAb Total", + "HCV Ab", + "HBsAb", + "HBsAg", + "HCV 1 NAT", + "HIV 1 NAT", + "HIV I II Ab", + "HIV I II Plus O Antibody", + "RPR VDRL", + "RPR" + ] + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "MT", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "result": { + "title": "Result", + "description": "Result of the molecular test", + "type": "number", + "minimum": 0 + }, + "result_classification": { + "title": "Result Classification", + "description": "Categorical classification of the result value", + "type": "string", + "enum": [ + "Within Normal Range", + "Outside Normal Range", + "Inconclusive" + ] + }, + "medical_history": { + "title": "Medical History", + "description": "Link to the associated medical history", + "type": "string", + "linkTo": "MedicalHistory" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/MolecularTest", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "OntologyTerm": { + "title": "Ontology Term", + "$id": "/profiles/ontology_term.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "identifier", + "title" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "aliases", + "identifier", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/identifier" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/url" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "url": { + "title": "URL", + "description": "An external resource with additional information about the item", + "type": "string", + "format": "uri" + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "identifier": { + "title": "Identifier", + "description": "Unique, identifying name for the item", + "type": "string", + "uniqueKey": true, + "pattern": "^[A-Z]+:[0-9]+$", + "minLength": 2, + "permission": "restricted_fields", + "readonly": true + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/OntologyTerm", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "OutputFile": { + "title": "Output File", + "description": "File produced by bioinformatics pipeline", + "$id": "/profiles/output_file.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "data_category", + "data_type", + "file_format" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "accession", + "aliases", + "uuid" + ], + "additionalProperties": false, + "mixinFacets": [ + { + "$ref": "file.json#/facets" + } + ], + "mixinColumns": [ + { + "$ref": "file.json#/columns" + } + ], + "properties": { + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "FI", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "uploading", + "enum": [ + "uploading", + "uploaded", + "upload failed", + "to be uploaded by workflow", + "released", + "in review", + "obsolete", + "archived", + "deleted", + "public" + ] + }, + "file_format": { + "ff_flag": "filter:valid_item_types", + "linkTo": "FileFormat", + "title": "File Format", + "type": "string" + }, + "filename": { + "description": "The local file name used at time of submission. Must be alphanumeric, with the exception of the following special characters: '+=,.@-_'", + "pattern": "^[\\w+=,.@-]*$", + "title": "File Name", + "type": "string" + }, + "file_size": { + "comment": "File size is specified in bytes - presumably this can be a calculated property as well", + "description": "Size of file on disk", + "exclude_from": [ + "FFedit-create" + ], + "permission": "restricted_fields", + "title": "File Size", + "type": "integer", + "readonly": true + }, + "md5sum": { + "comment": "This can vary for files of same content gzipped at different times", + "description": "The MD5 checksum of the file being transferred", + "exclude_from": [ + "FFedit-create" + ], + "format": "hex", + "permission": "restricted_fields", + "title": "MD5 Checksum", + "type": "string", + "readonly": true + }, + "content_md5sum": { + "comment": "This is only relavant for gzipped files", + "description": "The MD5 checksum of the uncompressed file", + "exclude_from": [ + "FFedit-create" + ], + "format": "hex", + "permission": "restricted_fields", + "title": "Content MD5 Checksum", + "type": "string", + "uniqueKey": "file:content_md5sum", + "readonly": true + }, + "quality_metrics": { + "description": "Associated QC reports", + "items": { + "description": "Associated QC report", + "linkTo": "QualityMetric", + "title": "Quality Metric", + "type": "string" + }, + "minItems": 1, + "permission": "restricted_fields", + "title": "Quality Metrics", + "type": "array", + "uniqueItems": true, + "readonly": true + }, + "data_category": { + "title": "Data Category", + "description": "Category for information in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Genome Region", + "Quality Control", + "Reference Genome", + "Sequencing Reads", + "Variant Calls" + ] + } + }, + "data_type": { + "title": "Data Type", + "description": "Detailed type of information in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Aligned Reads", + "Germline Variant Calls", + "Image", + "Index", + "Reference Sequence", + "Sequence Interval", + "Somatic Variant Calls", + "Statistics", + "Unaligned Reads" + ] + } + }, + "o2_path": { + "title": "O2 Path", + "description": "Path to file on O2", + "type": "string" + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "extra_files": { + "description": "Links to extra files on s3 that don't have associated metadata", + "exclude_from": [ + "FFedit-create" + ], + "items": { + "additionalProperties": true, + "properties": { + "file_format": { + "linkTo": "FileFormat", + "title": "File Format", + "type": "string" + }, + "file_size": { + "comment": "File size is specified in bytes", + "title": "File Size", + "type": "integer" + }, + "filename": { + "title": "File Name", + "type": "string" + }, + "href": { + "title": "Download URL", + "type": "string" + }, + "md5sum": { + "format": "hex", + "title": "MD5sum", + "type": "string" + }, + "status": { + "default": "uploading", + "enum": [ + "archived", + "current", + "deleted", + "in review", + "inactive", + "obsolete", + "replaced", + "shared", + "to be uploaded by workflow", + "upload failed", + "uploaded", + "uploading" + ], + "title": "Status", + "type": "string" + } + }, + "required": [ + "file_format" + ], + "title": "Extra File", + "type": "object" + }, + "minItems": 1, + "permission": "restricted_fields", + "title": "Extra Files", + "type": "array", + "readonly": true + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "read_pair_number": { + "description": "Read pair number, if paired-end", + "type": "string", + "enum": [ + "R1", + "R2", + "Not Applicable" + ] + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "variant_type": { + "title": "Variant Type", + "description": "Variant types included in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Copy Number Variant", + "Insertion-deletion", + "Mobile Element Insertion", + "Single Nucleotide Variant", + "Structural Variant" + ] + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + }, + "href": { + "title": "Download URL", + "type": "string", + "description": "Use this link to download this file", + "calculatedProperty": true + }, + "upload_credentials": { + "type": "object", + "calculatedProperty": true + }, + "upload_key": { + "title": "Upload Key", + "type": "string", + "description": "File object name in S3", + "calculatedProperty": true + } + }, + "facets": {}, + "columns": {}, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/OutputFile", + "children": [], + "rdfs:subClassOf": "/profiles/File.json", + "isAbstract": false + }, + "Page": { + "title": "Page", + "$id": "/profiles/page.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "identifier" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "aliases", + "identifier", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/identifier" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "current", + "deleted", + "inactive", + "in review", + "public", + "shared" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "identifier": { + "title": "Identifier", + "description": "Unique, identifying name for the item", + "type": "string", + "uniqueKey": true, + "pattern": "^([A-Za-z0-9_-]+/)*[A-Za-z0-9_-]+$", + "minLength": 2, + "permission": "restricted_fields", + "comment": "Used as the path for the page's URL", + "readonly": true + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "children": { + "title": "Child Pages", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Page" + } + }, + "content": { + "title": "Content Sections", + "description": "Sections used to compose the static page", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "UserContent" + } + }, + "redirect": { + "title": "Redirect", + "type": "object", + "additionalProperties": false, + "properties": { + "code": { + "title": "Response Code", + "description": "Code returned by response.", + "comment": "See https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection", + "type": "integer", + "default": 307, + "enum": [ + 301, + 302, + 303, + 307 + ] + }, + "enabled": { + "title": "Redirect Enabled", + "type": "boolean", + "default": false + }, + "target": { + "title": "Target", + "description": "URL or path to redirect to.", + "type": "string" + } + } + }, + "table-of-contents": { + "title": "Table of Contents", + "type": "object", + "additionalProperties": false, + "properties": { + "enabled": { + "title": "Enabled", + "description": "Enable the table of contents or not. Defaults to false.", + "type": "boolean", + "default": false + }, + "header-depth": { + "title": "Header Depth", + "description": "Maximum depth for table of contents titles, 1-6", + "type": "integer", + "minimum": 1, + "maximum": 6, + "default": 4 + }, + "skip-depth": { + "title": "Skip Depth", + "description": "TODO", + "type": "integer", + "default": 1 + }, + "list-styles": { + "title": "List Styles", + "description": "CSS list styles used for
  • elements.", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "decimal", + "lower-alpha", + "lower-roman", + "none" + ] + } + }, + "include-top-link": { + "title": "Inlude Top Link", + "description": "TODO", + "type": "boolean", + "default": false + } + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Page", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "PreparationKit": { + "title": "Preparation Kit", + "$id": "/profiles/preparation_kit.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "submission_centers", + "submitted_id", + "title", + "vendor" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "mixins.json#/version" + } + ], + "properties": { + "version": { + "title": "Version", + "description": "Version for the item", + "type": "string", + "pattern": "^([0-9]+.)*[0-9]+$" + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "PK", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "catalog_number": { + "title": "Catalog Number", + "description": "Catalog number of preparation kit", + "type": "string" + }, + "vendor": { + "title": "Vendor", + "description": "Vendor of preparation kit", + "type": "string" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/PreparationKit", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "Protocol": { + "title": "Protocol", + "$id": "/profiles/protocol.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "identifier", + "submission_centers", + "version" + ], + "identifyingProperties": [ + "accession", + "identifier", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attachment" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/identifier" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "mixins.json#/version" + } + ], + "properties": { + "version": { + "title": "Version", + "description": "Version for the item", + "type": "string", + "pattern": "^([0-9]+.)*[0-9]+$" + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "identifier": { + "title": "Identifier", + "description": "Unique, identifying name for the item", + "type": "string", + "uniqueKey": true, + "pattern": "^[A-Za-z0-9-_]+$", + "minLength": 2, + "permission": "restricted_fields", + "readonly": true + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "attachment": { + "title": "Attached File", + "description": "File attached to this Item.", + "type": "object", + "additionalProperties": false, + "formInput": "file", + "attachment": true, + "ff_flag": "clear clone", + "properties": { + "download": { + "title": "File Name", + "description": "File Name of the attachment.", + "type": "string" + }, + "href": { + "internal_comment": "Internal webapp URL for document file", + "title": "href", + "description": "Path to download the file attached to this Item.", + "type": "string" + }, + "type": { + "title": "Media Type", + "type": "string", + "enum": [ + "application/msword", + "application/vnd.ms-excel", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/pdf", + "application/zip", + "application/proband+xml", + "text/plain", + "text/tab-separated-values", + "image/jpeg", + "image/tiff", + "image/gif", + "text/html", + "image/png", + "image/svs", + "text/autosql" + ] + }, + "md5sum": { + "title": "MD5 Checksum", + "description": "Use this to ensure that your file was downloaded without errors or corruption.", + "type": "string", + "format": "md5sum" + }, + "size": { + "title": "Attachment size", + "description": "Size of the attachment on disk", + "type": "integer" + }, + "width": { + "title": "Image width", + "description": "Width of the image attached, in pixels.", + "type": "integer" + }, + "height": { + "title": "Image height", + "description": "Height of the image attached, in pixels.", + "type": "integer" + }, + "blob_id": { + "title": "Blob ID", + "type": "string", + "internal_comment": "blob storage ID. Use to like with s3/rds" + } + } + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "PR", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Protocol", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "QualityMetric": { + "title": "QualityMetric", + "description": "Schema for quality control data for a file.", + "$id": "/profiles/quality_metric.json", + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "required": [ + "qc_values" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "accession", + "aliases", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/category" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "category": { + "title": "Category", + "comment": "Intended for primary classification of an item, i.e. as a property to use instead of file_type for File", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Testing" + ] + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "QM", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "overall_quality_status": { + "type": "string", + "title": "Overall Quality", + "description": "Overall QC decision", + "enum": [ + "Fail", + "Pass", + "Warn" + ] + }, + "url": { + "type": "string", + "title": "Link to Report", + "description": "Location of the main html file", + "format": "uri" + }, + "qc_values": { + "type": "array", + "title": "QC Values", + "description": "QC values and their associated metadata", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "key", + "value" + ], + "properties": { + "key": { + "type": "string", + "title": "QC Name" + }, + "value": { + "type": [ + "array", + "boolean", + "integer", + "number", + "string" + ], + "title": "QC value" + }, + "visible": { + "type": "boolean", + "title": "QC to display" + }, + "flag": { + "type": "string", + "title": "QC flag", + "enum": [ + "Fail", + "Pass", + "Warn" + ] + }, + "derived_from": { + "type": "string", + "title": "Identifier for the QC value" + }, + "tooltip": { + "type": "string", + "title": "Tooltip" + } + } + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/QualityMetric", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "ReferenceFile": { + "title": "Reference File", + "description": "Reference file for bioinformatics pipelines", + "$id": "/profiles/reference_file.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "data_category", + "data_type", + "file_format" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "accession", + "aliases", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "mixins.json#/variant_type" + }, + { + "$ref": "file.json#/properties" + } + ], + "mixinFacets": [ + { + "$ref": "file.json#/facets" + } + ], + "mixinColumns": [ + { + "$ref": "file.json#/columns" + } + ], + "properties": { + "schema_version": { + "default": "1", + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [] + }, + "accession": { + "accessionType": "FI", + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "uploading", + "enum": [ + "uploading", + "uploaded", + "upload failed", + "to be uploaded by workflow", + "released", + "in review", + "obsolete", + "archived", + "deleted", + "public" + ] + }, + "file_format": { + "ff_flag": "filter:valid_item_types", + "linkTo": "FileFormat", + "title": "File Format", + "type": "string" + }, + "filename": { + "description": "The local file name used at time of submission. Must be alphanumeric, with the exception of the following special characters: '+=,.@-_'", + "pattern": "^[\\w+=,.@-]*$", + "title": "File Name", + "type": "string" + }, + "file_size": { + "comment": "File size is specified in bytes - presumably this can be a calculated property as well", + "description": "Size of file on disk", + "exclude_from": [ + "FFedit-create" + ], + "permission": "restricted_fields", + "title": "File Size", + "type": "integer", + "readonly": true + }, + "md5sum": { + "comment": "This can vary for files of same content gzipped at different times", + "description": "The MD5 checksum of the file being transferred", + "exclude_from": [ + "FFedit-create" + ], + "format": "hex", + "permission": "restricted_fields", + "title": "MD5 Checksum", + "type": "string", + "readonly": true + }, + "content_md5sum": { + "comment": "This is only relavant for gzipped files", + "description": "The MD5 checksum of the uncompressed file", + "exclude_from": [ + "FFedit-create" + ], + "format": "hex", + "permission": "restricted_fields", + "title": "Content MD5 Checksum", + "type": "string", + "uniqueKey": "file:content_md5sum", + "readonly": true + }, + "quality_metrics": { + "description": "Associated QC reports", + "items": { + "description": "Associated QC report", + "linkTo": "QualityMetric", + "title": "Quality Metric", + "type": "string" + }, + "minItems": 1, + "permission": "restricted_fields", + "title": "Quality Metrics", + "type": "array", + "uniqueItems": true, + "readonly": true + }, + "data_category": { + "title": "Data Category", + "description": "Category for information in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Genome Region", + "Quality Control", + "Reference Genome", + "Sequencing Reads", + "Variant Calls" + ] + } + }, + "data_type": { + "title": "Data Type", + "description": "Detailed type of information in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Aligned Reads", + "Germline Variant Calls", + "Image", + "Index", + "Reference Sequence", + "Sequence Interval", + "Somatic Variant Calls", + "Statistics", + "Unaligned Reads" + ] + } + }, + "o2_path": { + "title": "O2 Path", + "description": "Path to file on O2", + "type": "string" + }, + "variant_type": { + "title": "Variant Type", + "description": "Variant types included in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Copy Number Variant", + "Insertion-deletion", + "Mobile Element Insertion", + "Single Nucleotide Variant", + "Structural Variant" + ] + } + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "extra_files": { + "description": "Links to extra files on s3 that don't have associated metadata", + "exclude_from": [ + "FFedit-create" + ], + "items": { + "additionalProperties": true, + "properties": { + "file_format": { + "linkTo": "FileFormat", + "title": "File Format", + "type": "string" + }, + "file_size": { + "comment": "File size is specified in bytes", + "title": "File Size", + "type": "integer" + }, + "filename": { + "title": "File Name", + "type": "string" + }, + "href": { + "title": "Download URL", + "type": "string" + }, + "md5sum": { + "format": "hex", + "title": "MD5sum", + "type": "string" + }, + "status": { + "default": "uploading", + "enum": [ + "archived", + "current", + "deleted", + "in review", + "inactive", + "obsolete", + "replaced", + "shared", + "to be uploaded by workflow", + "upload failed", + "uploaded", + "uploading" + ], + "title": "Status", + "type": "string" + } + }, + "required": [ + "file_format" + ], + "title": "Extra File", + "type": "object" + }, + "minItems": 1, + "permission": "restricted_fields", + "title": "Extra Files", + "type": "array", + "readonly": true + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + }, + "href": { + "title": "Download URL", + "type": "string", + "description": "Use this link to download this file", + "calculatedProperty": true + }, + "upload_credentials": { + "type": "object", + "calculatedProperty": true + }, + "upload_key": { + "title": "Upload Key", + "type": "string", + "description": "File object name in S3", + "calculatedProperty": true + } + }, + "facets": {}, + "columns": {}, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/ReferenceFile", + "children": [], + "rdfs:subClassOf": "/profiles/File.json", + "isAbstract": false + }, + "ReferenceGenome": { + "title": "Reference Genome", + "$id": "/profiles/reference_genome.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "identifier", + "title" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "accession", + "aliases", + "identifier", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/identifier" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/url" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "url": { + "title": "URL", + "description": "An external resource with additional information about the item", + "type": "string", + "format": "uri" + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "identifier": { + "title": "Identifier", + "description": "Unique, identifying name for the item", + "type": "string", + "uniqueKey": true, + "pattern": "^[A-Za-z0-9-_]+$", + "minLength": 2, + "permission": "restricted_fields", + "readonly": true + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "RG", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "files": { + "title": "Files", + "description": "Files associated with the reference genome", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "File" + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/ReferenceGenome", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "SamplePreparation": { + "title": "Sample Preparation", + "$id": "/profiles/sample_preparation.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "preparation.json#/properties" + } + ], + "properties": { + "accession": { + "accessionType": "SP", + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "readonly": true + }, + "schema_version": { + "default": "1", + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [] + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "homogenization_method": { + "title": "Homogenization method", + "description": "Method of sample homogenization, if applicable", + "type": "string", + "enum": [ + "TBD" + ] + }, + "preservation_method": { + "title": "Preservation Method", + "description": "Preservation method for subsequent analysis", + "type": "array", + "uniqueItems": true, + "minItems": 1, + "items": { + "type": "string", + "enum": [ + "Fresh", + "Cryopreservation", + "Chemical Fixation" + ] + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/SamplePreparation", + "children": [], + "rdfs:subClassOf": "/profiles/Preparation.json", + "isAbstract": false + }, + "Sequencing": { + "title": "Sequencing", + "$id": "/profiles/sequencing.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "instrument_model", + "platform", + "read_type", + "submission_centers", + "submitted_id", + "target_read_length" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/protocols" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "protocols": { + "title": "Protocols", + "description": "Protocols providing experimental details", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Protocol" + } + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "SQ", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "instrument_model": { + "title": "Instrument Model", + "description": "Model of instrument used to obtain data", + "type": "string", + "enum": [ + "NovaSeq", + "NovaSeq X", + "NovaSeq X Plus", + "NovaSeq 6000", + "Revio", + "PromethION", + "UG100", + "Xenium", + "Ultralong Promethion R10" + ] + }, + "platform": { + "title": "Platform", + "description": "Name of the platform used to obtain data", + "type": "string", + "enum": [ + "Illumina", + "PacBio", + "Ultima", + "ONT", + "10X Genomics" + ] + }, + "read_type": { + "title": "Read Type", + "description": "Type of reads obtained from sequencing", + "type": "string", + "enum": [ + "Not Applicable", + "Paired-end", + "Single-end" + ] + }, + "target_coverage": { + "title": "Target Coverage", + "description": "Expected coverage for the sequencing", + "type": "number", + "minimum": 0 + }, + "target_read_count": { + "title": "Target Read Count", + "description": "Expected read count for the sequencing", + "type": "integer", + "minimum": 0 + }, + "target_read_length": { + "title": "Target Read Length", + "description": "Expected read length for the sequencing", + "type": "integer", + "minimum": 0 + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Sequencing", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "Software": { + "title": "Software", + "$id": "/profiles/software.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "category", + "name", + "title", + "version" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "oneOf": [ + { + "required": [ + "aliases" + ] + }, + { + "required": [ + "submitted_id" + ] + } + ], + "identifyingProperties": [ + "accession", + "aliases", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/category" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/name" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "mixins.json#/version" + } + ], + "properties": { + "version": { + "title": "Version", + "description": "Version for the item", + "type": "string", + "pattern": ".+", + "comment": "TODO: Replace with a proper version pattern" + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "name": { + "title": "Name", + "description": "Name of the item", + "type": "string", + "pattern": "^[A-Za-z0-9-_]+$", + "minLength": 3, + "comment": "Not for identifying name; use 'identifier' for that purpose." + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "category": { + "title": "Category", + "comment": "Intended for primary classification of an item, i.e. as a property to use instead of file_type for File", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Alignment", + "Alignment Manipulation", + "Assembly", + "Data Compression", + "Feature Annotation", + "Format Conversion", + "Quality Control", + "Read Manipulation", + "Variant Annotation", + "Variant Calling", + "Variant Manipulation" + ] + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "SW", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "binary_url": { + "title": "Binary URL", + "description": "An external resource to a compiled download of the software.", + "type": "string", + "format": "uri" + }, + "commit": { + "title": "Commit", + "description": "The software commit hash.", + "type": "string" + }, + "source_url": { + "title": "Source URL", + "description": "An external resource to the code base.", + "type": "string", + "format": "uri" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Software", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "StaticSection": { + "title": "Static Section", + "$id": "/profiles/static_section.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "identifier" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "oneOf": [ + { + "allOf": [ + { + "not": { + "required": [ + "body" + ] + } + }, + { + "not": { + "required": [ + "file" + ] + } + } + ] + }, + { + "required": [ + "body" + ], + "not": { + "required": [ + "file" + ] + } + }, + { + "required": [ + "file" + ], + "not": { + "required": [ + "body" + ] + } + } + ], + "identifyingProperties": [ + "aliases", + "identifier", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/identifier" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "user_content.json#/properties" + } + ], + "properties": { + "schema_version": { + "default": "1", + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [] + }, + "status": { + "default": "in review", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "title": "Status", + "type": "string", + "permission": "restricted_fields", + "readonly": true + }, + "options": { + "title": "Options", + "type": "object", + "description": "Options for section display.", + "additionalProperties": false, + "properties": { + "filetype": { + "title": "File Type", + "description": "What type of file or content is contained. If not set, HTML or format of file (if any) is used.", + "type": "string", + "enum": [ + "md", + "html", + "txt", + "csv", + "jsx", + "rst" + ] + }, + "collapsible": { + "title": "Is Collapsible", + "type": "boolean", + "description": "Whether this StaticSection should be collapsible (wherever collapsibility is an option). This property is ignored in some places, e.g. lists where all sections are explicitly collapsible.", + "default": false + }, + "default_open": { + "title": "Is Expanded by Default", + "type": "boolean", + "description": "Whether this StaticSection should appear as expanded by default (in places where it may be collapsible). Does not necessarily depend on 'collapsible' being true, e.g. in lists where all sections are explicitly collapsible.", + "default": true + }, + "title_icon": { + "title": "Title Icon", + "description": "Icon to be showed next to title in selected places.", + "type": "string" + }, + "link": { + "title": "Link/URI", + "description": "Another link with which this resource is associated with or should redirect to.", + "type": "string" + }, + "image": { + "title": "Preview Image", + "description": "Image or screenshot URL for this Item to use as a preview.", + "type": "string" + } + } + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "identifier": { + "title": "Identifier", + "description": "Unique, identifying name for the item", + "type": "string", + "uniqueKey": true, + "pattern": "^([A-Za-z0-9-_]+[.])*[A-Za-z0-9-_]+$", + "minLength": 2, + "permission": "restricted_fields", + "readonly": true + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "body": { + "title": "Raw Body", + "type": "string", + "comment": "There should be no 'file' if this is set.", + "description": "Plain html or text content of this section.", + "formInput": "code" + }, + "file": { + "title": "Source File Location", + "type": "string", + "comment": "There should be no 'body' if this is set.", + "description": "Source file to use for populating content. Is superceded by contents of 'body', if one present." + }, + "section_type": { + "title": "Section Type", + "type": "string", + "description": "What this section is used for. Defaults to 'Page Section'.", + "default": "Page Section", + "enum": [ + "Page Section", + "Announcement", + "Search Info Header", + "Item Page Header", + "Home Page Slide" + ] + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + }, + "content_as_html": { + "title": "Content as HTML", + "description": "Convert RST, HTML and MD content into HTML", + "type": "string", + "calculatedProperty": true + }, + "content": { + "title": "Content", + "description": "Content for the page", + "type": "string", + "calculatedProperty": true + }, + "filetype": { + "title": "File Type", + "description": "Type of file used for content", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/StaticSection", + "children": [], + "rdfs:subClassOf": "/profiles/UserContent.json", + "isAbstract": false + }, + "SubmissionCenter": { + "title": "SubmissionCenter", + "$id": "/profiles/submission_center.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "required": [ + "identifier", + "title" + ], + "identifyingProperties": [ + "aliases", + "identifier", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/identifier" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/static_embeds" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/url" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "type": "object", + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "url": { + "title": "URL", + "description": "An external resource with additional information about the item", + "type": "string", + "format": "uri" + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "static_headers": { + "title": "Static Headers", + "description": "Array of linkTos for static sections to be displayed at the top of an item page", + "type": "array", + "uniqueItems": true, + "permission": "restricted_fields", + "items": { + "title": "Static Header", + "description": "Static section displayed at the top of an item page", + "type": "string", + "linkTo": "UserContent" + }, + "readonly": true + }, + "static_content": { + "title": "Static Content", + "description": "Array of objects containing linkTo UserContent and 'position' to be placed on Item view(s).", + "type": "array", + "uniqueItems": true, + "permission": "restricted_fields", + "items": { + "title": "Static Content Definition", + "description": "Link to UserContent Item plus location.", + "type": "object", + "required": [ + "location", + "content" + ], + "properties": { + "content": { + "type": "string", + "linkTo": "UserContent", + "title": "Link to Content", + "description": "A UserContent Item." + }, + "location": { + "type": "string", + "title": "Location of Content", + "description": "Where this content should be displayed. Item schemas could potentially define an enum to contrain values.", + "default": "header" + }, + "description": { + "type": "string", + "title": "Description", + "description": "Description or note about this content. Might be displayed as a footnote or caption, if applicable for view." + } + } + }, + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "released", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "identifier": { + "title": "Identifier", + "description": "Unique, identifying name for the item", + "type": "string", + "uniqueKey": true, + "pattern": "^[A-Za-z0-9-_]+$", + "minLength": 2, + "permission": "restricted_fields", + "readonly": true + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "leader": { + "title": "Leader", + "description": "The leader of the submission center", + "type": "string", + "linkTo": "User" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/SubmissionCenter", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "Therapeutic": { + "title": "Therapeutic", + "$id": "/profiles/therapeutic.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "agent", + "medical_history", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "dependentRequired": { + "dose": [ + "dose_units" + ], + "dose_units": [ + "dose" + ] + }, + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "TX", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "dose": { + "title": "Dose", + "description": "Dose of the therapeutic used by the individual", + "type": "number", + "minimum": 0 + }, + "dose_units": { + "title": "Dose Units", + "description": "Units for the dose of the therapeutic", + "type": "string", + "enum": [ + "mg", + "mL" + ] + }, + "frequency": { + "title": "Frequency", + "description": "Frequency of administration of the therapeutic", + "type": "string", + "enum": [ + "Once Per Day", + "Twice Per Day" + ] + }, + "agent": { + "title": "Agent", + "description": "Link to the associated ontology term for the therapeutic agent", + "type": "string", + "linkTo": "OntologyTerm" + }, + "diagnosis": { + "title": "Diagnosis", + "description": "Link to the associated diagnosis", + "type": "string", + "linkTo": "Diagnosis" + }, + "medical_history": { + "title": "Medical History", + "description": "Link to the associated medical history", + "type": "string", + "linkTo": "MedicalHistory" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Therapeutic", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "Tissue": { + "title": "Tissue", + "$id": "/profiles/tissue.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "donor", + "submission_centers", + "submitted_id", + "uberon_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "sample_source.json#/properties" + } + ], + "properties": { + "accession": { + "accessionType": "TI", + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "readonly": true + }, + "schema_version": { + "default": "1", + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [] + }, + "sample_count": { + "title": "Sample Count", + "description": "Number of samples produced for this source", + "type": "integer", + "minimum": 1 + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "ischemic_time": { + "title": "Ischemic Time", + "description": "Time interval of ischemia in minutes", + "type": "integer", + "minimum": 0 + }, + "pathology_notes": { + "title": "Pathology Notes", + "description": "Notes from pathologist report on the tissue", + "type": "string" + }, + "ph": { + "title": "pH", + "description": "pH of the tissue", + "type": "number", + "minimum": 0, + "maximum": 14 + }, + "preservation_time_interval": { + "title": "Preservation Time Interval", + "description": "Time interval from beginning of tissue recovery until placed in preservation media in minutes", + "type": "integer", + "minimum": 0 + }, + "prosector_notes": { + "title": "Prosector Notes", + "description": "Notes from prosector report on the tissue recovery", + "type": "string" + }, + "recovery_datetime": { + "title": "Recovery Datetime", + "description": "Date and time of tissue recovery", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ] + }, + "recovery_interval": { + "title": "Recovery Interval", + "description": "Total time interval of tissue recovery in minutes", + "type": "integer", + "minimum": 0 + }, + "size": { + "title": "Size", + "description": "Size of the tissue in cubic centimeters", + "type": "number", + "minimum": 0 + }, + "uberon_id": { + "title": "Uberon Id", + "description": "Uberon identifier for the tissue", + "type": "string", + "pattern": "^UBERON:[0-9]{7}$" + }, + "volume": { + "title": "Volume", + "description": "Volume of the tissue in milliliters", + "type": "number", + "minimum": 0 + }, + "weight": { + "title": "Weight", + "description": "Weight of the tissue in grams", + "type": "number", + "minimum": 0 + }, + "donor": { + "title": "Donor", + "description": "Link to the associated donor", + "type": "string", + "linkTo": "Donor" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Tissue", + "children": [], + "rdfs:subClassOf": "/profiles/SampleSource.json", + "isAbstract": false + }, + "TissueCollection": { + "title": "Tissue Collection", + "$id": "/profiles/tissue_collection.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "donor", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/protocols" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "protocols": { + "title": "Protocols", + "description": "Protocols providing experimental details", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Protocol" + } + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "TC", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "blood_cultures_available": { + "title": "Blood Cultures Available", + "description": "Whether blood cultures were drawn during tissue collection", + "type": "string", + "enum": [ + "Yes", + "No", + "Unknown" + ] + }, + "chest_incision_datetime": { + "title": "Chest Incision Time", + "description": "Date and time of chest incision for tissue collection", + "type": "string", + "format": "date-time" + }, + "collection_site": { + "title": "Collection Site", + "description": "Site of tissue collection", + "type": "string", + "enum": [ + "TBD" + ] + }, + "core_body_temperature": { + "title": "Core Body Temperature", + "description": "Body temperature of the donor during tissue collection in degrees Celsius", + "type": "number", + "minimum": 0 + }, + "core_body_temperature_location": { + "title": "Core Body Temperature Location", + "description": "Location of body temperature measurement for the donor during tissue collection", + "type": "string", + "enum": [ + "Axilla", + "Anus" + ] + }, + "cross_clamp_applied_datetime": { + "title": "Cross Clamp Applied Time", + "description": "Date and time when cross clamp was applied during tissue collection", + "type": "string", + "format": "date-time" + }, + "donor_type": { + "title": "Donor Type", + "type": "string", + "enum": [ + "TBD" + ] + }, + "ischemic_time": { + "title": "Ischemic Time", + "description": "Time interval in minutes of ischemia for tissue collection", + "type": "number", + "minimum": 0 + }, + "organ_transplant": { + "title": "Organ Transplant", + "description": "Whether the donor had organs removed for transplant", + "type": "string", + "enum": [ + "Yes", + "No", + "Unknown" + ] + }, + "organs_transplanted": { + "title": "Organs Transplanted", + "description": "The organs of the donor that were transplanted", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Cornea", + "Heart", + "Intestine", + "Kidney", + "Liver", + "Lung", + "Pancreas", + "Skin" + ] + } + }, + "recovery_kit_id": { + "title": "Recovery Kit Id", + "description": "Identifier of the tissue recovery kit", + "type": "string" + }, + "refrigeration_prior_to_procurement": { + "title": "Refrigeration Prior To Procurement", + "description": "Whether the donor was refrigerated prior to tissue collection", + "type": "string", + "enum": [ + "Yes", + "No", + "Unknown" + ] + }, + "refrigeration_prior_to_procurement_time": { + "title": "Refrigeration Prior To Procurement Time", + "description": "Interval of time in hours the donor was refrigerated prior to tissue collection", + "type": "number", + "minimum": 0 + }, + "ventilator_less_than_24_hours": { + "title": "Ventilator Less Than 24 Hours", + "description": "Whether donor was on a ventilator less than 24 hours prior to tissue collection", + "type": "string", + "enum": [ + "Yes", + "No", + "Unknown" + ] + }, + "donor": { + "title": "Donor", + "description": "Link to the associated donor", + "type": "string", + "linkTo": "Donor" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/TissueCollection", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "TissueSample": { + "title": "Tissue Sample", + "$id": "/profiles/tissue_sample.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "sample_sources", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/protocols" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "sample.json#/properties" + } + ], + "properties": { + "accession": { + "accessionType": "TS", + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "readonly": true + }, + "schema_version": { + "default": "1", + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [] + }, + "preservation_medium": { + "title": "Preservation Medium", + "description": "Medium used for sample preservation", + "type": "string", + "enum": [ + "TBD" + ] + }, + "preservation_type": { + "title": "Preservation Type", + "description": "Method of sample preservation", + "type": "string", + "enum": [ + "Fresh", + "Frozen" + ] + }, + "sample_preparation": { + "title": "Sample Preparation", + "description": "Link to associated sample preparation", + "type": "string", + "linkTo": "SamplePreparation" + }, + "sample_sources": { + "title": "Sample Sources", + "description": "Link to associated sample sources", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Tissue" + } + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "protocols": { + "title": "Protocols", + "description": "Protocols providing experimental details", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Protocol" + } + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "tissue_location": { + "title": "Tissue Location", + "description": "Original location of sample within source tissue", + "type": "string", + "enum": [ + "TBD" + ] + }, + "weight": { + "title": "Weight", + "description": "Weight of the sample (mg)", + "type": "number", + "minimum": 0 + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/TissueSample", + "children": [], + "rdfs:subClassOf": "/profiles/Sample.json", + "isAbstract": false + }, + "Treatment": { + "title": "Treatment", + "$id": "/profiles/treatment.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "agent", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "TX", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "agent": { + "title": "Agent", + "description": "Agent in the treatment", + "type": "string", + "linkTo": "OntologyTerm" + }, + "concentration": { + "title": "Concentration", + "description": "Concentration of the treatment", + "type": "number", + "minimum": 0 + }, + "concentration_units": { + "title": "Concentration Units", + "description": "Units for the concentration of the treatment", + "type": "string", + "enum": [ + "mg/mL" + ] + }, + "duration": { + "title": "Duration", + "description": "Duration of the treatment (minutes)", + "type": "number", + "minimum": 0 + }, + "temperature": { + "title": "Temperature", + "description": "Temperature of the treatment (Celsius)", + "type": "number" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Treatment", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "UnalignedReads": { + "title": "Unaligned Reads", + "$id": "/profiles/unaligned_reads.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "data_category", + "data_type", + "file_format", + "file_sets", + "filename", + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "file.json#/properties" + }, + { + "$ref": "submitted_file.json#/properties" + } + ], + "properties": { + "schema_version": { + "default": "1", + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [] + }, + "derived_from": { + "title": "Derived From", + "description": "Files used as input to create this file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmittedFile" + } + }, + "file_sets": { + "title": "File Sets", + "description": "File collections associated with this file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "FileSet" + } + }, + "software": { + "title": "Software", + "description": "Software used to create this file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Software" + } + }, + "accession": { + "accessionType": "UR", + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "uploading", + "enum": [ + "uploading", + "uploaded", + "upload failed", + "to be uploaded by workflow", + "released", + "in review", + "obsolete", + "archived", + "deleted", + "public" + ] + }, + "file_format": { + "ff_flag": "filter:valid_item_types", + "linkTo": "FileFormat", + "title": "File Format", + "type": "string" + }, + "filename": { + "description": "The local file name used at time of submission. Must be alphanumeric, with the exception of the following special characters: '+=,.@-_'", + "pattern": "^[\\w+=,.@-]*$", + "title": "File Name", + "type": "string" + }, + "file_size": { + "comment": "File size is specified in bytes - presumably this can be a calculated property as well", + "description": "Size of file on disk", + "exclude_from": [ + "FFedit-create" + ], + "permission": "restricted_fields", + "title": "File Size", + "type": "integer", + "readonly": true + }, + "md5sum": { + "comment": "This can vary for files of same content gzipped at different times", + "description": "The MD5 checksum of the file being transferred", + "exclude_from": [ + "FFedit-create" + ], + "format": "hex", + "permission": "restricted_fields", + "title": "MD5 Checksum", + "type": "string", + "readonly": true + }, + "content_md5sum": { + "comment": "This is only relavant for gzipped files", + "description": "The MD5 checksum of the uncompressed file", + "exclude_from": [ + "FFedit-create" + ], + "format": "hex", + "permission": "restricted_fields", + "title": "Content MD5 Checksum", + "type": "string", + "uniqueKey": "file:content_md5sum", + "readonly": true + }, + "quality_metrics": { + "description": "Associated QC reports", + "items": { + "description": "Associated QC report", + "linkTo": "QualityMetric", + "title": "Quality Metric", + "type": "string" + }, + "minItems": 1, + "permission": "restricted_fields", + "title": "Quality Metrics", + "type": "array", + "uniqueItems": true, + "readonly": true + }, + "data_category": { + "title": "Data Category", + "description": "Category for information in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Sequencing Reads" + ] + } + }, + "data_type": { + "title": "Data Type", + "description": "Detailed type of information in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Unaligned Reads" + ] + } + }, + "o2_path": { + "title": "O2 Path", + "description": "Path to file on O2", + "type": "string" + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "paired_with": { + "description": "Link to associated paired-end file, if applicable", + "type": "string", + "linkTo": "UnalignedReads" + }, + "read_pair_number": { + "description": "Read pair number, if paired-end", + "type": "string", + "enum": [ + "R1", + "R2", + "Not Applicable" + ] + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + }, + "href": { + "title": "Download URL", + "type": "string", + "description": "Use this link to download this file", + "calculatedProperty": true + }, + "upload_credentials": { + "type": "object", + "calculatedProperty": true + }, + "upload_key": { + "title": "Upload Key", + "type": "string", + "description": "File object name in S3", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/UnalignedReads", + "children": [], + "rdfs:subClassOf": "/profiles/SubmittedFile.json", + "isAbstract": false + }, + "User": { + "title": "User", + "$id": "/profiles/user.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "email", + "first_name", + "last_name" + ], + "identifyingProperties": [ + "email", + "aliases", + "email", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "first_name": { + "title": "First name", + "description": "The user's first (given) name", + "type": "string", + "lookup": 30 + }, + "email": { + "title": "Account Email", + "description": "Email used to log in to the portal", + "type": "string", + "format": "email", + "uniqueKey": true + }, + "groups": { + "title": "Groups", + "description": "Additional access control groups", + "note": "USE WITH CAUTION - currently how we add admin access to a user", + "type": "array", + "uniqueItems": true, + "permission": "restricted_fields", + "items": { + "type": "string", + "enum": [ + "admin" + ] + }, + "readonly": true + }, + "last_name": { + "title": "Last name", + "description": "The user's last (family) name", + "type": "string", + "lookup": 40 + }, + "preferred_email": { + "title": "Preferred Contact Email", + "description": "Email to contact by, if different from account/sign-in e-mail address", + "type": "string", + "format": "email" + }, + "status": { + "title": "Status", + "type": "string", + "default": "current", + "permission": "restricted_fields", + "enum": [ + "current", + "deleted", + "inactive", + "revoked" + ], + "readonly": true + }, + "time_zone": { + "title": "Timezone", + "description": "The timezone the user is associated with", + "type": "string", + "default": "US/Eastern", + "enum": [ + "Africa/Abidjan", + "Africa/Accra", + "Africa/Addis_Ababa", + "Africa/Algiers", + "Africa/Asmara", + "Africa/Bamako", + "Africa/Bangui", + "Africa/Banjul", + "Africa/Bissau", + "Africa/Blantyre", + "Africa/Brazzaville", + "Africa/Bujumbura", + "Africa/Cairo", + "Africa/Casablanca", + "Africa/Ceuta", + "Africa/Conakry", + "Africa/Dakar", + "Africa/Dar_es_Salaam", + "Africa/Djibouti", + "Africa/Douala", + "Africa/El_Aaiun", + "Africa/Freetown", + "Africa/Gaborone", + "Africa/Harare", + "Africa/Johannesburg", + "Africa/Juba", + "Africa/Kampala", + "Africa/Khartoum", + "Africa/Kigali", + "Africa/Kinshasa", + "Africa/Lagos", + "Africa/Libreville", + "Africa/Lome", + "Africa/Luanda", + "Africa/Lubumbashi", + "Africa/Lusaka", + "Africa/Malabo", + "Africa/Maputo", + "Africa/Maseru", + "Africa/Mbabane", + "Africa/Mogadishu", + "Africa/Monrovia", + "Africa/Nairobi", + "Africa/Ndjamena", + "Africa/Niamey", + "Africa/Nouakchott", + "Africa/Ouagadougou", + "Africa/Porto-Novo", + "Africa/Sao_Tome", + "Africa/Tripoli", + "Africa/Tunis", + "Africa/Windhoek", + "America/Adak", + "America/Anchorage", + "America/Anguilla", + "America/Antigua", + "America/Araguaina", + "America/Argentina/Buenos_Aires", + "America/Argentina/Catamarca", + "America/Argentina/Cordoba", + "America/Argentina/Jujuy", + "America/Argentina/La_Rioja", + "America/Argentina/Mendoza", + "America/Argentina/Rio_Gallegos", + "America/Argentina/Salta", + "America/Argentina/San_Juan", + "America/Argentina/San_Luis", + "America/Argentina/Tucuman", + "America/Argentina/Ushuaia", + "America/Aruba", + "America/Asuncion", + "America/Atikokan", + "America/Bahia", + "America/Bahia_Banderas", + "America/Barbados", + "America/Belem", + "America/Belize", + "America/Blanc-Sablon", + "America/Boa_Vista", + "America/Bogota", + "America/Boise", + "America/Cambridge_Bay", + "America/Campo_Grande", + "America/Cancun", + "America/Caracas", + "America/Cayenne", + "America/Cayman", + "America/Chicago", + "America/Chihuahua", + "America/Costa_Rica", + "America/Creston", + "America/Cuiaba", + "America/Curacao", + "America/Danmarkshavn", + "America/Dawson", + "America/Dawson_Creek", + "America/Denver", + "America/Detroit", + "America/Dominica", + "America/Edmonton", + "America/Eirunepe", + "America/El_Salvador", + "America/Fortaleza", + "America/Glace_Bay", + "America/Godthab", + "America/Goose_Bay", + "America/Grand_Turk", + "America/Grenada", + "America/Guadeloupe", + "America/Guatemala", + "America/Guayaquil", + "America/Guyana", + "America/Halifax", + "America/Havana", + "America/Hermosillo", + "America/Indiana/Indianapolis", + "America/Indiana/Knox", + "America/Indiana/Marengo", + "America/Indiana/Petersburg", + "America/Indiana/Tell_City", + "America/Indiana/Vevay", + "America/Indiana/Vincennes", + "America/Indiana/Winamac", + "America/Inuvik", + "America/Iqaluit", + "America/Jamaica", + "America/Juneau", + "America/Kentucky/Louisville", + "America/Kentucky/Monticello", + "America/Kralendijk", + "America/La_Paz", + "America/Lima", + "America/Los_Angeles", + "America/Lower_Princes", + "America/Maceio", + "America/Managua", + "America/Manaus", + "America/Marigot", + "America/Martinique", + "America/Matamoros", + "America/Mazatlan", + "America/Menominee", + "America/Merida", + "America/Metlakatla", + "America/Mexico_City", + "America/Miquelon", + "America/Moncton", + "America/Monterrey", + "America/Montevideo", + "America/Montreal", + "America/Montserrat", + "America/Nassau", + "America/New_York", + "America/Nipigon", + "America/Nome", + "America/Noronha", + "America/North_Dakota/Beulah", + "America/North_Dakota/Center", + "America/North_Dakota/New_Salem", + "America/Ojinaga", + "America/Panama", + "America/Pangnirtung", + "America/Paramaribo", + "America/Phoenix", + "America/Port-au-Prince", + "America/Port_of_Spain", + "America/Porto_Velho", + "America/Puerto_Rico", + "America/Rainy_River", + "America/Rankin_Inlet", + "America/Recife", + "America/Regina", + "America/Resolute", + "America/Rio_Branco", + "America/Santa_Isabel", + "America/Santarem", + "America/Santiago", + "America/Santo_Domingo", + "America/Sao_Paulo", + "America/Scoresbysund", + "America/Shiprock", + "America/Sitka", + "America/St_Barthelemy", + "America/St_Johns", + "America/St_Kitts", + "America/St_Lucia", + "America/St_Thomas", + "America/St_Vincent", + "America/Swift_Current", + "America/Tegucigalpa", + "America/Thule", + "America/Thunder_Bay", + "America/Tijuana", + "America/Toronto", + "America/Tortola", + "America/Vancouver", + "America/Whitehorse", + "America/Winnipeg", + "America/Yakutat", + "America/Yellowknife", + "Antarctica/Casey", + "Antarctica/Davis", + "Antarctica/DumontDUrville", + "Antarctica/Macquarie", + "Antarctica/Mawson", + "Antarctica/McMurdo", + "Antarctica/Palmer", + "Antarctica/Rothera", + "Antarctica/South_Pole", + "Antarctica/Syowa", + "Antarctica/Vostok", + "Arctic/Longyearbyen", + "Asia/Aden", + "Asia/Almaty", + "Asia/Amman", + "Asia/Anadyr", + "Asia/Aqtau", + "Asia/Aqtobe", + "Asia/Ashgabat", + "Asia/Baghdad", + "Asia/Bahrain", + "Asia/Baku", + "Asia/Bangkok", + "Asia/Beirut", + "Asia/Bishkek", + "Asia/Brunei", + "Asia/Choibalsan", + "Asia/Chongqing", + "Asia/Colombo", + "Asia/Damascus", + "Asia/Dhaka", + "Asia/Dili", + "Asia/Dubai", + "Asia/Dushanbe", + "Asia/Gaza", + "Asia/Harbin", + "Asia/Hebron", + "Asia/Ho_Chi_Minh", + "Asia/Hong_Kong", + "Asia/Hovd", + "Asia/Irkutsk", + "Asia/Jakarta", + "Asia/Jayapura", + "Asia/Jerusalem", + "Asia/Kabul", + "Asia/Kamchatka", + "Asia/Karachi", + "Asia/Kashgar", + "Asia/Kathmandu", + "Asia/Khandyga", + "Asia/Kolkata", + "Asia/Krasnoyarsk", + "Asia/Kuala_Lumpur", + "Asia/Kuching", + "Asia/Kuwait", + "Asia/Macau", + "Asia/Magadan", + "Asia/Makassar", + "Asia/Manila", + "Asia/Muscat", + "Asia/Nicosia", + "Asia/Novokuznetsk", + "Asia/Novosibirsk", + "Asia/Omsk", + "Asia/Oral", + "Asia/Phnom_Penh", + "Asia/Pontianak", + "Asia/Pyongyang", + "Asia/Qatar", + "Asia/Qyzylorda", + "Asia/Rangoon", + "Asia/Riyadh", + "Asia/Sakhalin", + "Asia/Samarkand", + "Asia/Seoul", + "Asia/Shanghai", + "Asia/Singapore", + "Asia/Taipei", + "Asia/Tashkent", + "Asia/Tbilisi", + "Asia/Tehran", + "Asia/Thimphu", + "Asia/Tokyo", + "Asia/Ulaanbaatar", + "Asia/Urumqi", + "Asia/Ust-Nera", + "Asia/Vientiane", + "Asia/Vladivostok", + "Asia/Yakutsk", + "Asia/Yekaterinburg", + "Asia/Yerevan", + "Atlantic/Azores", + "Atlantic/Bermuda", + "Atlantic/Canary", + "Atlantic/Cape_Verde", + "Atlantic/Faroe", + "Atlantic/Madeira", + "Atlantic/Reykjavik", + "Atlantic/South_Georgia", + "Atlantic/St_Helena", + "Atlantic/Stanley", + "Australia/Adelaide", + "Australia/Brisbane", + "Australia/Broken_Hill", + "Australia/Currie", + "Australia/Darwin", + "Australia/Eucla", + "Australia/Hobart", + "Australia/Lindeman", + "Australia/Lord_Howe", + "Australia/Melbourne", + "Australia/Perth", + "Australia/Sydney", + "Canada/Atlantic", + "Canada/Central", + "Canada/Eastern", + "Canada/Mountain", + "Canada/Newfoundland", + "Canada/Pacific", + "Europe/Amsterdam", + "Europe/Andorra", + "Europe/Athens", + "Europe/Belgrade", + "Europe/Berlin", + "Europe/Bratislava", + "Europe/Brussels", + "Europe/Bucharest", + "Europe/Budapest", + "Europe/Busingen", + "Europe/Chisinau", + "Europe/Copenhagen", + "Europe/Dublin", + "Europe/Gibraltar", + "Europe/Guernsey", + "Europe/Helsinki", + "Europe/Isle_of_Man", + "Europe/Istanbul", + "Europe/Jersey", + "Europe/Kaliningrad", + "Europe/Kiev", + "Europe/Lisbon", + "Europe/Ljubljana", + "Europe/London", + "Europe/Luxembourg", + "Europe/Madrid", + "Europe/Malta", + "Europe/Mariehamn", + "Europe/Minsk", + "Europe/Monaco", + "Europe/Moscow", + "Europe/Oslo", + "Europe/Paris", + "Europe/Podgorica", + "Europe/Prague", + "Europe/Riga", + "Europe/Rome", + "Europe/Samara", + "Europe/San_Marino", + "Europe/Sarajevo", + "Europe/Simferopol", + "Europe/Skopje", + "Europe/Sofia", + "Europe/Stockholm", + "Europe/Tallinn", + "Europe/Tirane", + "Europe/Uzhgorod", + "Europe/Vaduz", + "Europe/Vatican", + "Europe/Vienna", + "Europe/Vilnius", + "Europe/Volgograd", + "Europe/Warsaw", + "Europe/Zagreb", + "Europe/Zaporozhye", + "Europe/Zurich", + "GMT", + "Indian/Antananarivo", + "Indian/Chagos", + "Indian/Christmas", + "Indian/Cocos", + "Indian/Comoro", + "Indian/Kerguelen", + "Indian/Mahe", + "Indian/Maldives", + "Indian/Mauritius", + "Indian/Mayotte", + "Indian/Reunion", + "Pacific/Apia", + "Pacific/Auckland", + "Pacific/Chatham", + "Pacific/Chuuk", + "Pacific/Easter", + "Pacific/Efate", + "Pacific/Enderbury", + "Pacific/Fakaofo", + "Pacific/Fiji", + "Pacific/Funafuti", + "Pacific/Galapagos", + "Pacific/Gambier", + "Pacific/Guadalcanal", + "Pacific/Guam", + "Pacific/Honolulu", + "Pacific/Johnston", + "Pacific/Kiritimati", + "Pacific/Kosrae", + "Pacific/Kwajalein", + "Pacific/Majuro", + "Pacific/Marquesas", + "Pacific/Midway", + "Pacific/Nauru", + "Pacific/Niue", + "Pacific/Norfolk", + "Pacific/Noumea", + "Pacific/Pago_Pago", + "Pacific/Palau", + "Pacific/Pitcairn", + "Pacific/Pohnpei", + "Pacific/Port_Moresby", + "Pacific/Rarotonga", + "Pacific/Saipan", + "Pacific/Tahiti", + "Pacific/Tarawa", + "Pacific/Tongatapu", + "Pacific/Wake", + "Pacific/Wallis", + "US/Alaska", + "US/Arizona", + "US/Central", + "US/Eastern", + "US/Hawaii", + "US/Mountain", + "US/Pacific", + "UTC" + ] + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + }, + "title": { + "title": "Title", + "type": "string", + "calculatedProperty": true + }, + "contact_email": { + "title": "Contact Email", + "type": "string", + "format": "email", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/User", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "VariantCalls": { + "title": "Variant Calls", + "$id": "/profiles/variant_calls.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "data_category", + "data_type", + "file_format", + "file_sets", + "filename", + "reference_genome", + "submission_centers", + "submitted_id", + "variant_type" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/reference_genome" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "mixins.json#/variant_type" + }, + { + "$ref": "file.json#/properties" + }, + { + "$ref": "submitted_file.json#/properties" + } + ], + "properties": { + "schema_version": { + "default": "1", + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [] + }, + "derived_from": { + "title": "Derived From", + "description": "Files used as input to create this file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmittedFile" + } + }, + "file_sets": { + "title": "File Sets", + "description": "File collections associated with this file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "FileSet" + } + }, + "software": { + "title": "Software", + "description": "Software used to create this file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Software" + } + }, + "accession": { + "accessionType": "VC", + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "uploading", + "enum": [ + "uploading", + "uploaded", + "upload failed", + "to be uploaded by workflow", + "released", + "in review", + "obsolete", + "archived", + "deleted", + "public" + ] + }, + "file_format": { + "ff_flag": "filter:valid_item_types", + "linkTo": "FileFormat", + "title": "File Format", + "type": "string" + }, + "filename": { + "description": "The local file name used at time of submission. Must be alphanumeric, with the exception of the following special characters: '+=,.@-_'", + "pattern": "^[\\w+=,.@-]*$", + "title": "File Name", + "type": "string" + }, + "file_size": { + "comment": "File size is specified in bytes - presumably this can be a calculated property as well", + "description": "Size of file on disk", + "exclude_from": [ + "FFedit-create" + ], + "permission": "restricted_fields", + "title": "File Size", + "type": "integer", + "readonly": true + }, + "md5sum": { + "comment": "This can vary for files of same content gzipped at different times", + "description": "The MD5 checksum of the file being transferred", + "exclude_from": [ + "FFedit-create" + ], + "format": "hex", + "permission": "restricted_fields", + "title": "MD5 Checksum", + "type": "string", + "readonly": true + }, + "content_md5sum": { + "comment": "This is only relavant for gzipped files", + "description": "The MD5 checksum of the uncompressed file", + "exclude_from": [ + "FFedit-create" + ], + "format": "hex", + "permission": "restricted_fields", + "title": "Content MD5 Checksum", + "type": "string", + "uniqueKey": "file:content_md5sum", + "readonly": true + }, + "quality_metrics": { + "description": "Associated QC reports", + "items": { + "description": "Associated QC report", + "linkTo": "QualityMetric", + "title": "Quality Metric", + "type": "string" + }, + "minItems": 1, + "permission": "restricted_fields", + "title": "Quality Metrics", + "type": "array", + "uniqueItems": true, + "readonly": true + }, + "data_category": { + "title": "Data Category", + "description": "Category for information in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Variant Calls" + ] + } + }, + "data_type": { + "title": "Data Type", + "description": "Detailed type of information in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Germline Variants", + "Somatic Variants" + ] + } + }, + "o2_path": { + "title": "O2 Path", + "description": "Path to file on O2", + "type": "string" + }, + "variant_type": { + "title": "Variant Type", + "description": "Variant types included in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Copy Number Variant", + "Insertion-deletion", + "Mobile Element Insertion", + "Single Nucleotide Variant", + "Structural Variant" + ] + } + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "reference_genome": { + "title": "Reference Genome", + "description": "Reference genome used for alignment", + "type": "string", + "linkTo": "ReferenceGenome" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + }, + "href": { + "title": "Download URL", + "type": "string", + "description": "Use this link to download this file", + "calculatedProperty": true + }, + "upload_credentials": { + "type": "object", + "calculatedProperty": true + }, + "upload_key": { + "title": "Upload Key", + "type": "string", + "description": "File object name in S3", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/VariantCalls", + "children": [], + "rdfs:subClassOf": "/profiles/SubmittedFile.json", + "isAbstract": false + }, + "Workflow": { + "title": "Workflow", + "$id": "/profiles/workflow.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "category", + "name", + "title" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "accession", + "aliases", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/category" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/name" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "mixins.json#/version" + } + ], + "properties": { + "version": { + "title": "Version", + "description": "Version for the item", + "type": "string", + "pattern": "^([0-9]+.)*[0-9]+$" + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "name": { + "title": "Name", + "description": "Name of the item", + "type": "string", + "pattern": "^[A-Za-z0-9-_]+$", + "minLength": 3, + "comment": "Not for identifying name; use 'identifier' for that purpose." + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "category": { + "title": "Category", + "comment": "Intended for primary classification of an item, i.e. as a property to use instead of file_type for File", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Alignment", + "Alignment Manipulation", + "Annotation", + "Format Conversion", + "Quality Control", + "Read Manipulation", + "Testing", + "Variant Calling", + "Variant Manipulation" + ] + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "WF", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "previous_versions": { + "title": "Previous versions", + "description": "Link to the previous versions of the workflow.", + "type": "array", + "items": { + "title": "Previous version", + "description": "Link to a previous version of the workflow.", + "type": "string", + "linkTo": "Workflow" + } + }, + "software": { + "title": "Software", + "description": "List of software items used in the workflow", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "title": "Software", + "description": "Software used in the workflow", + "linkTo": "Software" + } + }, + "version_upgrade_log": { + "title": "Version upgrade log", + "description": "Version upgrade log", + "type": "string" + }, + "arguments": { + "title": "Workflow Arguments", + "description": "Arguments of the workflow", + "type": "array", + "minItems": 1, + "items": { + "title": "Argument", + "description": "An argument of the workflow", + "type": "object", + "required": [ + "argument_type", + "workflow_argument_name" + ], + "additionalProperties": false, + "properties": { + "argument_format": { + "title": "Format", + "description": "Argument Format", + "type": "string", + "linkTo": "FileFormat" + }, + "argument_to_be_attached_to": { + "title": "Argument To Be Attached To", + "description": "Argument to be attached to, for qc files and input extra files", + "type": "string" + }, + "argument_type": { + "title": "Type", + "description": "Argument Type", + "type": "string", + "enum": [ + "Input file", + "Output processed file", + "Generic QC file", + "Output report file", + "Output to-be-extra-input file", + "parameter", + "QC ruleset", + "NA" + ] + }, + "mount": { + "title": "Mount", + "description": "Whether the input file should be mounted instead of downlaoded to EC2", + "type": "boolean" + }, + "qc_json": { + "title": "QC Json", + "description": "Name of QC file if in .json format, either as it is or in the zipped file", + "type": "boolean" + }, + "qc_zipped": { + "title": "QC Zipped", + "description": "Name of QC file if in .zip format", + "type": "boolean" + }, + "secondary_file_formats": { + "title": "secondary file formats", + "description": "formats for secondary files", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "title": "secondary_file_format", + "description": "formats for secondary file", + "type": "string", + "linkTo": "FileFormat" + } + }, + "workflow_argument_name": { + "title": "Name", + "description": "Name of the argument of the workflow.", + "type": "string" + } + } + } + }, + "child_file_names": { + "title": "Child File Names", + "description": "Names of the other files used by the main file for the workflow", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "directory_url": { + "title": "Directory URL", + "description": "URL of the directory that contains main and associated files", + "type": "string" + }, + "language": { + "title": "Workflow Language", + "type": "string", + "enum": [ + "CWL", + "WDL" + ] + }, + "main_file_name": { + "title": "Main File Name", + "description": "Name of the main file for the workflow", + "type": "string" + }, + "tibanna_config": { + "title": "Tibanna Config", + "description": "Tibanna configuration for execution", + "type": "object", + "additionalProperties": false, + "required": [ + "instance_type", + "run_name" + ], + "properties": { + "behavior_on_capacity_limit": { + "title": "Behavior on Capacity Limit", + "type": "string", + "enum": [ + "wait_and_retry" + ], + "default": "wait_and_retry" + }, + "cpu": { + "title": "CPU", + "type": "integer" + }, + "ebs_iops": { + "title": "EBS IOPS", + "description": "EBS input/output operations per second", + "type": "integer", + "minimum": 0 + }, + "ebs_throughput": { + "title": "EBS Throughput", + "description": "EBS throughput, in MiB/s", + "type": "integer", + "minimum": 0 + }, + "ebs_optimized": { + "title": "EBS Optimized", + "type": "boolean" + }, + "ebs_size": { + "title": "EBS Size", + "type": [ + "string", + "integer" + ], + "pattern": "^([0-9]+[.])?[0-9]+[x]$", + "minimum": 0 + }, + "instance_type": { + "title": "Instance Type", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^[a-z][a-z0-9-]+[.][0-9]*[a-z-*]+$" + } + }, + "memory": { + "title": "Memory", + "type": "number" + }, + "run_name": { + "title": "Run Name", + "type": "string" + }, + "spot_instance": { + "title": "Spot Instance", + "type": "boolean" + } + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Workflow", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "WorkflowRun": { + "title": "Workflow Run", + "$id": "/profiles/workflow_run.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "workflow" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "aliases", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "input_files": { + "title": "Input files", + "description": "The files used as initial input for the workflow.", + "type": "array", + "minItems": 1, + "items": { + "title": "Input file mapping", + "description": "Info on file used as input and mapping to CWL argument for the workflow.", + "type": "object", + "additionalProperties": false, + "properties": { + "workflow_argument_name": { + "title": "Workflow argument name", + "description": "the name of the argument of the workflow that corresponds to the input file", + "type": "string" + }, + "value": { + "title": "Input file", + "description": "a specified input file", + "type": "string", + "linkTo": "File" + }, + "ordinal": { + "title": "Ordinal", + "description": "Ordinal of the file in the argument", + "type": "number", + "default": 1 + }, + "dimension": { + "title": "Dimension", + "description": "Dimension of the file in the argument, in format of e.g. \"0\" (singlet or 1D array), \"1-2\" (2D array), or \"2-0-1\" (3D array)", + "type": "string", + "default": "0" + }, + "format_if_extra": { + "title": "Format of extra file", + "description": "the file format if the input file is an extra file of a file object", + "type": "string", + "linkTo": "FileFormat" + }, + "notes": { + "description": "internal notes", + "type": "string" + } + } + } + }, + "output_files": { + "title": "Output files", + "description": "All files that are saved as output of the workflow", + "type": "array", + "minItems": 1, + "items": { + "title": "Output file mapping", + "description": "Info on file output by the workflow and how it is mapped to CWL arguments.", + "type": "object", + "additionalProperties": false, + "properties": { + "workflow_argument_name": { + "title": "Workflow argument name", + "description": "Argument name of node in workflow that corresponds to the output file", + "type": "string" + }, + "value": { + "title": "Output file", + "description": "a specified output file", + "type": "string", + "linkTo": "File" + }, + "value_qc": { + "title": "Output Quality Control", + "description": "a specified output report", + "type": "string", + "linkTo": "QualityMetric" + } + } + } + }, + "parameters": { + "title": "parameters", + "description": "Parameters of the workflow run", + "type": "array", + "minItems": 1, + "items": { + "title": "Parameter", + "type": "object", + "additionalProperties": false, + "properties": { + "workflow_argument_name": { + "title": "Workflow argument name", + "description": "the name of the argument of the workflow that corresponds to the parameter", + "type": "string" + }, + "value": { + "title": "Value", + "description": "a specified value for the specified parameter as used in a task", + "type": "string" + }, + "software_parameter": { + "title": "Parameter name", + "description": "the name or flag of the parameter as passed to the software", + "type": "string" + }, + "ordinal": { + "title": "Ordinal", + "description": "Ordinal of the parameter in the argument", + "type": "number", + "default": 1 + }, + "dimension": { + "title": "Dimension", + "description": "Dimension of the parameter in the argument, in format of e.g. \"0\" (singlet or 1D array), \"1-2\" (2D array), or \"2-0-1\" (3D array)", + "type": "string", + "default": "0" + } + } + } + }, + "postrun_json": { + "type": "string", + "title": "Link to Postrun Json", + "description": "Location of the AWSEM postrun json file", + "format": "uri" + }, + "run_status": { + "title": "Run Status", + "type": "string", + "default": "started", + "enum": [ + "started", + "running", + "output_files_transferring", + "output_file_transfer_finished", + "complete", + "error" + ] + }, + "run_url": { + "type": "string", + "description": "Url to AWS run info", + "format": "uri" + }, + "workflow": { + "title": "Workflow", + "description": "The workflow that was run.", + "type": "string", + "linkTo": "Workflow" + }, + "job_id": { + "title": "Job ID", + "type": "string" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "facets": {}, + "columns": {}, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/WorkflowRun", + "children": [], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": false + }, + "Item": { + "type": "object", + "properties": { + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Item", + "children": [ + "/profiles/AccessKey.json", + "/profiles/Analyte.json", + "/profiles/CellLine.json", + "/profiles/Consortium.json", + "/profiles/DeathCircumstances.json", + "/profiles/Demographic.json", + "/profiles/Diagnosis.json", + "/profiles/Document.json", + "/profiles/Donor.json", + "/profiles/Exposure.json", + "/profiles/FileFormat.json", + "/profiles/FileSet.json", + "/profiles/FilterSet.json", + "/profiles/HiglassViewConfig.json", + "/profiles/Histology.json", + "/profiles/Image.json", + "/profiles/IngestionSubmission.json", + "/profiles/Library.json", + "/profiles/MedicalHistory.json", + "/profiles/MetaWorkflow.json", + "/profiles/MetaWorkflowRun.json", + "/profiles/MolecularTest.json", + "/profiles/OntologyTerm.json", + "/profiles/Page.json", + "/profiles/PreparationKit.json", + "/profiles/Protocol.json", + "/profiles/QualityMetric.json", + "/profiles/ReferenceGenome.json", + "/profiles/Sequencing.json", + "/profiles/Software.json", + "/profiles/SubmissionCenter.json", + "/profiles/Therapeutic.json", + "/profiles/TissueCollection.json", + "/profiles/Treatment.json", + "/profiles/User.json", + "/profiles/Workflow.json", + "/profiles/WorkflowRun.json", + "/profiles/File.json", + "/profiles/Preparation.json", + "/profiles/Sample.json", + "/profiles/SampleSource.json", + "/profiles/SubmittedFile.json", + "/profiles/UserContent.json" + ], + "isAbstract": true + }, + "File": { + "title": "File", + "description": "Generic file", + "$id": "/profiles/file.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "data_category", + "data_type", + "file_format" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "accession", + "aliases", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "FI", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "status": { + "title": "Status", + "type": "string", + "default": "uploading", + "enum": [ + "uploading", + "uploaded", + "upload failed", + "to be uploaded by workflow", + "released", + "in review", + "obsolete", + "archived", + "deleted", + "public" + ] + }, + "file_format": { + "ff_flag": "filter:valid_item_types", + "linkTo": "FileFormat", + "title": "File Format", + "type": "string" + }, + "filename": { + "description": "The local file name used at time of submission. Must be alphanumeric, with the exception of the following special characters: '+=,.@-_'", + "pattern": "^[\\w+=,.@-]*$", + "title": "File Name", + "type": "string" + }, + "file_size": { + "comment": "File size is specified in bytes - presumably this can be a calculated property as well", + "description": "Size of file on disk", + "exclude_from": [ + "FFedit-create" + ], + "permission": "restricted_fields", + "title": "File Size", + "type": "integer", + "readonly": true + }, + "md5sum": { + "comment": "This can vary for files of same content gzipped at different times", + "description": "The MD5 checksum of the file being transferred", + "exclude_from": [ + "FFedit-create" + ], + "format": "hex", + "permission": "restricted_fields", + "title": "MD5 Checksum", + "type": "string", + "readonly": true + }, + "content_md5sum": { + "comment": "This is only relavant for gzipped files", + "description": "The MD5 checksum of the uncompressed file", + "exclude_from": [ + "FFedit-create" + ], + "format": "hex", + "permission": "restricted_fields", + "title": "Content MD5 Checksum", + "type": "string", + "uniqueKey": "file:content_md5sum", + "readonly": true + }, + "quality_metrics": { + "description": "Associated QC reports", + "items": { + "description": "Associated QC report", + "linkTo": "QualityMetric", + "title": "Quality Metric", + "type": "string" + }, + "minItems": 1, + "permission": "restricted_fields", + "title": "Quality Metrics", + "type": "array", + "uniqueItems": true, + "readonly": true + }, + "data_category": { + "title": "Data Category", + "description": "Category for information in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Genome Region", + "Quality Control", + "Reference Genome", + "Sequencing Reads", + "Variant Calls" + ] + } + }, + "data_type": { + "title": "Data Type", + "description": "Detailed type of information in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Aligned Reads", + "Germline Variant Calls", + "Image", + "Index", + "Reference Sequence", + "Sequence Interval", + "Somatic Variant Calls", + "Statistics", + "Unaligned Reads" + ] + } + }, + "o2_path": { + "title": "O2 Path", + "description": "Path to file on O2", + "type": "string" + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + }, + "href": { + "title": "Download URL", + "type": "string", + "description": "Use this link to download this file", + "calculatedProperty": true + }, + "upload_credentials": { + "type": "object", + "calculatedProperty": true + }, + "upload_key": { + "title": "Upload Key", + "type": "string", + "description": "File object name in S3", + "calculatedProperty": true + } + }, + "facets": {}, + "columns": {}, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/File", + "children": [ + "/profiles/OutputFile.json", + "/profiles/ReferenceFile.json", + "/profiles/SubmittedFile.json" + ], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": true + }, + "Preparation": { + "title": "Preparation", + "$id": "/profiles/preparation.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "PR", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Preparation", + "children": [ + "/profiles/AnalytePreparation.json", + "/profiles/LibraryPreparation.json", + "/profiles/SamplePreparation.json" + ], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": true + }, + "Sample": { + "title": "Sample", + "$id": "/profiles/sample.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/protocols" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "protocols": { + "title": "Protocols", + "description": "Protocols providing experimental details", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Protocol" + } + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "SA", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "preservation_medium": { + "title": "Preservation Medium", + "description": "Medium used for sample preservation", + "type": "string", + "enum": [ + "TBD" + ] + }, + "preservation_type": { + "title": "Preservation Type", + "description": "Method of sample preservation", + "type": "string", + "enum": [ + "Fresh", + "Frozen" + ] + }, + "sample_preparation": { + "title": "Sample Preparation", + "description": "Link to associated sample preparation", + "type": "string", + "linkTo": "SamplePreparation" + }, + "sample_sources": { + "title": "Sample Sources", + "description": "Link to associated sample sources", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SampleSource" + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/Sample", + "children": [ + "/profiles/CellCultureSample.json", + "/profiles/CellSample.json", + "/profiles/TissueSample.json" + ], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": true + }, + "SampleSource": { + "title": "Sample Source", + "$id": "/profiles/sample_source.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "submission_centers", + "submitted_id" + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/protocols" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "in review", + "permission": "restricted_fields", + "enum": [ + "public", + "draft", + "released", + "in review", + "obsolete", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "protocols": { + "title": "Protocols", + "description": "Protocols providing experimental details", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Protocol" + } + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "accession": { + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "accessionType": "SS", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "sample_count": { + "title": "Sample Count", + "description": "Number of samples produced for this source", + "type": "integer", + "minimum": 1 + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/SampleSource", + "children": [ + "/profiles/CellCulture.json", + "/profiles/CellCultureMixture.json", + "/profiles/Tissue.json" + ], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": true + }, + "SubmittedFile": { + "title": "Submitted File", + "description": "Generic file submitted by external user", + "$id": "/profiles/submitted_file.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "data_category", + "data_type", + "file_format", + "file_sets", + "filename", + "submitted_id" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "accession", + "submitted_id", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/accession" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/submitted_id" + }, + { + "$ref": "mixins.json#/tags" + }, + { + "$ref": "mixins.json#/uuid" + }, + { + "$ref": "file.json#/properties" + } + ], + "mixinFacets": [ + { + "$ref": "file.json#/facets" + } + ], + "mixinColumns": [ + { + "$ref": "file.json#/columns" + } + ], + "properties": { + "schema_version": { + "default": "1", + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [] + }, + "accession": { + "accessionType": "FI", + "title": "Accession", + "description": "A unique identifier to be used to reference the object.", + "internal_comment": "Only admins are allowed to set or update this value.", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "format": "accession", + "permission": "restricted_fields", + "serverDefault": "accession", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "uploading", + "enum": [ + "uploading", + "uploaded", + "upload failed", + "to be uploaded by workflow", + "released", + "in review", + "obsolete", + "archived", + "deleted", + "public" + ] + }, + "file_format": { + "ff_flag": "filter:valid_item_types", + "linkTo": "FileFormat", + "title": "File Format", + "type": "string" + }, + "filename": { + "description": "The local file name used at time of submission. Must be alphanumeric, with the exception of the following special characters: '+=,.@-_'", + "pattern": "^[\\w+=,.@-]*$", + "title": "File Name", + "type": "string" + }, + "file_size": { + "comment": "File size is specified in bytes - presumably this can be a calculated property as well", + "description": "Size of file on disk", + "exclude_from": [ + "FFedit-create" + ], + "permission": "restricted_fields", + "title": "File Size", + "type": "integer", + "readonly": true + }, + "md5sum": { + "comment": "This can vary for files of same content gzipped at different times", + "description": "The MD5 checksum of the file being transferred", + "exclude_from": [ + "FFedit-create" + ], + "format": "hex", + "permission": "restricted_fields", + "title": "MD5 Checksum", + "type": "string", + "readonly": true + }, + "content_md5sum": { + "comment": "This is only relavant for gzipped files", + "description": "The MD5 checksum of the uncompressed file", + "exclude_from": [ + "FFedit-create" + ], + "format": "hex", + "permission": "restricted_fields", + "title": "Content MD5 Checksum", + "type": "string", + "uniqueKey": "file:content_md5sum", + "readonly": true + }, + "quality_metrics": { + "description": "Associated QC reports", + "items": { + "description": "Associated QC report", + "linkTo": "QualityMetric", + "title": "Quality Metric", + "type": "string" + }, + "minItems": 1, + "permission": "restricted_fields", + "title": "Quality Metrics", + "type": "array", + "uniqueItems": true, + "readonly": true + }, + "data_category": { + "title": "Data Category", + "description": "Category for information in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Genome Region", + "Quality Control", + "Reference Genome", + "Sequencing Reads", + "Variant Calls" + ] + } + }, + "data_type": { + "title": "Data Type", + "description": "Detailed type of information in the file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "Aligned Reads", + "Germline Variant Calls", + "Image", + "Index", + "Reference Sequence", + "Sequence Interval", + "Somatic Variant Calls", + "Statistics", + "Unaligned Reads" + ] + } + }, + "o2_path": { + "title": "O2 Path", + "description": "Path to file on O2", + "type": "string" + }, + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "tags": { + "title": "Tags", + "description": "Key words that can tag an item - useful for filtering.", + "type": "array", + "uniqueItems": true, + "ff_flag": "clear clone", + "items": { + "title": "Tag", + "description": "A tag for the item.", + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-zA-Z0-9_-]+$" + } + }, + "submitted_id": { + "title": "Submitter ID", + "description": "Identifier on submission", + "type": "string", + "uniqueKey": "submitted_id" + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "alternate_accessions": { + "title": "Alternate Accessions", + "description": "Accessions previously assigned to objects that have been merged with this object.", + "type": "array", + "internal_comment": "Only admins are allowed to set or update this value.", + "items": { + "title": "Alternate Accession", + "description": "An accession previously assigned to an object that has been merged with this object.", + "type": "string", + "permission": "restricted_fields", + "format": "accession" + } + }, + "derived_from": { + "title": "Derived From", + "description": "Files used as input to create this file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmittedFile" + } + }, + "file_sets": { + "title": "File Sets", + "description": "File collections associated with this file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "FileSet" + } + }, + "software": { + "title": "Software", + "description": "Software used to create this file", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Software" + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + }, + "href": { + "title": "Download URL", + "type": "string", + "description": "Use this link to download this file", + "calculatedProperty": true + }, + "upload_credentials": { + "type": "object", + "calculatedProperty": true + }, + "upload_key": { + "title": "Upload Key", + "type": "string", + "description": "File object name in S3", + "calculatedProperty": true + } + }, + "facets": {}, + "columns": {}, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/SubmittedFile", + "children": [ + "/profiles/AlignedReads.json", + "/profiles/UnalignedReads.json", + "/profiles/VariantCalls.json" + ], + "rdfs:subClassOf": "/profiles/File.json", + "isAbstract": true + }, + "UserContent": { + "title": "User Content", + "$id": "/profiles/user_content.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "identifier" + ], + "anyOf": [ + { + "required": [ + "submission_centers" + ] + }, + { + "required": [ + "consortia" + ] + } + ], + "identifyingProperties": [ + "aliases", + "uuid" + ], + "additionalProperties": false, + "mixinProperties": [ + { + "$ref": "mixins.json#/aliases" + }, + { + "$ref": "mixins.json#/attribution" + }, + { + "$ref": "mixins.json#/description" + }, + { + "$ref": "mixins.json#/identifier" + }, + { + "$ref": "mixins.json#/modified" + }, + { + "$ref": "mixins.json#/schema_version" + }, + { + "$ref": "mixins.json#/status" + }, + { + "$ref": "mixins.json#/submitted" + }, + { + "$ref": "mixins.json#/title" + }, + { + "$ref": "mixins.json#/uuid" + } + ], + "properties": { + "uuid": { + "title": "UUID", + "type": "string", + "format": "uuid", + "exclude_from": [ + "FFedit-create" + ], + "serverDefault": "uuid4", + "permission": "restricted_fields", + "requestMethod": "POST", + "readonly": true + }, + "title": { + "title": "Title", + "description": "Title for the item", + "type": "string", + "minLength": 3 + }, + "date_created": { + "rdfs:subPropertyOf": "dc:created", + "title": "Date Created", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "serverDefault": "now", + "permission": "restricted_fields", + "readonly": true + }, + "submitted_by": { + "rdfs:subPropertyOf": "dc:creator", + "title": "Submitted By", + "exclude_from": [ + "FFedit-create" + ], + "type": "string", + "linkTo": "User", + "serverDefault": "userid", + "permission": "restricted_fields", + "readonly": true + }, + "status": { + "title": "Status", + "type": "string", + "default": "current", + "permission": "restricted_fields", + "enum": [ + "public", + "shared", + "current", + "inactive", + "in review", + "deleted" + ], + "readonly": true + }, + "schema_version": { + "title": "Schema Version", + "internal_comment": "Do not submit, value is assigned by the server. The version of the JSON schema that the server uses to validate the object. Schema version indicates generation of schema used to save version to to enable upgrade steps to work. Individual schemas should set the default.", + "type": "string", + "exclude_from": [ + "FFedit-create" + ], + "pattern": "^\\d+(\\.\\d+)*$", + "requestMethod": [], + "default": "1" + }, + "last_modified": { + "title": "Last Modified", + "exclude_from": [ + "FFedit-create" + ], + "type": "object", + "additionalProperties": false, + "properties": { + "date_modified": { + "title": "Date Modified", + "description": "Do not submit, value is assigned by the server. The date the object is modified.", + "type": "string", + "anyOf": [ + { + "format": "date-time" + }, + { + "format": "date" + } + ], + "permission": "restricted_fields" + }, + "modified_by": { + "title": "Modified By", + "description": "Do not submit, value is assigned by the server. The user that modfied the object.", + "type": "string", + "linkTo": "User", + "permission": "restricted_fields" + } + } + }, + "identifier": { + "title": "Identifier", + "description": "Unique, identifying name for the item", + "type": "string", + "uniqueKey": true, + "pattern": "^[A-Za-z0-9-_]+$", + "minLength": 2, + "permission": "restricted_fields", + "readonly": true + }, + "description": { + "title": "Description", + "description": "Plain text description of the item", + "type": "string", + "formInput": "textarea" + }, + "submission_centers": { + "title": "Submission Centers", + "description": "Submission Centers associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "SubmissionCenter" + }, + "serverDefault": "user_submission_centers" + }, + "consortia": { + "title": "Consortia", + "description": "Consortia associated with this item.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "linkTo": "Consortium" + }, + "permission": "restricted_fields", + "readonly": true + }, + "aliases": { + "title": "Aliases", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "array", + "comment": "Colon separated lab name and lab identifier, no slash. (e.g. dcic-lab:42).", + "uniqueItems": true, + "ff_flag": "clear clone", + "permission": "restricted_fields", + "items": { + "uniqueKey": "alias", + "title": "ID Alias", + "description": "Institution-specific ID (e.g. bgm:cohort-1234-a).", + "type": "string", + "pattern": "^[^\\s\\\\\\/]+:[^\\s\\\\\\/]+$" + }, + "readonly": true + }, + "options": { + "title": "Options", + "type": "object", + "description": "Options for section display.", + "additionalProperties": false, + "properties": { + "collapsible": { + "title": "Is Collapsible", + "type": "boolean", + "description": "Whether this StaticSection should be collapsible (wherever collapsibility is an option). This property is ignored in some places, e.g. lists where all sections are explicitly collapsible.", + "default": false + }, + "default_open": { + "title": "Is Expanded by Default", + "type": "boolean", + "description": "Whether this StaticSection should appear as expanded by default (in places where it may be collapsible). Does not necessarily depend on 'collapsible' being true, e.g. in lists where all sections are explicitly collapsible.", + "default": true + }, + "title_icon": { + "title": "Title Icon", + "description": "Icon to be showed next to title in selected places.", + "type": "string" + }, + "image": { + "title": "Preview Image", + "description": "Image or screenshot URL for this Item to use as a preview.", + "type": "string" + } + } + }, + "@id": { + "title": "ID", + "type": "string", + "calculatedProperty": true + }, + "@type": { + "title": "Type", + "type": "array", + "items": { + "type": "string" + }, + "calculatedProperty": true + }, + "principals_allowed": { + "title": "principals_allowed", + "description": "Calculated permissions used for ES filtering", + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + }, + "calculatedProperty": true + }, + "display_title": { + "title": "Display Title", + "description": "A calculated title for every object", + "type": "string", + "calculatedProperty": true + }, + "content_as_html": { + "title": "Content as HTML", + "description": "Convert RST, HTML and MD content into HTML", + "type": "string", + "calculatedProperty": true + } + }, + "@type": [ + "JSONSchema" + ], + "rdfs:seeAlso": "/terms/UserContent", + "children": [ + "/profiles/StaticSection.json" + ], + "rdfs:subClassOf": "/profiles/Item.json", + "isAbstract": true + } +} diff --git a/test/data_files/structured_data/sequencing_20231120.csv b/test/data_files/structured_data/sequencing_20231120.csv new file mode 100644 index 000000000..a7a816c61 --- /dev/null +++ b/test/data_files/structured_data/sequencing_20231120.csv @@ -0,0 +1,4 @@ +accession,alternate_accessions#,consortia#,date_created,display_title,instrument_model,last_modified.date_modified,last_modified.modified_by,platform,protocols,read_type,schema_version,status,submission_centers#,submitted_by,submitted_id,tags#,target_coverage,target_read_count,target_read_length,uuid, +SQ000001,ALT00001|ALT00002,,2023-01-01T12:00:00Z,Sequencing Sample 1,NovaSeq,2023-01-02T10:30:00Z,User2,Illumina,Protocol1,Paired-end,1.2,in review,Center1,User1,XY_SEQUENCING_ABC1,tag1|tag2,30.5,1000000,150,f50a6b9b-8600-4a8c-b693-47c0b2cf8123, +SQ000002,,Consortium1,2023-02-01T15:45:00Z,Sequencing Sample 2,Revio,2023-02-02T08:20:00Z,User4,PacBio,Protocol2,Single-end,1.1,in review,somesubctr,User3,XY_SEQUENCING_ABC2,tag3|tag4,20.8,800000,4000,c6e0f8a4-7e76-40c1-8a85-2a28e6b4d1e1, +SQ000003,,Consortium2,2023-03-01T09:15:00Z,Sequencing Sample 3,PromethION,2023-03-02T14:10:00Z,User6,ONT,Protocol3,Not Applicable,1.0,in review,Center2,User5,XY_SEQUENCING_ABC3,tag5|tag6,50.2,500000,200,9d3b4c5f-4e3b-4781-b95a-10f56d8a3762, diff --git a/test/data_files/structured_data/sequencing_20231120.result.json b/test/data_files/structured_data/sequencing_20231120.result.json new file mode 100644 index 000000000..04720641d --- /dev/null +++ b/test/data_files/structured_data/sequencing_20231120.result.json @@ -0,0 +1,98 @@ +{ + "Sequencing": [ + { + "accession": "SQ000001", + "alternate_accessions": [ + "ALT00001", + "ALT00002" + ], + "date_created": "2023-01-01T12:00:00Z", + "display_title": "Sequencing Sample 1", + "instrument_model": "NovaSeq", + "last_modified": { + "date_modified": "2023-01-02T10:30:00Z", + "modified_by": "User2" + }, + "platform": "Illumina", + "protocols": ["Protocol1"], + "read_type": "Paired-end", + "schema_version": "1.2", + "status": "in review", + "submission_centers": [ + "Center1" + ], + "submitted_by": "User1", + "submitted_id": "XY_SEQUENCING_ABC1", + "tags": [ + "tag1", + "tag2" + ], + "target_coverage": 30.5, + "target_read_count": 1000000, + "target_read_length": 150, + "uuid": "f50a6b9b-8600-4a8c-b693-47c0b2cf8123" + }, + { + "accession": "SQ000002", + "consortia": [ + "Consortium1" + ], + "date_created": "2023-02-01T15:45:00Z", + "display_title": "Sequencing Sample 2", + "instrument_model": "Revio", + "last_modified": { + "date_modified": "2023-02-02T08:20:00Z", + "modified_by": "User4" + }, + "platform": "PacBio", + "protocols": ["Protocol2"], + "read_type": "Single-end", + "schema_version": "1.1", + "status": "in review", + "submission_centers": [ + "somesubctr" + ], + "submitted_by": "User3", + "submitted_id": "XY_SEQUENCING_ABC2", + "tags": [ + "tag3", + "tag4" + ], + "target_coverage": 20.8, + "target_read_count": 800000, + "target_read_length": 4000, + "uuid": "c6e0f8a4-7e76-40c1-8a85-2a28e6b4d1e1" + }, + { + "accession": "SQ000003", + "consortia": [ + "Consortium2" + ], + "date_created": "2023-03-01T09:15:00Z", + "display_title": "Sequencing Sample 3", + "instrument_model": "PromethION", + "last_modified": { + "date_modified": "2023-03-02T14:10:00Z", + "modified_by": "User6" + }, + "platform": "ONT", + "protocols": ["Protocol3"], + "read_type": "Not Applicable", + "schema_version": "1.0", + "status": "in review", + "submission_centers": [ + "Center2" + ], + "submitted_by": "User5", + "submitted_id": "XY_SEQUENCING_ABC3", + "tags": [ + "tag5", + "tag6" + ], + "target_coverage": 50.2, + "target_read_count": 500000, + "target_read_length": 200, + "uuid": "9d3b4c5f-4e3b-4781-b95a-10f56d8a3762" + } + ] +} diff --git a/test/data_files/structured_data/software_20231119.csv b/test/data_files/structured_data/software_20231119.csv new file mode 100644 index 000000000..00981b808 --- /dev/null +++ b/test/data_files/structured_data/software_20231119.csv @@ -0,0 +1,3 @@ +accession,aliases,binary_url,category,commit,consortia,date_created,description,name,schema_version,source_url,status,submission_centers#,submitted_by,tags#,title,uuid,version, +SW123456,somealias:abc|somealias:def,https://example.com/sample-software-1.zip,Alignment|Quality Control,abc123,,2023-11-01T12:00:00Z,This is a sample software for testing purposes.,public,1,https://github.com/sample-software-1,public,SubmissionCenter1|SubmissionCenter2,user-id-1,tag1|tag2,Sample Software 1,a8e3168b-1b90-45e2-9f91-c8740d74a860,1.0.0, +SW789012,alias3:789|alias4:1011,https://example.com/sample-software-2.tar.gz,Alignment Manipulation|Variant Calling,def456,Consortium1|Consortium2,2023-11-05T14:30:00Z,Another sample software for testing.,current,1,https://github.com/sample-software-2,current,,user-id-2,tag3|tag4,Sample Software 2,d0be5d3c-18bb-47bb-b9b1-255779a5ac07,2.1.0, diff --git a/test/data_files/structured_data/software_20231119.result.json b/test/data_files/structured_data/software_20231119.result.json new file mode 100644 index 000000000..b39d1b1ba --- /dev/null +++ b/test/data_files/structured_data/software_20231119.result.json @@ -0,0 +1,66 @@ +{ + "Software": [ + { + "accession": "SW123456", + "aliases": [ + "somealias:abc", + "somealias:def" + ], + "binary_url": "https://example.com/sample-software-1.zip", + "category": [ + "Alignment", + "Quality Control" + ], + "commit": "abc123", + "date_created": "2023-11-01T12:00:00Z", + "description": "This is a sample software for testing purposes.", + "name": "public", + "schema_version": "1", + "source_url": "https://github.com/sample-software-1", + "status": "public", + "submission_centers": [ + "SubmissionCenter1", + "SubmissionCenter2" + ], + "submitted_by": "user-id-1", + "tags": [ + "tag1", + "tag2" + ], + "title": "Sample Software 1", + "uuid": "a8e3168b-1b90-45e2-9f91-c8740d74a860", + "version": "1.0.0" + }, + { + "accession": "SW789012", + "aliases": [ + "alias3:789", + "alias4:1011" + ], + "binary_url": "https://example.com/sample-software-2.tar.gz", + "category": [ + "Alignment Manipulation", + "Variant Calling" + ], + "commit": "def456", + "consortia": [ + "Consortium1", + "Consortium2" + ], + "date_created": "2023-11-05T14:30:00Z", + "description": "Another sample software for testing.", + "name": "current", + "schema_version": "1", + "source_url": "https://github.com/sample-software-2", + "status": "current", + "submitted_by": "user-id-2", + "tags": [ + "tag3", + "tag4" + ], + "title": "Sample Software 2", + "uuid": "d0be5d3c-18bb-47bb-b9b1-255779a5ac07", + "version": "2.1.0" + } + ] +} diff --git a/test/data_files/structured_data/some_type_four.json b/test/data_files/structured_data/some_type_four.json new file mode 100644 index 000000000..5be3cbcef --- /dev/null +++ b/test/data_files/structured_data/some_type_four.json @@ -0,0 +1,54 @@ +{ + "title": "SomeTypeFour", + "properties": { + "alfa": { + "type": "object", + "properties": { + "bravo": { "type": "string" }, + "charlie": { + "type": "object", + "properties": { + "delta": { "type": "string" }, + "echo": { + "type": "object", + "properties": { + "foxtrot": { "type": "integer" } + } + }, + "golf": { + "type": "array", + "items": { + "type": "boolean" + } + } + } + } + } + }, + "indigo": { + "type": "array", + "items": { "type": "string" } + }, + "juliet": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "array", + "items": { "type": "number" } + } + } + }, + "kilo": { + "type": "array", + "items": { + "type": "object", + "properties": { + "lima": { "type": "integer" }, + "mike": { "type": "string" }, + "november": { "type": "boolean" } + } + } + } + } +} diff --git a/test/data_files/structured_data/some_type_one.json b/test/data_files/structured_data/some_type_one.json new file mode 100644 index 000000000..c66eff6f9 --- /dev/null +++ b/test/data_files/structured_data/some_type_one.json @@ -0,0 +1,63 @@ +{ + "title": "SomeTypeOne", + "properties": { + "abc": { + "type": "object", + "properties": { + "def": {"type": "string"}, + "ghi": { + "type": "object", + "properties": { + "jkl": {"type": "string"}, + "mno": {"type": "number"} + } + } + } + }, + "pqr": {"type": "integer"}, + "stu": { + "type": "array", + "items": {"type": "string"} + }, + "vw": { + "type": "array", + "items": { + "type": "object", + "properties": { + "xy": {"type": "integer"}, + "z": {"type": "boolean"}, + "foo": {"type": "string"} + } + } + }, + "simple_string": { + "type": "string" + }, + "simple_string_array": { + "type": "array", + "items": { + "type": "string" + } + }, + "simple_integer_array": { + "type": "array", + "items": { + "type": "integer" + } + }, + "simple_number_array": { + "type": "array", + "items": { + "type": "number" + } + }, + "simple_boolean_array": { + "type": "array", + "items": { + "type": "boolean" + } + }, + "ignore_empty_object": {}, + "ignore_no_object": null + } +} diff --git a/test/data_files/structured_data/some_type_three.json b/test/data_files/structured_data/some_type_three.json new file mode 100644 index 000000000..7b16ad7d1 --- /dev/null +++ b/test/data_files/structured_data/some_type_three.json @@ -0,0 +1,47 @@ +{ + "title": "Test", + "properties": { + "abc": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "integer" + } + } + }, + "someobj": { + "type": "object", + "properties": { + "ghi": { + "type": "array", + "items": { + "type": "object", + "properties": { + "jkl": { + "type": "string" + } + } + } + } + } + }, + "simplearray": { + "type": "array", + "items": { + "type": "string" + } + }, + "arrayofarray": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "string" + } + } + } + } +} diff --git a/test/data_files/structured_data/some_type_two.json b/test/data_files/structured_data/some_type_two.json new file mode 100644 index 000000000..b09acc5b6 --- /dev/null +++ b/test/data_files/structured_data/some_type_two.json @@ -0,0 +1,140 @@ +{ + "title": "SomeTypeTwo", + "properties": { + "uuid": { + "title": "UUID", + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "date_created": { + "type": "string" + }, + "submitted_by": { + "type": "string", + "linkTo": "User" + }, + "status": { + "type": "string", + "enum": [ + "Public", + "Current", + "Deleted", + "Inactive", + "In Review", + "Obsolete", + "Shared" + ] + }, + "schema_version": { + "type": "string" + }, + "last_modified": { + "type": "object", + "properties": { + "date_modified": { + "type": "string" + }, + "modified_by": { + "type": "string" + } + } + }, + "identifier": { + "type": "string" + }, + "description": { + "type": "string" + }, + "submission_centers": { + "type": "array", + "items": { + "type": "string" + } + }, + "xyzzy": { + "type": "array", + "items": { + "type": "object", + "properties": { + "foo": {"type": "integer"}, + "goo": {"type": "string"}, + "hoo": {"type": "integer"} + } + } + }, + "some_integer_property": { + "type": "integer" + }, + "some_boolean_property": { + "type": "boolean" + }, + "consortia": { + "type": "array", + "items": { + "type": "string" + } + }, + "aliases": { + "type": "array", + "items": { + "type": "string" + } + }, + "accession": { + "type": "string" + }, + "alternate_accessions": { + "type": "array", + "items": { + "type": "string" + } + }, + "standard_file_extension": { + "type": "string" + }, + "other_allowed_extensions": { + "items": { + "title": "OK Extension", + "type": "string" + }, + "type": "array" + }, + "extra_file_formats": { + "items": { + "description": "A file format for an extra file", + "linkTo": "FileFormat", + "title": "Format", + "type": "string" + }, + "type": "array" + }, + "@id": { + "type": "string" + }, + "@type": { + "type": "array", + "items": { + "type": "string" + } + }, + "principals_allowed": { + "type": "object", + "properties": { + "view": { + "type": "string" + }, + "edit": { + "type": "string" + } + } + }, + "display_title": { + "type": "string" + } + } +} diff --git a/test/data_files/structured_data/submission_test_file_from_doug_20231106.result.json b/test/data_files/structured_data/submission_test_file_from_doug_20231106.result.json new file mode 100644 index 000000000..a7492fdc1 --- /dev/null +++ b/test/data_files/structured_data/submission_test_file_from_doug_20231106.result.json @@ -0,0 +1,69 @@ +{ + "FileFormat": [ + { + "identifier": "fastq", + "standard_file_extension": "fastq", + "consortia": [ "smaht" ] + } + ], + "ReferenceFile": [ + { + "aliases": [ "smaht:reference_file-fastq1" ], + "file_format": "fastq", + "data_category": [ "Sequencing Reads" ], + "data_type": [ "Unaligned Reads" ], + "filename": "first_file.fastq", + "consortia": [ "smaht" ] + }, + { + "aliases": [ "smaht:reference_file-fastq2", "smaht:reference_file-fastq_alt" ], + "file_format": "fastq", + "data_category": [ "Sequencing Reads" ], + "data_type": [ "Unaligned Reads" ], + "filename": "second_file.fastq", + "consortia": [ "smaht" ] + } + ], + "Software": [ + { + "submitted_id": "SMAHT_SOFTWARE_VEPX", + "name": "vep", + "category": [ "Variant Annotation" ], + "title": "VEP", + "version": "1.0.1", + "source_url": "https://grch37.ensembl.org/info/docs/tools/vep/index.html", + "consortia": [ "smaht" ] + }, + { + "submitted_id": "SMAHT_SOFTWARE_FASTQC", + "name": "fastqc", + "category": [ "Quality Control", "Alignment" ], + "title": "FastQC", + "version": "3.5.1", + "consortia": [ "smaht" ] + } + ], + "Workflow": [ + { + "aliases": [ "smaht:workflow-basic" ], + "name": "basic_workflow", + "title": "A Basic Workflow", + "software": [ "SMAHT_SOFTWARE_VEPX" ], + "category": [ "Annotation" ], + "language": "CWL", + "tibanna_config": { "instance_type": [ "c5.4xlarge" ], "run_name": "vep" }, + "consortia": [ "smaht" ] + }, + { + "aliases": [ "smaht:workflow-complex" ], + "name": "complex_workflow", + "title": "A Complex Workflow", + "software": [ "SMAHT_SOFTWARE_VEPX", "SMAHT_SOFTWARE_FASTQC" ], + "category": [ "Annotation", "Quality Control" ], + "language": "WDL", + "tibanna_config": { "instance_type": [ "c5.4xlarge" ], "run_name": "fastqc" }, + "previous_versions": [ "smaht:workflow-basic" ], + "consortia": [ "smaht" ] + } + ] +} diff --git a/test/data_files/structured_data/submission_test_file_from_doug_20231106.xlsx b/test/data_files/structured_data/submission_test_file_from_doug_20231106.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e8c4d3be906deb8c5ea51c4b2176b1d3a8b07d97 GIT binary patch literal 11746 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 PK?HtsfgGZu{&n?#1ffB$ literal 0 HcmV?d00001 diff --git a/test/data_files/structured_data/submission_test_file_from_doug_20231130.xlsx b/test/data_files/structured_data/submission_test_file_from_doug_20231130.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a787c009edacf18520490e8ed305d80918eb37bc GIT binary patch literal 8973 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 N3xIIBJL%7V{|5<_m-PSu literal 0 HcmV?d00001 diff --git a/test/data_files/structured_data/submission_test_file_from_doug_20231204_1310.xlsx b/test/data_files/structured_data/submission_test_file_from_doug_20231204_1310.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c2022d99fe4e4ec77af10aed3d819b384d373329 GIT binary patch literal 14988 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 Wz=C!B!^fdRSbzuXkYD`x^#1^rST^(k literal 0 HcmV?d00001 diff --git a/test/data_files/structured_data/test_uw_formatted_submission_from_doug_20231212.xlsx b/test/data_files/structured_data/test_uw_formatted_submission_from_doug_20231212.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e3009cbdd60ae1e5aa7b7b575256bd7fbba0015c GIT binary patch literal 56379 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 HhW7p+!x_g} literal 0 HcmV?d00001 diff --git a/test/data_files/structured_data/test_uw_formatted_submission_from_doug_20231212b.xlsx b/test/data_files/structured_data/test_uw_formatted_submission_from_doug_20231212b.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..aae084131784e2fd5b575d2fb409e744dfea6014 GIT binary patch literal 65112 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ðkL6V-AqwClXRVt-F9(*vyZO(@ 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 SuRw*IFvCw^{_y+>;sF4K?HCFG literal 0 HcmV?d00001 diff --git a/test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117.result.json b/test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117.result.json new file mode 100644 index 000000000..dd846ef5c --- /dev/null +++ b/test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117.result.json @@ -0,0 +1,813 @@ +{ + "Software": [ + { + "submitted_id": "UW-GCC_SOFTWARE_FIBERTOOLS-RS", + "category": [ + "Base Modification Caller" + ], + "name": "fibertools-rs", + "version": "0.3.1", + "source_url": "https://github.com/fiberseq/fibertools-rs", + "description": "fibertools-rs adds m6A modifications to each PacBio molecule." + }, + { + "submitted_id": "UW-GCC_SOFTWARE_REVIO_ICS", + "category": [ + "Basecaller, consensus caller, base modification caller" + ], + "name": "Revio Instrument Control Software", + "version": "12.0.0.183503", + "source_url": "https://www.pacb.com/support/software-downloads/", + "description": "Revio software controls the instrument and the primary and post-primary analyses (basecalling, consensus calling, CpG methylation)" + } + ], + "CellLine": [ + { + "submitted_id": "UW-GCC_CELL-LINE_COLO-829BL", + "category": "Immortalized", + "name": "COLO 829BL", + "source": "ATCC", + "description": "COLO 829BL lymphoblastoid cells", + "url": "https://www.atcc.org/products/crl-1980" + }, + { + "submitted_id": "UW-GCC_CELL-LINE_COLO-829T", + "category": "Immortalized", + "name": "COLO 829", + "source": "ATCC", + "description": "COLO 829 tumor cells", + "url": "https://www.atcc.org/products/crl-1974" + } + ], + "CellSample": [ + { + "submitted_id": "UW-GCC_SAMPLE_COLO-829BL_1", + "passage_number": "NA", + "description": "Immortaliized lymphoblastoid cell line", + "growth_medium": "RPMI-1640 with 15% FBS", + "culture_duration": "17 days", + "culture_start_date": "2023-06-29 00:00:00", + "culture_harvest_date": "2023-07-16 00:00:00", + "lot_number": "ATCC-70022927\nSCRI-07162023", + "Cell density and volume": "3 million cells/mL\n2 mL/vial", + "doubling_time": "24 hours", + "karyotype": "92,XXYY[4]/46,XY[20]", + "biosources": "UW-GCC_CELL-LINE_COLO-829BL", + "protocol": "Thaw in recovery media: 1:1 RPMI:FBS 24 hours then split into RPMI-1640 15% FBS.\nCulture in media depth of .2ml/cm2 splitting by dilution until volume reaches 100 mL.\nTransfer to erlenmeyer style 500 mL shaker flask with 200 mL volume shaking at 90 rpm.\nFreeze in RPMI-1640 15% FBS with final volume 10% DMSO." + }, + { + "submitted_id": "UW-GCC_SAMPLE_COLO-829T_1", + "passage_number": "5", + "description": "Adherent melanoma derived cell line", + "growth_medium": "RPMI-1640 with 10% FBS", + "culture_duration": "39 days", + "culture_start_date": "2023-06-29 00:00:00", + "culture_harvest_date": "2023-08-07 00:00:00", + "lot_number": "ATCC-70024393\nSCRI-08072023", + "Cell density and volume": "3 million cells/mL\n2 mL/vial", + "doubling_time": "~3-4 days", + "karyotype": "Not performed", + "biosources": "UW-GCC_CELL-LINE_COLO-829T", + "protocol": "Culture in RPMI-1640 10% FBS. Split by rinsing with PBS and trypsininzing with 0.05% trypsin-EDTA.\nFreeze in RPMI-1640 10% FBS with final volume 10% DMSO." + }, + { + "submitted_id": "UW-GCC_SAMPLE_COLO-829T_2", + "passage_number": "4", + "description": "Adherent melanoma derived cell line", + "growth_medium": "RPMI-1640 with 10% FBS", + "culture_duration": "30 days", + "culture_start_date": "2023-09-19 00:00:00", + "culture_harvest_date": "2023-10-19 00:00:00", + "lot_number": "ATCC-70024393\nSCRI-10192023", + "Cell density and volume": "3 million cells/mL\n2 mL/vial", + "doubling_time": "~3-4 days", + "karyotype": "64~69,XX,+X,+1,+1,dic(1;3)(p12;p21)x2,add(2)(p13),add(2)(p21),+4,i(4)(q10),+6,add(\n6)(q13),+7,+7,add(7)(q32)x2,+8,i(8)(q10),+9,\ndel(9)(p21),+12,+13,+13,+13,+14,+15,+17,+19,+19,+20,+20,", + "biosources": "UW-GCC_CELL-LINE_COLO-829T", + "protocol": "Culture in RPMI-1640 10% FBS. Split by rinsing with PBS and trypsininzing with 0.05% trypsin-EDTA.\nFreeze in RPMI-1640 10% FBS with final volume 10% DMSO." + }, + { + "submitted_id": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1", + "passage_number": "N/A", + "description": "50-to-1 mixture of COLO829BL and COLO829T cells", + "growth_medium": "N/A", + "culture_duration": "N/A", + "culture_start_date": "N/A", + "culture_harvest_date": "2023-10-25 00:00:00", + "lot_number": "ATCC-70022927\nATCC-70024393\nSCRI-10252023", + "Cell density and volume": "2.55 million cells/mL\n2 mL/vial", + "doubling_time": "N/A", + "karyotype": "N/A", + "biosources": "UW-GCC_CELL-LINE_COLO-829BL\nUW-GCC_CELL-LINE_COLO-829T", + "protocol": "Bulk hand mixture of UW-GCC_SAMPLE_COLO-829BL_1 and UW-GCC_SAMPLE_COLO-829T_2 cells in a 50:1 ratio.\nFreeze in RPMI-1640 10% FBS with final volume 10% DMSO." + } + ], + "Analyte": [ + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_FiberSeq_1", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "111 ng/ul", + "volume": "50 ul", + "sample_quantity": "6 million cells", + "a260_a280_ratio": 2.06, + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_FiberSeq_2", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "220 ng/ul", + "volume": "55 ul", + "sample_quantity": "6 million cells", + "a260_a280_ratio": 2.0, + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_gDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "Genomic DNA" + ], + "treatments": "N/A", + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_HMWgDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "HMW genomic DNA" + ], + "treatments": "N/A", + "concentration": "92 ng/uL", + "volume": "25 ul", + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_bulkKinnex_1", + "molecule": [ + "RNA" + ], + "components": [ + "cDNA" + ], + "concentration": "449 ng/ul", + "sample_quantity": "3 million cells", + "a260_a280_ratio": 2.05, + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_HiC_1", + "molecule": [ + "DNA" + ], + "components": [ + "Arima HiC library" + ], + "concentration": "11.4ng/ul", + "volume": "25 ul", + "sample_quantity": "3 million cells", + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_FiberSeq_1", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "180 ng/ul", + "volume": "50 ul", + "sample_quantity": "6 million cells", + "a260_a280_ratio": 2.09, + "biosample": "UW-GCC_SAMPLE_COLO-829T_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_FiberSeq_2", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "56.4 ng/ul", + "volume": "50 ul", + "sample_quantity": "6 million cells", + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "HMW genomic DNA" + ], + "treatments": "N/A", + "concentration": "96 ng/ul", + "volume": "50 ul", + "biosample": "UW-GCC_SAMPLE_COLO-829T_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_2", + "molecule": [ + "DNA" + ], + "components": [ + "HMW genomic DNA" + ], + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_gDNA_2", + "molecule": [ + "DNA" + ], + "components": [ + "Genomic DNA" + ], + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_bulkKinnex_2", + "molecule": [ + "RNA" + ], + "components": [ + "cDNA" + ], + "concentration": "552 ng/ul", + "volume": "50 ul", + "sample_quantity": "3 million cells", + "a260_a280_ratio": 2.1, + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_HiC_2", + "molecule": [ + "DNA" + ], + "components": [ + "Arima HiC library" + ], + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_FiberSeq_1", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "110 ng/ul", + "volume": "50 ul", + "sample_quantity": "3 million cells", + "biosample": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_gDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "Genomic DNA" + ], + "biosample": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_HMWgDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "HMW genomic DNA" + ], + "treatments": "N/A", + "concentration": "90.2 ng/ul", + "volume": "50 ul", + "sample_quantity": "3 million cells", + "biosample": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_bulkKinnex_1", + "molecule": [ + "RNA" + ], + "components": [ + "cDNA" + ], + "concentration": "470 ng/ul", + "volume": "50 ul", + "sample_quantity": "3 million cells", + "a260_a280_ratio": 2.05, + "biosample": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1" + } + ], + "Library": [ + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00338", + "preparation_date": "2023-07-28", + "target_insert_minimum_length": "17 kb", + "target_insert_avg_length": "20 kb", + "target_insert_maximum_length": "N/A", + "insert_mean_length": 21870.0, + "insert_%_CV": "27.4", + "amplification_cycles": "N/A", + "barcode_sequences": "bc2025", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_FiberSeq_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_2", + "name": "COLO-829BL (Replicate 2)", + "sample_name": "PS00356", + "preparation_date": "2023-09-01", + "target_insert_minimum_length": "17 kb", + "target_insert_avg_length": "20 kb", + "target_insert_maximum_length": "N/A", + "insert_mean_length": 25734.0, + "insert_%_CV": "23.26", + "amplification_cycles": "N/A", + "barcode_sequences": "bc2055", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_FiberSeq_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_FIBERSEQ_1", + "name": "COLO-829T (Batch 1 - Replicate 1)", + "sample_name": "PS00357", + "preparation_date": "2023-08-27", + "target_insert_minimum_length": "17 kb", + "target_insert_avg_length": "20 kb", + "target_insert_maximum_length": "N/A", + "insert_mean_length": 22616.0, + "insert_%_CV": "17.4", + "amplification_cycles": "N/A", + "barcode_sequences": "bc2051", + "analyte": "UW-GCC_ANALYTE_COLO-829T_FiberSeq_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_FIBERSEQ_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00418", + "analyte": "UW-GCC_ANALYTE_COLO-829T_FiberSeq_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_NOVASEQX_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00340", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_gDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_ONT_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00342", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_HMWgDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_ULONT_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00339", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_HMWgDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_bulkKinnex_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00419", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_bulkKinnex_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_HiC_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00341", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_HiC_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_ONT_1", + "name": "COLO-829T (Batch 1 - Replicate 1)", + "sample_name": "PS00361", + "analyte": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_ONT_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00421", + "analyte": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_ULONT_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00358", + "analyte": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_NOVASEQX_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00359", + "analyte": "UW-GCC_ANALYTE_COLO-829T_gDNA_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_bulkKinnex_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00420", + "analyte": "UW-GCC_ANALYTE_COLO-829T_bulkKinnex_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_HiC_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00360", + "analyte": "UW-GCC_ANALYTE_COLO-829T_HiC_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BLT-50to1_1_FIBERSEQ_1", + "name": "COLO-829BL-T 1-50mix (Replicate 1)", + "sample_name": "PS00433", + "analyte": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_FiberSeq_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BLT-50to1_1_NOVASEQX_1", + "name": "COLO-829BL-T 1-50mix (Replicate 1)", + "sample_name": "PS00431", + "analyte": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_gDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BLT-50to1_1_ONT_1", + "name": "COLO-829BL-T 1-50mix (Replicate 1)", + "sample_name": "PS00432", + "analyte": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_HMWgDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BLT-50to1_1_bulkKinnex_1", + "name": "COLO-829BL-T 1-50mix (Replicate 1)", + "sample_name": "PS00434", + "analyte": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_bulkKinnex_1" + } + ], + "Sequencing": [ + { + "submitted_id": "UW-GCC_SEQUENCING_PACBIO-HIFI-150x", + "category": "HiFi Long Read WGS", + "platform": "PacBio", + "instrument_model": "Revio", + "instrument_cycles": "24 hr movie", + "sequencing_kit": "BINDINGKIT=102-739-100;SEQUENCINGKIT=102-118-800", + "read_type": "Single-end", + "target_read_length": "20 kb", + "target_coverage": "150x" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_PACBIO-HIFI-60x", + "category": "HiFi Long Read WGS", + "platform": "PacBio", + "instrument_model": "Revio", + "instrument_cycles": "24 hr movie", + "sequencing_kit": "BINDINGKIT=102-739-100;SEQUENCINGKIT=102-118-800", + "read_type": "Single-end", + "target_read_length": "20 kb", + "target_coverage": "60x" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_NOVASEQX-2000x", + "platform": "Illumina", + "instrument_model": "NovaSeqX" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_NOVASEQX-200x", + "platform": "Illumina", + "instrument_model": "NovaSeqX" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_NOVASEQX-HiC-60x", + "platform": "Illumina", + "instrument_model": "NovaSeqX" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_ONT-R10-300x", + "platform": "ONT", + "instrument_model": "PromethION" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_ONT-R10-30x", + "platform": "ONT", + "instrument_model": "PromethION" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_UL-ONT-R10", + "platform": "ONT", + "instrument_model": "PromethION" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_PACBIO-BULK-KINNEX", + "platform": "PacBio", + "instrument_model": "Revio", + "instrument_cycles": "24 hr movie" + } + ], + "FileSet": [ + { + "submitted_id": "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1", + "sequencing": "UW-GCC_SEQUENCING_PACBIO-HIFI-150x", + "libraries": [ + "UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_1" + ] + }, + { + "submitted_id": "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2", + "sequencing": "UW-GCC_SEQUENCING_PACBIO-HIFI-150x", + "libraries": [ + "UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_2" + ] + }, + { + "submitted_id": "UW-GCC_FILE-SET_COLO-829_FIBERSEQ_1", + "sequencing": "UW-GCC_SEQUENCING_PACBIO-HIFI-60x", + "libraries": [ + "UW-GCC_LIBRARY_COLO-829T_FIBERSEQ_1" + ] + } + ], + "UnalignedReads": [ + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230825_191347_S3.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230825_191347_s3.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "3940092", + "10%ile_read_length": "15150", + "median_read_length": "18140", + "90%ile_read_length": "24120", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "45eea8352e2b8a3ad11feeccd4fea2bc" + }, + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230828_212510_S3.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230828_212510_s3.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5750093", + "10%ile_read_length": "15280", + "median_read_length": "18560", + "90%ile_read_length": "25000", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "9396dde111d9f719f7d94b98802ae68f" + }, + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230828_215531_S4.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230828_215531_s4.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5540842", + "10%ile_read_length": "15270", + "median_read_length": "18540", + "90%ile_read_length": "24950", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "c292f2a92316f09eba13e515eaf7c6e5" + }, + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230828_222637_S1.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230828_222637_s1.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5142752", + "10%ile_read_length": "15340", + "median_read_length": "18700", + "90%ile_read_length": "25150", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "d0daf2811713ce0f18ed4cd38862a509" + }, + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230828_225743_S2.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230828_225743_s2.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5092420", + "10%ile_read_length": "15320", + "median_read_length": "18650", + "90%ile_read_length": "25080", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "48319442da9d28eb6d44822cfb8bda67" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230913_211559_S4.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230913_211559_s4.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5049023", + "10%ile_read_length": "16720", + "median_read_length": "20630", + "90%ile_read_length": "27640", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "2f39b216ccf0de536e099e83841b8f55" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230916_212004_S3.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230916_212004_s3.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "4912815", + "10%ile_read_length": "16740", + "median_read_length": "20690", + "90%ile_read_length": "27710", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "a91d464af7f868b3291767df3d6f6aea" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230916_215110_S4.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230916_215110_s4.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "4866279", + "10%ile_read_length": "16790", + "median_read_length": "20840", + "90%ile_read_length": "27980", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "8d3b24b021d5d4dd4c8aaa4106999987" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230916_225322_S2.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230916_225322_s2.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "4749101", + "10%ile_read_length": "16810", + "median_read_length": "20890", + "90%ile_read_length": "28060", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "98be0640495b9a66328a02fce08704cd" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230919_203620_S1.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230919_203620_s1.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "4694509", + "10%ile_read_length": "16670", + "median_read_length": "20510", + "90%ile_read_length": "27380", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "c3a68e07c776276bd95221e5adffb2a4" + }, + { + "submitted_id": "UW-GCC_FILE_PS00357.M84046_230913_214705_S1.BC2051.FT.BAM", + "file_name": "PS00357.m84046_230913_214705_s1.bc2051.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5072026", + "10%ile_read_length": "16880", + "median_read_length": "19830", + "90%ile_read_length": "25180", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829T_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "c8e0d9d49294139a6dfa37aa3b9f2448" + }, + { + "submitted_id": "UW-GCC_FILE_PS00357.M84046_230913_221811_S2.BC2051.FT.BAM", + "file_name": "PS00357.m84046_230913_221811_s2.bc2051.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5873988", + "10%ile_read_length": "16840", + "median_read_length": "19750", + "90%ile_read_length": "25090", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829T_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "ce95b0c1fcb48e26cb991aebaa429e29" + } + ] +} diff --git a/test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117.result.json+ b/test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117.result.json+ new file mode 100644 index 000000000..181e31d79 --- /dev/null +++ b/test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117.result.json+ @@ -0,0 +1,809 @@ +{ + "Software": [ + { + "submitted_id": "UW-GCC_SOFTWARE_FIBERTOOLS-RS", + "category": [ "Base Modification Caller" ], + "name": "fibertools-rs", + "version": "0.3.1", + "source_url": "https://github.com/fiberseq/fibertools-rs", + "description": "fibertools-rs adds m6A modifications to each PacBio molecule." + }, + { + "submitted_id": "UW-GCC_SOFTWARE_REVIO_ICS", + "category": [ "Basecaller, consensus caller, base modification caller" ], + "name": "Revio Instrument Control Software", + "version": "12.0.0.183503", + "source_url": "https://www.pacb.com/support/software-downloads/", + "description": "Revio software controls the instrument and the primary and post-primary analyses (basecalling, consensus calling, CpG methylation)" + } + ], + "CellLine": [ + { + "submitted_id": "UW-GCC_CELL-LINE_COLO-829BL", + "category": "Immortalized", + "name": "COLO 829BL", + "source": "ATCC", + "description": "COLO 829BL lymphoblastoid cells", + "url": "https://www.atcc.org/products/crl-1980" + }, + { + "submitted_id": "UW-GCC_CELL-LINE_COLO-829T", + "category": "Immortalized", + "name": "COLO 829", + "source": "ATCC", + "description": "COLO 829 tumor cells", + "url": "https://www.atcc.org/products/crl-1974" + } + ], + "CellSample": [ + { + "submitted_id": "UW-GCC_SAMPLE_COLO-829BL_1", + "passage_number": "NA", + "description": "Immortaliized lymphoblastoid cell line", + "growth_medium": "RPMI-1640 with 15% FBS", + "culture_duration": "17 days", + "culture_start_date": "2023-06-29", + "culture_harvest_date": "2023-07-16", + "lot_number": "ATCC-70022927\nSCRI-07162023", + "Cell density and volume": "3 million cells/mL\n2 mL/vial", + "doubling_time": "24 hours", + "karyotype": "92,XXYY[4]/46,XY[20]", + "biosources": "UW-GCC_CELL-LINE_COLO-829BL", + "protocol": "Thaw in recovery media: 1:1 RPMI:FBS 24 hours then split into RPMI-1640 15% FBS.\nCulture in media depth of .2ml/cm2 splitting by dilution until volume reaches 100 mL.\nTransfer to erlenmeyer style 500 mL shaker flask with 200 mL volume shaking at 90 rpm.\nFreeze in RPMI-1640 15% FBS with final volume 10% DMSO." + }, + { + "submitted_id": "UW-GCC_SAMPLE_COLO-829T_1", + "passage_number": "5", + "description": "Adherent melanoma derived cell line", + "growth_medium": "RPMI-1640 with 10% FBS", + "culture_duration": "39 days", + "culture_start_date": "2023-06-29", + "culture_harvest_date": "2023-08-07", + "lot_number": "ATCC-70024393\nSCRI-08072023", + "Cell density and volume": "3 million cells/mL\n2 mL/vial", + "doubling_time": "~3-4 days", + "karyotype": "Not performed", + "biosources": "UW-GCC_CELL-LINE_COLO-829T", + "protocol": "Culture in RPMI-1640 10% FBS. Split by rinsing with PBS and trypsininzing with 0.05% trypsin-EDTA.\nFreeze in RPMI-1640 10% FBS with final volume 10% DMSO." + }, + { + "submitted_id": "UW-GCC_SAMPLE_COLO-829T_2", + "passage_number": "4", + "description": "Adherent melanoma derived cell line", + "growth_medium": "RPMI-1640 with 10% FBS", + "culture_duration": "30 days", + "culture_start_date": "2023-09-19", + "culture_harvest_date": "2023-10-19", + "lot_number": "ATCC-70024393\nSCRI-10192023", + "Cell density and volume": "3 million cells/mL\n2 mL/vial", + "doubling_time": "~3-4 days", + "karyotype": "64~69,XX,+X,+1,+1,dic(1;3)(p12;p21)x2,add(2)(p13),add(2)(p21),+4,i(4)(q10),+6,add(\n6)(q13),+7,+7,add(7)(q32)x2,+8,i(8)(q10),+9,\ndel(9)(p21),+12,+13,+13,+13,+14,+15,+17,+19,+19,+20,+20,", + "biosources": "UW-GCC_CELL-LINE_COLO-829T", + "protocol": "Culture in RPMI-1640 10% FBS. Split by rinsing with PBS and trypsininzing with 0.05% trypsin-EDTA.\nFreeze in RPMI-1640 10% FBS with final volume 10% DMSO." + }, + { + "submitted_id": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1", + "passage_number": "N/A", + "description": "50-to-1 mixture of COLO829BL and COLO829T cells", + "growth_medium": "N/A", + "culture_duration": "N/A", + "culture_start_date": "N/A", + "culture_harvest_date": "2023-10-25", + "lot_number": "ATCC-70022927\nATCC-70024393\nSCRI-10252023", + "Cell density and volume": "2.55 million cells/mL\n2 mL/vial", + "doubling_time": "N/A", + "karyotype": "N/A", + "biosources": "UW-GCC_CELL-LINE_COLO-829BL\nUW-GCC_CELL-LINE_COLO-829T", + "protocol": "Bulk hand mixture of UW-GCC_SAMPLE_COLO-829BL_1 and UW-GCC_SAMPLE_COLO-829T_2 cells in a 50:1 ratio.\nFreeze in RPMI-1640 10% FBS with final volume 10% DMSO." + } + ], + "Analyte": [ + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_FiberSeq_1", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "111 ng/ul", + "volume": "50 ul", + "sample_quantity": "6 million cells", + "a260_a280_ratio": 2.06, + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_FiberSeq_2", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "220 ng/ul", + "volume": "55 ul", + "sample_quantity": "6 million cells", + "a260_a280_ratio": 2.0, + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_gDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "Genomic DNA" + ], + "treatments": "N/A", + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_HMWgDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "HMW genomic DNA" + ], + "treatments": "N/A", + "concentration": "92 ng/uL", + "volume": "25 ul", + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_bulkKinnex_1", + "molecule": [ + "RNA" + ], + "components": [ + "cDNA" + ], + "concentration": "449 ng/ul", + "sample_quantity": "3 million cells", + "a260_a280_ratio": 2.05, + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_HiC_1", + "molecule": [ + "DNA" + ], + "components": [ + "Arima HiC library" + ], + "concentration": "11.4ng/ul", + "volume": "25 ul", + "sample_quantity": "3 million cells", + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_FiberSeq_1", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "180 ng/ul", + "volume": "50 ul", + "sample_quantity": "6 million cells", + "a260_a280_ratio": 2.09, + "biosample": "UW-GCC_SAMPLE_COLO-829T_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_FiberSeq_2", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "56.4 ng/ul", + "volume": "50 ul", + "sample_quantity": "6 million cells", + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "HMW genomic DNA" + ], + "treatments": "N/A", + "concentration": "96 ng/ul", + "volume": "50 ul", + "biosample": "UW-GCC_SAMPLE_COLO-829T_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_2", + "molecule": [ + "DNA" + ], + "components": [ + "HMW genomic DNA" + ], + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_gDNA_2", + "molecule": [ + "DNA" + ], + "components": [ + "Genomic DNA" + ], + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_bulkKinnex_2", + "molecule": [ + "RNA" + ], + "components": [ + "cDNA" + ], + "concentration": "552 ng/ul", + "volume": "50 ul", + "sample_quantity": "3 million cells", + "a260_a280_ratio": 2.1, + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_HiC_2", + "molecule": [ + "DNA" + ], + "components": [ + "Arima HiC library" + ], + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_FiberSeq_1", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "110 ng/ul", + "volume": "50 ul", + "sample_quantity": "3 million cells", + "biosample": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_gDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "Genomic DNA" + ], + "biosample": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_HMWgDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "HMW genomic DNA" + ], + "treatments": "N/A", + "concentration": "90.2 ng/ul", + "volume": "50 ul", + "sample_quantity": "3 million cells", + "biosample": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_bulkKinnex_1", + "molecule": [ + "RNA" + ], + "components": [ + "cDNA" + ], + "concentration": "470 ng/ul", + "volume": "50 ul", + "sample_quantity": "3 million cells", + "a260_a280_ratio": 2.05, + "biosample": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1" + } + ], + "Library": [ + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00338", + "preparation_date": "2023-07-28", + "target_insert_minimum_length": "17 kb", + "target_insert_avg_length": "20 kb", + "target_insert_maximum_length": "N/A", + "insert_mean_length": 21870.0, + "insert_%_CV": "27.4", + "amplification_cycles": "N/A", + "barcode_sequences": "bc2025", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_FiberSeq_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_2", + "name": "COLO-829BL (Replicate 2)", + "sample_name": "PS00356", + "preparation_date": "2023-09-01", + "target_insert_minimum_length": "17 kb", + "target_insert_avg_length": "20 kb", + "target_insert_maximum_length": "N/A", + "insert_mean_length": 25734.0, + "insert_%_CV": "23.26", + "amplification_cycles": "N/A", + "barcode_sequences": "bc2055", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_FiberSeq_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_FIBERSEQ_1", + "name": "COLO-829T (Batch 1 - Replicate 1)", + "sample_name": "PS00357", + "preparation_date": "2023-08-27", + "target_insert_minimum_length": "17 kb", + "target_insert_avg_length": "20 kb", + "target_insert_maximum_length": "N/A", + "insert_mean_length": 22616.0, + "insert_%_CV": "17.4", + "amplification_cycles": "N/A", + "barcode_sequences": "bc2051", + "analyte": "UW-GCC_ANALYTE_COLO-829T_FiberSeq_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_FIBERSEQ_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00418", + "analyte": "UW-GCC_ANALYTE_COLO-829T_FiberSeq_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_NOVASEQX_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00340", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_gDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_ONT_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00342", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_HMWgDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_ULONT_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00339", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_HMWgDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_bulkKinnex_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00419", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_bulkKinnex_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_HiC_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00341", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_HiC_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_ONT_1", + "name": "COLO-829T (Batch 1 - Replicate 1)", + "sample_name": "PS00361", + "analyte": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_ONT_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00421", + "analyte": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_ULONT_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00358", + "analyte": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_NOVASEQX_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00359", + "analyte": "UW-GCC_ANALYTE_COLO-829T_gDNA_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_bulkKinnex_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00420", + "analyte": "UW-GCC_ANALYTE_COLO-829T_bulkKinnex_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_HiC_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00360", + "analyte": "UW-GCC_ANALYTE_COLO-829T_HiC_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BLT-50to1_1_FIBERSEQ_1", + "name": "COLO-829BL-T 1-50mix (Replicate 1)", + "sample_name": "PS00433", + "analyte": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_FiberSeq_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BLT-50to1_1_NOVASEQX_1", + "name": "COLO-829BL-T 1-50mix (Replicate 1)", + "sample_name": "PS00431", + "analyte": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_gDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BLT-50to1_1_ONT_1", + "name": "COLO-829BL-T 1-50mix (Replicate 1)", + "sample_name": "PS00432", + "analyte": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_HMWgDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BLT-50to1_1_bulkKinnex_1", + "name": "COLO-829BL-T 1-50mix (Replicate 1)", + "sample_name": "PS00434", + "analyte": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_bulkKinnex_1" + } + ], + "Sequencing": [ + { + "submitted_id": "UW-GCC_SEQUENCING_PACBIO-HIFI-150x", + "category": "HiFi Long Read WGS", + "platform": "PacBio", + "instrument_model": "Revio", + "instrument_cycles": "24 hr movie", + "sequencing_kit": "BINDINGKIT=102-739-100;SEQUENCINGKIT=102-118-800", + "read_type": "Single-end", + "target_read_length": "20 kb", + "target_coverage": "150x" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_PACBIO-HIFI-60x", + "category": "HiFi Long Read WGS", + "platform": "PacBio", + "instrument_model": "Revio", + "instrument_cycles": "24 hr movie", + "sequencing_kit": "BINDINGKIT=102-739-100;SEQUENCINGKIT=102-118-800", + "read_type": "Single-end", + "target_read_length": "20 kb", + "target_coverage": "60x" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_NOVASEQX-2000x", + "platform": "Illumina", + "instrument_model": "NovaSeqX" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_NOVASEQX-200x", + "platform": "Illumina", + "instrument_model": "NovaSeqX" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_NOVASEQX-HiC-60x", + "platform": "Illumina", + "instrument_model": "NovaSeqX" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_ONT-R10-300x", + "platform": "ONT", + "instrument_model": "PromethION" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_ONT-R10-30x", + "platform": "ONT", + "instrument_model": "PromethION" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_UL-ONT-R10", + "platform": "ONT", + "instrument_model": "PromethION" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_PACBIO-BULK-KINNEX", + "platform": "PacBio", + "instrument_model": "Revio", + "instrument_cycles": "24 hr movie" + } + ], + "FileSet": [ + { + "submitted_id": "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1", + "sequencing": "UW-GCC_SEQUENCING_PACBIO-HIFI-150x", + "libraries": [ + "UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_1" + ] + }, + { + "submitted_id": "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2", + "sequencing": "UW-GCC_SEQUENCING_PACBIO-HIFI-150x", + "libraries": [ + "UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_2" + ] + }, + { + "submitted_id": "UW-GCC_FILE-SET_COLO-829_FIBERSEQ_1", + "sequencing": "UW-GCC_SEQUENCING_PACBIO-HIFI-60x", + "libraries": [ + "UW-GCC_LIBRARY_COLO-829T_FIBERSEQ_1" + ] + } + ], + "UnalignedReads": [ + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230825_191347_S3.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230825_191347_s3.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "3940092", + "10%ile_read_length": "15150", + "median_read_length": "18140", + "90%ile_read_length": "24120", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "45eea8352e2b8a3ad11feeccd4fea2bc" + }, + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230828_212510_S3.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230828_212510_s3.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5750093", + "10%ile_read_length": "15280", + "median_read_length": "18560", + "90%ile_read_length": "25000", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "9396dde111d9f719f7d94b98802ae68f" + }, + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230828_215531_S4.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230828_215531_s4.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5540842", + "10%ile_read_length": "15270", + "median_read_length": "18540", + "90%ile_read_length": "24950", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "c292f2a92316f09eba13e515eaf7c6e5" + }, + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230828_222637_S1.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230828_222637_s1.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5142752", + "10%ile_read_length": "15340", + "median_read_length": "18700", + "90%ile_read_length": "25150", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "d0daf2811713ce0f18ed4cd38862a509" + }, + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230828_225743_S2.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230828_225743_s2.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5092420", + "10%ile_read_length": "15320", + "median_read_length": "18650", + "90%ile_read_length": "25080", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "48319442da9d28eb6d44822cfb8bda67" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230913_211559_S4.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230913_211559_s4.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5049023", + "10%ile_read_length": "16720", + "median_read_length": "20630", + "90%ile_read_length": "27640", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "2f39b216ccf0de536e099e83841b8f55" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230916_212004_S3.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230916_212004_s3.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "4912815", + "10%ile_read_length": "16740", + "median_read_length": "20690", + "90%ile_read_length": "27710", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "a91d464af7f868b3291767df3d6f6aea" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230916_215110_S4.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230916_215110_s4.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "4866279", + "10%ile_read_length": "16790", + "median_read_length": "20840", + "90%ile_read_length": "27980", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "8d3b24b021d5d4dd4c8aaa4106999987" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230916_225322_S2.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230916_225322_s2.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "4749101", + "10%ile_read_length": "16810", + "median_read_length": "20890", + "90%ile_read_length": "28060", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "98be0640495b9a66328a02fce08704cd" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230919_203620_S1.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230919_203620_s1.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "4694509", + "10%ile_read_length": "16670", + "median_read_length": "20510", + "90%ile_read_length": "27380", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "c3a68e07c776276bd95221e5adffb2a4" + }, + { + "submitted_id": "UW-GCC_FILE_PS00357.M84046_230913_214705_S1.BC2051.FT.BAM", + "file_name": "PS00357.m84046_230913_214705_s1.bc2051.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5072026", + "10%ile_read_length": "16880", + "median_read_length": "19830", + "90%ile_read_length": "25180", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829T_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "c8e0d9d49294139a6dfa37aa3b9f2448" + }, + { + "submitted_id": "UW-GCC_FILE_PS00357.M84046_230913_221811_S2.BC2051.FT.BAM", + "file_name": "PS00357.m84046_230913_221811_s2.bc2051.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5873988", + "10%ile_read_length": "16840", + "median_read_length": "19750", + "90%ile_read_length": "25090", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829T_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "ce95b0c1fcb48e26cb991aebaa429e29" + } + ] +} diff --git a/test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117.xlsx b/test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..aa0bbb760037174fbdf684880f13efaf318b3ce3 GIT binary patch literal 577600 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

    ;W?{svk(>~Kr>!Mz0$wwnX$p;^g>YI% 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 literal 0 HcmV?d00001 diff --git a/test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117_more_unaligned_reads.result.json b/test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117_more_unaligned_reads.result.json new file mode 100644 index 000000000..1533fed15 --- /dev/null +++ b/test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117_more_unaligned_reads.result.json @@ -0,0 +1,6573 @@ +{ + "Software": [ + { + "submitted_id": "UW-GCC_SOFTWARE_FIBERTOOLS-RS", + "category": [ + "Base Modification Caller" + ], + "name": "fibertools-rs", + "version": "0.3.1", + "source_url": "https://github.com/fiberseq/fibertools-rs", + "description": "fibertools-rs adds m6A modifications to each PacBio molecule." + }, + { + "submitted_id": "UW-GCC_SOFTWARE_REVIO_ICS", + "category": [ + "Basecaller, consensus caller, base modification caller" + ], + "name": "Revio Instrument Control Software", + "version": "12.0.0.183503", + "source_url": "https://www.pacb.com/support/software-downloads/", + "description": "Revio software controls the instrument and the primary and post-primary analyses (basecalling, consensus calling, CpG methylation)" + } + ], + "CellLine": [ + { + "submitted_id": "UW-GCC_CELL-LINE_COLO-829BL", + "category": "Immortalized", + "name": "COLO 829BL", + "source": "ATCC", + "description": "COLO 829BL lymphoblastoid cells", + "url": "https://www.atcc.org/products/crl-1980" + }, + { + "submitted_id": "UW-GCC_CELL-LINE_COLO-829T", + "category": "Immortalized", + "name": "COLO 829", + "source": "ATCC", + "description": "COLO 829 tumor cells", + "url": "https://www.atcc.org/products/crl-1974" + } + ], + "CellSample": [ + { + "submitted_id": "UW-GCC_SAMPLE_COLO-829BL_1", + "passage_number": "NA", + "description": "Immortaliized lymphoblastoid cell line", + "growth_medium": "RPMI-1640 with 15% FBS", + "culture_duration": "17 days", + "culture_start_date": "2023-06-29 00:00:00", + "culture_harvest_date": "2023-07-16 00:00:00", + "lot_number": "ATCC-70022927\nSCRI-07162023", + "Cell density and volume": "3 million cells/mL\n2 mL/vial", + "doubling_time": "24 hours", + "karyotype": "92,XXYY[4]/46,XY[20]", + "biosources": "UW-GCC_CELL-LINE_COLO-829BL", + "protocol": "Thaw in recovery media: 1:1 RPMI:FBS 24 hours then split into RPMI-1640 15% FBS.\nCulture in media depth of .2ml/cm2 splitting by dilution until volume reaches 100 mL.\nTransfer to erlenmeyer style 500 mL shaker flask with 200 mL volume shaking at 90 rpm.\nFreeze in RPMI-1640 15% FBS with final volume 10% DMSO." + }, + { + "submitted_id": "UW-GCC_SAMPLE_COLO-829T_1", + "passage_number": "5", + "description": "Adherent melanoma derived cell line", + "growth_medium": "RPMI-1640 with 10% FBS", + "culture_duration": "39 days", + "culture_start_date": "2023-06-29 00:00:00", + "culture_harvest_date": "2023-08-07 00:00:00", + "lot_number": "ATCC-70024393\nSCRI-08072023", + "Cell density and volume": "3 million cells/mL\n2 mL/vial", + "doubling_time": "~3-4 days", + "karyotype": "Not performed", + "biosources": "UW-GCC_CELL-LINE_COLO-829T", + "protocol": "Culture in RPMI-1640 10% FBS. Split by rinsing with PBS and trypsininzing with 0.05% trypsin-EDTA.\nFreeze in RPMI-1640 10% FBS with final volume 10% DMSO." + }, + { + "submitted_id": "UW-GCC_SAMPLE_COLO-829T_2", + "passage_number": "4", + "description": "Adherent melanoma derived cell line", + "growth_medium": "RPMI-1640 with 10% FBS", + "culture_duration": "30 days", + "culture_start_date": "2023-09-19 00:00:00", + "culture_harvest_date": "2023-10-19 00:00:00", + "lot_number": "ATCC-70024393\nSCRI-10192023", + "Cell density and volume": "3 million cells/mL\n2 mL/vial", + "doubling_time": "~3-4 days", + "karyotype": "64~69,XX,+X,+1,+1,dic(1;3)(p12;p21)x2,add(2)(p13),add(2)(p21),+4,i(4)(q10),+6,add(\n6)(q13),+7,+7,add(7)(q32)x2,+8,i(8)(q10),+9,\ndel(9)(p21),+12,+13,+13,+13,+14,+15,+17,+19,+19,+20,+20,", + "biosources": "UW-GCC_CELL-LINE_COLO-829T", + "protocol": "Culture in RPMI-1640 10% FBS. Split by rinsing with PBS and trypsininzing with 0.05% trypsin-EDTA.\nFreeze in RPMI-1640 10% FBS with final volume 10% DMSO." + }, + { + "submitted_id": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1", + "passage_number": "N/A", + "description": "50-to-1 mixture of COLO829BL and COLO829T cells", + "growth_medium": "N/A", + "culture_duration": "N/A", + "culture_start_date": "N/A", + "culture_harvest_date": "2023-10-25 00:00:00", + "lot_number": "ATCC-70022927\nATCC-70024393\nSCRI-10252023", + "Cell density and volume": "2.55 million cells/mL\n2 mL/vial", + "doubling_time": "N/A", + "karyotype": "N/A", + "biosources": "UW-GCC_CELL-LINE_COLO-829BL\nUW-GCC_CELL-LINE_COLO-829T", + "protocol": "Bulk hand mixture of UW-GCC_SAMPLE_COLO-829BL_1 and UW-GCC_SAMPLE_COLO-829T_2 cells in a 50:1 ratio.\nFreeze in RPMI-1640 10% FBS with final volume 10% DMSO." + } + ], + "Analyte": [ + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_FiberSeq_1", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "111 ng/ul", + "volume": "50 ul", + "sample_quantity": "6 million cells", + "a260_a280_ratio": 2.06, + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_FiberSeq_2", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "220 ng/ul", + "volume": "55 ul", + "sample_quantity": "6 million cells", + "a260_a280_ratio": 2.0, + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_gDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "Genomic DNA" + ], + "treatments": "N/A", + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_HMWgDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "HMW genomic DNA" + ], + "treatments": "N/A", + "concentration": "92 ng/uL", + "volume": "25 ul", + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_bulkKinnex_1", + "molecule": [ + "RNA" + ], + "components": [ + "cDNA" + ], + "concentration": "449 ng/ul", + "sample_quantity": "3 million cells", + "a260_a280_ratio": 2.05, + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_HiC_1", + "molecule": [ + "DNA" + ], + "components": [ + "Arima HiC library" + ], + "concentration": "11.4ng/ul", + "volume": "25 ul", + "sample_quantity": "3 million cells", + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_FiberSeq_1", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "180 ng/ul", + "volume": "50 ul", + "sample_quantity": "6 million cells", + "a260_a280_ratio": 2.09, + "biosample": "UW-GCC_SAMPLE_COLO-829T_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_FiberSeq_2", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "56.4 ng/ul", + "volume": "50 ul", + "sample_quantity": "6 million cells", + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "HMW genomic DNA" + ], + "treatments": "N/A", + "concentration": "96 ng/ul", + "volume": "50 ul", + "biosample": "UW-GCC_SAMPLE_COLO-829T_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_2", + "molecule": [ + "DNA" + ], + "components": [ + "HMW genomic DNA" + ], + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_gDNA_2", + "molecule": [ + "DNA" + ], + "components": [ + "Genomic DNA" + ], + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_bulkKinnex_2", + "molecule": [ + "RNA" + ], + "components": [ + "cDNA" + ], + "concentration": "552 ng/ul", + "volume": "50 ul", + "sample_quantity": "3 million cells", + "a260_a280_ratio": 2.1, + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_HiC_2", + "molecule": [ + "DNA" + ], + "components": [ + "Arima HiC library" + ], + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_FiberSeq_1", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "110 ng/ul", + "volume": "50 ul", + "sample_quantity": "3 million cells", + "biosample": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_gDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "Genomic DNA" + ], + "biosample": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_HMWgDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "HMW genomic DNA" + ], + "treatments": "N/A", + "concentration": "90.2 ng/ul", + "volume": "50 ul", + "sample_quantity": "3 million cells", + "biosample": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_bulkKinnex_1", + "molecule": [ + "RNA" + ], + "components": [ + "cDNA" + ], + "concentration": "470 ng/ul", + "volume": "50 ul", + "sample_quantity": "3 million cells", + "a260_a280_ratio": 2.05, + "biosample": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1" + } + ], + "Library": [ + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00338", + "preparation_date": "2023-07-28", + "target_insert_minimum_length": "17 kb", + "target_insert_avg_length": "20 kb", + "target_insert_maximum_length": "N/A", + "insert_mean_length": 21870.0, + "insert_%_CV": "27.4", + "amplification_cycles": "N/A", + "barcode_sequences": "bc2025", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_FiberSeq_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_2", + "name": "COLO-829BL (Replicate 2)", + "sample_name": "PS00356", + "preparation_date": "2023-09-01", + "target_insert_minimum_length": "17 kb", + "target_insert_avg_length": "20 kb", + "target_insert_maximum_length": "N/A", + "insert_mean_length": 25734.0, + "insert_%_CV": "23.26", + "amplification_cycles": "N/A", + "barcode_sequences": "bc2055", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_FiberSeq_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_FIBERSEQ_1", + "name": "COLO-829T (Batch 1 - Replicate 1)", + "sample_name": "PS00357", + "preparation_date": "2023-08-27", + "target_insert_minimum_length": "17 kb", + "target_insert_avg_length": "20 kb", + "target_insert_maximum_length": "N/A", + "insert_mean_length": 22616.0, + "insert_%_CV": "17.4", + "amplification_cycles": "N/A", + "barcode_sequences": "bc2051", + "analyte": "UW-GCC_ANALYTE_COLO-829T_FiberSeq_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_FIBERSEQ_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00418", + "analyte": "UW-GCC_ANALYTE_COLO-829T_FiberSeq_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_NOVASEQX_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00340", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_gDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_ONT_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00342", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_HMWgDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_ULONT_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00339", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_HMWgDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_bulkKinnex_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00419", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_bulkKinnex_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_HiC_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00341", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_HiC_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_ONT_1", + "name": "COLO-829T (Batch 1 - Replicate 1)", + "sample_name": "PS00361", + "analyte": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_ONT_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00421", + "analyte": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_ULONT_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00358", + "analyte": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_NOVASEQX_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00359", + "analyte": "UW-GCC_ANALYTE_COLO-829T_gDNA_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_bulkKinnex_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00420", + "analyte": "UW-GCC_ANALYTE_COLO-829T_bulkKinnex_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_HiC_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00360", + "analyte": "UW-GCC_ANALYTE_COLO-829T_HiC_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BLT-50to1_1_FIBERSEQ_1", + "name": "COLO-829BL-T 1-50mix (Replicate 1)", + "sample_name": "PS00433", + "analyte": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_FiberSeq_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BLT-50to1_1_NOVASEQX_1", + "name": "COLO-829BL-T 1-50mix (Replicate 1)", + "sample_name": "PS00431", + "analyte": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_gDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BLT-50to1_1_ONT_1", + "name": "COLO-829BL-T 1-50mix (Replicate 1)", + "sample_name": "PS00432", + "analyte": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_HMWgDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BLT-50to1_1_bulkKinnex_1", + "name": "COLO-829BL-T 1-50mix (Replicate 1)", + "sample_name": "PS00434", + "analyte": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_bulkKinnex_1" + } + ], + "Sequencing": [ + { + "submitted_id": "UW-GCC_SEQUENCING_PACBIO-HIFI-150x", + "category": "HiFi Long Read WGS", + "platform": "PacBio", + "instrument_model": "Revio", + "instrument_cycles": "24 hr movie", + "sequencing_kit": "BINDINGKIT=102-739-100;SEQUENCINGKIT=102-118-800", + "read_type": "Single-end", + "target_read_length": "20 kb", + "target_coverage": "150x" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_PACBIO-HIFI-60x", + "category": "HiFi Long Read WGS", + "platform": "PacBio", + "instrument_model": "Revio", + "instrument_cycles": "24 hr movie", + "sequencing_kit": "BINDINGKIT=102-739-100;SEQUENCINGKIT=102-118-800", + "read_type": "Single-end", + "target_read_length": "20 kb", + "target_coverage": "60x" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_NOVASEQX-2000x", + "platform": "Illumina", + "instrument_model": "NovaSeqX" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_NOVASEQX-200x", + "platform": "Illumina", + "instrument_model": "NovaSeqX" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_NOVASEQX-HiC-60x", + "platform": "Illumina", + "instrument_model": "NovaSeqX" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_ONT-R10-300x", + "platform": "ONT", + "instrument_model": "PromethION" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_ONT-R10-30x", + "platform": "ONT", + "instrument_model": "PromethION" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_UL-ONT-R10", + "platform": "ONT", + "instrument_model": "PromethION" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_PACBIO-BULK-KINNEX", + "platform": "PacBio", + "instrument_model": "Revio", + "instrument_cycles": "24 hr movie" + } + ], + "FileSet": [ + { + "submitted_id": "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1", + "sequencing": "UW-GCC_SEQUENCING_PACBIO-HIFI-150x", + "libraries": [ + "UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_1" + ] + }, + { + "submitted_id": "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2", + "sequencing": "UW-GCC_SEQUENCING_PACBIO-HIFI-150x", + "libraries": [ + "UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_2" + ] + }, + { + "submitted_id": "UW-GCC_FILE-SET_COLO-829_FIBERSEQ_1", + "sequencing": "UW-GCC_SEQUENCING_PACBIO-HIFI-60x", + "libraries": [ + "UW-GCC_LIBRARY_COLO-829T_FIBERSEQ_1" + ] + } + ], + "UnalignedReads": [ + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230825_191347_S3.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230825_191347_s3.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "3940092", + "10%ile_read_length": "15150", + "median_read_length": "18140", + "90%ile_read_length": "24120", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "45eea8352e2b8a3ad11feeccd4fea2bc" + }, + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230828_212510_S3.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230828_212510_s3.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5750093", + "10%ile_read_length": "15280", + "median_read_length": "18560", + "90%ile_read_length": "25000", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "9396dde111d9f719f7d94b98802ae68f" + }, + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230828_215531_S4.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230828_215531_s4.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5540842", + "10%ile_read_length": "15270", + "median_read_length": "18540", + "90%ile_read_length": "24950", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "c292f2a92316f09eba13e515eaf7c6e5" + }, + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230828_222637_S1.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230828_222637_s1.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5142752", + "10%ile_read_length": "15340", + "median_read_length": "18700", + "90%ile_read_length": "25150", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "d0daf2811713ce0f18ed4cd38862a509" + }, + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230828_225743_S2.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230828_225743_s2.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5092420", + "10%ile_read_length": "15320", + "median_read_length": "18650", + "90%ile_read_length": "25080", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "48319442da9d28eb6d44822cfb8bda67" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230913_211559_S4.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230913_211559_s4.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5049023", + "10%ile_read_length": "16720", + "median_read_length": "20630", + "90%ile_read_length": "27640", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "2f39b216ccf0de536e099e83841b8f55" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230916_212004_S3.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230916_212004_s3.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "4912815", + "10%ile_read_length": "16740", + "median_read_length": "20690", + "90%ile_read_length": "27710", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "a91d464af7f868b3291767df3d6f6aea" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230916_215110_S4.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230916_215110_s4.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "4866279", + "10%ile_read_length": "16790", + "median_read_length": "20840", + "90%ile_read_length": "27980", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "8d3b24b021d5d4dd4c8aaa4106999987" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230916_225322_S2.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230916_225322_s2.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "4749101", + "10%ile_read_length": "16810", + "median_read_length": "20890", + "90%ile_read_length": "28060", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "98be0640495b9a66328a02fce08704cd" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230919_203620_S1.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230919_203620_s1.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "4694509", + "10%ile_read_length": "16670", + "median_read_length": "20510", + "90%ile_read_length": "27380", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "c3a68e07c776276bd95221e5adffb2a4" + }, + { + "submitted_id": "UW-GCC_FILE_PS00357.M84046_230913_214705_S1.BC2051.FT.BAM", + "file_name": "PS00357.m84046_230913_214705_s1.bc2051.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5072026", + "10%ile_read_length": "16880", + "median_read_length": "19830", + "90%ile_read_length": "25180", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829T_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "c8e0d9d49294139a6dfa37aa3b9f2448" + }, + { + "submitted_id": "UW-GCC_FILE_PS00357.M84046_230913_221811_S2.BC2051.FT.BAM", + "file_name": "PS00357.m84046_230913_221811_s2.bc2051.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5873988", + "10%ile_read_length": "16840", + "median_read_length": "19750", + "90%ile_read_length": "25090", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829T_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "ce95b0c1fcb48e26cb991aebaa429e29" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "16668052", + "checksum": "f6a468c1e901ba41843ccb0076b73624" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "16668052", + "checksum": "423930bbd16a7671bd757edfa5fcee12" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "17571154", + "checksum": "3d9acad3ea32f436ed6000d35f6da3a7" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "17571154", + "checksum": "0dfa5c3557d8198a819c85671027da72" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "17164167", + "checksum": "eee3348b790db828c1751fe57463e7c6" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "17164167", + "checksum": "245027aa066a0121d15f4b4e2de0edf9" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "17164009", + "checksum": "b47d60123fc72325f58c807cbc0d47f5" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "17164009", + "checksum": "34b45bf8c24535de199a29020e22ffb5" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "17188931", + "checksum": "130b4e91f1c77d7b5e00ec56d79b241e" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "17188931", + "checksum": "81136eec5d0061abc5467020df12a9cc" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "17193380", + "checksum": "7600e0e476a79c1e215a24b3bd46d9e9" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "17193380", + "checksum": "0a78bda096ef1f95efcd7c883b01c016" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "17281040", + "checksum": "2259253be91316fcfdc5edbd7a1771c4" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "17281040", + "checksum": "05867530050f63a4d57080430d24c310" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "17065081", + "checksum": "db8f1a4b8398a94010014425d411a455" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "17065081", + "checksum": "f1a063bf393806aed470a46af760a38d" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "73321235", + "checksum": "eeddb863102a899bc02c681c652c7c2a" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "73321235", + "checksum": "074020e417151bbeca5f62904b99ed6c" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "75555132", + "checksum": "1efa74af32e809cb5274dc9132c64bad" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "75555132", + "checksum": "27090b12a76b0d6b3d243df05f3e21be" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "71834184", + "checksum": "8f18f0064df2ee66ff300402b98dce2e" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "71834184", + "checksum": "efe116928da0531fe7acc26080e5812a" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "73651589", + "checksum": "8d76770ff353710cdf6687292cc6e1f0" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "73651589", + "checksum": "d0ad1f8f1976e8b7dc01a1517635725e" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "70615522", + "checksum": "2c61d2933c03269cc349903299913cc7" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "70615522", + "checksum": "1b59a79ac9984e7f8ff05cf66b147c24" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "71502691", + "checksum": "7c58994c3e5e4eadec80b43b17d36042" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "71502691", + "checksum": "3ac1592f956259df14bb7d4f710423b4" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "71912053", + "checksum": "cc53651352a4ed4418e5f63a230762d5" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "71912053", + "checksum": "2c4bdba9db35abcf2fcd047db0d0956e" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "72911792", + "checksum": "224279ad5721f03a09076e86019c23af" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "72911792", + "checksum": "83380c0666cc703afad58428a27da7b9" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "17914371", + "checksum": "8d7405cd14257c3e55ce77838c1781a6" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "17914371", + "checksum": "0dcc42ba731a9869bdbd897b61d17e1f" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "17024467", + "checksum": "028eb7c7e2a2b4edeb4992f40cc7f33a" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "17024467", + "checksum": "fe811940bb6d52f0716bac7d3c8daa0d" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "17523681", + "checksum": "ae96ad4276f289ee3c0026053402e30e" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "17523681", + "checksum": "a0992cd5ca6c0fce9b11d74dc88a87a2" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "17390389", + "checksum": "1e939c435a97055c25dfafc3d8e9eed1" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "17390389", + "checksum": "e9f7656cfc374bb096f4c856bae4bf23" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "17388355", + "checksum": "10a8d556dac524e86e0e16eccb77565e" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "17388355", + "checksum": "3169499889d48865539d0449915aaaa4" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "16985071", + "checksum": "d12f91d9f7e459d87033b91a66eb23c1" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "16985071", + "checksum": "ee57a3688614140321694ed7671d7d3d" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "16682467", + "checksum": "2e9ef41704d7cc0262d2de2c9d796e20" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "16682467", + "checksum": "67cf8677c76bd9a8c3727a4690e24215" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "15896031", + "checksum": "9efcaf24b4daa5c65085e90c235a18f8" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "15896031", + "checksum": "885d6db5aec0bfa324762a2693eb0ebc" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "24000157", + "checksum": "4397a37269721b0e3c87ca77085e7aae" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "24000157", + "checksum": "ef41f485b3315d57c993f2136989795b" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "24604096", + "checksum": "2864865c22f739ae6f5ef233afc78c4c" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "24604096", + "checksum": "359a5f049e02baa192d854afa876fd1e" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "24561621", + "checksum": "a09c923e90aaf3e085f0b50962ab5014" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "24561621", + "checksum": "cd6494ceb0818683c656e6f7ec1cc4d1" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "24747136", + "checksum": "9ae408f6fa69a256192d8cb85f5e3ca0" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "24747136", + "checksum": "03eccb7c2b8f29c65e396e9779e1693f" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "25040721", + "checksum": "b063a5c7c73763ac641878a78888bb99" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "25040721", + "checksum": "7df298747f2936b1f54c2935a241f90c" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "25281416", + "checksum": "ba16cd3749cdaaa72844d208977d9a97" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "25281416", + "checksum": "2414cbd97e0f4ae5c335439d1df9eceb" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "25128366", + "checksum": "219287dc2d13b24c08440b43bbb6bf4d" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "25128366", + "checksum": "c870496ae047496cfd8a618d07cf9f16" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "25255041", + "checksum": "9888a5d0b4439c5ec5c3b16d9c54f2d8" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "25255041", + "checksum": "2f679d664f57b0cb22ece522eb6f0a0c" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "113000000", + "checksum": "93d1bf5d63b93d5bfc523b4b2c0e1fde" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "113000000", + "checksum": "13f9ee6f12e56da9ad455ac13bb11b20" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "114000000", + "checksum": "c7ea2546416d1d8a0502be1e94153a11" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "114000000", + "checksum": "9f0c56b1d6773ef7cd15c7361b28b3c2" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "112000000", + "checksum": "bbd86e027834642a8ba189b669ccec19" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "112000000", + "checksum": "dc0050ef78197c7b0b89a80d65eaba72" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "112000000", + "checksum": "413b5cdd8ab23c53136debf46db84ae4" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "112000000", + "checksum": "6427d3c58558c76576e38555397c30ca" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "106000000", + "checksum": "f8b77544aec471cbcd9c0493bde7839a" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "106000000", + "checksum": "7d7fa180a32f9f679403fcc97466f445" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "107000000", + "checksum": "d3e0fb8d9a29b9e5dcc68b6745b62ea8" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "107000000", + "checksum": "b4c6402b3bdc4151c38a5ad09e467cd6" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "109000000", + "checksum": "42246c7b51630b1c9ff67ac902e0cac3" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "109000000", + "checksum": "5efcce09adb6364f6139a971e32ca4ce" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "111000000", + "checksum": "a126f34e445f681f353766e0937d8f2c" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "111000000", + "checksum": "0da28dd08a1d418aedaf6f5bc1ac9cb5" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "27077469", + "checksum": "1badf4dfbe0a09f91dd7c8f7eea68eac" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "27077469", + "checksum": "e7b8e64ddd934040cd3dee86a8fbc578" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "26285392", + "checksum": "ab7ed4308acad009f1fa3e0a6d2faef9" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "26285392", + "checksum": "deb3b04cd52c51cff9ae1561982ef1f1" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "26326704", + "checksum": "8215523ca179c5f78ddebaf3c7d5939c" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "26326704", + "checksum": "dc2eec2098165c2941eedd48c37f9fd4" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "26880375", + "checksum": "057edd8bef40d026b98764801ca91056" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "26880375", + "checksum": "df15dce5d93f6c850e7d5c696e6b04c8" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "26143687", + "checksum": "4473fecccfc5ae313e00ed43405cd619" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "26143687", + "checksum": "8f712e60cb68df9bc9487d1794661d89" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "25297041", + "checksum": "dec6abfd764d7479045b1c7a9d8ffe04" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "25297041", + "checksum": "32b3a237107fcb99f3e007071abf1986" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "25798910", + "checksum": "b4c0fd3e8b229029c7212bdce959bed2" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "25798910", + "checksum": "3853cde01ac1bddfbc59de1cb80d4c71" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "25116337", + "checksum": "c92f06e66f3c9b3214a19183349db54a" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "25116337", + "checksum": "9b2b5d96ea5bc10dc4b4dc9aea3f83f9" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "19635879", + "checksum": "2a466e55f48becd9f074e3f27a9f0aa0" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "19635879", + "checksum": "eebb34a98d39f29c00df691095b32134" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "20342366", + "checksum": "e97067756e0ebe4c9dc5770bd4cba8ce" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "20342366", + "checksum": "278bf1fba92791f58e3be3d0515b41d4" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "20199709", + "checksum": "879a34985f628be15394fedb948c3aa2" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "20199709", + "checksum": "0a70b895d45f561ba12afc1581fb39f1" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "20137961", + "checksum": "c6f4bbcf6fdec1d9c0b19961073f1ad1" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "20137961", + "checksum": "04fbe5cf2cf381fe18ed198efa03907e" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "20266340", + "checksum": "3898fa452396fb85e02c5ceaead95efe" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "20266340", + "checksum": "51bd33c36fae6b294901bc38d310344c" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "20265822", + "checksum": "10ab37892563e499b24694832e2bb56b" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "20265822", + "checksum": "1f536a39ec987f89926c915b91a4ad1b" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "20304996", + "checksum": "549a5e91ceaaa75c93b2e0f4f827221d" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "20304996", + "checksum": "6fe77ae742a1fcf7be93ab67d6429de2" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "20063618", + "checksum": "98a58976b160bd5937411de0c71b06bb" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "20063618", + "checksum": "9a0f8e328239e2b8dcab9d402b733a83" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "87793108", + "checksum": "1d1ec491fd4e5e58b20154e83230c941" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "87793108", + "checksum": "d58882427b2ed5deaf290c1a808ffc62" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "89786431", + "checksum": "6b5a92a479b2beb5a770fa912c573070" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "89786431", + "checksum": "4950c8907786a4decade978993a85268" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "86999178", + "checksum": "a9835ca420c1c1aa164c425e2203ad71" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "86999178", + "checksum": "b4a1c86e3f0ded289396ea92b00ea401" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "88397924", + "checksum": "39b9a0cbfb1e34ce2a81d6a5bb0ffb09" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "88397924", + "checksum": "54803661caf4782bec0b77f76805877f" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "85058961", + "checksum": "9766f4698267a153338d8c10c8f6dc42" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "85058961", + "checksum": "46f4df2c1694b216e402426bf59715d3" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "85727863", + "checksum": "9cecd8e193a8916c886de5262911c985" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "85727863", + "checksum": "7b1ab302a558b252af5842f617649fb5" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "86613417", + "checksum": "94e3e066058dd1a857292b05c49769f3" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "86613417", + "checksum": "c722bfa3a9faf90b6fd11bda539140c6" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "86258339", + "checksum": "15de5dceda0e741b82c7ccf3b4b81c8c" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "86258339", + "checksum": "26b25f3dc52eca48b556568df0e0da6d" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "21087099", + "checksum": "498253285ac717a2033cf9f39cc128ec" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "21087099", + "checksum": "0c95c2895d956a272484b3883da74faa" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "20463371", + "checksum": "6fd27696ffad46481c40efe264a9a373" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "20463371", + "checksum": "91ae073b82984e73e68a48dfb1afa313" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "20933001", + "checksum": "62df6c5f2bf38b03f6e4b4817b5c8269" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "20933001", + "checksum": "e4a23ee1553f2ada1f4e6cb5009541fc" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "20915279", + "checksum": "ba3b60d0572a3efc76b190a9e6d5f68e" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "20915279", + "checksum": "77d7d42204e73f14b3703c57615b79cc" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "20821999", + "checksum": "f1e223bcf6e72acbe14fb9e611b65d3d" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "20821999", + "checksum": "404d11e0f5832013ab66b1b3dbbad774" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "20298315", + "checksum": "555922d013066eeb8ffa69d3390b0554" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "20298315", + "checksum": "4677d99467e065c86a86626e40cdbf0a" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "20146383", + "checksum": "e0221e39b371a675fdb8e65ea1e7cc05" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "20146383", + "checksum": "a52e54cd70382fe6df7d41036bbaa5f5" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "19276055", + "checksum": "b156253cd7b8f9a44efc2633fb806c6f" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "19276055", + "checksum": "e978f4a46f26969ee57811429f1504ae" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "20959037", + "checksum": "b4bff39a5ffb2c82b86295d1869344ed" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "20959037", + "checksum": "44ed7295449c862a27f7b2aa86525fc4" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "21785939", + "checksum": "bf2500109eddba0482d113980cccf246" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "21785939", + "checksum": "9e8d9a927fbb432c61f3daecba6d90e7" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "21588177", + "checksum": "1e23db1aab251c0cec9af6868aa61fa4" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "21588177", + "checksum": "f4d92d130f392c118df3bc63750b282c" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "21581022", + "checksum": "5b171caaa8d349b6ddd176beeebed089" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "21581022", + "checksum": "1b599a4ef144a53a8e691fcdbc798d9c" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "21703868", + "checksum": "8d7e7ab4f255f321f1e32c1915d84be3" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "21703868", + "checksum": "857fcf45fc9da203f05cb29cd137ed67" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "21723768", + "checksum": "8df6af727b5eee5047c9d6b8a3d97ef4" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "21723768", + "checksum": "2761eb2908ee5a0c8903353061e83d81" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "21746309", + "checksum": "b677e1de52d8ecded23f3baf69c194c3" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "21746309", + "checksum": "e8d1f3dd2b65548e7f02dacb3f066919" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "21449011", + "checksum": "e1ed97a2b29700ca6f0a4c83ec0af65e" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "21449011", + "checksum": "a01d267d7a107e056598fc5ad2d1eb21" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "93914538", + "checksum": "4717f06e6f7f9ddd017ba6d4fba31529" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "93914538", + "checksum": "a417e8d28600d30544d1cc11a515a821" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "95515989", + "checksum": "afd1a4d269c38cc98c2d93e718815ff6" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "95515989", + "checksum": "6723aaf936f8e8dab7f228e69ffe5ac7" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "93139449", + "checksum": "b00f8c53050a225133bcc9ca9a39005b" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "93139449", + "checksum": "9f6853b1fdacbc570c14d3d89ac2ae06" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "94461732", + "checksum": "362083ebe1f66698e6e9fed4873bd574" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "94461732", + "checksum": "5e45996c79cbd9e90ace59a8000d7819" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "91256404", + "checksum": "5342ce272df18e8b06dc5e064bf6dc30" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "91256404", + "checksum": "b238d1cd47be94ddba22b4adaada18ca" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "92064200", + "checksum": "3aaeca90cdbe938ec559e5a0084a8976" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "92064200", + "checksum": "4658b6178a1155a3f29dcfedeea26622" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "92913043", + "checksum": "977e9d5d2078ae3a3c08372ef03b650f" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "92913043", + "checksum": "6cd6819d5b6e921d463ef5864b43f839" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "92704931", + "checksum": "9139c48dd5687191e5299ee11acb3d65" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "92704931", + "checksum": "277dccd46f90fb9f05a8276d29be44f7" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "22580413", + "checksum": "1246d59cae5bb29161b792a6ec68ae35" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "22580413", + "checksum": "52424948a01e37c56588304fce9211fa" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "21905173", + "checksum": "014fcbb425d72c15e3786a618738e963" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "21905173", + "checksum": "5bfb276c54a0b52412aa8820be33d4e3" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "22381978", + "checksum": "a49a21a7647037232ee9ab6b6b909147" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "22381978", + "checksum": "86e0a04f3b696771cb8257818c435ab2" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "22365832", + "checksum": "c9bd689fb9c6e9abf96e2efd2cb0acc1" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "22365832", + "checksum": "785501cbd9b7f1b45d154543623236ca" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "22370435", + "checksum": "a2752a02ec6fb259ca338610e1dac8ce" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "22370435", + "checksum": "36a65e2dd075834bd2e598c50ad494f4" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "21903597", + "checksum": "e0c78dea948170e679c33cfd265862a6" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "21903597", + "checksum": "41c3b0808ce3d6ceabb124e0e7642fc7" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "21852930", + "checksum": "223336cd68067d294de2eb3bff36c610" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "21852930", + "checksum": "8e9cfa0d5534ef068efb622bce010e4b" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "20980185", + "checksum": "5ccae04202bd8cbe8dc6893c18e31584" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "20980185", + "checksum": "cfdfcb905ff06455238c89fbafed32b4" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "24216305", + "checksum": "0f0ab0bc9daa150cf4b9777801463f30" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "24216305", + "checksum": "187d9874631148e275b3df17ceae1ece" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "24998743", + "checksum": "31e35b1fc537ab752d5e6102c74819ab" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "24998743", + "checksum": "b520b1efa4c178cd07c5ec3c448674c2" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "24638286", + "checksum": "bb5fccaf1f6847a8cdedf60d17ebfb9e" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "24638286", + "checksum": "2e7062ddcd8bd3f69c35d00b5ccf7d6b" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "24579427", + "checksum": "755db010f96ab7598ff28261bbe3ce17" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "24579427", + "checksum": "2c421ab3a06b5690078e1f432bb4e372" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "24851618", + "checksum": "3cf43f0dbd9f9c47d7641c67034ff93d" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "24851618", + "checksum": "dfb9c50b7b4398f73d66481da98b1f62" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "24860220", + "checksum": "6cad9a184615a819356c8a882ee925d8" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "24860220", + "checksum": "b29645ab74f48d7ff2e9eefa9182b57c" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "24896069", + "checksum": "abb0e3fcf3705f032d3f7d7018396bd2" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "24896069", + "checksum": "2e8b2b4ca06bc9c7525576ec55519265" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "24677270", + "checksum": "46dd77275d3900a98a716482c41b20c0" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "24677270", + "checksum": "ae93e1f17292529dfe3c554b6279882a" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "109000000", + "checksum": "9e2aa352252b3567dff144bf3d2670b3" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "109000000", + "checksum": "1b506802f839dbbf0d9de7cd0bdbb604" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "111000000", + "checksum": "2e878588e1939973b2331ff846f64ad3" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "111000000", + "checksum": "f05f710cb5b3f97beca4b65ca87b0aa5" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "108000000", + "checksum": "4b058839ebcb32b2adb43645e5c66d22" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "108000000", + "checksum": "5ca25edd22b34252f49a547a3ae6653e" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "109000000", + "checksum": "c7ba2eb8e2e88958e5297fac030eda4e" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "109000000", + "checksum": "41c2ee72c27fa34a6054746ea8f264c0" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "106000000", + "checksum": "70986d742cf9914127d92f4c363f73ef" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "106000000", + "checksum": "2544e884050806f4fcb87d111a4000f0" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "106000000", + "checksum": "26413d863cb60324ed9364d225c510e7" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "106000000", + "checksum": "e052b32c675b532377af2c8c61b8c0d4" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "108000000", + "checksum": "547878b5518e522f09e8081675986a62" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "108000000", + "checksum": "19447050449406a828f2921ea108c0dc" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "107000000", + "checksum": "8550c37c4a776654a45e8f31c601a9fe" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "107000000", + "checksum": "2d3e2a65006519672cb1f3995876a36a" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "26167485", + "checksum": "f134fc767e035446a2a5ac11fb5cf514" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "26167485", + "checksum": "f75e5db51b9cceb00247d13c83aa369e" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "24951942", + "checksum": "91974c765a423aca5a025d39dc6e78d4" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "24951942", + "checksum": "ad59719f17848a8239ccb30e7f8f89cd" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "25439635", + "checksum": "4b0928d28ee434e10a734d1032f20915" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "25439635", + "checksum": "814735b3b5822dd8d6473a0c7411f61c" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "25393827", + "checksum": "c0e53737e0d7c381f0111aa07777eebb" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "25393827", + "checksum": "897466199d61ec75b41380fc39e27c1c" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "25254452", + "checksum": "4fd3216007cf2e574f4990e812670929" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "25254452", + "checksum": "ee95616b6f6b4932fbffb08b64ba771b" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "24598234", + "checksum": "f8babbeb00af280d74686556642d76d0" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "24598234", + "checksum": "00ade249fc25c1152767602e71c04557" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "24464381", + "checksum": "9fb85ab5127fc31b256e0f63dd3b1f27" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "24464381", + "checksum": "5c33c5db978fa706520d76ff3f16f6b6" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "23402868", + "checksum": "a8f9fd3b2b147d7d7c55683e839d1d4b" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "23402868", + "checksum": "14511f754fab30c9fe6e7eea9efc8f46" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "19222971", + "checksum": "8e52e53ca29ce54a65559b41123fe161" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "19222971", + "checksum": "8127aad594900fcc1d7ad8e5e01b4183" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "19443975", + "checksum": "f9cec214a51f4f10a4f333cb9269b3c4" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "19443975", + "checksum": "418cc49b660d60a59eb2743606f57acd" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "19561103", + "checksum": "597cd9dda2d89719416150cf709b2b2d" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "19561103", + "checksum": "2859be2e27f3656f34c3aeff2d7c7690" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "19747529", + "checksum": "dc0c0c6e66347ab02f3306521e2179c4" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "19747529", + "checksum": "07ea50ffb79e1b1a5eba2459744db616" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "19932597", + "checksum": "28246488e0fd31ef9111728b32fb5595" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "19932597", + "checksum": "5a7358417101c1c0c114442d8f422fc9" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "20171251", + "checksum": "61ffbfe25d4397d916b340fb20e56ca4" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "20171251", + "checksum": "7bd256a5c5742aa9f22f9c5ce7263397" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "20141622", + "checksum": "1d1ed592b32ad5e19890db661216422f" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "20141622", + "checksum": "4e43b97b13ba9ae4e060e8b9ddc71814" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "20273900", + "checksum": "7de1b1485d435e3af39e6ae90b0bb329" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "20273900", + "checksum": "a864e313c6d0fd98a990d96024d249f0" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "85677071", + "checksum": "9ed79605445a0c3444c7f082a43f1a1e" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "85677071", + "checksum": "1b3403351e5f405a60f62964b6773e4f" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "85521272", + "checksum": "56f163f82a0d54fe50bacdbae9509756" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "85521272", + "checksum": "1327dfc306b83bfa09221c6b34259a7a" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "84379273", + "checksum": "42cbf5ab75cf438c9100bd5b52a32e0c" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "84379273", + "checksum": "1ee3c65c2deb7a0372e2843e3d7569e1" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "83469912", + "checksum": "86f09d494e677587770eebb8b02b76be" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "83469912", + "checksum": "5fe223ff1da5fbabdaca77b9cc471f24" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "79519076", + "checksum": "318226fdd685200f10a380a29d6655d9" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "79519076", + "checksum": "40d8b9e2bfe9449165b08a71f2b237db" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "80531381", + "checksum": "a5ab0de56c10bf0abc5e2057d34e8d0f" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "80531381", + "checksum": "660a639dd2c4a3eadea13dd565d4ad16" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "82702669", + "checksum": "72ae7a4f5c1b7f159112f1bc27fdd850" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "82702669", + "checksum": "ec16bcfc4f4a183bebb207293c6b64d2" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "84046944", + "checksum": "c2172c18322370957f225081431ac177" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "84046944", + "checksum": "8b9804e2b454e469e0366c68478cceb0" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "21706034", + "checksum": "a3b5ca9403bf84a19fe9a609c6de4b32" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "21706034", + "checksum": "c7b3e75d9edad3ccca8f1c20d778c958" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "21110311", + "checksum": "c2cea6c16bc50a1013c11eb35f96cd7b" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "21110311", + "checksum": "d32e99850d34dc099e3bc655f4bc5f08" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "21068887", + "checksum": "8031a6935c1ae93229f573767340c80e" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "21068887", + "checksum": "e84fa5cfb716dc1f78d753e4728f6287" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "21346071", + "checksum": "221045ac8b24eeb36bb3b5bdd17c7a0f" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "21346071", + "checksum": "a23f24f1c784e570c90302789ddcd734" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "20887937", + "checksum": "68cab122ee0b581d471c3dea803b7df9" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "20887937", + "checksum": "9975f24cbad04abac25061bf97f57e06" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "20310472", + "checksum": "69d9d29689bc39bb833cb151a8029fb1" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "20310472", + "checksum": "009b0bc74c6538816bb084cb2a41ef38" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "20773457", + "checksum": "d0444795abb844bd67f6e544ce3d6442" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "20773457", + "checksum": "97ed9673a738b1f7f17532c280dc7473" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "20427986", + "checksum": "b4a42dee55a1dafb3f4fba14fbebeb21" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "20427986", + "checksum": "a59353758e42e91ced22f7296dca8278" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "26609606", + "checksum": "c6df678a8c1f54d4c7bc332a28595bf2" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "26609606", + "checksum": "4366403c8e8a49de6a51244f6669010f" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "27801382", + "checksum": "c91544217a4933b22e36ac1d1f01633e" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "27801382", + "checksum": "97eb7f5408e61a6050796a3bd1d2ece6" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "27136404", + "checksum": "b930e0c5c870242da41eeddd63db8b1c" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "27136404", + "checksum": "c57275289b126cca5d390c268860025f" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "27139709", + "checksum": "7898c1726b55ba197f7d1ea10aa9d848" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "27139709", + "checksum": "64829e745c4ddbef31649eae822a7c28" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "27134698", + "checksum": "3c63b26824fd590c2f9a35fc7d1c4aea" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "27134698", + "checksum": "1d93f4f636022dd64e2892ea036835dd" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "27190500", + "checksum": "eec995d7f8a0c46255903dd52fdfda5d" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "27190500", + "checksum": "1310bb31448a011dcc8f3ecf7191c21e" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "27385295", + "checksum": "f935d661d051daa1dfef5436e65763fd" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "27385295", + "checksum": "f9110595251486aa28d11e4ada0b29cc" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "27202715", + "checksum": "9a26082aa47a615a6549a8e6522e36ef" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "27202715", + "checksum": "a512dbf6b638347db4cc44e1fa086211" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "118000000", + "checksum": "b5ffabc6be445536ccb71c28fe3876b2" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "118000000", + "checksum": "14683a4e5b1de87ee4e20aebde3548f9" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "120000000", + "checksum": "4b612a78aa48593f9e7a592f6f3fe11e" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "120000000", + "checksum": "060709006280adec6b2085caba9ff6cf" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "115000000", + "checksum": "c4d26f7dd2b6ef8899d6a8f047fc6b66" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "115000000", + "checksum": "6f769901d32e88720c561f765a033b39" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "117000000", + "checksum": "d90ffa37933db8166bfbbd40f418d64c" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "117000000", + "checksum": "9d3b294e5474f538ccece67d8bb32615" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "113000000", + "checksum": "be14397dc1bce2b2814e3adc1eb37ddd" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "113000000", + "checksum": "b8cb807936a2e5d2c7f3da76403e5233" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "114000000", + "checksum": "5d55a77574913e4e12996a7e3f2f3203" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "114000000", + "checksum": "c5c4fcb0750397599ac540dbaec16efe" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "115000000", + "checksum": "47fa49d6831022f709c47fad762aaa89" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "115000000", + "checksum": "4fce9178e6cf798b929ba4bfecafca02" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "117000000", + "checksum": "9e74d706f5d0618be7333f5698f67f29" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "117000000", + "checksum": "dd445cd74cd3bcd7c47a1cd66ff063dc" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "28854580", + "checksum": "0512d15aa8486d5be1b1c829a2cb1a01" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "28854580", + "checksum": "5301f06a4c5c05e6a63fb3315946c150" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "27286765", + "checksum": "5f697a655226c1ce8a75b5f7ded3cc9b" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "27286765", + "checksum": "82d1a58bb95bb2aae6025f78ae9df114" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "27913793", + "checksum": "f4500c47d0dbc8cbdb10bed7a78b6b87" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "27913793", + "checksum": "696b33e1da08f340d347fd954d9ac7b9" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "27664328", + "checksum": "3b5e0fc10123e710aaad016152047943" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "27664328", + "checksum": "1fc83a5789418982d895be37090e92cd" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "27774034", + "checksum": "2c4a31d2a4ca12a1b7fe006a4d63c71e" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "27774034", + "checksum": "1b7e224067b334e07193127363a3978c" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "27153088", + "checksum": "374b72efe0758a536e7fd9470bb1c1ad" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "27153088", + "checksum": "e098976ccee98511da5b152b8b68e23a" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "26993879", + "checksum": "6e107bbb843409ac6ffb72392aa5e246" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "26993879", + "checksum": "f5b55921497660253dd7dcfba01964f5" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "26093477", + "checksum": "f3117eac287c68107068226618afeb46" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "26093477", + "checksum": "da8e40ef8ec4d6e1cd66639dd0c971c9" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "17908626", + "checksum": "8a14d4128e7682c89c52f83a09f44ecf" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "17908626", + "checksum": "f6b889e79f50f68a02072ea4e14c93b0" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "18557369", + "checksum": "e3783c727673a7bb5f1d4812c75ccb85" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "18557369", + "checksum": "e160498fc47ea900d64cfe3abaab30e4" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "18553572", + "checksum": "ebc8c42004f2b39d1a9d1a3a4a544361" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "18553572", + "checksum": "f645906a92cf4841cf0ddb5c11706067" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "18530728", + "checksum": "39f64579f875c1aad277a181bc94edff" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "18530728", + "checksum": "f045cc304d09c97c5b6df5396dcb997d" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "18720703", + "checksum": "09a4fd4b7694d9008c1444cd8ea08834" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "18720703", + "checksum": "50a28ddfffdd2328348f742e8c13f7b1" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "18674592", + "checksum": "f68e226daf1e0047f9bd1feba5891d31" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "18674592", + "checksum": "965c14a84c234bbd8c52dfddf8aac537" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "18671587", + "checksum": "7178d8f3b0a4721fbd2a1cf614bc871e" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "18671587", + "checksum": "97bb49704fcef8b0cc3b0781066d9a60" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "18389534", + "checksum": "efa50ca4a0871d24ccde9d98e687f503" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "18389534", + "checksum": "47fdc5329e22daceee3737537c3ead19" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "81709995", + "checksum": "96a4befe5ca56e251e9b419d6d4afe03" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "81709995", + "checksum": "ede340be0904b884d13bfbec1a3bfd4c" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "83996341", + "checksum": "2f363f22442d2f6da0b8020a8a5d410f" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "83996341", + "checksum": "49fb9d935d5c22262cc2a3e6d37c16f6" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "81516251", + "checksum": "e7404532716547d921cff4917a332410" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "81516251", + "checksum": "28fd9b47cfb0122dc1c51425e6aa0ba2" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "82570500", + "checksum": "d7af59bf5ee3dee7b18e39db3960c309" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "82570500", + "checksum": "e1d3bbe85a8edb74a2aad558951f18a6" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "79929018", + "checksum": "2c6ecddc293d2b1a4a4307ad31a9e1a6" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "79929018", + "checksum": "080d9cd9d79a6c5a3fa214eb73efbf00" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "80008445", + "checksum": "f099d116c2a7a83a879a1723dc048a51" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "80008445", + "checksum": "1d9ef2dd8d5aaa3d229102b0971246d6" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "80988507", + "checksum": "11dc8106c73f713acbb771ba9b1ab03b" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "80988507", + "checksum": "0de2bd42a152e4ef3a409bcd70e653f4" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "79751248", + "checksum": "0e17afda93144f9796fbfe9ab27ee248" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "79751248", + "checksum": "6ea6c75383917ef682c2fe96d492c74a" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "19277207", + "checksum": "6031a7e34b69a24ca0da69c7b87977d8" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "19277207", + "checksum": "875ef27308b4b93531b956f19506a3ad" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "18828053", + "checksum": "90d3070ba6160b2ccf9bcedf6a170657" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "18828053", + "checksum": "da8c43f86eb3247a611e0ff377765efe" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "19342040", + "checksum": "4e81d315e04004345699a22487ceb143" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "19342040", + "checksum": "0b4555a43805c6b64d1ad9c12a953dc9" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "19369922", + "checksum": "ea0269b4005bae96cffac2c7acea57d1" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "19369922", + "checksum": "e97322167e51d7835852739902935330" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "19342131", + "checksum": "2e9ca4e845db7d2df37f791584a21dde" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "19342131", + "checksum": "e760f6047a9ff7987baf1e2630767432" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "18804826", + "checksum": "36af0ada765b7a1f9f27b1eb294eb1ca" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "18804826", + "checksum": "6b75165580017b20d9096ff95fb33b2b" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "18718925", + "checksum": "0579c1aa298602b009c86d2563350df3" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "18718925", + "checksum": "ea5016c9a5305e4e6b0400cf41b1f6be" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "17773515", + "checksum": "f000a53e68b3528443b1114bbf321650" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "17773515", + "checksum": "6b4aa310e865d19f1f749cfa9fdf6ae8" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "20200109", + "checksum": "bcafc1b3c83be7f6be31117765742ae9" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "20200109", + "checksum": "cb70cc9c1a5d20124044b48e11984910" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "20784183", + "checksum": "c8785735a0b6876f7668782895169472" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "20784183", + "checksum": "fb9730287128662f1a8139bc748bad47" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "20750305", + "checksum": "2f9678e77dca01bf57d86eb37db66337" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "20750305", + "checksum": "3a0352f04d5e577375a6296ca4758a0f" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "20765703", + "checksum": "df83cd379c598864a1cce433d55cf0fe" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "20765703", + "checksum": "6114af95f460e45caa5059546358a330" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "20978367", + "checksum": "c2298062070e24d8297d5ccf2cd9a056" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "20978367", + "checksum": "56d73bb473294274f1a4d7905355f6d4" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "20998584", + "checksum": "9deff9381e8214d0908a90d237ae323a" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "20998584", + "checksum": "bcadb2dce00c38a5332840c5d9d35809" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "20966972", + "checksum": "bf1cfdb25f1289790384b35c5a56fa6b" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "20966972", + "checksum": "1c2bcb713b00e277df59467a678744c1" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "20781550", + "checksum": "48e909ddd645d4381674bebf14a22154" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "20781550", + "checksum": "1575aceecbd6a846a0a19aee130cea07" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "88828178", + "checksum": "6cc73be3ac8e84d1e9799cbdbce3068d" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "88828178", + "checksum": "ae4c472080a76d343339004cb53cf50f" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "90721549", + "checksum": "a4e83f1561215aeccac3a2cb5aba7614" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "90721549", + "checksum": "ff6940d97d8f203b4870b8424e3520f6" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "88589715", + "checksum": "6f1c0c39541ac140726cd6c60a656602" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "88589715", + "checksum": "344332b331af39405d864fea7a00c2b3" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "89712349", + "checksum": "da5dc89878b10a24c1383a1e6b59cfdb" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "89712349", + "checksum": "1b150606470d816e2cbff3dd8fababda" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "87315279", + "checksum": "bf902dd628036f933850b96cc17195f6" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "87315279", + "checksum": "e07d2a48ffcd1f4d43ad781c5f3f8c41" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "87532904", + "checksum": "f7444a496a99140d6809eb49e3726730" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "87532904", + "checksum": "b385e9bbf866dc47d3c8200a4758333a" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "88633649", + "checksum": "2606b95a21946310b9b142bb2b1b6219" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "88633649", + "checksum": "9539848f89d44e7b5d01e0eae207aa33" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "87606671", + "checksum": "76c4544c7c28e8eff479d93767fe2dfa" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "87606671", + "checksum": "79eb683234076ed95278ce229b6d3fb7" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "21523194", + "checksum": "3c976cd84e5198e7397866888d229e1a" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "21523194", + "checksum": "1e5081dbd0221fb91fd6c200c5268c8b" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "21032177", + "checksum": "eba7af034e99efbc8d93a239f1c4a8df" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "21032177", + "checksum": "9b82b8aa2ceddf4d53b62c073b7d8be3" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "21463274", + "checksum": "0e66fc8ce3fe6065a43f4a118f8a1ffb" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "21463274", + "checksum": "e590a5fc05db6aa0f1e824f81d02c540" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "21506407", + "checksum": "4f02ff82aea5e788c7f89393a9aa8060" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "21506407", + "checksum": "772ea039d01774bd7556fe3305562161" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "21501651", + "checksum": "58d67943be6ab7d9566cccb8b50f673a" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "21501651", + "checksum": "221db8237e6e1d39fa5a7fedef0d118f" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "21057151", + "checksum": "640d221756aebd5548344dc6cc5a8cda" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "21057151", + "checksum": "8c6ff1969606148bc82e3d203a7bbbcb" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "21150409", + "checksum": "be1b4083c48397497824458049b67b48" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "21150409", + "checksum": "3a110b5ff24ebfd3ea9910f86c920c5c" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "20398644", + "checksum": "9bb32bdd88f6282e56fdea7aa4add1e5" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "20398644", + "checksum": "8f0653c2814cdf48954dfa82fe796ef9" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "22567166", + "checksum": "64ebb90d6986984150005e67abecb698" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "22567166", + "checksum": "4f332a6b8980456c1ed0fd4fb9fb1541" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "23042876", + "checksum": "67cfd5904f802a473fbe9db0173c8152" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "23042876", + "checksum": "2cfc30c22aef2249e8a1c590c89c50f6" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "22627676", + "checksum": "473ad5c3ffd2ab2280f95a1a81ea021b" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "22627676", + "checksum": "7077cb79b6ccb1f965ef52823718a561" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "22724720", + "checksum": "0f74ca0e3cabf660031d7f3d81b0bf02" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "22724720", + "checksum": "308e3e21081f58956cd30a1e4e73e0da" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "22721587", + "checksum": "060935421a27708f061020547535928f" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "22721587", + "checksum": "7a2e626a8ff9bbaab514dc3a67767353" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "22917094", + "checksum": "a6eb38c30551df3dc1da90de52350200" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "22917094", + "checksum": "8124d4bcd66f2c43e51b2e3333fabeb6" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "22930641", + "checksum": "626a5be57654071184d1d5d48d99940f" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "22930641", + "checksum": "e8d5538580eb0a77fa10351e87f1ee53" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "23086501", + "checksum": "74191206cda8b4a6783fc5617a729f03" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "23086501", + "checksum": "65fb03037882bc4e11d633c0a85ca77f" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "98751680", + "checksum": "1821712b79a999e054c199581b4a8dbd" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "98751680", + "checksum": "5d48af7c3b72578c383a2def9f8700c4" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "99817705", + "checksum": "f7985e5bc034872f100ac9021a7ceefa" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "99817705", + "checksum": "4de698684e435cf0812f200e49fa5c0f" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "97051032", + "checksum": "66381d57d1f30f3d9902868a939a39f7" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "97051032", + "checksum": "40a9c8a650eb9c7b109468d537cdcb74" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "96917401", + "checksum": "219ae5139e7a25bce26b6df7fba45d8a" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "96917401", + "checksum": "cbf7bb8d2766c60db0a9c08361a71250" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "93061183", + "checksum": "8e7a455718a3a4cf0508abe46fe7118a" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "93061183", + "checksum": "a5762d424e48874b9f8472e18f2cfe9f" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "93661052", + "checksum": "bd16a7d2d870274e806ae3f8bcb63974" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "93661052", + "checksum": "3724abc493421fd7f7a858cc3259b81a" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "95893495", + "checksum": "8a24c03437a28fff263268c76699b3bc" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "95893495", + "checksum": "0c5989623ffca18271479a7d2d038ba5" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "96049590", + "checksum": "d6e46ce07cdb376fea7c32cf1933b02e" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "96049590", + "checksum": "89b04afcca4d02722947512bd81f0c02" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "25436609", + "checksum": "88a6977eaa33bca66ebccae491f8f21f" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "25436609", + "checksum": "61d3bf265146a7fb7f0771fea35c98a8" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "24062615", + "checksum": "f93f6667671912e2b22f8473552dd0c3" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "24062615", + "checksum": "df229ed6f3ea1aeff6bfb16625f7e978" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "24116721", + "checksum": "38b20d680660f977d0db70276b3114cd" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "24116721", + "checksum": "8c2fd7d46aa7cfdd8c2e357e8e928fc4" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "24270367", + "checksum": "6ff4da91d77fdaee717acc4b28c942be" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "24270367", + "checksum": "966b2fe571dffa5efb82c34081276b4e" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "23903166", + "checksum": "b0f21180f21a008d973371d78e3a9bd4" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "23903166", + "checksum": "13fb680f1e83f7027db7cd0e40c7b49a" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "23199702", + "checksum": "de57b421f2cb0c97f5eaa2f28072fef5" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "23199702", + "checksum": "9f0cdf5c6b85545fd51acb9a5e56ed3b" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "23573313", + "checksum": "1338a899e483994a4e4ffed3a3f408d7" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "23573313", + "checksum": "a86f7819d754820c342aac172c3ca58b" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "23151154", + "checksum": "9773a659e52fb98d6e234874454fbdc5" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "23151154", + "checksum": "4e8ead577bb24029af025b1776fa43a3" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "19146677", + "checksum": "9f0786ccec12931865dcde62f3770a91" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "19146677", + "checksum": "08f9ba3db70a2430a1607b72ee611f96" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "20013136", + "checksum": "7e43d7cccd2d5b2b1abeb2208c524421" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "20013136", + "checksum": "23db951ad0bb36041d5c41d8e0e80b54" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "19613030", + "checksum": "00cd5d821907e069abbe7cc92aa13184" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "19613030", + "checksum": "84352613957d0869ce307c9be4e46439" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "19612914", + "checksum": "0901341a7f7574a79f462e8b1639ca01" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "19612914", + "checksum": "b73cab703b6cac18c271bbfe48c90d7d" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "19670813", + "checksum": "fdbd41c041a6b785099d824e6b162c64" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "19670813", + "checksum": "ccc81c0d1f14087d1832e23f10283cb1" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "19688709", + "checksum": "6d660ba21781e54b98f7ca813d393355" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "19688709", + "checksum": "2a5127e6361f71aff5bf9a5f006a8afa" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "19736806", + "checksum": "b6227f710f94e96f29a36ab41874e551" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "19736806", + "checksum": "6c727475e6dc94995105f81571712030" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "19501711", + "checksum": "f8dc9e09f7b431118127034792ad7b25" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "19501711", + "checksum": "15bd185549a8c6db3d653274a70b76e5" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "86060395", + "checksum": "06001f046fbffc74515ee19a2941b59a" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "86060395", + "checksum": "79c956b7ebd62602c9d47dec5e3c9b7b" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "87921796", + "checksum": "4308b83c411ce4978b5b0b3edacf67ea" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "87921796", + "checksum": "98923265d44770314c5b670d01c10122" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "84932098", + "checksum": "7b35e939753d0c756702dc323633571b" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "84932098", + "checksum": "670ca7eebd5cf41652690abaa0f9a934" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "86293350", + "checksum": "8f890d3218053481e195d1ade0669fdc" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "86293350", + "checksum": "6b4cda47e794c8c2d26b524da590c1cc" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "83343942", + "checksum": "399740a7286dc23ce3cbcf0705f5420b" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "83343942", + "checksum": "8fbbd04aa911cc23fb5b682a4ff00d58" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "84030160", + "checksum": "b09933b5f3841849dd9e640c378964eb" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "84030160", + "checksum": "4a7a25f417052f2e8a4c7582ce3264a3" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "84661519", + "checksum": "970c9b3d2b80299ebcb08d35a89eb862" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "84661519", + "checksum": "e86ffb692302432d820d1f2d600c7e2a" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "84689794", + "checksum": "3a42a3665e6660563ac9dbcbcaf17f82" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "84689794", + "checksum": "fcb1b45f67d874a44f4461ed9d4255a3" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "20614435", + "checksum": "76f2a3f9b66393bdaaf420ae902b7591" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "20614435", + "checksum": "a6c6ca099db731f01b2ffb62e7d11c7b" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "19668398", + "checksum": "c92261da7517f1f88fa5e3f616d8268f" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "19668398", + "checksum": "509884091d703558e453b4093f22ca53" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "20175033", + "checksum": "ea429fcce825d47f93e263a403e23da8" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "20175033", + "checksum": "c1228ed7d5c639906085db7c253bee35" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "20060510", + "checksum": "74cf129f6c83a18d2fd13f599ec737a2" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "20060510", + "checksum": "7ce875172237d0744eb418355bdba68f" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "20022835", + "checksum": "2af22575adaa5b4eb885c27787f66c49" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "20022835", + "checksum": "2197ad6c15e68851150545e33bc5d574" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "19567041", + "checksum": "67d044badddb023367ea26467b603e90" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "19567041", + "checksum": "6083761327b983a6ce7b17746ba8dd59" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "19339463", + "checksum": "58f32f2a4efa2d38539a62389279e8de" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "19339463", + "checksum": "dfcf82d13c2dbbe58bee81932a007c97" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "18422140", + "checksum": "a93833f0ba1e2dfe091a7e946ae0c42e" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "18422140", + "checksum": "170851d41945e80aa53d439c62f9cd8e" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "13290918", + "checksum": "62e360b5bc167f63ce5b1dabf7e1436b" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "13290918", + "checksum": "88548b3187318918ef1f5f53c9246962" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "13645141", + "checksum": "8433abf6a7455a389f72ba515a9874b8" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "13645141", + "checksum": "f563d82a4b8af1ed57bb718b2c8abd66" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "13425361", + "checksum": "5d5d6e62bcd2c7db1a541aeef8ad4ea7" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "13425361", + "checksum": "1d4744db2d32542400f073096ec22826" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "13466366", + "checksum": "e526581683265f15f4ccdb41490ac061" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "13466366", + "checksum": "350af4a13ba78381c11cc13e9a5bb31c" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "13480704", + "checksum": "ee4201bb5f10c1bf537e598b8f8efa88" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "13480704", + "checksum": "c30936df6f132fecd83319c3874c917e" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "13538608", + "checksum": "7d84085ea80b91bd481cb41b0359c564" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "13538608", + "checksum": "cb6681368f694ce4b7eadaf623d558fc" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "13554150", + "checksum": "b12f461550e65553c55b7b2c07accdff" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "13554150", + "checksum": "871a3c3ccf290fc5c607cbc8683ca8fe" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "13498586", + "checksum": "96c8fa86a5d0572911668b85930240e8" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "13498586", + "checksum": "be7cc05cd79efd66ab02a81888d47017" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "60885089", + "checksum": "c832637bf848434f63f4d6dce93e2559" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "60885089", + "checksum": "041095e25610bc7513404dddc93fb2bc" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "62022732", + "checksum": "3b2be01e57d40f9051f35c178d461614" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "62022732", + "checksum": "151f8934f051d8f666cec6e15c8eeda8" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "60094465", + "checksum": "4284bbb81ba71bf7b399471cbf098a9e" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "60094465", + "checksum": "991b5d319132062657d61008cba5c0eb" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "60176368", + "checksum": "23fbbfd629b9adb520f9f8c71dccd2ca" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "60176368", + "checksum": "2d41ceb6eaa0f1ad4fd628852d68f3b2" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "56928236", + "checksum": "c0a0e8a41ca1b2fd1feb9c199d7af3e1" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "56928236", + "checksum": "7a2abb021e806446a2673ab7ea149280" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "57353601", + "checksum": "d6e1d992f24f16f54a76255adfa07a1a" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "57353601", + "checksum": "60030e65f7d1f0e75bbaa644723697db" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "58782878", + "checksum": "348edb9abd49c3f7e7deced3c9a12f4f" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "58782878", + "checksum": "73d3e383728a1c817700ceceacf3eebf" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "58666615", + "checksum": "9aedcd058eb636f82e780e4685c9290d" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "58666615", + "checksum": "60597a1f488ccd62675a492432bd4ca5" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "14798927", + "checksum": "83b66a9e345ecb7ffa354f346c3be31e" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "14798927", + "checksum": "d6027d94d19422934cc16c55a686687f" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "14140030", + "checksum": "bcce805ccac74d9dd4d8a4f0374b18e5" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "14140030", + "checksum": "b2fc8867f93d448f74902ca58273fd90" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "14152979", + "checksum": "b4e6bd20501bdb7a870f4de4b7739d19" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "14152979", + "checksum": "5c942818b763096b6f53ce6194bd641c" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "14329307", + "checksum": "67f472e96dc437e2facb019e0a6c2ee9" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "14329307", + "checksum": "08501e65de5e55c9b6d79ebb8283149f" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "14022592", + "checksum": "3d5e4725344995e2d7d58dbaa9773ac7" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "14022592", + "checksum": "6bde454697534770f55dd5b589b6f8ca" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "13427724", + "checksum": "692bee063085abd245883ea6312fed69" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "13427724", + "checksum": "f7cdb0b9a08ac220b08faced43d90c18" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "13557711", + "checksum": "a96e509d31ef11e4e706f7e5f2cafef1" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "13557711", + "checksum": "6202e051be64de81fe2988a1abefb837" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "13123729", + "checksum": "ca67a77790f7156fe9f90edb660b2c0f" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "13123729", + "checksum": "5235315ff24bd98f62a67fd091a50da5" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "56892484", + "checksum": "beb682188fa8ff43003e243d791066c4" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "56892484", + "checksum": "5602a299613bd5eb0d5d0136931eb636" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "58742398", + "checksum": "fa7736e3f27052c24a4f305a5c9f59d8" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "58742398", + "checksum": "dd35697ec80553299a7b8a3eaa335a31" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "58118171", + "checksum": "ce691ccf0b3c95d51dda1e0a568df725" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "58118171", + "checksum": "67689a397a17de2fac17038aea9fb78f" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "58101457", + "checksum": "7492a599dee1f3a545d4e046275d4942" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "58101457", + "checksum": "55bd2ac1a695f85d252a0e70527e7eb2" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "58374340", + "checksum": "cd5ef610af9e13cd8c5b0ff27c9b6e5c" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "58374340", + "checksum": "7f64c903c9c6668d321f29f217c4b448" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "58335627", + "checksum": "0f0522e11e2d8c3836d595651ea1ca3c" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "58335627", + "checksum": "9a519d51dfd014322e87021887f7d961" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "58395974", + "checksum": "3c429bb3a480418bb565d3482102801b" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "58395974", + "checksum": "abd6a98b214a918d6beeba68c128f55a" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "57590495", + "checksum": "8e97f3fb67c3c7f598c28d17a833d7d9" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "57590495", + "checksum": "97edee068de3858cac295e8be2df93f2" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "61437509", + "checksum": "2c5367bdf539fdda6289057e321c9436" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "61437509", + "checksum": "171e8d7a87d27c1dfd20d9b2711f3bf6" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "59251200", + "checksum": "f4c83b9b2268ae7b5c6c30509cc48d82" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "59251200", + "checksum": "088a364f6284e7542b15b5c4c7476495" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "60558509", + "checksum": "3fb707732c1d83461effbb983240f2ed" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "60558509", + "checksum": "9dcb0d2f4c3d2e74a02742f6e699e47d" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "60359412", + "checksum": "7c62ab72c10ff9423610820f7ccedf9c" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "60359412", + "checksum": "0c685eeab21b56cc69e68446e3bed323" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "60364045", + "checksum": "eb2ebeb06567c7f1d65e5d15504582e0" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "60364045", + "checksum": "b150ba24074ea9a1cb1bf99f6e925bac" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "58773316", + "checksum": "e54e9cc8a66447741059c2294e03fae1" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "58773316", + "checksum": "18da7c15fc3ce9eb01a5f640390d3c63" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "58392931", + "checksum": "93db6b9f8db5171e11853482a6056129" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "58392931", + "checksum": "bc1da9b5bbea2a118a677409fe1cdfec" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "55913454", + "checksum": "98dad431840339ac8a0ec343663977ce" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "55913454", + "checksum": "b72e7969b93ab713607fc1e70fabe675" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "44136110", + "checksum": "e5741a4173e95fcf10cdb31cb21bb158" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "44136110", + "checksum": "98a1e8f13d633ea565b1be725175141d" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "45762993", + "checksum": "e202e2a23250512ebfaa115096a3792f" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "45762993", + "checksum": "863e56bac23a51dd61e0b1a18994e8e6" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "45336786", + "checksum": "31e661f3ab820b4599898ae1090d743b" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "45336786", + "checksum": "836173a5a0dc34791c0a929d4488684e" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "45257140", + "checksum": "48a134ef5a8db133c83d8825c8e87995" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "45257140", + "checksum": "aa4de70f6a2c1c5eb98289604539a37c" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "45368576", + "checksum": "f4a4717c707b00a6001cee04db240b6c" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "45368576", + "checksum": "3a5d812855b99f24ffba4834ad5a5ddc" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "45421486", + "checksum": "9cf9938895497e0cec5b7e90f7a24f53" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "45421486", + "checksum": "26b5f72676121ac7923faf277b5b4d36" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "45503125", + "checksum": "7eda21cf892b61ba701268b684c28172" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "45503125", + "checksum": "7bc90c71f6c856b7142fe6da7b765118" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "44981958", + "checksum": "be3eedbd93b359a5f85726f4e87467a4" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "44981958", + "checksum": "7382e4ac0bd76d724903698a0545b8a2" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "47119352", + "checksum": "d44c0157cd7bca5f2a315a4c8857eaa7" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "47119352", + "checksum": "5510218fbe89bfaa0bade063203921fc" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "45601400", + "checksum": "1f31211442dcd4c317fb037be71087b9" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "45601400", + "checksum": "4c2f0216e5eef8be32ac51336495f1f3" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "46626048", + "checksum": "d4fa9abccefb4055117dea94e44fd97c" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "46626048", + "checksum": "c742ae4fc0040041fac70655b848597f" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "46555984", + "checksum": "e190c40d22061156839bd983e4ab6528" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "46555984", + "checksum": "501d7a289149eeba752c6250365991e6" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "46636014", + "checksum": "adec7e2dcf67d79707567533a32e328c" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "46636014", + "checksum": "da458feded2857712d7fb567ae5e8a71" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "45595795", + "checksum": "c246ad7ba798e2cb5bd584c353198c6a" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "45595795", + "checksum": "34eb205f677a832cfc186db3803213f9" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "45566656", + "checksum": "9fb804f997708df14e8caf2c0a0bc9f3" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "45566656", + "checksum": "5719a97eaa97e872d9c07eb5607970fc" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "43894764", + "checksum": "d445a4948dc02e4873b0544364cd81e5" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "43894764", + "checksum": "9a2b77ee0f7e3ba15be6c39da5194f04" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "63675023", + "checksum": "273283ffabda81079e546106631e190c" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "63675023", + "checksum": "c90214fbca53b04545df48661278918c" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "66413037", + "checksum": "939fd25f8d4d068db56331d17f9392c5" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "66413037", + "checksum": "adac5103d88c6ecf8cf562399496e0c6" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "66565006", + "checksum": "c1b3981726cbc4c77c06a378615b6a0b" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "66565006", + "checksum": "156942763432418fcb3044394752acba" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "66583959", + "checksum": "3e502917c2d39b57c1c9b3f154e64e17" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "66583959", + "checksum": "09fa468f7a3c167999519ab3a4fbed98" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "67692216", + "checksum": "e6dd4ed148a96699b905b4c30bb399c7" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "67692216", + "checksum": "ebabfee92a729e0ce601d0ce593697dd" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "67703420", + "checksum": "c5bd144830e2bd0937de1f7e1f331061" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "67703420", + "checksum": "3ef42a77d26c5d0e32073d7807520d57" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "68314624", + "checksum": "335bf5e34ab2b5d7a2d6c9a8fc393c68" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "68314624", + "checksum": "7a52e087972ff8890c785b173ce21e2a" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "67512075", + "checksum": "02adbda2d52b45235e34f4557b88ed97" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "67512075", + "checksum": "7dfd4211a44454a4c5a03268852714ae" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "69538810", + "checksum": "0f11158a13273f7835148d1991a9806e" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "69538810", + "checksum": "d0e11f670aad3657a3e054773482218b" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "67485402", + "checksum": "97af58dc18c829042fcdfe7ee73f8367" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "67485402", + "checksum": "0fe1a27ba53b044903e59e68dd578455" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "69485984", + "checksum": "89ce5e0beb1aacce5efc6621fbbabba7" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "69485984", + "checksum": "0a7889130ce9b68f61d7edd4e996a92d" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "68634268", + "checksum": "d88b48cd9587433590261abdb48a5649" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "68634268", + "checksum": "10bd25abb7eacc0d770ecffacc804d6a" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "69304475", + "checksum": "d8562974bdbc441c0da67c73d3b1263b" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "69304475", + "checksum": "7a66af94677dc47618a622d53bff1650" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "67134389", + "checksum": "11ed0036b1a6f51f6b294839f168ac46" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "67134389", + "checksum": "44b0ef9deda55a645acfc4dfe5d40923" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "65929389", + "checksum": "f219d0592b749dd6e8da1d817edc90e7" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "65929389", + "checksum": "d5d421afbc3b8fc11d664eb023188d77" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "62691019", + "checksum": "35c26689e740e9be78c9621314bf3a31" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "62691019", + "checksum": "c406a467b1c2a2e23ba90b6514f8b4b1" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "81128163", + "checksum": "66e85f3061bdcb136783f60a39a911f0" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "81128163", + "checksum": "9ca61a4f2a1fa2eb418185f93cf623df" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "83966100", + "checksum": "5e75ad390e34d02c250c14895ab45820" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "83966100", + "checksum": "4d989a19d6ed538c34648d7cce001f63" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "82471989", + "checksum": "4fdf725dbaa9a04191d57d1e3769fdc7" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "82471989", + "checksum": "bb236b82194f3c184affc4804383d1a8" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "82782204", + "checksum": "871b71d5e3e79c7a2f1e8f4ee31795ed" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "82782204", + "checksum": "ef4898e553c5eb8efc559932b7554cf9" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "82743136", + "checksum": "a307be8ce94e1a49297403ba4f64fce4" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "82743136", + "checksum": "592f296400fa1623f7bcae7b0977b803" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "82720316", + "checksum": "c2995fc766f79cd9144534fe1f44a43b" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "82720316", + "checksum": "96aa003f1a0455b8a6e3736c120f0c20" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "83497474", + "checksum": "317e0593d5b98436ae6a1d81730fdae2" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "83497474", + "checksum": "889396f7c823db83e32a6eb4e33171a9" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "82642710", + "checksum": "6152988e328b873361f2ccba6f22587a" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "82642710", + "checksum": "03f92fba1e24c842c2276e74f8f114e7" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "87818815", + "checksum": "7d5ccf8c634c46f247e2bb4698d9afd9" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "87818815", + "checksum": "f972ecf294a381e4c19d7fcb164cb6ab" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "83802962", + "checksum": "2e9e62b10935659bbc6c861a1784b1a9" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "83802962", + "checksum": "f6c1b6f2b2524eb80affac7f86ec7bfe" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "85179582", + "checksum": "efcadb31c6b40c43ced4b993a07080e7" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "85179582", + "checksum": "688ad77ddabf8eed2262c86522185103" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "84631699", + "checksum": "b5f184555bf208d25952a3e2cb2f5d44" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "84631699", + "checksum": "fe53b691bed0e628626505accd191d2a" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "84366454", + "checksum": "5fcd53489fd60947a19ce5e82a9eebc5" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "84366454", + "checksum": "16ada9f83c54c565abd3a51cada2293d" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "81619323", + "checksum": "7b8b450888d74728a6d9fb4ba53a55b0" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "81619323", + "checksum": "29e2c5988883c073cdc49f7794f3e9a1" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "81032107", + "checksum": "415c621e8832a49f40192f8b6556b7c3" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "81032107", + "checksum": "5030a927f872fd9cdf7f2a4e1c32bcf5" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "78320487", + "checksum": "d718b6e34656e74fda26252fe25510f2" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "78320487", + "checksum": "7810999a1b94c0cd2926215ebf290f0f" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "63541553", + "checksum": "d154d237bd2856b58794998755dc2df8" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "63541553", + "checksum": "c8346b2dc7d874909ea25be2deadc5d3" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "64495795", + "checksum": "964edf27beaa4fe5a94026298f32b893" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "64495795", + "checksum": "3a66da0b606decd8f64f76072fab0876" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "63910598", + "checksum": "aef773aad2a0c4b3a90fc7e92ed06675" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "63910598", + "checksum": "42c73d470301ec3338643871eee00037" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "64024900", + "checksum": "7cd6a3468ac15c08d24e473e794b06d9" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "64024900", + "checksum": "d858a1db87367e3332e93bb8f1699fa3" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "64762626", + "checksum": "a1bd734332d48b8ffeabdeed2fa1de91" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "64762626", + "checksum": "b5079949b5b064f5331c56e9765b5bbf" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "64801719", + "checksum": "6d782f7c47334fb634f032061f4ba60a" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "64801719", + "checksum": "1bd666f0d9e39aa3e842de272dfe9f56" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "64640182", + "checksum": "ca1c75c7f6bab9459c412d4f243819df" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "64640182", + "checksum": "7669d508db3abad35d5a49c0e1b97e83" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "64380733", + "checksum": "58c9ce8fc755b067b2bb280f0840e05a" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "64380733", + "checksum": "5645bac3641d2d39c9dcba5b7e7485cb" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "69013133", + "checksum": "0900ca65c583ff63d865667ec5471b00" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "69013133", + "checksum": "c115b616eb94fc00e1cc68e15283daad" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "66074971", + "checksum": "a4cfbedff87a6a15f273d304f2a89e9d" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "66074971", + "checksum": "b80aed2940e722f8be4a32e7aa86d8af" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "66669828", + "checksum": "a110eb20fced4cd71ff7a5ebd83898f1" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "66669828", + "checksum": "45d2d46e8aaac6b74f3f438ce77ced74" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "67641145", + "checksum": "537793cf2e05e07019c8e995471e0fc7" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "67641145", + "checksum": "286081466ec47d15f4dd46363c41be3b" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "66488822", + "checksum": "436e574014a0523964f0009ecce0166d" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "66488822", + "checksum": "d057bf014dc667fd050de8c02dd4bc22" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "64781109", + "checksum": "db96839979f00231e974c5d18515bb76" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "64781109", + "checksum": "400724b85575b68c2481f3e007bb8854" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "65717399", + "checksum": "17286da9d19270b227ea52d65d936854" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "65717399", + "checksum": "48bde4c75064d96bf7d3b39e31bd19cd" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "63683654", + "checksum": "40ff0856a3d425246bf19f849e831e1d" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "63683654", + "checksum": "6847a7b3d7f22c1a5195d5b7cc8deb31" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "75469909", + "checksum": "7a0e9c053b728e656a88914dde4a214e" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "75469909", + "checksum": "b2eb103c6180579a543833ae6229fbb8" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "77292906", + "checksum": "52227cf42f49677449fdcb9f6f15aa01" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "77292906", + "checksum": "d53019338fc6d90679f056d530c552e0" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "77143544", + "checksum": "3f2e430489d373549852eb3a7e580ade" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "77143544", + "checksum": "fd2fdcf51294a9d955bb1da62a5cc226" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "77147935", + "checksum": "a70d5a5cebcd1ec7c228a88777c8ba17" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "77147935", + "checksum": "00d5262e1969ce7f41f70d75ed8d500b" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "77330239", + "checksum": "458d5fcf478005fe965566f67d271fcf" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "77330239", + "checksum": "d371480821e8ecd90aba4d8cabb157ea" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "77461827", + "checksum": "20c2a69e7ddd9dd79afd26bd8656307b" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "77461827", + "checksum": "95fd6101778b6683332c90dfb7ed0799" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "77697305", + "checksum": "18e8a63f0834fae6656f6637e7b7c841" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "77697305", + "checksum": "60a5af29da78d8eabd5ee91c3fa7b204" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "77037178", + "checksum": "6d881d39c6d5c41ba668a65d1f5cab72" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "77037178", + "checksum": "f2c163f33214058aba1dc64228d8944b" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "81053872", + "checksum": "dbcf4d9917d0489d24b190364d81bd41" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "81053872", + "checksum": "3c80a769be7bdde69a58200c2a17d8f6" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "78744617", + "checksum": "e09237db7cbc2e1b93d277acef51d586" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "78744617", + "checksum": "ea9578896c6001d349902202e818d492" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "79780069", + "checksum": "a1405fe577abffce76ff1256e521ccd4" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "79780069", + "checksum": "d3640666d1fd6455699b0b0364e3592a" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "79824907", + "checksum": "b5e2c897532d79bce20e2da48e824f48" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "79824907", + "checksum": "61017cb74447b4f7da4790f52e01c1f1" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "79245497", + "checksum": "aed0e02585cc255231f24a237d878a47" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "79245497", + "checksum": "3a9225fd1ca643ce9b96f18f1bd93c6b" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "77487492", + "checksum": "cfe5b014173d8ccc957119f60a390f5b" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "77487492", + "checksum": "a3ac8048c7360edf810cc02b2731648b" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "77539533", + "checksum": "5f01de49fe61fbd7fe6240153573895a" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "77539533", + "checksum": "a70a9aeb8d6a8dd3d22cf64e02206eea" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "75117619", + "checksum": "c4b08f68d8f911ef8517ccff29347a8b" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "75117619", + "checksum": "aca6cd216a10a671d71026bc09a78754" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "59733199", + "checksum": "455a033b66a3f6787b2a2d2a79a1312c" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "59733199", + "checksum": "11d9274bc59e0e80a2571860d8a0722a" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "62326109", + "checksum": "593181bc93cefdc620c5e8f176a94015" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "62326109", + "checksum": "9f3a074c13c7ea28137ce27d7e00a33e" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "61911621", + "checksum": "42f416b20c21cf4d276cd0e09f2d8336" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "61911621", + "checksum": "5834523b93aade61d68a66c78c443cc6" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "61849204", + "checksum": "1086b6cebfa79a7a9dd6b0fee8a459e1" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "61849204", + "checksum": "938ab78cf45c2519b2c5c9afc41b902d" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "62088632", + "checksum": "c938cd8199553b83adc958f1fcd52c50" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "62088632", + "checksum": "c55682b56997c3803488986bd738f2df" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "62111179", + "checksum": "a2c4c107405afc000e55b82bf3cc6964" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "62111179", + "checksum": "78c2077a14287d6105742a4df73b2905" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "62261389", + "checksum": "65e087d539b6a28f877726f409c845c1" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "62261389", + "checksum": "c8e787a0d88259744b30bf1728048370" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "61311013", + "checksum": "dcc5380c8a0e30b68c60e755865fce63" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "61311013", + "checksum": "0876bea80ac4217338b09b3c0ae0c563" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "63162352", + "checksum": "ef72de1647115c1ef7592149bc554b7e" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "63162352", + "checksum": "0d16c8febbe721bafe281cc0ed731757" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "61394108", + "checksum": "cdf41171d3257997e0c484cd48c040e8" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "61394108", + "checksum": "1169adcc2f988b5a1e02b9c67eddacf0" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "62988601", + "checksum": "2db24df09cca10c378a9eb6cc761b26b" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "62988601", + "checksum": "696c69305baa591a3dffadc0d2af4f0e" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "62767081", + "checksum": "ea79fc42f3ba3c52c599238a8763da84" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "62767081", + "checksum": "caf17ec199e4236978e2a065b72cbd11" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "62877906", + "checksum": "102bdbd79a688e2c45724d69c2c65abe" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "62877906", + "checksum": "83ea036e8f40fbe9a6faf8b93839141c" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "61831006", + "checksum": "400c5908642d3948ef8937b58af0db27" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "61831006", + "checksum": "8effffc37a4a43daaa370c50a5954575" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "61260206", + "checksum": "574e690e32ac224d1a5dda89af422f1a" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "61260206", + "checksum": "240f784518634c52187023970c019ef9" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "58648128", + "checksum": "27ce045b63d100008d81857ef5ea257e" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "58648128", + "checksum": "9774a38bd238b738d7736d29733ed2dc" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "69420704", + "checksum": "e980dabb2e0fabeb9224db5a97fbc926" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "69420704", + "checksum": "c7953a2b0e9cece77d0913876036f5a7" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "72073449", + "checksum": "94e733386786835d232892bd573edf96" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "72073449", + "checksum": "58e539b7e169f17bd104e51fee5c36e2" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "70979632", + "checksum": "25796f06afcc0cb9640180992992198a" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "70979632", + "checksum": "b7dcad810e22ba7a2f35d8a59f147ee6" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "70891415", + "checksum": "b6462b5b316488d8e697f914393aa832" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "70891415", + "checksum": "87480f33f5e686f05cf91778ae7f3707" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "71189864", + "checksum": "dbdff0777901739a282adeb625973152" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "71189864", + "checksum": "210d94d0fbd618e63602a5ccbed2c370" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "71287222", + "checksum": "a36aaea48c945de7c4cd1c9f9ae3f0c9" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "71287222", + "checksum": "c013788aab92491dc0403cdb53ee9e4d" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "71407857", + "checksum": "39854786f13342f5fc5b411c64bdc249" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "71407857", + "checksum": "268b720613334235edb0ac7198627947" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "70669204", + "checksum": "3dea41432bd852c4c6f2a19cdb28d662" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "70669204", + "checksum": "beb98b28961301d4656ab9a7ed261a07" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "75391545", + "checksum": "bdbafdf5cce42725eabd5e7bebea9ce0" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "75391545", + "checksum": "341355ccdd8865ab8b0b4898abd133d5" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "72075239", + "checksum": "5dee732dbf889131bf6570dd88404bc5" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "72075239", + "checksum": "73532ec9f6cca52680b68357b05705c1" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "73802781", + "checksum": "21e6f2f37f02227cffa9d5f70b72a5bc" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "73802781", + "checksum": "8b3cc1b06b4150c6b7bd124c2d1eb042" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "73547764", + "checksum": "6cf21867849134ab9f608e952ccf45e1" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "73547764", + "checksum": "60f83433e2b64cceee792ec6aca70bf6" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "73320127", + "checksum": "c8b5244b56baa8bfa71a7260ee37ecb3" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "73320127", + "checksum": "77882c80b5a15d126a762bdc3d6dedb2" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "71332232", + "checksum": "f8e2e572ccfb05c482bbbd5a11756deb" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "71332232", + "checksum": "0fa3155be3d4a549fdcbf679bf5d3cc0" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "70706730", + "checksum": "76b2d2262bc9379f9c21151879e32d88" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "70706730", + "checksum": "f2bb343eea5f17658236ec01104ca3e0" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "67887386", + "checksum": "314534383b495763ca15fea2bfcedf8d" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "67887386", + "checksum": "320ad91e9787628e00192a3b1c3f5aa8" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "47435435", + "checksum": "38d394a1cf2e4a62ed7897a3bbcc181e" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "47435435", + "checksum": "87b88cd636d4800f8a868c830c1b76e5" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "48686322", + "checksum": "1d0d02444a1d353affd6615629d0ccaa" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "48686322", + "checksum": "07a9114318e701e0aa233ffd8aef8d65" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "49597945", + "checksum": "ea0f937123ff7cf68c58020660d88403" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "49597945", + "checksum": "b3493c725d693a12a6552aabe842bae8" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "49567097", + "checksum": "9aac629171539d7c0fe78c0e7b95cbc0" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "49567097", + "checksum": "0cc22be12f7c16d7d20b66ea6bf87d1a" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "50073624", + "checksum": "63d8a1da26f7ac58e9e8aa2ebd6334f0" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "50073624", + "checksum": "ab79557ba9bd5fb6c28bd391d13a07b1" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "50241211", + "checksum": "c3682f94aabc8bdcb6146fa885a1da9b" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "50241211", + "checksum": "9b88842751e1501bee94aec190494684" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "50356935", + "checksum": "b1d41917fbc77e748d7faa3297d8f11d" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "50356935", + "checksum": "0e7a3ccede277e7ae15bdbc999199492" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "49820044", + "checksum": "d2fa4017e155754c6c98d67df5758909" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "49820044", + "checksum": "268906d8d87d1f24e5d8437c1fb2edf8" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "50474297", + "checksum": "38293d94b60fe155739806501b95d055" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "50474297", + "checksum": "573412c425764a77ac49e1c2bb9b5581" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "50267564", + "checksum": "d3ab6fddaf1ed693e6096112ae6f8a9b" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "50267564", + "checksum": "62bfeb1594325e85fe84b2c42dc9b3a7" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "50992546", + "checksum": "20af2f1283e465ce344b3e8e2c05ee13" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "50992546", + "checksum": "1cc7f44430c400d6177f99188b74154a" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "51018839", + "checksum": "c4e299f5af1f20ddcc73ea646d7c18e6" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "51018839", + "checksum": "8ab61e6a0ba681dd4172e21dfbcfdaee" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "50651536", + "checksum": "ef869a33c38f775ca66cffcf76c03de3" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "50651536", + "checksum": "0681db09d8272e0a75401bdc55e2092a" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "49500563", + "checksum": "bea8fa4cc072ec50aafde6a15de7d855" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "49500563", + "checksum": "5e88ad019ba20bad0990285fb7743541" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "49377781", + "checksum": "f0d17632b048735a0b67d6802014c403" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "49377781", + "checksum": "b62f1451ea9f1604a857bbfce2021d50" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "47587495", + "checksum": "8031fef976245da8fe44a90c54578e89" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "47587495", + "checksum": "1727dc21a7c5ab5d48521ee2bb22cb25" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "74767522", + "checksum": "9708985f70f522745e5a31fe775d165a" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "74767522", + "checksum": "f0fa3b4bab782c8bc601fe8fc663f1ca" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "75530604", + "checksum": "108392440fcacf263927781601089c97" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "75530604", + "checksum": "f6141789bdce915da645e7f1442db1d8" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "75164131", + "checksum": "be63efd22228366c349807accd1d0ea5" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "75164131", + "checksum": "fd1ed7310b6493ff56ca93a5a2ef83ce" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "75589951", + "checksum": "640172b3ad31775b46e65f196ae43d32" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "75589951", + "checksum": "16173178a3a39809303f0cc5387095ec" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "76095190", + "checksum": "68adb720291f1f17c6a595e2ee4b66ff" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "76095190", + "checksum": "e0ff634fe3c67b790e823b595fa480d4" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "76523851", + "checksum": "d331dfff8150a73843fab76408a72339" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "76523851", + "checksum": "be98131dcb7bcc3ca62c3e49ef70b8f5" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "76316515", + "checksum": "145363b314407488e69f7724bec54202" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "76316515", + "checksum": "8b55cc79a2797425cce0db11f053f1c2" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "76285890", + "checksum": "32578122f9003337a7b0be3597b75584" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "76285890", + "checksum": "62566d531b005452f5b265c4a0f3aa43" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "82249865", + "checksum": "e6d0059b845866c63002646d57b2f1a6" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "82249865", + "checksum": "c3729362f5a7c812c2e4297b2b615757" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "79833316", + "checksum": "0eb1e0c4c39d88442757aba1c3e05755" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "79833316", + "checksum": "ccf25703ffd134a2cfd109e0a70ab25b" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "79960691", + "checksum": "1fda1a2008e33eeba6343f75846bbdf2" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "79960691", + "checksum": "4e80540250daa10af91155e3d041f102" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "80832988", + "checksum": "c9f1786de7f07bc9f22281a77f6fb901" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "80832988", + "checksum": "76ac4009ad953cbdd9b54eccbe0be7b0" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "79206119", + "checksum": "8e823805f00bc6fae244570617c607a0" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "79206119", + "checksum": "6e1e7dbadf8009be0e674187e0a645bb" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "76505041", + "checksum": "2cb8d4bc517623a5434f21093a66b111" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "76505041", + "checksum": "2bad9353c2be8c07d4e649f89e13ff02" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "77872125", + "checksum": "0915327301fa12bf89546e670e680af0" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "77872125", + "checksum": "34cd095d75e15811414dde4668d9b82d" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "76127084", + "checksum": "3a52b91834a0d0be9476e44d07c9b3a9" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "76127084", + "checksum": "0688b90e003a29c78668936c3ebedd8f" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "71695595", + "checksum": "9aa0935b895fc8c2c535699860ba479d" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "71695595", + "checksum": "e8b4e58bd8d6aa42964db231fe3c432f" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "74661058", + "checksum": "6f035118aed0f795e9819e241b802b25" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "74661058", + "checksum": "6e91568151f7d0176c17152b3f091c2e" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "73442318", + "checksum": "b15799ff82de001b9b738604a925885a" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "73442318", + "checksum": "b2c24410a86cec0693232e80c155a57a" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "73406894", + "checksum": "e5975383a5ca009ed0362a72d4bd2bb6" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "73406894", + "checksum": "2153eb30781cc7e67d0afa308e36d5e8" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "73703110", + "checksum": "b37e7e2d3026a39e1e23d41687fbe238" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "73703110", + "checksum": "1df52f427641ffe23a7cb2606aa8619c" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "73746485", + "checksum": "3aae44668ea8231b76a1cafab35f263d" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "73746485", + "checksum": "08272e750478eeaba98d04a4e7238919" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "73869210", + "checksum": "109427e3d7930b10246c474c203f2957" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "73869210", + "checksum": "443f2b60aafb7058ab035715eb1fe8f4" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "72879699", + "checksum": "0b9ecaa440c77123b19236bdf288ccee" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "72879699", + "checksum": "58192948782ed85b2316d4237dc75136" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "77361997", + "checksum": "eec215648709ad42b2756fa65daf2c22" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "77361997", + "checksum": "17f95532e28a6f0b28c6f680ff940023" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "74315217", + "checksum": "2a365ac663a282c8a00ed098a8228f8e" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "74315217", + "checksum": "4eec2af2989f3298ce254c53b97ca921" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "76196412", + "checksum": "65d90edc29de27554daa755d85d17039" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "76196412", + "checksum": "221433505eb250459edcce7943dc3e32" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "75886227", + "checksum": "06c59d3c6fa264b8ce7fcb160a987355" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "75886227", + "checksum": "6b0458fc6502fdcb3134a75dfbccad83" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "75792754", + "checksum": "be794f328ce9435aacd2d8e6ea8475c3" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "75792754", + "checksum": "c5cb6dd071718e77e9dc38236b8416ff" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "74010151", + "checksum": "264e2f38f8a6e692b02475a681fd3ab1" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "74010151", + "checksum": "8c54cd81b3f174e9d9626a9628c7d08f" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "73217482", + "checksum": "ecafb94aa39d8cf77e550d7ff5411b43" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "73217482", + "checksum": "46a59b289eb30ea945b17ed56d0cd141" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "69877855", + "checksum": "e99142e529632e237097f9f6f2a5c2a1" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "69877855", + "checksum": "4799593dfa28fa8073cf87838d56c45f" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "57300517", + "checksum": "805be7783530cebd9fa689ac096adabb" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "57300517", + "checksum": "f6e88dfd10335e5f6bc31947d696588a" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "58710397", + "checksum": "97074c205296b9694da66f00124dc84d" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "58710397", + "checksum": "8256eb608572a61d5672ed894eb819cb" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "58662798", + "checksum": "f90f4cfaf30e8fb4ba979e98b8656300" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "58662798", + "checksum": "db9084ffd7989f5be63145881db62d7b" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "58695117", + "checksum": "0e81fb3c092f5d72b948ca51ff149840" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "58695117", + "checksum": "e63215cc0060e58302b2aafa04375e27" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "58770951", + "checksum": "ff33a6a41766a81555fc2b176d400db0" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "58770951", + "checksum": "e987048d9159f0f7795585f4152f6ddc" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "58978669", + "checksum": "fcc3235a3bf2959dc66ade31a1496ab3" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "58978669", + "checksum": "2560887c326931ecff67f9740b310799" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "58872350", + "checksum": "ac5956af9f30cafa2062434c2eb2659b" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "58872350", + "checksum": "10e88d1de78f53db9f0db0b87d81ace3" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "58226385", + "checksum": "18f2c8a62c3dbbbae1f5ce0678c0ab8e" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "58226385", + "checksum": "4eb888db17c81d8695fe67c981923f6e" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "61696794", + "checksum": "10ef827e8300e585eebece65dcc86eb8" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "61696794", + "checksum": "3bbfd4448c2358868fd36e301822de78" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "60222610", + "checksum": "aaf6eff10579e470bfb0280cd80d1a68" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "60222610", + "checksum": "e2c0e4d1e6acc1cb9c8c83f33fdb03aa" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "60817107", + "checksum": "a081da8d35107fb62f2c9956ba7fdace" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "60817107", + "checksum": "1c3e39dec73a970eb749e19da44ed54b" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "61204972", + "checksum": "f081d640a79f84ab665e137711f79399" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "61204972", + "checksum": "aceee1bfd3e9fe9857ab89d4d3da55f8" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "60426941", + "checksum": "75e87f2d85850f8be2e80813cdd05e62" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "60426941", + "checksum": "7b0ead783ecb14c26a550dc4a05b93c1" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "58940430", + "checksum": "83ee9d36b43b92ca2b566f504fe6cb96" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "58940430", + "checksum": "d1154ac8537ce41b44856d03ea1979ef" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "59239680", + "checksum": "887da5574a3612c0b04ba163d12881f4" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "59239680", + "checksum": "76989d4a318530d685146db08cd3685e" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "57535803", + "checksum": "428598924ec6a4a927198ffbff19e92f" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "57535803", + "checksum": "4476c4496e0e1a0301e3d820a43aad63" + } + ] +} diff --git a/test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117_more_unaligned_reads.result.json+ b/test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117_more_unaligned_reads.result.json+ new file mode 100644 index 000000000..b00b0c2e4 --- /dev/null +++ b/test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117_more_unaligned_reads.result.json+ @@ -0,0 +1,6573 @@ +{ + "Software": [ + { + "submitted_id": "UW-GCC_SOFTWARE_FIBERTOOLS-RS", + "category": [ + "Base Modification Caller" + ], + "name": "fibertools-rs", + "version": "0.3.1", + "source_url": "https://github.com/fiberseq/fibertools-rs", + "description": "fibertools-rs adds m6A modifications to each PacBio molecule." + }, + { + "submitted_id": "UW-GCC_SOFTWARE_REVIO_ICS", + "category": [ + "Basecaller, consensus caller, base modification caller" + ], + "name": "Revio Instrument Control Software", + "version": "12.0.0.183503", + "source_url": "https://www.pacb.com/support/software-downloads/", + "description": "Revio software controls the instrument and the primary and post-primary analyses (basecalling, consensus calling, CpG methylation)" + } + ], + "CellLine": [ + { + "submitted_id": "UW-GCC_CELL-LINE_COLO-829BL", + "category": "Immortalized", + "name": "COLO 829BL", + "source": "ATCC", + "description": "COLO 829BL lymphoblastoid cells", + "url": "https://www.atcc.org/products/crl-1980" + }, + { + "submitted_id": "UW-GCC_CELL-LINE_COLO-829T", + "category": "Immortalized", + "name": "COLO 829", + "source": "ATCC", + "description": "COLO 829 tumor cells", + "url": "https://www.atcc.org/products/crl-1974" + } + ], + "CellSample": [ + { + "submitted_id": "UW-GCC_SAMPLE_COLO-829BL_1", + "passage_number": "NA", + "description": "Immortaliized lymphoblastoid cell line", + "growth_medium": "RPMI-1640 with 15% FBS", + "culture_duration": "17 days", + "culture_start_date": "2023-06-29", + "culture_harvest_date": "2023-07-16", + "lot_number": "ATCC-70022927\nSCRI-07162023", + "Cell density and volume": "3 million cells/mL\n2 mL/vial", + "doubling_time": "24 hours", + "karyotype": "92,XXYY[4]/46,XY[20]", + "biosources": "UW-GCC_CELL-LINE_COLO-829BL", + "protocol": "Thaw in recovery media: 1:1 RPMI:FBS 24 hours then split into RPMI-1640 15% FBS.\nCulture in media depth of .2ml/cm2 splitting by dilution until volume reaches 100 mL.\nTransfer to erlenmeyer style 500 mL shaker flask with 200 mL volume shaking at 90 rpm.\nFreeze in RPMI-1640 15% FBS with final volume 10% DMSO." + }, + { + "submitted_id": "UW-GCC_SAMPLE_COLO-829T_1", + "passage_number": "5", + "description": "Adherent melanoma derived cell line", + "growth_medium": "RPMI-1640 with 10% FBS", + "culture_duration": "39 days", + "culture_start_date": "2023-06-29", + "culture_harvest_date": "2023-08-07", + "lot_number": "ATCC-70024393\nSCRI-08072023", + "Cell density and volume": "3 million cells/mL\n2 mL/vial", + "doubling_time": "~3-4 days", + "karyotype": "Not performed", + "biosources": "UW-GCC_CELL-LINE_COLO-829T", + "protocol": "Culture in RPMI-1640 10% FBS. Split by rinsing with PBS and trypsininzing with 0.05% trypsin-EDTA.\nFreeze in RPMI-1640 10% FBS with final volume 10% DMSO." + }, + { + "submitted_id": "UW-GCC_SAMPLE_COLO-829T_2", + "passage_number": "4", + "description": "Adherent melanoma derived cell line", + "growth_medium": "RPMI-1640 with 10% FBS", + "culture_duration": "30 days", + "culture_start_date": "2023-09-19", + "culture_harvest_date": "2023-10-19", + "lot_number": "ATCC-70024393\nSCRI-10192023", + "Cell density and volume": "3 million cells/mL\n2 mL/vial", + "doubling_time": "~3-4 days", + "karyotype": "64~69,XX,+X,+1,+1,dic(1;3)(p12;p21)x2,add(2)(p13),add(2)(p21),+4,i(4)(q10),+6,add(\n6)(q13),+7,+7,add(7)(q32)x2,+8,i(8)(q10),+9,\ndel(9)(p21),+12,+13,+13,+13,+14,+15,+17,+19,+19,+20,+20,", + "biosources": "UW-GCC_CELL-LINE_COLO-829T", + "protocol": "Culture in RPMI-1640 10% FBS. Split by rinsing with PBS and trypsininzing with 0.05% trypsin-EDTA.\nFreeze in RPMI-1640 10% FBS with final volume 10% DMSO." + }, + { + "submitted_id": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1", + "passage_number": "N/A", + "description": "50-to-1 mixture of COLO829BL and COLO829T cells", + "growth_medium": "N/A", + "culture_duration": "N/A", + "culture_start_date": "N/A", + "culture_harvest_date": "2023-10-25", + "lot_number": "ATCC-70022927\nATCC-70024393\nSCRI-10252023", + "Cell density and volume": "2.55 million cells/mL\n2 mL/vial", + "doubling_time": "N/A", + "karyotype": "N/A", + "biosources": "UW-GCC_CELL-LINE_COLO-829BL\nUW-GCC_CELL-LINE_COLO-829T", + "protocol": "Bulk hand mixture of UW-GCC_SAMPLE_COLO-829BL_1 and UW-GCC_SAMPLE_COLO-829T_2 cells in a 50:1 ratio.\nFreeze in RPMI-1640 10% FBS with final volume 10% DMSO." + } + ], + "Analyte": [ + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_FiberSeq_1", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "111 ng/ul", + "volume": "50 ul", + "sample_quantity": "6 million cells", + "a260_a280_ratio": 2.06, + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_FiberSeq_2", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "220 ng/ul", + "volume": "55 ul", + "sample_quantity": "6 million cells", + "a260_a280_ratio": 2.0, + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_gDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "Genomic DNA" + ], + "treatments": "N/A", + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_HMWgDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "HMW genomic DNA" + ], + "treatments": "N/A", + "concentration": "92 ng/uL", + "volume": "25 ul", + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_bulkKinnex_1", + "molecule": [ + "RNA" + ], + "components": [ + "cDNA" + ], + "concentration": "449 ng/ul", + "sample_quantity": "3 million cells", + "a260_a280_ratio": 2.05, + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BL_HiC_1", + "molecule": [ + "DNA" + ], + "components": [ + "Arima HiC library" + ], + "concentration": "11.4ng/ul", + "volume": "25 ul", + "sample_quantity": "3 million cells", + "biosample": "UW-GCC_SAMPLE_COLO-829BL_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_FiberSeq_1", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "180 ng/ul", + "volume": "50 ul", + "sample_quantity": "6 million cells", + "a260_a280_ratio": 2.09, + "biosample": "UW-GCC_SAMPLE_COLO-829T_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_FiberSeq_2", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "56.4 ng/ul", + "volume": "50 ul", + "sample_quantity": "6 million cells", + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "HMW genomic DNA" + ], + "treatments": "N/A", + "concentration": "96 ng/ul", + "volume": "50 ul", + "biosample": "UW-GCC_SAMPLE_COLO-829T_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_2", + "molecule": [ + "DNA" + ], + "components": [ + "HMW genomic DNA" + ], + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_gDNA_2", + "molecule": [ + "DNA" + ], + "components": [ + "Genomic DNA" + ], + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_bulkKinnex_2", + "molecule": [ + "RNA" + ], + "components": [ + "cDNA" + ], + "concentration": "552 ng/ul", + "volume": "50 ul", + "sample_quantity": "3 million cells", + "a260_a280_ratio": 2.1, + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829T_HiC_2", + "molecule": [ + "DNA" + ], + "components": [ + "Arima HiC library" + ], + "biosample": "UW-GCC_SAMPLE_COLO-829T_2" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_FiberSeq_1", + "molecule": [ + "DNA" + ], + "components": [ + "Fiber-seq DNA" + ], + "treatments": "100U Hia5/million cells, 10min 25C", + "concentration": "110 ng/ul", + "volume": "50 ul", + "sample_quantity": "3 million cells", + "biosample": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_gDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "Genomic DNA" + ], + "biosample": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_HMWgDNA_1", + "molecule": [ + "DNA" + ], + "components": [ + "HMW genomic DNA" + ], + "treatments": "N/A", + "concentration": "90.2 ng/ul", + "volume": "50 ul", + "sample_quantity": "3 million cells", + "biosample": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1" + }, + { + "submitted_id": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_bulkKinnex_1", + "molecule": [ + "RNA" + ], + "components": [ + "cDNA" + ], + "concentration": "470 ng/ul", + "volume": "50 ul", + "sample_quantity": "3 million cells", + "a260_a280_ratio": 2.05, + "biosample": "UW-GCC_SAMPLE_COLO-829BLT-50to1_1" + } + ], + "Library": [ + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00338", + "preparation_date": "2023-07-28", + "target_insert_minimum_length": "17 kb", + "target_insert_avg_length": "20 kb", + "target_insert_maximum_length": "N/A", + "insert_mean_length": 21870.0, + "insert_%_CV": "27.4", + "amplification_cycles": "N/A", + "barcode_sequences": "bc2025", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_FiberSeq_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_2", + "name": "COLO-829BL (Replicate 2)", + "sample_name": "PS00356", + "preparation_date": "2023-09-01", + "target_insert_minimum_length": "17 kb", + "target_insert_avg_length": "20 kb", + "target_insert_maximum_length": "N/A", + "insert_mean_length": 25734.0, + "insert_%_CV": "23.26", + "amplification_cycles": "N/A", + "barcode_sequences": "bc2055", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_FiberSeq_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_FIBERSEQ_1", + "name": "COLO-829T (Batch 1 - Replicate 1)", + "sample_name": "PS00357", + "preparation_date": "2023-08-27", + "target_insert_minimum_length": "17 kb", + "target_insert_avg_length": "20 kb", + "target_insert_maximum_length": "N/A", + "insert_mean_length": 22616.0, + "insert_%_CV": "17.4", + "amplification_cycles": "N/A", + "barcode_sequences": "bc2051", + "analyte": "UW-GCC_ANALYTE_COLO-829T_FiberSeq_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_FIBERSEQ_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00418", + "analyte": "UW-GCC_ANALYTE_COLO-829T_FiberSeq_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_NOVASEQX_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00340", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_gDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_ONT_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00342", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_HMWgDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_ULONT_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00339", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_HMWgDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_bulkKinnex_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00419", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_bulkKinnex_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BL_HiC_1", + "name": "COLO-829BL (Replicate 1)", + "sample_name": "PS00341", + "analyte": "UW-GCC_ANALYTE_COLO-829BL_HiC_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_ONT_1", + "name": "COLO-829T (Batch 1 - Replicate 1)", + "sample_name": "PS00361", + "analyte": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_ONT_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00421", + "analyte": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_ULONT_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00358", + "analyte": "UW-GCC_ANALYTE_COLO-829T_HMWgDNA_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_NOVASEQX_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00359", + "analyte": "UW-GCC_ANALYTE_COLO-829T_gDNA_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_bulkKinnex_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00420", + "analyte": "UW-GCC_ANALYTE_COLO-829T_bulkKinnex_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829T_HiC_2", + "name": "COLO-829T (Batch 2 - Replicate 1)", + "sample_name": "PS00360", + "analyte": "UW-GCC_ANALYTE_COLO-829T_HiC_2" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BLT-50to1_1_FIBERSEQ_1", + "name": "COLO-829BL-T 1-50mix (Replicate 1)", + "sample_name": "PS00433", + "analyte": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_FiberSeq_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BLT-50to1_1_NOVASEQX_1", + "name": "COLO-829BL-T 1-50mix (Replicate 1)", + "sample_name": "PS00431", + "analyte": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_gDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BLT-50to1_1_ONT_1", + "name": "COLO-829BL-T 1-50mix (Replicate 1)", + "sample_name": "PS00432", + "analyte": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_HMWgDNA_1" + }, + { + "submitted_id": "UW-GCC_LIBRARY_COLO-829BLT-50to1_1_bulkKinnex_1", + "name": "COLO-829BL-T 1-50mix (Replicate 1)", + "sample_name": "PS00434", + "analyte": "UW-GCC_ANALYTE_COLO-829BLT-50to1_1_bulkKinnex_1" + } + ], + "Sequencing": [ + { + "submitted_id": "UW-GCC_SEQUENCING_PACBIO-HIFI-150x", + "category": "HiFi Long Read WGS", + "platform": "PacBio", + "instrument_model": "Revio", + "instrument_cycles": "24 hr movie", + "sequencing_kit": "BINDINGKIT=102-739-100;SEQUENCINGKIT=102-118-800", + "read_type": "Single-end", + "target_read_length": "20 kb", + "target_coverage": "150x" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_PACBIO-HIFI-60x", + "category": "HiFi Long Read WGS", + "platform": "PacBio", + "instrument_model": "Revio", + "instrument_cycles": "24 hr movie", + "sequencing_kit": "BINDINGKIT=102-739-100;SEQUENCINGKIT=102-118-800", + "read_type": "Single-end", + "target_read_length": "20 kb", + "target_coverage": "60x" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_NOVASEQX-2000x", + "platform": "Illumina", + "instrument_model": "NovaSeqX" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_NOVASEQX-200x", + "platform": "Illumina", + "instrument_model": "NovaSeqX" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_NOVASEQX-HiC-60x", + "platform": "Illumina", + "instrument_model": "NovaSeqX" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_ONT-R10-300x", + "platform": "ONT", + "instrument_model": "PromethION" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_ONT-R10-30x", + "platform": "ONT", + "instrument_model": "PromethION" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_UL-ONT-R10", + "platform": "ONT", + "instrument_model": "PromethION" + }, + { + "submitted_id": "UW-GCC_SEQUENCING_PACBIO-BULK-KINNEX", + "platform": "PacBio", + "instrument_model": "Revio", + "instrument_cycles": "24 hr movie" + } + ], + "FileSet": [ + { + "submitted_id": "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1", + "sequencing": "UW-GCC_SEQUENCING_PACBIO-HIFI-150x", + "libraries": [ + "UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_1" + ] + }, + { + "submitted_id": "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2", + "sequencing": "UW-GCC_SEQUENCING_PACBIO-HIFI-150x", + "libraries": [ + "UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_2" + ] + }, + { + "submitted_id": "UW-GCC_FILE-SET_COLO-829_FIBERSEQ_1", + "sequencing": "UW-GCC_SEQUENCING_PACBIO-HIFI-60x", + "libraries": [ + "UW-GCC_LIBRARY_COLO-829T_FIBERSEQ_1" + ] + } + ], + "UnalignedReads": [ + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230825_191347_S3.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230825_191347_s3.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "3940092", + "10%ile_read_length": "15150", + "median_read_length": "18140", + "90%ile_read_length": "24120", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "45eea8352e2b8a3ad11feeccd4fea2bc" + }, + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230828_212510_S3.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230828_212510_s3.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5750093", + "10%ile_read_length": "15280", + "median_read_length": "18560", + "90%ile_read_length": "25000", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "9396dde111d9f719f7d94b98802ae68f" + }, + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230828_215531_S4.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230828_215531_s4.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5540842", + "10%ile_read_length": "15270", + "median_read_length": "18540", + "90%ile_read_length": "24950", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "c292f2a92316f09eba13e515eaf7c6e5" + }, + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230828_222637_S1.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230828_222637_s1.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5142752", + "10%ile_read_length": "15340", + "median_read_length": "18700", + "90%ile_read_length": "25150", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "d0daf2811713ce0f18ed4cd38862a509" + }, + { + "submitted_id": "UW-GCC_FILE_PS00338.M84046_230828_225743_S2.BC2025.FT.BAM", + "file_name": "PS00338.m84046_230828_225743_s2.bc2025.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5092420", + "10%ile_read_length": "15320", + "median_read_length": "18650", + "90%ile_read_length": "25080", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "48319442da9d28eb6d44822cfb8bda67" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230913_211559_S4.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230913_211559_s4.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5049023", + "10%ile_read_length": "16720", + "median_read_length": "20630", + "90%ile_read_length": "27640", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "2f39b216ccf0de536e099e83841b8f55" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230916_212004_S3.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230916_212004_s3.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "4912815", + "10%ile_read_length": "16740", + "median_read_length": "20690", + "90%ile_read_length": "27710", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "a91d464af7f868b3291767df3d6f6aea" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230916_215110_S4.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230916_215110_s4.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "4866279", + "10%ile_read_length": "16790", + "median_read_length": "20840", + "90%ile_read_length": "27980", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "8d3b24b021d5d4dd4c8aaa4106999987" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230916_225322_S2.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230916_225322_s2.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "4749101", + "10%ile_read_length": "16810", + "median_read_length": "20890", + "90%ile_read_length": "28060", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "98be0640495b9a66328a02fce08704cd" + }, + { + "submitted_id": "UW-GCC_FILE_PS00356.M84046_230919_203620_S1.BC2055.FT.BAM", + "file_name": "PS00356.m84046_230919_203620_s1.bc2055.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "4694509", + "10%ile_read_length": "16670", + "median_read_length": "20510", + "90%ile_read_length": "27380", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "c3a68e07c776276bd95221e5adffb2a4" + }, + { + "submitted_id": "UW-GCC_FILE_PS00357.M84046_230913_214705_S1.BC2051.FT.BAM", + "file_name": "PS00357.m84046_230913_214705_s1.bc2051.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5072026", + "10%ile_read_length": "16880", + "median_read_length": "19830", + "90%ile_read_length": "25180", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829T_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "c8e0d9d49294139a6dfa37aa3b9f2448" + }, + { + "submitted_id": "UW-GCC_FILE_PS00357.M84046_230913_221811_S2.BC2051.FT.BAM", + "file_name": "PS00357.m84046_230913_221811_s2.bc2051.ft.bam", + "file_format": "BAM", + "data_category": [ + "Sequencing Reads" + ], + "data_type": [ + "Unaligned Reads" + ], + "sequenced_read_count": "5873988", + "10%ile_read_length": "16840", + "median_read_length": "19750", + "90%ile_read_length": "25090", + "file_sets": [ + "UW-GCC_FILE-SET_COLO-829T_FIBERSEQ_1" + ], + "software": [ + "UW-GCC_SOFTWARE_FIBERTOOLS-RS" + ], + "checksum": "ce95b0c1fcb48e26cb991aebaa429e29" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "16668052", + "checksum": "f6a468c1e901ba41843ccb0076b73624" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "16668052", + "checksum": "423930bbd16a7671bd757edfa5fcee12" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "17571154", + "checksum": "3d9acad3ea32f436ed6000d35f6da3a7" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "17571154", + "checksum": "0dfa5c3557d8198a819c85671027da72" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "17164167", + "checksum": "eee3348b790db828c1751fe57463e7c6" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "17164167", + "checksum": "245027aa066a0121d15f4b4e2de0edf9" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "17164009", + "checksum": "b47d60123fc72325f58c807cbc0d47f5" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "17164009", + "checksum": "34b45bf8c24535de199a29020e22ffb5" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "17188931", + "checksum": "130b4e91f1c77d7b5e00ec56d79b241e" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "17188931", + "checksum": "81136eec5d0061abc5467020df12a9cc" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "17193380", + "checksum": "7600e0e476a79c1e215a24b3bd46d9e9" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "17193380", + "checksum": "0a78bda096ef1f95efcd7c883b01c016" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "17281040", + "checksum": "2259253be91316fcfdc5edbd7a1771c4" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "17281040", + "checksum": "05867530050f63a4d57080430d24c310" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "17065081", + "checksum": "db8f1a4b8398a94010014425d411a455" + }, + { + "submitted_id": "1418708.180681.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180681.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "17065081", + "checksum": "f1a063bf393806aed470a46af760a38d" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "73321235", + "checksum": "eeddb863102a899bc02c681c652c7c2a" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "73321235", + "checksum": "074020e417151bbeca5f62904b99ed6c" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "75555132", + "checksum": "1efa74af32e809cb5274dc9132c64bad" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "75555132", + "checksum": "27090b12a76b0d6b3d243df05f3e21be" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "71834184", + "checksum": "8f18f0064df2ee66ff300402b98dce2e" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "71834184", + "checksum": "efe116928da0531fe7acc26080e5812a" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "73651589", + "checksum": "8d76770ff353710cdf6687292cc6e1f0" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "73651589", + "checksum": "d0ad1f8f1976e8b7dc01a1517635725e" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "70615522", + "checksum": "2c61d2933c03269cc349903299913cc7" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "70615522", + "checksum": "1b59a79ac9984e7f8ff05cf66b147c24" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "71502691", + "checksum": "7c58994c3e5e4eadec80b43b17d36042" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "71502691", + "checksum": "3ac1592f956259df14bb7d4f710423b4" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "71912053", + "checksum": "cc53651352a4ed4418e5f63a230762d5" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "71912053", + "checksum": "2c4bdba9db35abcf2fcd047db0d0956e" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "72911792", + "checksum": "224279ad5721f03a09076e86019c23af" + }, + { + "submitted_id": "1418708.180681.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180681.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "72911792", + "checksum": "83380c0666cc703afad58428a27da7b9" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "17914371", + "checksum": "8d7405cd14257c3e55ce77838c1781a6" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "17914371", + "checksum": "0dcc42ba731a9869bdbd897b61d17e1f" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "17024467", + "checksum": "028eb7c7e2a2b4edeb4992f40cc7f33a" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "17024467", + "checksum": "fe811940bb6d52f0716bac7d3c8daa0d" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "17523681", + "checksum": "ae96ad4276f289ee3c0026053402e30e" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "17523681", + "checksum": "a0992cd5ca6c0fce9b11d74dc88a87a2" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "17390389", + "checksum": "1e939c435a97055c25dfafc3d8e9eed1" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "17390389", + "checksum": "e9f7656cfc374bb096f4c856bae4bf23" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "17388355", + "checksum": "10a8d556dac524e86e0e16eccb77565e" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "17388355", + "checksum": "3169499889d48865539d0449915aaaa4" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "16985071", + "checksum": "d12f91d9f7e459d87033b91a66eb23c1" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "16985071", + "checksum": "ee57a3688614140321694ed7671d7d3d" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "16682467", + "checksum": "2e9ef41704d7cc0262d2de2c9d796e20" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "16682467", + "checksum": "67cf8677c76bd9a8c3727a4690e24215" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "15896031", + "checksum": "9efcaf24b4daa5c65085e90c235a18f8" + }, + { + "submitted_id": "1418708.180681.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180681.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "15896031", + "checksum": "885d6db5aec0bfa324762a2693eb0ebc" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "24000157", + "checksum": "4397a37269721b0e3c87ca77085e7aae" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "24000157", + "checksum": "ef41f485b3315d57c993f2136989795b" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "24604096", + "checksum": "2864865c22f739ae6f5ef233afc78c4c" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "24604096", + "checksum": "359a5f049e02baa192d854afa876fd1e" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "24561621", + "checksum": "a09c923e90aaf3e085f0b50962ab5014" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "24561621", + "checksum": "cd6494ceb0818683c656e6f7ec1cc4d1" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "24747136", + "checksum": "9ae408f6fa69a256192d8cb85f5e3ca0" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "24747136", + "checksum": "03eccb7c2b8f29c65e396e9779e1693f" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "25040721", + "checksum": "b063a5c7c73763ac641878a78888bb99" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "25040721", + "checksum": "7df298747f2936b1f54c2935a241f90c" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "25281416", + "checksum": "ba16cd3749cdaaa72844d208977d9a97" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "25281416", + "checksum": "2414cbd97e0f4ae5c335439d1df9eceb" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "25128366", + "checksum": "219287dc2d13b24c08440b43bbb6bf4d" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "25128366", + "checksum": "c870496ae047496cfd8a618d07cf9f16" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "25255041", + "checksum": "9888a5d0b4439c5ec5c3b16d9c54f2d8" + }, + { + "submitted_id": "1418708.180682.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180682.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "25255041", + "checksum": "2f679d664f57b0cb22ece522eb6f0a0c" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "113000000", + "checksum": "93d1bf5d63b93d5bfc523b4b2c0e1fde" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "113000000", + "checksum": "13f9ee6f12e56da9ad455ac13bb11b20" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "114000000", + "checksum": "c7ea2546416d1d8a0502be1e94153a11" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "114000000", + "checksum": "9f0c56b1d6773ef7cd15c7361b28b3c2" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "112000000", + "checksum": "bbd86e027834642a8ba189b669ccec19" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "112000000", + "checksum": "dc0050ef78197c7b0b89a80d65eaba72" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "112000000", + "checksum": "413b5cdd8ab23c53136debf46db84ae4" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "112000000", + "checksum": "6427d3c58558c76576e38555397c30ca" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "106000000", + "checksum": "f8b77544aec471cbcd9c0493bde7839a" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "106000000", + "checksum": "7d7fa180a32f9f679403fcc97466f445" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "107000000", + "checksum": "d3e0fb8d9a29b9e5dcc68b6745b62ea8" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "107000000", + "checksum": "b4c6402b3bdc4151c38a5ad09e467cd6" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "109000000", + "checksum": "42246c7b51630b1c9ff67ac902e0cac3" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "109000000", + "checksum": "5efcce09adb6364f6139a971e32ca4ce" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "111000000", + "checksum": "a126f34e445f681f353766e0937d8f2c" + }, + { + "submitted_id": "1418708.180682.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180682.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "111000000", + "checksum": "0da28dd08a1d418aedaf6f5bc1ac9cb5" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "27077469", + "checksum": "1badf4dfbe0a09f91dd7c8f7eea68eac" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "27077469", + "checksum": "e7b8e64ddd934040cd3dee86a8fbc578" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "26285392", + "checksum": "ab7ed4308acad009f1fa3e0a6d2faef9" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "26285392", + "checksum": "deb3b04cd52c51cff9ae1561982ef1f1" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "26326704", + "checksum": "8215523ca179c5f78ddebaf3c7d5939c" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "26326704", + "checksum": "dc2eec2098165c2941eedd48c37f9fd4" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "26880375", + "checksum": "057edd8bef40d026b98764801ca91056" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "26880375", + "checksum": "df15dce5d93f6c850e7d5c696e6b04c8" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "26143687", + "checksum": "4473fecccfc5ae313e00ed43405cd619" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "26143687", + "checksum": "8f712e60cb68df9bc9487d1794661d89" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "25297041", + "checksum": "dec6abfd764d7479045b1c7a9d8ffe04" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "25297041", + "checksum": "32b3a237107fcb99f3e007071abf1986" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "25798910", + "checksum": "b4c0fd3e8b229029c7212bdce959bed2" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "25798910", + "checksum": "3853cde01ac1bddfbc59de1cb80d4c71" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "25116337", + "checksum": "c92f06e66f3c9b3214a19183349db54a" + }, + { + "submitted_id": "1418708.180682.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180682.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "25116337", + "checksum": "9b2b5d96ea5bc10dc4b4dc9aea3f83f9" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "19635879", + "checksum": "2a466e55f48becd9f074e3f27a9f0aa0" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "19635879", + "checksum": "eebb34a98d39f29c00df691095b32134" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "20342366", + "checksum": "e97067756e0ebe4c9dc5770bd4cba8ce" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "20342366", + "checksum": "278bf1fba92791f58e3be3d0515b41d4" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "20199709", + "checksum": "879a34985f628be15394fedb948c3aa2" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "20199709", + "checksum": "0a70b895d45f561ba12afc1581fb39f1" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "20137961", + "checksum": "c6f4bbcf6fdec1d9c0b19961073f1ad1" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "20137961", + "checksum": "04fbe5cf2cf381fe18ed198efa03907e" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "20266340", + "checksum": "3898fa452396fb85e02c5ceaead95efe" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "20266340", + "checksum": "51bd33c36fae6b294901bc38d310344c" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "20265822", + "checksum": "10ab37892563e499b24694832e2bb56b" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "20265822", + "checksum": "1f536a39ec987f89926c915b91a4ad1b" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "20304996", + "checksum": "549a5e91ceaaa75c93b2e0f4f827221d" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "20304996", + "checksum": "6fe77ae742a1fcf7be93ab67d6429de2" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "20063618", + "checksum": "98a58976b160bd5937411de0c71b06bb" + }, + { + "submitted_id": "1418708.180683.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180683.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "20063618", + "checksum": "9a0f8e328239e2b8dcab9d402b733a83" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "87793108", + "checksum": "1d1ec491fd4e5e58b20154e83230c941" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "87793108", + "checksum": "d58882427b2ed5deaf290c1a808ffc62" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "89786431", + "checksum": "6b5a92a479b2beb5a770fa912c573070" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "89786431", + "checksum": "4950c8907786a4decade978993a85268" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "86999178", + "checksum": "a9835ca420c1c1aa164c425e2203ad71" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "86999178", + "checksum": "b4a1c86e3f0ded289396ea92b00ea401" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "88397924", + "checksum": "39b9a0cbfb1e34ce2a81d6a5bb0ffb09" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "88397924", + "checksum": "54803661caf4782bec0b77f76805877f" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "85058961", + "checksum": "9766f4698267a153338d8c10c8f6dc42" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "85058961", + "checksum": "46f4df2c1694b216e402426bf59715d3" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "85727863", + "checksum": "9cecd8e193a8916c886de5262911c985" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "85727863", + "checksum": "7b1ab302a558b252af5842f617649fb5" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "86613417", + "checksum": "94e3e066058dd1a857292b05c49769f3" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "86613417", + "checksum": "c722bfa3a9faf90b6fd11bda539140c6" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "86258339", + "checksum": "15de5dceda0e741b82c7ccf3b4b81c8c" + }, + { + "submitted_id": "1418708.180683.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180683.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "86258339", + "checksum": "26b25f3dc52eca48b556568df0e0da6d" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "21087099", + "checksum": "498253285ac717a2033cf9f39cc128ec" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "21087099", + "checksum": "0c95c2895d956a272484b3883da74faa" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "20463371", + "checksum": "6fd27696ffad46481c40efe264a9a373" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "20463371", + "checksum": "91ae073b82984e73e68a48dfb1afa313" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "20933001", + "checksum": "62df6c5f2bf38b03f6e4b4817b5c8269" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "20933001", + "checksum": "e4a23ee1553f2ada1f4e6cb5009541fc" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "20915279", + "checksum": "ba3b60d0572a3efc76b190a9e6d5f68e" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "20915279", + "checksum": "77d7d42204e73f14b3703c57615b79cc" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "20821999", + "checksum": "f1e223bcf6e72acbe14fb9e611b65d3d" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "20821999", + "checksum": "404d11e0f5832013ab66b1b3dbbad774" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "20298315", + "checksum": "555922d013066eeb8ffa69d3390b0554" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "20298315", + "checksum": "4677d99467e065c86a86626e40cdbf0a" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "20146383", + "checksum": "e0221e39b371a675fdb8e65ea1e7cc05" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "20146383", + "checksum": "a52e54cd70382fe6df7d41036bbaa5f5" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "19276055", + "checksum": "b156253cd7b8f9a44efc2633fb806c6f" + }, + { + "submitted_id": "1418708.180683.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180683.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "19276055", + "checksum": "e978f4a46f26969ee57811429f1504ae" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "20959037", + "checksum": "b4bff39a5ffb2c82b86295d1869344ed" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "20959037", + "checksum": "44ed7295449c862a27f7b2aa86525fc4" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "21785939", + "checksum": "bf2500109eddba0482d113980cccf246" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "21785939", + "checksum": "9e8d9a927fbb432c61f3daecba6d90e7" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "21588177", + "checksum": "1e23db1aab251c0cec9af6868aa61fa4" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "21588177", + "checksum": "f4d92d130f392c118df3bc63750b282c" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "21581022", + "checksum": "5b171caaa8d349b6ddd176beeebed089" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "21581022", + "checksum": "1b599a4ef144a53a8e691fcdbc798d9c" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "21703868", + "checksum": "8d7e7ab4f255f321f1e32c1915d84be3" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "21703868", + "checksum": "857fcf45fc9da203f05cb29cd137ed67" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "21723768", + "checksum": "8df6af727b5eee5047c9d6b8a3d97ef4" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "21723768", + "checksum": "2761eb2908ee5a0c8903353061e83d81" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "21746309", + "checksum": "b677e1de52d8ecded23f3baf69c194c3" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "21746309", + "checksum": "e8d1f3dd2b65548e7f02dacb3f066919" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "21449011", + "checksum": "e1ed97a2b29700ca6f0a4c83ec0af65e" + }, + { + "submitted_id": "1418708.180684.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180684.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "21449011", + "checksum": "a01d267d7a107e056598fc5ad2d1eb21" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "93914538", + "checksum": "4717f06e6f7f9ddd017ba6d4fba31529" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "93914538", + "checksum": "a417e8d28600d30544d1cc11a515a821" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "95515989", + "checksum": "afd1a4d269c38cc98c2d93e718815ff6" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "95515989", + "checksum": "6723aaf936f8e8dab7f228e69ffe5ac7" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "93139449", + "checksum": "b00f8c53050a225133bcc9ca9a39005b" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "93139449", + "checksum": "9f6853b1fdacbc570c14d3d89ac2ae06" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "94461732", + "checksum": "362083ebe1f66698e6e9fed4873bd574" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "94461732", + "checksum": "5e45996c79cbd9e90ace59a8000d7819" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "91256404", + "checksum": "5342ce272df18e8b06dc5e064bf6dc30" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "91256404", + "checksum": "b238d1cd47be94ddba22b4adaada18ca" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "92064200", + "checksum": "3aaeca90cdbe938ec559e5a0084a8976" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "92064200", + "checksum": "4658b6178a1155a3f29dcfedeea26622" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "92913043", + "checksum": "977e9d5d2078ae3a3c08372ef03b650f" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "92913043", + "checksum": "6cd6819d5b6e921d463ef5864b43f839" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "92704931", + "checksum": "9139c48dd5687191e5299ee11acb3d65" + }, + { + "submitted_id": "1418708.180684.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180684.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "92704931", + "checksum": "277dccd46f90fb9f05a8276d29be44f7" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "22580413", + "checksum": "1246d59cae5bb29161b792a6ec68ae35" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "22580413", + "checksum": "52424948a01e37c56588304fce9211fa" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "21905173", + "checksum": "014fcbb425d72c15e3786a618738e963" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "21905173", + "checksum": "5bfb276c54a0b52412aa8820be33d4e3" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "22381978", + "checksum": "a49a21a7647037232ee9ab6b6b909147" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "22381978", + "checksum": "86e0a04f3b696771cb8257818c435ab2" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "22365832", + "checksum": "c9bd689fb9c6e9abf96e2efd2cb0acc1" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "22365832", + "checksum": "785501cbd9b7f1b45d154543623236ca" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "22370435", + "checksum": "a2752a02ec6fb259ca338610e1dac8ce" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "22370435", + "checksum": "36a65e2dd075834bd2e598c50ad494f4" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "21903597", + "checksum": "e0c78dea948170e679c33cfd265862a6" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "21903597", + "checksum": "41c3b0808ce3d6ceabb124e0e7642fc7" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "21852930", + "checksum": "223336cd68067d294de2eb3bff36c610" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "21852930", + "checksum": "8e9cfa0d5534ef068efb622bce010e4b" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "20980185", + "checksum": "5ccae04202bd8cbe8dc6893c18e31584" + }, + { + "submitted_id": "1418708.180684.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180684.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "20980185", + "checksum": "cfdfcb905ff06455238c89fbafed32b4" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "24216305", + "checksum": "0f0ab0bc9daa150cf4b9777801463f30" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "24216305", + "checksum": "187d9874631148e275b3df17ceae1ece" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "24998743", + "checksum": "31e35b1fc537ab752d5e6102c74819ab" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "24998743", + "checksum": "b520b1efa4c178cd07c5ec3c448674c2" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "24638286", + "checksum": "bb5fccaf1f6847a8cdedf60d17ebfb9e" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "24638286", + "checksum": "2e7062ddcd8bd3f69c35d00b5ccf7d6b" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "24579427", + "checksum": "755db010f96ab7598ff28261bbe3ce17" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "24579427", + "checksum": "2c421ab3a06b5690078e1f432bb4e372" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "24851618", + "checksum": "3cf43f0dbd9f9c47d7641c67034ff93d" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "24851618", + "checksum": "dfb9c50b7b4398f73d66481da98b1f62" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "24860220", + "checksum": "6cad9a184615a819356c8a882ee925d8" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "24860220", + "checksum": "b29645ab74f48d7ff2e9eefa9182b57c" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "24896069", + "checksum": "abb0e3fcf3705f032d3f7d7018396bd2" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "24896069", + "checksum": "2e8b2b4ca06bc9c7525576ec55519265" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "24677270", + "checksum": "46dd77275d3900a98a716482c41b20c0" + }, + { + "submitted_id": "1418708.180685.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180685.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "24677270", + "checksum": "ae93e1f17292529dfe3c554b6279882a" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "109000000", + "checksum": "9e2aa352252b3567dff144bf3d2670b3" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "109000000", + "checksum": "1b506802f839dbbf0d9de7cd0bdbb604" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "111000000", + "checksum": "2e878588e1939973b2331ff846f64ad3" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "111000000", + "checksum": "f05f710cb5b3f97beca4b65ca87b0aa5" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "108000000", + "checksum": "4b058839ebcb32b2adb43645e5c66d22" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "108000000", + "checksum": "5ca25edd22b34252f49a547a3ae6653e" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "109000000", + "checksum": "c7ba2eb8e2e88958e5297fac030eda4e" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "109000000", + "checksum": "41c2ee72c27fa34a6054746ea8f264c0" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "106000000", + "checksum": "70986d742cf9914127d92f4c363f73ef" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "106000000", + "checksum": "2544e884050806f4fcb87d111a4000f0" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "106000000", + "checksum": "26413d863cb60324ed9364d225c510e7" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "106000000", + "checksum": "e052b32c675b532377af2c8c61b8c0d4" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "108000000", + "checksum": "547878b5518e522f09e8081675986a62" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "108000000", + "checksum": "19447050449406a828f2921ea108c0dc" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "107000000", + "checksum": "8550c37c4a776654a45e8f31c601a9fe" + }, + { + "submitted_id": "1418708.180685.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180685.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "107000000", + "checksum": "2d3e2a65006519672cb1f3995876a36a" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "26167485", + "checksum": "f134fc767e035446a2a5ac11fb5cf514" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "26167485", + "checksum": "f75e5db51b9cceb00247d13c83aa369e" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "24951942", + "checksum": "91974c765a423aca5a025d39dc6e78d4" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "24951942", + "checksum": "ad59719f17848a8239ccb30e7f8f89cd" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "25439635", + "checksum": "4b0928d28ee434e10a734d1032f20915" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "25439635", + "checksum": "814735b3b5822dd8d6473a0c7411f61c" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "25393827", + "checksum": "c0e53737e0d7c381f0111aa07777eebb" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "25393827", + "checksum": "897466199d61ec75b41380fc39e27c1c" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "25254452", + "checksum": "4fd3216007cf2e574f4990e812670929" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "25254452", + "checksum": "ee95616b6f6b4932fbffb08b64ba771b" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "24598234", + "checksum": "f8babbeb00af280d74686556642d76d0" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "24598234", + "checksum": "00ade249fc25c1152767602e71c04557" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "24464381", + "checksum": "9fb85ab5127fc31b256e0f63dd3b1f27" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "24464381", + "checksum": "5c33c5db978fa706520d76ff3f16f6b6" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "23402868", + "checksum": "a8f9fd3b2b147d7d7c55683e839d1d4b" + }, + { + "submitted_id": "1418708.180685.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180685.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "23402868", + "checksum": "14511f754fab30c9fe6e7eea9efc8f46" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "19222971", + "checksum": "8e52e53ca29ce54a65559b41123fe161" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "19222971", + "checksum": "8127aad594900fcc1d7ad8e5e01b4183" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "19443975", + "checksum": "f9cec214a51f4f10a4f333cb9269b3c4" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "19443975", + "checksum": "418cc49b660d60a59eb2743606f57acd" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "19561103", + "checksum": "597cd9dda2d89719416150cf709b2b2d" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "19561103", + "checksum": "2859be2e27f3656f34c3aeff2d7c7690" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "19747529", + "checksum": "dc0c0c6e66347ab02f3306521e2179c4" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "19747529", + "checksum": "07ea50ffb79e1b1a5eba2459744db616" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "19932597", + "checksum": "28246488e0fd31ef9111728b32fb5595" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "19932597", + "checksum": "5a7358417101c1c0c114442d8f422fc9" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "20171251", + "checksum": "61ffbfe25d4397d916b340fb20e56ca4" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "20171251", + "checksum": "7bd256a5c5742aa9f22f9c5ce7263397" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "20141622", + "checksum": "1d1ed592b32ad5e19890db661216422f" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "20141622", + "checksum": "4e43b97b13ba9ae4e060e8b9ddc71814" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "20273900", + "checksum": "7de1b1485d435e3af39e6ae90b0bb329" + }, + { + "submitted_id": "1418708.180686.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180686.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "20273900", + "checksum": "a864e313c6d0fd98a990d96024d249f0" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "85677071", + "checksum": "9ed79605445a0c3444c7f082a43f1a1e" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "85677071", + "checksum": "1b3403351e5f405a60f62964b6773e4f" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "85521272", + "checksum": "56f163f82a0d54fe50bacdbae9509756" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "85521272", + "checksum": "1327dfc306b83bfa09221c6b34259a7a" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "84379273", + "checksum": "42cbf5ab75cf438c9100bd5b52a32e0c" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "84379273", + "checksum": "1ee3c65c2deb7a0372e2843e3d7569e1" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "83469912", + "checksum": "86f09d494e677587770eebb8b02b76be" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "83469912", + "checksum": "5fe223ff1da5fbabdaca77b9cc471f24" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "79519076", + "checksum": "318226fdd685200f10a380a29d6655d9" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "79519076", + "checksum": "40d8b9e2bfe9449165b08a71f2b237db" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "80531381", + "checksum": "a5ab0de56c10bf0abc5e2057d34e8d0f" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "80531381", + "checksum": "660a639dd2c4a3eadea13dd565d4ad16" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "82702669", + "checksum": "72ae7a4f5c1b7f159112f1bc27fdd850" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "82702669", + "checksum": "ec16bcfc4f4a183bebb207293c6b64d2" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "84046944", + "checksum": "c2172c18322370957f225081431ac177" + }, + { + "submitted_id": "1418708.180686.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180686.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "84046944", + "checksum": "8b9804e2b454e469e0366c68478cceb0" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "21706034", + "checksum": "a3b5ca9403bf84a19fe9a609c6de4b32" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "21706034", + "checksum": "c7b3e75d9edad3ccca8f1c20d778c958" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "21110311", + "checksum": "c2cea6c16bc50a1013c11eb35f96cd7b" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "21110311", + "checksum": "d32e99850d34dc099e3bc655f4bc5f08" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "21068887", + "checksum": "8031a6935c1ae93229f573767340c80e" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "21068887", + "checksum": "e84fa5cfb716dc1f78d753e4728f6287" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "21346071", + "checksum": "221045ac8b24eeb36bb3b5bdd17c7a0f" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "21346071", + "checksum": "a23f24f1c784e570c90302789ddcd734" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "20887937", + "checksum": "68cab122ee0b581d471c3dea803b7df9" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "20887937", + "checksum": "9975f24cbad04abac25061bf97f57e06" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "20310472", + "checksum": "69d9d29689bc39bb833cb151a8029fb1" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "20310472", + "checksum": "009b0bc74c6538816bb084cb2a41ef38" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "20773457", + "checksum": "d0444795abb844bd67f6e544ce3d6442" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "20773457", + "checksum": "97ed9673a738b1f7f17532c280dc7473" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "20427986", + "checksum": "b4a42dee55a1dafb3f4fba14fbebeb21" + }, + { + "submitted_id": "1418708.180686.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180686.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "20427986", + "checksum": "a59353758e42e91ced22f7296dca8278" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "26609606", + "checksum": "c6df678a8c1f54d4c7bc332a28595bf2" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "26609606", + "checksum": "4366403c8e8a49de6a51244f6669010f" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "27801382", + "checksum": "c91544217a4933b22e36ac1d1f01633e" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "27801382", + "checksum": "97eb7f5408e61a6050796a3bd1d2ece6" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "27136404", + "checksum": "b930e0c5c870242da41eeddd63db8b1c" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "27136404", + "checksum": "c57275289b126cca5d390c268860025f" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "27139709", + "checksum": "7898c1726b55ba197f7d1ea10aa9d848" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "27139709", + "checksum": "64829e745c4ddbef31649eae822a7c28" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "27134698", + "checksum": "3c63b26824fd590c2f9a35fc7d1c4aea" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "27134698", + "checksum": "1d93f4f636022dd64e2892ea036835dd" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "27190500", + "checksum": "eec995d7f8a0c46255903dd52fdfda5d" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "27190500", + "checksum": "1310bb31448a011dcc8f3ecf7191c21e" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "27385295", + "checksum": "f935d661d051daa1dfef5436e65763fd" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "27385295", + "checksum": "f9110595251486aa28d11e4ada0b29cc" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "27202715", + "checksum": "9a26082aa47a615a6549a8e6522e36ef" + }, + { + "submitted_id": "1418708.180687.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180687.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "27202715", + "checksum": "a512dbf6b638347db4cc44e1fa086211" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "118000000", + "checksum": "b5ffabc6be445536ccb71c28fe3876b2" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "118000000", + "checksum": "14683a4e5b1de87ee4e20aebde3548f9" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "120000000", + "checksum": "4b612a78aa48593f9e7a592f6f3fe11e" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "120000000", + "checksum": "060709006280adec6b2085caba9ff6cf" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "115000000", + "checksum": "c4d26f7dd2b6ef8899d6a8f047fc6b66" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "115000000", + "checksum": "6f769901d32e88720c561f765a033b39" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "117000000", + "checksum": "d90ffa37933db8166bfbbd40f418d64c" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "117000000", + "checksum": "9d3b294e5474f538ccece67d8bb32615" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "113000000", + "checksum": "be14397dc1bce2b2814e3adc1eb37ddd" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "113000000", + "checksum": "b8cb807936a2e5d2c7f3da76403e5233" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "114000000", + "checksum": "5d55a77574913e4e12996a7e3f2f3203" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "114000000", + "checksum": "c5c4fcb0750397599ac540dbaec16efe" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "115000000", + "checksum": "47fa49d6831022f709c47fad762aaa89" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "115000000", + "checksum": "4fce9178e6cf798b929ba4bfecafca02" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "117000000", + "checksum": "9e74d706f5d0618be7333f5698f67f29" + }, + { + "submitted_id": "1418708.180687.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180687.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "117000000", + "checksum": "dd445cd74cd3bcd7c47a1cd66ff063dc" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "28854580", + "checksum": "0512d15aa8486d5be1b1c829a2cb1a01" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "28854580", + "checksum": "5301f06a4c5c05e6a63fb3315946c150" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "27286765", + "checksum": "5f697a655226c1ce8a75b5f7ded3cc9b" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "27286765", + "checksum": "82d1a58bb95bb2aae6025f78ae9df114" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "27913793", + "checksum": "f4500c47d0dbc8cbdb10bed7a78b6b87" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "27913793", + "checksum": "696b33e1da08f340d347fd954d9ac7b9" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "27664328", + "checksum": "3b5e0fc10123e710aaad016152047943" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "27664328", + "checksum": "1fc83a5789418982d895be37090e92cd" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "27774034", + "checksum": "2c4a31d2a4ca12a1b7fe006a4d63c71e" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "27774034", + "checksum": "1b7e224067b334e07193127363a3978c" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "27153088", + "checksum": "374b72efe0758a536e7fd9470bb1c1ad" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "27153088", + "checksum": "e098976ccee98511da5b152b8b68e23a" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "26993879", + "checksum": "6e107bbb843409ac6ffb72392aa5e246" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "26993879", + "checksum": "f5b55921497660253dd7dcfba01964f5" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "26093477", + "checksum": "f3117eac287c68107068226618afeb46" + }, + { + "submitted_id": "1418708.180687.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180687.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "26093477", + "checksum": "da8e40ef8ec4d6e1cd66639dd0c971c9" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "17908626", + "checksum": "8a14d4128e7682c89c52f83a09f44ecf" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "17908626", + "checksum": "f6b889e79f50f68a02072ea4e14c93b0" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "18557369", + "checksum": "e3783c727673a7bb5f1d4812c75ccb85" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "18557369", + "checksum": "e160498fc47ea900d64cfe3abaab30e4" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "18553572", + "checksum": "ebc8c42004f2b39d1a9d1a3a4a544361" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "18553572", + "checksum": "f645906a92cf4841cf0ddb5c11706067" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "18530728", + "checksum": "39f64579f875c1aad277a181bc94edff" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "18530728", + "checksum": "f045cc304d09c97c5b6df5396dcb997d" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "18720703", + "checksum": "09a4fd4b7694d9008c1444cd8ea08834" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "18720703", + "checksum": "50a28ddfffdd2328348f742e8c13f7b1" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "18674592", + "checksum": "f68e226daf1e0047f9bd1feba5891d31" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "18674592", + "checksum": "965c14a84c234bbd8c52dfddf8aac537" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "18671587", + "checksum": "7178d8f3b0a4721fbd2a1cf614bc871e" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "18671587", + "checksum": "97bb49704fcef8b0cc3b0781066d9a60" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "18389534", + "checksum": "efa50ca4a0871d24ccde9d98e687f503" + }, + { + "submitted_id": "1418708.180688.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180688.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "18389534", + "checksum": "47fdc5329e22daceee3737537c3ead19" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "81709995", + "checksum": "96a4befe5ca56e251e9b419d6d4afe03" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "81709995", + "checksum": "ede340be0904b884d13bfbec1a3bfd4c" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "83996341", + "checksum": "2f363f22442d2f6da0b8020a8a5d410f" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "83996341", + "checksum": "49fb9d935d5c22262cc2a3e6d37c16f6" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "81516251", + "checksum": "e7404532716547d921cff4917a332410" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "81516251", + "checksum": "28fd9b47cfb0122dc1c51425e6aa0ba2" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "82570500", + "checksum": "d7af59bf5ee3dee7b18e39db3960c309" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "82570500", + "checksum": "e1d3bbe85a8edb74a2aad558951f18a6" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "79929018", + "checksum": "2c6ecddc293d2b1a4a4307ad31a9e1a6" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "79929018", + "checksum": "080d9cd9d79a6c5a3fa214eb73efbf00" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "80008445", + "checksum": "f099d116c2a7a83a879a1723dc048a51" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "80008445", + "checksum": "1d9ef2dd8d5aaa3d229102b0971246d6" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "80988507", + "checksum": "11dc8106c73f713acbb771ba9b1ab03b" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "80988507", + "checksum": "0de2bd42a152e4ef3a409bcd70e653f4" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "79751248", + "checksum": "0e17afda93144f9796fbfe9ab27ee248" + }, + { + "submitted_id": "1418708.180688.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180688.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "79751248", + "checksum": "6ea6c75383917ef682c2fe96d492c74a" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "19277207", + "checksum": "6031a7e34b69a24ca0da69c7b87977d8" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "19277207", + "checksum": "875ef27308b4b93531b956f19506a3ad" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "18828053", + "checksum": "90d3070ba6160b2ccf9bcedf6a170657" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "18828053", + "checksum": "da8c43f86eb3247a611e0ff377765efe" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "19342040", + "checksum": "4e81d315e04004345699a22487ceb143" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "19342040", + "checksum": "0b4555a43805c6b64d1ad9c12a953dc9" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "19369922", + "checksum": "ea0269b4005bae96cffac2c7acea57d1" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "19369922", + "checksum": "e97322167e51d7835852739902935330" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "19342131", + "checksum": "2e9ca4e845db7d2df37f791584a21dde" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "19342131", + "checksum": "e760f6047a9ff7987baf1e2630767432" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "18804826", + "checksum": "36af0ada765b7a1f9f27b1eb294eb1ca" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "18804826", + "checksum": "6b75165580017b20d9096ff95fb33b2b" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "18718925", + "checksum": "0579c1aa298602b009c86d2563350df3" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "18718925", + "checksum": "ea5016c9a5305e4e6b0400cf41b1f6be" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "17773515", + "checksum": "f000a53e68b3528443b1114bbf321650" + }, + { + "submitted_id": "1418708.180688.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180688.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "17773515", + "checksum": "6b4aa310e865d19f1f749cfa9fdf6ae8" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "20200109", + "checksum": "bcafc1b3c83be7f6be31117765742ae9" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "20200109", + "checksum": "cb70cc9c1a5d20124044b48e11984910" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "20784183", + "checksum": "c8785735a0b6876f7668782895169472" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "20784183", + "checksum": "fb9730287128662f1a8139bc748bad47" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "20750305", + "checksum": "2f9678e77dca01bf57d86eb37db66337" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "20750305", + "checksum": "3a0352f04d5e577375a6296ca4758a0f" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "20765703", + "checksum": "df83cd379c598864a1cce433d55cf0fe" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "20765703", + "checksum": "6114af95f460e45caa5059546358a330" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "20978367", + "checksum": "c2298062070e24d8297d5ccf2cd9a056" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "20978367", + "checksum": "56d73bb473294274f1a4d7905355f6d4" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "20998584", + "checksum": "9deff9381e8214d0908a90d237ae323a" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "20998584", + "checksum": "bcadb2dce00c38a5332840c5d9d35809" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "20966972", + "checksum": "bf1cfdb25f1289790384b35c5a56fa6b" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "20966972", + "checksum": "1c2bcb713b00e277df59467a678744c1" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "20781550", + "checksum": "48e909ddd645d4381674bebf14a22154" + }, + { + "submitted_id": "1418708.180689.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180689.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "20781550", + "checksum": "1575aceecbd6a846a0a19aee130cea07" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "88828178", + "checksum": "6cc73be3ac8e84d1e9799cbdbce3068d" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "88828178", + "checksum": "ae4c472080a76d343339004cb53cf50f" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "90721549", + "checksum": "a4e83f1561215aeccac3a2cb5aba7614" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "90721549", + "checksum": "ff6940d97d8f203b4870b8424e3520f6" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "88589715", + "checksum": "6f1c0c39541ac140726cd6c60a656602" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "88589715", + "checksum": "344332b331af39405d864fea7a00c2b3" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "89712349", + "checksum": "da5dc89878b10a24c1383a1e6b59cfdb" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "89712349", + "checksum": "1b150606470d816e2cbff3dd8fababda" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "87315279", + "checksum": "bf902dd628036f933850b96cc17195f6" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "87315279", + "checksum": "e07d2a48ffcd1f4d43ad781c5f3f8c41" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "87532904", + "checksum": "f7444a496a99140d6809eb49e3726730" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "87532904", + "checksum": "b385e9bbf866dc47d3c8200a4758333a" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "88633649", + "checksum": "2606b95a21946310b9b142bb2b1b6219" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "88633649", + "checksum": "9539848f89d44e7b5d01e0eae207aa33" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "87606671", + "checksum": "76c4544c7c28e8eff479d93767fe2dfa" + }, + { + "submitted_id": "1418708.180689.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180689.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "87606671", + "checksum": "79eb683234076ed95278ce229b6d3fb7" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "21523194", + "checksum": "3c976cd84e5198e7397866888d229e1a" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "21523194", + "checksum": "1e5081dbd0221fb91fd6c200c5268c8b" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "21032177", + "checksum": "eba7af034e99efbc8d93a239f1c4a8df" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "21032177", + "checksum": "9b82b8aa2ceddf4d53b62c073b7d8be3" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "21463274", + "checksum": "0e66fc8ce3fe6065a43f4a118f8a1ffb" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "21463274", + "checksum": "e590a5fc05db6aa0f1e824f81d02c540" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "21506407", + "checksum": "4f02ff82aea5e788c7f89393a9aa8060" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "21506407", + "checksum": "772ea039d01774bd7556fe3305562161" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "21501651", + "checksum": "58d67943be6ab7d9566cccb8b50f673a" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "21501651", + "checksum": "221db8237e6e1d39fa5a7fedef0d118f" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "21057151", + "checksum": "640d221756aebd5548344dc6cc5a8cda" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "21057151", + "checksum": "8c6ff1969606148bc82e3d203a7bbbcb" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "21150409", + "checksum": "be1b4083c48397497824458049b67b48" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "21150409", + "checksum": "3a110b5ff24ebfd3ea9910f86c920c5c" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "20398644", + "checksum": "9bb32bdd88f6282e56fdea7aa4add1e5" + }, + { + "submitted_id": "1418708.180689.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180689.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "20398644", + "checksum": "8f0653c2814cdf48954dfa82fe796ef9" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "22567166", + "checksum": "64ebb90d6986984150005e67abecb698" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "22567166", + "checksum": "4f332a6b8980456c1ed0fd4fb9fb1541" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "23042876", + "checksum": "67cfd5904f802a473fbe9db0173c8152" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "23042876", + "checksum": "2cfc30c22aef2249e8a1c590c89c50f6" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "22627676", + "checksum": "473ad5c3ffd2ab2280f95a1a81ea021b" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "22627676", + "checksum": "7077cb79b6ccb1f965ef52823718a561" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "22724720", + "checksum": "0f74ca0e3cabf660031d7f3d81b0bf02" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "22724720", + "checksum": "308e3e21081f58956cd30a1e4e73e0da" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "22721587", + "checksum": "060935421a27708f061020547535928f" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "22721587", + "checksum": "7a2e626a8ff9bbaab514dc3a67767353" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "22917094", + "checksum": "a6eb38c30551df3dc1da90de52350200" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "22917094", + "checksum": "8124d4bcd66f2c43e51b2e3333fabeb6" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "22930641", + "checksum": "626a5be57654071184d1d5d48d99940f" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "22930641", + "checksum": "e8d5538580eb0a77fa10351e87f1ee53" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "23086501", + "checksum": "74191206cda8b4a6783fc5617a729f03" + }, + { + "submitted_id": "1418708.180691.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180691.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "23086501", + "checksum": "65fb03037882bc4e11d633c0a85ca77f" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "98751680", + "checksum": "1821712b79a999e054c199581b4a8dbd" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "98751680", + "checksum": "5d48af7c3b72578c383a2def9f8700c4" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "99817705", + "checksum": "f7985e5bc034872f100ac9021a7ceefa" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "99817705", + "checksum": "4de698684e435cf0812f200e49fa5c0f" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "97051032", + "checksum": "66381d57d1f30f3d9902868a939a39f7" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "97051032", + "checksum": "40a9c8a650eb9c7b109468d537cdcb74" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "96917401", + "checksum": "219ae5139e7a25bce26b6df7fba45d8a" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "96917401", + "checksum": "cbf7bb8d2766c60db0a9c08361a71250" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "93061183", + "checksum": "8e7a455718a3a4cf0508abe46fe7118a" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "93061183", + "checksum": "a5762d424e48874b9f8472e18f2cfe9f" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "93661052", + "checksum": "bd16a7d2d870274e806ae3f8bcb63974" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "93661052", + "checksum": "3724abc493421fd7f7a858cc3259b81a" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "95893495", + "checksum": "8a24c03437a28fff263268c76699b3bc" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "95893495", + "checksum": "0c5989623ffca18271479a7d2d038ba5" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "96049590", + "checksum": "d6e46ce07cdb376fea7c32cf1933b02e" + }, + { + "submitted_id": "1418708.180691.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180691.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "96049590", + "checksum": "89b04afcca4d02722947512bd81f0c02" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "25436609", + "checksum": "88a6977eaa33bca66ebccae491f8f21f" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "25436609", + "checksum": "61d3bf265146a7fb7f0771fea35c98a8" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "24062615", + "checksum": "f93f6667671912e2b22f8473552dd0c3" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "24062615", + "checksum": "df229ed6f3ea1aeff6bfb16625f7e978" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "24116721", + "checksum": "38b20d680660f977d0db70276b3114cd" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "24116721", + "checksum": "8c2fd7d46aa7cfdd8c2e357e8e928fc4" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "24270367", + "checksum": "6ff4da91d77fdaee717acc4b28c942be" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "24270367", + "checksum": "966b2fe571dffa5efb82c34081276b4e" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "23903166", + "checksum": "b0f21180f21a008d973371d78e3a9bd4" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "23903166", + "checksum": "13fb680f1e83f7027db7cd0e40c7b49a" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "23199702", + "checksum": "de57b421f2cb0c97f5eaa2f28072fef5" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "23199702", + "checksum": "9f0cdf5c6b85545fd51acb9a5e56ed3b" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "23573313", + "checksum": "1338a899e483994a4e4ffed3a3f408d7" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "23573313", + "checksum": "a86f7819d754820c342aac172c3ca58b" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "23151154", + "checksum": "9773a659e52fb98d6e234874454fbdc5" + }, + { + "submitted_id": "1418708.180691.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180691.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "23151154", + "checksum": "4e8ead577bb24029af025b1776fa43a3" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "19146677", + "checksum": "9f0786ccec12931865dcde62f3770a91" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "19146677", + "checksum": "08f9ba3db70a2430a1607b72ee611f96" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "20013136", + "checksum": "7e43d7cccd2d5b2b1abeb2208c524421" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "20013136", + "checksum": "23db951ad0bb36041d5c41d8e0e80b54" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "19613030", + "checksum": "00cd5d821907e069abbe7cc92aa13184" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "19613030", + "checksum": "84352613957d0869ce307c9be4e46439" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "19612914", + "checksum": "0901341a7f7574a79f462e8b1639ca01" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "19612914", + "checksum": "b73cab703b6cac18c271bbfe48c90d7d" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "19670813", + "checksum": "fdbd41c041a6b785099d824e6b162c64" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "19670813", + "checksum": "ccc81c0d1f14087d1832e23f10283cb1" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "19688709", + "checksum": "6d660ba21781e54b98f7ca813d393355" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "19688709", + "checksum": "2a5127e6361f71aff5bf9a5f006a8afa" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "19736806", + "checksum": "b6227f710f94e96f29a36ab41874e551" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "19736806", + "checksum": "6c727475e6dc94995105f81571712030" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "19501711", + "checksum": "f8dc9e09f7b431118127034792ad7b25" + }, + { + "submitted_id": "1418708.180693.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180693.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "19501711", + "checksum": "15bd185549a8c6db3d653274a70b76e5" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "86060395", + "checksum": "06001f046fbffc74515ee19a2941b59a" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "86060395", + "checksum": "79c956b7ebd62602c9d47dec5e3c9b7b" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "87921796", + "checksum": "4308b83c411ce4978b5b0b3edacf67ea" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "87921796", + "checksum": "98923265d44770314c5b670d01c10122" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "84932098", + "checksum": "7b35e939753d0c756702dc323633571b" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "84932098", + "checksum": "670ca7eebd5cf41652690abaa0f9a934" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "86293350", + "checksum": "8f890d3218053481e195d1ade0669fdc" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "86293350", + "checksum": "6b4cda47e794c8c2d26b524da590c1cc" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "83343942", + "checksum": "399740a7286dc23ce3cbcf0705f5420b" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "83343942", + "checksum": "8fbbd04aa911cc23fb5b682a4ff00d58" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "84030160", + "checksum": "b09933b5f3841849dd9e640c378964eb" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "84030160", + "checksum": "4a7a25f417052f2e8a4c7582ce3264a3" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "84661519", + "checksum": "970c9b3d2b80299ebcb08d35a89eb862" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "84661519", + "checksum": "e86ffb692302432d820d1f2d600c7e2a" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "84689794", + "checksum": "3a42a3665e6660563ac9dbcbcaf17f82" + }, + { + "submitted_id": "1418708.180693.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180693.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "84689794", + "checksum": "fcb1b45f67d874a44f4461ed9d4255a3" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "20614435", + "checksum": "76f2a3f9b66393bdaaf420ae902b7591" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "20614435", + "checksum": "a6c6ca099db731f01b2ffb62e7d11c7b" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "19668398", + "checksum": "c92261da7517f1f88fa5e3f616d8268f" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "19668398", + "checksum": "509884091d703558e453b4093f22ca53" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "20175033", + "checksum": "ea429fcce825d47f93e263a403e23da8" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "20175033", + "checksum": "c1228ed7d5c639906085db7c253bee35" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "20060510", + "checksum": "74cf129f6c83a18d2fd13f599ec737a2" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "20060510", + "checksum": "7ce875172237d0744eb418355bdba68f" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "20022835", + "checksum": "2af22575adaa5b4eb885c27787f66c49" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "20022835", + "checksum": "2197ad6c15e68851150545e33bc5d574" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "19567041", + "checksum": "67d044badddb023367ea26467b603e90" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "19567041", + "checksum": "6083761327b983a6ce7b17746ba8dd59" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "19339463", + "checksum": "58f32f2a4efa2d38539a62389279e8de" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "19339463", + "checksum": "dfcf82d13c2dbbe58bee81932a007c97" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "18422140", + "checksum": "a93833f0ba1e2dfe091a7e946ae0c42e" + }, + { + "submitted_id": "1418708.180693.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180693.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "18422140", + "checksum": "170851d41945e80aa53d439c62f9cd8e" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "13290918", + "checksum": "62e360b5bc167f63ce5b1dabf7e1436b" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "13290918", + "checksum": "88548b3187318918ef1f5f53c9246962" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "13645141", + "checksum": "8433abf6a7455a389f72ba515a9874b8" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "13645141", + "checksum": "f563d82a4b8af1ed57bb718b2c8abd66" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "13425361", + "checksum": "5d5d6e62bcd2c7db1a541aeef8ad4ea7" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "13425361", + "checksum": "1d4744db2d32542400f073096ec22826" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "13466366", + "checksum": "e526581683265f15f4ccdb41490ac061" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "13466366", + "checksum": "350af4a13ba78381c11cc13e9a5bb31c" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "13480704", + "checksum": "ee4201bb5f10c1bf537e598b8f8efa88" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "13480704", + "checksum": "c30936df6f132fecd83319c3874c917e" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "13538608", + "checksum": "7d84085ea80b91bd481cb41b0359c564" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "13538608", + "checksum": "cb6681368f694ce4b7eadaf623d558fc" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "13554150", + "checksum": "b12f461550e65553c55b7b2c07accdff" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "13554150", + "checksum": "871a3c3ccf290fc5c607cbc8683ca8fe" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "13498586", + "checksum": "96c8fa86a5d0572911668b85930240e8" + }, + { + "submitted_id": "1418708.180695.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.180695.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "13498586", + "checksum": "be7cc05cd79efd66ab02a81888d47017" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.1.1.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.1.1.fastq.gz", + "sequenced_read_count": "60885089", + "checksum": "c832637bf848434f63f4d6dce93e2559" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.1.2.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.1.2.fastq.gz", + "sequenced_read_count": "60885089", + "checksum": "041095e25610bc7513404dddc93fb2bc" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.2.1.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.2.1.fastq.gz", + "sequenced_read_count": "62022732", + "checksum": "3b2be01e57d40f9051f35c178d461614" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.2.2.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.2.2.fastq.gz", + "sequenced_read_count": "62022732", + "checksum": "151f8934f051d8f666cec6e15c8eeda8" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.3.1.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.3.1.fastq.gz", + "sequenced_read_count": "60094465", + "checksum": "4284bbb81ba71bf7b399471cbf098a9e" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.3.2.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.3.2.fastq.gz", + "sequenced_read_count": "60094465", + "checksum": "991b5d319132062657d61008cba5c0eb" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.4.1.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.4.1.fastq.gz", + "sequenced_read_count": "60176368", + "checksum": "23fbbfd629b9adb520f9f8c71dccd2ca" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.4.2.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.4.2.fastq.gz", + "sequenced_read_count": "60176368", + "checksum": "2d41ceb6eaa0f1ad4fd628852d68f3b2" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.5.1.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.5.1.fastq.gz", + "sequenced_read_count": "56928236", + "checksum": "c0a0e8a41ca1b2fd1feb9c199d7af3e1" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.5.2.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.5.2.fastq.gz", + "sequenced_read_count": "56928236", + "checksum": "7a2abb021e806446a2673ab7ea149280" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.6.1.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.6.1.fastq.gz", + "sequenced_read_count": "57353601", + "checksum": "d6e1d992f24f16f54a76255adfa07a1a" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.6.2.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.6.2.fastq.gz", + "sequenced_read_count": "57353601", + "checksum": "60030e65f7d1f0e75bbaa644723697db" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.7.1.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.7.1.fastq.gz", + "sequenced_read_count": "58782878", + "checksum": "348edb9abd49c3f7e7deced3c9a12f4f" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.7.2.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.7.2.fastq.gz", + "sequenced_read_count": "58782878", + "checksum": "73d3e383728a1c817700ceceacf3eebf" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.8.1.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.8.1.fastq.gz", + "sequenced_read_count": "58666615", + "checksum": "9aedcd058eb636f82e780e4685c9290d" + }, + { + "submitted_id": "1418708.180695.227CWJLT3.8.2.fastq.gz", + "file_name": "1418708.180695.227CWJLT3.8.2.fastq.gz", + "sequenced_read_count": "58666615", + "checksum": "60597a1f488ccd62675a492432bd4ca5" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "14798927", + "checksum": "83b66a9e345ecb7ffa354f346c3be31e" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "14798927", + "checksum": "d6027d94d19422934cc16c55a686687f" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "14140030", + "checksum": "bcce805ccac74d9dd4d8a4f0374b18e5" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "14140030", + "checksum": "b2fc8867f93d448f74902ca58273fd90" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "14152979", + "checksum": "b4e6bd20501bdb7a870f4de4b7739d19" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "14152979", + "checksum": "5c942818b763096b6f53ce6194bd641c" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "14329307", + "checksum": "67f472e96dc437e2facb019e0a6c2ee9" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "14329307", + "checksum": "08501e65de5e55c9b6d79ebb8283149f" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "14022592", + "checksum": "3d5e4725344995e2d7d58dbaa9773ac7" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "14022592", + "checksum": "6bde454697534770f55dd5b589b6f8ca" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "13427724", + "checksum": "692bee063085abd245883ea6312fed69" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "13427724", + "checksum": "f7cdb0b9a08ac220b08faced43d90c18" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "13557711", + "checksum": "a96e509d31ef11e4e706f7e5f2cafef1" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "13557711", + "checksum": "6202e051be64de81fe2988a1abefb837" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "13123729", + "checksum": "ca67a77790f7156fe9f90edb660b2c0f" + }, + { + "submitted_id": "1418708.180695.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.180695.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "13123729", + "checksum": "5235315ff24bd98f62a67fd091a50da5" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "56892484", + "checksum": "beb682188fa8ff43003e243d791066c4" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "56892484", + "checksum": "5602a299613bd5eb0d5d0136931eb636" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "58742398", + "checksum": "fa7736e3f27052c24a4f305a5c9f59d8" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "58742398", + "checksum": "dd35697ec80553299a7b8a3eaa335a31" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "58118171", + "checksum": "ce691ccf0b3c95d51dda1e0a568df725" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "58118171", + "checksum": "67689a397a17de2fac17038aea9fb78f" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "58101457", + "checksum": "7492a599dee1f3a545d4e046275d4942" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "58101457", + "checksum": "55bd2ac1a695f85d252a0e70527e7eb2" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "58374340", + "checksum": "cd5ef610af9e13cd8c5b0ff27c9b6e5c" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "58374340", + "checksum": "7f64c903c9c6668d321f29f217c4b448" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "58335627", + "checksum": "0f0522e11e2d8c3836d595651ea1ca3c" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "58335627", + "checksum": "9a519d51dfd014322e87021887f7d961" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "58395974", + "checksum": "3c429bb3a480418bb565d3482102801b" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "58395974", + "checksum": "abd6a98b214a918d6beeba68c128f55a" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "57590495", + "checksum": "8e97f3fb67c3c7f598c28d17a833d7d9" + }, + { + "submitted_id": "1418708.181807.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181807.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "57590495", + "checksum": "97edee068de3858cac295e8be2df93f2" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "61437509", + "checksum": "2c5367bdf539fdda6289057e321c9436" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "61437509", + "checksum": "171e8d7a87d27c1dfd20d9b2711f3bf6" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "59251200", + "checksum": "f4c83b9b2268ae7b5c6c30509cc48d82" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "59251200", + "checksum": "088a364f6284e7542b15b5c4c7476495" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "60558509", + "checksum": "3fb707732c1d83461effbb983240f2ed" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "60558509", + "checksum": "9dcb0d2f4c3d2e74a02742f6e699e47d" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "60359412", + "checksum": "7c62ab72c10ff9423610820f7ccedf9c" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "60359412", + "checksum": "0c685eeab21b56cc69e68446e3bed323" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "60364045", + "checksum": "eb2ebeb06567c7f1d65e5d15504582e0" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "60364045", + "checksum": "b150ba24074ea9a1cb1bf99f6e925bac" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "58773316", + "checksum": "e54e9cc8a66447741059c2294e03fae1" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "58773316", + "checksum": "18da7c15fc3ce9eb01a5f640390d3c63" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "58392931", + "checksum": "93db6b9f8db5171e11853482a6056129" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "58392931", + "checksum": "bc1da9b5bbea2a118a677409fe1cdfec" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "55913454", + "checksum": "98dad431840339ac8a0ec343663977ce" + }, + { + "submitted_id": "1418708.181807.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181807.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "55913454", + "checksum": "b72e7969b93ab713607fc1e70fabe675" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "44136110", + "checksum": "e5741a4173e95fcf10cdb31cb21bb158" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "44136110", + "checksum": "98a1e8f13d633ea565b1be725175141d" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "45762993", + "checksum": "e202e2a23250512ebfaa115096a3792f" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "45762993", + "checksum": "863e56bac23a51dd61e0b1a18994e8e6" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "45336786", + "checksum": "31e661f3ab820b4599898ae1090d743b" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "45336786", + "checksum": "836173a5a0dc34791c0a929d4488684e" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "45257140", + "checksum": "48a134ef5a8db133c83d8825c8e87995" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "45257140", + "checksum": "aa4de70f6a2c1c5eb98289604539a37c" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "45368576", + "checksum": "f4a4717c707b00a6001cee04db240b6c" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "45368576", + "checksum": "3a5d812855b99f24ffba4834ad5a5ddc" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "45421486", + "checksum": "9cf9938895497e0cec5b7e90f7a24f53" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "45421486", + "checksum": "26b5f72676121ac7923faf277b5b4d36" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "45503125", + "checksum": "7eda21cf892b61ba701268b684c28172" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "45503125", + "checksum": "7bc90c71f6c856b7142fe6da7b765118" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "44981958", + "checksum": "be3eedbd93b359a5f85726f4e87467a4" + }, + { + "submitted_id": "1418708.181808.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181808.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "44981958", + "checksum": "7382e4ac0bd76d724903698a0545b8a2" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "47119352", + "checksum": "d44c0157cd7bca5f2a315a4c8857eaa7" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "47119352", + "checksum": "5510218fbe89bfaa0bade063203921fc" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "45601400", + "checksum": "1f31211442dcd4c317fb037be71087b9" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "45601400", + "checksum": "4c2f0216e5eef8be32ac51336495f1f3" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "46626048", + "checksum": "d4fa9abccefb4055117dea94e44fd97c" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "46626048", + "checksum": "c742ae4fc0040041fac70655b848597f" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "46555984", + "checksum": "e190c40d22061156839bd983e4ab6528" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "46555984", + "checksum": "501d7a289149eeba752c6250365991e6" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "46636014", + "checksum": "adec7e2dcf67d79707567533a32e328c" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "46636014", + "checksum": "da458feded2857712d7fb567ae5e8a71" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "45595795", + "checksum": "c246ad7ba798e2cb5bd584c353198c6a" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "45595795", + "checksum": "34eb205f677a832cfc186db3803213f9" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "45566656", + "checksum": "9fb804f997708df14e8caf2c0a0bc9f3" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "45566656", + "checksum": "5719a97eaa97e872d9c07eb5607970fc" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "43894764", + "checksum": "d445a4948dc02e4873b0544364cd81e5" + }, + { + "submitted_id": "1418708.181808.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181808.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "43894764", + "checksum": "9a2b77ee0f7e3ba15be6c39da5194f04" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "63675023", + "checksum": "273283ffabda81079e546106631e190c" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "63675023", + "checksum": "c90214fbca53b04545df48661278918c" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "66413037", + "checksum": "939fd25f8d4d068db56331d17f9392c5" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "66413037", + "checksum": "adac5103d88c6ecf8cf562399496e0c6" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "66565006", + "checksum": "c1b3981726cbc4c77c06a378615b6a0b" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "66565006", + "checksum": "156942763432418fcb3044394752acba" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "66583959", + "checksum": "3e502917c2d39b57c1c9b3f154e64e17" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "66583959", + "checksum": "09fa468f7a3c167999519ab3a4fbed98" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "67692216", + "checksum": "e6dd4ed148a96699b905b4c30bb399c7" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "67692216", + "checksum": "ebabfee92a729e0ce601d0ce593697dd" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "67703420", + "checksum": "c5bd144830e2bd0937de1f7e1f331061" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "67703420", + "checksum": "3ef42a77d26c5d0e32073d7807520d57" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "68314624", + "checksum": "335bf5e34ab2b5d7a2d6c9a8fc393c68" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "68314624", + "checksum": "7a52e087972ff8890c785b173ce21e2a" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "67512075", + "checksum": "02adbda2d52b45235e34f4557b88ed97" + }, + { + "submitted_id": "1418708.181809.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181809.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "67512075", + "checksum": "7dfd4211a44454a4c5a03268852714ae" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "69538810", + "checksum": "0f11158a13273f7835148d1991a9806e" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "69538810", + "checksum": "d0e11f670aad3657a3e054773482218b" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "67485402", + "checksum": "97af58dc18c829042fcdfe7ee73f8367" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "67485402", + "checksum": "0fe1a27ba53b044903e59e68dd578455" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "69485984", + "checksum": "89ce5e0beb1aacce5efc6621fbbabba7" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "69485984", + "checksum": "0a7889130ce9b68f61d7edd4e996a92d" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "68634268", + "checksum": "d88b48cd9587433590261abdb48a5649" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "68634268", + "checksum": "10bd25abb7eacc0d770ecffacc804d6a" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "69304475", + "checksum": "d8562974bdbc441c0da67c73d3b1263b" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "69304475", + "checksum": "7a66af94677dc47618a622d53bff1650" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "67134389", + "checksum": "11ed0036b1a6f51f6b294839f168ac46" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "67134389", + "checksum": "44b0ef9deda55a645acfc4dfe5d40923" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "65929389", + "checksum": "f219d0592b749dd6e8da1d817edc90e7" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "65929389", + "checksum": "d5d421afbc3b8fc11d664eb023188d77" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "62691019", + "checksum": "35c26689e740e9be78c9621314bf3a31" + }, + { + "submitted_id": "1418708.181809.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181809.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "62691019", + "checksum": "c406a467b1c2a2e23ba90b6514f8b4b1" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "81128163", + "checksum": "66e85f3061bdcb136783f60a39a911f0" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "81128163", + "checksum": "9ca61a4f2a1fa2eb418185f93cf623df" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "83966100", + "checksum": "5e75ad390e34d02c250c14895ab45820" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "83966100", + "checksum": "4d989a19d6ed538c34648d7cce001f63" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "82471989", + "checksum": "4fdf725dbaa9a04191d57d1e3769fdc7" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "82471989", + "checksum": "bb236b82194f3c184affc4804383d1a8" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "82782204", + "checksum": "871b71d5e3e79c7a2f1e8f4ee31795ed" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "82782204", + "checksum": "ef4898e553c5eb8efc559932b7554cf9" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "82743136", + "checksum": "a307be8ce94e1a49297403ba4f64fce4" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "82743136", + "checksum": "592f296400fa1623f7bcae7b0977b803" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "82720316", + "checksum": "c2995fc766f79cd9144534fe1f44a43b" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "82720316", + "checksum": "96aa003f1a0455b8a6e3736c120f0c20" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "83497474", + "checksum": "317e0593d5b98436ae6a1d81730fdae2" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "83497474", + "checksum": "889396f7c823db83e32a6eb4e33171a9" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "82642710", + "checksum": "6152988e328b873361f2ccba6f22587a" + }, + { + "submitted_id": "1418708.181810.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181810.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "82642710", + "checksum": "03f92fba1e24c842c2276e74f8f114e7" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "87818815", + "checksum": "7d5ccf8c634c46f247e2bb4698d9afd9" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "87818815", + "checksum": "f972ecf294a381e4c19d7fcb164cb6ab" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "83802962", + "checksum": "2e9e62b10935659bbc6c861a1784b1a9" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "83802962", + "checksum": "f6c1b6f2b2524eb80affac7f86ec7bfe" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "85179582", + "checksum": "efcadb31c6b40c43ced4b993a07080e7" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "85179582", + "checksum": "688ad77ddabf8eed2262c86522185103" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "84631699", + "checksum": "b5f184555bf208d25952a3e2cb2f5d44" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "84631699", + "checksum": "fe53b691bed0e628626505accd191d2a" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "84366454", + "checksum": "5fcd53489fd60947a19ce5e82a9eebc5" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "84366454", + "checksum": "16ada9f83c54c565abd3a51cada2293d" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "81619323", + "checksum": "7b8b450888d74728a6d9fb4ba53a55b0" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "81619323", + "checksum": "29e2c5988883c073cdc49f7794f3e9a1" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "81032107", + "checksum": "415c621e8832a49f40192f8b6556b7c3" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "81032107", + "checksum": "5030a927f872fd9cdf7f2a4e1c32bcf5" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "78320487", + "checksum": "d718b6e34656e74fda26252fe25510f2" + }, + { + "submitted_id": "1418708.181810.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181810.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "78320487", + "checksum": "7810999a1b94c0cd2926215ebf290f0f" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "63541553", + "checksum": "d154d237bd2856b58794998755dc2df8" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "63541553", + "checksum": "c8346b2dc7d874909ea25be2deadc5d3" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "64495795", + "checksum": "964edf27beaa4fe5a94026298f32b893" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "64495795", + "checksum": "3a66da0b606decd8f64f76072fab0876" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "63910598", + "checksum": "aef773aad2a0c4b3a90fc7e92ed06675" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "63910598", + "checksum": "42c73d470301ec3338643871eee00037" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "64024900", + "checksum": "7cd6a3468ac15c08d24e473e794b06d9" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "64024900", + "checksum": "d858a1db87367e3332e93bb8f1699fa3" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "64762626", + "checksum": "a1bd734332d48b8ffeabdeed2fa1de91" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "64762626", + "checksum": "b5079949b5b064f5331c56e9765b5bbf" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "64801719", + "checksum": "6d782f7c47334fb634f032061f4ba60a" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "64801719", + "checksum": "1bd666f0d9e39aa3e842de272dfe9f56" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "64640182", + "checksum": "ca1c75c7f6bab9459c412d4f243819df" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "64640182", + "checksum": "7669d508db3abad35d5a49c0e1b97e83" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "64380733", + "checksum": "58c9ce8fc755b067b2bb280f0840e05a" + }, + { + "submitted_id": "1418708.181811.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181811.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "64380733", + "checksum": "5645bac3641d2d39c9dcba5b7e7485cb" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "69013133", + "checksum": "0900ca65c583ff63d865667ec5471b00" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "69013133", + "checksum": "c115b616eb94fc00e1cc68e15283daad" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "66074971", + "checksum": "a4cfbedff87a6a15f273d304f2a89e9d" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "66074971", + "checksum": "b80aed2940e722f8be4a32e7aa86d8af" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "66669828", + "checksum": "a110eb20fced4cd71ff7a5ebd83898f1" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "66669828", + "checksum": "45d2d46e8aaac6b74f3f438ce77ced74" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "67641145", + "checksum": "537793cf2e05e07019c8e995471e0fc7" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "67641145", + "checksum": "286081466ec47d15f4dd46363c41be3b" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "66488822", + "checksum": "436e574014a0523964f0009ecce0166d" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "66488822", + "checksum": "d057bf014dc667fd050de8c02dd4bc22" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "64781109", + "checksum": "db96839979f00231e974c5d18515bb76" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "64781109", + "checksum": "400724b85575b68c2481f3e007bb8854" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "65717399", + "checksum": "17286da9d19270b227ea52d65d936854" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "65717399", + "checksum": "48bde4c75064d96bf7d3b39e31bd19cd" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "63683654", + "checksum": "40ff0856a3d425246bf19f849e831e1d" + }, + { + "submitted_id": "1418708.181811.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181811.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "63683654", + "checksum": "6847a7b3d7f22c1a5195d5b7cc8deb31" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "75469909", + "checksum": "7a0e9c053b728e656a88914dde4a214e" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "75469909", + "checksum": "b2eb103c6180579a543833ae6229fbb8" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "77292906", + "checksum": "52227cf42f49677449fdcb9f6f15aa01" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "77292906", + "checksum": "d53019338fc6d90679f056d530c552e0" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "77143544", + "checksum": "3f2e430489d373549852eb3a7e580ade" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "77143544", + "checksum": "fd2fdcf51294a9d955bb1da62a5cc226" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "77147935", + "checksum": "a70d5a5cebcd1ec7c228a88777c8ba17" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "77147935", + "checksum": "00d5262e1969ce7f41f70d75ed8d500b" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "77330239", + "checksum": "458d5fcf478005fe965566f67d271fcf" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "77330239", + "checksum": "d371480821e8ecd90aba4d8cabb157ea" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "77461827", + "checksum": "20c2a69e7ddd9dd79afd26bd8656307b" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "77461827", + "checksum": "95fd6101778b6683332c90dfb7ed0799" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "77697305", + "checksum": "18e8a63f0834fae6656f6637e7b7c841" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "77697305", + "checksum": "60a5af29da78d8eabd5ee91c3fa7b204" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "77037178", + "checksum": "6d881d39c6d5c41ba668a65d1f5cab72" + }, + { + "submitted_id": "1418708.181812.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181812.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "77037178", + "checksum": "f2c163f33214058aba1dc64228d8944b" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "81053872", + "checksum": "dbcf4d9917d0489d24b190364d81bd41" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "81053872", + "checksum": "3c80a769be7bdde69a58200c2a17d8f6" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "78744617", + "checksum": "e09237db7cbc2e1b93d277acef51d586" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "78744617", + "checksum": "ea9578896c6001d349902202e818d492" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "79780069", + "checksum": "a1405fe577abffce76ff1256e521ccd4" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "79780069", + "checksum": "d3640666d1fd6455699b0b0364e3592a" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "79824907", + "checksum": "b5e2c897532d79bce20e2da48e824f48" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "79824907", + "checksum": "61017cb74447b4f7da4790f52e01c1f1" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "79245497", + "checksum": "aed0e02585cc255231f24a237d878a47" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "79245497", + "checksum": "3a9225fd1ca643ce9b96f18f1bd93c6b" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "77487492", + "checksum": "cfe5b014173d8ccc957119f60a390f5b" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "77487492", + "checksum": "a3ac8048c7360edf810cc02b2731648b" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "77539533", + "checksum": "5f01de49fe61fbd7fe6240153573895a" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "77539533", + "checksum": "a70a9aeb8d6a8dd3d22cf64e02206eea" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "75117619", + "checksum": "c4b08f68d8f911ef8517ccff29347a8b" + }, + { + "submitted_id": "1418708.181812.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181812.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "75117619", + "checksum": "aca6cd216a10a671d71026bc09a78754" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "59733199", + "checksum": "455a033b66a3f6787b2a2d2a79a1312c" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "59733199", + "checksum": "11d9274bc59e0e80a2571860d8a0722a" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "62326109", + "checksum": "593181bc93cefdc620c5e8f176a94015" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "62326109", + "checksum": "9f3a074c13c7ea28137ce27d7e00a33e" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "61911621", + "checksum": "42f416b20c21cf4d276cd0e09f2d8336" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "61911621", + "checksum": "5834523b93aade61d68a66c78c443cc6" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "61849204", + "checksum": "1086b6cebfa79a7a9dd6b0fee8a459e1" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "61849204", + "checksum": "938ab78cf45c2519b2c5c9afc41b902d" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "62088632", + "checksum": "c938cd8199553b83adc958f1fcd52c50" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "62088632", + "checksum": "c55682b56997c3803488986bd738f2df" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "62111179", + "checksum": "a2c4c107405afc000e55b82bf3cc6964" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "62111179", + "checksum": "78c2077a14287d6105742a4df73b2905" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "62261389", + "checksum": "65e087d539b6a28f877726f409c845c1" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "62261389", + "checksum": "c8e787a0d88259744b30bf1728048370" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "61311013", + "checksum": "dcc5380c8a0e30b68c60e755865fce63" + }, + { + "submitted_id": "1418708.181813.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181813.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "61311013", + "checksum": "0876bea80ac4217338b09b3c0ae0c563" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "63162352", + "checksum": "ef72de1647115c1ef7592149bc554b7e" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "63162352", + "checksum": "0d16c8febbe721bafe281cc0ed731757" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "61394108", + "checksum": "cdf41171d3257997e0c484cd48c040e8" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "61394108", + "checksum": "1169adcc2f988b5a1e02b9c67eddacf0" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "62988601", + "checksum": "2db24df09cca10c378a9eb6cc761b26b" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "62988601", + "checksum": "696c69305baa591a3dffadc0d2af4f0e" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "62767081", + "checksum": "ea79fc42f3ba3c52c599238a8763da84" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "62767081", + "checksum": "caf17ec199e4236978e2a065b72cbd11" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "62877906", + "checksum": "102bdbd79a688e2c45724d69c2c65abe" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "62877906", + "checksum": "83ea036e8f40fbe9a6faf8b93839141c" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "61831006", + "checksum": "400c5908642d3948ef8937b58af0db27" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "61831006", + "checksum": "8effffc37a4a43daaa370c50a5954575" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "61260206", + "checksum": "574e690e32ac224d1a5dda89af422f1a" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "61260206", + "checksum": "240f784518634c52187023970c019ef9" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "58648128", + "checksum": "27ce045b63d100008d81857ef5ea257e" + }, + { + "submitted_id": "1418708.181813.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181813.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "58648128", + "checksum": "9774a38bd238b738d7736d29733ed2dc" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "69420704", + "checksum": "e980dabb2e0fabeb9224db5a97fbc926" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "69420704", + "checksum": "c7953a2b0e9cece77d0913876036f5a7" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "72073449", + "checksum": "94e733386786835d232892bd573edf96" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "72073449", + "checksum": "58e539b7e169f17bd104e51fee5c36e2" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "70979632", + "checksum": "25796f06afcc0cb9640180992992198a" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "70979632", + "checksum": "b7dcad810e22ba7a2f35d8a59f147ee6" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "70891415", + "checksum": "b6462b5b316488d8e697f914393aa832" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "70891415", + "checksum": "87480f33f5e686f05cf91778ae7f3707" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "71189864", + "checksum": "dbdff0777901739a282adeb625973152" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "71189864", + "checksum": "210d94d0fbd618e63602a5ccbed2c370" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "71287222", + "checksum": "a36aaea48c945de7c4cd1c9f9ae3f0c9" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "71287222", + "checksum": "c013788aab92491dc0403cdb53ee9e4d" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "71407857", + "checksum": "39854786f13342f5fc5b411c64bdc249" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "71407857", + "checksum": "268b720613334235edb0ac7198627947" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "70669204", + "checksum": "3dea41432bd852c4c6f2a19cdb28d662" + }, + { + "submitted_id": "1418708.181814.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181814.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "70669204", + "checksum": "beb98b28961301d4656ab9a7ed261a07" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "75391545", + "checksum": "bdbafdf5cce42725eabd5e7bebea9ce0" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "75391545", + "checksum": "341355ccdd8865ab8b0b4898abd133d5" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "72075239", + "checksum": "5dee732dbf889131bf6570dd88404bc5" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "72075239", + "checksum": "73532ec9f6cca52680b68357b05705c1" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "73802781", + "checksum": "21e6f2f37f02227cffa9d5f70b72a5bc" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "73802781", + "checksum": "8b3cc1b06b4150c6b7bd124c2d1eb042" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "73547764", + "checksum": "6cf21867849134ab9f608e952ccf45e1" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "73547764", + "checksum": "60f83433e2b64cceee792ec6aca70bf6" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "73320127", + "checksum": "c8b5244b56baa8bfa71a7260ee37ecb3" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "73320127", + "checksum": "77882c80b5a15d126a762bdc3d6dedb2" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "71332232", + "checksum": "f8e2e572ccfb05c482bbbd5a11756deb" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "71332232", + "checksum": "0fa3155be3d4a549fdcbf679bf5d3cc0" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "70706730", + "checksum": "76b2d2262bc9379f9c21151879e32d88" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "70706730", + "checksum": "f2bb343eea5f17658236ec01104ca3e0" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "67887386", + "checksum": "314534383b495763ca15fea2bfcedf8d" + }, + { + "submitted_id": "1418708.181814.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181814.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "67887386", + "checksum": "320ad91e9787628e00192a3b1c3f5aa8" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "47435435", + "checksum": "38d394a1cf2e4a62ed7897a3bbcc181e" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "47435435", + "checksum": "87b88cd636d4800f8a868c830c1b76e5" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "48686322", + "checksum": "1d0d02444a1d353affd6615629d0ccaa" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "48686322", + "checksum": "07a9114318e701e0aa233ffd8aef8d65" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "49597945", + "checksum": "ea0f937123ff7cf68c58020660d88403" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "49597945", + "checksum": "b3493c725d693a12a6552aabe842bae8" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "49567097", + "checksum": "9aac629171539d7c0fe78c0e7b95cbc0" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "49567097", + "checksum": "0cc22be12f7c16d7d20b66ea6bf87d1a" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "50073624", + "checksum": "63d8a1da26f7ac58e9e8aa2ebd6334f0" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "50073624", + "checksum": "ab79557ba9bd5fb6c28bd391d13a07b1" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "50241211", + "checksum": "c3682f94aabc8bdcb6146fa885a1da9b" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "50241211", + "checksum": "9b88842751e1501bee94aec190494684" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "50356935", + "checksum": "b1d41917fbc77e748d7faa3297d8f11d" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "50356935", + "checksum": "0e7a3ccede277e7ae15bdbc999199492" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "49820044", + "checksum": "d2fa4017e155754c6c98d67df5758909" + }, + { + "submitted_id": "1418708.181815.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181815.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "49820044", + "checksum": "268906d8d87d1f24e5d8437c1fb2edf8" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "50474297", + "checksum": "38293d94b60fe155739806501b95d055" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "50474297", + "checksum": "573412c425764a77ac49e1c2bb9b5581" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "50267564", + "checksum": "d3ab6fddaf1ed693e6096112ae6f8a9b" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "50267564", + "checksum": "62bfeb1594325e85fe84b2c42dc9b3a7" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "50992546", + "checksum": "20af2f1283e465ce344b3e8e2c05ee13" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "50992546", + "checksum": "1cc7f44430c400d6177f99188b74154a" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "51018839", + "checksum": "c4e299f5af1f20ddcc73ea646d7c18e6" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "51018839", + "checksum": "8ab61e6a0ba681dd4172e21dfbcfdaee" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "50651536", + "checksum": "ef869a33c38f775ca66cffcf76c03de3" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "50651536", + "checksum": "0681db09d8272e0a75401bdc55e2092a" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "49500563", + "checksum": "bea8fa4cc072ec50aafde6a15de7d855" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "49500563", + "checksum": "5e88ad019ba20bad0990285fb7743541" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "49377781", + "checksum": "f0d17632b048735a0b67d6802014c403" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "49377781", + "checksum": "b62f1451ea9f1604a857bbfce2021d50" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "47587495", + "checksum": "8031fef976245da8fe44a90c54578e89" + }, + { + "submitted_id": "1418708.181815.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181815.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "47587495", + "checksum": "1727dc21a7c5ab5d48521ee2bb22cb25" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "74767522", + "checksum": "9708985f70f522745e5a31fe775d165a" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "74767522", + "checksum": "f0fa3b4bab782c8bc601fe8fc663f1ca" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "75530604", + "checksum": "108392440fcacf263927781601089c97" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "75530604", + "checksum": "f6141789bdce915da645e7f1442db1d8" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "75164131", + "checksum": "be63efd22228366c349807accd1d0ea5" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "75164131", + "checksum": "fd1ed7310b6493ff56ca93a5a2ef83ce" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "75589951", + "checksum": "640172b3ad31775b46e65f196ae43d32" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "75589951", + "checksum": "16173178a3a39809303f0cc5387095ec" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "76095190", + "checksum": "68adb720291f1f17c6a595e2ee4b66ff" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "76095190", + "checksum": "e0ff634fe3c67b790e823b595fa480d4" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "76523851", + "checksum": "d331dfff8150a73843fab76408a72339" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "76523851", + "checksum": "be98131dcb7bcc3ca62c3e49ef70b8f5" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "76316515", + "checksum": "145363b314407488e69f7724bec54202" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "76316515", + "checksum": "8b55cc79a2797425cce0db11f053f1c2" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "76285890", + "checksum": "32578122f9003337a7b0be3597b75584" + }, + { + "submitted_id": "1418708.181817.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181817.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "76285890", + "checksum": "62566d531b005452f5b265c4a0f3aa43" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "82249865", + "checksum": "e6d0059b845866c63002646d57b2f1a6" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "82249865", + "checksum": "c3729362f5a7c812c2e4297b2b615757" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "79833316", + "checksum": "0eb1e0c4c39d88442757aba1c3e05755" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "79833316", + "checksum": "ccf25703ffd134a2cfd109e0a70ab25b" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "79960691", + "checksum": "1fda1a2008e33eeba6343f75846bbdf2" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "79960691", + "checksum": "4e80540250daa10af91155e3d041f102" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "80832988", + "checksum": "c9f1786de7f07bc9f22281a77f6fb901" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "80832988", + "checksum": "76ac4009ad953cbdd9b54eccbe0be7b0" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "79206119", + "checksum": "8e823805f00bc6fae244570617c607a0" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "79206119", + "checksum": "6e1e7dbadf8009be0e674187e0a645bb" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "76505041", + "checksum": "2cb8d4bc517623a5434f21093a66b111" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "76505041", + "checksum": "2bad9353c2be8c07d4e649f89e13ff02" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "77872125", + "checksum": "0915327301fa12bf89546e670e680af0" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "77872125", + "checksum": "34cd095d75e15811414dde4668d9b82d" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "76127084", + "checksum": "3a52b91834a0d0be9476e44d07c9b3a9" + }, + { + "submitted_id": "1418708.181817.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181817.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "76127084", + "checksum": "0688b90e003a29c78668936c3ebedd8f" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "71695595", + "checksum": "9aa0935b895fc8c2c535699860ba479d" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "71695595", + "checksum": "e8b4e58bd8d6aa42964db231fe3c432f" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "74661058", + "checksum": "6f035118aed0f795e9819e241b802b25" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "74661058", + "checksum": "6e91568151f7d0176c17152b3f091c2e" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "73442318", + "checksum": "b15799ff82de001b9b738604a925885a" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "73442318", + "checksum": "b2c24410a86cec0693232e80c155a57a" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "73406894", + "checksum": "e5975383a5ca009ed0362a72d4bd2bb6" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "73406894", + "checksum": "2153eb30781cc7e67d0afa308e36d5e8" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "73703110", + "checksum": "b37e7e2d3026a39e1e23d41687fbe238" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "73703110", + "checksum": "1df52f427641ffe23a7cb2606aa8619c" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "73746485", + "checksum": "3aae44668ea8231b76a1cafab35f263d" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "73746485", + "checksum": "08272e750478eeaba98d04a4e7238919" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "73869210", + "checksum": "109427e3d7930b10246c474c203f2957" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "73869210", + "checksum": "443f2b60aafb7058ab035715eb1fe8f4" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "72879699", + "checksum": "0b9ecaa440c77123b19236bdf288ccee" + }, + { + "submitted_id": "1418708.181818.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181818.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "72879699", + "checksum": "58192948782ed85b2316d4237dc75136" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "77361997", + "checksum": "eec215648709ad42b2756fa65daf2c22" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "77361997", + "checksum": "17f95532e28a6f0b28c6f680ff940023" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "74315217", + "checksum": "2a365ac663a282c8a00ed098a8228f8e" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "74315217", + "checksum": "4eec2af2989f3298ce254c53b97ca921" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "76196412", + "checksum": "65d90edc29de27554daa755d85d17039" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "76196412", + "checksum": "221433505eb250459edcce7943dc3e32" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "75886227", + "checksum": "06c59d3c6fa264b8ce7fcb160a987355" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "75886227", + "checksum": "6b0458fc6502fdcb3134a75dfbccad83" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "75792754", + "checksum": "be794f328ce9435aacd2d8e6ea8475c3" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "75792754", + "checksum": "c5cb6dd071718e77e9dc38236b8416ff" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "74010151", + "checksum": "264e2f38f8a6e692b02475a681fd3ab1" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "74010151", + "checksum": "8c54cd81b3f174e9d9626a9628c7d08f" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "73217482", + "checksum": "ecafb94aa39d8cf77e550d7ff5411b43" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "73217482", + "checksum": "46a59b289eb30ea945b17ed56d0cd141" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "69877855", + "checksum": "e99142e529632e237097f9f6f2a5c2a1" + }, + { + "submitted_id": "1418708.181818.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181818.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "69877855", + "checksum": "4799593dfa28fa8073cf87838d56c45f" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.1.1.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.1.1.fastq.gz", + "sequenced_read_count": "57300517", + "checksum": "805be7783530cebd9fa689ac096adabb" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.1.2.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.1.2.fastq.gz", + "sequenced_read_count": "57300517", + "checksum": "f6e88dfd10335e5f6bc31947d696588a" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.2.1.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.2.1.fastq.gz", + "sequenced_read_count": "58710397", + "checksum": "97074c205296b9694da66f00124dc84d" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.2.2.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.2.2.fastq.gz", + "sequenced_read_count": "58710397", + "checksum": "8256eb608572a61d5672ed894eb819cb" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.3.1.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.3.1.fastq.gz", + "sequenced_read_count": "58662798", + "checksum": "f90f4cfaf30e8fb4ba979e98b8656300" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.3.2.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.3.2.fastq.gz", + "sequenced_read_count": "58662798", + "checksum": "db9084ffd7989f5be63145881db62d7b" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.4.1.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.4.1.fastq.gz", + "sequenced_read_count": "58695117", + "checksum": "0e81fb3c092f5d72b948ca51ff149840" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.4.2.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.4.2.fastq.gz", + "sequenced_read_count": "58695117", + "checksum": "e63215cc0060e58302b2aafa04375e27" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.5.1.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.5.1.fastq.gz", + "sequenced_read_count": "58770951", + "checksum": "ff33a6a41766a81555fc2b176d400db0" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.5.2.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.5.2.fastq.gz", + "sequenced_read_count": "58770951", + "checksum": "e987048d9159f0f7795585f4152f6ddc" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.6.1.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.6.1.fastq.gz", + "sequenced_read_count": "58978669", + "checksum": "fcc3235a3bf2959dc66ade31a1496ab3" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.6.2.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.6.2.fastq.gz", + "sequenced_read_count": "58978669", + "checksum": "2560887c326931ecff67f9740b310799" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.7.1.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.7.1.fastq.gz", + "sequenced_read_count": "58872350", + "checksum": "ac5956af9f30cafa2062434c2eb2659b" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.7.2.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.7.2.fastq.gz", + "sequenced_read_count": "58872350", + "checksum": "10e88d1de78f53db9f0db0b87d81ace3" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.8.1.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.8.1.fastq.gz", + "sequenced_read_count": "58226385", + "checksum": "18f2c8a62c3dbbbae1f5ce0678c0ab8e" + }, + { + "submitted_id": "1418708.181819.227CTHLT3.8.2.fastq.gz", + "file_name": "1418708.181819.227CTHLT3.8.2.fastq.gz", + "sequenced_read_count": "58226385", + "checksum": "4eb888db17c81d8695fe67c981923f6e" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.1.1.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.1.1.fastq.gz", + "sequenced_read_count": "61696794", + "checksum": "10ef827e8300e585eebece65dcc86eb8" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.1.2.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.1.2.fastq.gz", + "sequenced_read_count": "61696794", + "checksum": "3bbfd4448c2358868fd36e301822de78" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.2.1.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.2.1.fastq.gz", + "sequenced_read_count": "60222610", + "checksum": "aaf6eff10579e470bfb0280cd80d1a68" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.2.2.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.2.2.fastq.gz", + "sequenced_read_count": "60222610", + "checksum": "e2c0e4d1e6acc1cb9c8c83f33fdb03aa" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.3.1.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.3.1.fastq.gz", + "sequenced_read_count": "60817107", + "checksum": "a081da8d35107fb62f2c9956ba7fdace" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.3.2.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.3.2.fastq.gz", + "sequenced_read_count": "60817107", + "checksum": "1c3e39dec73a970eb749e19da44ed54b" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.4.1.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.4.1.fastq.gz", + "sequenced_read_count": "61204972", + "checksum": "f081d640a79f84ab665e137711f79399" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.4.2.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.4.2.fastq.gz", + "sequenced_read_count": "61204972", + "checksum": "aceee1bfd3e9fe9857ab89d4d3da55f8" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.5.1.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.5.1.fastq.gz", + "sequenced_read_count": "60426941", + "checksum": "75e87f2d85850f8be2e80813cdd05e62" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.5.2.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.5.2.fastq.gz", + "sequenced_read_count": "60426941", + "checksum": "7b0ead783ecb14c26a550dc4a05b93c1" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.6.1.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.6.1.fastq.gz", + "sequenced_read_count": "58940430", + "checksum": "83ee9d36b43b92ca2b566f504fe6cb96" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.6.2.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.6.2.fastq.gz", + "sequenced_read_count": "58940430", + "checksum": "d1154ac8537ce41b44856d03ea1979ef" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.7.1.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.7.1.fastq.gz", + "sequenced_read_count": "59239680", + "checksum": "887da5574a3612c0b04ba163d12881f4" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.7.2.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.7.2.fastq.gz", + "sequenced_read_count": "59239680", + "checksum": "76989d4a318530d685146db08cd3685e" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.8.1.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.8.1.fastq.gz", + "sequenced_read_count": "57535803", + "checksum": "428598924ec6a4a927198ffbff19e92f" + }, + { + "submitted_id": "1418708.181819.227F5VLT3.8.2.fastq.gz", + "file_name": "1418708.181819.227F5VLT3.8.2.fastq.gz", + "sequenced_read_count": "57535803", + "checksum": "4476c4496e0e1a0301e3d820a43aad63" + } + ] +} diff --git a/test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117_more_unaligned_reads.xlsx b/test/data_files/structured_data/test_uw_gcc_colo829bl_submission_20231117_more_unaligned_reads.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..70a2e2fafce42ec91e2ed4bbcb2f3f795a62613c GIT binary patch literal 577507 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 cZxl~yJ-Ujs!M;PGc)-7O5L#GKN{TQ1AB>J*eE show-schema all +USE_SAVED_SCHEMAS_RATHER_THAN_LIVE_SCHEMAS = True + +if USE_SAVED_SCHEMAS_RATHER_THAN_LIVE_SCHEMAS: + from functools import lru_cache + from dcicutils.portal_utils import Portal as PortalBase + @lru_cache(maxsize=1) # noqa + def _mocked_portal_get_schemas(self): + with open(os.path.join(TEST_FILES_DIR, "schemas_dump.json"), "r") as f: + schemas = json.load(f) + return schemas + PortalBase.get_schemas = _mocked_portal_get_schemas + + +def _load_json_from_file(file: str) -> dict: + with open(os.path.join(TEST_FILES_DIR, file)) as f: + return json.load(f) + + +def _pytest_kwargs(kwargs: List[dict]) -> List[dict]: + # If any of the parameterized tests are marked as debug=True then only execute those. + debug_kwargs = [kwarg for kwarg in kwargs if (kwarg.get("debug") is True)] + return debug_kwargs or kwargs + + +@pytest.mark.parametrize("kwargs", _pytest_kwargs([ # test_parse_structured_data_parameterized + { + "rows": [ + r"uuid,status,principals.view,principals.edit,extensions#,data", + r"some-uuid-a,public,pav-a,pae-a,alfa|bravo|charlie,123.4", + r"some-uuid-b,public,pav-b,pae-b,delta|echo|foxtrot|golf,xyzzy" + ], + "as_file_name": "some_test.csv", + "noschemas": True, + "expected": { + "SomeTest": [ + { + "uuid": "some-uuid-a", + "status": "public", + "principals": {"view": "pav-a", "edit": "pae-a"}, + "extensions": ["alfa", "bravo", "charlie"], + "data": "123.4" + }, + { + "uuid": "some-uuid-b", + "status": "public", + "principals": {"view": "pav-b", "edit": "pae-b"}, + "extensions": ["delta", "echo", "foxtrot", "golf"], + "data": "xyzzy" + } + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + r"uuid,status,principals.view,principals.edit,extensions#,num,i,arr", + r"some-uuid-a,public,pav-a,pae-a,alfa|bravo|charlie,123.4,617,hotel", + r"some-uuid-b,public,pav-b,pae-b,delta|echo|foxtrot|golf,987,781,indigo\|juliet|kilo" + ], + "as_file_name": "some_test.csv", + "schemas": [ + { + "title": "SomeTest", + "properties": { + "num": {"type": "number"}, + "i": {"type": "integer"}, + "arr": {"type": "array", "items": {"type": "string"}} + } + } + ], + "expected": { + "SomeTest": [ + { + "uuid": "some-uuid-a", + "status": "public", + "principals": {"view": "pav-a", "edit": "pae-a"}, + "extensions": ["alfa", "bravo", "charlie"], + "num": 123.4, + "i": 617, + "arr": ["hotel"] + }, + { + "uuid": "some-uuid-b", + "status": "public", + "principals": {"view": "pav-b", "edit": "pae-b"}, + "extensions": ["delta", "echo", "foxtrot", "golf"], + "num": 987, + "i": 781, + "arr": ["indigo|juliet", "kilo"] + } + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [r"abcdef", r"alfa", r"bravo"], + "as_file_name": "easy_test.csv", + "noschemas": True, + "expected": {"EasyTest": [{"abcdef": "alfa"}, {"abcdef": "bravo"}]} + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + r"abcdef,ghi.jk,l,mno#,ghi.xyzzy,foo#notaninteger", + r"alfa,bravo,123,delta|echo|foxtrot,xyzzy:one,mike", + r"golf,hotel,456,juliet|kilo|lima,xyzzy:two,november" + ], + "as_file_name": "easy_test1.csv", + "expected": { + "EasyTest1": [ + { + "abcdef": "alfa", + "ghi": {"jk": "bravo", "xyzzy": "xyzzy:one"}, + "l": "123", + "mno": ["delta", "echo", "foxtrot"], + "foo#notaninteger": "mike" + }, + { + "abcdef": "golf", + "ghi": {"jk": "hotel", "xyzzy": "xyzzy:two"}, + "l": "456", + "mno": ["juliet", "kilo", "lima"], + "foo#notaninteger": "november" + } + ] + }, + "noschemas": True + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + r"abcdef,ghi.jk,l,mno#,ghi.xyzzy,mno#2", # TODO: fail if mno.#0 instead of mno.# + r"alfa,bravo,123,delta|echo|foxtrot,xyzzy:one,october", + r"golf,hotel,456,juliet|kilo|lima,xyzzy:two,november" + ], + "as_file_name": "easy_test2.csv", + "noschemas": True, + "expected": { + "EasyTest2": [ + { + "abcdef": "alfa", + "ghi": {"jk": "bravo", "xyzzy": "xyzzy:one"}, + "l": "123", + "mno": ["delta", "echo", "october"] + }, + { + "abcdef": "golf", + "ghi": {"jk": "hotel", "xyzzy": "xyzzy:two"}, + "l": "456", + "mno": ["juliet", "kilo", "november"] + } + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "file": "reference_file_20231119.csv", "as_file_name": "reference_file.csv", + "expected": "reference_file_20231119.result.json", + "expected_refs": [ + "/FileFormat/FASTA", + "/FileFormat/VCF", + "/SubmissionCenter/Center1" + ], + "norefs": SAME_AS_EXPECTED_REFS + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + r"abcdef,ghi.jk,l,mno#,ghi.xyzzy,mno#2", # TODO: fail if mno.#0 instead of mno.# + r"alfa,bravo,123,delta|echo|foxtrot,xyzzy:one,october", + r"golf,hotel,456,juliet|kilo|lima,xyzzy:two,november" + ], + "as_file_name": "easy_test3.csv", + "noschemas": True, + "expected": { + "EasyTest3": [ + { + "abcdef": "alfa", + "ghi": {"jk": "bravo", "xyzzy": "xyzzy:one"}, + "l": "123", + "mno": ["delta", "echo", "october"] + }, + { + "abcdef": "golf", + "ghi": {"jk": "hotel", "xyzzy": "xyzzy:two"}, + "l": "456", + "mno": ["juliet", "kilo", "november"] + } + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "file": "submission_test_file_from_doug_20231106.xlsx", + "expected_refs": [ + "/Consortium/smaht", + "/Software/SMAHT_SOFTWARE_FASTQC", + "/Software/SMAHT_SOFTWARE_VEPX", + "/FileFormat/fastq", + "/Workflow/smaht:workflow-basic" + ], + "norefs": [ + "/Consortium/smaht" + ], + "expected": "submission_test_file_from_doug_20231106.result.json" + }, + # ---------------------------------------------------------------------------------------------- + { + "file": "submission_test_file_from_doug_20231130.xlsx", + "norefs": ["/SubmissionCenter/smaht_dac"], + "expected": { + "Donor": [{ + "submitted_id": "XY_DONOR_ABCD", + "sex": "Female", "age": 5, + "submission_centers": ["smaht_dac"], + "something": "else" + }] + }, + "expected_errors": [ + {"src": {"type": "Donor", "row": 1}, + "error": "Validation error at '$': Additional properties are not allowed ('something' was unexpected)"} + ] + }, + # ---------------------------------------------------------------------------------------------- + { + "novalidate": True, + "file": "test_uw_gcc_colo829bl_submission_20231117.xlsx", + "expected": "test_uw_gcc_colo829bl_submission_20231117.result.json", + "expected_refs": [ + "/Analyte/UW-GCC_ANALYTE_COLO-829BLT-50to1_1_FiberSeq_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829BLT-50to1_1_HMWgDNA_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829BLT-50to1_1_bulkKinnex_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829BLT-50to1_1_gDNA_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829BL_FiberSeq_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829BL_FiberSeq_2", + "/Analyte/UW-GCC_ANALYTE_COLO-829BL_HMWgDNA_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829BL_HiC_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829BL_bulkKinnex_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829BL_gDNA_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829T_FiberSeq_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829T_FiberSeq_2", + "/Analyte/UW-GCC_ANALYTE_COLO-829T_HMWgDNA_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829T_HMWgDNA_2", + "/Analyte/UW-GCC_ANALYTE_COLO-829T_HiC_2", + "/Analyte/UW-GCC_ANALYTE_COLO-829T_bulkKinnex_2", + "/Analyte/UW-GCC_ANALYTE_COLO-829T_gDNA_2", + "/FileFormat/BAM", + "/FileSet/UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1", + "/FileSet/UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2", + "/FileSet/UW-GCC_FILE-SET_COLO-829T_FIBERSEQ_1", + "/Library/UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_1", + "/Library/UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_2", + "/Library/UW-GCC_LIBRARY_COLO-829T_FIBERSEQ_1", + "/Sequencing/UW-GCC_SEQUENCING_PACBIO-HIFI-150x", + "/Sequencing/UW-GCC_SEQUENCING_PACBIO-HIFI-60x", + "/Software/UW-GCC_SOFTWARE_FIBERTOOLS-RS", + "/UnalignedReads/" + ], + "norefs": [ + "/FileFormat/BAM", + "/FileSet/UW-GCC_FILE-SET_COLO-829T_FIBERSEQ_1" + ] + }, + # ---------------------------------------------------------------------------------------------- + { + # Same as test_uw_gcc_colo829bl_submission_20231117.xlsx but with the blank line in the + # Unaligned Reads sheet that signaled the end of input, and the following comment, removed. + "file": "test_uw_gcc_colo829bl_submission_20231117_more_unaligned_reads.xlsx", + "novalidate": True, + "expected": "test_uw_gcc_colo829bl_submission_20231117_more_unaligned_reads.result.json", + "expected_refs": [ + "/Analyte/UW-GCC_ANALYTE_COLO-829BLT-50to1_1_FiberSeq_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829BLT-50to1_1_HMWgDNA_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829BLT-50to1_1_bulkKinnex_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829BLT-50to1_1_gDNA_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829BL_FiberSeq_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829BL_FiberSeq_2", + "/Analyte/UW-GCC_ANALYTE_COLO-829BL_HMWgDNA_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829BL_HiC_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829BL_bulkKinnex_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829BL_gDNA_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829T_FiberSeq_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829T_FiberSeq_2", + "/Analyte/UW-GCC_ANALYTE_COLO-829T_HMWgDNA_1", + "/Analyte/UW-GCC_ANALYTE_COLO-829T_HMWgDNA_2", + "/Analyte/UW-GCC_ANALYTE_COLO-829T_HiC_2", + "/Analyte/UW-GCC_ANALYTE_COLO-829T_bulkKinnex_2", + "/Analyte/UW-GCC_ANALYTE_COLO-829T_gDNA_2", + "/FileSet/UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_1", + "/FileSet/UW-GCC_FILE-SET_COLO-829BL_FIBERSEQ_2", + "/FileFormat/", + "/FileFormat/BAM", + "/FileSet/UW-GCC_FILE-SET_COLO-829T_FIBERSEQ_1", + "/Library/UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_1", + "/Library/UW-GCC_LIBRARY_COLO-829BL_FIBERSEQ_2", + "/Library/UW-GCC_LIBRARY_COLO-829T_FIBERSEQ_1", + "/Sequencing/UW-GCC_SEQUENCING_PACBIO-HIFI-150x", + "/Sequencing/UW-GCC_SEQUENCING_PACBIO-HIFI-60x", + "/Software/UW-GCC_SOFTWARE_FIBERTOOLS-RS", + "/UnalignedReads/" + ], + "norefs": [ + "/FileFormat/", + "/FileFormat/BAM", + "/FileSet/UW-GCC_FILE-SET_COLO-829T_FIBERSEQ_1" + ] + }, + # ---------------------------------------------------------------------------------------------- + { + "file": "software_20231119.csv", "as_file_name": "software.csv", + "novalidate": True, + "expected": "software_20231119.result.json", + "expected_refs": [ + "/Consortium/Consortium1", + "/Consortium/Consortium2", + "/SubmissionCenter/SubmissionCenter1", + "/SubmissionCenter/SubmissionCenter2", + "/User/user-id-1", + "/User/user-id-2" + ], + "norefs": SAME_AS_EXPECTED_REFS + }, + # ---------------------------------------------------------------------------------------------- + { + "file": "workflow_20231119.csv", "as_file_name": "workflow.csv", + "novalidate": True, + "expected": "workflow_20231119.result.json", + "expected_refs": [ + "/Consortium/Consortium1", + "/Consortium/Consortium2", + "/SubmissionCenter/SubmissionCenter1", + "/SubmissionCenter/SubmissionCenter2", + "/User/user-id-1", + "/User/user-id-2" + ], + "norefs": SAME_AS_EXPECTED_REFS + }, + # ---------------------------------------------------------------------------------------------- + { + "file": "analyte_20231119.csv", "as_file_name": "analyte.csv", + "expected": "analyte_20231119.result.json", + "expected_refs": [ + "/Consortium/another-consortia", + "/Consortium/smaht", + "/Protocol/Protocol9", + "/Sample/Sample9", + "/SubmissionCenter/somesubctr" + ], + "norefs": SAME_AS_EXPECTED_REFS + }, + # ---------------------------------------------------------------------------------------------- + { + "file": "library_20231119.csv", "as_file_name": "library.csv", + "expected": "library_20231119.result.json", + "expected_refs": [ + "/Analyte/sample-analyte-1", + "/Analyte/sample-analyte-2", + "/Analyte/sample-analyte-3", + "/Consortium/Consortium1", + "/Consortium/Consortium2", + "/LibraryPreparation/prep2", + "/Protocol/protocol1", + "/Protocol/protocol3", + "/SubmissionCenter/somesubctr", + "/SubmissionCenter/anothersubctr", + "/SubmissionCenter/Center1", + "/LibraryPreparation/" + ], + "norefs": SAME_AS_EXPECTED_REFS + }, + # ---------------------------------------------------------------------------------------------- + { + "file": "file_format_20231119.csv.gz", "as_file_name": "file_format.csv.gz", + "expected": "file_format_20231119.result.json", + "expected_refs": [ + "/Consortium/358aed10-9b9d-4e26-ab84-4bd162da182b", + "/SubmissionCenter/9626d82e-8110-4213-ac75-0a50adf890ff", + ], + "norefs": SAME_AS_EXPECTED_REFS + }, + # ---------------------------------------------------------------------------------------------- + { + "file": "cell_line_20231120.csv", + "as_file_name": "cell_line.csv", + "expected": "cell_line_20231120.result.json", + "expected_refs": [ + "/SubmissionCenter/some-submission-center-a", + "/SubmissionCenter/some-submission-center-b" + ], + "norefs": SAME_AS_EXPECTED_REFS + }, + # ---------------------------------------------------------------------------------------------- + { + "file": "unaligned_reads_20231120.csv", "as_file_name": "unaligned_reads.csv", + "expected": "unaligned_reads_20231120.result.json", + "expected_refs": [ + "/FileSet/FileSet1", "/FileSet/FileSet2", "/FileSet/FileSet3", + "/QualityMetric/QC1", "/QualityMetric/QC2", "/QualityMetric/QC3", + "/QualityMetric/QC4", "/QualityMetric/QC5", "/QualityMetric/QC6", + "/Software/Software1", "/Software/Software2", "/Software/Software3", + "/Software/Software4", "/Software/Software5", "/Software/Software6", + "/SubmissionCenter/Center1", "/SubmissionCenter/Center2", "/SubmissionCenter/Center3", "/User/User1", + "/User/User2", "/User/User3", "/User/User4", "/User/User5", "/User/User6", + "/FileFormat/BAM", "/FileFormat/CRAM", "/FileFormat/FASTQ" + ], + "norefs": SAME_AS_EXPECTED_REFS + }, + # ---------------------------------------------------------------------------------------------- + { + "file": "sequencing_20231120.csv", + "as_file_name": "sequencing.csv", + "expected": "sequencing_20231120.result.json", + "expected_refs": [ + "/Consortium/Consortium1", + "/Consortium/Consortium2", + "/Protocol/Protocol1", + "/Protocol/Protocol2", + "/Protocol/Protocol3", + "/SubmissionCenter/Center1", + "/SubmissionCenter/Center2", + "/SubmissionCenter/somesubctr", + "/User/User1", + "/User/User2", + "/User/User3", + "/User/User4", + "/User/User5", + "/User/User6" + ], + "norefs": SAME_AS_EXPECTED_REFS + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "abc#,abc#", + "alice|bob|charley,foobar|goobar" + ], + "as_file_name": "test.csv", + "noschemas": True, + "expected": { + "Test": [{"abc": ["foobar", "goobar"]}] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "abc#,abc#1", # TODO: fail if abc#.0 rather than abc# + "alice|bob|charley,foobar" + ], + "as_file_name": "test.csv", + "noschemas": True, + "expected": { + "Test": [{ + "abc": ["alice", "foobar", "charley"] + }] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "abc#,abc#", # TODO: fail if abce#0 rather than abce# + "alice|bob|charley,foobar|goobar" + ], + "as_file_name": "test.csv", + "noschemas": True, + "expected": { + "Test": [{ + "abc": ["foobar", "goobar"] + }] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "other_allowed_extensions#,other_allowed_extensions#4", + # "alice|bob|charley,foobar|goobar" + "alice|bob|charley,foobar" + ], + "as_file_name": "test.csv", + "noschemas": True, + "expected": { + "Test": [{ + # "other_allowed_extensions": ["alice", "bob", "charley", None, "foobar", "goobar"] + "other_allowed_extensions": ["alice", "bob", "charley", None, "foobar"] + }] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + # TODO: fail if other_allowed_extensions#0 rather than other_allowed_extensions# + "other_allowed_extensions#,other_allowed_extensions#4", + # "alice|bob|charley,foobar|goobar" + "alice|bob|charley,foobar" + ], + "as_file_name": "test.csv", + "noschemas": True, + "expected": { + "Test": [{ + # "other_allowed_extensions": ["alice", "bob", "charley", None, "foobar", "goobar"] + "other_allowed_extensions": ["alice", "bob", "charley", None, "foobar"] + }] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "uuid,status,principals_allowed. view,principals_allowed.edit," + "other_allowed_extensions#,other_allowed_extensions#5", + # "some-uuid-a,public,pav-a,pae-a,alice|bob|charley,foobar|goobar", + # "some-uuid-b,public,pav-b,pae-a,alice|bob|charley,foobar|goobar" + "some-uuid-a,public,pav-a,pae-a,alice|bob|charley,goobar", + "some-uuid-b,public,pav-b,pae-a,alice|bob|charley,goobar" + ], + "as_file_name": "test.csv", + "noschemas": True, + "expected": { + "Test": [ + { + "uuid": "some-uuid-a", + "status": "public", + "principals_allowed": {"view": "pav-a", "edit": "pae-a"}, + # "other_allowed_extensions": ["alice", "bob", "charley", None, "foobar", "goobar"] + "other_allowed_extensions": ["alice", "bob", "charley", None, None, "goobar"] + }, + { + "uuid": "some-uuid-b", + "status": "public", + "principals_allowed": {"view": "pav-b", "edit": "pae-a"}, + # "other_allowed_extensions": ["alice", "bob", "charley", None, "foobar", "goobar"] + "other_allowed_extensions": ["alice", "bob", "charley", None, None, "goobar"] + } + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "abc.def,pqr,vw#.xy", + "alpha,1234,781" + ], + "as_file_name": "test.csv", + "noschemas": True, + "expected": { + "Test": [ + {"abc": {"def": "alpha"}, "pqr": "1234", "vw": [{"xy": "781"}]} + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "xyzzy#1", + "456" + ], + "as_file_name": "test.csv", + "noschemas": True, + "expected": { + "Test": [ + {"xyzzy": [None, "456"]} + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "xyzzy#2", + "456" + ], + "as_file_name": "test.csv", + "noschemas": True, + "expected": { + "Test": [ + {"xyzzy": [None, None, "456"]} + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "abc.def.ghi,xyzzy#2", + "123,456" + ], + "as_file_name": "test.csv", + "noschemas": True, + "expected": { + "Test": [ + {"abc": {"def": {"ghi": "123"}}, "xyzzy": [None, None, "456"]} + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "prufrock#", + "J.|Alfred|Prufrock" + ], + "as_file_name": "test.csv", + "noschemas": True, + "expected": { + "Test": [ + {"prufrock": ["J.", "Alfred", "Prufrock"]} + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "abc.def,pqr,vw#1.xy", + "alpha,1234,781" + ], + "as_file_name": "test.csv", + "noschemas": True, + "expected": { + "Test": [ + {"abc": {"def": "alpha"}, "pqr": "1234", "vw": [{"xy": None}, {"xy": "781"}]} + ] + }, + "prune": False + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "abc.def,pqr,vw#0.xy", + "alpha,1234,781" + ], + "as_file_name": "test.csv", + "noschemas": True, + "expected": { + "Test": [ + {"abc": {"def": "alpha"}, "pqr": "1234", "vw": [{"xy": "781"}]} + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "abc.def,pqr,vw#2.xy", + "alpha,1234,781" + ], + "as_file_name": "test.csv", + "noschemas": True, + "expected": { + "Test": [ + {"abc": {"def": "alpha"}, "pqr": "1234", "vw": [{"xy": None}, {"xy": None}, {"xy": "781"}]} + ] + }, + "prune": False + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "vw#.xy.foo,simple_string", + "781,moby" + ], + "as_file_name": "test.csv", + "noschemas": True, + "expected": { + "Test": [ + {"vw": [{"xy": {"foo": "781"}}], "simple_string": "moby"} + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "abc.def,pqr,vw#.xy", + "alpha,1234,781" + ], + "as_file_name": "some_type_one.csv", + "schemas": [_load_json_from_file("some_type_one.json")], + "expected": { + "SomeTypeOne": [ + {"abc": {"def": "alpha"}, "pqr": 1234, "vw": [{"xy": 781}]} + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "vw#2.xy.foo", + "781" + ], + "as_file_name": "some_type_two.csv", + "schemas": [_load_json_from_file("some_type_two.json")], + "expected": { + "SomeTypeTwo": [ + {"vw": [ + {"xy": {"foo": None}}, + {"xy": {"foo": None}}, + {"xy": {"foo": "781"}} + ]} + ] + }, + "prune": False + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "simple_string_array,simple_integer_array,simple_number_array,simple_boolean_array", + "1|23|456|7890 , 1|23|456|7890 , 1|23|456|7890.123 , true| False|false|True" + ], + "as_file_name": "some_type_one.csv", + "schemas": [_load_json_from_file("some_type_one.json")], + "expected": { + "SomeTypeOne": [ + {"simple_string_array": ["1", "23", "456", "7890"], + "simple_integer_array": [1, 23, 456, 7890], + "simple_number_array": [1, 23, 456, 7890.123], + "simple_boolean_array": [True, False, False, True]} + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "simplearray#4\tsimplearray#\tsomeobj.ghi\tabc\tarrayofarray\tsimplearray#3", + "hello\tabc|def|ghi\t[{\"jkl\": \"xyz\"}]\t{\"hello\": 1234}\t[[\"j.\", \"alfred\", \"prufrock\"]]\tbyebye" + # "arrayofarray\tsimplearray#4\tsimplearray\tsomeobj.ghi\tabc\tsimplearray#3", + # "[[\"j.\", \"alfred\", \"prufrock\"]]\thello\tabc|def|ghi\t[{\"jkl\": + # \"xyz\"}]\t{\"hello\": 1234}\tbyebye" + ], + "as_file_name": "test.tsv", + "schemas": [_load_json_from_file("some_type_three.json")], + "expected": { + "Test": [ + { + "simplearray": ["abc", "def", "ghi", "byebye", "hello"], + # "simplearray": ["abc", "def", "ghi", "byebye"], + "abc": {"hello": 1234}, + "someobj": {"ghi": [{"jkl": "xyz"}]}, + "arrayofarray": [["j.", "alfred", "prufrock"]] + # "arrayofarray": [[["j.", "alfred", "prufrock"]]] # TODO + } + # { + # "simplearray': ['abc', 'def', 'ghi', ['byebye']], + # 'abc': {'hello': 1234}, + # 'someobj': {'ghi': [{'jkl': 'xyz'}]}, + # 'arrayofarray': [['j.', 'alfred', 'prufrock']]} + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "somearray#,somearray#3,somearray#4", + "alice|bob|charley,,goobar" + ], + "as_file_name": "test.csv", + "schemas": [ + { + "title": "Test", + "properties": { + "somearray": {"type": "array", "items": {"type": "string"}} + } + } + ], + "expected": { + "Test": [{'somearray': ['alice', 'bob', 'charley', '', 'goobar']}] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "somearray#,somearray#3,somearray#4", + "123|456|789,0,203" + ], + "as_file_name": "test.csv", + "schemas": [ + { + "title": "Test", + "properties": { + "somearray": {"type": "array", "items": {"type": "integer"}} + } + } + ], + "expected": { + "Test": [{'somearray': [123, 456, 789, 0, 203]}] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "arrayofarrayofobject", + "[[{\"name\": \"prufrock\", \"id\": 1234}]]" + ], + "as_file_name": "test.tsv", + "schemas": [ + { + "title": "Test", + "properties": { + "arrayofarrayofobject": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": {"type": "string"}, + "id": {"type": "integer"} + } + } + } + } + } + } + ], + "expected": {"Test": [{"arrayofarrayofobject": [[{"name": "prufrock", "id": 1234}]]}]} + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "arrayofobject", + "[{\"name\": \"prufrock\", \"id\": 1234}]" + ], + "as_file_name": "test.tsv", + "schemas": [ + { + "title": "Test", + "properties": { + "arrayofobject": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": {"type": "string"}, + "id": {"type": "integer"} + } + } + } + } + } + ], + "expected": {"Test": [{"arrayofobject": [{"name": "prufrock", "id": 1234}]}]} + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "arrayofobject#4.name,arrayofobject#4.id,arrayofobject#2.name,arrayofobject#2.id", + "anastasiia,1234,olha,5678" + ], + "as_file_name": "test.csv", + "schemas": [ + { + "title": "Test", + "properties": { + "arrayofobject": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": {"type": "string"}, + "id": {"type": "integer"} + } + } + } + } + } + ], + # "expected": {"Test": [{"arrayofobject": [{"name": "anastasiia", "id": 1234}]}]}, + "expected": {"Test": [{"arrayofobject": [{}, {}, {"name": "olha", "id": 5678}, + {}, {"name": "anastasiia", "id": 1234}]}]} + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "arrayofarrayofobject##.name,arrayofarrayofobject##.id", + "anastasiia,1234" + ], + "as_file_name": "test.csv", + "schemas": [ + { + "title": "Test", + "properties": { + "arrayofarrayofobject": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": {"type": "string"}, + "id": {"type": "integer"} + } + } + } + } + } + } + ], + "expected": {"Test": [{"arrayofarrayofobject": [[{"name": "anastasiia", "id": 1234}]]}]} + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "arrayofarrayofobject##.name,arrayofarrayofobject##.id," + "arrayofarrayofobject##1.name,arrayofarrayofobject##1.id", + "anastasiia,1234,olha,5678" + ], + "as_file_name": "test.csv", + "schemas": [ + { + "title": "Test", + "properties": { + "arrayofarrayofobject": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": {"type": "string"}, + "id": {"type": "integer"} + } + } + } + } + } + } + ], + "expected": { + "Test": [ + { + "arrayofarrayofobject": [ + [ + { + "name": "anastasiia", + "id": 1234 + }, + { + "name": "olha", + "id": 5678 + } + ] + ] + } + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "indigo\tjuliet\talfa.bravo\talfa.bravo.charlie.delta", + "abc|def|ghi|123456890\t[[[0],[12,34],[5],[67,8,90]],[[123]]]\t{\"foo\": 123}", + "prufrock|j.|alfred|\t\t\thellocharlie", + ], + "as_file_name": "some_type_four.tsv", + "schemas": [_load_json_from_file("some_type_four.json")], + "expected": { + "SomeTypeFour": [ + { + "indigo": ["abc", "def", "ghi", "123456890"], + "juliet": [[[0], [12, 34], [5], [67, 8, 90]], [[123]]], + "alfa": {"bravo": {"foo": 123}} + }, + { + "indigo": ["prufrock", "j.", "alfred"], + "juliet": [[[]]], + "alfa": {"bravo": {"charlie": {"delta": "hellocharlie"}}} + } + ] + }, + "expected_errors": [{'src': {'type': 'SomeTypeFour', 'row': 1}, + 'error': "Validation error at '$.alfa.bravo': {'foo': 123} is not of type 'string'"}, + {'src': {'type': 'SomeTypeFour', 'row': 2}, + 'error': "Validation error at '$.alfa.bravo': " + "{'charlie': {'delta': 'hellocharlie'}} is not of type 'string'"}] # noqa + }, + # ---------------------------------------------------------------------------------------------- + { + "ignore": True, + "rows": [ + "abc,abc##", + "123,456", + ], + "as_file_name": "test.csv", + "noschemas": True, + "expected": { + "Test": [ + { + "abc": ["456"] + } + ] + } + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "someuniquestrings,someuniqueints", + "somevalue|anothervalue|somevalue,12|34|56|34" + ], + "as_file_name": "test.csv", + "schemas": [{"title": "Test", + "properties": { # noqa + "someuniquestrings": {"type": "array", "uniqueItems": True, "items": {"type": "string"}}, + "someuniqueints": {"type": "array", "uniqueItems": True, "items": {"type": "integer"}} + } + }], + "expected": {"Test": [ + {"someuniquestrings": ["somevalue", "anothervalue"], "someuniqueints": [12, 34, 56]} + ]} + }, + # ---------------------------------------------------------------------------------------------- + { + "rows": [ + "someproperty", + "somevalue" + ], + "as_file_name": "test.csv", + "schemas": [{"title": "Test", + "properties": { # noqa + "someproperty": {"type": "string"}, + "submission_centers": {"type": "array", "uniqueItems": True, "items": {"type": "string"}} + } + }], + "autoadd": {"submission_centers": ["somesubmissioncenter", "anothersubmissioncenter"]}, + "expected": {"Test": [ + {"someproperty": "somevalue", "submission_centers": ["somesubmissioncenter", "anothersubmissioncenter"]} + ]} + }, +])) +def test_parse_structured_data_parameterized(kwargs): + _test_parse_structured_data(testapp, **kwargs) + + +@pytest.mark.parametrize("columns, expected", [ + ["abc", { + "abc": None + }], + ["abc,def.ghi,jkl#.mnop#2.rs", { + "abc": None, + "def": {"ghi": None}, + "jkl": [{"mnop": [{"rs": None}, {"rs": None}, {"rs": None}]}] + }], + ["abc,def,ghi.jkl,mnop.qrs.tuv", { + "abc": None, + "def": None, + "ghi": {"jkl": None}, + "mnop": {"qrs": {"tuv": None}} + }], + ["abc,def,ghi.jkl,mnop.qrs.tuv", { + "abc": None, + "def": None, + "ghi": {"jkl": None}, + "mnop": {"qrs": {"tuv": None}} + }], + ["abc,def.ghi,jkl#", { + "abc": None, + "def": {"ghi": None}, + "jkl": [] + }], + ["abc,def.ghi,jkl#.mnop", { + "abc": None, + "def": {"ghi": None}, + "jkl": [{"mnop": None}] + }], + ["abc,def.ghi,jkl#.mnop#", { + "abc": None, + "def": {"ghi": None}, + "jkl": [{"mnop": []}] + }], + ["abc,def.ghi,jkl#.mnop#2", { + "abc": None, + "def": {"ghi": None}, + "jkl": [{"mnop": [None, None, None]}] + }], + ["abc,def.ghi,jkl#.mnop#2.rs", { + "abc": None, + "def": {"ghi": None}, + "jkl": [{"mnop": [{"rs": None}, {"rs": None}, {"rs": None}]}] + }], + ["abc,def.ghi,jkl#.mnop#2.rs#.tuv", { + "abc": None, + "def": {"ghi": None}, + "jkl": [{"mnop": [{"rs": [{"tuv": None}]}, {"rs": [{"tuv": None}]}, {"rs": [{"tuv": None}]}]}] + }], + ["abc.def.ghi,xyzzy", { + "abc": {"def": {"ghi": None}}, + "xyzzy": None + }], + ["abc.def.ghi,xyzzy#,simple_string", { + "abc": {"def": {"ghi": None}}, + "xyzzy": [], + "simple_string": None + }], + ["abc.def.ghi,xyzzy#2", { + "abc": {"def": {"ghi": None}}, + "xyzzy": [None, None, None] + }], + ["abc.def.ghi,xyzzy#2,xyzzy#3", { + "abc": {"def": {"ghi": None}}, + "xyzzy": [None, None, None, None] + }], + ["abc.def.ghi,xyzzy#2,xyzzy#", { + "abc": {"def": {"ghi": None}}, + "xyzzy": [None, None, None] + }], + ["abc.def.ghi,xyzzy#2,xyzzy#0", { + "abc": {"def": {"ghi": None}}, + "xyzzy": [None, None, None] + }], + ["abc.def.ghi,xyzzy#2,xyzzy#1", { + "abc": {"def": {"ghi": None}}, + "xyzzy": [None, None, None] + }], + ["abc.def.ghi,xyzzy#2,xyzzy#1.foo", { + "abc": {"def": {"ghi": None}}, + "xyzzy": [{"foo": None}, {"foo": None}, {"foo": None}] + }], + ["abc.def.ghi,xyzzy#2.goo,xyzzy#1.foo", { + "abc": {"def": {"ghi": None}}, + "xyzzy": [{"foo": None, "goo": None}, {"foo": None, "goo": None}, {"foo": None, "goo": None}] + }], + ["abc.def.ghi,xyzzy#2.goo,xyzzy#1.foo#", { + "abc": {"def": {"ghi": None}}, + "xyzzy": [{"foo": [], "goo": None}, {"foo": [], "goo": None}, {"foo": [], "goo": None}] + }], + ["abc.def.ghi,xyzzy#2.goo,xyzzy#1.foo#0", { + "abc": {"def": {"ghi": None}}, + "xyzzy": [{"foo": [None], "goo": None}, {"foo": [None], "goo": None}, {"foo": [None], "goo": None}] + }], + ["abc.def.ghi,xyzzy#2.goo,xyzzy#1.foo#2,jklmnop#3", { + "abc": {"def": {"ghi": None}}, + "xyzzy": [{"foo": [None, None, None], "goo": None}, + {"foo": [None, None, None], "goo": None}, {"foo": [None, None, None], "goo": None}], + "jklmnop": [None, None, None, None] + }], + ["abc.def.ghi,xyzzy#2.goo,xyzzy#1.foo#2,jklmnop#3", { + "abc": {"def": {"ghi": None}}, + "xyzzy": [{"foo": [None, None, None], "goo": None}, + {"foo": [None, None, None], "goo": None}, {"foo": [None, None, None], "goo": None}], + "jklmnop": [None, None, None, None] + }], + ["abc#", { + "abc": [] + }], + ["abc#0", { + "abc": [None] + }], + ["abc##", { + "abc": [[]] + }], + ["abc###", { + "abc": [[[]]] + }], + ["abc#0#", { + "abc": [[]] + }], + ["abc##0", { + "abc": [[None]] + }], + ["abc#1#", { + "abc": [[], []] + }], + ["abc#.name", { + "abc": [{"name": None}] + }], + ["abc#0.name", { + "abc": [{"name": None}] + }], + ["abc#1#2", { + "abc": [[None, None, None], [None, None, None]] + }], + ["abc#1#2.id", { + "abc": [[{"id": None}, {"id": None}, {"id": None}], [{"id": None}, {"id": None}, {"id": None}]] + }], + ["abc#1#2.id#", { + "abc": [[{"id": []}, {"id": []}, {"id": []}], [{"id": []}, {"id": []}, {"id": []}]] + }], + ["abc#1#2.id#1", { + "abc": [[{"id": [None, None]}, {"id": [None, None]}, + {"id": [None, None]}], [{"id": [None, None]}, {"id": [None, None]}, {"id": [None, None]}]] + }], + ["abc#1#2.id#1.name", { + "abc": [[{"id": [{"name": None}, {"name": None}]}, + {"id": [{"name": None}, {"name": None}]}, {"id": [{"name": None}, {"name": None}]}], + [{"id": [{"name": None}, {"name": None}]}, + {"id": [{"name": None}, {"name": None}]}, {"id": [{"name": None}, {"name": None}]}]] + }] +]) +def test_structured_row_data_0(columns, expected): + _test_structured_row_data(columns, expected) + + +@pytest.mark.parametrize("columns, expected", [ + ["abc.def.ghi,xyzzy#2,xyzzy#", { + "abc": {"def": {"ghi": None}}, + "xyzzy": [None, None, None] + }] +]) +def test_structured_row_data_debugging(columns, expected): + _test_structured_row_data(columns, expected) + + +def test_flatten_schema_1(): + portal = Portal(testapp) + schema = Schema.load_by_name("reference_file", portal=portal) + schema_flattened_json = _get_schema_flat_typeinfo(schema) + with open(os.path.join(TEST_FILES_DIR, "reference_file.flattened.json")) as f: + expected_schema_flattened_json = json.load(f) + assert schema_flattened_json == expected_schema_flattened_json + + +def test_portal_custom_schemas_1(): + schemas = [{"title": "Abc"}, {"title": "Def"}] + portal = Portal(testapp, schemas=schemas) + assert portal.get_schema("Abc") == schemas[0] + assert portal.get_schema(" def ") == schemas[1] + assert portal.get_schema("FileFormat") is not None + + +def test_get_type_name_1(): + assert Schema.type_name("FileFormat") == "FileFormat" + assert Schema.type_name("file_format") == "FileFormat" + assert Schema.type_name("file_format.csv") == "FileFormat" + assert Schema.type_name("file_format.json") == "FileFormat" + assert Schema.type_name("file_format.xls") == "FileFormat" + assert Schema.type_name("File Format") == "FileFormat" + + +def test_rationalize_column_name() -> None: + _test_rationalize_column_name("abc#0#", "abc###", "abc#0##") + _test_rationalize_column_name("abc.def.ghi", None, "abc.def.ghi") + _test_rationalize_column_name("abc.def.ghi", "abc.def.ghi", "abc.def.ghi") + _test_rationalize_column_name("abc.def", "abc.def.ghi", "abc.def") + _test_rationalize_column_name("abc##", "abc", "abc##") + _test_rationalize_column_name("abc", "abc##", "abc##") + _test_rationalize_column_name("abc.def.nestedarrayofobject#1#23##343#.mno", + "abc.def.nestedarrayofobject##1#24####.mno", + "abc.def.nestedarrayofobject#1#23##343###.mno") + _test_rationalize_column_name("abc.def.nestedarrayofobject#####.mno", + "abc.def.nestedarrayofobject#####.mno", + "abc.def.nestedarrayofobject#####.mno") + + +def _test_parse_structured_data(testapp, + file: Optional[str] = None, + as_file_name: Optional[str] = None, + rows: Optional[List[str]] = None, + expected: Optional[Union[dict, list]] = None, + expected_refs: Optional[List[str]] = None, + expected_errors: Optional[Union[dict, list]] = None, + norefs: Union[bool, List[str]] = False, + noschemas: bool = False, + novalidate: bool = False, + schemas: Optional[List[dict]] = None, + autoadd: Optional[dict] = None, + prune: bool = True, + ignore: bool = False, + debug: bool = False) -> None: + + if ignore: + return + if not file and as_file_name: + file = as_file_name + if not file and not rows: + raise Exception("Must specify a file or rows for structured_data test.") + if isinstance(expected, str): + if os.path.exists(os.path.join(TEST_FILES_DIR, expected)): + expected = os.path.join(TEST_FILES_DIR, expected) + elif not os.path.exists(expected): + raise Exception(f"Cannot find output result file for structured_data: {expected}") + with open(expected, "r") as f: + expected = json.load(f) + elif not isinstance(expected, dict): + raise Exception(f"Must specify a file name or a dictionary for structured_data test: {type(expected)}") + if norefs is SAME_AS_EXPECTED_REFS: + norefs = expected_refs + if expected_refs is SAME_AS_NOREFS: + expected_refs = norefs + + refs_actual = set() + + def assert_parse_structured_data(): + + def call_parse_structured_data(file: str): + nonlocal portal, novalidate, autoadd, prune, debug + if debug: + # import pdb ; pdb.set_trace() + pass + return parse_structured_data(file=file, portal=portal, novalidate=novalidate, + autoadd=autoadd, prune=True if prune is not False else False) + + nonlocal file, expected, expected_errors, schemas, noschemas, debug + portal = Portal(testapp, schemas=schemas) if not noschemas else None # But see mocked_schemas. + if rows: + if os.path.exists(file) or os.path.exists(os.path.join(TEST_FILES_DIR, file)): + raise Exception("Attempt to create temporary file with same name as existing test file: {file}") + with temporary_file(name=file, content=rows) as tmp_file_name: + structured_data_set = call_parse_structured_data(tmp_file_name) + structured_data = structured_data_set.data + validation_errors = structured_data_set.validation_errors + else: + if os.path.exists(os.path.join(TEST_FILES_DIR, file)): + file = os.path.join(TEST_FILES_DIR, file) + elif not os.path.exists(file): + raise Exception(f"Cannot find input test file for structured_data: {file}") + if as_file_name: + with open(file, "rb" if file.endswith((".gz", ".tgz", ".tar", ".tar.gz", ".zip")) else "r") as f: + with temporary_file(name=as_file_name, content=f.read()) as tmp_file_name: + structured_data_set = call_parse_structured_data(tmp_file_name) + structured_data = structured_data_set.data + validation_errors = structured_data_set.validation_errors + else: + structured_data_set = call_parse_structured_data(file) + structured_data = structured_data_set.data + validation_errors = structured_data_set.validation_errors + if debug: + # import pdb ; pdb.set_trace() + pass + if expected is not None: + if not (structured_data == expected): + # import pdb ; pdb.set_trace() + pass + assert structured_data == expected + if expected_errors: + assert validation_errors == expected_errors + else: + assert not validation_errors + + @contextmanager + def mocked_schemas(): + yield + + @contextmanager + def mocked_refs(): + real_ref_exists = Portal.ref_exists + real_map_function_ref = Schema._map_function_ref + def mocked_map_function_ref(self, typeinfo): # noqa + map_ref = real_map_function_ref(self, typeinfo) + def mocked_map_ref(value, link_to, portal, src): # noqa + nonlocal norefs, expected_refs, refs_actual + if not value: + refs_actual.add(ref := f"/{link_to}/") + if norefs is True or (isinstance(norefs, list) and ref in norefs): + return value + return map_ref(value, src) + return lambda value, src: mocked_map_ref(value, typeinfo.get("linkTo"), self._portal, src) + def mocked_ref_exists(self, type_name, value): # noqa + nonlocal norefs, expected_refs, refs_actual + refs_actual.add(ref := f"/{type_name}/{value}") + if norefs is True or (isinstance(norefs, list) and ref in norefs): + return [{"type": "dummy", "uuid": "dummy"}] + return real_ref_exists(self, type_name, value) + with mock.patch("dcicutils.structured_data.Portal.ref_exists", + side_effect=mocked_ref_exists, autospec=True): + with mock.patch("dcicutils.structured_data.Schema._map_function_ref", + side_effect=mocked_map_function_ref, autospec=True): + yield + + def run_this_function(): + nonlocal expected_refs, noschemas, norefs, refs_actual + refs_actual = set() + if noschemas: + if norefs or expected_refs: + with mocked_schemas(): + with mocked_refs(): + assert_parse_structured_data() + else: + with mocked_schemas(): + assert_parse_structured_data() + elif norefs or expected_refs: + with mocked_refs(): + assert_parse_structured_data() + else: + assert_parse_structured_data() + if expected_refs: + # Make sure any/all listed refs were actually referenced. + assert refs_actual == set(expected_refs) + + run_this_function() + + +def _get_schema_flat_typeinfo(schema: Schema): + def map_function_name(map_function: Callable) -> str: + # This is ONLY for testing/troubleshooting; get the NAME of the mapping function; this is HIGHLY + # implementation DEPENDENT, on the map_function_ functions. The map_function, as a string, + # looks like: .map_string at 0x103474900> or + # if it is implemented as a lambda (to pass in closure), then inspect.getclosurevars.nonlocals looks like: + # {"map_enum": .map_enum at 0x10544cd60>, ...} + if isinstance(map_function, Callable): + if (match := re.search(r"\.(\w+) at", str(map_function))): + return f"<{match.group(1)}>" + for item in inspect.getclosurevars(map_function).nonlocals: + if item.startswith("map_"): + return f"<{item}>" + return type(map_function) + + result = {} + for key, value in schema._typeinfo.items(): + if isinstance(value, str): + result[key] = value + elif isinstance(value, dict): + key_type = value["type"] + key_map = value.get("map") + result[key] = {"type": key_type, + "map": map_function_name(key_map) if isinstance(key_map, Callable) else None} + return result + + +def _test_structured_row_data(columns: str, expected: Optional[dict]): + if _StructuredRowTemplate(columns.split(","))._template != expected: + # import pdb ; pdb.set_trace() + pass + assert _StructuredRowTemplate(columns.split(","))._template == expected + + +def _test_rationalize_column_name(column_name: str, schema_column_name: str, expected: str) -> None: + class FakeSchema(Schema): + class FakeTypeInfo: + def __init__(self, value): + self._value = value + def get(self, column_name): # noqa + return self._value + def __init__(self, value): # noqa + self._typeinfo = FakeSchema.FakeTypeInfo(value) + assert FakeSchema(schema_column_name).rationalize_column_name(column_name) == expected + + +# Same as in smaht-portal/../schema_formats.py +def is_accession(value: str) -> bool: + return isinstance(value, str) and re.match(r"^SMA[1-9A-Z]{9}$", value) is not None + + +# Same as in smaht-portal/../ingestion_processors.py +def parse_structured_data(file: str, portal: Optional[Union[VirtualApp, TestApp, Portal]], novalidate: bool = False, + autoadd: Optional[dict] = None, prune: bool = True, + ref_nocache: bool = False) -> StructuredDataSet: + + def ref_lookup_strategy(type_name: str, value: str) -> int: + if is_accession(value): + return StructuredDataSet.REF_LOOKUP_DEFAULT | StructuredDataSet.REF_LOOKUP_ROOT_FIRST + else: + return StructuredDataSet.REF_LOOKUP_DEFAULT + + structured_data = StructuredDataSet.load(file=file, portal=portal, + autoadd=autoadd, order=ITEM_INDEX_ORDER, prune=prune, + ref_lookup_strategy=ref_lookup_strategy, + ref_lookup_nocache=ref_nocache) + if not novalidate: + structured_data.validate() + return structured_data From 3030166c3fec8e0f1461d645551e4707c9d651a2 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Fri, 8 Mar 2024 10:56:40 -0500 Subject: [PATCH 19/64] move structured_data test here from smaht-portal --- dcicutils/structured_data.py | 28 ++++++++++++---------------- pyproject.toml | 2 +- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index c9d769260..bf3635609 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -722,10 +722,10 @@ def __init__(self, else: self._ref_lookup_strategy = lambda type_name, value: StructuredDataSet.REF_LOOKUP_DEFAULT if ref_lookup_nocache is True: - self.get_metadata = self.get_metadata_nocache + self.ref_lookup = self.ref_lookup_nocache self._ref_cache = None else: - self.get_metadata = self.get_metadata_cache + self.ref_lookup = self.ref_lookup_cache self._ref_cache = {} self._ref_lookup_found_count = 0 self._ref_lookup_notfound_count = 0 @@ -735,10 +735,10 @@ def __init__(self, self._ref_exists_cache_miss_count = 0 @lru_cache(maxsize=8092) - def get_metadata_cache(self, object_name: str) -> Optional[dict]: - return self.get_metadata_nocache(object_name) + def ref_lookup_cache(self, object_name: str) -> Optional[dict]: + return self.ref_lookup_nocache(object_name) - def get_metadata_nocache(self, object_name: str) -> Optional[dict]: + def ref_lookup_nocache(self, object_name: str) -> Optional[dict]: try: result = super().get_metadata(object_name) self._ref_lookup_found_count += 1 @@ -844,7 +844,7 @@ def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: lookup_paths.append(f"/{subtype_name}/{value}") # Do the actual lookup in the portal for each of the desired lookup paths. for lookup_path in lookup_paths: - if isinstance(item := self.get_metadata(lookup_path), dict): + if isinstance(item := self.ref_lookup(lookup_path), dict): resolved = [{"type": type_name, "uuid": item.get("uuid", None)}] self._cache_ref(type_name, value, resolved, subtype_names) return resolved @@ -852,14 +852,10 @@ def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: def _ref_exists_internally(self, type_name: str, value: str, subtype_names: Optional[List[str]] = None) -> Tuple[bool, Optional[str]]: - is_resolved, resolved_uuid = self._ref_exists_single_internally(type_name, value) - if is_resolved: - return True, resolved_uuid - if subtype_names: - for subtype_name in subtype_names: - is_resolved, resolved_uuid = self._ref_exists_single_internally(subtype_name, value) - if is_resolved: - return True, resolved_uuid + for type_name in [type_name] + (subtype_names or []): + is_resolved, resolved_uuid = self._ref_exists_single_internally(type_name, value) + if is_resolved: + return True, resolved_uuid return False, None def _ref_exists_single_internally(self, type_name: str, value: str) -> Tuple[bool, Optional[str]]: @@ -879,7 +875,7 @@ def ref_lookup_cache_hit_count(self) -> int: if self._ref_cache is None: return 0 try: - return self.get_metadata_cache.cache_info().hits + return self.ref_lookup_cache.cache_info().hits except Exception: return -1 @@ -888,7 +884,7 @@ def ref_lookup_cache_miss_count(self) -> int: if self._ref_cache is None: return self.ref_lookup_count try: - return self.get_metadata_cache.cache_info().misses + return self.ref_lookup_cache.cache_info().misses except Exception: return -1 diff --git a/pyproject.toml b/pyproject.toml index 61e8624c3..b30f169ed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b7" # TODO: To become 8.8.1 +version = "8.8.0.1b8" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 9064aa797b4896ba0752f32f127c23d2a19e4423 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Fri, 8 Mar 2024 11:16:08 -0500 Subject: [PATCH 20/64] move structured_data test here from smaht-portal --- dcicutils/structured_data.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index bf3635609..a448a578b 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -806,7 +806,6 @@ def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: if not resolved: # Cached resolved reference is empty ([]). # It might NOW be found internally, since the portal self._data can change. - # TODO ref_lookup_strategy = self._ref_lookup_strategy(type_name, value) is_ref_lookup_subtypes = StructuredDataSet._is_ref_lookup_subtypes(ref_lookup_strategy) subtype_names = self._get_schema_subtypes(type_name) if is_ref_lookup_subtypes else None @@ -848,6 +847,8 @@ def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: resolved = [{"type": type_name, "uuid": item.get("uuid", None)}] self._cache_ref(type_name, value, resolved, subtype_names) return resolved + # Not found at all; note that we cache this ([]) too; indicates lookup has been done. + self._cache_ref(type_name, value, [], subtype_names) return [] def _ref_exists_internally(self, type_name: str, value: str, From ce27d727377ea7bfadbd530b9ff6a179c074fcc6 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Fri, 8 Mar 2024 11:21:22 -0500 Subject: [PATCH 21/64] CHANGES-readme --- CHANGELOG.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 4b437629a..ca1920347 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -12,6 +12,8 @@ Change Log * Changes to troubleshooting utility script view-portal-object. * Some reworking of ref lookup in structured_data. * Support ref caching in structured_data. +* Added hook to turn off ref lookup by subtypes in case we need this later. +* Added hook do ref lookup at root path first; set to true by smaht-portal for accession IDs. * Moved/adapted test_structured_data.py from smaht-portal to here. From 89eeb775a64ef22e46ff089692de861c2f106882 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Fri, 8 Mar 2024 11:48:46 -0500 Subject: [PATCH 22/64] comments --- dcicutils/structured_data.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index a448a578b..548e79749 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -53,7 +53,7 @@ class StructuredDataSet: # can choose to lookup root path first, or not lookup root path at all, or not lookup # subtypes at all; the ref_lookup_strategy callable if specified should take a type_name # and value (string) arguements and return an integer of any of the below ORed together. - # The main purpose of this is optimization; to minimum portal lookups; since for example, + # The main purpose of this is optimization; to minimize portal lookups; since for example, # currently at least, /{type}/{accession} does not work but /{accession} does; so we # currently (smaht-portal/.../ingestion_processors) use REF_LOOKUP_ROOT_FIRST for this. # And current usage NEVER has REF_LOOKUP_SUBTYPES turned OFF; but support just in case. @@ -805,7 +805,8 @@ def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: # Found cached resolved reference. if not resolved: # Cached resolved reference is empty ([]). - # It might NOW be found internally, since the portal self._data can change. + # It might NOW be found internally, since the portal self._data + # can change, as the data (e.g. spreadsheet sheets) are parsed. ref_lookup_strategy = self._ref_lookup_strategy(type_name, value) is_ref_lookup_subtypes = StructuredDataSet._is_ref_lookup_subtypes(ref_lookup_strategy) subtype_names = self._get_schema_subtypes(type_name) if is_ref_lookup_subtypes else None @@ -818,7 +819,9 @@ def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: return resolved # Not cached here. self._ref_exists_cache_miss_count += 1 - # Get the lookup strategy. + # Get the lookup strategy; i.e. should do we lookup by root path, and if so, should + # we do this first, and do we lookup by subtypes; by default we lookup by root path + # but not first, and we do lookup by subtypes. ref_lookup_strategy = self._ref_lookup_strategy(type_name, value) is_ref_lookup_root = StructuredDataSet._is_ref_lookup_root(ref_lookup_strategy) is_ref_lookup_root_first = StructuredDataSet._is_ref_lookup_root_first(ref_lookup_strategy) From 43a04813f54f5da852a15f00ea6d2a34b0c1fdb5 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Fri, 8 Mar 2024 11:52:41 -0500 Subject: [PATCH 23/64] comments --- dcicutils/structured_data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 548e79749..5c6a99b18 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -827,13 +827,13 @@ def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: is_ref_lookup_root_first = StructuredDataSet._is_ref_lookup_root_first(ref_lookup_strategy) is_ref_lookup_subtypes = StructuredDataSet._is_ref_lookup_subtypes(ref_lookup_strategy) subtype_names = self._get_schema_subtypes(type_name) if is_ref_lookup_subtypes else None - # Lookup internally first (including at subtypes if desired). + # Lookup internally first (including at subtypes if desired; root lookup not applicable here). is_resolved, resolved_uuid = self._ref_exists_internally(type_name, value, subtype_names) if is_resolved: resolved = [{"type": type_name, "uuid": resolved_uuid}] self._cache_ref(type_name, value, resolved, subtype_names) return resolved - # Not found internally; perform actual portal lookup (included at root and subtypes if desired). + # Not found internally; perform actual portal lookup (including at root and subtypes if desired). # First construct the list of lookup paths at which to look for the referenced item. lookup_paths = [] if is_ref_lookup_root_first: From 99758ef47f462d6ad73c6e2948d8a4820c2307fd Mon Sep 17 00:00:00 2001 From: David Michaels Date: Fri, 8 Mar 2024 11:57:43 -0500 Subject: [PATCH 24/64] version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b30f169ed..a34cd6616 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b8" # TODO: To become 8.8.1 +version = "8.8.0.1b9" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 076164dad9e6f33b7adaad9c3a0b8c4d6134a8e7 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sat, 9 Mar 2024 11:22:02 -0500 Subject: [PATCH 25/64] more ref caching stuff --- dcicutils/portal_object_utils.py | 8 +++ dcicutils/structured_data.py | 111 +++++++++++++++++++++++++------ pyproject.toml | 2 +- test/test_structured_data.py | 19 ++++-- 4 files changed, 112 insertions(+), 28 deletions(-) diff --git a/dcicutils/portal_object_utils.py b/dcicutils/portal_object_utils.py index be93b1223..0c64d8747 100644 --- a/dcicutils/portal_object_utils.py +++ b/dcicutils/portal_object_utils.py @@ -1,5 +1,6 @@ from copy import deepcopy from functools import lru_cache +import re from typing import Any, List, Optional, Tuple, Type, Union from dcicutils.data_readers import RowReader from dcicutils.misc_utils import create_readonly_object @@ -105,6 +106,13 @@ def identifying_paths(self) -> Optional[List[str]]: identifying_paths.append(f"/{self.type}/{identifying_value_item}") identifying_paths.append(f"/{identifying_value_item}") else: + if (schema := self.schema): + if pattern := schema.get("properties", {}).get(identifying_property, {}).get("pattern"): + if not re.match(pattern, identifying_value): + # If this identifying value is for a (identifying) property which has a + # pattern, and the value does NOT match the pattern, then do NOT include + # this value as an identifying path, since it cannot possibly be found. + continue if self.type: identifying_paths.append(f"/{self.type}/{identifying_value}") identifying_paths.append(f"/{identifying_value}") diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 5c6a99b18..59b9cc7d6 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -6,6 +6,7 @@ from pyramid.router import Router import re import sys +from tqdm import tqdm from typing import Any, Callable, List, Optional, Tuple, Type, Union from webtest.app import TestApp from dcicutils.common import OrchestratedApp @@ -57,17 +58,20 @@ class StructuredDataSet: # currently at least, /{type}/{accession} does not work but /{accession} does; so we # currently (smaht-portal/.../ingestion_processors) use REF_LOOKUP_ROOT_FIRST for this. # And current usage NEVER has REF_LOOKUP_SUBTYPES turned OFF; but support just in case. - REF_LOOKUP_ROOT = 0x0001 - REF_LOOKUP_ROOT_FIRST = 0x0002 | REF_LOOKUP_ROOT - REF_LOOKUP_SUBTYPES = 0x0004 - REF_LOOKUP_MINIMAL = 0 - REF_LOOKUP_DEFAULT = REF_LOOKUP_ROOT | REF_LOOKUP_SUBTYPES + REF_LOOKUP_SPECIFIED_TYPE = 0x0001 + REF_LOOKUP_ROOT = 0x0002 + REF_LOOKUP_ROOT_FIRST = 0x0004 | REF_LOOKUP_ROOT + REF_LOOKUP_SUBTYPES = 0x0008 + REF_LOOKUP_DEFAULT = REF_LOOKUP_SPECIFIED_TYPE | REF_LOOKUP_ROOT | REF_LOOKUP_SUBTYPES def __init__(self, file: Optional[str] = None, portal: Optional[Union[VirtualApp, TestApp, Portal]] = None, schemas: Optional[List[dict]] = None, autoadd: Optional[dict] = None, order: Optional[List[str]] = None, prune: bool = True, ref_lookup_strategy: Optional[Callable] = None, - ref_lookup_nocache: bool = False) -> None: + ref_lookup_nocache: bool = False, + progress: bool = False) -> None: + progress = False + self._progress = progress self._data = {} self._portal = Portal(portal, data=self._data, schemas=schemas, ref_lookup_strategy=ref_lookup_strategy, @@ -81,6 +85,21 @@ def __init__(self, file: Optional[str] = None, portal: Optional[Union[VirtualApp self._autoadd_properties = autoadd if isinstance(autoadd, dict) and autoadd else None self._load_file(file) if file else None + def _progress_add(self, amount: Union[int, Callable]) -> None: + if self._progress is not False and self._progress is not None: + if callable(amount): + amount = amount() + if not isinstance(amount, int): + return + if self._progress is True: + if amount > 0: + self._progress = tqdm(total=amount) + elif isinstance(self._progress, tqdm): + if amount > 0: + self._progress.total += amount + elif amount < 0: + self._progress.update(-amount) + @property def data(self) -> dict: return self._data @@ -223,6 +242,15 @@ def _load_csv_file(self, file: str) -> None: self._load_reader(CsvReader(file), type_name=Schema.type_name(file)) def _load_excel_file(self, file: str) -> None: + def calculate_total_rows_to_process(): + nonlocal file + excel = Excel(file) + nrows = 0 + for sheet_name in excel.sheet_names: + for row in excel.sheet_reader(sheet_name): + nrows += 1 + return nrows + self._progress_add(calculate_total_rows_to_process) excel = Excel(file) # Order the sheet names by any specified ordering (e.g. ala snovault.loadxl). order = {Schema.type_name(key): index for index, key in enumerate(self._order)} if self._order else {} for sheet_name in sorted(excel.sheet_names, key=lambda key: order.get(Schema.type_name(key), sys.maxsize)): @@ -262,6 +290,7 @@ def _load_reader(self, reader: RowReader, type_name: str) -> None: if self._autoadd_properties: self._add_properties(structured_row, self._autoadd_properties, schema) self._add(type_name, structured_row) + self._progress_add(-1) self._note_warning(reader.warnings, "reader") if schema: self._note_error(schema._unresolved_refs, "ref") @@ -280,6 +309,10 @@ def _add_properties(self, structured_row: dict, properties: dict, schema: Option if name not in structured_row and (not schema or schema.data.get("properties", {}).get(name)): structured_row[name] = properties[name] + def _is_ref_lookup_specified_type(ref_lookup_flags: int) -> bool: + return (ref_lookup_flags & + StructuredDataSet.REF_LOOKUP_SPECIFIED_TYPE) == StructuredDataSet.REF_LOOKUP_SPECIFIED_TYPE + def _is_ref_lookup_root(ref_lookup_flags: int) -> bool: return (ref_lookup_flags & StructuredDataSet.REF_LOOKUP_ROOT) == StructuredDataSet.REF_LOOKUP_ROOT @@ -325,6 +358,10 @@ def ref_exists_cache_hit_count(self) -> int: def ref_exists_cache_miss_count(self) -> int: return self.portal.ref_exists_cache_miss_count if self.portal else -1 + @property + def ref_incorrect_identifying_property_count(self) -> int: + return self.portal.ref_incorrect_identifying_property_count if self.portal else -1 + def _note_warning(self, item: Optional[Union[dict, List[dict]]], group: str) -> None: self._note_issue(self._warnings, item, group) @@ -549,6 +586,7 @@ def map_ref(value: str, link_to: str, portal: Optional[Portal], src: Optional[st nonlocal self, typeinfo if not value: if (column := typeinfo.get("column")) and column in self.data.get("required", []): + # TODO: If think we do have the column (and type?) name(s) originating the ref yes? self._unresolved_refs.append({"src": src, "error": f"/{link_to}/"}) elif portal: if not (resolved := portal.ref_exists(link_to, value)): @@ -562,6 +600,7 @@ def map_ref(value: str, link_to: str, portal: Optional[Portal], src: Optional[st else: # A resolved-ref set value is a tuple of the reference path and its uuid. self._resolved_refs.add((f"/{link_to}/{value}", resolved[0].get("uuid"))) +# self._resolved_refs.add((f"/{link_to}/{value}", resolved[0].get("uuid"), resolved[0].get("data"))) return value return lambda value, src: map_ref(value, typeinfo.get("linkTo"), self._portal, src) @@ -720,7 +759,7 @@ def __init__(self, if callable(ref_lookup_strategy): self._ref_lookup_strategy = ref_lookup_strategy else: - self._ref_lookup_strategy = lambda type_name, value: StructuredDataSet.REF_LOOKUP_DEFAULT + self._ref_lookup_strategy = lambda type_name, schema, value: (StructuredDataSet.REF_LOOKUP_DEFAULT, None) if ref_lookup_nocache is True: self.ref_lookup = self.ref_lookup_nocache self._ref_cache = None @@ -733,6 +772,7 @@ def __init__(self, self._ref_exists_internal_count = 0 self._ref_exists_cache_hit_count = 0 self._ref_exists_cache_miss_count = 0 + self._ref_incorrect_identifying_property_count = 0 @lru_cache(maxsize=8092) def ref_lookup_cache(self, object_name: str) -> Optional[dict]: @@ -740,7 +780,7 @@ def ref_lookup_cache(self, object_name: str) -> Optional[dict]: def ref_lookup_nocache(self, object_name: str) -> Optional[dict]: try: - result = super().get_metadata(object_name) + result = super().get_metadata(object_name, raw=True) self._ref_lookup_found_count += 1 return result except Exception as e: @@ -807,10 +847,11 @@ def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: # Cached resolved reference is empty ([]). # It might NOW be found internally, since the portal self._data # can change, as the data (e.g. spreadsheet sheets) are parsed. - ref_lookup_strategy = self._ref_lookup_strategy(type_name, value) + ref_lookup_strategy, _ = self._ref_lookup_strategy(type_name, self.get_schema(type_name), value) is_ref_lookup_subtypes = StructuredDataSet._is_ref_lookup_subtypes(ref_lookup_strategy) subtype_names = self._get_schema_subtypes(type_name) if is_ref_lookup_subtypes else None - is_resolved, resolved_uuid = self._ref_exists_internally(type_name, value, subtype_names) + is_resolved, identifying_property, resolved_uuid = ( + self._ref_exists_internally(type_name, value, subtype_names)) if is_resolved: resolved = [{"type": type_name, "uuid": resolved_uuid}] self._cache_ref(type_name, value, resolved, subtype_names) @@ -822,14 +863,23 @@ def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: # Get the lookup strategy; i.e. should do we lookup by root path, and if so, should # we do this first, and do we lookup by subtypes; by default we lookup by root path # but not first, and we do lookup by subtypes. - ref_lookup_strategy = self._ref_lookup_strategy(type_name, value) + ref_lookup_strategy, incorrect_identifying_property = ( + self._ref_lookup_strategy(type_name, self.get_schema(type_name), value)) + is_ref_lookup_specified_type = StructuredDataSet._is_ref_lookup_specified_type(ref_lookup_strategy) is_ref_lookup_root = StructuredDataSet._is_ref_lookup_root(ref_lookup_strategy) is_ref_lookup_root_first = StructuredDataSet._is_ref_lookup_root_first(ref_lookup_strategy) is_ref_lookup_subtypes = StructuredDataSet._is_ref_lookup_subtypes(ref_lookup_strategy) subtype_names = self._get_schema_subtypes(type_name) if is_ref_lookup_subtypes else None # Lookup internally first (including at subtypes if desired; root lookup not applicable here). - is_resolved, resolved_uuid = self._ref_exists_internally(type_name, value, subtype_names) + is_resolved, identifying_property, resolved_uuid = ( + self._ref_exists_internally(type_name, value, subtype_names, + incorrect_identifying_property=incorrect_identifying_property)) if is_resolved: + if identifying_property == incorrect_identifying_property: + # Not REALLY resolved as it resolved to a property which is NOT an identifying + # property, but may be commonly mistaken for one (e.g. UnalignedReads.filename). + self._ref_incorrect_identifying_property_count += 1 + return [] resolved = [{"type": type_name, "uuid": resolved_uuid}] self._cache_ref(type_name, value, resolved, subtype_names) return resolved @@ -838,12 +888,16 @@ def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: lookup_paths = [] if is_ref_lookup_root_first: lookup_paths.append(f"/{value}") - lookup_paths.append(f"/{type_name}/{value}") + if is_ref_lookup_specified_type: + lookup_paths.append(f"/{type_name}/{value}") if is_ref_lookup_root and not is_ref_lookup_root_first: lookup_paths.append(f"/{value}") if subtype_names: for subtype_name in subtype_names: lookup_paths.append(f"/{subtype_name}/{value}") + if not lookup_paths: + # No (i.e. zero) lookup strategy means no ref lookup at all. + return [] # Do the actual lookup in the portal for each of the desired lookup paths. for lookup_path in lookup_paths: if isinstance(item := self.ref_lookup(lookup_path), dict): @@ -854,15 +908,21 @@ def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: self._cache_ref(type_name, value, [], subtype_names) return [] - def _ref_exists_internally(self, type_name: str, value: str, - subtype_names: Optional[List[str]] = None) -> Tuple[bool, Optional[str]]: + def _ref_exists_internally( + self, type_name: str, value: str, + subtype_names: Optional[List[str]] = None, + incorrect_identifying_property: Optional[str] = None) -> Tuple[bool, Optional[str], Optional[str]]: for type_name in [type_name] + (subtype_names or []): - is_resolved, resolved_uuid = self._ref_exists_single_internally(type_name, value) + is_resolved, identifying_property, resolved_uuid = self._ref_exists_single_internally( + type_name, value, incorrect_identifying_property=incorrect_identifying_property) if is_resolved: - return True, resolved_uuid - return False, None + return True, identifying_property, resolved_uuid + return False, None, None - def _ref_exists_single_internally(self, type_name: str, value: str) -> Tuple[bool, Optional[str]]: + def _ref_exists_single_internally( + self, type_name: str, value: str, + incorrect_identifying_property: + Optional[str] = None) -> Tuple[bool, Optional[str], Optional[str]]: if self._data and (items := self._data.get(type_name)) and (schema := self.get_schema(type_name)): identifying_properties = set(schema.get("identifyingProperties", [])) | {"identifier", "uuid"} for item in items: @@ -871,8 +931,13 @@ def _ref_exists_single_internally(self, type_name: str, value: str) -> Tuple[boo if ((identifying_value == value) or (isinstance(identifying_value, list) and (value in identifying_value))): # noqa self._ref_exists_internal_count += 1 - return True, item.get("uuid", None) - return False, None + return True, identifying_property, item.get("uuid", None) + if incorrect_identifying_property: + if (identifying_value := item.get(incorrect_identifying_property, None)) is not None: + if ((identifying_value == value) or + (isinstance(identifying_value, list) and (value in identifying_value))): # noqa + return True, incorrect_identifying_property, item.get("uuid", None) + return False, None, None @property def ref_lookup_cache_hit_count(self) -> int: @@ -920,6 +985,10 @@ def ref_exists_cache_hit_count(self) -> int: def ref_exists_cache_miss_count(self) -> int: return self._ref_exists_cache_miss_count + @property + def ref_incorrect_identifying_property_count(self) -> int: + return self._ref_incorrect_identifying_property_count + @staticmethod def create_for_testing(arg: Optional[Union[str, bool, List[dict], dict, Callable]] = None, schemas: Optional[List[dict]] = None) -> Portal: diff --git a/pyproject.toml b/pyproject.toml index a34cd6616..294a6b70c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b9" # TODO: To become 8.8.1 +version = "8.8.0.1b10" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" diff --git a/test/test_structured_data.py b/test/test_structured_data.py index 4e10dcba3..612f6a1c3 100644 --- a/test/test_structured_data.py +++ b/test/test_structured_data.py @@ -4,7 +4,7 @@ import os import pytest import re -from typing import Callable, List, Optional, Union +from typing import Callable, List, Optional, Tuple, Union from unittest import mock from webtest import TestApp from dcicutils.misc_utils import VirtualApp @@ -1513,11 +1513,18 @@ def parse_structured_data(file: str, portal: Optional[Union[VirtualApp, TestApp, autoadd: Optional[dict] = None, prune: bool = True, ref_nocache: bool = False) -> StructuredDataSet: - def ref_lookup_strategy(type_name: str, value: str) -> int: - if is_accession(value): - return StructuredDataSet.REF_LOOKUP_DEFAULT | StructuredDataSet.REF_LOOKUP_ROOT_FIRST - else: - return StructuredDataSet.REF_LOOKUP_DEFAULT + def ref_lookup_strategy(type_name: str, schema: dict, value: str) -> (int, Optional[str]): + not_an_identifying_property = "filename" + if schema_properties := schema.get("properties"): + if schema_properties.get("accession") and is_accession(value): + # Case: lookup by accession (only by root). + return StructuredDataSet.REF_LOOKUP_ROOT, not_an_identifying_property + elif schema_property_info_submitted_id := schema_properties.get("submitted_id"): + if schema_property_pattern_submitted_id := schema_property_info_submitted_id.get("pattern"): + if re.match(schema_property_pattern_submitted_id, value): + # Case: lookup by submitted_id (only by specified type). + return StructuredDataSet.REF_LOOKUP_SPECIFIED_TYPE, not_an_identifying_property + return StructuredDataSet.REF_LOOKUP_DEFAULT, not_an_identifying_property structured_data = StructuredDataSet.load(file=file, portal=portal, autoadd=autoadd, order=ITEM_INDEX_ORDER, prune=prune, From 068570a13122f1b1b2336fcc942c9991bafc96d2 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sat, 9 Mar 2024 11:22:51 -0500 Subject: [PATCH 26/64] more ref caching stuff --- test/test_structured_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_structured_data.py b/test/test_structured_data.py index 612f6a1c3..7ea76fdfd 100644 --- a/test/test_structured_data.py +++ b/test/test_structured_data.py @@ -1513,7 +1513,7 @@ def parse_structured_data(file: str, portal: Optional[Union[VirtualApp, TestApp, autoadd: Optional[dict] = None, prune: bool = True, ref_nocache: bool = False) -> StructuredDataSet: - def ref_lookup_strategy(type_name: str, schema: dict, value: str) -> (int, Optional[str]): + def ref_lookup_strategy(type_name: str, schema: dict, value: str) -> Tuple[int, Optional[str]]: not_an_identifying_property = "filename" if schema_properties := schema.get("properties"): if schema_properties.get("accession") and is_accession(value): From 1354c3b46344eff72ce9dc85eb5c772a09b49aca Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sat, 9 Mar 2024 16:05:22 -0500 Subject: [PATCH 27/64] additional ref caching related change --- dcicutils/structured_data.py | 12 ++++++++++-- pyproject.toml | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 59b9cc7d6..ebf164bfb 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -847,12 +847,20 @@ def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: # Cached resolved reference is empty ([]). # It might NOW be found internally, since the portal self._data # can change, as the data (e.g. spreadsheet sheets) are parsed. - ref_lookup_strategy, _ = self._ref_lookup_strategy(type_name, self.get_schema(type_name), value) + # TODO: Consolidate this with the below similar usage. + ref_lookup_strategy, incorrect_identifying_property = ( + self._ref_lookup_strategy(type_name, self.get_schema(type_name), value)) is_ref_lookup_subtypes = StructuredDataSet._is_ref_lookup_subtypes(ref_lookup_strategy) subtype_names = self._get_schema_subtypes(type_name) if is_ref_lookup_subtypes else None is_resolved, identifying_property, resolved_uuid = ( - self._ref_exists_internally(type_name, value, subtype_names)) + self._ref_exists_internally(type_name, value, subtype_names, + incorrect_identifying_property=incorrect_identifying_property)) if is_resolved: + if identifying_property == incorrect_identifying_property: + # Not REALLY resolved as it resolved to a property which is NOT an identifying + # property, but may be commonly mistaken for one (e.g. UnalignedReads.filename). + self._ref_incorrect_identifying_property_count += 1 + return [] resolved = [{"type": type_name, "uuid": resolved_uuid}] self._cache_ref(type_name, value, resolved, subtype_names) return resolved diff --git a/pyproject.toml b/pyproject.toml index 294a6b70c..d8e16ff22 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b10" # TODO: To become 8.8.1 +version = "8.8.0.1b11" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 0b70e6220d45c46a8c07b60fc39e6aa627d832a0 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sat, 9 Mar 2024 16:41:42 -0500 Subject: [PATCH 28/64] minor fix to structured_data for comapres --- dcicutils/structured_data.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index ebf164bfb..03a2be91a 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -205,7 +205,7 @@ def compare(self) -> dict: diffs[object_type].append(create_readonly_object(path=identifying_path, uuid=existing_object.uuid, diffs=object_diffs or None)) - else: + elif identifying_path: # If there is no existing object we still create a record for this object # but with no uuid which will be the indication that it does not exist. diffs[object_type].append(create_readonly_object(path=identifying_path, uuid=None, diffs=None)) diff --git a/pyproject.toml b/pyproject.toml index d8e16ff22..af9b3ac98 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b11" # TODO: To become 8.8.1 +version = "8.8.0.1b12" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 6437adfa6e07ec480ba175a3176cb7067d74f2c7 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sat, 9 Mar 2024 16:54:10 -0500 Subject: [PATCH 29/64] added debug_sleep option to structured_data for testing. --- dcicutils/structured_data.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 03a2be91a..08a1fcc25 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -6,6 +6,7 @@ from pyramid.router import Router import re import sys +import time from tqdm import tqdm from typing import Any, Callable, List, Optional, Tuple, Type, Union from webtest.app import TestApp @@ -69,7 +70,8 @@ def __init__(self, file: Optional[str] = None, portal: Optional[Union[VirtualApp order: Optional[List[str]] = None, prune: bool = True, ref_lookup_strategy: Optional[Callable] = None, ref_lookup_nocache: bool = False, - progress: bool = False) -> None: + progress: bool = False, + debug_sleep: Optional[str] = None) -> None: progress = False self._progress = progress self._data = {} @@ -83,6 +85,12 @@ def __init__(self, file: Optional[str] = None, portal: Optional[Union[VirtualApp self._resolved_refs = set() self._validated = False self._autoadd_properties = autoadd if isinstance(autoadd, dict) and autoadd else None + self._debug_sleep = None + if debug_sleep: + try: + self._debug_sleep = float(debug_sleep) + except Exception: + self._debug_sleep = None self._load_file(file) if file else None def _progress_add(self, amount: Union[int, Callable]) -> None: @@ -113,9 +121,10 @@ def load(file: str, portal: Optional[Union[VirtualApp, TestApp, Portal]] = None, schemas: Optional[List[dict]] = None, autoadd: Optional[dict] = None, order: Optional[List[str]] = None, prune: bool = True, ref_lookup_strategy: Optional[Callable] = None, - ref_lookup_nocache: bool = False) -> StructuredDataSet: + ref_lookup_nocache: bool = False, debug_sleep: Optional[str] = None) -> StructuredDataSet: return StructuredDataSet(file=file, portal=portal, schemas=schemas, autoadd=autoadd, order=order, prune=prune, - ref_lookup_strategy=ref_lookup_strategy, ref_lookup_nocache=ref_lookup_nocache) + ref_lookup_strategy=ref_lookup_strategy, ref_lookup_nocache=ref_lookup_nocache, + debug_sleep=debug_sleep) def validate(self, force: bool = False) -> None: def data_without_deleted_properties(data: dict) -> dict: @@ -278,6 +287,8 @@ def _load_reader(self, reader: RowReader, type_name: str) -> None: noschema = False structured_row_template = None for row in reader: + if self._debug_sleep: + time.sleep(float(self._debug_sleep)) if not structured_row_template: # Delay creation just so we don't reference schema if there are no rows. if not schema and not noschema and not (schema := Schema.load_by_name(type_name, portal=self._portal)): noschema = True From 59858fa066eaf069f09fe7a7bfe24f0061d2085d Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sat, 9 Mar 2024 16:55:13 -0500 Subject: [PATCH 30/64] version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index af9b3ac98..49d27bf21 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b12" # TODO: To become 8.8.1 +version = "8.8.0.1b13" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From f7242fb11a0d0f15dfd0bc118c7c583fbccf9356 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sat, 9 Mar 2024 17:15:55 -0500 Subject: [PATCH 31/64] suppress openpyxl warning - UserWarning: data validation extension is not supported and will be removed --- dcicutils/data_readers.py | 7 ++++++- pyproject.toml | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/dcicutils/data_readers.py b/dcicutils/data_readers.py index 39450d11c..4af4e473b 100644 --- a/dcicutils/data_readers.py +++ b/dcicutils/data_readers.py @@ -168,7 +168,12 @@ def sheet_reader(self, sheet_name: str) -> ExcelSheetReader: def open(self) -> None: if self._workbook is None: - self._workbook = openpyxl.load_workbook(self._file, data_only=True) + import warnings + with warnings.catch_warnings(): + # Without this warning suppression thing, for some spreadsheets we get this stdout warning: + # UserWarning: data validation extension is not supported and will be removed + warnings.filterwarnings("ignore", category=UserWarning) + self._workbook = openpyxl.load_workbook(self._file, data_only=True) self.sheet_names = [sheet_name for sheet_name in self._workbook.sheetnames if not self.is_hidden_sheet(self._workbook[sheet_name])] diff --git a/pyproject.toml b/pyproject.toml index 49d27bf21..6643d8fd0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b13" # TODO: To become 8.8.1 +version = "8.8.0.1b14" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 1888bc3500c1a8e9ddacf4346eb3618f3b50e024 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sat, 9 Mar 2024 23:02:04 -0500 Subject: [PATCH 32/64] progress stuff --- dcicutils/structured_data.py | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 08a1fcc25..1c2d11409 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -7,7 +7,6 @@ import re import sys import time -from tqdm import tqdm from typing import Any, Callable, List, Optional, Tuple, Type, Union from webtest.app import TestApp from dcicutils.common import OrchestratedApp @@ -70,10 +69,9 @@ def __init__(self, file: Optional[str] = None, portal: Optional[Union[VirtualApp order: Optional[List[str]] = None, prune: bool = True, ref_lookup_strategy: Optional[Callable] = None, ref_lookup_nocache: bool = False, - progress: bool = False, + progress: Optional[Callable] = None, debug_sleep: Optional[str] = None) -> None: - progress = False - self._progress = progress + self._progress = progress if callable(progress) else None self._data = {} self._portal = Portal(portal, data=self._data, schemas=schemas, ref_lookup_strategy=ref_lookup_strategy, @@ -93,20 +91,15 @@ def __init__(self, file: Optional[str] = None, portal: Optional[Union[VirtualApp self._debug_sleep = None self._load_file(file) if file else None - def _progress_add(self, amount: Union[int, Callable]) -> None: - if self._progress is not False and self._progress is not None: - if callable(amount): - amount = amount() - if not isinstance(amount, int): - return - if self._progress is True: - if amount > 0: - self._progress = tqdm(total=amount) - elif isinstance(self._progress, tqdm): - if amount > 0: - self._progress.total += amount - elif amount < 0: - self._progress.update(-amount) + def _progress_update(self, nrows: Union[int, Callable], + nrefs_resolved: Optional[int] = None, + nrefs_unresolved: Optional[int] = None, + nlookups: Optional[int] = None) -> None: + if self._progress: + if callable(nrows): + nrows = nrows() + if isinstance(nrows, int) and nrows != 0: + self._progress(nrows, nrefs_resolved, nrefs_unresolved, nlookups) @property def data(self) -> dict: @@ -259,7 +252,8 @@ def calculate_total_rows_to_process(): for row in excel.sheet_reader(sheet_name): nrows += 1 return nrows - self._progress_add(calculate_total_rows_to_process) + if self._progress: + self._progress_update(calculate_total_rows_to_process) excel = Excel(file) # Order the sheet names by any specified ordering (e.g. ala snovault.loadxl). order = {Schema.type_name(key): index for index, key in enumerate(self._order)} if self._order else {} for sheet_name in sorted(excel.sheet_names, key=lambda key: order.get(Schema.type_name(key), sys.maxsize)): @@ -301,7 +295,8 @@ def _load_reader(self, reader: RowReader, type_name: str) -> None: if self._autoadd_properties: self._add_properties(structured_row, self._autoadd_properties, schema) self._add(type_name, structured_row) - self._progress_add(-1) + if self._progress: + self._progress_update(-1, len(self._resolved_refs), len(self.ref_errors), self.ref_lookup_count) self._note_warning(reader.warnings, "reader") if schema: self._note_error(schema._unresolved_refs, "ref") From 3f738e756db06241adf7a60e4c513bf475423f8d Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sat, 9 Mar 2024 23:02:25 -0500 Subject: [PATCH 33/64] progress stuff --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6643d8fd0..3ab596e45 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b14" # TODO: To become 8.8.1 +version = "8.8.0.1b15" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 96c91c4006d4b13186f293133d258aa2152bc075 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sun, 10 Mar 2024 08:28:37 -0400 Subject: [PATCH 34/64] quite of bit of refactor of ref lookup in structured_data --- dcicutils/structured_data.py | 235 ++++++++++++++++++++++------------- test/test_structured_data.py | 2 +- 2 files changed, 149 insertions(+), 88 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 1c2d11409..709c2eef6 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -328,6 +328,18 @@ def _is_ref_lookup_root_first(ref_lookup_flags: int) -> bool: def _is_ref_lookup_subtypes(ref_lookup_flags: int) -> bool: return (ref_lookup_flags & StructuredDataSet.REF_LOOKUP_SUBTYPES) == StructuredDataSet.REF_LOOKUP_SUBTYPES + @property + def ref_total_count(self) -> int: + return self.portal.ref_total_count if self.portal else -1 + + @property + def ref_total_found_count(self) -> int: + return self.portal.ref_total_found_count if self.portal else -1 + + @property + def ref_total_notfound_count(self) -> int: + return self.portal.ref_total_notfound_count if self.portal else -1 + @property def ref_lookup_cache_hit_count(self) -> int: return self.portal.ref_lookup_cache_hit_count if self.portal else -1 @@ -356,6 +368,10 @@ def ref_lookup_error_count(self) -> int: def ref_exists_internal_count(self) -> int: return self.portal.ref_exists_internal_count if self.portal else -1 + @property + def ref_exists_external_count(self) -> int: + return self.portal.ref_exists_external_count if self.portal else -1 + @property def ref_exists_cache_hit_count(self) -> int: return self.portal.ref_exists_cache_hit_count if self.portal else -1 @@ -595,7 +611,7 @@ def map_ref(value: str, link_to: str, portal: Optional[Portal], src: Optional[st # TODO: If think we do have the column (and type?) name(s) originating the ref yes? self._unresolved_refs.append({"src": src, "error": f"/{link_to}/"}) elif portal: - if not (resolved := portal.ref_exists(link_to, value)): + if not (resolved := portal.ref_exists(link_to, value, True)): self._unresolved_refs.append({"src": src, "error": f"/{link_to}/{value}"}) elif len(resolved) > 1: # TODO: Don't think we need this anymore; see TODO on Portal.ref_exists. @@ -767,24 +783,28 @@ def __init__(self, else: self._ref_lookup_strategy = lambda type_name, schema, value: (StructuredDataSet.REF_LOOKUP_DEFAULT, None) if ref_lookup_nocache is True: - self.ref_lookup = self.ref_lookup_nocache + self.ref_lookup = self.ref_lookup_uncached self._ref_cache = None else: - self.ref_lookup = self.ref_lookup_cache + self.ref_lookup = self.ref_lookup_cached self._ref_cache = {} self._ref_lookup_found_count = 0 self._ref_lookup_notfound_count = 0 self._ref_lookup_error_count = 0 self._ref_exists_internal_count = 0 + self._ref_exists_external_count = 0 self._ref_exists_cache_hit_count = 0 self._ref_exists_cache_miss_count = 0 self._ref_incorrect_identifying_property_count = 0 + self._ref_total_count = 0 + self._ref_total_found_count = 0 + self._ref_total_notfound_count = 0 @lru_cache(maxsize=8092) - def ref_lookup_cache(self, object_name: str) -> Optional[dict]: - return self.ref_lookup_nocache(object_name) + def ref_lookup_cached(self, object_name: str) -> Optional[dict]: + return self.ref_lookup_uncached(object_name) - def ref_lookup_nocache(self, object_name: str) -> Optional[dict]: + def ref_lookup_uncached(self, object_name: str) -> Optional[dict]: try: result = super().get_metadata(object_name, raw=True) self._ref_lookup_found_count += 1 @@ -819,10 +839,10 @@ def get_schemas(self) -> Optional[dict]: return schemas @lru_cache(maxsize=64) - def _get_schema_subtypes(self, type_name: str) -> Optional[List[str]]: + def _get_schema_subtypes_names(self, type_name: str) -> List[str]: if not (schemas_super_type_map := self.get_schemas_super_type_map()): return [] - return schemas_super_type_map.get(type_name) + return schemas_super_type_map.get(type_name, []) def is_file_schema(self, schema_name: str) -> bool: """ @@ -832,72 +852,55 @@ def is_file_schema(self, schema_name: str) -> bool: def _ref_exists_from_cache(self, type_name: str, value: str) -> Optional[List[dict]]: if self._ref_cache is not None: + self._ref_exists_cache_hit_count += 1 return self._ref_cache.get(f"/{type_name}/{value}", None) + self._ref_exists_cache_miss_count += 1 return None - def _cache_ref(self, type_name: str, value: str, resolved: List[str], subtype_names: Optional[List[str]]) -> None: + def _cache_ref(self, type_name: str, value: str, resolved: List[str]) -> None: + subtype_names = self._get_schema_subtypes_names(type_name) if self._ref_cache is not None: - for type_name in [type_name] + (subtype_names if subtype_names else []): + for type_name in [type_name] + subtype_names: self._ref_cache[f"/{type_name}/{value}"] = resolved - def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: + def ref_exists(self, type_name: str, value: Optional[str] = None, called_from_map_ref: bool = False) -> List[dict]: + print(f"\033[Kxyzzy:ref_exists({type_name}/{value})") if not value: if type_name.startswith("/") and len(parts := type_name[1:].split("/")) == 2: if not (type_name := parts[0]) or not (value := parts[1]): return [] else: return [] + if called_from_map_ref: + self._ref_total_count += 1 + # First check our reference cache. if (resolved := self._ref_exists_from_cache(type_name, value)) is not None: - # Found cached resolved reference. - if not resolved: - # Cached resolved reference is empty ([]). - # It might NOW be found internally, since the portal self._data - # can change, as the data (e.g. spreadsheet sheets) are parsed. - # TODO: Consolidate this with the below similar usage. - ref_lookup_strategy, incorrect_identifying_property = ( - self._ref_lookup_strategy(type_name, self.get_schema(type_name), value)) - is_ref_lookup_subtypes = StructuredDataSet._is_ref_lookup_subtypes(ref_lookup_strategy) - subtype_names = self._get_schema_subtypes(type_name) if is_ref_lookup_subtypes else None - is_resolved, identifying_property, resolved_uuid = ( - self._ref_exists_internally(type_name, value, subtype_names, - incorrect_identifying_property=incorrect_identifying_property)) - if is_resolved: - if identifying_property == incorrect_identifying_property: - # Not REALLY resolved as it resolved to a property which is NOT an identifying - # property, but may be commonly mistaken for one (e.g. UnalignedReads.filename). - self._ref_incorrect_identifying_property_count += 1 - return [] - resolved = [{"type": type_name, "uuid": resolved_uuid}] - self._cache_ref(type_name, value, resolved, subtype_names) - return resolved - self._ref_exists_cache_hit_count += 1 + # Found CACHED reference. + if resolved: + # Found cached RESOLVED reference (non-empty array). + if called_from_map_ref: + self._ref_total_found_count += 1 + return resolved + # Found cached UNRESOLVED reference (empty array); meaning it was looked + # up but not found. It might NOW be found INTERNALLY, since the portal + # self._data can change, i.e. as data (e.g. spreadsheet sheets) are parsed. + return self._ref_exists_internally(type_name, value, update_counts=called_from_map_ref) or [] + # Reference is NOT cached here; lookup INTERNALLY first. + if (resolved := self._ref_exists_internally(type_name, value, update_counts=called_from_map_ref)) is None: + # Reference was resolved (internally) INCORRECTLY. + return [] + if resolved: + # Reference was resolved internally. return resolved - # Not cached here. - self._ref_exists_cache_miss_count += 1 + # Reference is NOT cached and was NOT resolved internally; lookup in PORTAL. # Get the lookup strategy; i.e. should do we lookup by root path, and if so, should # we do this first, and do we lookup by subtypes; by default we lookup by root path - # but not first, and we do lookup by subtypes. - ref_lookup_strategy, incorrect_identifying_property = ( - self._ref_lookup_strategy(type_name, self.get_schema(type_name), value)) + # but not first, and we also lookup by subtypes by default. + ref_lookup_strategy, _ = self._ref_lookup_strategy(type_name, self.get_schema(type_name), value) is_ref_lookup_specified_type = StructuredDataSet._is_ref_lookup_specified_type(ref_lookup_strategy) is_ref_lookup_root = StructuredDataSet._is_ref_lookup_root(ref_lookup_strategy) is_ref_lookup_root_first = StructuredDataSet._is_ref_lookup_root_first(ref_lookup_strategy) is_ref_lookup_subtypes = StructuredDataSet._is_ref_lookup_subtypes(ref_lookup_strategy) - subtype_names = self._get_schema_subtypes(type_name) if is_ref_lookup_subtypes else None - # Lookup internally first (including at subtypes if desired; root lookup not applicable here). - is_resolved, identifying_property, resolved_uuid = ( - self._ref_exists_internally(type_name, value, subtype_names, - incorrect_identifying_property=incorrect_identifying_property)) - if is_resolved: - if identifying_property == incorrect_identifying_property: - # Not REALLY resolved as it resolved to a property which is NOT an identifying - # property, but may be commonly mistaken for one (e.g. UnalignedReads.filename). - self._ref_incorrect_identifying_property_count += 1 - return [] - resolved = [{"type": type_name, "uuid": resolved_uuid}] - self._cache_ref(type_name, value, resolved, subtype_names) - return resolved - # Not found internally; perform actual portal lookup (including at root and subtypes if desired). # First construct the list of lookup paths at which to look for the referenced item. lookup_paths = [] if is_ref_lookup_root_first: @@ -906,37 +909,74 @@ def ref_exists(self, type_name: str, value: Optional[str] = None) -> List[dict]: lookup_paths.append(f"/{type_name}/{value}") if is_ref_lookup_root and not is_ref_lookup_root_first: lookup_paths.append(f"/{value}") - if subtype_names: - for subtype_name in subtype_names: - lookup_paths.append(f"/{subtype_name}/{value}") + subtype_names = self._get_schema_subtypes_names(type_name) if is_ref_lookup_subtypes else [] + for subtype_name in subtype_names: + lookup_paths.append(f"/{subtype_name}/{value}") if not lookup_paths: # No (i.e. zero) lookup strategy means no ref lookup at all. + if called_from_map_ref: + self._ref_total_notfound_count += 1 return [] - # Do the actual lookup in the portal for each of the desired lookup paths. + # Do the actual lookup in portal for each of the desired lookup paths. for lookup_path in lookup_paths: - if isinstance(item := self.ref_lookup(lookup_path), dict): - resolved = [{"type": type_name, "uuid": item.get("uuid", None)}] - self._cache_ref(type_name, value, resolved, subtype_names) + if isinstance(resolved_item := self.ref_lookup(lookup_path), dict): + resolved = [{"type": type_name, "uuid": resolved_item.get("uuid", None)}] + self._cache_ref(type_name, value, resolved) + self._ref_exists_external_count += 1 + if called_from_map_ref: + self._ref_total_found_count += 1 return resolved # Not found at all; note that we cache this ([]) too; indicates lookup has been done. - self._cache_ref(type_name, value, [], subtype_names) + self._cache_ref(type_name, value, []) + if called_from_map_ref: + self._ref_total_notfound_count += 1 return [] - def _ref_exists_internally( - self, type_name: str, value: str, - subtype_names: Optional[List[str]] = None, - incorrect_identifying_property: Optional[str] = None) -> Tuple[bool, Optional[str], Optional[str]]: - for type_name in [type_name] + (subtype_names or []): - is_resolved, identifying_property, resolved_uuid = self._ref_exists_single_internally( - type_name, value, incorrect_identifying_property=incorrect_identifying_property) + def _ref_exists_internally(self, type_name: str, value: str, update_counts: bool = False) -> Optional[List[dict]]: + """ + Looks up the given reference (type/value) internally (i.e. with this data parsed thus far). + If found then returns a list of a single dictionary containing the (given) type name and + the uuid (if any) of the resolved item. If not found then returns an empty list; however, + if not found, but found using an "incorrect" identifying property, then returns None. + """ + # Note that root lookup not applicable here. + ref_lookup_strategy, incorrect_identifying_property = ( + self._ref_lookup_strategy(type_name, self.get_schema(type_name), value)) + is_ref_lookup_subtypes = StructuredDataSet._is_ref_lookup_subtypes(ref_lookup_strategy) + subtype_names = self._get_schema_subtypes_names(type_name) if is_ref_lookup_subtypes else [] + for type_name in [type_name] + subtype_names: + is_resolved, resolved_item = self._ref_exists_single_internally(type_name, value) if is_resolved: - return True, identifying_property, resolved_uuid - return False, None, None - - def _ref_exists_single_internally( - self, type_name: str, value: str, - incorrect_identifying_property: - Optional[str] = None) -> Tuple[bool, Optional[str], Optional[str]]: + if update_counts: + self._ref_exists_internal_count += 1 + self._ref_total_found_count += 1 + resolved = [{"type": type_name, "uuid": resolved_item.get("uuid")}] # xyzzy + self._cache_ref(type_name, value, resolved) + return resolved + # Here this reference is not resolved internally; but let us check any specified incorrect + # property to see if it would have been resolved using that; for example, if we pretend that + # UnalignedReads.filename were an identifying property (which it is not), then we see if this + # reference, which would otherwise be unresolved, would be resolved; in which case we have an + # incorrect reference; doing this can cut down considerably on useless lookups (at least for + # a case from He Li, early March 2024). + if incorrect_identifying_property: + if self._data and (items := self._data.get(type_name)): + for item in items: + if (identifying_value := item.get(incorrect_identifying_property, None)) is not None: + if ((identifying_value == value) or + (isinstance(identifying_value, list) and (value in identifying_value))): # noqa + # Not REALLY resolved as it resolved to a property which is NOT an identifying + # property, but may be commonly mistaken for one (e.g. UnalignedReads.filename). + # Return value to prevent actual portal lookup from happening. + if update_counts: + self._ref_incorrect_identifying_property_count += 1 + self._ref_total_notfound_count += 1 + return None # None return means resolved internally incorrectly. + if update_counts: + self._ref_total_notfound_count += 1 + return [] # Empty return means not resolved internally. + + def _ref_exists_single_internally(self, type_name: str, value: str) -> Tuple[bool, Optional[dict]]: if self._data and (items := self._data.get(type_name)) and (schema := self.get_schema(type_name)): identifying_properties = set(schema.get("identifyingProperties", [])) | {"identifier", "uuid"} for item in items: @@ -944,33 +984,50 @@ def _ref_exists_single_internally( if (identifying_value := item.get(identifying_property, None)) is not None: if ((identifying_value == value) or (isinstance(identifying_value, list) and (value in identifying_value))): # noqa - self._ref_exists_internal_count += 1 - return True, identifying_property, item.get("uuid", None) - if incorrect_identifying_property: - if (identifying_value := item.get(incorrect_identifying_property, None)) is not None: - if ((identifying_value == value) or - (isinstance(identifying_value, list) and (value in identifying_value))): # noqa - return True, incorrect_identifying_property, item.get("uuid", None) + return True, item + return False, None + + def _old___ref_exists_internally( + self, type_name: str, value: str, + subtype_names: Optional[List[str]] = None, + incorrect_identifying_property: Optional[str] = None) -> Tuple[bool, Optional[str], Optional[str]]: + for type_name in [type_name] + (subtype_names or []): + is_resolved, identifying_property, resolved_uuid = self._ref_exists_single_internally( + type_name, value, incorrect_identifying_property=incorrect_identifying_property) + if is_resolved: + return True, identifying_property, resolved_uuid return False, None, None @property def ref_lookup_cache_hit_count(self) -> int: if self._ref_cache is None: - return 0 + return -1 try: - return self.ref_lookup_cache.cache_info().hits + return self.ref_lookup_cached.cache_info().hits except Exception: return -1 @property def ref_lookup_cache_miss_count(self) -> int: if self._ref_cache is None: - return self.ref_lookup_count + return -1 try: - return self.ref_lookup_cache.cache_info().misses + return self.ref_lookup_cached.cache_info().misses except Exception: return -1 + @property + def ref_total_count(self) -> int: + return self._ref_total_count + + @property + def ref_total_found_count(self) -> int: + return self._ref_total_found_count + + @property + def ref_total_notfound_count(self) -> int: + return self._ref_total_notfound_count + @property def ref_lookup_count(self) -> int: return self._ref_lookup_found_count + self._ref_lookup_notfound_count + self._ref_lookup_error_count @@ -991,6 +1048,10 @@ def ref_lookup_error_count(self) -> int: def ref_exists_internal_count(self) -> int: return self._ref_exists_internal_count + @property + def ref_exists_external_count(self) -> int: + return self._ref_exists_external_count + @property def ref_exists_cache_hit_count(self) -> int: return self._ref_exists_cache_hit_count diff --git a/test/test_structured_data.py b/test/test_structured_data.py index 7ea76fdfd..ddcb368a9 100644 --- a/test/test_structured_data.py +++ b/test/test_structured_data.py @@ -1422,7 +1422,7 @@ def mocked_map_ref(value, link_to, portal, src): # noqa return value return map_ref(value, src) return lambda value, src: mocked_map_ref(value, typeinfo.get("linkTo"), self._portal, src) - def mocked_ref_exists(self, type_name, value): # noqa + def mocked_ref_exists(self, type_name, value, called_from_map_ref = False): # noqa nonlocal norefs, expected_refs, refs_actual refs_actual.add(ref := f"/{type_name}/{value}") if norefs is True or (isinstance(norefs, list) and ref in norefs): From 04f8d1f75e4e67c569d2f0883e640ffbc75fcae5 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sun, 10 Mar 2024 09:11:33 -0400 Subject: [PATCH 35/64] quite of bit of refactor of ref lookup in structured_data --- dcicutils/structured_data.py | 99 +++++++++++++++++------------------- test/test_structured_data.py | 3 +- 2 files changed, 49 insertions(+), 53 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 709c2eef6..0e10465ca 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -264,9 +264,10 @@ def calculate_total_rows_to_process(): ref_errors_actual = [] for ref_error in ref_errors: if not (resolved := self.portal.ref_exists(ref := ref_error["error"])): +# if not (resolved := self.portal.ref_exists_internally(ref := ref_error["error"])): ref_errors_actual.append(ref_error) else: - self._resolved_refs.add((ref, resolved[0].get("uuid"))) + self._resolved_refs.add((ref, resolved.get("uuid"))) if ref_errors_actual: self._errors["ref"] = ref_errors_actual else: @@ -613,16 +614,9 @@ def map_ref(value: str, link_to: str, portal: Optional[Portal], src: Optional[st elif portal: if not (resolved := portal.ref_exists(link_to, value, True)): self._unresolved_refs.append({"src": src, "error": f"/{link_to}/{value}"}) - elif len(resolved) > 1: - # TODO: Don't think we need this anymore; see TODO on Portal.ref_exists. - self._unresolved_refs.append({ - "src": src, - "error": f"/{link_to}/{value}", - "types": [resolved_ref["type"] for resolved_ref in resolved]}) else: # A resolved-ref set value is a tuple of the reference path and its uuid. - self._resolved_refs.add((f"/{link_to}/{value}", resolved[0].get("uuid"))) -# self._resolved_refs.add((f"/{link_to}/{value}", resolved[0].get("uuid"), resolved[0].get("data"))) + self._resolved_refs.add((f"/{link_to}/{value}", resolved.get("uuid"))) return value return lambda value, src: map_ref(value, typeinfo.get("linkTo"), self._portal, src) @@ -850,45 +844,30 @@ def is_file_schema(self, schema_name: str) -> bool: """ return self.is_schema_type(schema_name, FILE_SCHEMA_NAME) - def _ref_exists_from_cache(self, type_name: str, value: str) -> Optional[List[dict]]: - if self._ref_cache is not None: - self._ref_exists_cache_hit_count += 1 - return self._ref_cache.get(f"/{type_name}/{value}", None) - self._ref_exists_cache_miss_count += 1 - return None - - def _cache_ref(self, type_name: str, value: str, resolved: List[str]) -> None: - subtype_names = self._get_schema_subtypes_names(type_name) - if self._ref_cache is not None: - for type_name in [type_name] + subtype_names: - self._ref_cache[f"/{type_name}/{value}"] = resolved - - def ref_exists(self, type_name: str, value: Optional[str] = None, called_from_map_ref: bool = False) -> List[dict]: - print(f"\033[Kxyzzy:ref_exists({type_name}/{value})") + def ref_exists(self, type_name: str, value: Optional[str] = None, called_from_map_ref: bool = False) -> Optional[dict]: + # print(f"\033[Kxyzzy:ref_exists({type_name}/{value})") if not value: - if type_name.startswith("/") and len(parts := type_name[1:].split("/")) == 2: - if not (type_name := parts[0]) or not (value := parts[1]): - return [] - else: - return [] + type_name, value = Portal._get_type_name_and_value_from_path(type_name) + if not type_name or not value: + return None if called_from_map_ref: self._ref_total_count += 1 # First check our reference cache. if (resolved := self._ref_exists_from_cache(type_name, value)) is not None: # Found CACHED reference. if resolved: - # Found cached RESOLVED reference (non-empty array). + # Found cached RESOLVED reference (non-empty object). if called_from_map_ref: self._ref_total_found_count += 1 return resolved - # Found cached UNRESOLVED reference (empty array); meaning it was looked + # Found cached UNRESOLVED reference (empty object); meaning it was looked # up but not found. It might NOW be found INTERNALLY, since the portal # self._data can change, i.e. as data (e.g. spreadsheet sheets) are parsed. - return self._ref_exists_internally(type_name, value, update_counts=called_from_map_ref) or [] + return self.ref_exists_internally(type_name, value, update_counts=called_from_map_ref) or {} # Reference is NOT cached here; lookup INTERNALLY first. - if (resolved := self._ref_exists_internally(type_name, value, update_counts=called_from_map_ref)) is None: + if (resolved := self.ref_exists_internally(type_name, value, update_counts=called_from_map_ref)) is None: # Reference was resolved (internally) INCORRECTLY. - return [] + return None if resolved: # Reference was resolved internally. return resolved @@ -916,29 +895,35 @@ def ref_exists(self, type_name: str, value: Optional[str] = None, called_from_ma # No (i.e. zero) lookup strategy means no ref lookup at all. if called_from_map_ref: self._ref_total_notfound_count += 1 - return [] + return None # Do the actual lookup in portal for each of the desired lookup paths. for lookup_path in lookup_paths: if isinstance(resolved_item := self.ref_lookup(lookup_path), dict): - resolved = [{"type": type_name, "uuid": resolved_item.get("uuid", None)}] + resolved = {"type": type_name, "uuid": resolved_item.get("uuid", None)} self._cache_ref(type_name, value, resolved) self._ref_exists_external_count += 1 if called_from_map_ref: self._ref_total_found_count += 1 return resolved - # Not found at all; note that we cache this ([]) too; indicates lookup has been done. - self._cache_ref(type_name, value, []) + # Not found at all; note that we cache this ({}) too; indicates lookup has been done. + self._cache_ref(type_name, value, {}) if called_from_map_ref: self._ref_total_notfound_count += 1 - return [] + return None - def _ref_exists_internally(self, type_name: str, value: str, update_counts: bool = False) -> Optional[List[dict]]: + def ref_exists_internally(self, type_name: str, value: Optional[str] = None, + update_counts: bool = False) -> Optional[dict]: """ Looks up the given reference (type/value) internally (i.e. with this data parsed thus far). If found then returns a list of a single dictionary containing the (given) type name and the uuid (if any) of the resolved item. If not found then returns an empty list; however, if not found, but found using an "incorrect" identifying property, then returns None. """ + # print(f"\033[Kxyzzy:ref_exists_internally({type_name}/{value})") + if not value: + type_name, value = Portal._get_type_name_and_value_from_path(type_name) + if not type_name or not value: + return None # Note that root lookup not applicable here. ref_lookup_strategy, incorrect_identifying_property = ( self._ref_lookup_strategy(type_name, self.get_schema(type_name), value)) @@ -950,7 +935,7 @@ def _ref_exists_internally(self, type_name: str, value: str, update_counts: bool if update_counts: self._ref_exists_internal_count += 1 self._ref_total_found_count += 1 - resolved = [{"type": type_name, "uuid": resolved_item.get("uuid")}] # xyzzy + resolved = {"type": type_name, "uuid": resolved_item.get("uuid")} self._cache_ref(type_name, value, resolved) return resolved # Here this reference is not resolved internally; but let us check any specified incorrect @@ -974,7 +959,7 @@ def _ref_exists_internally(self, type_name: str, value: str, update_counts: bool return None # None return means resolved internally incorrectly. if update_counts: self._ref_total_notfound_count += 1 - return [] # Empty return means not resolved internally. + return {} # Empty return means not resolved internally. def _ref_exists_single_internally(self, type_name: str, value: str) -> Tuple[bool, Optional[dict]]: if self._data and (items := self._data.get(type_name)) and (schema := self.get_schema(type_name)): @@ -987,16 +972,26 @@ def _ref_exists_single_internally(self, type_name: str, value: str) -> Tuple[boo return True, item return False, None - def _old___ref_exists_internally( - self, type_name: str, value: str, - subtype_names: Optional[List[str]] = None, - incorrect_identifying_property: Optional[str] = None) -> Tuple[bool, Optional[str], Optional[str]]: - for type_name in [type_name] + (subtype_names or []): - is_resolved, identifying_property, resolved_uuid = self._ref_exists_single_internally( - type_name, value, incorrect_identifying_property=incorrect_identifying_property) - if is_resolved: - return True, identifying_property, resolved_uuid - return False, None, None + @staticmethod + def _get_type_name_and_value_from_path(path: str) -> Tuple[Optional[str], Optional[str]]: + if path.startswith("/") and len(parts := path[1:].split("/")) == 2: + if not (type_name := parts[0]) or not (value := parts[1]): + return None + return type_name, value + return None, None + + def _ref_exists_from_cache(self, type_name: str, value: str) -> Optional[List[dict]]: + if self._ref_cache is not None: + self._ref_exists_cache_hit_count += 1 + return self._ref_cache.get(f"/{type_name}/{value}", None) + self._ref_exists_cache_miss_count += 1 + return None + + def _cache_ref(self, type_name: str, value: str, resolved: List[str]) -> None: + subtype_names = self._get_schema_subtypes_names(type_name) + if self._ref_cache is not None: + for type_name in [type_name] + subtype_names: + self._ref_cache[f"/{type_name}/{value}"] = resolved @property def ref_lookup_cache_hit_count(self) -> int: diff --git a/test/test_structured_data.py b/test/test_structured_data.py index ddcb368a9..6265ff8d0 100644 --- a/test/test_structured_data.py +++ b/test/test_structured_data.py @@ -1426,7 +1426,8 @@ def mocked_ref_exists(self, type_name, value, called_from_map_ref = False): # n nonlocal norefs, expected_refs, refs_actual refs_actual.add(ref := f"/{type_name}/{value}") if norefs is True or (isinstance(norefs, list) and ref in norefs): - return [{"type": "dummy", "uuid": "dummy"}] +# return [{"type": "dummy", "uuid": "dummy"}] + return {"type": "dummy", "uuid": "dummy"} return real_ref_exists(self, type_name, value) with mock.patch("dcicutils.structured_data.Portal.ref_exists", side_effect=mocked_ref_exists, autospec=True): From 09dcdb7a07d1652db4ab7fda358d2ab1b9a94619 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sun, 10 Mar 2024 09:15:16 -0400 Subject: [PATCH 36/64] flake8 --- dcicutils/structured_data.py | 5 +++-- test/test_structured_data.py | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 0e10465ca..9a8295ff5 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -264,7 +264,7 @@ def calculate_total_rows_to_process(): ref_errors_actual = [] for ref_error in ref_errors: if not (resolved := self.portal.ref_exists(ref := ref_error["error"])): -# if not (resolved := self.portal.ref_exists_internally(ref := ref_error["error"])): + # if not (resolved := self.portal.ref_exists_internally(ref := ref_error["error"])): ref_errors_actual.append(ref_error) else: self._resolved_refs.add((ref, resolved.get("uuid"))) @@ -844,7 +844,8 @@ def is_file_schema(self, schema_name: str) -> bool: """ return self.is_schema_type(schema_name, FILE_SCHEMA_NAME) - def ref_exists(self, type_name: str, value: Optional[str] = None, called_from_map_ref: bool = False) -> Optional[dict]: + def ref_exists(self, type_name: str, value: Optional[str] = None, + called_from_map_ref: bool = False) -> Optional[dict]: # print(f"\033[Kxyzzy:ref_exists({type_name}/{value})") if not value: type_name, value = Portal._get_type_name_and_value_from_path(type_name) diff --git a/test/test_structured_data.py b/test/test_structured_data.py index 6265ff8d0..d0ac1d886 100644 --- a/test/test_structured_data.py +++ b/test/test_structured_data.py @@ -1426,7 +1426,6 @@ def mocked_ref_exists(self, type_name, value, called_from_map_ref = False): # n nonlocal norefs, expected_refs, refs_actual refs_actual.add(ref := f"/{type_name}/{value}") if norefs is True or (isinstance(norefs, list) and ref in norefs): -# return [{"type": "dummy", "uuid": "dummy"}] return {"type": "dummy", "uuid": "dummy"} return real_ref_exists(self, type_name, value) with mock.patch("dcicutils.structured_data.Portal.ref_exists", From 0f99a31a58ade52ba48630405f2f8bc4d31c9b40 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sun, 10 Mar 2024 09:24:15 -0400 Subject: [PATCH 37/64] typo --- dcicutils/structured_data.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 9a8295ff5..75a3733f7 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -945,19 +945,20 @@ def ref_exists_internally(self, type_name: str, value: Optional[str] = None, # reference, which would otherwise be unresolved, would be resolved; in which case we have an # incorrect reference; doing this can cut down considerably on useless lookups (at least for # a case from He Li, early March 2024). - if incorrect_identifying_property: - if self._data and (items := self._data.get(type_name)): - for item in items: - if (identifying_value := item.get(incorrect_identifying_property, None)) is not None: - if ((identifying_value == value) or - (isinstance(identifying_value, list) and (value in identifying_value))): # noqa - # Not REALLY resolved as it resolved to a property which is NOT an identifying - # property, but may be commonly mistaken for one (e.g. UnalignedReads.filename). - # Return value to prevent actual portal lookup from happening. - if update_counts: - self._ref_incorrect_identifying_property_count += 1 - self._ref_total_notfound_count += 1 - return None # None return means resolved internally incorrectly. + for type_name in [type_name] + subtype_names: + if incorrect_identifying_property: + if self._data and (items := self._data.get(type_name)): + for item in items: + if (identifying_value := item.get(incorrect_identifying_property, None)) is not None: + if ((identifying_value == value) or + (isinstance(identifying_value, list) and (value in identifying_value))): # noqa + # Not REALLY resolved as it resolved to a property which is NOT an identifying + # property, but may be commonly mistaken for one (e.g. UnalignedReads.filename). + # Return value to prevent actual portal lookup from happening. + if update_counts: + self._ref_incorrect_identifying_property_count += 1 + self._ref_total_notfound_count += 1 + return None # None return means resolved internally incorrectly. if update_counts: self._ref_total_notfound_count += 1 return {} # Empty return means not resolved internally. From 5f97510edb919d953817dd1135851913dd1db4d6 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sun, 10 Mar 2024 09:28:30 -0400 Subject: [PATCH 38/64] version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 3ab596e45..8677403aa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b15" # TODO: To become 8.8.1 +version = "8.8.0.1b16" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From ed5270e3bdee4b954563ad7306540dc31c773d72 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sun, 10 Mar 2024 09:54:54 -0400 Subject: [PATCH 39/64] more ref cache stuff in structured_data --- dcicutils/structured_data.py | 42 ++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 75a3733f7..6ba1571af 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -297,7 +297,7 @@ def _load_reader(self, reader: RowReader, type_name: str) -> None: self._add_properties(structured_row, self._autoadd_properties, schema) self._add(type_name, structured_row) if self._progress: - self._progress_update(-1, len(self._resolved_refs), len(self.ref_errors), self.ref_lookup_count) + self._progress_update(-1, self.ref_total_count, self.ref_total_notfound_count, self.ref_lookup_count) self._note_warning(reader.warnings, "reader") if schema: self._note_error(schema._unresolved_refs, "ref") @@ -868,9 +868,13 @@ def ref_exists(self, type_name: str, value: Optional[str] = None, # Reference is NOT cached here; lookup INTERNALLY first. if (resolved := self.ref_exists_internally(type_name, value, update_counts=called_from_map_ref)) is None: # Reference was resolved (internally) INCORRECTLY. + if called_from_map_ref: + self._ref_total_notfound_count += 1 return None if resolved: # Reference was resolved internally. + if called_from_map_ref: + self._ref_total_found_count += 1 return resolved # Reference is NOT cached and was NOT resolved internally; lookup in PORTAL. # Get the lookup strategy; i.e. should do we lookup by root path, and if so, should @@ -995,24 +999,6 @@ def _cache_ref(self, type_name: str, value: str, resolved: List[str]) -> None: for type_name in [type_name] + subtype_names: self._ref_cache[f"/{type_name}/{value}"] = resolved - @property - def ref_lookup_cache_hit_count(self) -> int: - if self._ref_cache is None: - return -1 - try: - return self.ref_lookup_cached.cache_info().hits - except Exception: - return -1 - - @property - def ref_lookup_cache_miss_count(self) -> int: - if self._ref_cache is None: - return -1 - try: - return self.ref_lookup_cached.cache_info().misses - except Exception: - return -1 - @property def ref_total_count(self) -> int: return self._ref_total_count @@ -1041,6 +1027,24 @@ def ref_lookup_notfound_count(self) -> int: def ref_lookup_error_count(self) -> int: return self._ref_lookup_error_count + @property + def ref_lookup_cache_hit_count(self) -> int: + if self._ref_cache is None: + return -1 + try: + return self.ref_lookup_cached.cache_info().hits + except Exception: + return -1 + + @property + def ref_lookup_cache_miss_count(self) -> int: + if self._ref_cache is None: + return -1 + try: + return self.ref_lookup_cached.cache_info().misses + except Exception: + return -1 + @property def ref_exists_internal_count(self) -> int: return self._ref_exists_internal_count From f5142d2818454184270c0e31a71e591881ba81de Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sun, 10 Mar 2024 10:11:03 -0400 Subject: [PATCH 40/64] ref stuff --- dcicutils/structured_data.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 6ba1571af..e896b5a31 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -94,12 +94,13 @@ def __init__(self, file: Optional[str] = None, portal: Optional[Union[VirtualApp def _progress_update(self, nrows: Union[int, Callable], nrefs_resolved: Optional[int] = None, nrefs_unresolved: Optional[int] = None, - nlookups: Optional[int] = None) -> None: + nlookups: Optional[int] = None, + ncachehits: Optional[int] = None) -> None: if self._progress: if callable(nrows): nrows = nrows() if isinstance(nrows, int) and nrows != 0: - self._progress(nrows, nrefs_resolved, nrefs_unresolved, nlookups) + self._progress(nrows, nrefs_resolved, nrefs_unresolved, nlookups, ncachehits) @property def data(self) -> dict: @@ -297,7 +298,8 @@ def _load_reader(self, reader: RowReader, type_name: str) -> None: self._add_properties(structured_row, self._autoadd_properties, schema) self._add(type_name, structured_row) if self._progress: - self._progress_update(-1, self.ref_total_count, self.ref_total_notfound_count, self.ref_lookup_count) + self._progress_update(-1, self.ref_total_count, self.ref_total_notfound_count, + self.ref_lookup_count, self.ref_lookup_cache_hit_count) self._note_warning(reader.warnings, "reader") if schema: self._note_error(schema._unresolved_refs, "ref") From 62d067e7338d60a62ddcbce7627f20a15dcbf4f2 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sun, 10 Mar 2024 10:11:11 -0400 Subject: [PATCH 41/64] version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 8677403aa..9c9b03d94 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b16" # TODO: To become 8.8.1 +version = "8.8.0.1b17" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 74a8bc997ef9c38790e34f034a5d425fd5c6f880 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sun, 10 Mar 2024 15:34:08 -0400 Subject: [PATCH 42/64] more ref cache stuff in structured_data --- dcicutils/structured_data.py | 14 ++++++++------ pyproject.toml | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index e896b5a31..4469f57b1 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -92,15 +92,16 @@ def __init__(self, file: Optional[str] = None, portal: Optional[Union[VirtualApp self._load_file(file) if file else None def _progress_update(self, nrows: Union[int, Callable], - nrefs_resolved: Optional[int] = None, - nrefs_unresolved: Optional[int] = None, - nlookups: Optional[int] = None, - ncachehits: Optional[int] = None) -> None: + ref_resolved: Optional[int] = None, + ref_unresolved: Optional[int] = None, + ref_lookups: Optional[int] = None, + ref_cache_hits: Optional[int] = None, + ref_incorrect: Optional[int] = None) -> None: if self._progress: if callable(nrows): nrows = nrows() if isinstance(nrows, int) and nrows != 0: - self._progress(nrows, nrefs_resolved, nrefs_unresolved, nlookups, ncachehits) + self._progress(nrows, ref_resolved, ref_unresolved, ref_lookups, ref_cache_hits, ref_incorrect) @property def data(self) -> dict: @@ -299,7 +300,8 @@ def _load_reader(self, reader: RowReader, type_name: str) -> None: self._add(type_name, structured_row) if self._progress: self._progress_update(-1, self.ref_total_count, self.ref_total_notfound_count, - self.ref_lookup_count, self.ref_lookup_cache_hit_count) + self.ref_lookup_count, self.ref_lookup_cache_hit_count, + self.ref_incorrect_identifying_property_count) self._note_warning(reader.warnings, "reader") if schema: self._note_error(schema._unresolved_refs, "ref") diff --git a/pyproject.toml b/pyproject.toml index 9c9b03d94..6ccb2417a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b17" # TODO: To become 8.8.1 +version = "8.8.0.1b18" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 03b13f16efbb78c57459c80d73e0091d63be4c09 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sun, 10 Mar 2024 18:51:38 -0400 Subject: [PATCH 43/64] more caching ref stuff --- dcicutils/structured_data.py | 43 +++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 4469f57b1..ecf47b9f0 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -266,7 +266,7 @@ def calculate_total_rows_to_process(): ref_errors_actual = [] for ref_error in ref_errors: if not (resolved := self.portal.ref_exists(ref := ref_error["error"])): - # if not (resolved := self.portal.ref_exists_internally(ref := ref_error["error"])): + # if not (resolved := self.portal.ref_exists_internally(ref := ref_error["error"])): # TODO ref_errors_actual.append(ref_error) else: self._resolved_refs.add((ref, resolved.get("uuid"))) @@ -552,7 +552,6 @@ def _map_function(self, typeinfo: dict) -> Optional[Callable]: # The type specifier can actually be a list of acceptable types; for # example smaht-portal/schemas/mixins.json/meta_workflow_input#.value; # we will take the first one for which we have a mapping function. - # TODO: Maybe more correct to get all map function and map to any for values. for acceptable_type in typeinfo_type: if (map_function := self._map_value_functions.get(acceptable_type)) is not None: break @@ -613,7 +612,6 @@ def map_ref(value: str, link_to: str, portal: Optional[Portal], src: Optional[st nonlocal self, typeinfo if not value: if (column := typeinfo.get("column")) and column in self.data.get("required", []): - # TODO: If think we do have the column (and type?) name(s) originating the ref yes? self._unresolved_refs.append({"src": src, "error": f"/{link_to}/"}) elif portal: if not (resolved := portal.ref_exists(link_to, value, True)): @@ -857,7 +855,13 @@ def ref_exists(self, type_name: str, value: Optional[str] = None, return None if called_from_map_ref: self._ref_total_count += 1 - # First check our reference cache. + # First make sure the given value can possibly be a reference to the given type. + if not self._is_valid_ref(type_name, value): + if called_from_map_ref: + self._ref_incorrect_identifying_property_count += 1 + self._ref_total_notfound_count += 1 + return None + # Check our reference cache. if (resolved := self._ref_exists_from_cache(type_name, value)) is not None: # Found CACHED reference. if resolved: @@ -876,7 +880,7 @@ def ref_exists(self, type_name: str, value: Optional[str] = None, self._ref_total_notfound_count += 1 return None if resolved: - # Reference was resolved internally. + # Reference was resolved internally (note: here only if resolved is not an empty dictionary). if called_from_map_ref: self._ref_total_found_count += 1 return resolved @@ -982,6 +986,35 @@ def _ref_exists_single_internally(self, type_name: str, value: str) -> Tuple[boo return True, item return False, None + # TODO: Move this to smaht-submitr and smaht-portal and pass in. + def _is_valid_ref(self, type_name: str, value: str) -> bool: + """ + Returns True iff the given value can possibly be a valid reference + to type specified by the given type name, otherwise returns False. + """ + from dcicutils.misc_utils import is_uuid + def is_possibly_valid(schema: dict, name: str, value: str) -> Optional[Callable]: # noqa + if properties := schema.get("properties"): + if pattern := properties.get(name, {}).get("pattern"): + if not re.match(pattern, value): + return False + if format := properties.get(name, {}).get("format"): + if (format == "accession") and (name == "accession"): + pattern = "^SMA[1-9A-Z]{9}$" + if not re.match(pattern, value): + return False + if (format == "uuid") and (name == "uuid"): + if not is_uuid(value): + return False + return True + for schema_name in [type_name] + self._get_schema_subtypes_names(type_name): + if schema := self.get_schema(schema_name): + if identifying_properties := schema.get("identifyingProperties"): + for identifying_property in identifying_properties: + if is_possibly_valid(schema, identifying_property, value): + return True + return False + @staticmethod def _get_type_name_and_value_from_path(path: str) -> Tuple[Optional[str], Optional[str]]: if path.startswith("/") and len(parts := path[1:].split("/")) == 2: From bfdc24eabe39bf29f215d73b6ecfcb5d5d4b8b1c Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sun, 10 Mar 2024 18:51:46 -0400 Subject: [PATCH 44/64] version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6ccb2417a..d426b5c11 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b18" # TODO: To become 8.8.1 +version = "8.8.0.1b19" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 22ae5fbb532887a97827e8dad1768c0118e7b92e Mon Sep 17 00:00:00 2001 From: David Michaels Date: Sun, 10 Mar 2024 22:56:42 -0400 Subject: [PATCH 45/64] more caching ref stuff --- dcicutils/structured_data.py | 71 ++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 39 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index ecf47b9f0..b032bb610 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -13,9 +13,9 @@ from dcicutils.data_readers import CsvReader, Excel, RowReader from dcicutils.datetime_utils import normalize_date_string, normalize_datetime_string from dcicutils.file_utils import search_for_file -from dcicutils.misc_utils import (create_dict, create_readonly_object, load_json_if, - merge_objects, remove_empty_properties, right_trim, - split_string, to_boolean, to_enum, to_float, to_integer, VirtualApp) +from dcicutils.misc_utils import (create_dict, create_readonly_object, is_uuid, load_json_if, + merge_objects, remove_empty_properties, right_trim, split_string, + to_boolean, to_enum, to_float, to_integer, VirtualApp) from dcicutils.portal_object_utils import PortalObject from dcicutils.portal_utils import Portal as PortalBase from dcicutils.schema_utils import Schema as SchemaBase @@ -856,7 +856,9 @@ def ref_exists(self, type_name: str, value: Optional[str] = None, if called_from_map_ref: self._ref_total_count += 1 # First make sure the given value can possibly be a reference to the given type. - if not self._is_valid_ref(type_name, value): + schema = self.get_schema(type_name) + ref_lookup_strategy, ref_validator = self._ref_lookup_strategy(type_name, schema, value) + if not self._is_valid_ref(type_name, value, ref_validator): if called_from_map_ref: self._ref_incorrect_identifying_property_count += 1 self._ref_total_notfound_count += 1 @@ -938,7 +940,7 @@ def ref_exists_internally(self, type_name: str, value: Optional[str] = None, if not type_name or not value: return None # Note that root lookup not applicable here. - ref_lookup_strategy, incorrect_identifying_property = ( + ref_lookup_strategy, ref_validator = ( self._ref_lookup_strategy(type_name, self.get_schema(type_name), value)) is_ref_lookup_subtypes = StructuredDataSet._is_ref_lookup_subtypes(ref_lookup_strategy) subtype_names = self._get_schema_subtypes_names(type_name) if is_ref_lookup_subtypes else [] @@ -951,26 +953,6 @@ def ref_exists_internally(self, type_name: str, value: Optional[str] = None, resolved = {"type": type_name, "uuid": resolved_item.get("uuid")} self._cache_ref(type_name, value, resolved) return resolved - # Here this reference is not resolved internally; but let us check any specified incorrect - # property to see if it would have been resolved using that; for example, if we pretend that - # UnalignedReads.filename were an identifying property (which it is not), then we see if this - # reference, which would otherwise be unresolved, would be resolved; in which case we have an - # incorrect reference; doing this can cut down considerably on useless lookups (at least for - # a case from He Li, early March 2024). - for type_name in [type_name] + subtype_names: - if incorrect_identifying_property: - if self._data and (items := self._data.get(type_name)): - for item in items: - if (identifying_value := item.get(incorrect_identifying_property, None)) is not None: - if ((identifying_value == value) or - (isinstance(identifying_value, list) and (value in identifying_value))): # noqa - # Not REALLY resolved as it resolved to a property which is NOT an identifying - # property, but may be commonly mistaken for one (e.g. UnalignedReads.filename). - # Return value to prevent actual portal lookup from happening. - if update_counts: - self._ref_incorrect_identifying_property_count += 1 - self._ref_total_notfound_count += 1 - return None # None return means resolved internally incorrectly. if update_counts: self._ref_total_notfound_count += 1 return {} # Empty return means not resolved internally. @@ -986,25 +968,36 @@ def _ref_exists_single_internally(self, type_name: str, value: str) -> Tuple[boo return True, item return False, None - # TODO: Move this to smaht-submitr and smaht-portal and pass in. - def _is_valid_ref(self, type_name: str, value: str) -> bool: + # For smaht-submitr/smaht-portal ... + def ref_validator(schema: dict, property_name: str, property_value: str) -> Optional[bool]: + if property_format := schema.get("properties", {}).get(property_name, {}).get("format"): + if (property_format == "accession") and (property_name == "accession"): + accession_pattern = "^SMA[1-9A-Z]{9}$" + if not re.match(accession_pattern, property_value): + return False + return None + + def _is_valid_ref(self, type_name: str, value: str, ref_validator: Optional[Callable]) -> bool: """ Returns True iff the given value can possibly be a valid reference to type specified by the given type name, otherwise returns False. + The given ref_validator callable if specified will be called with + the schema (dictionary) for the given type """ - from dcicutils.misc_utils import is_uuid - def is_possibly_valid(schema: dict, name: str, value: str) -> Optional[Callable]: # noqa - if properties := schema.get("properties"): - if pattern := properties.get(name, {}).get("pattern"): - if not re.match(pattern, value): + def is_possibly_valid(schema: dict, property_name: str, property_value: str) -> Optional[Callable]: # noqa + nonlocal ref_validator + if callable(ref_validator): + if (ref_validator_result := ref_validator(schema, property_name, property_value)) is False: + return False + elif ref_validator_result is True: + return True + if property_info := schema.get("properties", {}).get(property_name): + if property_pattern := property_info.get("pattern"): + if not re.match(property_pattern, property_value): return False - if format := properties.get(name, {}).get("format"): - if (format == "accession") and (name == "accession"): - pattern = "^SMA[1-9A-Z]{9}$" - if not re.match(pattern, value): - return False - if (format == "uuid") and (name == "uuid"): - if not is_uuid(value): + if property_format := property_info.get("format"): + if (property_format == "uuid") and (property_name == "uuid"): + if not is_uuid(property_value): return False return True for schema_name in [type_name] + self._get_schema_subtypes_names(type_name): From d4d142d549614782bb4d50fbca3fa514119745d9 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Mon, 11 Mar 2024 11:02:33 -0400 Subject: [PATCH 46/64] comments --- dcicutils/structured_data.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index b032bb610..7ea197d93 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -979,10 +979,23 @@ def ref_validator(schema: dict, property_name: str, property_value: str) -> Opti def _is_valid_ref(self, type_name: str, value: str, ref_validator: Optional[Callable]) -> bool: """ - Returns True iff the given value can possibly be a valid reference - to type specified by the given type name, otherwise returns False. - The given ref_validator callable if specified will be called with - the schema (dictionary) for the given type + Returns True iff the given value can possibly be a valid reference to the type specified by + the given type name, otherwise returns False. + + The given ref_validator callable, if specified, will be called with the schema (dictionary) + for the given type a property name (which is will be an identifying property for the type), + and the property value. The ref_validator callable should be False iff the given value is + NOT valid for the given type (schema) and property (name), otherwise (if it is valid) can + return either None or True, where None means to continue checking the format according to + other property requirements (i.e. e.g. checking any pattern is adhered to), and where + True means to not continue checking any property requirements. + + This primary purpose of this to prevent unnecessary portal lookups, i.e for reference + paths which cannot possibly be valid, e.g. because the property value does not adhere + to the required pattern/format for any of the identifying properties for the type. + + At least at first, the only reason we support the ref_validator callable is at all is because + the "accession" identifying property in our portal schemas do not have an associated pattern. """ def is_possibly_valid(schema: dict, property_name: str, property_value: str) -> Optional[Callable]: # noqa nonlocal ref_validator From e7f59a3d2a6f6f1b5d0f047aa16e505f54b64639 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Mon, 11 Mar 2024 14:47:45 -0400 Subject: [PATCH 47/64] minor refactor structured_data --- dcicutils/structured_data.py | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 7ea197d93..9c9634ea9 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -96,12 +96,12 @@ def _progress_update(self, nrows: Union[int, Callable], ref_unresolved: Optional[int] = None, ref_lookups: Optional[int] = None, ref_cache_hits: Optional[int] = None, - ref_incorrect: Optional[int] = None) -> None: + ref_invalid: Optional[int] = None) -> None: if self._progress: if callable(nrows): nrows = nrows() if isinstance(nrows, int) and nrows != 0: - self._progress(nrows, ref_resolved, ref_unresolved, ref_lookups, ref_cache_hits, ref_incorrect) + self._progress(nrows, ref_resolved, ref_unresolved, ref_lookups, ref_cache_hits, ref_invalid) @property def data(self) -> dict: @@ -301,7 +301,7 @@ def _load_reader(self, reader: RowReader, type_name: str) -> None: if self._progress: self._progress_update(-1, self.ref_total_count, self.ref_total_notfound_count, self.ref_lookup_count, self.ref_lookup_cache_hit_count, - self.ref_incorrect_identifying_property_count) + self.ref_invalid_identifying_property_count) self._note_warning(reader.warnings, "reader") if schema: self._note_error(schema._unresolved_refs, "ref") @@ -386,8 +386,8 @@ def ref_exists_cache_miss_count(self) -> int: return self.portal.ref_exists_cache_miss_count if self.portal else -1 @property - def ref_incorrect_identifying_property_count(self) -> int: - return self.portal.ref_incorrect_identifying_property_count if self.portal else -1 + def ref_invalid_identifying_property_count(self) -> int: + return self.portal.ref_invalid_identifying_property_count if self.portal else -1 def _note_warning(self, item: Optional[Union[dict, List[dict]]], group: str) -> None: self._note_issue(self._warnings, item, group) @@ -791,7 +791,7 @@ def __init__(self, self._ref_exists_external_count = 0 self._ref_exists_cache_hit_count = 0 self._ref_exists_cache_miss_count = 0 - self._ref_incorrect_identifying_property_count = 0 + self._ref_invalid_identifying_property_count = 0 self._ref_total_count = 0 self._ref_total_found_count = 0 self._ref_total_notfound_count = 0 @@ -860,7 +860,7 @@ def ref_exists(self, type_name: str, value: Optional[str] = None, ref_lookup_strategy, ref_validator = self._ref_lookup_strategy(type_name, schema, value) if not self._is_valid_ref(type_name, value, ref_validator): if called_from_map_ref: - self._ref_incorrect_identifying_property_count += 1 + self._ref_invalid_identifying_property_count += 1 self._ref_total_notfound_count += 1 return None # Check our reference cache. @@ -932,7 +932,7 @@ def ref_exists_internally(self, type_name: str, value: Optional[str] = None, Looks up the given reference (type/value) internally (i.e. with this data parsed thus far). If found then returns a list of a single dictionary containing the (given) type name and the uuid (if any) of the resolved item. If not found then returns an empty list; however, - if not found, but found using an "incorrect" identifying property, then returns None. + if not found, but found using an invalid identifying property, then returns None. """ # print(f"\033[Kxyzzy:ref_exists_internally({type_name}/{value})") if not value: @@ -968,15 +968,6 @@ def _ref_exists_single_internally(self, type_name: str, value: str) -> Tuple[boo return True, item return False, None - # For smaht-submitr/smaht-portal ... - def ref_validator(schema: dict, property_name: str, property_value: str) -> Optional[bool]: - if property_format := schema.get("properties", {}).get(property_name, {}).get("format"): - if (property_format == "accession") and (property_name == "accession"): - accession_pattern = "^SMA[1-9A-Z]{9}$" - if not re.match(accession_pattern, property_value): - return False - return None - def _is_valid_ref(self, type_name: str, value: str, ref_validator: Optional[Callable]) -> bool: """ Returns True iff the given value can possibly be a valid reference to the type specified by @@ -995,7 +986,8 @@ def _is_valid_ref(self, type_name: str, value: str, ref_validator: Optional[Call to the required pattern/format for any of the identifying properties for the type. At least at first, the only reason we support the ref_validator callable is at all is because - the "accession" identifying property in our portal schemas do not have an associated pattern. + the "accession" identifying property in our portal schemas do not have an associated pattern; + otherwise we could handle it generically here. """ def is_possibly_valid(schema: dict, property_name: str, property_value: str) -> Optional[Callable]: # noqa nonlocal ref_validator @@ -1105,8 +1097,8 @@ def ref_exists_cache_miss_count(self) -> int: return self._ref_exists_cache_miss_count @property - def ref_incorrect_identifying_property_count(self) -> int: - return self._ref_incorrect_identifying_property_count + def ref_invalid_identifying_property_count(self) -> int: + return self._ref_invalid_identifying_property_count @staticmethod def create_for_testing(arg: Optional[Union[str, bool, List[dict], dict, Callable]] = None, From f4767a9853379a58ceae154f7b1fe389478951f5 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Mon, 11 Mar 2024 14:47:57 -0400 Subject: [PATCH 48/64] version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index d426b5c11..2333af84a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b19" # TODO: To become 8.8.1 +version = "8.8.0.1b20" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From dcbe7bf9d7c76af14fe312be3b813030e7eb6590 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Mon, 11 Mar 2024 16:12:10 -0400 Subject: [PATCH 49/64] minor ref stats updaets --- dcicutils/structured_data.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 9c9634ea9..5eeaa7bba 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -91,7 +91,9 @@ def __init__(self, file: Optional[str] = None, portal: Optional[Union[VirtualApp self._debug_sleep = None self._load_file(file) if file else None - def _progress_update(self, nrows: Union[int, Callable], + def _progress_update(self, + nrows: Union[int, Callable], + ref_total: Optional[int] = None, ref_resolved: Optional[int] = None, ref_unresolved: Optional[int] = None, ref_lookups: Optional[int] = None, @@ -99,9 +101,12 @@ def _progress_update(self, nrows: Union[int, Callable], ref_invalid: Optional[int] = None) -> None: if self._progress: if callable(nrows): - nrows = nrows() + nrows, nsheets = nrows() + else: + nsheets = None if isinstance(nrows, int) and nrows != 0: - self._progress(nrows, ref_resolved, ref_unresolved, ref_lookups, ref_cache_hits, ref_invalid) + self._progress(nrows, nsheets, ref_total, ref_resolved, ref_unresolved, + ref_lookups, ref_cache_hits, ref_invalid) @property def data(self) -> dict: @@ -246,14 +251,14 @@ def _load_csv_file(self, file: str) -> None: self._load_reader(CsvReader(file), type_name=Schema.type_name(file)) def _load_excel_file(self, file: str) -> None: - def calculate_total_rows_to_process(): + def calculate_total_rows_to_process() -> Tuple[int, int]: nonlocal file excel = Excel(file) nrows = 0 for sheet_name in excel.sheet_names: for row in excel.sheet_reader(sheet_name): nrows += 1 - return nrows + return nrows, len(excel.sheet_names) if self._progress: self._progress_update(calculate_total_rows_to_process) excel = Excel(file) # Order the sheet names by any specified ordering (e.g. ala snovault.loadxl). @@ -299,8 +304,12 @@ def _load_reader(self, reader: RowReader, type_name: str) -> None: self._add_properties(structured_row, self._autoadd_properties, schema) self._add(type_name, structured_row) if self._progress: - self._progress_update(-1, self.ref_total_count, self.ref_total_notfound_count, - self.ref_lookup_count, self.ref_lookup_cache_hit_count, + self._progress_update(-1, + self.ref_total_count, + self.ref_total_found_count, + self.ref_total_notfound_count, + self.ref_lookup_count, + self.ref_lookup_cache_hit_count, self.ref_invalid_identifying_property_count) self._note_warning(reader.warnings, "reader") if schema: From 1abc397b443b5add59e86717d43097d27b3a8118 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Mon, 11 Mar 2024 16:12:21 -0400 Subject: [PATCH 50/64] version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2333af84a..40805b87e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b20" # TODO: To become 8.8.1 +version = "8.8.0.1b21" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 9ba4ef8ce7f13f9e33f0b2f77d1faa1cbcd26640 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Mon, 11 Mar 2024 16:30:33 -0400 Subject: [PATCH 51/64] minor code cleanup to structured_data --- dcicutils/structured_data.py | 16 +++++----------- pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 5eeaa7bba..9cfd030b3 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -885,12 +885,7 @@ def ref_exists(self, type_name: str, value: Optional[str] = None, # self._data can change, i.e. as data (e.g. spreadsheet sheets) are parsed. return self.ref_exists_internally(type_name, value, update_counts=called_from_map_ref) or {} # Reference is NOT cached here; lookup INTERNALLY first. - if (resolved := self.ref_exists_internally(type_name, value, update_counts=called_from_map_ref)) is None: - # Reference was resolved (internally) INCORRECTLY. - if called_from_map_ref: - self._ref_total_notfound_count += 1 - return None - if resolved: + if resolved := self.ref_exists_internally(type_name, value, update_counts=called_from_map_ref): # Reference was resolved internally (note: here only if resolved is not an empty dictionary). if called_from_map_ref: self._ref_total_found_count += 1 @@ -939,15 +934,14 @@ def ref_exists_internally(self, type_name: str, value: Optional[str] = None, update_counts: bool = False) -> Optional[dict]: """ Looks up the given reference (type/value) internally (i.e. with this data parsed thus far). - If found then returns a list of a single dictionary containing the (given) type name and - the uuid (if any) of the resolved item. If not found then returns an empty list; however, - if not found, but found using an invalid identifying property, then returns None. + If found then returns a dictionary containing the (given) type name and the uuid (if any) + of the resolved item. """ # print(f"\033[Kxyzzy:ref_exists_internally({type_name}/{value})") if not value: type_name, value = Portal._get_type_name_and_value_from_path(type_name) if not type_name or not value: - return None + return None # Should not happen. # Note that root lookup not applicable here. ref_lookup_strategy, ref_validator = ( self._ref_lookup_strategy(type_name, self.get_schema(type_name), value)) @@ -1038,8 +1032,8 @@ def _ref_exists_from_cache(self, type_name: str, value: str) -> Optional[List[di return None def _cache_ref(self, type_name: str, value: str, resolved: List[str]) -> None: - subtype_names = self._get_schema_subtypes_names(type_name) if self._ref_cache is not None: + subtype_names = self._get_schema_subtypes_names(type_name) for type_name in [type_name] + subtype_names: self._ref_cache[f"/{type_name}/{value}"] = resolved diff --git a/pyproject.toml b/pyproject.toml index 40805b87e..aa2cf07fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b21" # TODO: To become 8.8.1 +version = "8.8.0.1b22" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 23e23d4c4453637061cd42c5bdab6d20f23f5ea5 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Tue, 12 Mar 2024 14:50:01 -0400 Subject: [PATCH 52/64] optimizing the structured_data comparison - and progress (tqdm) support. --- dcicutils/portal_object_utils.py | 204 +++++++++++++++++-------------- dcicutils/portal_utils.py | 45 +++++++ dcicutils/structured_data.py | 74 +++++------ test/test_portal_object_utils.py | 43 ++++--- 4 files changed, 218 insertions(+), 148 deletions(-) diff --git a/dcicutils/portal_object_utils.py b/dcicutils/portal_object_utils.py index 0c64d8747..150a41d81 100644 --- a/dcicutils/portal_object_utils.py +++ b/dcicutils/portal_object_utils.py @@ -1,7 +1,7 @@ from copy import deepcopy from functools import lru_cache import re -from typing import Any, List, Optional, Tuple, Type, Union +from typing import Any, Callable, List, Optional, Tuple, Type, Union from dcicutils.data_readers import RowReader from dcicutils.misc_utils import create_readonly_object from dcicutils.portal_utils import Portal @@ -19,7 +19,7 @@ def __init__(self, data: dict, portal: Portal = None, self._data = data if isinstance(data, dict) else {} self._portal = portal if isinstance(portal, Portal) else None self._schema = schema if isinstance(schema, dict) else (schema.data if isinstance(schema, Schema) else None) - self._type = type if isinstance(type, str) and type else None + self._type = type if isinstance(type, str) else "" @property def data(self) -> dict: @@ -31,8 +31,8 @@ def portal(self) -> Optional[Portal]: @property @lru_cache(maxsize=1) - def type(self) -> Optional[str]: - return self._type or Portal.get_schema_type(self._data) or (Schema(self._schema).type if self._schema else None) + def type(self) -> str: + return self._type or Portal.get_schema_type(self._data) or (Schema(self._schema).type if self._schema else "") @property @lru_cache(maxsize=1) @@ -75,86 +75,41 @@ def identifying_properties(self) -> Optional[List[str]]: identifying_properties.append("aliases") return identifying_properties or None - @property - @lru_cache(maxsize=1) - def identifying_paths(self) -> Optional[List[str]]: - """ - Returns a list of the possible Portal URL paths identifying this Portal object. - """ - identifying_paths = [] - if not (identifying_properties := self.identifying_properties): - if self.uuid: - if self.type: - identifying_paths.append(f"/{self.type}/{self.uuid}") - identifying_paths.append(f"/{self.uuid}") - return identifying_paths - for identifying_property in identifying_properties: - if (identifying_value := self._data.get(identifying_property)): - if identifying_property == "uuid": - identifying_paths.append(f"/{self.type}/{identifying_value}") - identifying_paths.append(f"/{identifying_value}") - # For now at least we include the path both with and without the schema type component, - # as for some identifying values, it works (only) with, and some, it works (only) without. - # For example: If we have FileSet with "accession", an identifying property, with value - # SMAFSFXF1RO4 then /SMAFSFXF1RO4 works but /FileSet/SMAFSFXF1RO4 does not; and - # conversely using "submitted_id", also an identifying property, with value - # UW_FILE-SET_COLO-829BL_HI-C_1 then /UW_FILE-SET_COLO-829BL_HI-C_1 does - # not work but /FileSet/UW_FILE-SET_COLO-829BL_HI-C_1 does work. - elif isinstance(identifying_value, list): - for identifying_value_item in identifying_value: - if self.type: - identifying_paths.append(f"/{self.type}/{identifying_value_item}") - identifying_paths.append(f"/{identifying_value_item}") - else: - if (schema := self.schema): - if pattern := schema.get("properties", {}).get(identifying_property, {}).get("pattern"): - if not re.match(pattern, identifying_value): - # If this identifying value is for a (identifying) property which has a - # pattern, and the value does NOT match the pattern, then do NOT include - # this value as an identifying path, since it cannot possibly be found. - continue - if self.type: - identifying_paths.append(f"/{self.type}/{identifying_value}") - identifying_paths.append(f"/{identifying_value}") - return identifying_paths or None - - @property - @lru_cache(maxsize=1) - def identifying_path(self) -> Optional[str]: - if identifying_paths := self.identifying_paths: - return identifying_paths[0] - - def lookup(self, include_identifying_path: bool = False, - raw: bool = False) -> Optional[Union[Tuple[PortalObject, str], PortalObject]]: - return self._lookup(raw=raw) if include_identifying_path else self._lookup(raw=raw)[0] - - def lookup_identifying_path(self) -> Optional[str]: - return self._lookup()[1] - - def _lookup(self, raw: bool = False) -> Tuple[Optional[PortalObject], Optional[str]]: + @lru_cache(maxsize=8192) + def lookup(self, raw: bool = False, + ref_lookup_strategy: Optional[Callable] = None) -> Tuple[Optional[PortalObject], Optional[str], int]: + nlookups = 0 + first_identifying_path = None try: - if identifying_paths := self.identifying_paths: + if identifying_paths := self._get_identifying_paths(ref_lookup_strategy=ref_lookup_strategy): for identifying_path in identifying_paths: + if not first_identifying_path: + first_identifying_path = identifying_path + nlookups += 1 if (value := self._portal.get(identifying_path, raw=raw)) and (value.status_code == 200): - return PortalObject(value.json(), - portal=self._portal, type=self.type if raw else None), identifying_path + return ( + PortalObject(value.json(), portal=self._portal, type=self.type if raw else None), + identifying_path, + nlookups + ) except Exception: pass - return None, self.identifying_path + return None, first_identifying_path, nlookups def compare(self, value: Union[dict, PortalObject], - consider_refs: bool = False, resolved_refs: List[dict] = None) -> dict: + consider_refs: bool = False, resolved_refs: List[dict] = None) -> Tuple[dict, int]: if consider_refs and isinstance(resolved_refs, list): - this_data = self.normalized_refs(refs=resolved_refs).data + this_data, nlookups = self._normalized_refs(refs=resolved_refs).data else: this_data = self.data + nlookups = 0 if isinstance(value, PortalObject): comparing_data = value.data elif isinstance(value, dict): comparing_data = value else: - return {} - return PortalObject._compare(this_data, comparing_data) + return {}, nlookups + return PortalObject._compare(this_data, comparing_data), nlookups @staticmethod def _compare(a: Any, b: Any, _path: Optional[str] = None) -> dict: @@ -201,42 +156,106 @@ def diff_deleting(value: Any) -> object: # noqa diffs[_path] = diff_updating(a, b) return diffs - def normalize_refs(self, refs: List[dict]) -> None: + @lru_cache(maxsize=1) + def _get_identifying_paths(self, ref_lookup_strategy: Optional[Callable] = None) -> Optional[List[str]]: """ - Turns any (linkTo) references which are paths (e.g. /SubmissionCenter/uwsc_gcc) within - this Portal object into the uuid style reference (e.g. d1b67068-300f-483f-bfe8-63d23c93801f), - based on the given "refs" list which is assumed to be a list of dictionaries, where each - contains a "path" and a "uuid" property; this list is typically (for our first usage of - this function) the value of structured_data.StructuredDataSet.resolved_refs_with_uuid. - Changes are made to this Portal object in place; use normalized_refs function to make a copy. - If there are no "refs" (None or empty) or if the speicified reference is not found in this - list then the references will be looked up via Portal calls (via Portal.get_metadata). + Returns a list of the possible Portal URL paths identifying this Portal object. """ - PortalObject._normalize_refs(self.data, refs=refs, schema=self.schema, portal=self.portal) + identifying_paths = [] + if not (identifying_properties := self.identifying_properties): + if self.uuid: + if self.type: + identifying_paths.append(f"/{self.type}/{self.uuid}") + identifying_paths.append(f"/{self.uuid}") + return identifying_paths + for identifying_property in identifying_properties: + if identifying_value := self._data.get(identifying_property): + if identifying_property == "uuid": + if self.type: + identifying_paths.append(f"/{self.type}/{identifying_value}") + identifying_paths.append(f"/{identifying_value}") + # For now at least we include the path both with and without the schema type component, + # as for some identifying values, it works (only) with, and some, it works (only) without. + # For example: If we have FileSet with "accession", an identifying property, with value + # SMAFSFXF1RO4 then /SMAFSFXF1RO4 works but /FileSet/SMAFSFXF1RO4 does not; and + # conversely using "submitted_id", also an identifying property, with value + # UW_FILE-SET_COLO-829BL_HI-C_1 then /UW_FILE-SET_COLO-829BL_HI-C_1 does + # not work but /FileSet/UW_FILE-SET_COLO-829BL_HI-C_1 does work. + elif isinstance(identifying_value, list): + for identifying_value_item in identifying_value: + if self.type: + identifying_paths.append(f"/{self.type}/{identifying_value_item}") + identifying_paths.append(f"/{identifying_value_item}") + else: + # TODO: Import from somewhere ... + lookup_options = 0 + if schema := self.schema: + # TODO: Hook into the ref_lookup_strategy thing in structured_data to make + # sure we check accession format (since it does not have a pattern). + if callable(ref_lookup_strategy): + lookup_options, ref_validator = ref_lookup_strategy( + self.type, schema, identifying_value) + if callable(ref_validator): + if ref_validator(schema, identifying_property, identifying_value) is False: + continue + if pattern := schema.get("properties", {}).get(identifying_property, {}).get("pattern"): + if not re.match(pattern, identifying_value): + # If this identifying value is for a (identifying) property which has a + # pattern, and the value does NOT match the pattern, then do NOT include + # this value as an identifying path, since it cannot possibly be found. + continue + if not lookup_options: + lookup_options = Portal.LOOKUP_DEFAULT + if Portal.is_lookup_root_first(lookup_options): + identifying_paths.append(f"/{identifying_value}") + if Portal.is_lookup_specified_type(lookup_options) and self.type: + identifying_paths.append(f"/{self.type}/{identifying_value}") + if Portal.is_lookup_root(lookup_options) and not Portal.is_lookup_root_first(lookup_options): + identifying_paths.append(f"/{identifying_value}") + if Portal.is_lookup_subtypes(lookup_options): + for subtype_name in self._portal.get_schemas_subtype_names(): + identifying_paths.append(f"/{subtype_name}/{identifying_value}") + return identifying_paths or None - def normalized_refs(self, refs: List[dict]) -> PortalObject: + def _normalized_refs(self, refs: List[dict]) -> Tuple[PortalObject, int]: """ - Same as normalize_ref but does not make this change to this Portal object in place, + Same as _normalize_ref but does NOT make this change to this Portal object IN PLACE, rather it returns a new instance of this Portal object wrapped in a new PortalObject. """ portal_object = self.copy() - portal_object.normalize_refs(refs) - return portal_object + nlookups = portal_object._normalize_refs(refs) + return portal_object, nlookups + + def _normalize_refs(self, refs: List[dict]) -> int: + """ + Turns any (linkTo) references which are paths (e.g. /SubmissionCenter/uwsc_gcc) within this + object IN PLACE into the uuid style reference (e.g. d1b67068-300f-483f-bfe8-63d23c93801f), + based on the given "refs" list which is assumed to be a list of dictionaries, where each + contains a "path" and a "uuid" property; this list is typically (for our first usage of + this function) the value of structured_data.StructuredDataSet.resolved_refs_with_uuid. + Changes are made to this Portal object IN PLACE; use _normalized_refs function to make a copy. + If there are no "refs" (None or empty) or if the speicified reference is not found in this + list then the references will be looked up via Portal calls (via Portal.get_metadata). + """ + _, nlookups = PortalObject._normalize_data_refs(self.data, refs=refs, schema=self.schema, portal=self.portal) + return nlookups @staticmethod - def _normalize_refs(value: Any, refs: List[dict], schema: dict, portal: Portal, _path: Optional[str] = None) -> Any: + def _normalize_data_refs(value: Any, refs: List[dict], schema: dict, + portal: Portal, _path: Optional[str] = None) -> Tuple[Any, int]: + nlookups = 0 if not value or not isinstance(schema, dict): - return value + return value, nlookups if isinstance(value, dict): for key in value: path = f"{_path}.{key}" if _path else key - value[key] = PortalObject._normalize_refs(value[key], refs=refs, - schema=schema, portal=portal, _path=path) + value[key] = PortalObject._normalize_data_refs(value[key], refs=refs, + schema=schema, portal=portal, _path=path) elif isinstance(value, list): for index in range(len(value)): path = f"{_path or ''}#{index}" - value[index] = PortalObject._normalize_refs(value[index], refs=refs, - schema=schema, portal=portal, _path=path) + value[index] = PortalObject._normalize_data_refs(value[index], refs=refs, + schema=schema, portal=portal, _path=path) elif value_type := Schema.get_property_by_path(schema, _path): if link_to := value_type.get("linkTo"): ref_path = f"/{link_to}/{value}" @@ -247,7 +266,7 @@ def _normalize_refs(value: Any, refs: List[dict], schema: dict, portal: Portal, else: ref_uuid = None if ref_uuid: - return ref_uuid + return ref_uuid, nlookups # Here our (linkTo) reference appears not to be in the given refs; if these refs came # from structured_data.StructuredDataSet.resolved_refs_with_uuid (in the context of # smaht-submitr, which is the typical/first use case for this function) then this could @@ -255,6 +274,7 @@ def _normalize_refs(value: Any, refs: List[dict], schema: dict, portal: Portal, # the data/spreadsheet being submitted. In any case, we don't have the associated uuid # so let us look it up here. if isinstance(portal, Portal): + nlookups += 1 if (ref_object := portal.get_metadata(ref_path)) and (ref_uuid := ref_object.get("uuid")): - return ref_uuid - return value + return ref_uuid, nlookups + return value, nlookups diff --git a/dcicutils/portal_utils.py b/dcicutils/portal_utils.py index 573ae9c40..63af4cf42 100644 --- a/dcicutils/portal_utils.py +++ b/dcicutils/portal_utils.py @@ -46,6 +46,22 @@ class Portal: KEYS_FILE_DIRECTORY = "~" MIME_TYPE_JSON = "application/json" + # Object lookup strategies; on a per-reference (type/value) basis, used currently ONLY by + # structured_data.py; controlled by an optional ref_lookup_strategy callable; default is + # lookup at root path but after the specified type path lookup, and then lookup all subtypes; + # can choose to lookup root path first, or not lookup root path at all, or not lookup + # subtypes at all; the ref_lookup_strategy callable if specified should take a type_name + # and value (string) arguements and return an integer of any of the below ORed together. + # The main purpose of this is optimization; to minimize portal lookups; since for example, + # currently at least, /{type}/{accession} does not work but /{accession} does; so we + # currently (smaht-portal/.../ingestion_processors) use LOOKUP_ROOT_FIRST for this. + # And current usage NEVER has LOOKUP_SUBTYPES turned OFF; but support just in case. + LOOKUP_SPECIFIED_TYPE = 0x0001 + LOOKUP_ROOT = 0x0002 + LOOKUP_ROOT_FIRST = 0x0004 | LOOKUP_ROOT + LOOKUP_SUBTYPES = 0x0008 + LOOKUP_DEFAULT = LOOKUP_SPECIFIED_TYPE | LOOKUP_ROOT | LOOKUP_SUBTYPES + def __init__(self, arg: Optional[Union[Portal, TestApp, VirtualApp, PyramidRouter, dict, tuple, str]] = None, env: Optional[str] = None, server: Optional[str] = None, @@ -188,9 +204,27 @@ def app(self) -> Optional[str]: def vapp(self) -> Optional[TestApp]: return self._vapp + @staticmethod + def is_lookup_specified_type(lookup_options: int) -> bool: + return (lookup_options & + Portal.LOOKUP_SPECIFIED_TYPE) == Portal.LOOKUP_SPECIFIED_TYPE + + @staticmethod + def is_lookup_root(lookup_options: int) -> bool: + return (lookup_options & Portal.LOOKUP_ROOT) == Portal.LOOKUP_ROOT + + @staticmethod + def is_lookup_root_first(lookup_options: int) -> bool: + return (lookup_options & Portal.LOOKUP_ROOT_FIRST) == Portal.LOOKUP_ROOT_FIRST + + @staticmethod + def is_lookup_subtypes(lookup_options: int) -> bool: + return (lookup_options & Portal.LOOKUP_SUBTYPES) == Portal.LOOKUP_SUBTYPES + def get(self, url: str, follow: bool = True, raw: bool = False, database: bool = False, raise_for_status: bool = False, **kwargs) -> OptionalResponse: url = self.url(url, raw, database) + # print(f'xyzzy.portal.get({url})') if not self.vapp: response = requests.get(url, allow_redirects=follow, **self._kwargs(**kwargs)) else: @@ -205,6 +239,7 @@ def get(self, url: str, follow: bool = True, def patch(self, url: str, data: Optional[dict] = None, json: Optional[dict] = None, raise_for_status: bool = False, **kwargs) -> OptionalResponse: url = self.url(url) + # print(f'xyzzy.portal.patch({url})') if not self.vapp: response = requests.patch(url, data=data, json=json, **self._kwargs(**kwargs)) else: @@ -217,6 +252,7 @@ def patch(self, url: str, data: Optional[dict] = None, json: Optional[dict] = No def post(self, url: str, data: Optional[dict] = None, json: Optional[dict] = None, files: Optional[dict] = None, raise_for_status: bool = False, **kwargs) -> OptionalResponse: url = self.url(url) + # print(f'xyzzy.portal.post({url})') if files and not ("headers" in kwargs): # Setting headers to None when using files implies content-type multipart/form-data. kwargs["headers"] = None @@ -233,6 +269,7 @@ def post(self, url: str, data: Optional[dict] = None, json: Optional[dict] = Non return response def get_metadata(self, object_id: str, raw: bool = False, database: bool = False) -> Optional[dict]: + # print(f'xyzzy.portal.get_metadata({object_id})') if isinstance(raw, bool) and raw: add_on = "frame=raw" + ("&datastore=database" if isinstance(database, bool) and database else "") elif database: @@ -242,11 +279,13 @@ def get_metadata(self, object_id: str, raw: bool = False, database: bool = False return get_metadata(obj_id=object_id, vapp=self.vapp, key=self.key, add_on=add_on) def patch_metadata(self, object_id: str, data: dict) -> Optional[dict]: + # print(f'xyzzy.portal.patch_metadata({object_id})') if self.key: return patch_metadata(obj_id=object_id, patch_item=data, key=self.key) return self.patch(f"/{object_id}", data).json() def post_metadata(self, object_type: str, data: dict) -> Optional[dict]: + # print(f'xyzzy.portal.post_metadata({object_id})') if self.key: return post_metadata(schema_name=object_type, post_item=data, key=self.key) return self.post(f"/{object_type}", data).json() @@ -358,6 +397,12 @@ def list_breadth_first(super_type_map: dict, super_type_name: str) -> dict: super_type_map_flattened[super_type_name] = list_breadth_first(super_type_map, super_type_name) return super_type_map_flattened + @lru_cache(maxsize=64) + def get_schemas_subtype_names(self, type_name: str) -> List[str]: + if not (schemas_super_type_map := self.get_schemas_super_type_map()): + return [] + return schemas_super_type_map.get(type_name, []) + def url(self, url: str, raw: bool = False, database: bool = False) -> str: if not isinstance(url, str) or not url: return "/" diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 9cfd030b3..4e6032777 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -48,22 +48,6 @@ class StructuredDataSet: - # Reference (linkTo) lookup strategies; on a per-reference (type/value) basis; - # controlled by optional ref_lookup_strategy callable; default is lookup at root path - # but after the named reference (linkTo) type path lookup, and then lookup all subtypes; - # can choose to lookup root path first, or not lookup root path at all, or not lookup - # subtypes at all; the ref_lookup_strategy callable if specified should take a type_name - # and value (string) arguements and return an integer of any of the below ORed together. - # The main purpose of this is optimization; to minimize portal lookups; since for example, - # currently at least, /{type}/{accession} does not work but /{accession} does; so we - # currently (smaht-portal/.../ingestion_processors) use REF_LOOKUP_ROOT_FIRST for this. - # And current usage NEVER has REF_LOOKUP_SUBTYPES turned OFF; but support just in case. - REF_LOOKUP_SPECIFIED_TYPE = 0x0001 - REF_LOOKUP_ROOT = 0x0002 - REF_LOOKUP_ROOT_FIRST = 0x0004 | REF_LOOKUP_ROOT - REF_LOOKUP_SUBTYPES = 0x0008 - REF_LOOKUP_DEFAULT = REF_LOOKUP_SPECIFIED_TYPE | REF_LOOKUP_ROOT | REF_LOOKUP_SUBTYPES - def __init__(self, file: Optional[str] = None, portal: Optional[Union[VirtualApp, TestApp, Portal]] = None, schemas: Optional[List[dict]] = None, autoadd: Optional[dict] = None, order: Optional[List[str]] = None, prune: bool = True, @@ -76,6 +60,7 @@ def __init__(self, file: Optional[str] = None, portal: Optional[Union[VirtualApp self._portal = Portal(portal, data=self._data, schemas=schemas, ref_lookup_strategy=ref_lookup_strategy, ref_lookup_nocache=ref_lookup_nocache) if portal else None + self._ref_lookup_strategy = ref_lookup_strategy self._order = order self._prune = prune self._warnings = {} @@ -199,25 +184,46 @@ def upload_files_located(self, upload_file["path"] = file_path return upload_files - def compare(self) -> dict: + def compare(self, progress: Optional[Callable] = None) -> dict: + def get_counts() -> int: + ntypes = 0 + nobjects = 0 + if self.data: + ntypes = len(self.data) + for type_name in self.data: + nobjects += len(self.data[type_name]) + return ntypes, nobjects diffs = {} - if self.data or self.portal: + if callable(progress): + ntypes, nobjects = get_counts() + progress({"start": True, "types": ntypes, "objects": nobjects}) + if self.data or self.portal: # TODO: what is this OR biz? refs = self.resolved_refs_with_uuids - for object_type in self.data: - if not diffs.get(object_type): - diffs[object_type] = [] - for portal_object in self.data[object_type]: - portal_object = PortalObject(portal_object, portal=self.portal, type=object_type) - existing_object, identifying_path = portal_object.lookup(include_identifying_path=True, raw=True) + # TODO: Need feedback/progress tracking mechanism here. + # TODO: Check validity of reference; actually check that earlier on even maybe. + for type_name in self.data: + if not diffs.get(type_name): + diffs[type_name] = [] + for portal_object in self.data[type_name]: + portal_object = PortalObject(portal_object, portal=self.portal, type=type_name) + existing_object, identifying_path, nlookups = ( + portal_object.lookup(raw=True, ref_lookup_strategy=self._ref_lookup_strategy)) if existing_object: - object_diffs = portal_object.compare(existing_object, consider_refs=True, resolved_refs=refs) - diffs[object_type].append(create_readonly_object(path=identifying_path, - uuid=existing_object.uuid, - diffs=object_diffs or None)) + object_diffs, nlookups_compare = portal_object.compare( + existing_object, consider_refs=True, resolved_refs=refs) + diffs[type_name].append(create_readonly_object(path=identifying_path, + uuid=existing_object.uuid, + diffs=object_diffs or None)) + if callable(progress): + progress({"update": True, "lookups": nlookups + nlookups_compare}) elif identifying_path: # If there is no existing object we still create a record for this object # but with no uuid which will be the indication that it does not exist. - diffs[object_type].append(create_readonly_object(path=identifying_path, uuid=None, diffs=None)) + diffs[type_name].append(create_readonly_object(path=identifying_path, uuid=None, diffs=None)) + if callable(progress): + progress({"create": True, "lookups": nlookups}) + if callable(progress): + progress({"finish": True}) return diffs def _load_file(self, file: str) -> None: @@ -331,16 +337,16 @@ def _add_properties(self, structured_row: dict, properties: dict, schema: Option def _is_ref_lookup_specified_type(ref_lookup_flags: int) -> bool: return (ref_lookup_flags & - StructuredDataSet.REF_LOOKUP_SPECIFIED_TYPE) == StructuredDataSet.REF_LOOKUP_SPECIFIED_TYPE + Portal.LOOKUP_SPECIFIED_TYPE) == Portal.LOOKUP_SPECIFIED_TYPE def _is_ref_lookup_root(ref_lookup_flags: int) -> bool: - return (ref_lookup_flags & StructuredDataSet.REF_LOOKUP_ROOT) == StructuredDataSet.REF_LOOKUP_ROOT + return (ref_lookup_flags & Portal.LOOKUP_ROOT) == Portal.LOOKUP_ROOT def _is_ref_lookup_root_first(ref_lookup_flags: int) -> bool: - return (ref_lookup_flags & StructuredDataSet.REF_LOOKUP_ROOT_FIRST) == StructuredDataSet.REF_LOOKUP_ROOT_FIRST + return (ref_lookup_flags & Portal.LOOKUP_ROOT_FIRST) == Portal.LOOKUP_ROOT_FIRST def _is_ref_lookup_subtypes(ref_lookup_flags: int) -> bool: - return (ref_lookup_flags & StructuredDataSet.REF_LOOKUP_SUBTYPES) == StructuredDataSet.REF_LOOKUP_SUBTYPES + return (ref_lookup_flags & Portal.LOOKUP_SUBTYPES) == Portal.LOOKUP_SUBTYPES @property def ref_total_count(self) -> int: @@ -786,7 +792,7 @@ def __init__(self, if callable(ref_lookup_strategy): self._ref_lookup_strategy = ref_lookup_strategy else: - self._ref_lookup_strategy = lambda type_name, schema, value: (StructuredDataSet.REF_LOOKUP_DEFAULT, None) + self._ref_lookup_strategy = lambda type_name, schema, value: (Portal.LOOKUP_DEFAULT, None) if ref_lookup_nocache is True: self.ref_lookup = self.ref_lookup_uncached self._ref_cache = None diff --git a/test/test_portal_object_utils.py b/test/test_portal_object_utils.py index 5e06129f8..1bbde7614 100644 --- a/test/test_portal_object_utils.py +++ b/test/test_portal_object_utils.py @@ -589,9 +589,8 @@ def test_compare(): assert not portal_object.types assert not portal_object.schema assert not portal_object.identifying_properties - assert portal_object.identifying_path == f"/{TEST_OBJECT_UUID}" - assert portal_object.identifying_paths == [f"/{TEST_OBJECT_UUID}"] - assert portal_object.compare(TEST_OBJECT_RAW_JSON) == {} + assert portal_object._get_identifying_paths() == [f"/{TEST_OBJECT_UUID}"] + assert portal_object.compare(TEST_OBJECT_RAW_JSON) == ({}, 0) portal_object = PortalObject(TEST_OBJECT_DATABASE_JSON) assert portal_object.data == TEST_OBJECT_DATABASE_JSON @@ -601,10 +600,9 @@ def test_compare(): assert portal_object.types == ["IngestionSubmission", "Item"] assert not portal_object.schema assert not portal_object.identifying_properties - assert portal_object.identifying_path == f"/{TEST_OBJECT_DATABASE_JSON['@type'][0]}/{TEST_OBJECT_UUID}" - assert portal_object.identifying_paths == [f"/{TEST_OBJECT_DATABASE_JSON['@type'][0]}/{TEST_OBJECT_UUID}", - f"/{TEST_OBJECT_UUID}"] - assert portal_object.compare(TEST_OBJECT_DATABASE_JSON) == {} + assert portal_object._get_identifying_paths() == [f"/{TEST_OBJECT_DATABASE_JSON['@type'][0]}/{TEST_OBJECT_UUID}", + f"/{TEST_OBJECT_UUID}"] + assert portal_object.compare(TEST_OBJECT_DATABASE_JSON) == ({}, 0) portal_object_copy = portal_object.copy() assert portal_object.data == portal_object_copy.data @@ -620,38 +618,39 @@ def test_compare(): assert not portal_object.types assert portal_object.schema == TEST_OBJECT_SCHEMA_JSON assert portal_object.identifying_properties == ["uuid"] - assert not portal_object.identifying_path == [f"/{TEST_OBJECT_UUID}"] - assert not portal_object.identifying_paths == f"/{TEST_OBJECT_UUID}" + assert not portal_object._get_identifying_paths() == f"/{TEST_OBJECT_UUID}" - portal_object_found = portal_object.lookup() + portal_object_found, _, _ = portal_object.lookup() assert portal_object_found.uuid == portal_object.uuid assert portal_object_found.portal == portal_object.portal assert portal_object_found.type == "IngestionSubmission" assert portal_object_found.types == ["IngestionSubmission", "Item"] assert portal_object_found.schema == TEST_OBJECT_SCHEMA_JSON assert portal_object_found.identifying_properties == ["uuid", "aliases"] - assert portal_object_found.identifying_path == f"/{TEST_OBJECT_DATABASE_JSON['@type'][0]}/{TEST_OBJECT_UUID}" - assert portal_object_found.identifying_paths == [f"/{TEST_OBJECT_DATABASE_JSON['@type'][0]}/{TEST_OBJECT_UUID}", - f"/{TEST_OBJECT_UUID}", - "/IngestionSubmission/foo", "/foo", - "/IngestionSubmission/bar", "/bar"] + import pdb ; pdb.set_trace() + xx = portal_object_found._get_identifying_paths() + assert portal_object_found._get_identifying_paths() == ( + [f"/{TEST_OBJECT_DATABASE_JSON['@type'][0]}/{TEST_OBJECT_UUID}", + f"/{TEST_OBJECT_UUID}", + "/IngestionSubmission/foo", "/foo", + "/IngestionSubmission/bar", "/bar"]) portal_object_copy = portal_object.copy() portal_object_copy.data["xyzzy"] = 123 - assert portal_object.compare(portal_object_copy) == {} + assert portal_object.compare(portal_object_copy) == ({}, 0) portal_object.data["xyzzy"] = 123 - assert portal_object.compare(portal_object_copy) == {} + assert portal_object.compare(portal_object_copy) == ({}, 0) portal_object.data["xyzzy"] = 456 - diffs = portal_object.compare(portal_object_copy) + diffs, _ = portal_object.compare(portal_object_copy) assert diffs["xyzzy"].value == 456 assert diffs["xyzzy"].creating_value is False assert diffs["xyzzy"].updating_value == 123 assert diffs["xyzzy"].deleting_value is False portal_object.data["xyzzy"] = PortalObject._PROPERTY_DELETION_SENTINEL - diffs = portal_object.compare(portal_object_copy) + diffs, _ = portal_object.compare(portal_object_copy) assert diffs["xyzzy"].value == 123 assert diffs["xyzzy"].creating_value is False assert diffs["xyzzy"].updating_value is None @@ -659,14 +658,14 @@ def test_compare(): portal_object.data["xyzzy"] = 456 del portal_object_copy.data["xyzzy"] - diffs = portal_object.compare(portal_object_copy) + diffs, _ = portal_object.compare(portal_object_copy) assert diffs["xyzzy"].value == 456 assert diffs["xyzzy"].creating_value is True assert diffs["xyzzy"].updating_value is None assert diffs["xyzzy"].deleting_value is False portal_object.data["additional_data"]["upload_info"][1]["uuid"] = "foobar" - diffs = portal_object.compare(portal_object_copy) + diffs, _ = portal_object.compare(portal_object_copy) assert diffs["additional_data.upload_info#1.uuid"].value == "foobar" assert diffs["additional_data.upload_info#1.uuid"].creating_value is False assert diffs["additional_data.upload_info#1.uuid"].updating_value == "f5ac5d98-1f85-44f4-8bad-b4488fbdda7e" @@ -679,7 +678,7 @@ def test_compare(): portal_object = PortalObject(TEST_OBJECT_DATABASE_JSON) portal_object_copy = portal_object.copy() portal_object_copy.data["submitted_by"]["display_title"] = "J. Alfred Prufrock" - diffs = portal_object.compare(portal_object_copy) + diffs, _ = portal_object.compare(portal_object_copy) assert diffs["submitted_by.display_title"].value == "David Michaels" assert diffs["submitted_by.display_title"].creating_value is False assert diffs["submitted_by.display_title"].updating_value == "J. Alfred Prufrock" From 58c8067cbd74f7d3a53083ff08ee0ba35898e09a Mon Sep 17 00:00:00 2001 From: David Michaels Date: Tue, 12 Mar 2024 14:52:04 -0400 Subject: [PATCH 53/64] optimizing the structured_data comparison - and progress (tqdm) support. --- test/test_portal_object_utils.py | 2 -- test/test_structured_data.py | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/test/test_portal_object_utils.py b/test/test_portal_object_utils.py index 1bbde7614..18e632620 100644 --- a/test/test_portal_object_utils.py +++ b/test/test_portal_object_utils.py @@ -627,8 +627,6 @@ def test_compare(): assert portal_object_found.types == ["IngestionSubmission", "Item"] assert portal_object_found.schema == TEST_OBJECT_SCHEMA_JSON assert portal_object_found.identifying_properties == ["uuid", "aliases"] - import pdb ; pdb.set_trace() - xx = portal_object_found._get_identifying_paths() assert portal_object_found._get_identifying_paths() == ( [f"/{TEST_OBJECT_DATABASE_JSON['@type'][0]}/{TEST_OBJECT_UUID}", f"/{TEST_OBJECT_UUID}", diff --git a/test/test_structured_data.py b/test/test_structured_data.py index d0ac1d886..40c9140a0 100644 --- a/test/test_structured_data.py +++ b/test/test_structured_data.py @@ -1518,13 +1518,13 @@ def ref_lookup_strategy(type_name: str, schema: dict, value: str) -> Tuple[int, if schema_properties := schema.get("properties"): if schema_properties.get("accession") and is_accession(value): # Case: lookup by accession (only by root). - return StructuredDataSet.REF_LOOKUP_ROOT, not_an_identifying_property + return Portal.LOOKUP_ROOT, not_an_identifying_property elif schema_property_info_submitted_id := schema_properties.get("submitted_id"): if schema_property_pattern_submitted_id := schema_property_info_submitted_id.get("pattern"): if re.match(schema_property_pattern_submitted_id, value): # Case: lookup by submitted_id (only by specified type). - return StructuredDataSet.REF_LOOKUP_SPECIFIED_TYPE, not_an_identifying_property - return StructuredDataSet.REF_LOOKUP_DEFAULT, not_an_identifying_property + return Portal.LOOKUP_SPECIFIED_TYPE, not_an_identifying_property + return Portal.LOOKUP_DEFAULT, not_an_identifying_property structured_data = StructuredDataSet.load(file=file, portal=portal, autoadd=autoadd, order=ITEM_INDEX_ORDER, prune=prune, From b8086dda91598cf2e21299006e6a914a40b971f8 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Tue, 12 Mar 2024 14:52:10 -0400 Subject: [PATCH 54/64] optimizing the structured_data comparison - and progress (tqdm) support. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index aa2cf07fb..1c577275a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b22" # TODO: To become 8.8.1 +version = "8.8.0.1b23" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 988754aff68aff4d7125fdb593d5d554c7592441 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Tue, 12 Mar 2024 19:25:09 -0400 Subject: [PATCH 55/64] fix --- dcicutils/portal_object_utils.py | 11 ++++++----- dcicutils/structured_data.py | 12 ++++++++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/dcicutils/portal_object_utils.py b/dcicutils/portal_object_utils.py index 150a41d81..62382a82b 100644 --- a/dcicutils/portal_object_utils.py +++ b/dcicutils/portal_object_utils.py @@ -99,7 +99,8 @@ def lookup(self, raw: bool = False, def compare(self, value: Union[dict, PortalObject], consider_refs: bool = False, resolved_refs: List[dict] = None) -> Tuple[dict, int]: if consider_refs and isinstance(resolved_refs, list): - this_data, nlookups = self._normalized_refs(refs=resolved_refs).data + normlized_portal_object, nlookups = self._normalized_refs(refs=resolved_refs) + this_data = normlized_portal_object.data else: this_data = self.data nlookups = 0 @@ -249,13 +250,13 @@ def _normalize_data_refs(value: Any, refs: List[dict], schema: dict, if isinstance(value, dict): for key in value: path = f"{_path}.{key}" if _path else key - value[key] = PortalObject._normalize_data_refs(value[key], refs=refs, - schema=schema, portal=portal, _path=path) + value[key], nlookups = PortalObject._normalize_data_refs(value[key], refs=refs, + schema=schema, portal=portal, _path=path) elif isinstance(value, list): for index in range(len(value)): path = f"{_path or ''}#{index}" - value[index] = PortalObject._normalize_data_refs(value[index], refs=refs, - schema=schema, portal=portal, _path=path) + value[index],nlookups = PortalObject._normalize_data_refs(value[index], refs=refs, + schema=schema, portal=portal, _path=path) elif value_type := Schema.get_property_by_path(schema, _path): if link_to := value_type.get("linkTo"): ref_path = f"/{link_to}/{value}" diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 4e6032777..ad44b0d25 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -265,6 +265,10 @@ def calculate_total_rows_to_process() -> Tuple[int, int]: for row in excel.sheet_reader(sheet_name): nrows += 1 return nrows, len(excel.sheet_names) + if False: # TODO + if self._progress: + nrows, nsheets = calculate_total_rows_to_process() + self._progress({"start": True, "sheets": nsheets, "rows": nrows}) if self._progress: self._progress_update(calculate_total_rows_to_process) excel = Excel(file) # Order the sheet names by any specified ordering (e.g. ala snovault.loadxl). @@ -309,6 +313,14 @@ def _load_reader(self, reader: RowReader, type_name: str) -> None: if self._autoadd_properties: self._add_properties(structured_row, self._autoadd_properties, schema) self._add(type_name, structured_row) + if False: + if self._progress: + self._progress({ + "parse": True, + "refs": 0, + "refs_found": 0 + "refs_not_found": 0 + }) if self._progress: self._progress_update(-1, self.ref_total_count, From 71d503f263de9216a0a023349534a5ff249f3269 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Tue, 12 Mar 2024 19:35:52 -0400 Subject: [PATCH 56/64] fix --- dcicutils/portal_object_utils.py | 6 +++--- dcicutils/portal_utils.py | 2 +- dcicutils/structured_data.py | 15 +++++++++------ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/dcicutils/portal_object_utils.py b/dcicutils/portal_object_utils.py index 62382a82b..7e48ce69f 100644 --- a/dcicutils/portal_object_utils.py +++ b/dcicutils/portal_object_utils.py @@ -214,7 +214,7 @@ def _get_identifying_paths(self, ref_lookup_strategy: Optional[Callable] = None) if Portal.is_lookup_root(lookup_options) and not Portal.is_lookup_root_first(lookup_options): identifying_paths.append(f"/{identifying_value}") if Portal.is_lookup_subtypes(lookup_options): - for subtype_name in self._portal.get_schemas_subtype_names(): + for subtype_name in self._portal.get_schema_subtype_names(self.type): identifying_paths.append(f"/{subtype_name}/{identifying_value}") return identifying_paths or None @@ -255,8 +255,8 @@ def _normalize_data_refs(value: Any, refs: List[dict], schema: dict, elif isinstance(value, list): for index in range(len(value)): path = f"{_path or ''}#{index}" - value[index],nlookups = PortalObject._normalize_data_refs(value[index], refs=refs, - schema=schema, portal=portal, _path=path) + value[index], nlookups = PortalObject._normalize_data_refs(value[index], refs=refs, + schema=schema, portal=portal, _path=path) elif value_type := Schema.get_property_by_path(schema, _path): if link_to := value_type.get("linkTo"): ref_path = f"/{link_to}/{value}" diff --git a/dcicutils/portal_utils.py b/dcicutils/portal_utils.py index 63af4cf42..1af88ea48 100644 --- a/dcicutils/portal_utils.py +++ b/dcicutils/portal_utils.py @@ -398,7 +398,7 @@ def list_breadth_first(super_type_map: dict, super_type_name: str) -> dict: return super_type_map_flattened @lru_cache(maxsize=64) - def get_schemas_subtype_names(self, type_name: str) -> List[str]: + def get_schema_subtype_names(self, type_name: str) -> List[str]: if not (schemas_super_type_map := self.get_schemas_super_type_map()): return [] return schemas_super_type_map.get(type_name, []) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index ad44b0d25..a2e8d413f 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -222,6 +222,9 @@ def get_counts() -> int: diffs[type_name].append(create_readonly_object(path=identifying_path, uuid=None, diffs=None)) if callable(progress): progress({"create": True, "lookups": nlookups}) + else: + if callable(progress): + progress({"lookups": nlookups}) if callable(progress): progress({"finish": True}) return diffs @@ -318,7 +321,7 @@ def _load_reader(self, reader: RowReader, type_name: str) -> None: self._progress({ "parse": True, "refs": 0, - "refs_found": 0 + "refs_found": 0, "refs_not_found": 0 }) if self._progress: @@ -862,7 +865,7 @@ def get_schemas(self) -> Optional[dict]: return schemas @lru_cache(maxsize=64) - def _get_schema_subtypes_names(self, type_name: str) -> List[str]: + def _get_schema_subtype_names(self, type_name: str) -> List[str]: if not (schemas_super_type_map := self.get_schemas_super_type_map()): return [] return schemas_super_type_map.get(type_name, []) @@ -925,7 +928,7 @@ def ref_exists(self, type_name: str, value: Optional[str] = None, lookup_paths.append(f"/{type_name}/{value}") if is_ref_lookup_root and not is_ref_lookup_root_first: lookup_paths.append(f"/{value}") - subtype_names = self._get_schema_subtypes_names(type_name) if is_ref_lookup_subtypes else [] + subtype_names = self._get_schema_subtype_names(type_name) if is_ref_lookup_subtypes else [] for subtype_name in subtype_names: lookup_paths.append(f"/{subtype_name}/{value}") if not lookup_paths: @@ -964,7 +967,7 @@ def ref_exists_internally(self, type_name: str, value: Optional[str] = None, ref_lookup_strategy, ref_validator = ( self._ref_lookup_strategy(type_name, self.get_schema(type_name), value)) is_ref_lookup_subtypes = StructuredDataSet._is_ref_lookup_subtypes(ref_lookup_strategy) - subtype_names = self._get_schema_subtypes_names(type_name) if is_ref_lookup_subtypes else [] + subtype_names = self._get_schema_subtype_names(type_name) if is_ref_lookup_subtypes else [] for type_name in [type_name] + subtype_names: is_resolved, resolved_item = self._ref_exists_single_internally(type_name, value) if is_resolved: @@ -1026,7 +1029,7 @@ def is_possibly_valid(schema: dict, property_name: str, property_value: str) -> if not is_uuid(property_value): return False return True - for schema_name in [type_name] + self._get_schema_subtypes_names(type_name): + for schema_name in [type_name] + self._get_schema_subtype_names(type_name): if schema := self.get_schema(schema_name): if identifying_properties := schema.get("identifyingProperties"): for identifying_property in identifying_properties: @@ -1051,7 +1054,7 @@ def _ref_exists_from_cache(self, type_name: str, value: str) -> Optional[List[di def _cache_ref(self, type_name: str, value: str, resolved: List[str]) -> None: if self._ref_cache is not None: - subtype_names = self._get_schema_subtypes_names(type_name) + subtype_names = self._get_schema_subtype_names(type_name) for type_name in [type_name] + subtype_names: self._ref_cache[f"/{type_name}/{value}"] = resolved From 115fe6b96beef1b6462d5a06c48bcdcdde01ed0d Mon Sep 17 00:00:00 2001 From: David Michaels Date: Tue, 12 Mar 2024 22:23:41 -0400 Subject: [PATCH 57/64] ref caching stuff --- dcicutils/structured_data.py | 43 ++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index a2e8d413f..32f5bf29b 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -260,7 +260,7 @@ def _load_csv_file(self, file: str) -> None: self._load_reader(CsvReader(file), type_name=Schema.type_name(file)) def _load_excel_file(self, file: str) -> None: - def calculate_total_rows_to_process() -> Tuple[int, int]: + def get_counts() -> Tuple[int, int]: nonlocal file excel = Excel(file) nrows = 0 @@ -268,23 +268,28 @@ def calculate_total_rows_to_process() -> Tuple[int, int]: for row in excel.sheet_reader(sheet_name): nrows += 1 return nrows, len(excel.sheet_names) - if False: # TODO - if self._progress: - nrows, nsheets = calculate_total_rows_to_process() - self._progress({"start": True, "sheets": nsheets, "rows": nrows}) if self._progress: - self._progress_update(calculate_total_rows_to_process) + nrows, nsheets = get_counts() + self._progress({"start": True, "sheets": nsheets, "rows": nrows}) + """ + if self._progress: + self._progress_update(get_counts) + """ excel = Excel(file) # Order the sheet names by any specified ordering (e.g. ala snovault.loadxl). order = {Schema.type_name(key): index for index, key in enumerate(self._order)} if self._order else {} for sheet_name in sorted(excel.sheet_names, key=lambda key: order.get(Schema.type_name(key), sys.maxsize)): self._load_reader(excel.sheet_reader(sheet_name), type_name=Schema.type_name(sheet_name)) + if self._progress: + self._progress({"finish": True}) + # TODO: Do we really need progress reporting for the below? # Check for unresolved reference errors which really are not because of ordering. # Yes such internal references will be handled correctly on actual database update via snovault.loadxl. if ref_errors := self.ref_errors: ref_errors_actual = [] for ref_error in ref_errors: if not (resolved := self.portal.ref_exists(ref := ref_error["error"])): - # if not (resolved := self.portal.ref_exists_internally(ref := ref_error["error"])): # TODO + # TODO: Probably do this instead; and if so then no progress needed (per question above). + # if not (resolved := self.portal.ref_exists_internally(ref := ref_error["error"])): ref_errors_actual.append(ref_error) else: self._resolved_refs.add((ref, resolved.get("uuid"))) @@ -316,22 +321,16 @@ def _load_reader(self, reader: RowReader, type_name: str) -> None: if self._autoadd_properties: self._add_properties(structured_row, self._autoadd_properties, schema) self._add(type_name, structured_row) - if False: - if self._progress: - self._progress({ - "parse": True, - "refs": 0, - "refs_found": 0, - "refs_not_found": 0 - }) if self._progress: - self._progress_update(-1, - self.ref_total_count, - self.ref_total_found_count, - self.ref_total_notfound_count, - self.ref_lookup_count, - self.ref_lookup_cache_hit_count, - self.ref_invalid_identifying_property_count) + self._progress({ + "parse": True, + "refs": self.ref_total_count, + "refs_found": self.ref_total_found_count, + "refs_not_found": self.ref_total_notfound_count, + "refs_lookup": self.ref_lookup_count, + "refs_cache_hit": self.ref_lookup_cache_hit_count, + "refs_invalid": self.ref_invalid_identifying_property_count + }) self._note_warning(reader.warnings, "reader") if schema: self._note_error(schema._unresolved_refs, "ref") From f4261981b416327fd5209d69358bebc5478f770f Mon Sep 17 00:00:00 2001 From: David Michaels Date: Tue, 12 Mar 2024 22:23:51 -0400 Subject: [PATCH 58/64] version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1c577275a..f08a410fd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b23" # TODO: To become 8.8.1 +version = "8.8.0.1b24" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 14cc3cd5bc21a358c6f9c527346fc41f265ff5b0 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Tue, 12 Mar 2024 22:35:36 -0400 Subject: [PATCH 59/64] dead code removal --- dcicutils/structured_data.py | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/dcicutils/structured_data.py b/dcicutils/structured_data.py index 32f5bf29b..0d60c8373 100644 --- a/dcicutils/structured_data.py +++ b/dcicutils/structured_data.py @@ -76,23 +76,6 @@ def __init__(self, file: Optional[str] = None, portal: Optional[Union[VirtualApp self._debug_sleep = None self._load_file(file) if file else None - def _progress_update(self, - nrows: Union[int, Callable], - ref_total: Optional[int] = None, - ref_resolved: Optional[int] = None, - ref_unresolved: Optional[int] = None, - ref_lookups: Optional[int] = None, - ref_cache_hits: Optional[int] = None, - ref_invalid: Optional[int] = None) -> None: - if self._progress: - if callable(nrows): - nrows, nsheets = nrows() - else: - nsheets = None - if isinstance(nrows, int) and nrows != 0: - self._progress(nrows, nsheets, ref_total, ref_resolved, ref_unresolved, - ref_lookups, ref_cache_hits, ref_invalid) - @property def data(self) -> dict: return self._data @@ -271,10 +254,6 @@ def get_counts() -> Tuple[int, int]: if self._progress: nrows, nsheets = get_counts() self._progress({"start": True, "sheets": nsheets, "rows": nrows}) - """ - if self._progress: - self._progress_update(get_counts) - """ excel = Excel(file) # Order the sheet names by any specified ordering (e.g. ala snovault.loadxl). order = {Schema.type_name(key): index for index, key in enumerate(self._order)} if self._order else {} for sheet_name in sorted(excel.sheet_names, key=lambda key: order.get(Schema.type_name(key), sys.maxsize)): From 042cb48180a12100f38facc6769d9f7e232d25a4 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Tue, 12 Mar 2024 22:46:48 -0400 Subject: [PATCH 60/64] file_utils fix --- dcicutils/file_utils.py | 4 ++++ pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/dcicutils/file_utils.py b/dcicutils/file_utils.py index 49015b4ff..9ad6c6dc7 100644 --- a/dcicutils/file_utils.py +++ b/dcicutils/file_utils.py @@ -29,6 +29,8 @@ def search_for_file(file: str, elif not isinstance(location, list): location = [] for directory in location: + if not directory: + continue if isinstance(directory, (str, pathlib.PosixPath)) and os.path.exists(os.path.join(directory, file)): file_found = os.path.abspath(os.path.normpath(os.path.join(directory, file))) if single: @@ -37,6 +39,8 @@ def search_for_file(file: str, files_found.append(file_found) if recursive: for directory in location: + if not directory: + continue if not directory.endswith("/**") and not file.startswith("**/"): path = f"{directory}/**/{file}" else: diff --git a/pyproject.toml b/pyproject.toml index f08a410fd..eb1215d98 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b24" # TODO: To become 8.8.1 +version = "8.8.0.1b25" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 52c73088a9a48cc3c0e51482470daf49600b1919 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Wed, 13 Mar 2024 12:18:10 -0400 Subject: [PATCH 61/64] minor portal_utils update --- dcicutils/portal_utils.py | 17 +++++++++-------- pyproject.toml | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/dcicutils/portal_utils.py b/dcicutils/portal_utils.py index 1af88ea48..0853c0e5e 100644 --- a/dcicutils/portal_utils.py +++ b/dcicutils/portal_utils.py @@ -224,7 +224,6 @@ def is_lookup_subtypes(lookup_options: int) -> bool: def get(self, url: str, follow: bool = True, raw: bool = False, database: bool = False, raise_for_status: bool = False, **kwargs) -> OptionalResponse: url = self.url(url, raw, database) - # print(f'xyzzy.portal.get({url})') if not self.vapp: response = requests.get(url, allow_redirects=follow, **self._kwargs(**kwargs)) else: @@ -239,7 +238,6 @@ def get(self, url: str, follow: bool = True, def patch(self, url: str, data: Optional[dict] = None, json: Optional[dict] = None, raise_for_status: bool = False, **kwargs) -> OptionalResponse: url = self.url(url) - # print(f'xyzzy.portal.patch({url})') if not self.vapp: response = requests.patch(url, data=data, json=json, **self._kwargs(**kwargs)) else: @@ -252,7 +250,6 @@ def patch(self, url: str, data: Optional[dict] = None, json: Optional[dict] = No def post(self, url: str, data: Optional[dict] = None, json: Optional[dict] = None, files: Optional[dict] = None, raise_for_status: bool = False, **kwargs) -> OptionalResponse: url = self.url(url) - # print(f'xyzzy.portal.post({url})') if files and not ("headers" in kwargs): # Setting headers to None when using files implies content-type multipart/form-data. kwargs["headers"] = None @@ -268,24 +265,28 @@ def post(self, url: str, data: Optional[dict] = None, json: Optional[dict] = Non response.raise_for_status() return response - def get_metadata(self, object_id: str, raw: bool = False, database: bool = False) -> Optional[dict]: - # print(f'xyzzy.portal.get_metadata({object_id})') + def get_metadata(self, object_id: str, raw: bool = False, + database: bool = False, raise_exception: bool = True) -> Optional[dict]: if isinstance(raw, bool) and raw: add_on = "frame=raw" + ("&datastore=database" if isinstance(database, bool) and database else "") elif database: add_on = "datastore=database" else: add_on = "" - return get_metadata(obj_id=object_id, vapp=self.vapp, key=self.key, add_on=add_on) + if raise_exception: + return get_metadata(obj_id=object_id, vapp=self.vapp, key=self.key, add_on=add_on) + else: + try: + return get_metadata(obj_id=object_id, vapp=self.vapp, key=self.key, add_on=add_on) + except Exception: + return None def patch_metadata(self, object_id: str, data: dict) -> Optional[dict]: - # print(f'xyzzy.portal.patch_metadata({object_id})') if self.key: return patch_metadata(obj_id=object_id, patch_item=data, key=self.key) return self.patch(f"/{object_id}", data).json() def post_metadata(self, object_type: str, data: dict) -> Optional[dict]: - # print(f'xyzzy.portal.post_metadata({object_id})') if self.key: return post_metadata(schema_name=object_type, post_item=data, key=self.key) return self.post(f"/{object_type}", data).json() diff --git a/pyproject.toml b/pyproject.toml index eb1215d98..1dda0d22e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b25" # TODO: To become 8.8.1 +version = "8.8.0.1b26" # TODO: To become 8.8.1 description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT" From 3adc9bd8a29b14404a65f502aaab2c96f8d330ad Mon Sep 17 00:00:00 2001 From: David Michaels Date: Wed, 13 Mar 2024 12:23:10 -0400 Subject: [PATCH 62/64] minor portal_utils update --- dcicutils/portal_object_utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dcicutils/portal_object_utils.py b/dcicutils/portal_object_utils.py index 7e48ce69f..c21315e00 100644 --- a/dcicutils/portal_object_utils.py +++ b/dcicutils/portal_object_utils.py @@ -276,6 +276,7 @@ def _normalize_data_refs(value: Any, refs: List[dict], schema: dict, # so let us look it up here. if isinstance(portal, Portal): nlookups += 1 - if (ref_object := portal.get_metadata(ref_path)) and (ref_uuid := ref_object.get("uuid")): + if ((ref_object := portal.get_metadata(ref_path, raise_exception=False)) and + (ref_uuid := ref_object.get("uuid"))): return ref_uuid, nlookups return value, nlookups From 1c2b3af7110047f6121381b0856838fa299fd6d2 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Wed, 13 Mar 2024 12:23:51 -0400 Subject: [PATCH 63/64] lint --- dcicutils/portal_object_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dcicutils/portal_object_utils.py b/dcicutils/portal_object_utils.py index c21315e00..0d43f2c93 100644 --- a/dcicutils/portal_object_utils.py +++ b/dcicutils/portal_object_utils.py @@ -277,6 +277,6 @@ def _normalize_data_refs(value: Any, refs: List[dict], schema: dict, if isinstance(portal, Portal): nlookups += 1 if ((ref_object := portal.get_metadata(ref_path, raise_exception=False)) and - (ref_uuid := ref_object.get("uuid"))): + (ref_uuid := ref_object.get("uuid"))): # noqa return ref_uuid, nlookups return value, nlookups From b974655e4c5c6474cf55b92df217b6c965174223 Mon Sep 17 00:00:00 2001 From: David Michaels Date: Wed, 13 Mar 2024 14:19:11 -0400 Subject: [PATCH 64/64] version to 8.8.1 - ready to merge to master --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1dda0d22e..1b470311b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dcicutils" -version = "8.8.0.1b26" # TODO: To become 8.8.1 +version = "8.8.1" description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources" authors = ["4DN-DCIC Team "] license = "MIT"