From ca1297b356f26288c2dfe518dbd19208779d426b Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Thu, 22 Dec 2022 12:37:07 +0100 Subject: [PATCH 01/77] removing the validation directories The validation directories are confusing & not part of the framework itself. --- docs/formats-standards.md | 12 +- .../validation/beaconCommonComponents.json | 54 --------- .../requests/validation/filteringTerms.json | 109 ------------------ .../validation/beaconCommonComponents.yaml | 37 ------ .../requests/validation/filteringTerms.yaml | 88 -------------- 5 files changed, 4 insertions(+), 296 deletions(-) delete mode 100644 framework/json/common/validation/beaconCommonComponents.json delete mode 100644 framework/json/requests/validation/filteringTerms.json delete mode 100644 framework/src/common/validation/beaconCommonComponents.yaml delete mode 100644 framework/src/requests/validation/filteringTerms.yaml diff --git a/docs/formats-standards.md b/docs/formats-standards.md index e22885c73..403a666fe 100644 --- a/docs/formats-standards.md +++ b/docs/formats-standards.md @@ -23,28 +23,24 @@ The Beacon v2 specification is written in [YAML](https://yaml.org). The original framework |-- json | |-- common - | | |-- examples - | | `-- validation + | | `-- examples | |-- configuration | | `-- examples | |-- requests | | |-- examples-fullDocuments - | | |-- examples-sections - | | `-- validation + | | `-- examples-sections | `-- responses | |-- examples-fullDocuments | |-- examples-sections | `-- sections `-- src |-- common - | |-- examples - | `-- validation + | `-- examples |-- configuration | `-- examples |-- requests | |-- examples-fullDocuments - | |-- examples-sections - | `-- validation + | `-- examples-sections `-- responses |-- examples-fullDocuments |-- examples-sections diff --git a/framework/json/common/validation/beaconCommonComponents.json b/framework/json/common/validation/beaconCommonComponents.json deleted file mode 100644 index 99bb55603..000000000 --- a/framework/json/common/validation/beaconCommonComponents.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "properties": { - "$schema": { - "description": "Added here to allow the example to comply with the 'additionalProperties:true' restriction.", - "type": "string" - }, - "apiVersion": { - "$ref": "../beaconCommonComponents.json#/definitions/ApiVersion" - }, - "beaconError": { - "$ref": "../beaconCommonComponents.json#/definitions/BeaconError" - }, - "beaconId": { - "$ref": "../beaconCommonComponents.json#/definitions/BeaconId" - }, - "exists": { - "$ref": "../beaconCommonComponents.json#/definitions/Exists" - }, - "filters": { - "$ref": "../beaconCommonComponents.json#/definitions/Filters" - }, - "handover": { - "$ref": "../beaconCommonComponents.json#/definitions/Handover" - }, - "handoverType": { - "$ref": "../beaconCommonComponents.json#/definitions/HandoverType" - }, - "includeResultsetResponses": { - "$ref": "../beaconCommonComponents.json#/definitions/IncludeResultsetResponses" - }, - "info": { - "$ref": "../beaconCommonComponents.json#/definitions/Info" - }, - "listOfHandovers": { - "$ref": "../beaconCommonComponents.json#/definitions/ListOfHandovers" - }, - "listOfSchemas": { - "$ref": "../beaconCommonComponents.json#/definitions/ListOfSchemas" - }, - "numTotalResults": { - "$ref": "../beaconCommonComponents.json#/definitions/NumTotalResults" - }, - "pagination": { - "$ref": "../beaconCommonComponents.json#/definitions/Pagination" - }, - "schemasPerEntity": { - "$ref": "../beaconCommonComponents.json#/definitions/SchemasPerEntity" - } - }, - "title": "Schema for validating Beacon Common Components examples", - "type": "object" -} \ No newline at end of file diff --git a/framework/json/requests/validation/filteringTerms.json b/framework/json/requests/validation/filteringTerms.json deleted file mode 100644 index e4d51516e..000000000 --- a/framework/json/requests/validation/filteringTerms.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "definitions": { - "AlphanumericFilter": { - "description": "Filter results based on operators and values applied to alphanumeric fields.", - "properties": { - "id": { - "description": "Field identfier to be queried.", - "example": "age", - "type": "string" - }, - "operator": { - "default": "=", - "description": "Defines how the value relates to the field `id`.", - "enum": [ - "=", - "<", - ">", - "!", - ">=", - "<=" - ], - "example": ">", - "type": "string" - }, - "value": { - "description": "Alphanumeric search term to be used within the query which can contain wildcard characters (%) to denote any number of unknown characters. Values can be assocatied with units if applicable.", - "example": "P70Y", - "type": "string" - } - }, - "required": [ - "id", - "operator", - "value" - ], - "type": "object" - }, - "CustomFilter": { - "description": "Filter results to include records that contain a custom term defined by this Beacon.", - "properties": { - "id": { - "description": "Custom filter terms should contain a unique identifier.", - "example": "demographic.ethnicity:asian", - "type": "string" - } - }, - "required": [ - "id" - ], - "type": "object" - }, - "OntologyFilter": { - "description": "Filter results to include records that contain a specific ontology term.", - "properties": { - "id": { - "description": "Term ID to be queried, using CURIE syntax where possible.", - "example": "HP:0002664", - "type": "string" - }, - "includeDescendantTerms": { - "default": true, - "description": "Define if the Beacon should implement the ontology hierarchy, thus query the descendant terms of `id`.", - "type": "boolean" - }, - "similarity": { - "default": "exact", - "description": "Allow the Beacon to return results which do not match the filter exactly, but do match to a certain degree of similarity. The Beacon defines the semantic similarity model implemented and how to apply the thresholds of 'high', 'medium' and 'low' similarity.", - "enum": [ - "exact", - "high", - "medium", - "low" - ], - "type": "string" - } - }, - "required": [ - "id" - ], - "type": "object" - } - }, - "description": "Rules for selecting records based upon the field values those records contain. Filters are seperated by the logical AND operator.", - "properties": { - "$schema": { - "description": "Added here to allow the example to comply with the 'additionalProperties:true' restriction.", - "type": "string" - }, - "filters": { - "items": { - "anyOf": [ - { - "$ref": "#/definitions/OntologyFilter" - }, - { - "$ref": "#/definitions/AlphanumericFilter" - }, - { - "$ref": "#/definitions/CustomFilter" - } - ] - }, - "type": "array" - } - }, - "title": "Filtering Term Element" -} \ No newline at end of file diff --git a/framework/src/common/validation/beaconCommonComponents.yaml b/framework/src/common/validation/beaconCommonComponents.yaml deleted file mode 100644 index ac0b6d9f3..000000000 --- a/framework/src/common/validation/beaconCommonComponents.yaml +++ /dev/null @@ -1,37 +0,0 @@ -$schema: https://json-schema.org/draft/2020-12/schema -title: Schema for validating Beacon Common Components examples -type: object -properties: - $schema: - type: string - description: Added here to allow the example to comply with the 'additionalProperties:true' - restriction. - beaconId: - $ref: ../beaconCommonComponents.yaml#/definitions/BeaconId - apiVersion: - $ref: ../beaconCommonComponents.yaml#/definitions/ApiVersion - beaconError: - $ref: ../beaconCommonComponents.yaml#/definitions/BeaconError - listOfSchemas: - $ref: ../beaconCommonComponents.yaml#/definitions/ListOfSchemas - schemasPerEntity: - $ref: ../beaconCommonComponents.yaml#/definitions/SchemasPerEntity - pagination: - $ref: ../beaconCommonComponents.yaml#/definitions/Pagination - includeResultsetResponses: - $ref: ../beaconCommonComponents.yaml#/definitions/IncludeResultsetResponses - filters: - $ref: ../beaconCommonComponents.yaml#/definitions/Filters - exists: - $ref: ../beaconCommonComponents.yaml#/definitions/Exists - numTotalResults: - $ref: ../beaconCommonComponents.yaml#/definitions/NumTotalResults - info: - $ref: ../beaconCommonComponents.yaml#/definitions/Info - handover: - $ref: ../beaconCommonComponents.yaml#/definitions/Handover - handoverType: - $ref: ../beaconCommonComponents.yaml#/definitions/HandoverType - listOfHandovers: - $ref: ../beaconCommonComponents.yaml#/definitions/ListOfHandovers -additionalProperties: false diff --git a/framework/src/requests/validation/filteringTerms.yaml b/framework/src/requests/validation/filteringTerms.yaml deleted file mode 100644 index 6fa00be82..000000000 --- a/framework/src/requests/validation/filteringTerms.yaml +++ /dev/null @@ -1,88 +0,0 @@ -$schema: https://json-schema.org/draft/2020-12/schema -title: Filtering Term Element -description: Rules for selecting records based upon the field values those records - contain. Filters are seperated by the logical AND operator. -properties: - $schema: - type: string - description: Added here to allow the example to comply with the 'additionalProperties:true' - restriction. - filters: - type: array - items: - anyOf: - - $ref: '#/definitions/OntologyFilter' - - $ref: '#/definitions/AlphanumericFilter' - - $ref: '#/definitions/CustomFilter' -definitions: - OntologyFilter: - type: object - description: Filter results to include records that contain a specific ontology - term. - required: - - id - properties: - id: - type: string - description: Term ID to be queried, using CURIE syntax where possible. - example: HP:0002664 - includeDescendantTerms: - type: boolean - default: true - description: Define if the Beacon should implement the ontology hierarchy, - thus query the descendant terms of `id`. - similarity: - type: string - enum: - - exact - - high - - medium - - low - default: exact - description: Allow the Beacon to return results which do not match the filter - exactly, but do match to a certain degree of similarity. The Beacon defines - the semantic similarity model implemented and how to apply the thresholds - of 'high', 'medium' and 'low' similarity. - AlphanumericFilter: - description: Filter results based on operators and values applied to alphanumeric - fields. - type: object - required: - - id - - operator - - value - properties: - id: - type: string - description: Field identfier to be queried. - example: age - operator: - type: string - enum: - - '=' - - < - - '>' - - '!' - - '>=' - - <= - description: Defines how the value relates to the field `id`. - default: '=' - example: '>' - value: - type: string - description: Alphanumeric search term to be used within the query which can - contain wildcard characters (%) to denote any number of unknown characters. Values - can be assocatied with units if applicable. - example: P70Y - CustomFilter: - type: object - description: Filter results to include records that contain a custom term defined - by this Beacon. - required: - - id - properties: - id: - type: string - description: Custom filter terms should contain a unique identifier. - example: demographic.ethnicity:asian -additionalProperties: false From 2b16fcbc3a9dde68ec0723ef46c642bb94ed276d Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Tue, 14 Mar 2023 16:31:28 +0100 Subject: [PATCH 02/77] Update other-implementations.md Some test changes for the new build workflow from website-docs --- docs/other-implementations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/other-implementations.md b/docs/other-implementations.md index 16eff2f8d..fc5ad483e 100644 --- a/docs/other-implementations.md +++ b/docs/other-implementations.md @@ -23,7 +23,7 @@ such as CNV query options or handover data delivery. * [`bycon`](http://github.com/progenetix/bycon/) Python-based full stack API / middleware * [`progenetix-web`](http://github.com/progenetix/progenetix-web/) React based front-end (modular for Beacon instances as well as the whole Progenetix UI) -##### Link: [Documentation page](implementations/org.progenetix.md) for Progenetix REST paths +##### Link: [Documentation page]([implementations/org.progenetix.md](https://docs.progenetix.org/beaconplus/#beacon-v2-path-examples-in-progenetix)) for Progenetix REST paths ### Cafe Variome From a0fb9f0ed4bdb97f88305275db9f1a140e336f34 Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Tue, 14 Mar 2023 17:34:33 +0100 Subject: [PATCH 03/77] Update index.md test edit --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index c8da2ee65..c3f6330cb 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ # Welcome to the Beacon v2 Documentation -!!! Note "Approved GA4GH Standard" +!!! Note "A SDtandard of the Global Alliance for Genomics and Health GA4GH" On [2022-04-21](formats-standards/#dates-and-times) Beacon v2 has been approved as an official [GA4GH standard](https://www.ga4gh.org/) through the GA4GH steering committee. From b851579f6f039e8fedcf896ecffd0307b6e4491d Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Tue, 14 Mar 2023 17:39:08 +0100 Subject: [PATCH 04/77] Update index.md --- docs/index.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index c3f6330cb..fa7b948a7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ # Welcome to the Beacon v2 Documentation -!!! Note "A SDtandard of the Global Alliance for Genomics and Health GA4GH" +!!! Note "A Standard of the Global Alliance for Genomics and Health GA4GH" On [2022-04-21](formats-standards/#dates-and-times) Beacon v2 has been approved as an official [GA4GH standard](https://www.ga4gh.org/) through the GA4GH steering committee. @@ -19,7 +19,9 @@ into resources and workflows, the major 2.0 release in 2022 introduced a large r
Beacon v2 specification
-The core documentation (i.e. this document) can be found on [here](http://docs.genomebeacons.org). +The core documentation (i.e. this document) can be found on [here](http://docs.genomebeacons.org). Additional +information about the Beacon project - including news, events, publications - is available +through the website [beacon-project.io](http://beacon-project.io). ## Informations for Different Types of Beacon Users From 213fddcf63aa91d23755ac9b74f665cebfa6c983 Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Tue, 14 Mar 2023 17:51:18 +0100 Subject: [PATCH 05/77] Update security.md --- docs/security.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/security.md b/docs/security.md index a05c2aeaa..1fc923176 100644 --- a/docs/security.md +++ b/docs/security.md @@ -2,8 +2,8 @@ !!! Warning "Disclaimer" - A stand-alone regulatory and ethics review has been performed on the specification itself, - however, it is the responsibility of the implementer to ensure that appropriate measures are taken + A stand-alone regulatory and ethics review has been performed on the specification itself> + However, it is the responsibility of the implementer to ensure that appropriate measures are taken to remove risks related to privacy, confidentiality, and/or security of data. The Beacon uses a 3-tiered access model: `anonymous`, `registered`, and `controlled access`. @@ -14,9 +14,11 @@ The Beacon uses a 3-tiered access model: `anonymous`, `registered`, and `control of security please see the [Framework](framework.md) documentation. ## Registered + For a Beacon to respond to a query at the **registered** tier, the user must identify themselves to the Beacon, for example by using an [ELIXIR identity](https://elixir-europe.org/internal-projects/commissioned-services/identity-access). ## Controlled + For a Beacon to respond to a **controlled** access query, the user must have applied for, and been granted access to, the Beacon (or data derived from one or more individuals within the Beacon) individuals) whose data is only accessible at specified tiers within the Beacon. This tiered access model allows the owner or controller of a Beacon to determine which responses are returned to whom depending on the query and the user who is making the request, for example to ensure the response respects the consent under which the data were collected. @@ -25,4 +27,5 @@ individuals) whose data is only accessible at specified tiers within the Beacon. Anonymous Beacon can be accessed by any request. !!! Warning "Synthetic data" - The use of synthetic data for testing is important in that it ensures that the full functionality of a Beacon can be tested and / or demonstrated without risk of exposing data from individuals. In addition to testing or demonstrating a deployment, synthetic data should be used for development, for example adding new features. + + The use of synthetic data for testing is important in that it ensures that the full functionality of a Beacon can be tested and / or demonstrated without risk of exposing data from individuals. In addition to testing or demonstrating a deployment, synthetic data should be used for development, for example when adding new features. From ee11ce19ec2f3664f4a323169f59bf54c7c538d1 Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Tue, 14 Mar 2023 17:58:11 +0100 Subject: [PATCH 06/77] Update bugs-changes-log.md --- docs/bugs-changes-log.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/bugs-changes-log.md b/docs/bugs-changes-log.md index 270fa27b5..f26870b1e 100644 --- a/docs/bugs-changes-log.md +++ b/docs/bugs-changes-log.md @@ -16,6 +16,11 @@ ## Changes +#### 2023-03-14: New `website-docs` branch + +To protect the code branches we are using now a separate ``website-docs`` branch in `beacon-v2` for documentation +website updates. Please make sure all documentation edits happen there! + #### 2022-06-20: Retiring of `beacon-framework-v2` and `beacon-v2-Models` repos * all issues and PRs were either resolved or transferred to this repository From 2b12b2311178c8e64eb5366d62ca665816072d58 Mon Sep 17 00:00:00 2001 From: Jordi Rambla Date: Tue, 28 Mar 2023 18:26:48 +0200 Subject: [PATCH 07/77] Removing mentions to "aggregated" granularity in the code. --- framework/src/common/beaconCommonComponents.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/framework/src/common/beaconCommonComponents.yaml b/framework/src/common/beaconCommonComponents.yaml index c0044ed5c..5ffee4cd0 100644 --- a/framework/src/common/beaconCommonComponents.yaml +++ b/framework/src/common/beaconCommonComponents.yaml @@ -137,7 +137,6 @@ definitions: * `boolean`: returns true/false' responses * `count`: adds the total number of positive results found - * `aggregated`: returns summary, aggregated or distribution like responses * `record`: returns details for every row. In cases where a Beacon prefers to return records with fewer than allattributes, different strategies have to be considered w/o adding them to the current design, e.g.: @@ -147,7 +146,6 @@ definitions: enum: - boolean - count - - aggregated - record default: boolean TestMode: From 799133b11ead9619441c9b9ee1eef2eae72b465b Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Thu, 30 Mar 2023 10:05:49 -0700 Subject: [PATCH 08/77] Update variant-queries.md --- docs/variant-queries.md | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/docs/variant-queries.md b/docs/variant-queries.md index 976586a5b..86594434c 100644 --- a/docs/variant-queries.md +++ b/docs/variant-queries.md @@ -336,18 +336,24 @@ values to underlying genomic variations had not been precisely defined. Experimental Factor Ontology or the GA4GH Variant Representation Standard VRS (which ligns with the main EFO terms). -### Term Use Comparison -| Beacon           | [VCF](https://samtools.github.io/hts-specs/) | SO | [EFO](http://www.ebi.ac.uk/efo/EFO_0030063) | [VRS](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) | Notes | -| -------|-----|----|-----|-----|---------| -| `DUP`[^1] or
[`EFO:0030070`](http://www.ebi.ac.uk/efo/EFO_0030070) | `DUP`
`SVCLAIM=D`[^2] | [`SO:0001742`](http://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`EFO:0030070`](http://www.ebi.ac.uk/efo/EFO_0030070) copy number gain | [`low-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) (implicit) | a sequence alteration whereby the copy number of a given genomic region is greater than the reference sequence | -| `DUP`[^1] or
[`EFO:0030071`](http://www.ebi.ac.uk/efo/EFO_0030071) | `DUP`
`SVCLAIM=D`[^2] | [`SO:0001742`](http://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain |[`EFO:0030071`](http://www.ebi.ac.uk/efo/EFO_0030071) low-level copy number gain | [`low-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) | | -| `DUP`[^1] or
[`EFO:0030072`](http://www.ebi.ac.uk/efo/EFO_0030072) | `DUP`
`SVCLAIM=D`[^2] | [`SO:0001742`](http://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain |[`EFO:0030072`](http://www.ebi.ac.uk/efo/EFO_0030072) high-level copy number gain | [`high-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) | commonly but not consistently used for >=5 copies on a bi-allelic genome region | -| `DUP`[^1] or
[`EFO:0030073`](http://www.ebi.ac.uk/efo/EFO_0030073) | `DUP`
`SVCLAIM=D`[^2] | [`SO:0001742`](http://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain |[`EFO:0030073`](http://www.ebi.ac.uk/efo/EFO_0030073) focal genome amplification | [`high-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) | commonly but not consistently used for >=5 copies on a bi-allelic genome region, of limited size (operationally max. 1-5Mb) | -| `DEL`[^1] or
[`EFO:0030067`](http://www.ebi.ac.uk/efo/EFO_0030067) | `DEL`
`SVCLAIM=D`[^2] | [`SO:0001743`](http://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`EFO:0030067`](http://www.ebi.ac.uk/efo/EFO_0030067) copy number loss | [`partial loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) (implicit) | a sequence alteration whereby the copy number of a given genomic region is smaller than the reference sequence | -| `DEL`[^1] or
[`EFO:0030068`](http://www.ebi.ac.uk/efo/EFO_0030068) | `DEL`
`SVCLAIM=D`[^2] | [`SO:0001743`](http://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`EFO:0030068`](http://www.ebi.ac.uk/efo/EFO_0030068) low-level copy number loss | [`partial loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) | | -| `DEL`[^1] or
[`EFO:0030069`](http://www.ebi.ac.uk/efo/EFO_0030069) | `DEL`
`SVCLAIM=D`[^2] | [`SO:0001743`](http://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`EFO:0030069`](http://www.ebi.ac.uk/efo/EFO_0030069) complete genomic deletion | [`complete loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) | complete genomic deletion (e.g. homozygous deletion on a bi-allelic genome region) | +## CNV Term Use Comparison in Computational (File/Schema) Formats +This table is maintained in parallel with the [hCNV community documentation](https://cnvar.org/resources/CNV-annotation-standards/#cnv-term-use-comparison-in-computational-fileschema-formats). + +| [EFO](http://www.ebi.ac.uk/efo/EFO_0030063) | Beacon | [VCF](https://samtools.github.io/hts-specs/) | SO | GA4GH [VRS](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒
[VRS proposal](https://github.com/ga4gh/vrs/issues/404)[^1] | Notes | +| ------------------------------------------- | ------------------------------------------------------------------------------ | -------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----- | +| [`EFO:0030070`](http://www.ebi.ac.uk/efo/EFO_0030070) copy number gain | `DUP`[^2] or
[`EFO:0030070`](http://www.ebi.ac.uk/efo/EFO_0030070) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](http://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`low-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) (implicit) ⇒ [`EFO:0030070`](http://www.ebi.ac.uk/efo/EFO_0030070) copy number gain | a sequence alteration whereby the copy number of a given genomic region is greater than the reference sequence | +| [`EFO:0030071`](http://www.ebi.ac.uk/efo/EFO_0030071) low-level copy number gain| `DUP`[^2] or
[`EFO:0030071`](http://www.ebi.ac.uk/efo/EFO_0030071) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](http://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`low-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030071`](http://www.ebi.ac.uk/efo/EFO_0030071) low-level copy number gain | | +| [`EFO:0030072`](http://www.ebi.ac.uk/efo/EFO_0030072) high-level copy number gain | `DUP`[^2] or
[`EFO:0030072`](http://www.ebi.ac.uk/efo/EFO_0030072) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](http://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`high-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030072`](http://www.ebi.ac.uk/efo/EFO_0030072) high-level copy number gain | commonly but not consistently used for >=5 copies on a bi-allelic genome region | +| [`EFO:0030073`](http://www.ebi.ac.uk/efo/EFO_0030073) focal genome amplification | `DUP`[^2] or
[`EFO:0030073`](http://www.ebi.ac.uk/efo/EFO_0030073) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](http://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`high-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030073`](http://www.ebi.ac.uk/efo/EFO_0030073) focal genome amplification | commonly but not consistently used for >=5 copies on a bi-allelic genome region, of limited size (operationally max. 1-5Mb) | +| [`EFO:0030067`](http://www.ebi.ac.uk/efo/EFO_0030067) copy number loss | `DEL`[^2] or
[`EFO:0030067`](http://www.ebi.ac.uk/efo/EFO_0030067) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](http://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`partial loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) (implicit) ⇒ [`EFO:0030067`](http://www.ebi.ac.uk/efo/EFO_0030067) copy number loss | a sequence alteration whereby the copy number of a given genomic region is smaller than the reference sequence | +| [`EFO:0030068`](http://www.ebi.ac.uk/efo/EFO_0030068) low-level copy number loss | `DEL`[^2] or
[`EFO:0030068`](http://www.ebi.ac.uk/efo/EFO_0030068) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](http://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`partial loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030068`](http://www.ebi.ac.uk/efo/EFO_0030068) low-level copy number loss | | +| [`EFO:0020073`](http://www.ebi.ac.uk/efo/EFO_0020073) high-level copy number loss | `DEL`[^2] or
[`EFO:0020073`](https://github.com/EBISPOT/efo/issues/1941) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](http://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`partial loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0020073`](https://github.com/EBISPOT/efo/issues/1941) high-level copy number loss | a loss of several copies; also used in cases where a complete genomic deletion cannot be asserted | +| [`EFO:0030069`](http://www.ebi.ac.uk/efo/EFO_0030069) complete genomic deletion | `DEL`[^2] or
[`EFO:0030069`](http://www.ebi.ac.uk/efo/EFO_0030069) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](http://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`complete loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030069`](http://www.ebi.ac.uk/efo/EFO_0030069) complete genomic deletion | complete genomic deletion (e.g. homozygous deletion on a bi-allelic genome region) | + +##### Last updated 2023-03-22 by @mbaudis (EFO:0020073) +##### updated 2023-03-20 by @mbaudis (VRS proposal) ## Query Parameter Change Log @@ -378,12 +384,17 @@ recommended for query forms and `alternateBases` -[^1]: While the use of VCF derived (`DUP`, `DEL`) values had been introduced with +[^1]: The VRS annotations refer to the status at v1.2 (2022). The GA4GH VRS team +is currently (Spring 2023) preparing an updated specification which will introduce +the new class `CopyNumberChange` ([discussion...](https://github.com/ga4gh/vrs/issues/404#issuecomment-1472599849)) with the use of the EFO terms (including a new term +for `high level deletion (EFO:0020073)` in the April 2023 EFO release). +[^2]: While the use of VCF derived (`DUP`, `DEL`) values had been introduced with beacon v1, usage of these terms has always been a _recommendation_ rather than an integral part of the API. We now encourage the support of more specific terms (particularly EFO) by Beacon developers. As example, the Progentix Beacon API [uses EFO terms](http://progenetix.org/search/) but provides an internal term expansion for legacy `DUP`, `DEL` support. -[^2]: VCFv4.4 introduces an `SVCLAIM` field to disambiguate between _in situ_ events (such as +[^3]: VCFv4.4 introduces an `SVCLAIM` field to disambiguate between _in situ_ events (such as tandem duplications; known _adjacency_/ _break junction_: `SVCLAIM=J`) and events where e.g. only the change in _abundance_ / _read depth_ (`SVCLAIM=D`) has been determined. Both **J** and **D** flags can be combined. + From c8c2904e5dbe0c64a4f67ad040a8cd7ea182b01e Mon Sep 17 00:00:00 2001 From: d-salgado Date: Tue, 11 Apr 2023 16:21:46 +0200 Subject: [PATCH 09/77] Update README.md correction of a typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 236d4540f..f241c53a1 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ There is a set of tools in [`/bin`](./bin/) to facilitate the conversion. ATM, a * change notes with respect to the repository & documentation are now in [docs.genomebeacons.org](http://docs.genomebeacons.org/bugs-changes-log/) * NOTE: on 2022-06-20 the previous development repositories have been archived: - ARCHIVE - [beacon-framework-v2](https://github.com/ga4gh-beacon/beacon-framework-v2) - - ARCHIVE - [[beacon-v2-Models](https://github.com/ga4gh-beacon/beacon-v2-Models) + - ARCHIVE - [beacon-v2-Models](https://github.com/ga4gh-beacon/beacon-v2-Models) ## Directory structure From b8ed6f84e9c69d2cdada0c333cef3973bf156a67 Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Mon, 8 May 2023 10:16:54 +0200 Subject: [PATCH 10/77] adding contribution/development pages Documentation: Additional contribution/development pages together with a reorganization of the navigation structure. Also, clarification of the cohorts relation (https://github.com/ga4gh-beacon/beacon-v2/issues/80). --- docs/code-organization.md | 28 +++++++++++++++++++++ docs/contribute.md | 8 ++++++ docs/models.md | 6 ++--- mkdocs.yaml | 52 ++++++++++++++++++++------------------- 4 files changed, 66 insertions(+), 28 deletions(-) create mode 100644 docs/code-organization.md create mode 100644 docs/contribute.md diff --git a/docs/code-organization.md b/docs/code-organization.md new file mode 100644 index 000000000..c8fcbf921 --- /dev/null +++ b/docs/code-organization.md @@ -0,0 +1,28 @@ +# Repository and Branch Organization + +The development of Beacon code and documentation happens in the [`beacon-v2` repository](https://github.com/ga4gh-beacon/beacon-v2). + +## Core branches + +### `main` + +The `main` branch is the branch used for production, it reflects the last version that beacon v2 has reached by accomplishing the milestones that ga4gh has set for the beacon to be considered as a new version. It can only be committed by a PR from the develop branch and exceptionally by some hotfixes to correct errors spotted after its official deployment. + +### `develop` + +The `develop` branch is the branch used for development, it reflects the current state of the progress of development. It can be modified by all the PR from the feature branches that have been finished (this means that must include all the merges from the subfeature branches) and the PR must reach a consensus to be finally accepted. + +### `website-docs` + +This branch is used to maintain the website at . The relevant files consists of anything under `/docs` as well as the configuration file (`/mkdocs.yaml`) and the workflow file for processing the pages under `/.github/workflows/mk-beacon-docs.yaml`. + +Changes to the Markdown files in the `/docs` directory (and its children) will initiate the processing of the workflow file; updating of the website than may take some minutes. + +### `gh-pages` + +The `gh-pages` branch is generated from the `/docs` directory through its `mkdocs` workflow and contains the website itself. **Do not edit** + +## Topic branches + +==TBD== + diff --git a/docs/contribute.md b/docs/contribute.md new file mode 100644 index 000000000..17f925f50 --- /dev/null +++ b/docs/contribute.md @@ -0,0 +1,8 @@ +# How to Contribute to Beacon Development + +The Beacon API & standard is a driver project of the Global Alliance for Genomics +and Health [**GA4GH**](http://ga4gh.org). Since 2016 Beacon development has been +organized through projects supported by ELIXIR with additional contributions from +outside organizations and individual developers and implementers. + +==TBD== \ No newline at end of file diff --git a/docs/models.md b/docs/models.md index f6584fe72..8472b426a 100644 --- a/docs/models.md +++ b/docs/models.md @@ -23,7 +23,7 @@ A **beacon instance** is just an implementation of a Beacon Model that follows t - especially for networked beacons - it does not prescribe how data should be organised in individual instances or what schemas should be used for local storage. -If you are a Beacon implementer, then, you don't need to clone the Framework repo, you only need to **copy** (*or clone*) the Beacon Model and modify it to your specific case. You will find plenty of references to the Framework in the Model copy, and you will use the Json schemas there to validate that both the structure of your requests and responses are compliant with the Beacon Framework. The Framewrok is not used to check the schema in the responses payload (e.g. the actual details of a biosample of a cohort). The schemas for that are included in the Model that you should have copied. +If you are a Beacon implementer, then, you don't need to clone the Framework repo, you only need to **copy** (*or clone*) the Beacon Model and modify it to your specific case. You will find plenty of references to the Framework in the Model copy, and you will use the Json schemas there to validate that both the structure of your requests and responses are compliant with the Beacon Framework. The Framework is not used to check the schema in the responses payload (e.g. the actual details of a biosample of a cohort). The schemas for that are included in the Model that you should have copied.
@@ -48,7 +48,7 @@ classDiagram individuals <.. analyses : 1..n individuals <.. runs : 1..n - cohorts o-- individuals : 1..n + cohorts o-- individuals : m..n datasets o-- genomicVariations : 1..n class genomicVariations{ @@ -123,7 +123,7 @@ classDiagram The above entities are defined as follows; - * Collections (**Datasets** and **Cohorts**): groupings of variants or individuals that share something in common: e.g., who belong to the same repository (datasets) or study population (cohorts). + * Collections (**Datasets** and **Cohorts**): groupings of variants or individuals that share something in common: e.g., who belong to the same repository (datasets) or study populations (cohorts). * **Genomic variations**: unique genomic alterations, e.g., position in a genome, sequence alterations, type, etc. * **Individuals**: either patients or healthy controls whose details (including phenotypic and clinical) are stored in the repository. * **Biosamples**: samples taken from individuals, including details of procedures, dates and times. diff --git a/mkdocs.yaml b/mkdocs.yaml index 881f243be..d3e73e471 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -56,41 +56,43 @@ markdown_extensions: nav: - Introduction: - - General Introduction: index.md - - What is Beacon v2?: what-is-beacon-v2.md - - FAQ: FAQ.md - - Changes: bugs-changes-log.md + - General Introduction: index + - What is Beacon v2?: what-is-beacon-v2 + - Beacon Flavours: beacon-flavours + - Security: security + - Networks: networks + - FAQ: FAQ + - Changes: bugs-changes-log - Querying Beacons: - - REST API: rest-api.md - - Genomic Queries: variant-queries.md + - REST API: rest-api + - Genomic Queries: variant-queries - Filters in Queries: /filters/#using-filters-in-queries - 'Implement & Deploy a Beacon': - - Implementations Options: implementations-options.md - - Standards Integration: formats-standards.md - - Filters: filters.md + - Implementations Options: implementations-options + - Standards Integration: formats-standards + - Filters: filters - Beacon Implementations: - Reference Implementation ↗: https://b2ri-documentation.readthedocs.io/en/latest/ - - Others: other-implementations.md - - Beacon Types: - - Beacon Flavours: beacon-flavours.md - - Security: security.md - - Networks: networks.md + - Others: other-implementations - Beacon Components: - - Framework: framework.md + - Framework: framework - Models: - - Introduction: models.md + - Introduction: models - Default Schemas: - - Analyses: schemas-md/analyses_defaultSchema.md - - Biosamples: schemas-md/biosamples_defaultSchema.md - - Cohorts: schemas-md/cohorts_defaultSchema.md - - Datasets: schemas-md/datasets_defaultSchema.md - - Genomic Variations: schemas-md/genomicVariations_defaultSchema.md - - Individuals: schemas-md/individuals_defaultSchema.md - - Runs: schemas-md/runs_defaultSchema.md - - Terms List: schemas-md/beacon_terms.md + - Analyses: schemas-md/analyses_defaultSchema + - Biosamples: schemas-md/biosamples_defaultSchema + - Cohorts: schemas-md/cohorts_defaultSchema + - Datasets: schemas-md/datasets_defaultSchema + - Genomic Variations: schemas-md/genomicVariations_defaultSchema + - Individuals: schemas-md/individuals_defaultSchema + - Runs: schemas-md/runs_defaultSchema + - Terms List: schemas-md/beacon_terms + - Beacon Development: + - How to Contribute: contribute + - Repository and Branch Organization: code-organization + - Github Repositories ↗: https://github.com/ga4gh-beacon/ - External Links: - Beacon Project ↗: http://beacon-project.io - - Github Repositories ↗: https://github.com/ga4gh-beacon/ # - Download PDF: pdf/beacon.pdf theme: From d490eb74ebbe363043ed53443cec067ea02ddb58 Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Wed, 24 May 2023 11:24:54 +0200 Subject: [PATCH 11/77] missing object type fix `ResultsetInstance` was missing the "type" parameter which leads to errors when creating instances. --- framework/json/responses/sections/beaconResultsets.json | 3 ++- framework/src/responses/sections/beaconResultsets.yaml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/json/responses/sections/beaconResultsets.json b/framework/json/responses/sections/beaconResultsets.json index 6ddeb3a88..a54e43030 100644 --- a/framework/json/responses/sections/beaconResultsets.json +++ b/framework/json/responses/sections/beaconResultsets.json @@ -44,7 +44,8 @@ "exists", "resultsCount", "results" - ] + ], + "type": "object" } }, "description": "Sets of results to be returned as query response.", diff --git a/framework/src/responses/sections/beaconResultsets.yaml b/framework/src/responses/sections/beaconResultsets.yaml index 246ef8277..09835db13 100644 --- a/framework/src/responses/sections/beaconResultsets.yaml +++ b/framework/src/responses/sections/beaconResultsets.yaml @@ -15,6 +15,7 @@ required: additionalProperties: true definitions: ResultsetInstance: + type: object properties: id: description: id of the resultset From 634283dcc64cfd33f6b44215da11ac5cb82c22eb Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Fri, 26 May 2023 10:31:26 +0200 Subject: [PATCH 12/77] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f94b2408..bd0848c0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,7 +34,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed * Fixed `POST`queries for `g_variant` (w/ examples) - * Removed 'json' references inside the yaml version (PR [#43] (https://github.com/ga4gh-beacon/beacon-v2/pull/43)) + * Removed 'json' references inside the yaml version (PR [#43](https://github.com/ga4gh-beacon/beacon-v2/pull/43)) + * added missing `type: object` to `ResultsetInstance` (PR [#82](https://github.com/ga4gh-beacon/beacon-v2/pull/82)) ### Deprecated From fca32338dc11594fce1bfcf5ef8c128246e5e39d Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Wed, 31 May 2023 22:24:47 +0200 Subject: [PATCH 13/77] Update filters.md More details and examples about the use of filters in various scenarios, including GET examples for age etc. A main change here is the alignment of the filter types w/ the specification (e.g. no separate "numeric" type). --- docs/filters.md | 136 +++++++++++++++++++++++++++++++----------------- 1 file changed, 89 insertions(+), 47 deletions(-) diff --git a/docs/filters.md b/docs/filters.md index dabe630d6..a8b20fba0 100644 --- a/docs/filters.md +++ b/docs/filters.md @@ -4,15 +4,25 @@ _Filters_ represent a powerful addition to the Beacon query API. They are rules !!! Important "Using Filters" - Please see [Using Filters in Queries](/filters/#using-filters-in-queries) for more information on how to use filters in Beacon requests. + Please see [Using Filters in Queries](/filters/#using-filters-in-queries) for + more information on how to use filters in Beacon requests. ## Filter types -A Beacon can support four types of Filters. -1. **Bio-ontology terms** for biomedical data or procedural metadata that are contained in public repositories such as the EMBL-EBI [Ontology Lookup Service](https://www.ebi.ac.uk/ols/index) or the NCBO [BioPortal](https://bioportal.bioontology.org/). Bio-ontology terms are identified using the full term/class identifier as CURIE, e.g. “HP:0100526”. -2. **Custom terms** for biomedical or metadata terms that are locally defined by a Beacon (e.g. not corresponding to known bio-ontology terms). Custom terms must contain unique identifiers that are used in Beacon requests. -3. **Numerical values** include integer, decimal and float data types. -4. **Alphanumerical values** include alphabetic letters and special characters with or without numbers. +A Beacon can support three general types of Filters. + +1. **Bio-ontology terms and public identifiers** for biomedical data, procedural + metadata or prefixed identifiers listed in public repositories such as the EMBL-EBI + [Ontology Lookup Service](https://www.ebi.ac.uk/ols/index), the NCBO [BioPortal](https://bioportal.bioontology.org/) + or PubMed. `OntologyFilters` are identified using the full term/class identifier + as CURIE, e.g. “HP:0100526”. +2. **Numerical and alphanumerical values** including an indicator for their logical + scope - preferably as a CURIE (e.g. `HP:0032443` _Past medical history_), a + comparator and a numerical, pseudo-numerical (e.g. ISO8601 period) or string + value +3. **Custom terms** for biomedical or metadata terms that are locally defined by + a Beacon (e.g. not corresponding to known bio-ontology terms). Custom terms must + contain unique identifiers that are used in Beacon requests (e.g. local prefixes. ## _/filtering_terms_ informational endpoint @@ -50,9 +60,9 @@ Bio-ontology and custom term Filter types contain: } ``` -Numerical value Filter types contain: +Alphanumerical value Filter types contain: -* `type` = data type as 'numeric' (required) +* `type` = data type as 'alphanumeric' (required) * `id` = field id (required) * `label` = field label (optional) @@ -63,18 +73,6 @@ Numerical value Filter types contain: "id": "PATO:000001", "label": "age" }, - ... -] -``` - -Alphanumerical value Filter types contain: - -* `type` = data type as 'alphanumeric' (required) -* `id` = field id (required) -* `label` = field label (optional) - -``` -"filterTerms": [ { "type": "alphanumeric", "id": "HP:0032443", @@ -94,7 +92,14 @@ For all query types, the logical `AND` is implied between Filters. The Filter `i In this case general filter defaults apply (e.g. `{ "includeDescendantTerms": true }`). Generally, use of filters other than CURIE values for filter ids is discouraged. -### Simple CURIE based filters query +### CURIE based filters query + +!!! note "Hierarchical term expansion" + + It is recomended that the use of terms from hierarchical ontologies/classicfications + uses an internal term expansion mechanism - _i.e._ records with parameters containing + a child term are matched when the parent term is being queried. + This default behaviour can be modoiified (see below). The following query retrieves (or filters retrieved...) data matching the diagnosis of Papillary Renal Cell Carcinoma (NCIT:C6975) from a publication identified through its PubMed id (22824167): @@ -119,7 +124,7 @@ Papillary Renal Cell Carcinoma (NCIT:C6975) from a publication identified throug ``` -### Hierarchical ontology query +### Modified hierarchical ontology query A Beacon will query for entities associated with the submitted bio-ontology term(s), and by default, all descendent terms. The optional `includeDescendantTerms` parameter can be set to either `true` or `false`. The default and assumed value @@ -162,26 +167,57 @@ POST request example of two Filters using differing relative similarity threshol ] ``` -### Numerical value query +### (Pseudo-)numerical value queries -A Beacon will query for quantitative properties when the required `operator` and numerical `value` parameters are set in the filters request. -The `id` parameter identifies the field name, the `operator` parameter defines the operator to use, and the `value` parameter provides the field query value. Equality and relational operators (= < >) can be used between field name and field value pairs, and field values can be associated with units if applicable. +A Beacon will query for quantitative properties when the required `operator` and +numerical `value` parameters are set in the filters request. The `id` parameter +identifies the field name, the `operator` parameter defines the operator to use, +and the `value` parameter provides the field query value. Equality and relational +operators (= < >) can be used between field name and field value pairs, and field +values can be associated with units if applicable. -POST request example of a Filter for individuals over 70 years of age (age = PATO:0000011, age syntax as ISO 8601): +##### Example of a Filter for individuals over 70 years of age (age = PATO:0000011, +age syntax as ISO 8601) -```json -"filters": [ - { - "id": "PATO:0000011", - "operator": ">", - "value": "P70Y" - } -] -``` +=== "GET" + + * `filters=age:>P70Y` + - intuitive use but w/o clear scoping (age... when?) + * `filters=PATO_0000011:>P70Y` ("age") + - using a term for expressing the age quality of the ISO8601 duration + - computationally more robust but w/o additional quality (age... when?) + * `filters=EFO_0004847:>P70Y` ("age at onset") + - specific for an "onset" scope of the age value + +=== "POST" + + ```json + "filters": [ + { + "id": "PATO:0000011", + "operator": ">", + "value": "P70Y" + } + ] + ``` + +We recommend that implementers provide term expansions for equivalent terms, +depending on the context. Also, it is up to the implementers to provide the +correct tooling for e.g. transformation of input values (e.g. numerical age in +years and comparator) to the standardized wire format (e.g. ages/durations are +**always** transmitted as ISO8601 periods) as well as the correct deparsing and +use (e.g. the ISO values probably will be converted to some numerical format for +database matches). -### Alphanumerical value query + +### Alphanumerical value query (_i.e._ text matches) -A Beacon will query free-text values within fields when the required `operator` and alphanumerical `value` parameters are set in the filters request. Queries can be for exact alphanumerical values, used to exclude alphanumerical values, or employ wildcards to match patterns within alphanumerical values. In all query classes, the `id` parameter identifies the field name, the `operator` parameter defines the operator to use, and the `value` parameter provides the field query value. +A Beacon will query free-text values within fields when the required `operator` +and alphanumerical `value` parameters are set in the filters request. Queries can +be for exact alphanumerical values, used to exclude alphanumerical values, or employ +wildcards to match patterns within alphanumerical values. In all query classes, +the `id` parameter identifies the field name, the `operator` parameter defines the +operator to use, and the `value` parameter provides the field query value. #### 'EXACT' value query @@ -219,14 +255,20 @@ POST request example to filter medical history free-text for any reference to ca The `operator` parameter is set to the logical not (!) operator. The `value` parameter should not be present in field value. The wildcard character can be used if required. -POST request example to filter medical history free-text for records that do not include the query string: +##### Example to filter medical history free-text for records that do not include the query string -```json -"filters": [ - { - "id": "HP:0032443", - "operator": "!", - "value": "unknown medical history" - } -] -``` +=== "GET" + + `filters=HP_0032443:!unknown+medical+history` + +=== "POST" + + ```json + "filters": [ + { + "id": "HP:0032443", + "operator": "!", + "value": "unknown medical history" + } + ] + ``` From 5ba60b3ac8a755b4ba957957dade0a73c20b3223 Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Wed, 31 May 2023 22:26:59 +0200 Subject: [PATCH 14/77] Update filters.md ... and fixing `filterTerms` => `filteringTerms` --- docs/filters.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/filters.md b/docs/filters.md index a8b20fba0..10fa40af3 100644 --- a/docs/filters.md +++ b/docs/filters.md @@ -28,7 +28,7 @@ A Beacon can support three general types of Filters. The _/filtering_terms_ endpoint returns a list of all data fields whose values may be subjected to filtering, plus the data type(s) for those fields, and/or the list of extant values for each of those data fields in the current dataset. In addition, for each bio-ontology used by a Beacon, the endpoint response includes a description of the bio-ontology in [Phenopackets Resource](https://phenopacket-schema.readthedocs.io/en/latest/resource.html) format. -The endpoint's `filterTerms` response identifies the Filter types. +The endpoint's `filteringTerms` response identifies the Filter types. Bio-ontology and custom term Filter types contain: @@ -49,7 +49,7 @@ Bio-ontology and custom term Filter types contain: }, ... ], - "filterTerms": [ + "filteringTerms": [ { "type": "Human Phenotype Ontology", "id": "HP:0008773", @@ -67,7 +67,7 @@ Alphanumerical value Filter types contain: * `label` = field label (optional) ``` -"filterTerms": [ +"filteringTerms": [ { "type": "numeric", "id": "PATO:000001", From fb7b48d4243c297c2324fa50b22e123a89025b26 Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Wed, 31 May 2023 22:37:03 +0200 Subject: [PATCH 15/77] Update filters.md --- docs/filters.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/filters.md b/docs/filters.md index 10fa40af3..ff311db4f 100644 --- a/docs/filters.md +++ b/docs/filters.md @@ -171,7 +171,8 @@ POST request example of two Filters using differing relative similarity threshol A Beacon will query for quantitative properties when the required `operator` and numerical `value` parameters are set in the filters request. The `id` parameter -identifies the field name, the `operator` parameter defines the operator to use, +identifies the logical scope (with the exact field depending on the internal data +model at the resource), the `operator` parameter defines the operator to use, and the `value` parameter provides the field query value. Equality and relational operators (= < >) can be used between field name and field value pairs, and field values can be associated with units if applicable. @@ -201,7 +202,7 @@ age syntax as ISO 8601) ] ``` -We recommend that implementers provide term expansions for equivalent terms, +We recommend that implementers provide **term expansions** for equivalent terms, depending on the context. Also, it is up to the implementers to provide the correct tooling for e.g. transformation of input values (e.g. numerical age in years and comparator) to the standardized wire format (e.g. ages/durations are @@ -210,7 +211,7 @@ use (e.g. the ISO values probably will be converted to some numerical format for database matches). -### Alphanumerical value query (_i.e._ text matches) +### Text matches A Beacon will query free-text values within fields when the required `operator` and alphanumerical `value` parameters are set in the filters request. Queries can From 68f319d938ba58bf1e56b4b3e7d29fbaddd285a2 Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Wed, 31 May 2023 22:57:23 +0200 Subject: [PATCH 16/77] age queries in FAQ --- docs/FAQ.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/FAQ.md b/docs/FAQ.md index a1367616d..90a246248 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -103,6 +103,23 @@ ##### last change 2022-12-14 by Michael Baudis [:fontawesome-brands-github:](https://github.com/mbaudis) +??? faq "How can I add e.g. an age limit to a query for a disease?" + + Ages are queried as [ISO8601 durations](https://genomestandards.org/standards/dates-times/#durations) + such as `P65Y` (_i.e._ 65 years) with a comparator (`=`, `<=`, `>` ...). However, + the value needs an indication of _what_ the duration refers to and resources + may provide different ways to indicate this (as then shown in their `/filtering_terms`) + endpoint). + + We recommend that all Beacon instances that support age queries support at + minimum the syntax of `age:<=P65Y` and map such values to the internal datapoint + most relevant for the resource's context (in most cases probably corresponding + to "age at diagnioosis"). + + However, different scenarios may be supported (e.g. `EFO_0005056:<=P1Y6M` for + an "age at death" scenario). + + ??? faq "How can I handle haplotype queries & representation in Beacon v2?" " #### Queries From 3f1d174b2bb5609640fb0b2a03cc01b36903affa Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Wed, 31 May 2023 23:04:18 +0200 Subject: [PATCH 17/77] Nav mod --- docs/FAQ.md | 3 ++- mkdocs.yaml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/FAQ.md b/docs/FAQ.md index 90a246248..f0dfb2704 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -114,11 +114,12 @@ We recommend that all Beacon instances that support age queries support at minimum the syntax of `age:<=P65Y` and map such values to the internal datapoint most relevant for the resource's context (in most cases probably corresponding - to "age at diagnioosis"). + to "age at diagniosis"). However, different scenarios may be supported (e.g. `EFO_0005056:<=P1Y6M` for an "age at death" scenario). + ##### last change 2023-05-31 by Michael Baudis [:fontawesome-brands-github:](https://github.com/mbaudis) ??? faq "How can I handle haplotype queries & representation in Beacon v2?" " diff --git a/mkdocs.yaml b/mkdocs.yaml index d3e73e471..19bc80677 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -66,7 +66,7 @@ nav: - Querying Beacons: - REST API: rest-api - Genomic Queries: variant-queries - - Filters in Queries: /filters/#using-filters-in-queries + - Phenotypes and More...: /filters/#using-filters-in-queries - 'Implement & Deploy a Beacon': - Implementations Options: implementations-options - Standards Integration: formats-standards From 80653761a31ad21785e137a9495cf9ed2eee4998 Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Thu, 1 Jun 2023 14:49:00 +0200 Subject: [PATCH 18/77] fix disease ageOfOnset examples Fixes https://github.com/ga4gh-beacon/beacon-v2/issues/59 --- .../common/disease.json | 26 +++++++------------ .../common/disease.yaml | 20 ++++++-------- 2 files changed, 17 insertions(+), 29 deletions(-) diff --git a/models/json/beacon-v2-default-model/common/disease.json b/models/json/beacon-v2-default-model/common/disease.json index 5da7a797d..d50bbfdfa 100644 --- a/models/json/beacon-v2-default-model/common/disease.json +++ b/models/json/beacon-v2-default-model/common/disease.json @@ -6,30 +6,22 @@ "$ref": "./timeElement.json", "examples": [ { - "ageGroup": { - "id": "NCIT:C49685", - "label": "Adult 18-65 Years Old" - } + "id": "NCIT:C49685", + "label": "Adult 18-65 Years Old" }, { - "age": { - "iso8601duration": "P32Y6M1D" - } + "iso8601duration": "P32Y6M1D" }, { - "ageRange": { - "end": { - "iso8601duration": "P59Y" - }, - "start": { - "iso8601duration": "P18Y" - } + "end": { + "iso8601duration": "P59Y" + }, + "start": { + "iso8601duration": "P18Y" } }, { - "age": { - "iso8601duration": "P2M4D" - } + "iso8601duration": "P2M4D" } ] }, diff --git a/models/src/beacon-v2-default-model/common/disease.yaml b/models/src/beacon-v2-default-model/common/disease.yaml index a4f5f5719..c6472dad6 100644 --- a/models/src/beacon-v2-default-model/common/disease.yaml +++ b/models/src/beacon-v2-default-model/common/disease.yaml @@ -20,18 +20,14 @@ properties: ageOfOnset: $ref: ./timeElement.yaml examples: - - ageGroup: - id: NCIT:C49685 - label: Adult 18-65 Years Old - - age: - iso8601duration: P32Y6M1D - - ageRange: - start: - iso8601duration: P18Y - end: - iso8601duration: P59Y - - age: - iso8601duration: P2M4D + - id: NCIT:C49685 + label: Adult 18-65 Years Old + - iso8601duration: P32Y6M1D + - start: + iso8601duration: P18Y + end: + iso8601duration: P59Y + - iso8601duration: P2M4D stage: description: 'Ontology term from Ontology for General Medical Science (OGMS), e.g. acute onset (OGMS:0000119). Provenance: GA4GH Phenopackets v2 `Disease.disease_stage`' From 5468efe2aeea4398e89c1321ae060ceba835571e Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Sun, 4 Jun 2023 15:51:19 +0200 Subject: [PATCH 19/77] http => https for all links This is an attempt to get the documentation site towards "clean HTTPS" --- README.md | 4 +-- bin/SCHEMAS2MD.md | 6 ++-- bin/beacon_yaml2md.pl | 8 +++--- bin/deref_schemas/datasets/defaultSchema.json | 2 +- bin/deref_schemas/datasets/defaultSchema.yaml | 2 +- .../genomicVariations/defaultSchema.json | 24 ++++++++-------- .../genomicVariations/defaultSchema.yaml | 24 ++++++++-------- bin/deref_schemas/obj/annotatedWith.yaml | 2 +- bin/deref_schemas/obj/caseLevelData.yaml | 4 +-- .../obj/clinicalInterpretations.yaml | 2 +- bin/deref_schemas/obj/externalUrl.yaml | 2 +- bin/deref_schemas/obj/identifiers.yaml | 2 +- bin/deref_schemas/obj/phenotypicEffects.yaml | 2 +- bin/deref_schemas/obj/toolReferences.yaml | 2 +- .../obj/variantAlternativeIds.yaml | 2 +- bin/deref_schemas/obj/variantLevelData.yaml | 4 +-- .../json-schema-ref-parser/CHANGELOG.md | 6 ++-- .../json-schema-ref-parser/README.md | 8 +++--- bin/node_modules/@jsdevtools/ono/CHANGELOG.md | 2 +- bin/node_modules/@jsdevtools/ono/README.md | 4 +-- .../@types/json-schema/index.d.ts | 28 +++++++++---------- bin/node_modules/argparse/CHANGELOG.md | 2 +- bin/node_modules/argparse/LICENSE | 10 +++---- bin/node_modules/argparse/README.md | 4 +-- bin/node_modules/call-me-maybe/.npmignore | 4 +-- bin/node_modules/call-me-maybe/package.json | 2 +- bin/node_modules/js-yaml/README.md | 16 +++++------ bin/node_modules/js-yaml/dist/js-yaml.js | 4 +-- bin/node_modules/js-yaml/dist/js-yaml.mjs | 4 +-- bin/node_modules/js-yaml/lib/exception.js | 2 +- bin/node_modules/js-yaml/lib/loader.js | 2 +- bin/node_modules/js-yaml/lib/schema/core.js | 2 +- .../js-yaml/lib/schema/default.js | 2 +- .../js-yaml/lib/schema/failsafe.js | 2 +- bin/node_modules/js-yaml/lib/schema/json.js | 2 +- bin/node_modules/js-yaml/package.json | 4 +-- docs/FAQ.md | 6 ++-- docs/README.md | 2 +- docs/bugs-changes-log.md | 2 +- docs/code-organization.md | 2 +- docs/contribute.md | 2 +- docs/filters.md | 4 +-- docs/formats-standards.md | 2 +- docs/img/link-solid.svg | 2 +- docs/implementations-options.md | 2 +- docs/implementations/org.progenetix.md | 28 +++++++++---------- docs/index.md | 4 +-- docs/other-implementations.md | 4 +-- docs/schemas-md/datasets_defaultSchema.md | 4 +-- docs/schemas-md/obj/externalUrl.md | 2 +- docs/schemas-md/obj/toolReferences.md | 2 +- docs/schemas-md/obj/variantAlternativeIds.md | 2 +- docs/variant-queries.md | 20 ++++++------- framework/json/endpoints.json | 2 +- .../beaconFilteringTermsResponse-example.json | 4 +-- .../beaconInfo-MAX-example.json | 4 +-- .../sections/beaconFilteringTermsResults.json | 4 +-- .../responses/sections/beaconInfoResults.json | 4 +-- framework/src/endpoints.yaml | 2 +- .../beaconFilteringTermsResponse-example.yaml | 4 +-- .../beaconInfo-MAX-example.yaml | 4 +-- .../sections/beaconFilteringTermsResults.yaml | 4 +-- .../responses/sections/beaconInfoResults.yaml | 4 +-- mkdocs.yaml | 2 +- .../analyses/endpoints.json | 2 +- .../biosamples/endpoints.json | 2 +- .../cohorts/endpoints.json | 2 +- .../datasets/defaultSchema.json | 2 +- .../datasets/endpoints.json | 2 +- .../examples/dataset-Max-example.json | 2 +- .../beacon-v2-default-model/endpoints.json | 2 +- .../genomicVariations/defaultSchema.json | 4 +-- .../genomicVariations/endpoints.json | 2 +- .../individuals/endpoints.json | 2 +- .../runs/endpoints.json | 2 +- .../analyses/endpoints.yaml | 2 +- .../biosamples/endpoints.yaml | 2 +- .../cohorts/endpoints.yaml | 2 +- .../datasets/defaultSchema.yaml | 2 +- .../datasets/endpoints.yaml | 2 +- .../examples/dataset-Max-example.yaml | 2 +- .../beacon-v2-default-model/endpoints.yaml | 2 +- .../genomicVariations/defaultSchema.yaml | 4 +-- .../genomicVariations/endpoints.yaml | 2 +- .../individuals/endpoints.yaml | 2 +- .../runs/endpoints.yaml | 2 +- 86 files changed, 189 insertions(+), 189 deletions(-) diff --git a/README.md b/README.md index f241c53a1..5da854bf5 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ This repository is a unified repository representing the different parts of the * [models](models) * Beacon v2 Documentation - authoritive source already in this repository [`/docs`](docs) - - rendered version through [here](https://beacon-project.io/beacon-v2/) (alternative address is [docs.genomebeacons.org](http://docs.genomebeacons.org)) + - rendered version through [here](https://beacon-project.io/beacon-v2/) (alternative address is [docs.genomebeacons.org](https://docs.genomebeacons.org)) As with other schema projects, here we separate between the schema source files (in `src`; JSON-Schema written in YAML) and the generated versions for referencing. The current setup allows already the direct referencing of the generated JSON schemas. Examples: @@ -30,7 +30,7 @@ There is a set of tools in [`/bin`](./bin/) to facilitate the conversion. ATM, a ### Changes -* change notes with respect to the repository & documentation are now in [docs.genomebeacons.org](http://docs.genomebeacons.org/bugs-changes-log/) +* change notes with respect to the repository & documentation are now in [docs.genomebeacons.org](https://docs.genomebeacons.org/bugs-changes-log/) * NOTE: on 2022-06-20 the previous development repositories have been archived: - ARCHIVE - [beacon-framework-v2](https://github.com/ga4gh-beacon/beacon-framework-v2) - ARCHIVE - [beacon-v2-Models](https://github.com/ga4gh-beacon/beacon-v2-Models) diff --git a/bin/SCHEMAS2MD.md b/bin/SCHEMAS2MD.md index 3a0b6e26a..cc7ff5b63 100644 --- a/bin/SCHEMAS2MD.md +++ b/bin/SCHEMAS2MD.md @@ -32,11 +32,11 @@ YAMLs schemas. Each time the original MS Word document was edited, someone had t This script inverts the process, i.e., **it enforces modifying the schema specification directly at the YAML/JSON level**. -Editing the schemas directly at the YAML/JSON level has two advantages, the first is that because we follow [OpenAPI](https://swagger.io/specification/) specification (along with JSON schema), _a priori_ we could use [SWAGGER UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/installation). The second is that the YAML/JSON files can be converted to Markdown tables in order to create [Markdown based documentation](http://docs.genomebeacons.org) documentation. This script **transforms YAML/JSON to Markdown tables**, including their nested objects **up to a third degree of hierarchy**. +Editing the schemas directly at the YAML/JSON level has two advantages, the first is that because we follow [OpenAPI](https://swagger.io/specification/) specification (along with JSON schema), _a priori_ we could use [SWAGGER UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/installation). The second is that the YAML/JSON files can be converted to Markdown tables in order to create [Markdown based documentation](https://docs.genomebeacons.org) documentation. This script **transforms YAML/JSON to Markdown tables**, including their nested objects **up to a third degree of hierarchy**. -The **Markdown** format can be directly rendered as tables at the GitHub repository, and it can be used with [MkDocs](https://www.mkdocs.org/) to create [HTML](http://docs.genomebeacons.org) documentation. +The **Markdown** format can be directly rendered as tables at the GitHub repository, and it can be used with [MkDocs](https://www.mkdocs.org/) to create [HTML](https://docs.genomebeacons.org) documentation. -Everytime a `git push` is performed to the [repo](https://github.com/ga4gh-beacon/beacon-v2) the documentation at [Github Pages](http://docs.genomebeacons.org) gets updated. Note that only content under directory `docs/` will make it to [Github Pages](http://docs.genomebeacons.org). +Everytime a `git push` is performed to the [repo](https://github.com/ga4gh-beacon/beacon-v2) the documentation at [Github Pages](https://docs.genomebeacons.org) gets updated. Note that only content under directory `docs/` will make it to [Github Pages](https://docs.genomebeacons.org). Before creating this tool, the author made an exhaustive search on what had been dveloped by the _community_ to automatically convert YAML/JSON to Markdown tables and found that there were many ways to go from YAML/JSON to HTML (e.g., CPAN, Python, Node.js), but not much from YAML/JSON to Markdown. Obviously, even in the case we had found something, some major tweaking will be needed in order to display things the way we want. diff --git a/bin/beacon_yaml2md.pl b/bin/beacon_yaml2md.pl index a74b1304d..9c8be4f38 100755 --- a/bin/beacon_yaml2md.pl +++ b/bin/beacon_yaml2md.pl @@ -582,7 +582,7 @@ sub create_str_yaml { description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep type: object EOF @@ -769,11 +769,11 @@ =head1 MOTIVATION This script inverts the process, i.e., B. -Editing the schemas directly at the YAML/JSON level has two advantages, the first is that because we follow L specification (along with JSON schema), I we could use L. The second is that the YAML/JSON files can be converted to Markdown tables in order to create L documentation. This script B, including their nested objects B. +Editing the schemas directly at the YAML/JSON level has two advantages, the first is that because we follow L specification (along with JSON schema), I we could use L. The second is that the YAML/JSON files can be converted to Markdown tables in order to create L documentation. This script B, including their nested objects B. -The B format can be directly rendered as tables at the GitHub repository, and it can be used with L to create L documentation. +The B format can be directly rendered as tables at the GitHub repository, and it can be used with L to create L documentation. -Everytime a C is performed to the L the documentation at L gets updated. Note that only content under directory C will make it to L. +Everytime a C is performed to the L the documentation at L gets updated. Note that only content under directory C will make it to L. Before creating this tool, the author made an exhaustive search on what had been dveloped by the I to automatically convert YAML/JSON to Markdown tables and found that there were many ways to go from YAML/JSON to HTML (e.g., CPAN, Python, Node.js), but not much from YAML/JSON to Markdown. Obviously, even in the case we had found something, some major tweaking will be needed in order to display things the way we want. diff --git a/bin/deref_schemas/datasets/defaultSchema.json b/bin/deref_schemas/datasets/defaultSchema.json index a5bfa0f22..75c3ff69c 100644 --- a/bin/deref_schemas/datasets/defaultSchema.json +++ b/bin/deref_schemas/datasets/defaultSchema.json @@ -247,7 +247,7 @@ "externalUrl": { "description": "URL to an external system providing more dataset information (RFC 3986 format).", "examples": [ - "http://example.org/wiki/Main_Page" + "https://example.org/wiki/Main_Page" ], "type": "string" }, diff --git a/bin/deref_schemas/datasets/defaultSchema.yaml b/bin/deref_schemas/datasets/defaultSchema.yaml index 2e72ed7ac..434a04245 100644 --- a/bin/deref_schemas/datasets/defaultSchema.yaml +++ b/bin/deref_schemas/datasets/defaultSchema.yaml @@ -165,7 +165,7 @@ properties: externalUrl: description: URL to an external system providing more dataset information (RFC 3986 format). examples: - - http://example.org/wiki/Main_Page + - https://example.org/wiki/Main_Page type: string id: description: Unique identifier of the dataset diff --git a/bin/deref_schemas/genomicVariations/defaultSchema.json b/bin/deref_schemas/genomicVariations/defaultSchema.json index aa5a2efc3..8bb046adb 100644 --- a/bin/deref_schemas/genomicVariations/defaultSchema.json +++ b/bin/deref_schemas/genomicVariations/defaultSchema.json @@ -98,7 +98,7 @@ "bio.toolsId": "https://bio.tools/vep" }, { - "url": "http://www.ensembl.org/vep" + "url": "https://www.ensembl.org/vep" } ], "minProperties": 1, @@ -295,7 +295,7 @@ "bio.toolsId": "https://bio.tools/vep" }, { - "url": "http://www.ensembl.org/vep" + "url": "https://www.ensembl.org/vep" } ], "minProperties": 1, @@ -706,7 +706,7 @@ { "id": "ClinGen:CA152954", "notes": "ClinGen Allele Registry id", - "reference": "http://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954" + "reference": "https://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954" }, { "id": "UniProtKB:P35557#VAR_003699", @@ -1563,7 +1563,7 @@ "bio.toolsId": "https://bio.tools/vep" }, { - "url": "http://www.ensembl.org/vep" + "url": "https://www.ensembl.org/vep" } ], "minProperties": 1, @@ -1766,7 +1766,7 @@ "bio.toolsId": "https://bio.tools/vep" }, { - "url": "http://www.ensembl.org/vep" + "url": "https://www.ensembl.org/vep" } ], "minProperties": 1, @@ -1811,7 +1811,7 @@ "bio.toolsId": "https://bio.tools/vep" }, { - "url": "http://www.ensembl.org/vep" + "url": "https://www.ensembl.org/vep" } ], "minProperties": 1, @@ -1994,7 +1994,7 @@ "bio.toolsId": "https://bio.tools/vep" }, { - "url": "http://www.ensembl.org/vep" + "url": "https://www.ensembl.org/vep" } ], "minProperties": 1, @@ -2259,7 +2259,7 @@ "bio.toolsId": "https://bio.tools/vep" }, { - "url": "http://www.ensembl.org/vep" + "url": "https://www.ensembl.org/vep" } ], "minProperties": 1, @@ -2456,7 +2456,7 @@ "bio.toolsId": "https://bio.tools/vep" }, { - "url": "http://www.ensembl.org/vep" + "url": "https://www.ensembl.org/vep" } ], "minProperties": 1, @@ -2797,7 +2797,7 @@ { "id": "ClinGen:CA152954", "notes": "ClinGen Allele Registry id", - "reference": "http://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954" + "reference": "https://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954" }, { "id": "UniProtKB:P35557#VAR_003699", @@ -3022,7 +3022,7 @@ "bio.toolsId": "https://bio.tools/vep" }, { - "url": "http://www.ensembl.org/vep" + "url": "https://www.ensembl.org/vep" } ], "minProperties": 1, @@ -3205,7 +3205,7 @@ "bio.toolsId": "https://bio.tools/vep" }, { - "url": "http://www.ensembl.org/vep" + "url": "https://www.ensembl.org/vep" } ], "minProperties": 1, diff --git a/bin/deref_schemas/genomicVariations/defaultSchema.yaml b/bin/deref_schemas/genomicVariations/defaultSchema.yaml index 6d547714c..2894f3ca3 100644 --- a/bin/deref_schemas/genomicVariations/defaultSchema.yaml +++ b/bin/deref_schemas/genomicVariations/defaultSchema.yaml @@ -68,7 +68,7 @@ definitions: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object @@ -207,7 +207,7 @@ definitions: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object @@ -497,7 +497,7 @@ definitions: reference: https://www.ncbi.nlm.nih.gov/snp/rs587780345 - id: ClinGen:CA152954 notes: ClinGen Allele Registry id - reference: http://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954 + reference: https://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954 - id: UniProtKB:P35557#VAR_003699 reference: https://www.uniprot.org/uniprot/P35557#VAR_003699 - @@ -1116,7 +1116,7 @@ definitions: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object @@ -1259,7 +1259,7 @@ definitions: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object @@ -1291,7 +1291,7 @@ definitions: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object @@ -1420,7 +1420,7 @@ definitions: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object @@ -1603,7 +1603,7 @@ properties: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object @@ -1742,7 +1742,7 @@ properties: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object @@ -1981,7 +1981,7 @@ properties: reference: https://www.ncbi.nlm.nih.gov/snp/rs587780345 - id: ClinGen:CA152954 notes: ClinGen Allele Registry id - reference: http://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954 + reference: https://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954 - id: UniProtKB:P35557#VAR_003699 reference: https://www.uniprot.org/uniprot/P35557#VAR_003699 - @@ -2138,7 +2138,7 @@ properties: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object @@ -2267,7 +2267,7 @@ properties: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object diff --git a/bin/deref_schemas/obj/annotatedWith.yaml b/bin/deref_schemas/obj/annotatedWith.yaml index 40b7fbb33..73c8be567 100644 --- a/bin/deref_schemas/obj/annotatedWith.yaml +++ b/bin/deref_schemas/obj/annotatedWith.yaml @@ -11,7 +11,7 @@ annotatedWith: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object diff --git a/bin/deref_schemas/obj/caseLevelData.yaml b/bin/deref_schemas/obj/caseLevelData.yaml index 60147e334..ba468d27f 100644 --- a/bin/deref_schemas/obj/caseLevelData.yaml +++ b/bin/deref_schemas/obj/caseLevelData.yaml @@ -74,7 +74,7 @@ caseLevelData: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object @@ -230,7 +230,7 @@ caseLevelData: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object diff --git a/bin/deref_schemas/obj/clinicalInterpretations.yaml b/bin/deref_schemas/obj/clinicalInterpretations.yaml index 2e1fdd018..d7395d752 100644 --- a/bin/deref_schemas/obj/clinicalInterpretations.yaml +++ b/bin/deref_schemas/obj/clinicalInterpretations.yaml @@ -15,7 +15,7 @@ clinicalInterpretations: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object diff --git a/bin/deref_schemas/obj/externalUrl.yaml b/bin/deref_schemas/obj/externalUrl.yaml index 672bc1884..ff6ec38a7 100644 --- a/bin/deref_schemas/obj/externalUrl.yaml +++ b/bin/deref_schemas/obj/externalUrl.yaml @@ -3,5 +3,5 @@ externalUrl: description: URL to an external system providing more dataset information (RFC 3986 format). examples: - - http://example.org/wiki/Main_Page + - https://example.org/wiki/Main_Page type: string diff --git a/bin/deref_schemas/obj/identifiers.yaml b/bin/deref_schemas/obj/identifiers.yaml index 2757dca76..dfb5df8ea 100644 --- a/bin/deref_schemas/obj/identifiers.yaml +++ b/bin/deref_schemas/obj/identifiers.yaml @@ -39,7 +39,7 @@ identifiers: reference: https://www.ncbi.nlm.nih.gov/snp/rs587780345 - id: ClinGen:CA152954 notes: ClinGen Allele Registry id - reference: http://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954 + reference: https://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954 - id: UniProtKB:P35557#VAR_003699 reference: https://www.uniprot.org/uniprot/P35557#VAR_003699 - - id: OMIM:164757.0001 diff --git a/bin/deref_schemas/obj/phenotypicEffects.yaml b/bin/deref_schemas/obj/phenotypicEffects.yaml index 9c0888aca..ceaca8a06 100644 --- a/bin/deref_schemas/obj/phenotypicEffects.yaml +++ b/bin/deref_schemas/obj/phenotypicEffects.yaml @@ -15,7 +15,7 @@ phenotypicEffects: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object diff --git a/bin/deref_schemas/obj/toolReferences.yaml b/bin/deref_schemas/obj/toolReferences.yaml index 6cb1dee0a..f306ed961 100644 --- a/bin/deref_schemas/obj/toolReferences.yaml +++ b/bin/deref_schemas/obj/toolReferences.yaml @@ -3,5 +3,5 @@ toolReferences: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep type: object diff --git a/bin/deref_schemas/obj/variantAlternativeIds.yaml b/bin/deref_schemas/obj/variantAlternativeIds.yaml index dfb82d238..96d27dfcb 100644 --- a/bin/deref_schemas/obj/variantAlternativeIds.yaml +++ b/bin/deref_schemas/obj/variantAlternativeIds.yaml @@ -8,7 +8,7 @@ variantAlternativeIds: reference: https://www.ncbi.nlm.nih.gov/snp/rs587780345 - id: ClinGen:CA152954 notes: ClinGen Allele Registry id - reference: http://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954 + reference: https://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954 - id: UniProtKB:P35557#VAR_003699 reference: https://www.uniprot.org/uniprot/P35557#VAR_003699 - - id: OMIM:164757.0001 diff --git a/bin/deref_schemas/obj/variantLevelData.yaml b/bin/deref_schemas/obj/variantLevelData.yaml index afd50a5d0..e49c2ced0 100644 --- a/bin/deref_schemas/obj/variantLevelData.yaml +++ b/bin/deref_schemas/obj/variantLevelData.yaml @@ -17,7 +17,7 @@ variantLevelData: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object @@ -161,7 +161,7 @@ variantLevelData: description: References to the tool examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 properties: {} type: object diff --git a/bin/node_modules/@apidevtools/json-schema-ref-parser/CHANGELOG.md b/bin/node_modules/@apidevtools/json-schema-ref-parser/CHANGELOG.md index 92be3374d..9d9737d54 100644 --- a/bin/node_modules/@apidevtools/json-schema-ref-parser/CHANGELOG.md +++ b/bin/node_modules/@apidevtools/json-schema-ref-parser/CHANGELOG.md @@ -47,7 +47,7 @@ See [GitHub Releases](https://github.com/APIDevTools/json-schema-ref-parser/rele - Updated all code to ES6+ syntax (async/await, template literals, arrow functions, etc.) -- No longer including a pre-built bundle in the package. such as [Webpack](https://webpack.js.org/), [Rollup](https://rollupjs.org/), [Parcel](https://parceljs.org/), or [Browserify](http://browserify.org/) to include JSON Schema $Ref Parser in your app +- No longer including a pre-built bundle in the package. such as [Webpack](https://webpack.js.org/), [Rollup](https://rollupjs.org/), [Parcel](https://parceljs.org/), or [Browserify](https://browserify.org/) to include JSON Schema $Ref Parser in your app [Full Changelog](https://github.com/APIDevTools/json-schema-ref-parser/compare/v6.1.0...v7.0.0) @@ -121,7 +121,7 @@ This release contains two bug fixes related to file paths. They are _technicall - [PR #30](https://github.com/APIDevTools/json-schema-ref-parser/pull/30) - Added a `browser` field to the `package.json` file to support bundlers such as Browserify, Rollup, and Webpack -- [PR #45](https://github.com/APIDevTools/json-schema-ref-parser/pull/45) - Implemented a temporary workaround for [issue #42](https://github.com/APIDevTools/json-schema-ref-parser/issues/42). JSON Schema $Ref Parser does _not_ currently support [named internal references](http://json-schema.org/latest/json-schema-core.html#id-keyword), but support will be added in the next major release. +- [PR #45](https://github.com/APIDevTools/json-schema-ref-parser/pull/45) - Implemented a temporary workaround for [issue #42](https://github.com/APIDevTools/json-schema-ref-parser/issues/42). JSON Schema $Ref Parser does _not_ currently support [named internal references](https://json-schema.org/latest/json-schema-core.html#id-keyword), but support will be added in the next major release. [Full Changelog](https://github.com/APIDevTools/json-schema-ref-parser/compare/v3.0.0...v3.3.0) @@ -174,7 +174,7 @@ There are a few [new options](https://github.com/APIDevTools/json-schema-ref-par Bumping the major version number because [this change](https://github.com/APIDevTools/json-schema-ref-parser/pull/5) technically breaks backward-compatibility — although I doubt it will actually affect many people. Basically, if you're using JSON Schema $Ref Parser to download files from a CORS-enabled server that requires authentication, then you'll need to set the `http.withCredentials` option to `true`. ```javascript -$RefParser.dereference('http://some.server.com/file.json', { +$RefParser.dereference('https://some.server.com/file.json', { http: { withCredentials: true } }); ``` diff --git a/bin/node_modules/@apidevtools/json-schema-ref-parser/README.md b/bin/node_modules/@apidevtools/json-schema-ref-parser/README.md index d090bc761..92b185c3e 100644 --- a/bin/node_modules/@apidevtools/json-schema-ref-parser/README.md +++ b/bin/node_modules/@apidevtools/json-schema-ref-parser/README.md @@ -31,7 +31,7 @@ You've got a JSON Schema with `$ref` pointers to other files and/or URLs. Maybe }, "thing": { // references a URL - "$ref": "http://wayne-enterprises.com/things/batmobile" + "$ref": "https://wayne-enterprises.com/things/batmobile" }, "color": { // references a value in an external file via an internal reference @@ -44,7 +44,7 @@ You've got a JSON Schema with `$ref` pointers to other files and/or URLs. Maybe The Solution: -------------------------- -JSON Schema $Ref Parser is a full [JSON Reference](https://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03) and [JSON Pointer](https://tools.ietf.org/html/rfc6901) implementation that crawls even the most complex [JSON Schemas](http://json-schema.org/latest/json-schema-core.html) and gives you simple, straightforward JavaScript objects. +JSON Schema $Ref Parser is a full [JSON Reference](https://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03) and [JSON Pointer](https://tools.ietf.org/html/rfc6901) implementation that crawls even the most complex [JSON Schemas](https://json-schema.org/latest/json-schema-core.html) and gives you simple, straightforward JavaScript objects. - Use **JSON** or **YAML** schemas — or even a mix of both! - Supports `$ref` pointers to external files and URLs, as well as [custom sources](https://apitools.dev/json-schema-ref-parser/docs/plugins/resolvers.html) such as databases @@ -117,7 +117,7 @@ Browser support -------------------------- JSON Schema $Ref Parser supports recent versions of every major web browser. Older browsers may require [Babel](https://babeljs.io/) and/or [polyfills](https://babeljs.io/docs/en/next/babel-polyfill). -To use JSON Schema $Ref Parser in a browser, you'll need to use a bundling tool such as [Webpack](https://webpack.js.org/), [Rollup](https://rollupjs.org/), [Parcel](https://parceljs.org/), or [Browserify](http://browserify.org/). Some bundlers may require a bit of configuration, such as setting `browser: true` in [rollup-plugin-resolve](https://github.com/rollup/rollup-plugin-node-resolve). +To use JSON Schema $Ref Parser in a browser, you'll need to use a bundling tool such as [Webpack](https://webpack.js.org/), [Rollup](https://rollupjs.org/), [Parcel](https://parceljs.org/), or [Browserify](https://browserify.org/). Some bundlers may require a bit of configuration, such as setting `browser: true` in [rollup-plugin-resolve](https://github.com/rollup/rollup-plugin-node-resolve). @@ -149,7 +149,7 @@ License -------------------------- JSON Schema $Ref Parser is 100% free and open-source, under the [MIT license](LICENSE). Use it however you want. -This package is [Treeware](http://treeware.earth). If you use it in production, then we ask that you [**buy the world a tree**](https://plant.treeware.earth/APIDevTools/json-schema-ref-parser) to thank us for our work. By contributing to the Treeware forest you’ll be creating employment for local families and restoring wildlife habitats. +This package is [Treeware](https://treeware.earth). If you use it in production, then we ask that you [**buy the world a tree**](https://plant.treeware.earth/APIDevTools/json-schema-ref-parser) to thank us for our work. By contributing to the Treeware forest you’ll be creating employment for local families and restoring wildlife habitats. diff --git a/bin/node_modules/@jsdevtools/ono/CHANGELOG.md b/bin/node_modules/@jsdevtools/ono/CHANGELOG.md index cb7b82021..7b5cab520 100644 --- a/bin/node_modules/@jsdevtools/ono/CHANGELOG.md +++ b/bin/node_modules/@jsdevtools/ono/CHANGELOG.md @@ -1,7 +1,7 @@ Change Log ======================================= All notable changes will be documented in this file. -`ono` adheres to [Semantic Versioning](http://semver.org/). +`ono` adheres to [Semantic Versioning](https://semver.org/). diff --git a/bin/node_modules/@jsdevtools/ono/README.md b/bin/node_modules/@jsdevtools/ono/README.md index db6baa502..5459a84ed 100644 --- a/bin/node_modules/@jsdevtools/ono/README.md +++ b/bin/node_modules/@jsdevtools/ono/README.md @@ -95,7 +95,7 @@ Browser support -------------------------- Ono supports recent versions of every major web browser. Older browsers may require [Babel](https://babeljs.io/) and/or [polyfills](https://babeljs.io/docs/en/next/babel-polyfill). -To use Ono in a browser, you'll need to use a bundling tool such as [Webpack](https://webpack.js.org/), [Rollup](https://rollupjs.org/), [Parcel](https://parceljs.org/), or [Browserify](http://browserify.org/). Some bundlers may require a bit of configuration, such as setting `browser: true` in [rollup-plugin-resolve](https://github.com/rollup/rollup-plugin-node-resolve). +To use Ono in a browser, you'll need to use a bundling tool such as [Webpack](https://webpack.js.org/), [Rollup](https://rollupjs.org/), [Parcel](https://parceljs.org/), or [Browserify](https://browserify.org/). Some bundlers may require a bit of configuration, such as setting `browser: true` in [rollup-plugin-resolve](https://github.com/rollup/rollup-plugin-node-resolve). @@ -379,7 +379,7 @@ License -------------------------- Ono is 100% free and open-source, under the [MIT license](LICENSE). Use it however you want. -This package is [Treeware](http://treeware.earth). If you use it in production, then we ask that you [**buy the world a tree**](https://plant.treeware.earth/JS-DevTools/ono) to thank us for our work. By contributing to the Treeware forest you’ll be creating employment for local families and restoring wildlife habitats. +This package is [Treeware](https://treeware.earth). If you use it in production, then we ask that you [**buy the world a tree**](https://plant.treeware.earth/JS-DevTools/ono) to thank us for our work. By contributing to the Treeware forest you’ll be creating employment for local families and restoring wildlife habitats. diff --git a/bin/node_modules/@types/json-schema/index.d.ts b/bin/node_modules/@types/json-schema/index.d.ts index 7a92decd8..fc06be8a7 100755 --- a/bin/node_modules/@types/json-schema/index.d.ts +++ b/bin/node_modules/@types/json-schema/index.d.ts @@ -48,12 +48,12 @@ export interface JSONSchema4Array extends Array {} * Meta schema * * Recommended values: - * - 'http://json-schema.org/schema#' - * - 'http://json-schema.org/hyper-schema#' - * - 'http://json-schema.org/draft-04/schema#' - * - 'http://json-schema.org/draft-04/hyper-schema#' - * - 'http://json-schema.org/draft-03/schema#' - * - 'http://json-schema.org/draft-03/hyper-schema#' + * - 'https://json-schema.org/schema#' + * - 'https://json-schema.org/hyper-schema#' + * - 'https://json-schema.org/draft-04/schema#' + * - 'https://json-schema.org/draft-04/hyper-schema#' + * - 'https://json-schema.org/draft-03/schema#' + * - 'https://json-schema.org/draft-03/hyper-schema#' * * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-5 */ @@ -275,10 +275,10 @@ export interface JSONSchema6Array extends Array {} * Meta schema * * Recommended values: - * - 'http://json-schema.org/schema#' - * - 'http://json-schema.org/hyper-schema#' - * - 'http://json-schema.org/draft-06/schema#' - * - 'http://json-schema.org/draft-06/hyper-schema#' + * - 'https://json-schema.org/schema#' + * - 'https://json-schema.org/hyper-schema#' + * - 'https://json-schema.org/draft-06/schema#' + * - 'https://json-schema.org/draft-06/hyper-schema#' * * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-5 */ @@ -600,10 +600,10 @@ export interface JSONSchema7Array extends Array {} * Meta schema * * Recommended values: - * - 'http://json-schema.org/schema#' - * - 'http://json-schema.org/hyper-schema#' - * - 'http://json-schema.org/draft-07/schema#' - * - 'http://json-schema.org/draft-07/hyper-schema#' + * - 'https://json-schema.org/schema#' + * - 'https://json-schema.org/hyper-schema#' + * - 'https://json-schema.org/draft-07/schema#' + * - 'https://json-schema.org/draft-07/hyper-schema#' * * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-5 */ diff --git a/bin/node_modules/argparse/CHANGELOG.md b/bin/node_modules/argparse/CHANGELOG.md index dc39ed695..de8a8b1a0 100644 --- a/bin/node_modules/argparse/CHANGELOG.md +++ b/bin/node_modules/argparse/CHANGELOG.md @@ -115,7 +115,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.1.10] - 2012-12-30 ### Added -- Added [mutual exclusion](http://docs.python.org/dev/library/argparse.html#mutual-exclusion) +- Added [mutual exclusion](https://docs.python.org/dev/library/argparse.html#mutual-exclusion) support, thanks to @hpaulj ### Fixed diff --git a/bin/node_modules/argparse/LICENSE b/bin/node_modules/argparse/LICENSE index 66a3ac80d..4e5fadfcb 100644 --- a/bin/node_modules/argparse/LICENSE +++ b/bin/node_modules/argparse/LICENSE @@ -2,12 +2,12 @@ A. HISTORY OF THE SOFTWARE ========================== Python was created in the early 1990s by Guido van Rossum at Stichting -Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands +Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands as a successor of a language called ABC. Guido remains Python's principal author, although it includes many contributions from others. In 1995, Guido continued his work on Python at the Corporation for -National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) +National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) in Reston, Virginia where he released several versions of the software. @@ -19,7 +19,7 @@ https://www.python.org/psf/) was formed, a non-profit organization created specifically to own Python-related Intellectual Property. Zope Corporation was a sponsoring member of the PSF. -All Python releases are Open Source (see http://www.opensource.org for +All Python releases are Open Source (see https://www.opensource.org for the Open Source Definition). Historically, most, but not all, Python releases have also been GPL-compatible; the table below summarizes the various releases. @@ -151,7 +151,7 @@ between BeOpen and Licensee. This License Agreement does not grant permission to use BeOpen trademarks or trade names in a trademark sense to endorse or promote products or services of Licensee, or any third party. As an exception, the "BeOpen Python" logos available at -http://www.pythonlabs.com/logos.html may be used according to the +https://www.pythonlabs.com/logos.html may be used according to the permissions granted on that web page. 7. By copying, installing or otherwise using the software, Licensee @@ -183,7 +183,7 @@ conditions in CNRI's License Agreement. This Agreement together with Python 1.6.1 may be located on the Internet using the following unique, persistent identifier (known as a handle): 1895.22/1013. This Agreement may also be obtained from a proxy server on the Internet -using the following URL: http://hdl.handle.net/1895.22/1013". +using the following URL: https://hdl.handle.net/1895.22/1013". 3. In the event Licensee prepares a derivative work that is based on or incorporates Python 1.6.1 or any part thereof, and wants to make diff --git a/bin/node_modules/argparse/README.md b/bin/node_modules/argparse/README.md index 550b5c9b7..69d48b563 100644 --- a/bin/node_modules/argparse/README.md +++ b/bin/node_modules/argparse/README.md @@ -1,10 +1,10 @@ argparse ======== -[![Build Status](https://secure.travis-ci.org/nodeca/argparse.svg?branch=master)](http://travis-ci.org/nodeca/argparse) +[![Build Status](https://secure.travis-ci.org/nodeca/argparse.svg?branch=master)](https://travis-ci.org/nodeca/argparse) [![NPM version](https://img.shields.io/npm/v/argparse.svg)](https://www.npmjs.org/package/argparse) -CLI arguments parser for node.js, with [sub-commands](https://docs.python.org/3.9/library/argparse.html#sub-commands) support. Port of python's [argparse](http://docs.python.org/dev/library/argparse.html) (version [3.9.0](https://github.com/python/cpython/blob/v3.9.0rc1/Lib/argparse.py)). +CLI arguments parser for node.js, with [sub-commands](https://docs.python.org/3.9/library/argparse.html#sub-commands) support. Port of python's [argparse](https://docs.python.org/dev/library/argparse.html) (version [3.9.0](https://github.com/python/cpython/blob/v3.9.0rc1/Lib/argparse.py)). **Difference with original.** diff --git a/bin/node_modules/call-me-maybe/.npmignore b/bin/node_modules/call-me-maybe/.npmignore index 123ae94d0..2b621e92e 100644 --- a/bin/node_modules/call-me-maybe/.npmignore +++ b/bin/node_modules/call-me-maybe/.npmignore @@ -13,13 +13,13 @@ lib-cov # Coverage directory used by tools like istanbul coverage -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) .grunt # node-waf configuration .lock-wscript -# Compiled binary addons (http://nodejs.org/api/addons.html) +# Compiled binary addons (https://nodejs.org/api/addons.html) build/Release # Dependency directory diff --git a/bin/node_modules/call-me-maybe/package.json b/bin/node_modules/call-me-maybe/package.json index 02dc93253..22f8edb2a 100644 --- a/bin/node_modules/call-me-maybe/package.json +++ b/bin/node_modules/call-me-maybe/package.json @@ -23,7 +23,7 @@ "promisify", "carlyraejepsen" ], - "author": "Eric McCarthy (http://www.limulus.net/)", + "author": "Eric McCarthy (https://www.limulus.net/)", "license": "MIT", "bugs": { "url": "https://github.com/limulus/call-me-maybe/issues" diff --git a/bin/node_modules/js-yaml/README.md b/bin/node_modules/js-yaml/README.md index 3cbc4bd2d..a6dd9423a 100644 --- a/bin/node_modules/js-yaml/README.md +++ b/bin/node_modules/js-yaml/README.md @@ -4,11 +4,11 @@ JS-YAML - YAML 1.2 parser / writer for JavaScript [![CI](https://github.com/nodeca/js-yaml/workflows/CI/badge.svg?branch=master)](https://github.com/nodeca/js-yaml/actions) [![NPM version](https://img.shields.io/npm/v/js-yaml.svg)](https://www.npmjs.org/package/js-yaml) -__[Online Demo](http://nodeca.github.com/js-yaml/)__ +__[Online Demo](https://nodeca.github.com/js-yaml/)__ -This is an implementation of [YAML](http://yaml.org/), a human-friendly data -serialization language. Started as [PyYAML](http://pyyaml.org/) port, it was +This is an implementation of [YAML](https://yaml.org/), a human-friendly data +serialization language. Started as [PyYAML](https://pyyaml.org/) port, it was completely rewritten from scratch. Now it's very fast, and supports 1.2 spec. @@ -81,11 +81,11 @@ options: Loader will call this function with an instance of `YAMLException` for each warning. - `schema` _(default: `DEFAULT_SCHEMA`)_ - specifies a schema to use. - `FAILSAFE_SCHEMA` - only strings, arrays and plain objects: - http://www.yaml.org/spec/1.2/spec.html#id2802346 + https://www.yaml.org/spec/1.2/spec.html#id2802346 - `JSON_SCHEMA` - all JSON-supported types: - http://www.yaml.org/spec/1.2/spec.html#id2803231 + https://www.yaml.org/spec/1.2/spec.html#id2803231 - `CORE_SCHEMA` - same as `JSON_SCHEMA`: - http://www.yaml.org/spec/1.2/spec.html#id2804923 + https://www.yaml.org/spec/1.2/spec.html#id2804923 - `DEFAULT_SCHEMA` - all supported YAML types. - `json` _(default: false)_ - compatibility with JSON.parse behaviour. If true, then duplicate keys in a mapping will override values rather than throwing an error. @@ -182,8 +182,8 @@ Supported YAML types -------------------- The list of standard YAML tags and corresponding JavaScript types. See also -[YAML tag discussion](http://pyyaml.org/wiki/YAMLTagDiscussion) and -[YAML types repository](http://yaml.org/type/). +[YAML tag discussion](https://pyyaml.org/wiki/YAMLTagDiscussion) and +[YAML types repository](https://yaml.org/type/). ``` !!null '' # null diff --git a/bin/node_modules/js-yaml/dist/js-yaml.js b/bin/node_modules/js-yaml/dist/js-yaml.js index 4cc0ddf6d..e78fee98c 100644 --- a/bin/node_modules/js-yaml/dist/js-yaml.js +++ b/bin/node_modules/js-yaml/dist/js-yaml.js @@ -72,7 +72,7 @@ extend: extend_1 }; - // YAML error class. http://stackoverflow.com/questions/8458984 + // YAML error class. https://stackoverflow.com/questions/8458984 function formatError(exception, compact) { @@ -2564,7 +2564,7 @@ } } else if (indentStatus === 0) { // Special case: block sequences are allowed to have same indentation level as the parent. - // http://www.yaml.org/spec/1.2/spec.html#id2799784 + // https://www.yaml.org/spec/1.2/spec.html#id2799784 hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); } } diff --git a/bin/node_modules/js-yaml/dist/js-yaml.mjs b/bin/node_modules/js-yaml/dist/js-yaml.mjs index be71cad18..477cfb6b9 100644 --- a/bin/node_modules/js-yaml/dist/js-yaml.mjs +++ b/bin/node_modules/js-yaml/dist/js-yaml.mjs @@ -66,7 +66,7 @@ var common = { extend: extend_1 }; -// YAML error class. http://stackoverflow.com/questions/8458984 +// YAML error class. https://stackoverflow.com/questions/8458984 function formatError(exception, compact) { @@ -2558,7 +2558,7 @@ function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact } } else if (indentStatus === 0) { // Special case: block sequences are allowed to have same indentation level as the parent. - // http://www.yaml.org/spec/1.2/spec.html#id2799784 + // https://www.yaml.org/spec/1.2/spec.html#id2799784 hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); } } diff --git a/bin/node_modules/js-yaml/lib/exception.js b/bin/node_modules/js-yaml/lib/exception.js index 7f62daaef..a96489791 100644 --- a/bin/node_modules/js-yaml/lib/exception.js +++ b/bin/node_modules/js-yaml/lib/exception.js @@ -1,4 +1,4 @@ -// YAML error class. http://stackoverflow.com/questions/8458984 +// YAML error class. https://stackoverflow.com/questions/8458984 // 'use strict'; diff --git a/bin/node_modules/js-yaml/lib/loader.js b/bin/node_modules/js-yaml/lib/loader.js index 39f13f561..7f5c33f2c 100644 --- a/bin/node_modules/js-yaml/lib/loader.js +++ b/bin/node_modules/js-yaml/lib/loader.js @@ -1468,7 +1468,7 @@ function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact } } else if (indentStatus === 0) { // Special case: block sequences are allowed to have same indentation level as the parent. - // http://www.yaml.org/spec/1.2/spec.html#id2799784 + // https://www.yaml.org/spec/1.2/spec.html#id2799784 hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); } } diff --git a/bin/node_modules/js-yaml/lib/schema/core.js b/bin/node_modules/js-yaml/lib/schema/core.js index 608b26de2..81c11b1a1 100644 --- a/bin/node_modules/js-yaml/lib/schema/core.js +++ b/bin/node_modules/js-yaml/lib/schema/core.js @@ -1,5 +1,5 @@ // Standard YAML's Core schema. -// http://www.yaml.org/spec/1.2/spec.html#id2804923 +// https://www.yaml.org/spec/1.2/spec.html#id2804923 // // NOTE: JS-YAML does not support schema-specific tag resolution restrictions. // So, Core schema has no distinctions from JSON schema is JS-YAML. diff --git a/bin/node_modules/js-yaml/lib/schema/default.js b/bin/node_modules/js-yaml/lib/schema/default.js index 3af0520d5..8cb0a6a04 100644 --- a/bin/node_modules/js-yaml/lib/schema/default.js +++ b/bin/node_modules/js-yaml/lib/schema/default.js @@ -2,7 +2,7 @@ // It is not described in the YAML specification. // // This schema is based on standard YAML's Core schema and includes most of -// extra types described at YAML tag repository. (http://yaml.org/type/) +// extra types described at YAML tag repository. (https://yaml.org/type/) 'use strict'; diff --git a/bin/node_modules/js-yaml/lib/schema/failsafe.js b/bin/node_modules/js-yaml/lib/schema/failsafe.js index b7a33eb7a..4bb2832d5 100644 --- a/bin/node_modules/js-yaml/lib/schema/failsafe.js +++ b/bin/node_modules/js-yaml/lib/schema/failsafe.js @@ -1,5 +1,5 @@ // Standard YAML's Failsafe schema. -// http://www.yaml.org/spec/1.2/spec.html#id2802346 +// https://www.yaml.org/spec/1.2/spec.html#id2802346 'use strict'; diff --git a/bin/node_modules/js-yaml/lib/schema/json.js b/bin/node_modules/js-yaml/lib/schema/json.js index b73df78e5..1e9e20b9b 100644 --- a/bin/node_modules/js-yaml/lib/schema/json.js +++ b/bin/node_modules/js-yaml/lib/schema/json.js @@ -1,5 +1,5 @@ // Standard YAML's JSON schema. -// http://www.yaml.org/spec/1.2/spec.html#id2803231 +// https://www.yaml.org/spec/1.2/spec.html#id2803231 // // NOTE: JS-YAML does not support schema-specific tag resolution restrictions. // So, this schema is not such strict as defined in the YAML specification. diff --git a/bin/node_modules/js-yaml/package.json b/bin/node_modules/js-yaml/package.json index 17574da80..77fe03b03 100644 --- a/bin/node_modules/js-yaml/package.json +++ b/bin/node_modules/js-yaml/package.json @@ -10,9 +10,9 @@ ], "author": "Vladimir Zapparov ", "contributors": [ - "Aleksey V Zapparov (http://www.ixti.net/)", + "Aleksey V Zapparov (https://www.ixti.net/)", "Vitaly Puzrin (https://github.com/puzrin)", - "Martin Grenfell (http://got-ravings.blogspot.com)" + "Martin Grenfell (https://got-ravings.blogspot.com)" ], "license": "MIT", "repository": "nodeca/js-yaml", diff --git a/docs/FAQ.md b/docs/FAQ.md index f0dfb2704..262c2e81b 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -93,10 +93,10 @@ sequence at this position (necessary e.g. for small deletions). Beacon v1.1 in principle supported "bracketed" queries and a `variantType` parameter - (pointing to the VCF use) - see the [current documentation](http://docs.genomebeacons.org/variant-queries/#beacon-bracket-queries) for details. However, the support & interpretation was - and still is (2022-12-13) - - left to implementers. Similar for [Beacon Range Queries](http://docs.genomebeacons.org/variant-queries/#beacon-range-queries). + (pointing to the VCF use) - see the [current documentation](https://docs.genomebeacons.org/variant-queries/#beacon-bracket-queries) for details. However, the support & interpretation was - and still is (2022-12-13) - + left to implementers. Similar for [Beacon Range Queries](https://docs.genomebeacons.org/variant-queries/#beacon-range-queries). - However, the [Beacon documentation](http://docs.genomebeacons.org/variant-queries/#varianttype-parameter-interpretation) + However, the [Beacon documentation](https://docs.genomebeacons.org/variant-queries/#varianttype-parameter-interpretation) provides information about use and expected interpretation of `variantType` values, specifically for copy number variations. diff --git a/docs/README.md b/docs/README.md index 439889757..4f67a91b4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,2 +1,2 @@ This directory contains the Beacon documentation. The files here are rendered through -MkDocs and available at [beacon-project.io/beacon-v2/](http://beacon-project.io/beacon-v2/). \ No newline at end of file +MkDocs and available at [beacon-project.io/beacon-v2/](https://beacon-project.io/beacon-v2/). \ No newline at end of file diff --git a/docs/bugs-changes-log.md b/docs/bugs-changes-log.md index f26870b1e..a76499252 100644 --- a/docs/bugs-changes-log.md +++ b/docs/bugs-changes-log.md @@ -112,7 +112,7 @@ The `mkdocs-macros-plugin` has been activated, allowing the use of site-wide var As of today the new/emerging Beacon v2 documentation is meintained in this repository. We're testing rendered versions (same text/code base) through Github actions ([here](https://beacon-project.io/beacon-v2/)) and [ReadTheDocs](https://beacon-v2-unity.readthedocs.io/en/latest/). * [x] testing of [ReadTheDocs version](https://beacon-v2-unity.readthedocs.io/) vs. a [`material` themed build](https://beacon-project.io/beacon-v2/) -* [x] created and linked [docs.genomebeacons.org](http://docs.genomebeacons.org) +* [x] created and linked [docs.genomebeacons.org](https://docs.genomebeacons.org) sub-domain to the Github hosted version of the rendered documentation * [x] merging of previous separate documentation repository content from _beacon-v2-schema-documentation_ in the "unity" repository and archiving of the old one diff --git a/docs/code-organization.md b/docs/code-organization.md index c8fcbf921..4c7769ac6 100644 --- a/docs/code-organization.md +++ b/docs/code-organization.md @@ -14,7 +14,7 @@ The `develop` branch is the branch used for development, it reflects the current ### `website-docs` -This branch is used to maintain the website at . The relevant files consists of anything under `/docs` as well as the configuration file (`/mkdocs.yaml`) and the workflow file for processing the pages under `/.github/workflows/mk-beacon-docs.yaml`. +This branch is used to maintain the website at . The relevant files consists of anything under `/docs` as well as the configuration file (`/mkdocs.yaml`) and the workflow file for processing the pages under `/.github/workflows/mk-beacon-docs.yaml`. Changes to the Markdown files in the `/docs` directory (and its children) will initiate the processing of the workflow file; updating of the website than may take some minutes. diff --git a/docs/contribute.md b/docs/contribute.md index 17f925f50..0a1d5f979 100644 --- a/docs/contribute.md +++ b/docs/contribute.md @@ -1,7 +1,7 @@ # How to Contribute to Beacon Development The Beacon API & standard is a driver project of the Global Alliance for Genomics -and Health [**GA4GH**](http://ga4gh.org). Since 2016 Beacon development has been +and Health [**GA4GH**](https://ga4gh.org). Since 2016 Beacon development has been organized through projects supported by ELIXIR with additional contributions from outside organizations and individual developers and implementers. diff --git a/docs/filters.md b/docs/filters.md index ff311db4f..abb782242 100644 --- a/docs/filters.md +++ b/docs/filters.md @@ -42,10 +42,10 @@ Bio-ontology and custom term Filter types contain: { "id":"hp", "name":"Human Phenotype Ontology", - "url":"http://purl.obolibrary.org/obo/hp.owl", + "url":"https://purl.obolibrary.org/obo/hp.owl", "version":"27-03-2020", "namespacePrefix":"HP", - "iriPrefix":"http://purl.obolibrary.org/obo/HP_" + "iriPrefix":"https://purl.obolibrary.org/obo/HP_" }, ... ], diff --git a/docs/formats-standards.md b/docs/formats-standards.md index 7798ac0f1..d2da97509 100644 --- a/docs/formats-standards.md +++ b/docs/formats-standards.md @@ -376,5 +376,5 @@ Beacon directly uses the (IMO preferable) [representation through an ontology te ##### LINK: [Phenopackets Documentation](https://phenopacket-schema.readthedocs.io/en/latest/index.html) -[^1]: Source: [@andrewyatz](https://github.com/@andrewyatz/) at [SchemaBlocks {S}[B]](http://schemablocks.org/standards/genome-coordinates.html) +[^1]: Source: [@andrewyatz](https://github.com/@andrewyatz/) at [SchemaBlocks {S}[B]](https://schemablocks.org/standards/genome-coordinates.html) diff --git a/docs/img/link-solid.svg b/docs/img/link-solid.svg index 9e7198ec9..6ee16eb1b 100644 --- a/docs/img/link-solid.svg +++ b/docs/img/link-solid.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/docs/implementations-options.md b/docs/implementations-options.md index da472af20..81846f2f7 100644 --- a/docs/implementations-options.md +++ b/docs/implementations-options.md @@ -18,7 +18,7 @@ Let's say that you have your data organized and structured in a database (e.g. [ * [European Genome-Phenome Archive Beacon](https://ga4gh-approval-beacon.ega-archive.org/api/info) * [Cafe Variome](https://beaconv2.cafevariome.org/form) - * [`bycon` Python stack](http://bycon.progenetix.org) driving full featured v2 under the [Progenetix](https://progenetix.org) resource + * [`bycon` Python stack](https://bycon.progenetix.org) driving full featured v2 under the [Progenetix](https://progenetix.org) resource * [Fundacion Progreso y Salud Beacon v2 API](https://csvs-beacon.clinbioinfosspa.es/csvs/ga4ghbeacon/v2/api/) * [CNAG Beacon v2 API](https://playground.rd-connect.eu/beacon2/api) diff --git a/docs/implementations/org.progenetix.md b/docs/implementations/org.progenetix.md index 1a1998356..297623dc6 100644 --- a/docs/implementations/org.progenetix.md +++ b/docs/implementations/org.progenetix.md @@ -2,7 +2,7 @@

Progenetix & Beacon+

The Beacon+ implementation - developed in the Python & MongoDB based [`bycon` project](https://github.com/progenetix/bycon/) - -implements an expanding set of Beacon v2 paths for the [Progenetix](http://progenetix.org) +implements an expanding set of Beacon v2 paths for the [Progenetix](https://progenetix.org) resource :flag_ch:. ### Scoped responses from query object @@ -19,7 +19,7 @@ entry to * `{ "entityType": "biosample", "schema:": "https://progenetix.org/services/schemas/Biosample/"}` would change this to a biosample response. The example ccan be tested by POSTing this as `application/json` -to `http://progenetix.org/beacon/variants/` or `http://progenetix.org/beacon/biosamples/`. +to `https://progenetix.org/beacon/variants/` or `https://progenetix.org/beacon/biosamples/`. ```json { @@ -80,18 +80,18 @@ The root path provides the standard `BeaconInfoResponse`. ##### `/biosamples/{id}/` -* [/biosamples/pgxbs-kftva5c9](http://progenetix.org/beacon/biosamples/pgxbs-kftva5c9) +* [/biosamples/pgxbs-kftva5c9](https://progenetix.org/beacon/biosamples/pgxbs-kftva5c9) - retrieval of a single biosample ##### `/biosamples/?testMode=true` -* [/biosamples?testMode=true](http://progenetix.org/beacon/biosamples?testMode=true) +* [/biosamples?testMode=true](https://progenetix.org/beacon/biosamples?testMode=true) - retrieval of some random samples - for testing API responses ##### `/biosamples/{id}/g_variants` -* [/biosamples/pgxbs-kftva5c9/g_variants/](http://progenetix.org/beacon/biosamples/pgxbs-kftva5c9/g_variants/) +* [/biosamples/pgxbs-kftva5c9/g_variants/](https://progenetix.org/beacon/biosamples/pgxbs-kftva5c9/g_variants/) - retrieval of all variants from a single biosample ---- @@ -117,19 +117,19 @@ e.g. linking to genomic variation data. ##### `/individuals/{id}` -* [/individuals/pgxind-kftx25hb/](http://progenetix.org/beacon/individuals/pgxind-kftx25hb/) +* [/individuals/pgxind-kftx25hb/](https://progenetix.org/beacon/individuals/pgxind-kftx25hb/) - retrieval of a single individual ##### `/individuals/?testMode=true` -* [/individuals?testMode=true](http://progenetix.org/beacon/individuals?testMode=true) +* [/individuals?testMode=true](https://progenetix.org/beacon/individuals?testMode=true) - retrieval of some random individuals - for testing API responses ##### `/individuals/{id}/g_variants` -* [/individuals/pgxind-kftx25hb/g_variants/](http://progenetix.org/beacon/individuals/pgxind-kftx25hb/g_variants) -* [/individuals/pgxind-kftx25hb/genomicVariations/](http://progenetix.org/beacon/individuals/pgxind-kftx25hb/genomicVariations/) +* [/individuals/pgxind-kftx25hb/g_variants/](https://progenetix.org/beacon/individuals/pgxind-kftx25hb/g_variants) +* [/individuals/pgxind-kftx25hb/genomicVariations/](https://progenetix.org/beacon/individuals/pgxind-kftx25hb/genomicVariations/) - retrieval of all variants from a single individual ---- @@ -145,22 +145,22 @@ the local `variants` collection. ##### `/g_variants?testMode=true` -* [/g_variants?testMode=true](http://progenetix.org/beacon/g_variants?testMode=true) +* [/g_variants?testMode=true](https://progenetix.org/beacon/g_variants?testMode=true) - retrieval of some random variants - for testing API responses ##### `/g_variants` + query -* [/variants/?assemblyId=GRCh38&referenceName=17&variantType=DEL&filterLogic=AND&start=7500000&start=7676592&end=7669607&end=7800000](http://progenetix.org/beacon/variants/?assemblyId=GRCh38&referenceName=17&variantType=DEL&filterLogic=AND&start=7500000&start=7676592&end=7669607&end=7800000) +* [/variants/?assemblyId=GRCh38&referenceName=17&variantType=DEL&filterLogic=AND&start=7500000&start=7676592&end=7669607&end=7800000](https://progenetix.org/beacon/variants/?assemblyId=GRCh38&referenceName=17&variantType=DEL&filterLogic=AND&start=7500000&start=7676592&end=7669607&end=7800000) - This is an example for a Beacon "Bracket Query" which will return focal deletions in the TP53 locus (by position). ##### `/g_variants/{id}` -* [/g_variants/pgxvar-5f5a35586b8c1d6d377b77f6](http://progenetix.org/beacon/g_variants/pgxvar-5f5a35586b8c1d6d377b77f6) +* [/g_variants/pgxvar-5f5a35586b8c1d6d377b77f6](https://progenetix.org/beacon/g_variants/pgxvar-5f5a35586b8c1d6d377b77f6) ##### `/g_variants/{id}/biosamples` -* [/g_variants/pgxvar-5f5a35586b8c1d6d377b77f6/biosamples](http://progenetix.org/beacon/g_variants/pgxvar-5f5a35586b8c1d6d377b77f6/biosamples) +* [/g_variants/pgxvar-5f5a35586b8c1d6d377b77f6/biosamples](https://progenetix.org/beacon/g_variants/pgxvar-5f5a35586b8c1d6d377b77f6/biosamples) ---- @@ -175,7 +175,7 @@ CNV statistics or binned genome calls. ##### `/analyses?testMode=true` -* [/analyses/?testMode=true](http://progenetix.org/beacon/analyses?testMode=true) +* [/analyses/?testMode=true](https://progenetix.org/beacon/analyses?testMode=true) - retrieval of some random analyses - for testing API responses diff --git a/docs/index.md b/docs/index.md index fa7b948a7..bd6929814 100644 --- a/docs/index.md +++ b/docs/index.md @@ -19,9 +19,9 @@ into resources and workflows, the major 2.0 release in 2022 introduced a large r
Beacon v2 specification
-The core documentation (i.e. this document) can be found on [here](http://docs.genomebeacons.org). Additional +The core documentation (i.e. this document) can be found on [here](https://docs.genomebeacons.org). Additional information about the Beacon project - including news, events, publications - is available -through the website [beacon-project.io](http://beacon-project.io). +through the website [beacon-project.io](https://beacon-project.io). ## Informations for Different Types of Beacon Users diff --git a/docs/other-implementations.md b/docs/other-implementations.md index fc5ad483e..0901d438f 100644 --- a/docs/other-implementations.md +++ b/docs/other-implementations.md @@ -20,8 +20,8 @@ such as CNV query options or handover data delivery. #### Technologies * MongoDB backend -* [`bycon`](http://github.com/progenetix/bycon/) Python-based full stack API / middleware -* [`progenetix-web`](http://github.com/progenetix/progenetix-web/) React based front-end (modular for Beacon instances as well as the whole Progenetix UI) +* [`bycon`](https://github.com/progenetix/bycon/) Python-based full stack API / middleware +* [`progenetix-web`](https://github.com/progenetix/progenetix-web/) React based front-end (modular for Beacon instances as well as the whole Progenetix UI) ##### Link: [Documentation page]([implementations/org.progenetix.md](https://docs.progenetix.org/beaconplus/#beacon-v2-path-examples-in-progenetix)) for Progenetix REST paths diff --git a/docs/schemas-md/datasets_defaultSchema.md b/docs/schemas-md/datasets_defaultSchema.md index 23726884d..92361daa9 100644 --- a/docs/schemas-md/datasets_defaultSchema.md +++ b/docs/schemas-md/datasets_defaultSchema.md @@ -3,7 +3,7 @@ | [createDateTime](./obj/createDateTime.md) | The time the dataset was created (ISO 8601 format) | string | NA | 2017-01-17T20:33:40Z | NA| | [dataUseConditions](./obj/dataUseConditions.md) | Data use conditions applying to this dataset. | object | [duoDataUse](./obj/duoDataUse.md) | NA | NA| | [description](./obj/description.md) | Description of the dataset | string | NA | This dataset provides examples of the actual data in this Beacon instance. | NA| -| [externalUrl](./obj/externalUrl.md) | URL to an external system providing more dataset information (RFC 3986 format). | string | NA | http://example.org/wiki/Main_Page | NA| +| [externalUrl](./obj/externalUrl.md) | URL to an external system providing more dataset information (RFC 3986 format). | string | NA | https://example.org/wiki/Main_Page | NA| | [id](./obj/id.md) | Unique identifier of the dataset | string | NA | ds01010101 | NA| | [info](./obj/info.md) | Placeholder to allow the Beacon to return any additional information that is necessary or could be of interest in relation to the query or the entry returned. It is recommended to encapsulate additional informations in this attribute instead of directly adding attributes at the same level than the others in order to avoid collision in the names of attributes in future versions of the specification. | object | NA | NA | NA| | [name](./obj/name.md) | Name of the dataset | string | NA | Dataset with synthetic data | NA| @@ -34,7 +34,7 @@ These are examples extracted directly from the [GitHub repository](https://githu ] }, "description": "This dataset provides examples of the actual data in this Beacon instance.", - "externalUrl": "http://example.org/wiki/Main_Page", + "externalUrl": "https://example.org/wiki/Main_Page", "id": "ds01010101", "name": "Dataset with synthetic data", "updateDateTime": "2017-01-17T20:33:40Z", diff --git a/docs/schemas-md/obj/externalUrl.md b/docs/schemas-md/obj/externalUrl.md index 76edbfe81..ebc1a6bbe 100644 --- a/docs/schemas-md/obj/externalUrl.md +++ b/docs/schemas-md/obj/externalUrl.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| externalUrl | URL to an external system providing more dataset information (RFC 3986 format). | string | NA | http://example.org/wiki/Main_Page | NA| +| externalUrl | URL to an external system providing more dataset information (RFC 3986 format). | string | NA | https://example.org/wiki/Main_Page | NA| diff --git a/docs/schemas-md/obj/toolReferences.md b/docs/schemas-md/obj/toolReferences.md index 32b7a559b..aa2ab58de 100644 --- a/docs/schemas-md/obj/toolReferences.md +++ b/docs/schemas-md/obj/toolReferences.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| toolReferences | References to the tool | object | NA | `[{"bio.toolsId": "https://bio.tools/vep"}, {"url": "http://www.ensembl.org/vep"}]` | NA| +| toolReferences | References to the tool | object | NA | `[{"bio.toolsId": "https://bio.tools/vep"}, {"url": "https://www.ensembl.org/vep"}]` | NA| diff --git a/docs/schemas-md/obj/variantAlternativeIds.md b/docs/schemas-md/obj/variantAlternativeIds.md index d691d7a5c..77955f1cd 100644 --- a/docs/schemas-md/obj/variantAlternativeIds.md +++ b/docs/schemas-md/obj/variantAlternativeIds.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| variantAlternativeIds | Definition of an external reference class. Provenance: GA4GH Phenopackets v2 `ExternalReference` | array | [id](./id.md), [notes](./notes.md), [reference](./reference.md) | `[{"id": "dbSNP:rs587780345", "notes": "dbSNP id", "reference": "https://www.ncbi.nlm.nih.gov/snp/rs587780345"}, {"id": "ClinGen:CA152954", "notes": "ClinGen Allele Registry id", "reference": "http://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954"}, {"id": "UniProtKB:P35557#VAR_003699", "reference": "https://www.uniprot.org/uniprot/P35557#VAR_003699"}]`,
`[{"id": "OMIM:164757.0001", "reference": "https://www.omim.org/entry/164757#0001"}]` | NA| +| variantAlternativeIds | Definition of an external reference class. Provenance: GA4GH Phenopackets v2 `ExternalReference` | array | [id](./id.md), [notes](./notes.md), [reference](./reference.md) | `[{"id": "dbSNP:rs587780345", "notes": "dbSNP id", "reference": "https://www.ncbi.nlm.nih.gov/snp/rs587780345"}, {"id": "ClinGen:CA152954", "notes": "ClinGen Allele Registry id", "reference": "https://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954"}, {"id": "UniProtKB:P35557#VAR_003699", "reference": "https://www.uniprot.org/uniprot/P35557#VAR_003699"}]`,
`[{"id": "OMIM:164757.0001", "reference": "https://www.omim.org/entry/164757#0001"}]` | NA| diff --git a/docs/variant-queries.md b/docs/variant-queries.md index 86594434c..b8827aa68 100644 --- a/docs/variant-queries.md +++ b/docs/variant-queries.md @@ -341,16 +341,16 @@ values to underlying genomic variations had not been precisely defined. This table is maintained in parallel with the [hCNV community documentation](https://cnvar.org/resources/CNV-annotation-standards/#cnv-term-use-comparison-in-computational-fileschema-formats). -| [EFO](http://www.ebi.ac.uk/efo/EFO_0030063) | Beacon | [VCF](https://samtools.github.io/hts-specs/) | SO | GA4GH [VRS](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒
[VRS proposal](https://github.com/ga4gh/vrs/issues/404)[^1] | Notes | +| [EFO](https://www.ebi.ac.uk/efo/EFO_0030063) | Beacon | [VCF](https://samtools.github.io/hts-specs/) | SO | GA4GH [VRS](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒
[VRS proposal](https://github.com/ga4gh/vrs/issues/404)[^1] | Notes | | ------------------------------------------- | ------------------------------------------------------------------------------ | -------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----- | -| [`EFO:0030070`](http://www.ebi.ac.uk/efo/EFO_0030070) copy number gain | `DUP`[^2] or
[`EFO:0030070`](http://www.ebi.ac.uk/efo/EFO_0030070) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](http://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`low-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) (implicit) ⇒ [`EFO:0030070`](http://www.ebi.ac.uk/efo/EFO_0030070) copy number gain | a sequence alteration whereby the copy number of a given genomic region is greater than the reference sequence | -| [`EFO:0030071`](http://www.ebi.ac.uk/efo/EFO_0030071) low-level copy number gain| `DUP`[^2] or
[`EFO:0030071`](http://www.ebi.ac.uk/efo/EFO_0030071) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](http://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`low-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030071`](http://www.ebi.ac.uk/efo/EFO_0030071) low-level copy number gain | | -| [`EFO:0030072`](http://www.ebi.ac.uk/efo/EFO_0030072) high-level copy number gain | `DUP`[^2] or
[`EFO:0030072`](http://www.ebi.ac.uk/efo/EFO_0030072) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](http://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`high-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030072`](http://www.ebi.ac.uk/efo/EFO_0030072) high-level copy number gain | commonly but not consistently used for >=5 copies on a bi-allelic genome region | -| [`EFO:0030073`](http://www.ebi.ac.uk/efo/EFO_0030073) focal genome amplification | `DUP`[^2] or
[`EFO:0030073`](http://www.ebi.ac.uk/efo/EFO_0030073) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](http://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`high-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030073`](http://www.ebi.ac.uk/efo/EFO_0030073) focal genome amplification | commonly but not consistently used for >=5 copies on a bi-allelic genome region, of limited size (operationally max. 1-5Mb) | -| [`EFO:0030067`](http://www.ebi.ac.uk/efo/EFO_0030067) copy number loss | `DEL`[^2] or
[`EFO:0030067`](http://www.ebi.ac.uk/efo/EFO_0030067) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](http://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`partial loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) (implicit) ⇒ [`EFO:0030067`](http://www.ebi.ac.uk/efo/EFO_0030067) copy number loss | a sequence alteration whereby the copy number of a given genomic region is smaller than the reference sequence | -| [`EFO:0030068`](http://www.ebi.ac.uk/efo/EFO_0030068) low-level copy number loss | `DEL`[^2] or
[`EFO:0030068`](http://www.ebi.ac.uk/efo/EFO_0030068) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](http://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`partial loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030068`](http://www.ebi.ac.uk/efo/EFO_0030068) low-level copy number loss | | -| [`EFO:0020073`](http://www.ebi.ac.uk/efo/EFO_0020073) high-level copy number loss | `DEL`[^2] or
[`EFO:0020073`](https://github.com/EBISPOT/efo/issues/1941) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](http://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`partial loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0020073`](https://github.com/EBISPOT/efo/issues/1941) high-level copy number loss | a loss of several copies; also used in cases where a complete genomic deletion cannot be asserted | -| [`EFO:0030069`](http://www.ebi.ac.uk/efo/EFO_0030069) complete genomic deletion | `DEL`[^2] or
[`EFO:0030069`](http://www.ebi.ac.uk/efo/EFO_0030069) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](http://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`complete loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030069`](http://www.ebi.ac.uk/efo/EFO_0030069) complete genomic deletion | complete genomic deletion (e.g. homozygous deletion on a bi-allelic genome region) | +| [`EFO:0030070`](https://www.ebi.ac.uk/efo/EFO_0030070) copy number gain | `DUP`[^2] or
[`EFO:0030070`](https://www.ebi.ac.uk/efo/EFO_0030070) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](https://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`low-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) (implicit) ⇒ [`EFO:0030070`](https://www.ebi.ac.uk/efo/EFO_0030070) copy number gain | a sequence alteration whereby the copy number of a given genomic region is greater than the reference sequence | +| [`EFO:0030071`](https://www.ebi.ac.uk/efo/EFO_0030071) low-level copy number gain| `DUP`[^2] or
[`EFO:0030071`](https://www.ebi.ac.uk/efo/EFO_0030071) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](https://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`low-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030071`](https://www.ebi.ac.uk/efo/EFO_0030071) low-level copy number gain | | +| [`EFO:0030072`](https://www.ebi.ac.uk/efo/EFO_0030072) high-level copy number gain | `DUP`[^2] or
[`EFO:0030072`](https://www.ebi.ac.uk/efo/EFO_0030072) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](https://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`high-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030072`](https://www.ebi.ac.uk/efo/EFO_0030072) high-level copy number gain | commonly but not consistently used for >=5 copies on a bi-allelic genome region | +| [`EFO:0030073`](https://www.ebi.ac.uk/efo/EFO_0030073) focal genome amplification | `DUP`[^2] or
[`EFO:0030073`](https://www.ebi.ac.uk/efo/EFO_0030073) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](https://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`high-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030073`](https://www.ebi.ac.uk/efo/EFO_0030073) focal genome amplification | commonly but not consistently used for >=5 copies on a bi-allelic genome region, of limited size (operationally max. 1-5Mb) | +| [`EFO:0030067`](https://www.ebi.ac.uk/efo/EFO_0030067) copy number loss | `DEL`[^2] or
[`EFO:0030067`](https://www.ebi.ac.uk/efo/EFO_0030067) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](https://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`partial loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) (implicit) ⇒ [`EFO:0030067`](https://www.ebi.ac.uk/efo/EFO_0030067) copy number loss | a sequence alteration whereby the copy number of a given genomic region is smaller than the reference sequence | +| [`EFO:0030068`](https://www.ebi.ac.uk/efo/EFO_0030068) low-level copy number loss | `DEL`[^2] or
[`EFO:0030068`](https://www.ebi.ac.uk/efo/EFO_0030068) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](https://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`partial loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030068`](https://www.ebi.ac.uk/efo/EFO_0030068) low-level copy number loss | | +| [`EFO:0020073`](https://www.ebi.ac.uk/efo/EFO_0020073) high-level copy number loss | `DEL`[^2] or
[`EFO:0020073`](https://github.com/EBISPOT/efo/issues/1941) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](https://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`partial loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0020073`](https://github.com/EBISPOT/efo/issues/1941) high-level copy number loss | a loss of several copies; also used in cases where a complete genomic deletion cannot be asserted | +| [`EFO:0030069`](https://www.ebi.ac.uk/efo/EFO_0030069) complete genomic deletion | `DEL`[^2] or
[`EFO:0030069`](https://www.ebi.ac.uk/efo/EFO_0030069) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](https://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`complete loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030069`](https://www.ebi.ac.uk/efo/EFO_0030069) complete genomic deletion | complete genomic deletion (e.g. homozygous deletion on a bi-allelic genome region) | ##### Last updated 2023-03-22 by @mbaudis (EFO:0020073) ##### updated 2023-03-20 by @mbaudis (VRS proposal) @@ -391,7 +391,7 @@ for `high level deletion (EFO:0020073)` in the April 2023 EFO release). [^2]: While the use of VCF derived (`DUP`, `DEL`) values had been introduced with beacon v1, usage of these terms has always been a _recommendation_ rather than an integral part of the API. We now encourage the support of more specific terms (particularly EFO) -by Beacon developers. As example, the Progentix Beacon API [uses EFO terms](http://progenetix.org/search/) but +by Beacon developers. As example, the Progentix Beacon API [uses EFO terms](https://progenetix.org/search/) but provides an internal term expansion for legacy `DUP`, `DEL` support. [^3]: VCFv4.4 introduces an `SVCLAIM` field to disambiguate between _in situ_ events (such as tandem duplications; known _adjacency_/ _break junction_: `SVCLAIM=J`) and events where e.g. only the diff --git a/framework/json/endpoints.json b/framework/json/endpoints.json index 420171ada..e394ad28f 100644 --- a/framework/json/endpoints.json +++ b/framework/json/endpoints.json @@ -47,7 +47,7 @@ "description": "A Beacon is a web service for genetic data sharing that can be queried for information about variants, individuals, biosamples, and other entities.", "license": { "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, "title": "GA4GH Beacon API Specification", "version": "2.0.0" diff --git a/framework/json/responses/examples-fullDocuments/beaconFilteringTermsResponse-example.json b/framework/json/responses/examples-fullDocuments/beaconFilteringTermsResponse-example.json index b7a2b368b..7e783d049 100644 --- a/framework/json/responses/examples-fullDocuments/beaconFilteringTermsResponse-example.json +++ b/framework/json/responses/examples-fullDocuments/beaconFilteringTermsResponse-example.json @@ -31,10 +31,10 @@ "resources": [ { "id": "hp", - "iriPrefix": "http://purl.obolibrary.org/obo/HP_", + "iriPrefix": "https://purl.obolibrary.org/obo/HP_", "name": "Human Phenotype Ontology", "namespacePrefix": "HP", - "url": "http://purl.obolibrary.org/obo/hp.owl", + "url": "https://purl.obolibrary.org/obo/hp.owl", "version": "27-03-2020" } ] diff --git a/framework/json/responses/examples-fullDocuments/beaconInfo-MAX-example.json b/framework/json/responses/examples-fullDocuments/beaconInfo-MAX-example.json index e542da6bb..c9acffa09 100644 --- a/framework/json/responses/examples-fullDocuments/beaconInfo-MAX-example.json +++ b/framework/json/responses/examples-fullDocuments/beaconInfo-MAX-example.json @@ -12,7 +12,7 @@ ] }, "response": { - "alternativeUrl": "http://example.org/wiki/Main_Page", + "alternativeUrl": "https://example.org/wiki/Main_Page", "apiVersion": "v0.3", "createDateTime": "2012-07-19 or 2017-01-17T20:33:40Z", "description": "string", @@ -38,6 +38,6 @@ }, "updateDateTime": "2012-07-19 or 2017-01-17T20:33:40Z", "version": "v0.1", - "welcomeUrl": "http://example.org/wiki/Main_Page" + "welcomeUrl": "https://example.org/wiki/Main_Page" } } \ No newline at end of file diff --git a/framework/json/responses/sections/beaconFilteringTermsResults.json b/framework/json/responses/sections/beaconFilteringTermsResults.json index e7a0ab74a..a752f0e23 100644 --- a/framework/json/responses/sections/beaconFilteringTermsResults.json +++ b/framework/json/responses/sections/beaconFilteringTermsResults.json @@ -49,7 +49,7 @@ "iriPrefix": { "description": "The full Internationalized Resource Identifier (IRI) prefix", "examples": [ - "http://purl.obolibrary.org/obo/HP_" + "https://purl.obolibrary.org/obo/HP_" ], "type": "string" }, @@ -70,7 +70,7 @@ "url": { "description": "Uniform Resource Locator of the resource", "examples": [ - "http://purl.obolibrary.org/obo/hp.owl" + "https://purl.obolibrary.org/obo/hp.owl" ], "type": "string" }, diff --git a/framework/json/responses/sections/beaconInfoResults.json b/framework/json/responses/sections/beaconInfoResults.json index 23d969a7c..9b431df0b 100644 --- a/framework/json/responses/sections/beaconInfoResults.json +++ b/framework/json/responses/sections/beaconInfoResults.json @@ -50,7 +50,7 @@ "alternativeUrl": { "description": "Alternative URL to the API, e.g. a restricted version of this Beacon (RFC 3986 format).", "examples": [ - "http://example.org/beacon/authenticated" + "https://example.org/beacon/authenticated" ], "type": "string" }, @@ -110,7 +110,7 @@ }, "welcomeUrl": { "description": "URL to the welcome page for this Beacon (RFC 3986 format).", - "example": "http://example.org/wiki/Main_Page", + "example": "https://example.org/wiki/Main_Page", "type": "string" } }, diff --git a/framework/src/endpoints.yaml b/framework/src/endpoints.yaml index 94f08c268..9e26e10ec 100644 --- a/framework/src/endpoints.yaml +++ b/framework/src/endpoints.yaml @@ -9,7 +9,7 @@ info: email: beacon@ga4gh.org license: name: Apache 2.0 - url: http://www.apache.org/licenses/LICENSE-2.0.html + url: https://www.apache.org/licenses/LICENSE-2.0.html paths: /: parameters: diff --git a/framework/src/responses/examples-fullDocuments/beaconFilteringTermsResponse-example.yaml b/framework/src/responses/examples-fullDocuments/beaconFilteringTermsResponse-example.yaml index 8af3f8d58..0dedbe1cf 100644 --- a/framework/src/responses/examples-fullDocuments/beaconFilteringTermsResponse-example.yaml +++ b/framework/src/responses/examples-fullDocuments/beaconFilteringTermsResponse-example.yaml @@ -8,10 +8,10 @@ response: resources: - id: hp name: Human Phenotype Ontology - url: http://purl.obolibrary.org/obo/hp.owl + url: https://purl.obolibrary.org/obo/hp.owl version: 27-03-2020 namespacePrefix: HP - iriPrefix: http://purl.obolibrary.org/obo/HP_ + iriPrefix: https://purl.obolibrary.org/obo/HP_ filteringTerms: - type: numeric id: PATO:0000011 diff --git a/framework/src/responses/examples-fullDocuments/beaconInfo-MAX-example.yaml b/framework/src/responses/examples-fullDocuments/beaconInfo-MAX-example.yaml index 5d5e1b5d4..569323ec0 100644 --- a/framework/src/responses/examples-fullDocuments/beaconInfo-MAX-example.yaml +++ b/framework/src/responses/examples-fullDocuments/beaconInfo-MAX-example.yaml @@ -21,8 +21,8 @@ response: info: {} description: string version: v0.1 - welcomeUrl: http://example.org/wiki/Main_Page - alternativeUrl: http://example.org/wiki/Main_Page + welcomeUrl: https://example.org/wiki/Main_Page + alternativeUrl: https://example.org/wiki/Main_Page createDateTime: 2012-07-19 or 2017-01-17T20:33:40Z updateDateTime: 2012-07-19 or 2017-01-17T20:33:40Z info: diff --git a/framework/src/responses/sections/beaconFilteringTermsResults.yaml b/framework/src/responses/sections/beaconFilteringTermsResults.yaml index 4c3bd96c3..503d81184 100644 --- a/framework/src/responses/sections/beaconFilteringTermsResults.yaml +++ b/framework/src/responses/sections/beaconFilteringTermsResults.yaml @@ -73,7 +73,7 @@ definitions: description: >- Uniform Resource Locator of the resource examples: - - http://purl.obolibrary.org/obo/hp.owl + - https://purl.obolibrary.org/obo/hp.owl version: type: string description: >- @@ -90,5 +90,5 @@ definitions: type: string description: The full Internationalized Resource Identifier (IRI) prefix examples: - - http://purl.obolibrary.org/obo/HP_ + - https://purl.obolibrary.org/obo/HP_ additionalProperties: true diff --git a/framework/src/responses/sections/beaconInfoResults.yaml b/framework/src/responses/sections/beaconInfoResults.yaml index 952bc9d10..db432fe09 100644 --- a/framework/src/responses/sections/beaconInfoResults.yaml +++ b/framework/src/responses/sections/beaconInfoResults.yaml @@ -42,14 +42,14 @@ properties: type: string description: >- URL to the welcome page for this Beacon (RFC 3986 format). - example: http://example.org/wiki/Main_Page + example: https://example.org/wiki/Main_Page alternativeUrl: type: string description: >- Alternative URL to the API, e.g. a restricted version of this Beacon (RFC 3986 format). examples: - - http://example.org/beacon/authenticated + - https://example.org/beacon/authenticated createDateTime: type: string description: >- diff --git a/mkdocs.yaml b/mkdocs.yaml index 19bc80677..01888f1e4 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -92,7 +92,7 @@ nav: - Repository and Branch Organization: code-organization - Github Repositories ↗: https://github.com/ga4gh-beacon/ - External Links: - - Beacon Project ↗: http://beacon-project.io + - Beacon Project ↗: https://beacon-project.io # - Download PDF: pdf/beacon.pdf theme: diff --git a/models/json/beacon-v2-default-model/analyses/endpoints.json b/models/json/beacon-v2-default-model/analyses/endpoints.json index e6d44453f..570d7201d 100644 --- a/models/json/beacon-v2-default-model/analyses/endpoints.json +++ b/models/json/beacon-v2-default-model/analyses/endpoints.json @@ -82,7 +82,7 @@ "description": "TBD", "license": { "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, "title": "GA4GH Beacon API Specification - Analysis endpoints", "version": "2.0.0" diff --git a/models/json/beacon-v2-default-model/biosamples/endpoints.json b/models/json/beacon-v2-default-model/biosamples/endpoints.json index d6cd3c4ea..533d5ceda 100644 --- a/models/json/beacon-v2-default-model/biosamples/endpoints.json +++ b/models/json/beacon-v2-default-model/biosamples/endpoints.json @@ -86,7 +86,7 @@ "description": "TBD", "license": { "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, "title": "GA4GH Beacon API Specification - Biosamples endpoints", "version": "2.0.0" diff --git a/models/json/beacon-v2-default-model/cohorts/endpoints.json b/models/json/beacon-v2-default-model/cohorts/endpoints.json index ec0584c18..1e36b7462 100644 --- a/models/json/beacon-v2-default-model/cohorts/endpoints.json +++ b/models/json/beacon-v2-default-model/cohorts/endpoints.json @@ -99,7 +99,7 @@ "description": "TBD", "license": { "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, "title": "GA4GH Beacon API Specification - Cohorts Endpoints", "version": "2.0.0" diff --git a/models/json/beacon-v2-default-model/datasets/defaultSchema.json b/models/json/beacon-v2-default-model/datasets/defaultSchema.json index 4a470f26e..41acb023d 100644 --- a/models/json/beacon-v2-default-model/datasets/defaultSchema.json +++ b/models/json/beacon-v2-default-model/datasets/defaultSchema.json @@ -25,7 +25,7 @@ "externalUrl": { "description": "URL to an external system providing more dataset information (RFC 3986 format).", "examples": [ - "http://example.org/wiki/Main_Page" + "https://example.org/wiki/Main_Page" ], "type": "string" }, diff --git a/models/json/beacon-v2-default-model/datasets/endpoints.json b/models/json/beacon-v2-default-model/datasets/endpoints.json index f97c01c6a..3fdc832a4 100644 --- a/models/json/beacon-v2-default-model/datasets/endpoints.json +++ b/models/json/beacon-v2-default-model/datasets/endpoints.json @@ -97,7 +97,7 @@ "description": "TBD", "license": { "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, "title": "GA4GH Beacon API Specification - Datasets Endpoints", "version": "2.0.0" diff --git a/models/json/beacon-v2-default-model/datasets/examples/dataset-Max-example.json b/models/json/beacon-v2-default-model/datasets/examples/dataset-Max-example.json index 9bf90334f..0bbc1dd2d 100644 --- a/models/json/beacon-v2-default-model/datasets/examples/dataset-Max-example.json +++ b/models/json/beacon-v2-default-model/datasets/examples/dataset-Max-example.json @@ -17,7 +17,7 @@ ] }, "description": "This dataset provides examples of the actual data in this Beacon instance.", - "externalUrl": "http://example.org/wiki/Main_Page", + "externalUrl": "https://example.org/wiki/Main_Page", "id": "ds01010101", "name": "Dataset with synthetic data", "updateDateTime": "2017-01-17T20:33:40Z", diff --git a/models/json/beacon-v2-default-model/endpoints.json b/models/json/beacon-v2-default-model/endpoints.json index 054b9c6c4..9c72ad0ef 100644 --- a/models/json/beacon-v2-default-model/endpoints.json +++ b/models/json/beacon-v2-default-model/endpoints.json @@ -47,7 +47,7 @@ "description": "A Beacon is a web service for data discovery and sharing that can be queried for information about entry types defined by a Model.", "license": { "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, "title": "GA4GH Beacon API Specification", "version": "2.0.0" diff --git a/models/json/beacon-v2-default-model/genomicVariations/defaultSchema.json b/models/json/beacon-v2-default-model/genomicVariations/defaultSchema.json index c07edcc85..fc3b7f047 100644 --- a/models/json/beacon-v2-default-model/genomicVariations/defaultSchema.json +++ b/models/json/beacon-v2-default-model/genomicVariations/defaultSchema.json @@ -237,7 +237,7 @@ { "id": "ClinGen:CA152954", "notes": "ClinGen Allele Registry id", - "reference": "http://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954" + "reference": "https://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954" }, { "id": "UniProtKB:P35557#VAR_003699", @@ -482,7 +482,7 @@ "bio.toolsId": "https://bio.tools/vep" }, { - "url": "http://www.ensembl.org/vep" + "url": "https://www.ensembl.org/vep" } ], "minProperties": 1, diff --git a/models/json/beacon-v2-default-model/genomicVariations/endpoints.json b/models/json/beacon-v2-default-model/genomicVariations/endpoints.json index 20cb5195e..e9101f04f 100644 --- a/models/json/beacon-v2-default-model/genomicVariations/endpoints.json +++ b/models/json/beacon-v2-default-model/genomicVariations/endpoints.json @@ -184,7 +184,7 @@ "description": "TBD", "license": { "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, "title": "GA4GH Beacon API Specification - Genomic Variations Endpoints", "version": "2.0.0" diff --git a/models/json/beacon-v2-default-model/individuals/endpoints.json b/models/json/beacon-v2-default-model/individuals/endpoints.json index e5621919b..32898cb17 100644 --- a/models/json/beacon-v2-default-model/individuals/endpoints.json +++ b/models/json/beacon-v2-default-model/individuals/endpoints.json @@ -82,7 +82,7 @@ "description": "TBD", "license": { "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, "title": "GA4GH Beacon API Specification - Individuals Endpoints", "version": "2.0.0" diff --git a/models/json/beacon-v2-default-model/runs/endpoints.json b/models/json/beacon-v2-default-model/runs/endpoints.json index 3f7fd4d7a..b5084bba7 100644 --- a/models/json/beacon-v2-default-model/runs/endpoints.json +++ b/models/json/beacon-v2-default-model/runs/endpoints.json @@ -98,7 +98,7 @@ "description": "TBD", "license": { "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, "title": "GA4GH Beacon API Specification - Runs Endpoints", "version": "2.0.0" diff --git a/models/src/beacon-v2-default-model/analyses/endpoints.yaml b/models/src/beacon-v2-default-model/analyses/endpoints.yaml index a86548b07..8f5d5457a 100644 --- a/models/src/beacon-v2-default-model/analyses/endpoints.yaml +++ b/models/src/beacon-v2-default-model/analyses/endpoints.yaml @@ -8,7 +8,7 @@ info: email: beacon@ga4gh.org license: name: Apache 2.0 - url: http://www.apache.org/licenses/LICENSE-2.0.html + url: https://www.apache.org/licenses/LICENSE-2.0.html paths: /analyses: get: diff --git a/models/src/beacon-v2-default-model/biosamples/endpoints.yaml b/models/src/beacon-v2-default-model/biosamples/endpoints.yaml index a4246ed1a..50b80d8bb 100644 --- a/models/src/beacon-v2-default-model/biosamples/endpoints.yaml +++ b/models/src/beacon-v2-default-model/biosamples/endpoints.yaml @@ -8,7 +8,7 @@ info: email: beacon@ga4gh.org license: name: Apache 2.0 - url: http://www.apache.org/licenses/LICENSE-2.0.html + url: https://www.apache.org/licenses/LICENSE-2.0.html paths: /biosamples: get: diff --git a/models/src/beacon-v2-default-model/cohorts/endpoints.yaml b/models/src/beacon-v2-default-model/cohorts/endpoints.yaml index e38a31bf6..9fd0e999a 100644 --- a/models/src/beacon-v2-default-model/cohorts/endpoints.yaml +++ b/models/src/beacon-v2-default-model/cohorts/endpoints.yaml @@ -8,7 +8,7 @@ info: email: beacon@ga4gh.org license: name: Apache 2.0 - url: http://www.apache.org/licenses/LICENSE-2.0.html + url: https://www.apache.org/licenses/LICENSE-2.0.html tags: - name: GET Endpoints description: Available endpoints in this API. All of them have a POST counterpart. diff --git a/models/src/beacon-v2-default-model/datasets/defaultSchema.yaml b/models/src/beacon-v2-default-model/datasets/defaultSchema.yaml index b287b9ad3..d9f8cbe30 100644 --- a/models/src/beacon-v2-default-model/datasets/defaultSchema.yaml +++ b/models/src/beacon-v2-default-model/datasets/defaultSchema.yaml @@ -38,7 +38,7 @@ properties: description: URL to an external system providing more dataset information (RFC 3986 format). examples: - - http://example.org/wiki/Main_Page + - https://example.org/wiki/Main_Page info: $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/common/beaconCommonComponents.json#/definitions/Info dataUseConditions: diff --git a/models/src/beacon-v2-default-model/datasets/endpoints.yaml b/models/src/beacon-v2-default-model/datasets/endpoints.yaml index e4d9a273e..dc2c34d31 100644 --- a/models/src/beacon-v2-default-model/datasets/endpoints.yaml +++ b/models/src/beacon-v2-default-model/datasets/endpoints.yaml @@ -8,7 +8,7 @@ info: email: beacon@ga4gh.org license: name: Apache 2.0 - url: http://www.apache.org/licenses/LICENSE-2.0.html + url: https://www.apache.org/licenses/LICENSE-2.0.html tags: - name: GET Endpoints description: Available endpoints in this API. All of them have a POST counterpart. diff --git a/models/src/beacon-v2-default-model/datasets/examples/dataset-Max-example.yaml b/models/src/beacon-v2-default-model/datasets/examples/dataset-Max-example.yaml index d01f5fc6d..ffeb1569d 100644 --- a/models/src/beacon-v2-default-model/datasets/examples/dataset-Max-example.yaml +++ b/models/src/beacon-v2-default-model/datasets/examples/dataset-Max-example.yaml @@ -5,7 +5,7 @@ description: This dataset provides examples of the actual data in this Beacon in createDateTime: '2017-01-17T20:33:40Z' updateDateTime: '2017-01-17T20:33:40Z' version: v1.1 -externalUrl: http://example.org/wiki/Main_Page +externalUrl: https://example.org/wiki/Main_Page dataUseConditions: duoDataUse: - id: DUO:0000007 diff --git a/models/src/beacon-v2-default-model/endpoints.yaml b/models/src/beacon-v2-default-model/endpoints.yaml index 939e3bda3..a8b5716f0 100644 --- a/models/src/beacon-v2-default-model/endpoints.yaml +++ b/models/src/beacon-v2-default-model/endpoints.yaml @@ -9,7 +9,7 @@ info: email: beacon@ga4gh.org license: name: Apache 2.0 - url: http://www.apache.org/licenses/LICENSE-2.0.html + url: https://www.apache.org/licenses/LICENSE-2.0.html paths: /: parameters: diff --git a/models/src/beacon-v2-default-model/genomicVariations/defaultSchema.yaml b/models/src/beacon-v2-default-model/genomicVariations/defaultSchema.yaml index 2e66e4fd0..7011dd6a7 100644 --- a/models/src/beacon-v2-default-model/genomicVariations/defaultSchema.yaml +++ b/models/src/beacon-v2-default-model/genomicVariations/defaultSchema.yaml @@ -115,7 +115,7 @@ definitions: reference: https://www.ncbi.nlm.nih.gov/snp/rs587780345 notes: dbSNP id - id: ClinGen:CA152954 - reference: http://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954 + reference: https://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid=CA152954 notes: ClinGen Allele Registry id - id: UniProtKB:P35557#VAR_003699 reference: https://www.uniprot.org/uniprot/P35557#VAR_003699 @@ -432,7 +432,7 @@ definitions: additionalProperties: true examples: - bio.toolsId: https://bio.tools/vep - - url: http://www.ensembl.org/vep + - url: https://www.ensembl.org/vep minProperties: 1 required: - toolName diff --git a/models/src/beacon-v2-default-model/genomicVariations/endpoints.yaml b/models/src/beacon-v2-default-model/genomicVariations/endpoints.yaml index 71ddb91c3..44b59a736 100644 --- a/models/src/beacon-v2-default-model/genomicVariations/endpoints.yaml +++ b/models/src/beacon-v2-default-model/genomicVariations/endpoints.yaml @@ -8,7 +8,7 @@ info: email: beacon@ga4gh.org license: name: Apache 2.0 - url: http://www.apache.org/licenses/LICENSE-2.0.html + url: https://www.apache.org/licenses/LICENSE-2.0.html paths: /g_variants: get: diff --git a/models/src/beacon-v2-default-model/individuals/endpoints.yaml b/models/src/beacon-v2-default-model/individuals/endpoints.yaml index e03d7decd..7ed5a46fe 100644 --- a/models/src/beacon-v2-default-model/individuals/endpoints.yaml +++ b/models/src/beacon-v2-default-model/individuals/endpoints.yaml @@ -8,7 +8,7 @@ info: email: beacon@ga4gh.org license: name: Apache 2.0 - url: http://www.apache.org/licenses/LICENSE-2.0.html + url: https://www.apache.org/licenses/LICENSE-2.0.html paths: /individuals: get: diff --git a/models/src/beacon-v2-default-model/runs/endpoints.yaml b/models/src/beacon-v2-default-model/runs/endpoints.yaml index dd91878d1..473bea53c 100644 --- a/models/src/beacon-v2-default-model/runs/endpoints.yaml +++ b/models/src/beacon-v2-default-model/runs/endpoints.yaml @@ -8,7 +8,7 @@ info: email: beacon@ga4gh.org license: name: Apache 2.0 - url: http://www.apache.org/licenses/LICENSE-2.0.html + url: https://www.apache.org/licenses/LICENSE-2.0.html paths: /runs: get: From 1d8f80400bf4a5cd80ba6660c1c7429dfa4b471f Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Sun, 4 Jun 2023 16:18:06 +0200 Subject: [PATCH 20/77] documentation change log update --- docs/bugs-changes-log.md | 16 ++++++++++++---- docs/filters.md | 5 +++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/docs/bugs-changes-log.md b/docs/bugs-changes-log.md index a76499252..2b8a3f67b 100644 --- a/docs/bugs-changes-log.md +++ b/docs/bugs-changes-log.md @@ -1,20 +1,28 @@ # TODO, Bugs & Changes -## TODO +This page only lists changes w/ regard to the documentation and general organization +of the Beacon project site(s) as well as with overarching repository organization. -### Documentation +## TODO * [x] re-structuring of [Framework page](framework.md) - [ ] add part about necessary files, dependening on installation type (e.g. if not needing to support OpenAPI) -* [ ] fix https (probably @mbaudis has to do some registrar configuration...) +* [x] fix https (probably @mbaudis has to do some registrar configuration...) * [ ] add more [Implementations](other-implementations.md) * [ ] extend [Query documentation](variant-queries.md) - [x] expand the table comparing different "variant types" - [ ] use more content from the variant scouts document -## Changes +### Changes + +#### 2023-06-04: Improved filter documentation & HTTPS + +* extended & clarified "filters" documentation + - [filter types](/filters/#filter-types) in line with specification + - example for pseudo-numerical [value queries](/filters/#pseudo-numerical-value-queries) in `GET` context +* fixed `HTTPS` issue (by brute-forcing all links on site to `https://`) #### 2023-03-14: New `website-docs` branch diff --git a/docs/filters.md b/docs/filters.md index abb782242..a951d66b2 100644 --- a/docs/filters.md +++ b/docs/filters.md @@ -177,8 +177,9 @@ and the `value` parameter provides the field query value. Equality and relationa operators (= < >) can be used between field name and field value pairs, and field values can be associated with units if applicable. -##### Example of a Filter for individuals over 70 years of age (age = PATO:0000011, -age syntax as ISO 8601) +##### Example of a Filter for individuals over 70 years of age + +* age = PATO:0000011, age syntax as ISO 8601 === "GET" From 11312cd0bd0374c31b4e7902609b365eed459c3c Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Sat, 10 Jun 2023 10:57:32 +0200 Subject: [PATCH 21/77] fixing the ontology term CUSTOM format This is a pure documentation change for the handover format. Addresses https://github.com/ga4gh-beacon/beacon-v2/issues/83 --- framework/json/common/beaconCommonComponents.json | 14 +++++++++----- framework/src/common/beaconCommonComponents.yaml | 14 ++++++++------ 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/framework/json/common/beaconCommonComponents.json b/framework/json/common/beaconCommonComponents.json index 728c35267..768d938c4 100644 --- a/framework/json/common/beaconCommonComponents.json +++ b/framework/json/common/beaconCommonComponents.json @@ -111,15 +111,19 @@ }, "HandoverType": { "$ref": "./ontologyTerm.json", - "description": "Handover type, as an Ontology_term object with CURIE syntax for the `id` value. Use `CUSTOM` for the `id` when no ontology is available.", + "description": "Handover type, as an Ontology_term object with CURIE syntax for the `id` value. Use \"CUSTOM:123455\" CURIE-style `id` when no ontology is available.", "examples": [ { - "id": "EFO:0004157", - "label": "BAM format" + "id": "EDAM:2572", + "label": "BAM" }, { - "id": "CUSTOM", - "label": "download genomic variants in .pgxseg file format" + "id": "EDAM:3016", + "label": "VCF" + }, + { + "id": "CUSTOM:pgxseg", + "label": "genomic variants in .pgxseg file format" } ] }, diff --git a/framework/src/common/beaconCommonComponents.yaml b/framework/src/common/beaconCommonComponents.yaml index c0044ed5c..53296705a 100644 --- a/framework/src/common/beaconCommonComponents.yaml +++ b/framework/src/common/beaconCommonComponents.yaml @@ -265,11 +265,13 @@ definitions: example: https://api.mygenomeservice.org/Handover/9dcc48d7-fc88-11e8-9110-b0c592dbf8c0/ HandoverType: description: >- - Handover type, as an Ontology_term object with CURIE syntax for the `id` value. - Use `CUSTOM` for the `id` when no ontology is available. + Handover type, as an Ontology_term object with CURIE syntax for the `id` + value. Use "CUSTOM:123455" CURIE-style `id` when no ontology is available. $ref: ./ontologyTerm.yaml examples: - - id: EFO:0004157 - label: BAM format - - id: CUSTOM - label: download genomic variants in .pgxseg file format + - id: EDAM:2572 + label: BAM + - id: EDAM:3016 + label: VCF + - id: CUSTOM:pgxseg + label: genomic variants in .pgxseg file format From 622b01728b70fb8832eb5f9171160f051208a99e Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Sun, 11 Jun 2023 09:22:37 +0200 Subject: [PATCH 22/77] documentation * separate pages for records and handovers * navigation restructuring ... more content to follow --- docs/beacon-flavours.md | 36 +++------------------------------ docs/handovers.md | 45 +++++++++++++++++++++++++++++++++++++++++ docs/index.md | 26 ++++++++++++++++++++++++ docs/records.md | 28 +++++++++++++++++++++++++ mkdocs.yaml | 12 ++++++----- 5 files changed, 109 insertions(+), 38 deletions(-) create mode 100644 docs/handovers.md create mode 100644 docs/records.md diff --git a/docs/beacon-flavours.md b/docs/beacon-flavours.md index 8422f29b8..c191b3a43 100644 --- a/docs/beacon-flavours.md +++ b/docs/beacon-flavours.md @@ -77,43 +77,13 @@ handle extended options depending on the user's authentication status. For detailed information about the technical implementation of the different logical scopes please see the [Models](models.md) documentation. -### Beacon Default Data Model +Information about the different data delivery options can be found here: -The Beacon v2 default data model provides a set of schemas for common data entities with -a focus on biomedical genomics (although neither specific to medical application or human genomics _per se_). +* data delivery using [Model defined records](/records/) +* file and information linking using [handover objects](/handovers/) -In contrast to earlier versions of the protocol, the Beacon v2 default models provide -the technical blueprint for rich, structured data responses to Beacon queries, such as -annotated genomic variations, biosamples from which matched variants were retrieved -or data about individuals and study cohorts, where available and authorized. - -Detailed information is available through the [Models Introduction](/models/#introduction) -and the default schemas documented from there. - -### Alternative Data Models - - In principle, the separation of framework and models allows for different models in domains - outside of the genomics focussed Beacon v2 realm, e.g. “Imaging Beacon”, to be built using the same Framework. - -### [H—>O] Beacon Handovers for Data Delivery - -While the Beacon v1 response was restricted to aggregate data and Beacon v2 itself provides -schemas for structuring response objects (e.g. henomic variation or biosample data) -the protocol can be expanded by providing custom access methods to data elements -matched by a Beacon query. Since November 2018, Beacon v1.n has included support for a "handover" protocol, -in which rich data content can be provided from linked services, initiated through a Beacon query[^2]. - -Typical examples of `Handover` use include: - -* access to restricted data, in which a handover URL points to data behind an authentication service -or Firewall -* delivery of large/binary datasets, e.g. original array data or BAM files for a given analysis -* asynchronous calls in which a front-end follows handover URLs for additional data [^1]: Privacy protecting as in "reasonably protecting by design but not immune to complex re-identification attacks". - -[^2]: An early discussion of the topic can e.g. be found in the Beacon developer area on [Github](https://github.com/ga4gh-beacon/specification/issues/114). As of 2018-11-13, the __handover__ concept had become part of the [code development](https://github.com/ga4gh-beacon/specification/pull/230/files). - diff --git a/docs/handovers.md b/docs/handovers.md new file mode 100644 index 000000000..502a91e37 --- /dev/null +++ b/docs/handovers.md @@ -0,0 +1,45 @@ +# [H—>O] Beacon Handovers for Data Delivery + +While the Beacon v1 response was restricted to aggregate data and Beacon v2 itself provides +schemas for structuring response objects (e.g. henomic variation or biosample data) +the protocol can be expanded by providing custom access methods to data elements +matched by a Beacon query. Since November 2018, Beacon v1.n has included support for a "handover" protocol, +in which rich data content can be provided from linked services, initiated through a Beacon query[^1]. + +Typical examples of `Handover` use include: + +* access to restricted data, in which a handover URL points to data behind an authentication service +or Firewall +* delivery of large/binary datasets, e.g. original array data or BAM files for a given analysis +* asynchronous calls in which a front-end follows handover URLs for additional data + +## Examples + +### Download variants in VCF format + +In the following example a minimal boolean response is shown which contains +a single handover in the general `resultsHandovers` list. + +```json +{ + "meta": { + ... + }, + "responseSummary": { + "exists": true + }, + "resultsHandovers": [ + { + "handoverType": { + "id": "EDAM:3016", + "label": "VCF" + }, + "url": "https://my.genomeserver.space/data/vcf/grch38/gizsgf8oaoiteowgfdhhpoiuy/variants.vcf", + "note": "VCFv4.4 file with sample mapped variants (authentication required)" + } + ] +} +``` + +[^1]: An early discussion of the topic can e.g. be found in the Beacon developer area on [Github](https://github.com/ga4gh-beacon/specification/issues/114). As of 2018-11-13, the __handover__ concept had become part of the [code development](https://github.com/ga4gh-beacon/specification/pull/230/files). + diff --git a/docs/index.md b/docs/index.md index bd6929814..e91d159e1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -23,6 +23,32 @@ The core documentation (i.e. this document) can be found on [here](https://docs. information about the Beacon project - including news, events, publications - is available through the website [beacon-project.io](https://beacon-project.io). +## What is Beacon v2? + +Beacon v2 is a **protocol/specification** established by the **Global Alliance for Genomics and Health initiative** ([GA4GH](https://www.ga4gh.org)) that defines an open standard for federated discovery of genomic (and phenoclinic) data in biomedical research and clinical applications. + +!!! Important "Historical Tip" + + Originally, the Beacon protocol (versions 0 and 1) allowed researchers to get information about the presence/absence of a given, specific, genomic mutation in a set of data, from patients of a given disease or from the population in general. + ![Beacon v1](https://beacon-project.io/assets/img/Beacon-v1.png) + +The current version of the protocol is **v2** and introduces new features which were considered important by the community such as: + +* extended and clearer specified [genomic variation queries](/variant-queries), including patterns (wildcards) and region queries (i.e. returning variants within a genomic/chromosomal region) +* get a list of samples related to a phenotype, provided the required [authentication or authorization](/security) +* powerful [_filters_](/filters), primarily based on CURIE terms for ontologies and references, including options to control the use of hierarchical terms or the precision of term matching +* scoped data delivery (e.g. matched variant details or sample information) as part of Beacon responses or through _handover_ protocols + +## Components + +Beacon v2 consists of two components, the **_Framework_** and the **_Models_**. + +The [Framework](framework.md) {{config.repo_framework_icon}} contains the format for the requests and responses, whereas the [Models](models.md) {{config.repo_models_icon}} define the [structure](https://json-schema.org/specification-links.html#2020-12) of the biological data response. The overall function of these components is to provide the instructions to design a **REST API** (REpresentational State Transfer Application Programming Interface) with **OpenAPI** Specification (OAS). The [OAS](https://swagger.io/resources/open-api) defines a standard, language-agnostic interface that is used by software developers to implement [REST APIs](https://en.wikipedia.org/wiki/Overview_of_RESTful_API_Description_Languages). + +!!! Attention "Framework interdependency, releases and alternative models" + + In principle, this dual system allows for different Models (in other domains outside of the Beacon v2 realm, e.g. "Imaging Beacon" to be built using the same Framework. However, in the current context of Beacon v2, we consider the two elements interdependent and likely to be updated together for subsequent major versions (e.g. from v2 to v3). + ## Informations for Different Types of Beacon Users The Beacon documentation provides information for different types of users, diff --git a/docs/records.md b/docs/records.md new file mode 100644 index 000000000..b473e8cc9 --- /dev/null +++ b/docs/records.md @@ -0,0 +1,28 @@ +# Model defined records + +A beacon instance will allow to retrieve data - in contrast to the aggregated +boolean and count responses - if it supports `record` granularity. The type of +document(s) is selected either through the [REST path](/rest-api/) +or by specifying the entity through the `requestedEntityId`. + +While any beacon can in principle choose its own data model - and thereby the +schemas of records it supports - for biomedical genomics beacons we recommend the +support of the Beacon default data model + +## Beacon Default Data Model + +The Beacon v2 default data model provides a set of schemas for common data entities with +a focus on biomedical genomics (although neither specific to medical application or human genomics _per se_). + +In contrast to earlier versions of the protocol, the Beacon v2 default models provide +the technical blueprint for rich, structured data responses to Beacon queries, such as +annotated genomic variations, biosamples from which matched variants were retrieved +or data about individuals and study cohorts, where available and authorized. + +Detailed information is available through the [Models Introduction](/models/#introduction) +and the default schemas documented from there. + +## Alternative Data Models + + In principle, the separation of framework and models allows for different models in domains + outside of the genomics focussed Beacon v2 realm, e.g. “Imaging Beacon”, to be built using the same Framework. diff --git a/mkdocs.yaml b/mkdocs.yaml index 01888f1e4..97fc31882 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -56,17 +56,19 @@ markdown_extensions: nav: - Introduction: - - General Introduction: index - - What is Beacon v2?: what-is-beacon-v2 - - Beacon Flavours: beacon-flavours + - Introducing Beacon: / + - Beacon Types: beacon-flavours - Security: security - Networks: networks - FAQ: FAQ - Changes: bugs-changes-log - - Querying Beacons: - - REST API: rest-api + - Data Discovery: - Genomic Queries: variant-queries - Phenotypes and More...: /filters/#using-filters-in-queries + - Data Delivery: + - Biosamples, Variants...: records + - Data Handovers: handovers + - REST API: rest-api - 'Implement & Deploy a Beacon': - Implementations Options: implementations-options - Standards Integration: formats-standards From 8d72492403b3a66fd79d2432ec5e19569c43713a Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Sun, 11 Jun 2023 17:39:56 +0200 Subject: [PATCH 23/77] documentation restructuring and additions see "changes" on the site --- docs/FAQ.md | 10 ++-- docs/beacon-flavours.md | 2 +- docs/bugs-changes-log.md | 16 ++++++- docs/css/theme_overrides.css | 20 +++++++- docs/index.md | 69 ++++++++++++++++----------- docs/what-is-beacon-v2.md | 25 ---------- mkdocs.yaml | 92 +++++++++++++++++++----------------- 7 files changed, 130 insertions(+), 104 deletions(-) delete mode 100644 docs/what-is-beacon-v2.md diff --git a/docs/FAQ.md b/docs/FAQ.md index 262c2e81b..93f331662 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -72,7 +72,7 @@ } ``` - ##### last change 2023-02-17 by Michael Baudis [:fontawesome-brands-github:](https://github.com/mbaudis) + ###### last change 2023-02-17 @mbaudis ??? faq "Is it `Beacon` or `beacon`?" @@ -80,7 +80,7 @@ components - while lower case `beacons` are instances of these, _i.e._ individual resources using the protocol. - ##### last change 2022-10-01 by Michael Baudis [:fontawesome-brands-github:](https://github.com/mbaudis) + ###### last change 2022-10-01 by @mbaudis ??? faq "What types of genomic variants are supported in Beacon queries?" @@ -100,7 +100,7 @@ provides information about use and expected interpretation of `variantType` values, specifically for copy number variations. - ##### last change 2022-12-14 by Michael Baudis [:fontawesome-brands-github:](https://github.com/mbaudis) + ###### last change 2022-12-14 @mbaudis ??? faq "How can I add e.g. an age limit to a query for a disease?" @@ -119,9 +119,9 @@ However, different scenarios may be supported (e.g. `EFO_0005056:<=P1Y6M` for an "age at death" scenario). - ##### last change 2023-05-31 by Michael Baudis [:fontawesome-brands-github:](https://github.com/mbaudis) + ###### last change 2023-05-31 by @mbaudis -??? faq "How can I handle haplotype queries & representation in Beacon v2?"
" +??? faq "How can I handle haplotype queries & representation in Beacon v2? " #### Queries diff --git a/docs/beacon-flavours.md b/docs/beacon-flavours.md index c191b3a43..cb8a7b6cd 100644 --- a/docs/beacon-flavours.md +++ b/docs/beacon-flavours.md @@ -1,7 +1,7 @@ # Beacon "Flavours" !!! Note "About UI" - Most of the information that you will find here is related to the [Beacon v2 specification](./what-is-beacon-v2.md). For that reason, the examples are shown as REST API requests/responses in the form of [JSON](https://www.json.org/json-en.html). If you are only interested in using beacon with a **graphical interface** please visit the [implementations](implementations-options.md) page. + Most of the information that you will find here is related to the [Beacon v2 specification](/). For that reason, the examples are shown as REST API requests/responses in the form of [JSON](https://www.json.org/json-en.html). If you are only interested in using beacon with a **graphical interface** please visit the [implementations](implementations-options.md) page. While the original Beacon v1 only provided Boolean (_i.e._ **YES/NO**) responses on queries for the existence of specific genomic variants, Beacon v2 is a flexible diff --git a/docs/bugs-changes-log.md b/docs/bugs-changes-log.md index 2b8a3f67b..c9c6e0bc9 100644 --- a/docs/bugs-changes-log.md +++ b/docs/bugs-changes-log.md @@ -9,7 +9,6 @@ of the Beacon project site(s) as well as with overarching repository organizatio * [x] re-structuring of [Framework page](framework.md) - [ ] add part about necessary files, dependening on installation type (e.g. if not needing to support OpenAPI) -* [x] fix https (probably @mbaudis has to do some registrar configuration...) * [ ] add more [Implementations](other-implementations.md) * [ ] extend [Query documentation](variant-queries.md) - [x] expand the table comparing different "variant types" @@ -17,6 +16,17 @@ of the Beacon project site(s) as well as with overarching repository organizatio ### Changes +#### 2023-06-12: Restructured and extended documentation + +* new separation of navigation areas into "Introducing Beacon", "Using Beacons", + "Creating Beacons" and "Beacon Development", with subtopics such as "Data Discovery", + "Data Delivery" ... +* combined "what-is-beacon-v2" into rewritten index page +* new pages for "Data Delivery": [Biosamples, Variants...](/records/) and + [Data Handovers](/handovers/) - so far limited content + +###### @mbaudis + #### 2023-06-04: Improved filter documentation & HTTPS * extended & clarified "filters" documentation @@ -24,11 +34,15 @@ of the Beacon project site(s) as well as with overarching repository organizatio - example for pseudo-numerical [value queries](/filters/#pseudo-numerical-value-queries) in `GET` context * fixed `HTTPS` issue (by brute-forcing all links on site to `https://`) +###### @mbaudis + #### 2023-03-14: New `website-docs` branch To protect the code branches we are using now a separate ``website-docs`` branch in `beacon-v2` for documentation website updates. Please make sure all documentation edits happen there! +###### @mbaudis + #### 2022-06-20: Retiring of `beacon-framework-v2` and `beacon-v2-Models` repos * all issues and PRs were either resolved or transferred to this repository diff --git a/docs/css/theme_overrides.css b/docs/css/theme_overrides.css index f41089f98..9dccbd298 100644 --- a/docs/css/theme_overrides.css +++ b/docs/css/theme_overrides.css @@ -3,7 +3,7 @@ } .md-grid { - max-width: 1200px; + max-width: 1024px; } .md-header__source { @@ -12,6 +12,24 @@ background-position: right; } +div.figcaption { + text-align: justify; + line-height: 1.2em; + font-size: 0.8em; + margin: 0 30px 18px 30px; +} + +.md-typeset h1 { + line-height: 1.2em; + margin: 0 0 24px 0; +} + +.md-typeset ul li { + line-height: 1.4em; + margin-bottom: 0.2em; +} + + h2 { color: var(--md-accent-fg-color); border-top: var(--md-accent-fg-color) thin solid; diff --git a/docs/index.md b/docs/index.md index e91d159e1..5f5682d43 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,43 +1,58 @@ -# Welcome to the Beacon v2 Documentation +# Welcome to the Beacon Documentation -!!! Note "A Standard of the Global Alliance for Genomics and Health GA4GH" +Beacon v2 is a **protocol and specification** established by the **Global Alliance for Genomics and Health** ([GA4GH](https://www.ga4gh.org)) that defines an open standard for the +discovery of genomic (and phenoclinic) data in biomedical research and clinical applications. +Beacon facilitates the discovery of genomic variants and biomedical +data in single or distributed resources with the goal to empower _federated_ data +models - _i.e._ the discovery (and potential retrieval) of data from different +orgnisational and geographic locations. - On [2022-04-21](formats-standards/#dates-and-times) Beacon v2 has been approved as an official [GA4GH standard](https://www.ga4gh.org/) through the GA4GH steering committee. +
+![Beacon v2 Cartoon](img/Beacon-Networks-v2-graphics/Beacon-Networks-v2-graphics-Michael.003.png){: style="width: 600px; margin-top: -30px; margin-bottom: -30px;" } +
+
Concept behind the Beacon v2 specification The protocol defines a framework + for queries potentially containing genomic, phenotypic, clinical and techmical parameters. +While all beacons support the minimal response of "yes / no" upon a query, Beacon v2 +enables rich responses including detailed information about samples and experiments if +supported by the individual resource and in the given context of security and authorisation.
-With growing interest from the community in the implementation of the Beacon protocol -into resources and workflows, the major 2.0 release in 2022 introduced a large range of -[new features](what-is-beacon-v2.md) which were considered important by the community. +The Beacon specification is developed by an international team of sientists and +technology experts, as a product of the [GA4GH Discovery work stream](https://ga4gh-discovery.github.io) +and with major support from the European bioinformatics infrastructure organization +[ELIXIR](https://elixir-europe.org). -!!! Warn "Move to Beacon v2" +The current version of the protocol is **Beacon v2** represents a complete revision of +the original code base and introduced a number of powerful new features which were +considered important by the community such as: + +* extended and clearer specified [genomic variation queries](/variant-queries), including patterns (wildcards) and region queries (i.e. returning variants within a genomic/chromosomal region) +* retrieving information about samples or subject data related to e.g. phenotypes or + other biomedical parameters, depending on the existence of the required [authentication and authorization](/security/) +* powerful [_filters_](/filters/), primarily based on CURIE terms for ontologies and references, including options to control the use of hierarchical terms or the precision of term matching +* scoped data delivery (e.g. matched variant details or sample information) as part of + Beacon responses using its [data model](/records/) or through [_handover_](/handovers/) protocols + +!!! warning "Move to Beacon v2!" + + On [2022-04-21](formats-standards/#dates-and-times) Beacon v2 has been approved as an official [GA4GH standard](https://www.ga4gh.org/) through the GA4GH steering committee. With the release of Beacon v2 implementations of v1 and earlier are not longer supported. Deployers of Beacon instances or networks are advised to migrate to v2 of the standard. The functionality of Beacon v1 [can be easily implemented in v2](/FAQ/#v1-emulation). -
- ![Beacon v2 Cartoon](img/Beacon-Networks-v2-graphics/Beacon-Networks-v2-graphics-Michael.003.png){ width="750" } -
Beacon v2 specification
-
- -The core documentation (i.e. this document) can be found on [here](https://docs.genomebeacons.org). Additional -information about the Beacon project - including news, events, publications - is available -through the website [beacon-project.io](https://beacon-project.io). - -## What is Beacon v2? +This website represents information about the Beacon protocol, its use for **data +discovery** and **data delivery** but also about ways towards +its implementation to "**beaconize**" genomics datasets and resources as well as discussions +of the technical details of the Beacon [**framework**](/framework/) and data [**model**](/models/). -Beacon v2 is a **protocol/specification** established by the **Global Alliance for Genomics and Health initiative** ([GA4GH](https://www.ga4gh.org)) that defines an open standard for federated discovery of genomic (and phenoclinic) data in biomedical research and clinical applications. +Additional information about the Beacon project - including news, events, publications - is available +through the separate website at [beacon-project.io](https://beacon-project.io). !!! Important "Historical Tip" - Originally, the Beacon protocol (versions 0 and 1) allowed researchers to get information about the presence/absence of a given, specific, genomic mutation in a set of data, from patients of a given disease or from the population in general. - ![Beacon v1](https://beacon-project.io/assets/img/Beacon-v1.png) - -The current version of the protocol is **v2** and introduces new features which were considered important by the community such as: - -* extended and clearer specified [genomic variation queries](/variant-queries), including patterns (wildcards) and region queries (i.e. returning variants within a genomic/chromosomal region) -* get a list of samples related to a phenotype, provided the required [authentication or authorization](/security) -* powerful [_filters_](/filters), primarily based on CURIE terms for ontologies and references, including options to control the use of hierarchical terms or the precision of term matching -* scoped data delivery (e.g. matched variant details or sample information) as part of Beacon responses or through _handover_ protocols + Originally, the Beacon protocol (versions 0 and 1) allowed researchers to get information about the presence/absence of a given, specific, genomic mutation in a set of data, from patients of a given disease or from the population in general. Early versions of Beacon did not support + query parameters beyond genomic variations and did provide ways for the optional + retrieval of matched recors. ## Components diff --git a/docs/what-is-beacon-v2.md b/docs/what-is-beacon-v2.md deleted file mode 100644 index 3b5db255c..000000000 --- a/docs/what-is-beacon-v2.md +++ /dev/null @@ -1,25 +0,0 @@ -## Summary - -Beacon v2 is a **protocol/specification** established by the **Global Alliance for Genomics and Health initiative** ([GA4GH](https://www.ga4gh.org)) that defines an open standard for federated discovery of genomic (and phenoclinic) data in biomedical research and clinical applications. - -!!! Important "Historical Tip" - - Originally, the Beacon protocol (versions 0 and 1) allowed researchers to get information about the presence/absence of a given, specific, genomic mutation in a set of data, from patients of a given disease or from the population in general. - ![Beacon v1](https://beacon-project.io/assets/img/Beacon-v1.png) - -The current version of the protocol is **v2** and introduces new features which were considered important by the community such as: - -* extended and clearer specified [genomic variation queries](/variant-queries), including patterns (wildcards) and region queries (i.e. returning variants within a genomic/chromosomal region) -* get a list of samples related to a phenotype, provided the required [authentication or authorization](/security) -* powerful [_filters_](/filters), primarily based on CURIE terms for ontologies and references, including options to control the use of hierarchical terms or the precision of term matching -* scoped data delivery (e.g. matched variant details or sample information) as part of Beacon responses or through _handover_ protocols - -## Components - -Beacon v2 consists of two components, the **_Framework_** and the **_Models_**. - -The [Framework](framework.md) {{config.repo_framework_icon}} contains the format for the requests and responses, whereas the [Models](models.md) {{config.repo_models_icon}} define the [structure](https://json-schema.org/specification-links.html#2020-12) of the biological data response. The overall function of these components is to provide the instructions to design a **REST API** (REpresentational State Transfer Application Programming Interface) with **OpenAPI** Specification (OAS). The [OAS](https://swagger.io/resources/open-api) defines a standard, language-agnostic interface that is used by software developers to implement [REST APIs](https://en.wikipedia.org/wiki/Overview_of_RESTful_API_Description_Languages). - -!!! Attention "Framework interdependency, releases and alternative models" - - In principle, this dual system allows for different Models (in other domains outside of the Beacon v2 realm, e.g. "Imaging Beacon" to be built using the same Framework. However, in the current context of Beacon v2, we consider the two elements interdependent and likely to be updated together for subsequent major versions (e.g. from v2 to v3). diff --git a/mkdocs.yaml b/mkdocs.yaml index 97fc31882..2a06a5483 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -9,6 +9,53 @@ edit_uri: edit/main/docs/ repo_framework_icon: " [:fontawesome-brands-github:](https://github.com/ga4gh-beacon/beacon-v2/tree/main/framework/src)" repo_models_icon: " [:fontawesome-brands-github:](https://github.com/ga4gh-beacon/beacon-v2/tree/main/models/src)" +#<----------------------------- Navigation -----------------------------------># + +nav: + - Introducing Beacon: + - Overview: + - About Beacon: / + - Beacon Types: beacon-flavours + - Security: security + - Beacon Networks: networks + - FAQ: FAQ + - Changes: bugs-changes-log + - Beacon News ↗: https://beacon-project.io/news/ + - Using Beacons: + - Data Discovery: + - Genomic Queries: variant-queries + - Phenotypes and More...: /filters/#using-filters-in-queries + - Data Delivery: + - Biosamples, Variants...: records + - Data Handovers: handovers + - REST API: rest-api + - 'Creating Beacons': + - Implementations Options: implementations-options + - Implementation Examples: + - Reference Implementation ↗: https://b2ri-documentation.readthedocs.io/en/latest/ + - Others: other-implementations + - Standards Integration: formats-standards + - Filters: filters + - Beacon Components: + - Framework: framework + - Beacon Data Model: models + - Default Schemas: + - Analyses: schemas-md/analyses_defaultSchema + - Biosamples: schemas-md/biosamples_defaultSchema + - Cohorts: schemas-md/cohorts_defaultSchema + - Datasets: schemas-md/datasets_defaultSchema + - Genomic Variations: schemas-md/genomicVariations_defaultSchema + - Individuals: schemas-md/individuals_defaultSchema + - Runs: schemas-md/runs_defaultSchema + - Terms List: schemas-md/beacon_terms + - Beacon Development: + - How to Contribute: contribute + - Repository and Branch Organization: code-organization + - Github Repositories ↗: https://github.com/ga4gh-beacon/ + # - Download PDF: pdf/beacon.pdf + +#<--------------------------- / Navigation -----------------------------------># + extra_css: [css/theme_overrides.css] plugins: @@ -17,7 +64,7 @@ plugins: # author: Beacon API Development Team # output_path: pdf/beacon.pdf - macros - - mermaid2 + # - mermaid2 markdown_extensions: - toc: @@ -54,49 +101,6 @@ markdown_extensions: class: mermaid format: !!python/name:mermaid2.fence_mermaid -nav: - - Introduction: - - Introducing Beacon: / - - Beacon Types: beacon-flavours - - Security: security - - Networks: networks - - FAQ: FAQ - - Changes: bugs-changes-log - - Data Discovery: - - Genomic Queries: variant-queries - - Phenotypes and More...: /filters/#using-filters-in-queries - - Data Delivery: - - Biosamples, Variants...: records - - Data Handovers: handovers - - REST API: rest-api - - 'Implement & Deploy a Beacon': - - Implementations Options: implementations-options - - Standards Integration: formats-standards - - Filters: filters - - Beacon Implementations: - - Reference Implementation ↗: https://b2ri-documentation.readthedocs.io/en/latest/ - - Others: other-implementations - - Beacon Components: - - Framework: framework - - Models: - - Introduction: models - - Default Schemas: - - Analyses: schemas-md/analyses_defaultSchema - - Biosamples: schemas-md/biosamples_defaultSchema - - Cohorts: schemas-md/cohorts_defaultSchema - - Datasets: schemas-md/datasets_defaultSchema - - Genomic Variations: schemas-md/genomicVariations_defaultSchema - - Individuals: schemas-md/individuals_defaultSchema - - Runs: schemas-md/runs_defaultSchema - - Terms List: schemas-md/beacon_terms - - Beacon Development: - - How to Contribute: contribute - - Repository and Branch Organization: code-organization - - Github Repositories ↗: https://github.com/ga4gh-beacon/ - - External Links: - - Beacon Project ↗: https://beacon-project.io - # - Download PDF: pdf/beacon.pdf - theme: name: material palette: From ac3e038ab648bfb6a0b1cad92ba7c292cd12a9f8 Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Mon, 12 Jun 2023 06:45:23 -0700 Subject: [PATCH 24/77] rename/restructure changes page --- CHANGELOG.md | 2 +- README.md | 2 +- docs/{bugs-changes-log.md => changes-todo.md} | 83 ++++++++++--------- mkdocs.yaml | 2 +- 4 files changed, 46 insertions(+), 43 deletions(-) rename docs/{bugs-changes-log.md => changes-todo.md} (84%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f94b2408..4612940bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Updated `docs`: - `filters.md` - `variant-queries.md` - - `bugs-changes-log.md` + - `changes-todo.md` - `ComplexValue.md` - `README.md` - Added missing descriptions to models properties (see issue #42) diff --git a/README.md b/README.md index 5da854bf5..e54f57934 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ There is a set of tools in [`/bin`](./bin/) to facilitate the conversion. ATM, a ### Changes -* change notes with respect to the repository & documentation are now in [docs.genomebeacons.org](https://docs.genomebeacons.org/bugs-changes-log/) +* change notes with respect to the repository & documentation are now in [docs.genomebeacons.org](https://docs.genomebeacons.org/changes-todo/) * NOTE: on 2022-06-20 the previous development repositories have been archived: - ARCHIVE - [beacon-framework-v2](https://github.com/ga4gh-beacon/beacon-framework-v2) - ARCHIVE - [beacon-v2-Models](https://github.com/ga4gh-beacon/beacon-v2-Models) diff --git a/docs/bugs-changes-log.md b/docs/changes-todo.md similarity index 84% rename from docs/bugs-changes-log.md rename to docs/changes-todo.md index c9c6e0bc9..68b1f4713 100644 --- a/docs/bugs-changes-log.md +++ b/docs/changes-todo.md @@ -3,20 +3,9 @@ This page only lists changes w/ regard to the documentation and general organization of the Beacon project site(s) as well as with overarching repository organization. -## TODO +## Changes - - -* [x] re-structuring of [Framework page](framework.md) - - [ ] add part about necessary files, dependening on installation type (e.g. if not needing to support OpenAPI) -* [ ] add more [Implementations](other-implementations.md) -* [ ] extend [Query documentation](variant-queries.md) - - [x] expand the table comparing different "variant types" - - [ ] use more content from the variant scouts document - -### Changes - -#### 2023-06-12: Restructured and extended documentation +### 2023-06-12: Restructured and extended documentation * new separation of navigation areas into "Introducing Beacon", "Using Beacons", "Creating Beacons" and "Beacon Development", with subtopics such as "Data Discovery", @@ -25,83 +14,83 @@ of the Beacon project site(s) as well as with overarching repository organizatio * new pages for "Data Delivery": [Biosamples, Variants...](/records/) and [Data Handovers](/handovers/) - so far limited content -###### @mbaudis +@mbaudis -#### 2023-06-04: Improved filter documentation & HTTPS +### 2023-06-04: Improved filter documentation & HTTPS * extended & clarified "filters" documentation - [filter types](/filters/#filter-types) in line with specification - example for pseudo-numerical [value queries](/filters/#pseudo-numerical-value-queries) in `GET` context * fixed `HTTPS` issue (by brute-forcing all links on site to `https://`) -###### @mbaudis +@mbaudis -#### 2023-03-14: New `website-docs` branch +### 2023-03-14: New `website-docs` branch To protect the code branches we are using now a separate ``website-docs`` branch in `beacon-v2` for documentation website updates. Please make sure all documentation edits happen there! -###### @mbaudis +@mbaudis -#### 2022-06-20: Retiring of `beacon-framework-v2` and `beacon-v2-Models` repos +### 2022-06-20: Retiring of `beacon-framework-v2` and `beacon-v2-Models` repos * all issues and PRs were either resolved or transferred to this repository * [x] repos were clearly labeled as `archived` w/ pointers to this one here and archived (_i.e._ set to read only) * also archiving of the `implementations-v2` repository (part of documentation) -#### 2022-05-11: Retiring ReadTheDocs configuration & more +### 2022-05-11: Retiring ReadTheDocs configuration & more * removed ReadTheDocs configuration files * added some "how to implement" instructions -#### 2022-04-21: GA4GH approval notice +### 2022-04-21: GA4GH approval notice -#### 2022-04-18: Documentation updates +### 2022-04-18: Documentation updates * Shuffled small fragments to facilitate comprehension. -#### 2022-04-17: Documentation updates +### 2022-04-17: Documentation updates * Updated default schemas tables according to the newest changes. * Moved `filters.md` from section _Beacon Components_ to _Implement..._. * Dismissed pages w/o content (`_rest-api.md` and `_tips-for-implementers.md`). * Dismissed link to RTD version (deprecated). -#### 2022-04-01: Documentation updates +### 2022-04-01: Documentation updates * Partial update of Default schemas Tables (still work in progress) * Updated `bin` files that parse JSON schemas -#### 2022-03-30: Documentation updates +### 2022-03-30: Documentation updates * Updated diagram in [Models](models.md#Introduction) page. * Removal of some outdated text, e.g. reference to TEMPLATE model (for now) * continuous updates from upstream -#### 2022-03-28: Documentation updates +### 2022-03-28: Documentation updates * added content to the [Standards](formats-standards.md) page (VRS, Phenopackets, coordinates) * [Queries](variant-queries.md) page now with comparison table for (some) variant type terms -#### 2022-03-25: Miscellanea changes in `docs/*.md` +### 2022-03-25: Miscellanea changes in `docs/*.md` * Changes in multiple Markdown pages. * Moved from `mermaid` to `mermaid2` plugin. -#### 2022-03-24: Retiring Separate _Implementations_ Repository +### 2022-03-24: Retiring Separate _Implementations_ Repository * Started adding content to pages such as `networks.md and `roles.md` * Moved pages to different locations in navigation. Created `security.md` under *Beacon Types*. * Example implementations have been moved from the [`implementations-v2` repository](https://github.com/ga4gh-beacon/implementations-v2) to the [Beacon v2 Documentation](https://github.com/ga4gh-beacon/beacon-v2/edit/main/docs/implementations/) - web [access here](https://docs.genomebeacons.org/other-implementations/). -#### 2022-03-23: Name Change to `beacon-v2` +### 2022-03-23: Name Change to `beacon-v2` * The repository name and file paths have been changed from `beacon-v2-unity-testing` to `beacon-v2`. * Added miscellanea suggestions from Jorge (not all of them). -#### 2022-03-22: More Reorganization of Navigation +### 2022-03-22: More Reorganization of Navigation * Moved content from `implementations-and-networks` to `other-implementations` and left only the "Networks" Part. * Added `mkdocs-mermaid2-plugin` both to `mkdocs.yaml` and to github workflows. @@ -109,27 +98,27 @@ to `beacon-v2`. * Reorganization of navigation * Added pages: [Tips for Implementers](_tips-for-implementers.md) -#### 2022-03-21: Reorganization of navigation +### 2022-03-21: Reorganization of navigation * Reorganization of navigation * Deleted page `implement-and-deploy.md` * Added pages: [What is Beacon v2](what-is-beacon-v2.md) and [Implementation options](implementations-options.md) * [Filters](filters.md) Page Updated -#### 2022-03-18: Macros and Variables for Documentation pages +### 2022-03-18: Macros and Variables for Documentation pages The `mkdocs-macros-plugin` has been activated, allowing the use of site-wide variables: * `repo_model_url: https://github.com/ga4gh-beacon/beacon-v2/tree/main/models/src` * this can be used inline as `{{config.repo_model_url}}` -#### 2022-03-16: Documentation Content and Formats Updates +### 2022-03-16: Documentation Content and Formats Updates * [x] addition of more variant query examples * [x] new landing pages for `Implementations and Networks` and [Standards Integration](formats-standards.md) * [x] many adjustments to documentation structure, appearance and representation (e.g. content tabs for query examples) -#### 2022-03-14: Documentation in Repository +### 2022-03-14: Documentation in Repository As of today the new/emerging Beacon v2 documentation is meintained in this repository. We're testing rendered versions (same text/code base) through Github actions ([here](https://beacon-project.io/beacon-v2/)) and [ReadTheDocs](https://beacon-v2-unity.readthedocs.io/en/latest/). @@ -139,11 +128,11 @@ sub-domain to the Github hosted version of the rendered documentation * [x] merging of previous separate documentation repository content from _beacon-v2-schema-documentation_ in the "unity" repository and archiving of the old one -#### 2022-03-11: Removing `yaml` export version +### 2022-03-11: Removing `yaml` export version Since moving to source in YAML the existence of a separate `yaml` export seems unnecessary & maybe confusing. Removed. -#### 2022-03-09: Nesting models +### 2022-03-09: Nesting models The structure of the `models` directory has now be changed to have the default model as one of possibly multiple options as per the discussions in [#1](https://github.com/ga4gh-beacon/beacon-v2/issues/1). @@ -175,7 +164,7 @@ beacon ... ``` -#### 2022-03-08: Automated pulling from current origin repos +### 2022-03-08: Automated pulling from current origin repos * added simple pull commands to the conversion for automatic update to the donor repos @@ -186,18 +175,32 @@ git -C $BEACONFRAMEWORKPATH pull * updated to current crop of PRs -#### 2022-02-24: Path fixes +### 2022-02-24: Path fixes * changed the path replacements to the current repo, resulting in e.g. -#### 2022-02-23: Re-tool +### 2022-02-23: Re-tool * [x] replacement of the previopus general `yamler.py` with a dedicated `beaconYamler.py` * [x] moving replacements to [bin/config.yaml](https://github.com/ga4gh-beacon/beacon-v2/bin/config.yaml) * [x] requirement for complete arguments (in and out paths, in- and out formats) - see [bin/yamlerRunner.sh](https://github.com/ga4gh-beacon/beacon-v2/bin/yamlerRunner.sh) -#### 2022-02-22: Creation of repository +### 2022-02-22: Creation of repository * [x] design of directory structure * [x] test tooling & population with auto-converted files +-------------------------------------------------------------------------------- + +## TODO + + + +* [x] re-structuring of [Framework page](framework.md) + - [ ] add part about necessary files, dependening on installation type (e.g. if not needing to support OpenAPI) +* [ ] add more [Implementations](other-implementations.md) +* [ ] extend [Query documentation](variant-queries.md) + - [x] expand the table comparing different "variant types" + - [ ] use more content from the variant scouts document + + diff --git a/mkdocs.yaml b/mkdocs.yaml index 2a06a5483..bd8f9501d 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -19,7 +19,7 @@ nav: - Security: security - Beacon Networks: networks - FAQ: FAQ - - Changes: bugs-changes-log + - Changes: changes-todo - Beacon News ↗: https://beacon-project.io/news/ - Using Beacons: - Data Discovery: From 278648eabf3b1ae05ef8089a2c8d083241fd3021 Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:06:05 -0700 Subject: [PATCH 25/77] Update records.md --- docs/records.md | 92 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/docs/records.md b/docs/records.md index b473e8cc9..edf26a028 100644 --- a/docs/records.md +++ b/docs/records.md @@ -22,6 +22,98 @@ or data about individuals and study cohorts, where available and authorized. Detailed information is available through the [Models Introduction](/models/#introduction) and the default schemas documented from there. +### Examples + +=== "Biosample in Beacon v2.0" + + This example is a single biosample response, e.g. as the result of a REST path + call (`.../biosamples/{id}/`). The response just demonstrates some of the available + biosample parameters and removes some technical/meta information for clarity. + Also, the sample contains fields which are **not** defined in the default + schema (such as `icdoMorphology`...); but although the use of custom fields is discouraged to + enhance interoperability, the use of `additionalProperties` is allowed so the + data itself is schema conform. + + ``` + { + "meta": { + "apiVersion": "v2.0.0", + "beaconId": "org.progenetix", + "receivedRequestSummary": { + ... + }, + "returnedGranularity": "record", + "returnedSchemas": [ + { + "entityType": "biosample", + "schema": "https://progenetix.org/services/schemas/biosample/" + } + ], + }, + "responseSummary": { + "exists": true, + "numTotalResults": 1 + }, + "response": { + "resultSets": [ + { + "exists": true, + "setType": "dataset", + "id": "progenetix", + "resultsCount": 1, + "results": [ + { + "id": "pgxbs-kftva5c9", + "individualId": "pgxind-kftx25hb", + "notes": "Mantle cell lymphoma", + "biosampleStatus": { + "id": "EFO:0009656", + "label": "neoplastic sample" + }, + "collectionMoment": "P66Y", + "sampleOriginType": { + "id": "OBI:0001479", + "label": "specimen from organism" + }, + "dataUseConditions": { + "id": "DUO:0000004", + "label": "no restriction" + }, + "externalReferences": [ + { + "id": "geo:GSE13331", + "reference": "https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE13331" + } + ], + "histologicalDiagnosis": { + "id": "NCIT:C4337", + "label": "Mantle Cell Lymphoma" + }, + "icdoMorphology": { + "id": "pgx:icdom-96733", + "label": "Mantle cell lymphoma" + }, + "icdoTopography": { + "id": "pgx:icdot-C77.9", + "label": "Lymph node, NOS" + }, + "pathologicalStage": { + "id": "NCIT:C92207", + "label": "Stage Unknown" + }, + "sampleOriginDetail": { + "id": "UBERON:0000029", + "label": "lymph node" + }, + "updated": "2020-09-10 17:44:04.888000" + } + ] + } + ] + } + } + ``` + ## Alternative Data Models In principle, the separation of framework and models allows for different models in domains From 87a17abd303dc9e9d9b12bddae94735596241218 Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:50:16 -0700 Subject: [PATCH 26/77] Update records.md --- docs/records.md | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/docs/records.md b/docs/records.md index edf26a028..ea75edd44 100644 --- a/docs/records.md +++ b/docs/records.md @@ -32,7 +32,7 @@ and the default schemas documented from there. Also, the sample contains fields which are **not** defined in the default schema (such as `icdoMorphology`...); but although the use of custom fields is discouraged to enhance interoperability, the use of `additionalProperties` is allowed so the - data itself is schema conform. + data itself remains schema conform. ``` { @@ -63,14 +63,14 @@ and the default schemas documented from there. "resultsCount": 1, "results": [ { - "id": "pgxbs-kftva5c9", - "individualId": "pgxind-kftx25hb", - "notes": "Mantle cell lymphoma", + "id": "pgxbs-kftvi9i0", + "individualId": "pgxind-kftvi9i0", + "notes": "Primary Tumor", "biosampleStatus": { "id": "EFO:0009656", "label": "neoplastic sample" }, - "collectionMoment": "P66Y", + "collectionMoment": "P44Y1M24D", "sampleOriginType": { "id": "OBI:0001479", "label": "specimen from organism" @@ -81,29 +81,41 @@ and the default schemas documented from there. }, "externalReferences": [ { - "id": "geo:GSE13331", - "reference": "https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE13331" + "id": "pgx:TCGA.933b9daf-a5bf-46cf-92b6-5ddd8279919c", + "label": "TCGA case_id" + }, + { + "id": "pgx:TCGA.TCGA-76-6663", + "label": "TCGA submitter_id" + }, + { + "id": "pgx:TCGA.005cb7ce-5050-43aa-85ff-cd56ed830535", + "label": "TCGA sample_id" + }, + { + "id": "pgx:TCGA.GBM", + "label": "TCGA GBM project" } ], "histologicalDiagnosis": { - "id": "NCIT:C4337", - "label": "Mantle Cell Lymphoma" + "id": "NCIT:C3058", + "label": "Glioblastoma" }, "icdoMorphology": { - "id": "pgx:icdom-96733", - "label": "Mantle cell lymphoma" + "id": "pgx:icdom-94403", + "label": "Glioblastoma, NOS" }, "icdoTopography": { - "id": "pgx:icdot-C77.9", - "label": "Lymph node, NOS" + "id": "pgx:icdot-C71.9", + "label": "Brain, NOS" }, "pathologicalStage": { "id": "NCIT:C92207", "label": "Stage Unknown" }, "sampleOriginDetail": { - "id": "UBERON:0000029", - "label": "lymph node" + "id": "UBERON:0000955", + "label": "brain" }, "updated": "2020-09-10 17:44:04.888000" } From 1c52ad2b8fdde644939fe995a0b41d605b149502 Mon Sep 17 00:00:00 2001 From: Jordi Rambla Date: Tue, 13 Jun 2023 11:09:26 +0200 Subject: [PATCH 27/77] Amending some examples --- docs/filters.md | 24 ++++----------------- framework/json/requests/filteringTerms.json | 22 +++++++++---------- 2 files changed, 15 insertions(+), 31 deletions(-) diff --git a/docs/filters.md b/docs/filters.md index dabe630d6..92d574314 100644 --- a/docs/filters.md +++ b/docs/filters.md @@ -41,7 +41,7 @@ Bio-ontology and custom term Filter types contain: ], "filterTerms": [ { - "type": "Human Phenotype Ontology", + "type": "ontologyTerm", "id": "HP:0008773", "label": "neoplasm of the lung" }, @@ -50,23 +50,6 @@ Bio-ontology and custom term Filter types contain: } ``` -Numerical value Filter types contain: - -* `type` = data type as 'numeric' (required) -* `id` = field id (required) -* `label` = field label (optional) - -``` -"filterTerms": [ - { - "type": "numeric", - "id": "PATO:000001", - "label": "age" - }, - ... -] -``` - Alphanumerical value Filter types contain: * `type` = data type as 'alphanumeric' (required) @@ -77,13 +60,14 @@ Alphanumerical value Filter types contain: "filterTerms": [ { "type": "alphanumeric", - "id": "HP:0032443", - "label": "past medical history" + "id": "PATO:0000011", + "label": "age" }, ... ] ``` + ## Using Filters in Queries For all query types, the logical `AND` is implied between Filters. The Filter `id` is required for all query types. diff --git a/framework/json/requests/filteringTerms.json b/framework/json/requests/filteringTerms.json index e513e28d4..f61c867f7 100644 --- a/framework/json/requests/filteringTerms.json +++ b/framework/json/requests/filteringTerms.json @@ -5,11 +5,11 @@ "AlphanumericFilter": { "description": "Filter results based on operators and values applied to alphanumeric fields.", "properties": { - "id": { - "description": "Field identfier to be queried.", - "example": "age", - "type": "string" - }, + "id": { + "description": "Field identfier to be queried.", + "example": "ageOfOnset", + "type": "string" + }, "operator": { "default": "=", "description": "Defines how the value relates to the field `id`.", @@ -26,7 +26,7 @@ }, "scope": { "description": "The entry type to which the filter applies", - "example": "biosamples", + "example": "individuals", "type": "string" }, "value": { @@ -50,11 +50,11 @@ "example": "demographic.ethnicity:asian", "type": "string" }, - "scope": { - "description": "The entry type to which the filter applies", - "example": "biosamples", - "type": "string" - } + "scope": { + "description": "The entry type to which the filter applies", + "example": "individuals", + "type": "string" + } }, "required": [ "id" From 23d49cc3976a8561dce849fcde90de7ca96772f3 Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Wed, 14 Jun 2023 07:22:26 -0700 Subject: [PATCH 28/77] fix yaml for filteringTerms Edits have to be done in YAML and then propagated to JSON using bin/yamlerRunner.sh --- framework/json/requests/filteringTerms.json | 20 ++++++++++---------- framework/src/requests/filteringTerms.yaml | 9 +++++---- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/framework/json/requests/filteringTerms.json b/framework/json/requests/filteringTerms.json index f61c867f7..3c0550f7f 100644 --- a/framework/json/requests/filteringTerms.json +++ b/framework/json/requests/filteringTerms.json @@ -5,11 +5,11 @@ "AlphanumericFilter": { "description": "Filter results based on operators and values applied to alphanumeric fields.", "properties": { - "id": { - "description": "Field identfier to be queried.", - "example": "ageOfOnset", - "type": "string" - }, + "id": { + "description": "Field identfier to be queried.", + "example": "ageOfOnset", + "type": "string" + }, "operator": { "default": "=", "description": "Defines how the value relates to the field `id`.", @@ -50,11 +50,11 @@ "example": "demographic.ethnicity:asian", "type": "string" }, - "scope": { - "description": "The entry type to which the filter applies", - "example": "individuals", - "type": "string" - } + "scope": { + "description": "The entry type to which the filter applies", + "example": "individuals", + "type": "string" + } }, "required": [ "id" diff --git a/framework/src/requests/filteringTerms.yaml b/framework/src/requests/filteringTerms.yaml index 66bae1332..23b7cddd0 100644 --- a/framework/src/requests/filteringTerms.yaml +++ b/framework/src/requests/filteringTerms.yaml @@ -59,7 +59,7 @@ definitions: id: type: string description: Field identfier to be queried. - example: age + example: ageOfOnset operator: type: string enum: @@ -74,14 +74,15 @@ definitions: example: '>' value: type: string - description: Alphanumeric search term to be used within the query which can + description: >- + Alphanumeric search term to be used within the query which can contain wildcard characters (%) to denote any number of unknown characters. Values can be assocatied with units if applicable. example: P70Y scope: type: string description: The entry type to which the filter applies - example: biosamples + example: individuals CustomFilter: type: object description: Filter results to include records that contain a custom term defined @@ -96,5 +97,5 @@ definitions: scope: type: string description: The entry type to which the filter applies - example: biosamples + example: individuals additionalProperties: true From bc666cd0440dff271879d5a2a4e9a90cd8c9ac1a Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Wed, 14 Jun 2023 07:27:56 -0700 Subject: [PATCH 29/77] link fix --- docs/other-implementations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/other-implementations.md b/docs/other-implementations.md index 0901d438f..9fddb67e8 100644 --- a/docs/other-implementations.md +++ b/docs/other-implementations.md @@ -20,10 +20,10 @@ such as CNV query options or handover data delivery. #### Technologies * MongoDB backend -* [`bycon`](https://github.com/progenetix/bycon/) Python-based full stack API / middleware +* [`bycon`](https://github.com/progenetix/bycon/) Python-based full stack API / middleware (documentation [here](https://bycon.progenetix.org/)) * [`progenetix-web`](https://github.com/progenetix/progenetix-web/) React based front-end (modular for Beacon instances as well as the whole Progenetix UI) -##### Link: [Documentation page]([implementations/org.progenetix.md](https://docs.progenetix.org/beaconplus/#beacon-v2-path-examples-in-progenetix)) for Progenetix REST paths +##### Link: [Documentation page](https://docs.progenetix.org/beaconplus/#beacon-v2-path-examples-in-progenetix) for Progenetix REST paths ### Cafe Variome From 16db543100221f40453f0dbe2950375fb65d58e3 Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Wed, 14 Jun 2023 07:32:22 -0700 Subject: [PATCH 30/77] comment broken Beacon link for http://clinbioinfosspa.es --- docs/other-implementations.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/other-implementations.md b/docs/other-implementations.md index 9fddb67e8..001730593 100644 --- a/docs/other-implementations.md +++ b/docs/other-implementations.md @@ -33,9 +33,11 @@ such as CNV query options or handover data delivery. ##### Link: [CNAG Beacon v2 API](https://playground.rd-connect.eu/beacon2/api) + ## Tips for New Implementers From c7cb88660084caa07ef6d9fb209dd694021f2fdd Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Wed, 14 Jun 2023 10:49:24 -0700 Subject: [PATCH 31/77] remove numeric example from doc --- docs/filters.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/filters.md b/docs/filters.md index 43e6e12af..44c5210bf 100644 --- a/docs/filters.md +++ b/docs/filters.md @@ -68,11 +68,6 @@ Alphanumerical value Filter types contain: ``` "filteringTerms": [ - { - "type": "numeric", - "id": "PATO:000001", - "label": "age" - }, { "type": "alphanumeric", "id": "PATO:0000011", @@ -82,7 +77,6 @@ Alphanumerical value Filter types contain: ] ``` - ## Using Filters in Queries For all query types, the logical `AND` is implied between Filters. The Filter `id` is required for all query types. From 01381e66659995a2dd6bdc33a91cf68ae8a74c5d Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Thu, 15 Jun 2023 15:47:06 -0700 Subject: [PATCH 32/77] Update filters.md --- docs/filters.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/filters.md b/docs/filters.md index 44c5210bf..db8de74b7 100644 --- a/docs/filters.md +++ b/docs/filters.md @@ -36,7 +36,7 @@ Bio-ontology and custom term Filter types contain: * `id` = term id (required) * `label` = term label (optional) -``` +```json "response":{ "resources":[ { @@ -66,7 +66,7 @@ Alphanumerical value Filter types contain: * `id` = field id (required) * `label` = field label (optional) -``` +```json "filteringTerms": [ { "type": "alphanumeric", @@ -87,7 +87,7 @@ For all query types, the logical `AND` is implied between Filters. The Filter `i In this case general filter defaults apply (e.g. `{ "includeDescendantTerms": true }`). Generally, use of filters other than CURIE values for filter ids is discouraged. -### CURIE based filters query +### CURIE based filters query (type "OntologyFilters") !!! note "Hierarchical term expansion" @@ -119,7 +119,7 @@ Papillary Renal Cell Carcinoma (NCIT:C6975) from a publication identified throug ``` -### Modified hierarchical ontology query +#### Modified hierarchical ontology query A Beacon will query for entities associated with the submitted bio-ontology term(s), and by default, all descendent terms. The optional `includeDescendantTerms` parameter can be set to either `true` or `false`. The default and assumed value @@ -143,7 +143,7 @@ Request example of two filters, where one filter excludes matches with descenden ``` -### Semantic similarity query +#### Semantic similarity query A Beacon will query for entities that are associated with bio-ontology terms that are similar to the submitted terms. The Beacon API is agnostic to the semantic similarity model implemented by a Beacon and how a Beacon applies the relative thresholds of similarity. A semantic similarity query request contains the required `similarity` parameter with a value set to define the relative threshold level of `high`, `medium` or `low`. @@ -162,7 +162,7 @@ POST request example of two Filters using differing relative similarity threshol ] ``` -### (Pseudo-)numerical value queries +### Alphanumerical value queries A Beacon will query for quantitative properties when the required `operator` and numerical `value` parameters are set in the filters request. The `id` parameter @@ -172,6 +172,8 @@ and the `value` parameter provides the field query value. Equality and relationa operators (= < >) can be used between field name and field value pairs, and field values can be associated with units if applicable. +#### (Pseudo-)numerical value queries + ##### Example of a Filter for individuals over 70 years of age * age = PATO:0000011, age syntax as ISO 8601 @@ -207,7 +209,7 @@ use (e.g. the ISO values probably will be converted to some numerical format for database matches). -### Text matches +#### Text matches A Beacon will query free-text values within fields when the required `operator` and alphanumerical `value` parameters are set in the filters request. Queries can @@ -216,7 +218,7 @@ wildcards to match patterns within alphanumerical values. In all query classes, the `id` parameter identifies the field name, the `operator` parameter defines the operator to use, and the `value` parameter provides the field query value. -#### 'EXACT' value query +##### 'EXACT' value query The `operator` parameter is set to the equality (=) operator. @@ -248,11 +250,9 @@ POST request example to filter medical history free-text for any reference to ca ] ``` -#### 'NOT' value query - -The `operator` parameter is set to the logical not (!) operator. The `value` parameter should not be present in field value. The wildcard character can be used if required. +##### 'NOT' value query -##### Example to filter medical history free-text for records that do not include the query string +The `operator` parameter is set to the logical not (!) operator. The `value` parameter should not be present in field value. The wildcard character can be used if required. The following example shows how to filter medical history free-text for records that do not include the query string: === "GET" From 62d704d7190d1586fae17f25216cc965c3459aa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oriol=20L=C3=B3pez-Doriga?= Date: Fri, 16 Jun 2023 10:19:50 +0200 Subject: [PATCH 33/77] complexValue required type fixed --- models/json/beacon-v2-default-model/common/complexValue.json | 5 +---- models/src/beacon-v2-default-model/common/complexValue.yaml | 3 +-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/models/json/beacon-v2-default-model/common/complexValue.json b/models/json/beacon-v2-default-model/common/complexValue.json index 866070ad7..9d1c4a4b4 100644 --- a/models/json/beacon-v2-default-model/common/complexValue.json +++ b/models/json/beacon-v2-default-model/common/complexValue.json @@ -24,10 +24,7 @@ } } }, - "required": [ - "quantityType", - "quantity" - ] + "required": [ "typedQuantities" ] } }, "description": "Definition of a complex value class. Provenance: GA4GH Phenopackets v2 `TypedQuantity`", diff --git a/models/src/beacon-v2-default-model/common/complexValue.yaml b/models/src/beacon-v2-default-model/common/complexValue.yaml index 45048920f..a31ddf779 100644 --- a/models/src/beacon-v2-default-model/common/complexValue.yaml +++ b/models/src/beacon-v2-default-model/common/complexValue.yaml @@ -28,5 +28,4 @@ definitions: id: NCIT:C49670 label: Millimeter of Mercury required: - - quantityType - - quantity + - typedQuantities From cfec4965678333e1749a79b3ac6096ddf4968a36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oriol=20L=C3=B3pez-Doriga?= Date: Fri, 16 Jun 2023 12:28:04 +0200 Subject: [PATCH 34/77] fixed position of required --- .../json/beacon-v2-default-model/common/complexValue.json | 6 +++--- .../src/beacon-v2-default-model/common/complexValue.yaml | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/models/json/beacon-v2-default-model/common/complexValue.json b/models/json/beacon-v2-default-model/common/complexValue.json index 9d1c4a4b4..5c23cfd38 100644 --- a/models/json/beacon-v2-default-model/common/complexValue.json +++ b/models/json/beacon-v2-default-model/common/complexValue.json @@ -23,8 +23,7 @@ "label": "Systolic Blood Pressure" } } - }, - "required": [ "typedQuantities" ] + } } }, "description": "Definition of a complex value class. Provenance: GA4GH Phenopackets v2 `TypedQuantity`", @@ -35,7 +34,8 @@ "$ref": "#/definitions/TypedQuantity" }, "type": "array" - } + }, + "required": [ "typedQuantities" ] }, "title": "Complex Value", "type": "object" diff --git a/models/src/beacon-v2-default-model/common/complexValue.yaml b/models/src/beacon-v2-default-model/common/complexValue.yaml index a31ddf779..a50522490 100644 --- a/models/src/beacon-v2-default-model/common/complexValue.yaml +++ b/models/src/beacon-v2-default-model/common/complexValue.yaml @@ -9,6 +9,9 @@ properties: type: array items: $ref: '#/definitions/TypedQuantity' + required: + - typedQuantities + definitions: TypedQuantity: properties: @@ -26,6 +29,4 @@ definitions: quentity: unit: id: NCIT:C49670 - label: Millimeter of Mercury - required: - - typedQuantities + label: Millimeter of Mercury \ No newline at end of file From be4ff293c7b99d7b7e12ceb17d2df2756655dcee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oriol=20L=C3=B3pez-Doriga?= Date: Fri, 16 Jun 2023 13:29:07 +0200 Subject: [PATCH 35/77] added required again for quantityType --- .../json/beacon-v2-default-model/common/complexValue.json | 6 +++++- models/src/beacon-v2-default-model/common/complexValue.yaml | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/models/json/beacon-v2-default-model/common/complexValue.json b/models/json/beacon-v2-default-model/common/complexValue.json index 5c23cfd38..aba373e2f 100644 --- a/models/json/beacon-v2-default-model/common/complexValue.json +++ b/models/json/beacon-v2-default-model/common/complexValue.json @@ -23,7 +23,11 @@ "label": "Systolic Blood Pressure" } } - } + }, + "required": [ + "quantityType", + "quantity" + ] } }, "description": "Definition of a complex value class. Provenance: GA4GH Phenopackets v2 `TypedQuantity`", diff --git a/models/src/beacon-v2-default-model/common/complexValue.yaml b/models/src/beacon-v2-default-model/common/complexValue.yaml index a50522490..98207b12b 100644 --- a/models/src/beacon-v2-default-model/common/complexValue.yaml +++ b/models/src/beacon-v2-default-model/common/complexValue.yaml @@ -29,4 +29,7 @@ definitions: quentity: unit: id: NCIT:C49670 - label: Millimeter of Mercury \ No newline at end of file + label: Millimeter of Mercury + required: + - quantityType + - quantity \ No newline at end of file From 5b47a87236b304317ad1964d7a81c0a1f48f7a5a Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Sat, 17 Jun 2023 17:42:10 -0700 Subject: [PATCH 36/77] Update entryTypeDefinition.yaml The parameter descriptions in the EntryTypeDefinitions schema seem somewhat hard to parse and potentially misleading - this is a go at cleaning them up a bit. --- .../configuration/entryTypeDefinition.yaml | 51 +++++++++---------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/framework/src/configuration/entryTypeDefinition.yaml b/framework/src/configuration/entryTypeDefinition.yaml index 99f3ef974..4ca04013f 100644 --- a/framework/src/configuration/entryTypeDefinition.yaml +++ b/framework/src/configuration/entryTypeDefinition.yaml @@ -1,23 +1,22 @@ $schema: https://json-schema.org/draft/2020-12/schema title: '' -description: "Definition of an element or entry type including the Beacon v2 required\ - \ and suggested attributes. This schema purpose is to describe each type of entities\ - \ included in a Beacon, hence Beacon clients could have some metadata about such\ - \ entities.\n\nThe `id` attribute is the key that should be used in other parts\ - \ of the Beacon Model to allow Beacon clients to identify the different parts (e.g.\ - \ endpoints, filteringTerms, request parameters, etc.) that fully describe an entry\ - \ type." +description: >- + Definition of an element or entity, to describe each type of entity included in + a beacon. + The `id` attribute is the key that should be used in other parts of the data model + to allow Beacon clients to identify the different parts (e.g. endpoints, filteringTerms, + request parameters, etc.) that relvant for an entity. type: object -$comment: 'TO DO: The tagged parts should reference to `common/ontologizedElement.json`. - But that configuration fails to validate. Further investigation is required, but - should not affect the resulting schema.' properties: $schema: $ref: ../common/beaconCommonComponents.yaml#/definitions/$schema id: - $comments: ++++++ THIS IS THE START OF THE ontologized element ++++++ type: string description: A (unique) identifier of the element. + examples: + - biosample + - individual + - dataset name: type: string description: A distinctive name for the element. @@ -26,7 +25,6 @@ properties: description: A textual description for the element. ontologyTermForThisType: $ref: ../common/ontologyTerm.yaml - $comments: ++++++ THIS IS THE END OF THE ontologized element ++++++ partOfSpecification: description: This is label to group together entry types that are part of the same specification. @@ -42,25 +40,26 @@ properties: items: $ref: ../common/referenceToAnSchema.yaml aCollectionOf: - description: If the entry type is a collection of other entry types, (e.g. a Dataset - is a collection of Records), then this attribute must list the entry types that - could be included. One collection type could be defined as included more than - one entry type (e.g. a Dataset could include Individuals or Genomic Variants), - in such cases the entries are alternative, meaning that a given instance of - this entry type could be of only one of the types (e.g. a given Dataset contains - Individuals, while another Dataset could contain Genomic Variants, but not both - at once). + description: >- + If the entry type is a collection of other entities, (e.g. a Dataset + is a collection of Records), then this attribute must list the entities that + can be included. One _collection_ can include more than one entity + (e.g. a Dataset in teh Beacon cdefault model could include Individuals, Biosamples, + GenomicVariations, Analyses amnd Runs). In such cases in each individual + response (e.g. `resultSetsResponse` of collections of type "dataset") will + contain entries of a single entity type (e.g. biosamples) even if a dataset + may contain records of multiple types. includedConcepts: type: array $ref: ../common/basicElement.yaml filteringTerms: - description: Reference to the file with the list of filtering terms that could - be used to filter this concept in this instance of Beacon. The referenced file - could be used to populate the `filteringTerms`endpoint. Having it independently - should allow for updating the list of accepted filtering terms when it is necessary. + description: >- + Reference to the list of filtering terms that could be used to filter records + of this entity in this beacon. type: string - $comment: "TO DO: Double-check the proper way of referencing a path or relative\ - \ path. 'format: uri' is throwing validation errors for relative file paths" + $comment: >- + TO DO: Evaluate switch this to `url` or a more specific way for allowing + URLs and local file paths (is this necessary?). nonFilteredQueriesAllowed: $ref: ../common/beaconCommonComponents.yaml#/definitions/NonFilteredQueriesAllowed required: From 4d104cea56269284dd92f6cc8bb9c10c8556bc99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oriol=20L=C3=B3pez-Doriga?= Date: Mon, 19 Jun 2023 12:59:26 +0200 Subject: [PATCH 37/77] new gh actions --- .github/workflows/github-actions-demo-yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/workflows/github-actions-demo-yml diff --git a/.github/workflows/github-actions-demo-yml b/.github/workflows/github-actions-demo-yml new file mode 100644 index 000000000..8a9c1ffdf --- /dev/null +++ b/.github/workflows/github-actions-demo-yml @@ -0,0 +1,18 @@ +name: GitHub Actions Demo +run-name: ${{ github.actor }} is testing out GitHub Actions 🚀 +on: [push] +jobs: + Explore-GitHub-Actions: + runs-on: ubuntu-latest + steps: + - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." + - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" + - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." + - name: Check out repository code + uses: actions/checkout@v3 + - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." + - run: echo "🖥️ The workflow is now ready to test your code on the runner." + - name: List files in the repository + run: | + ls ${{ github.workspace }} + - run: echo "🍏 This job's status is ${{ job.status }}." \ No newline at end of file From 6aeb06ffebea6284c7b57f569b981bd08d4a081c Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Mon, 19 Jun 2023 13:11:35 +0200 Subject: [PATCH 38/77] Update entryTypeDefinition.json --- .../json/configuration/entryTypeDefinition.json | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/framework/json/configuration/entryTypeDefinition.json b/framework/json/configuration/entryTypeDefinition.json index 434bebcf6..13c094cc1 100644 --- a/framework/json/configuration/entryTypeDefinition.json +++ b/framework/json/configuration/entryTypeDefinition.json @@ -1,14 +1,13 @@ { - "$comment": "TO DO: The tagged parts should reference to `common/ontologizedElement.json`. But that configuration fails to validate. Further investigation is required, but should not affect the resulting schema.", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": true, - "description": "Definition of an element or entry type including the Beacon v2 required and suggested attributes. This schema purpose is to describe each type of entities included in a Beacon, hence Beacon clients could have some metadata about such entities.\n\nThe `id` attribute is the key that should be used in other parts of the Beacon Model to allow Beacon clients to identify the different parts (e.g. endpoints, filteringTerms, request parameters, etc.) that fully describe an entry type.", + "description": "Definition of an element or entity, to describe each type of entity included in a beacon. The `id` attribute is the key that should be used in other parts of the data model to allow Beacon clients to identify the different parts (e.g. endpoints, filteringTerms, request parameters, etc.) that relvant for an entity.", "properties": { "$schema": { "$ref": "../common/beaconCommonComponents.json#/definitions/$schema" }, "aCollectionOf": { - "description": "If the entry type is a collection of other entry types, (e.g. a Dataset is a collection of Records), then this attribute must list the entry types that could be included. One collection type could be defined as included more than one entry type (e.g. a Dataset could include Individuals or Genomic Variants), in such cases the entries are alternative, meaning that a given instance of this entry type could be of only one of the types (e.g. a given Dataset contains Individuals, while another Dataset could contain Genomic Variants, but not both at once).", + "description": "If the entry type is a collection of other entities, (e.g. a Dataset is a collection of Records), then this attribute must list the entities that can be included. One _collection_ can include more than one entity (e.g. a Dataset in teh Beacon cdefault model could include Individuals, Biosamples, GenomicVariations, Analyses amnd Runs). In such cases in each individual response (e.g. `resultSetsResponse` of collections of type \"dataset\") will contain entries of a single entity type (e.g. biosamples) even if a dataset may contain records of multiple types.", "includedConcepts": { "$ref": "../common/basicElement.json", "type": "array" @@ -30,13 +29,17 @@ "type": "string" }, "filteringTerms": { - "$comment": "TO DO: Double-check the proper way of referencing a path or relative path. 'format: uri' is throwing validation errors for relative file paths", - "description": "Reference to the file with the list of filtering terms that could be used to filter this concept in this instance of Beacon. The referenced file could be used to populate the `filteringTerms`endpoint. Having it independently should allow for updating the list of accepted filtering terms when it is necessary.", + "$comment": "TO DO: Evaluate switch this to `url` or a more specific way for allowing URLs and local file paths (is this necessary?).", + "description": "Reference to the list of filtering terms that could be used to filter records of this entity in this beacon.", "type": "string" }, "id": { - "$comments": "++++++ THIS IS THE START OF THE ontologized element ++++++", "description": "A (unique) identifier of the element.", + "examples": [ + "biosample", + "individual", + "dataset" + ], "type": "string" }, "name": { @@ -47,7 +50,6 @@ "$ref": "../common/beaconCommonComponents.json#/definitions/NonFilteredQueriesAllowed" }, "ontologyTermForThisType": { - "$comments": "++++++ THIS IS THE END OF THE ontologized element ++++++", "$ref": "../common/ontologyTerm.json" }, "partOfSpecification": { From d3f7a9262e0b93d1e562f6fd2979d04cca1b941d Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Mon, 19 Jun 2023 13:26:37 +0200 Subject: [PATCH 39/77] removed ontologyTermForThisType requirement It is not clear how to use ontologyTermForThisType w/o examples (i.e. terms for biosample, individual... - added some but incomplete...) and there is also a logical duplication having a "unique" id and an ontology term. Overall this should be clarified but the current modification seems (a) sensible (step). --- .../json/configuration/entryTypeDefinition.json | 17 +++++++++++++---- .../src/configuration/entryTypeDefinition.yaml | 12 ++++++++---- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/framework/json/configuration/entryTypeDefinition.json b/framework/json/configuration/entryTypeDefinition.json index 13c094cc1..400fdb004 100644 --- a/framework/json/configuration/entryTypeDefinition.json +++ b/framework/json/configuration/entryTypeDefinition.json @@ -1,7 +1,7 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": true, - "description": "Definition of an element or entity, to describe each type of entity included in a beacon. The `id` attribute is the key that should be used in other parts of the data model to allow Beacon clients to identify the different parts (e.g. endpoints, filteringTerms, request parameters, etc.) that relvant for an entity.", + "description": "Definition of an element or entity, to describe each type of entity included in a beacon. The `id` attribute is the key that should be used in other parts of the data model to allow Beacon clients to identify the different parts (e.g. endpoints, filtering terms, request parameters, etc.) that are relvant for an entity.", "properties": { "$schema": { "$ref": "../common/beaconCommonComponents.json#/definitions/$schema" @@ -34,7 +34,7 @@ "type": "string" }, "id": { - "description": "A (unique) identifier of the element.", + "description": "A unique identifier of the element.", "examples": [ "biosample", "individual", @@ -50,7 +50,17 @@ "$ref": "../common/beaconCommonComponents.json#/definitions/NonFilteredQueriesAllowed" }, "ontologyTermForThisType": { - "$ref": "../common/ontologyTerm.json" + "$ref": "../common/ontologyTerm.json", + "examples": [ + { + "id": "EFO:0000542", + "label": "individual" + }, + { + "id": "OBI:0000747", + "label": "material sample" + } + ] }, "partOfSpecification": { "description": "This is label to group together entry types that are part of the same specification.", @@ -61,7 +71,6 @@ "required": [ "id", "name", - "ontologyTermForThisType", "partOfSpecification", "defaultSchema" ], diff --git a/framework/src/configuration/entryTypeDefinition.yaml b/framework/src/configuration/entryTypeDefinition.yaml index 4ca04013f..a101afe75 100644 --- a/framework/src/configuration/entryTypeDefinition.yaml +++ b/framework/src/configuration/entryTypeDefinition.yaml @@ -4,15 +4,15 @@ description: >- Definition of an element or entity, to describe each type of entity included in a beacon. The `id` attribute is the key that should be used in other parts of the data model - to allow Beacon clients to identify the different parts (e.g. endpoints, filteringTerms, - request parameters, etc.) that relvant for an entity. + to allow Beacon clients to identify the different parts (e.g. endpoints, filtering + terms, request parameters, etc.) that are relvant for an entity. type: object properties: $schema: $ref: ../common/beaconCommonComponents.yaml#/definitions/$schema id: type: string - description: A (unique) identifier of the element. + description: A unique identifier of the element. examples: - biosample - individual @@ -25,6 +25,11 @@ properties: description: A textual description for the element. ontologyTermForThisType: $ref: ../common/ontologyTerm.yaml + examples: + - id: EFO:0000542 + label: individual + - id: OBI:0000747 + label: material sample partOfSpecification: description: This is label to group together entry types that are part of the same specification. @@ -65,7 +70,6 @@ properties: required: - id - name - - ontologyTermForThisType - partOfSpecification - defaultSchema additionalProperties: true From dd943aece56a0f814cc1af4272da306e39344c8d Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Mon, 19 Jun 2023 14:43:28 +0200 Subject: [PATCH 40/77] entry type as default instead entity --- .../json/configuration/entryTypeDefinition.json | 6 +++--- framework/src/configuration/entryTypeDefinition.yaml | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/framework/json/configuration/entryTypeDefinition.json b/framework/json/configuration/entryTypeDefinition.json index 400fdb004..b20352764 100644 --- a/framework/json/configuration/entryTypeDefinition.json +++ b/framework/json/configuration/entryTypeDefinition.json @@ -1,13 +1,13 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": true, - "description": "Definition of an element or entity, to describe each type of entity included in a beacon. The `id` attribute is the key that should be used in other parts of the data model to allow Beacon clients to identify the different parts (e.g. endpoints, filtering terms, request parameters, etc.) that are relvant for an entity.", + "description": "Definition of an element or entry type, to describe each type of entry type included in a beacon. The `id` attribute is the key that should be used in other parts of the data model to allow Beacon clients to identify the different parts (e.g. endpoints, filtering terms, request parameters, etc.) that are relvant for an entry type.", "properties": { "$schema": { "$ref": "../common/beaconCommonComponents.json#/definitions/$schema" }, "aCollectionOf": { - "description": "If the entry type is a collection of other entities, (e.g. a Dataset is a collection of Records), then this attribute must list the entities that can be included. One _collection_ can include more than one entity (e.g. a Dataset in teh Beacon cdefault model could include Individuals, Biosamples, GenomicVariations, Analyses amnd Runs). In such cases in each individual response (e.g. `resultSetsResponse` of collections of type \"dataset\") will contain entries of a single entity type (e.g. biosamples) even if a dataset may contain records of multiple types.", + "description": "If the entry type is a collection of other entities, (e.g. a Dataset is a collection of Records), then this attribute must list the entities that can be included. One _collection_ can include more than one entry type (e.g. a Dataset in teh Beacon cdefault model could include Individuals, Biosamples, GenomicVariations, Analyses amnd Runs). In such cases in each individual response (e.g. `resultSetsResponse` of collections of type \"dataset\") will contain entries of a single entry type (e.g. biosamples) even if a dataset may contain records of multiple types.", "includedConcepts": { "$ref": "../common/basicElement.json", "type": "array" @@ -30,7 +30,7 @@ }, "filteringTerms": { "$comment": "TO DO: Evaluate switch this to `url` or a more specific way for allowing URLs and local file paths (is this necessary?).", - "description": "Reference to the list of filtering terms that could be used to filter records of this entity in this beacon.", + "description": "Reference to the list of filtering terms that could be used to filter records of this entry type in this beacon.", "type": "string" }, "id": { diff --git a/framework/src/configuration/entryTypeDefinition.yaml b/framework/src/configuration/entryTypeDefinition.yaml index a101afe75..136c2980a 100644 --- a/framework/src/configuration/entryTypeDefinition.yaml +++ b/framework/src/configuration/entryTypeDefinition.yaml @@ -1,11 +1,11 @@ $schema: https://json-schema.org/draft/2020-12/schema title: '' description: >- - Definition of an element or entity, to describe each type of entity included in - a beacon. + Definition of an element or entry type, to describe each type of entry type included + in a beacon. The `id` attribute is the key that should be used in other parts of the data model to allow Beacon clients to identify the different parts (e.g. endpoints, filtering - terms, request parameters, etc.) that are relvant for an entity. + terms, request parameters, etc.) that are relvant for an entry type. type: object properties: $schema: @@ -48,11 +48,11 @@ properties: description: >- If the entry type is a collection of other entities, (e.g. a Dataset is a collection of Records), then this attribute must list the entities that - can be included. One _collection_ can include more than one entity + can be included. One _collection_ can include more than one entry type (e.g. a Dataset in teh Beacon cdefault model could include Individuals, Biosamples, GenomicVariations, Analyses amnd Runs). In such cases in each individual response (e.g. `resultSetsResponse` of collections of type "dataset") will - contain entries of a single entity type (e.g. biosamples) even if a dataset + contain entries of a single entry type (e.g. biosamples) even if a dataset may contain records of multiple types. includedConcepts: type: array @@ -60,7 +60,7 @@ properties: filteringTerms: description: >- Reference to the list of filtering terms that could be used to filter records - of this entity in this beacon. + of this entry type in this beacon. type: string $comment: >- TO DO: Evaluate switch this to `url` or a more specific way for allowing From 94b789198ec296830c67877097c0c828eef77e30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oriol=20L=C3=B3pez-Doriga?= Date: Tue, 20 Jun 2023 16:46:19 +0200 Subject: [PATCH 41/77] update entryType description --- framework/json/configuration/entryTypeDefinition.json | 2 +- framework/src/configuration/entryTypeDefinition.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/json/configuration/entryTypeDefinition.json b/framework/json/configuration/entryTypeDefinition.json index b20352764..27d425770 100644 --- a/framework/json/configuration/entryTypeDefinition.json +++ b/framework/json/configuration/entryTypeDefinition.json @@ -1,7 +1,7 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": true, - "description": "Definition of an element or entry type, to describe each type of entry type included in a beacon. The `id` attribute is the key that should be used in other parts of the data model to allow Beacon clients to identify the different parts (e.g. endpoints, filtering terms, request parameters, etc.) that are relvant for an entry type.", + "description": "Definition of an element or scope of the element, to describe each type of entry type included in a beacon. The `id` attribute is the key that should be used in other parts of the data model to allow Beacon clients to identify the different parts (e.g. endpoints, filtering terms, request parameters, etc.) that are relvant for an entry type.", "properties": { "$schema": { "$ref": "../common/beaconCommonComponents.json#/definitions/$schema" diff --git a/framework/src/configuration/entryTypeDefinition.yaml b/framework/src/configuration/entryTypeDefinition.yaml index 136c2980a..61916df7e 100644 --- a/framework/src/configuration/entryTypeDefinition.yaml +++ b/framework/src/configuration/entryTypeDefinition.yaml @@ -1,7 +1,7 @@ $schema: https://json-schema.org/draft/2020-12/schema title: '' description: >- - Definition of an element or entry type, to describe each type of entry type included + Definition of an element or scope of the element, to describe each type of entry type included in a beacon. The `id` attribute is the key that should be used in other parts of the data model to allow Beacon clients to identify the different parts (e.g. endpoints, filtering From 09417cb9e8ef8dca6f13104eec7f0d799752e4ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oriol=20L=C3=B3pez-Doriga?= Date: Wed, 21 Jun 2023 16:23:56 +0200 Subject: [PATCH 42/77] correcting typo in index.md --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 5f5682d43..6d03a7655 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,7 +5,7 @@ discovery of genomic (and phenoclinic) data in biomedical research and clinical Beacon facilitates the discovery of genomic variants and biomedical data in single or distributed resources with the goal to empower _federated_ data models - _i.e._ the discovery (and potential retrieval) of data from different -orgnisational and geographic locations. +organisational and geographic locations.
![Beacon v2 Cartoon](img/Beacon-Networks-v2-graphics/Beacon-Networks-v2-graphics-Michael.003.png){: style="width: 600px; margin-top: -30px; margin-bottom: -30px;" } From 4c5527e34cdd58705b174d5bbbfea35f979cbd77 Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Mon, 3 Jul 2023 12:19:00 +0200 Subject: [PATCH 43/77] doc comma-contatenation * repetition of comma-concatenation for list values documentation --- docs/filters.md | 6 ++++++ docs/variant-queries.md | 12 ++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/docs/filters.md b/docs/filters.md index db8de74b7..3e985c585 100644 --- a/docs/filters.md +++ b/docs/filters.md @@ -87,6 +87,12 @@ For all query types, the logical `AND` is implied between Filters. The Filter `i In this case general filter defaults apply (e.g. `{ "includeDescendantTerms": true }`). Generally, use of filters other than CURIE values for filter ids is discouraged. +!!! Attention "List Parameters in GET Requests" + + Since the direct interpretation of list parameters in queries is not supported by + some server environments (e.g. PHP, GO…), list parameters such as `start` and `end` + should be provided as **comma-concatenated** strings when using them in GET requests. + ### CURIE based filters query (type "OntologyFilters") !!! note "Hierarchical term expansion" diff --git a/docs/variant-queries.md b/docs/variant-queries.md index b8827aa68..656215cba 100644 --- a/docs/variant-queries.md +++ b/docs/variant-queries.md @@ -208,6 +208,12 @@ differing in their exact base extents. Bracket queries require the use of **two** `start` and `end` parameters, in contrast to _Range Queries_. +!!! Attention "List Parameters in GET Requests" + + Since the direct interpretation of list parameters in queries is not supported by + some server environments (e.g. PHP, GO…), list parameters such as `start` and `end` + should be provided as **comma-concatenated** strings when using them in GET requests. + #### Example: CNV Query - _TP53_ Deletion Query by Coordinates @@ -230,12 +236,6 @@ larger than approx. 5Mb (operational definitions of focality vary between 1 and * `datasetIds=__some-dataset-ids__` * `filters` ... - !!! Attention "List Parameters in GET Requests" - - Since the direct interpretation of list parameters in queries is not supported by - some server environments (e.g. PHP, GO…), list parameters such as `start` and `end` - should be provided as **comma-concatenated** strings when using them in GET requests. - === "Beacon v2 POST" From 4d8c40b61b175ee779cc27fb8a7e946d457e519a Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Mon, 10 Jul 2023 18:35:55 +0200 Subject: [PATCH 44/77] re-activating mermaid2 plugin ... accidentally commented -> no schema graph ... --- mkdocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yaml b/mkdocs.yaml index bd8f9501d..50a6e5186 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -64,7 +64,7 @@ plugins: # author: Beacon API Development Team # output_path: pdf/beacon.pdf - macros - # - mermaid2 + - mermaid2 markdown_extensions: - toc: From 597d171f4d91f55a54cb83632a8594be53d32670 Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Mon, 10 Jul 2023 19:31:52 +0200 Subject: [PATCH 45/77] fixing website mkdocs action Some branch SNAFU had deleted mk-beacon-docs - pushing a fix here ... --- .github/workflows/github-actions-demo-yml | 18 ------------------ .github/workflows/github-actions-demo.yml | 18 ------------------ .github/workflows/mk-docs.yaml | 19 +++++++++++++++++++ 3 files changed, 19 insertions(+), 36 deletions(-) delete mode 100644 .github/workflows/github-actions-demo-yml delete mode 100644 .github/workflows/github-actions-demo.yml create mode 100644 .github/workflows/mk-docs.yaml diff --git a/.github/workflows/github-actions-demo-yml b/.github/workflows/github-actions-demo-yml deleted file mode 100644 index 8a9c1ffdf..000000000 --- a/.github/workflows/github-actions-demo-yml +++ /dev/null @@ -1,18 +0,0 @@ -name: GitHub Actions Demo -run-name: ${{ github.actor }} is testing out GitHub Actions 🚀 -on: [push] -jobs: - Explore-GitHub-Actions: - runs-on: ubuntu-latest - steps: - - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." - - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" - - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." - - name: Check out repository code - uses: actions/checkout@v3 - - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." - - run: echo "🖥️ The workflow is now ready to test your code on the runner." - - name: List files in the repository - run: | - ls ${{ github.workspace }} - - run: echo "🍏 This job's status is ${{ job.status }}." \ No newline at end of file diff --git a/.github/workflows/github-actions-demo.yml b/.github/workflows/github-actions-demo.yml deleted file mode 100644 index 8a9c1ffdf..000000000 --- a/.github/workflows/github-actions-demo.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: GitHub Actions Demo -run-name: ${{ github.actor }} is testing out GitHub Actions 🚀 -on: [push] -jobs: - Explore-GitHub-Actions: - runs-on: ubuntu-latest - steps: - - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." - - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" - - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." - - name: Check out repository code - uses: actions/checkout@v3 - - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." - - run: echo "🖥️ The workflow is now ready to test your code on the runner." - - name: List files in the repository - run: | - ls ${{ github.workspace }} - - run: echo "🍏 This job's status is ${{ job.status }}." \ No newline at end of file diff --git a/.github/workflows/mk-docs.yaml b/.github/workflows/mk-docs.yaml new file mode 100644 index 000000000..db681603a --- /dev/null +++ b/.github/workflows/mk-docs.yaml @@ -0,0 +1,19 @@ +name: mk-progenetix-docs +on: + push: + branches: + - website-docs +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: 3.x + - run: pip install mkdocs-material + - run: pip install mkdocs-macros-plugin + - run: pip install pymdown-extensions + - run: pip install mkdocs-mermaid2-plugin + - run: pip install mdx_gh_links + - run: mkdocs gh-deploy --force From fb8bfc56c9f2d4e0e580d4c2c656fdcf7b7531c1 Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Tue, 11 Jul 2023 14:54:49 +0200 Subject: [PATCH 46/77] Update framework.md some cleanup & adding pagination note (may be moved somewhere else i the future, or be extended around w/ more implementation info). --- docs/framework.md | 48 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/docs/framework.md b/docs/framework.md index a9d620cd2..9920436a4 100644 --- a/docs/framework.md +++ b/docs/framework.md @@ -86,9 +86,11 @@ An unrestricted query like `/datasets` should return the list of all datasets in * anything else would probably be a request parameter. ### The Responses + The Beacon concept includes several types of responses: some informative or informational and some with actual data payloads, and the error one. -#### The Informational responses +#### Informational responses + A Beacon is able to return information, details, about itself. Many of the schema responses included in the `responses` folder have a 1-to-1 relationship with the corresponding configuration documents and their equivalent root endpoints, e.g. the `beaconEntryTypeResponse.json` is the schema of a response that wraps the `beaconConfiguration.json` document, and is then used as the payload of the `/entry_types` root endpoint. Schematically: * *configuration/an_schema.json*: describes the schema of the configuration file itself. * *responses/an_schema_response.json*: describes the format of the response that returns these configuration information. @@ -96,24 +98,45 @@ A Beacon is able to return information, details, about itself. Many of the schem The following schemas refer to informational responses: *beaconConfigurationResponse*, *beaconEntryTypeResponse*, *beaconFilteringTermsResponse*, ând *beaconMapResponse*. -#### The results responses +#### Data Responses + A Beacon could return responses at different granularity levels: -* **boolean response:** only returns `exists: true` ('Yes') or `exists: false` ('No') to a given query. -* **count response:** returns `Yes`/`No` and the number of matching results. -* **resultset response:** returns `Yes`/`No`, the number of matching results and details of them per every collection (e.g. every dataset or cohort) and, if granted, details on every record that matches the query. +* **boolean**: only returns `exists: true` ('Yes') or `exists: false` ('No') to a given query. +* **count**: returns `Yes`/`No` and the number of matching results. +* **record** returns `Yes`/`No`, the number of matching results and all documents + corresponding to the requested entities. Documents are wrapped in "result set" + objects for every collection (e.g. every dataset or cohort). Even for _record_ + level responses each beacon can control the details of data exposed in record + besides the minimal requirements of the entry type's schema. Each of these granularity levels has an equivalent response schema: * **boolean**: `beaconBooleanResponse` * **count**: `beaconCountResponse` -* **resultset** (with or w/o record details): `beaconResultSetsResponse` +* **record**: `beaconResultSetsResponse` An additional schema, *beaconCollectionsResponse*, describes such responses that returns details about the collections in a Beacon, but not the collection content themselves. Otherwise said, the response describes a dataset, but not returns the contents of any dataset. -### The common components +### Common Components + +Some elements are transerval to the Framework and to any model, e.g. the schema +for describing an ontology term or the reference to an external schema (like the +reference to GA4GH Phenopackets or GA4GH Service Info schemas). + +#### Pagination - `skip` and `limit` + +Record level responses potentially may return **many** (_i.e._ thousands and beyond) +documents which usually would be "paginated", _i.e._ split into may chunks ("pages"). +Beacon handles _pagination_ through the `skip` and `limit` parameters as part of the +request: + +* `limit` in the request tells the server the maximum number of records that should + be returned in a single response (_i.e._ the "page size") +* `skip` indicates how many of those pages should be skipped over when delivering + the results -Some elements are transerval to the Framework and to any model, e.g. the schema for describing an ontology term or the reference to an external schema (like the reference to GA4GH Phenopackets or GA4GH Service Info schemas). +Therefore, `skip: 2` and `limit: 8` will return records 17-24 (if those exist). ### Testing the compliance of an implementation with *testMode* @@ -136,12 +159,11 @@ Except when testing, most of the Beacon queries are expected to be answered by ' * **defaultGranularity:** Default granularity of the responses. Some responses could return higher detail, but this would be the granularity by default. * **securityLevels:** All access levels supported by the Beacon. Any combination is valid, as every option would apply to different parts of the Beacon. Available options are: -Granularity|Description +Granularity | Description -----------|----------- -`boolean`|returns 'true/false' responses. -`count`|adds the total number of positive results found. -`aggregated`|returns summary, aggregated or distribution like responses per collection. -`record`|returns details for every row. +`boolean` | returns 'true/false' responses. +`count` | adds the total number of positive results found. +`record` | returns details for every row. For those cases where a Beacon prefers to return records with less, not all, attributes, different strategies have been considered, e.g.: keep non-mandatory attributes empty, or Beacon to provide a minimal record definition, but these strategies still need to be tested in real world cases and hence no design decision has been taken yet. From 89e3b9deb8add3d4261a772ca13e3219484bd56e Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Tue, 11 Jul 2023 16:51:59 +0200 Subject: [PATCH 47/77] Update framework.md --- docs/framework.md | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/docs/framework.md b/docs/framework.md index 9920436a4..d21521619 100644 --- a/docs/framework.md +++ b/docs/framework.md @@ -67,12 +67,12 @@ Contains the Json schema files that describe the Beacon configuration, its conte Contains the following Json schemas: -* **beaconRequestBody.json:** Schema for the whole Beacon request. It is named `RequestBody` to keep the same nomenclature used by OpenAPI v3, but it actually contains the definition of the whole HTTP POST request payload. -* **beaconRequestMeta.json:** Meta section of the Beacon request. It includes request context details relevant for the Beacon server when processing the request, like the Beacon API version used to format the request or the schemas expected for the entry types in the response. -* **filteringTerms.json:** defines the schema for the filters included in the request. -* **requestParameters.json** defines the, very free, schema of the parameters included in the request. -* **examples-fullDocuments folder:** includes examples of "actual" requests. The example labelled with `MIN` in the name shows the minimal required attributes for the request to be compliant. The example labelled with `MAX` in the name includes a richer case with all the sections filled in. -* **examples-sections folder:** includes examples of "actual" sections of the requests. It is included to allow specification designers and Beacon implementers to check the compliance with a single section instead of having to implement a whole request. Such way, We aim to facilitate an "incremental" implementation of an instance. +* `beaconRequestBody.json:` Schema for the whole Beacon request. It is named `RequestBody` to keep the same nomenclature used by OpenAPI v3, but it actually contains the definition of the whole HTTP POST request payload. +* `beaconRequestMeta.json:` Meta section of the Beacon request. It includes request context details relevant for the Beacon server when processing the request, like the Beacon API version used to format the request or the schemas expected for the entry types in the response. +* `filteringTerms.json:` defines the schema for the filters included in the request. +* `requestParameters.json` defines the, very free, schema of the parameters included in the request. +* `examples-fullDocuments` folder: includes examples of "actual" requests. The example labelled with `MIN` in the name shows the minimal required attributes for the request to be compliant. The example labelled with `MAX` in the name includes a richer case with all the sections filled in. +* `examples-sections` folder: includes examples of "actual" sections of the requests. It is included to allow specification designers and Beacon implementers to check the compliance with a single section instead of having to implement a whole request. Such way, We aim to facilitate an "incremental" implementation of an instance. #### Differences between FilteringTerms and RequestParameters Both, the filters (*filteringTerms*) and the parameters (*requestParameters*), are used to refine the query. The availability of two mechanisms to refine the queries could sound initially confusing, but that separation is taylored to facilitate the interpretation of the request by the Beacon server. @@ -91,7 +91,13 @@ The Beacon concept includes several types of responses: some informative or info #### Informational responses -A Beacon is able to return information, details, about itself. Many of the schema responses included in the `responses` folder have a 1-to-1 relationship with the corresponding configuration documents and their equivalent root endpoints, e.g. the `beaconEntryTypeResponse.json` is the schema of a response that wraps the `beaconConfiguration.json` document, and is then used as the payload of the `/entry_types` root endpoint. Schematically: +A Beacon is able to return information, details, about itself. Many of the schema +responses included in the `responses` folder have a 1-to-1 relationship with the +corresponding configuration documents and their equivalent root endpoints, e.g. +the `beaconEntryTypeResponse.json` is the schema of a response that wraps the +`beaconConfiguration.json` document, and is then used as the payload of the +`/entry_types` root endpoint. Schematically: + * *configuration/an_schema.json*: describes the schema of the configuration file itself. * *responses/an_schema_response.json*: describes the format of the response that returns these configuration information. * *root/endpoints.json*: describes the API endpoints to be called and parameters to be used to retrieve such responses. From a793c8cde88e2fb3a6419ebb89ec3418c8dc6969 Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Tue, 8 Aug 2023 17:14:22 +0200 Subject: [PATCH 48/77] FAQ, Boolean (non-)use --- docs/FAQ.md | 13 +++++++++++++ docs/filters.md | 16 +++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/docs/FAQ.md b/docs/FAQ.md index 93f331662..7ec8aaf3a 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -149,5 +149,18 @@ representations and will be adopted by Beacon v2.n after reaching a release state. +?? faq "Does the Beacon protocol support Boolean expressions?" + +!!! Note "Boolean Logic Between Filtering Terms" + + No (...but). Beacon queries as of v2 always assume a logical **AND** between query parameters + and individual filters, _i.e._ all conditions have to be met. There is currently + no support for Boolean expressions. + However, a logical exception is the use of multiple filters for the same parameter which + a Beacon implementation should treat as a logical **OR** since they otherwise + would fail in most instances. E.g. the query using `NCIT:C3493` and `NCIT:C2926` + (mapped against `biosample.histological_diagnosis.id`) would match both + _Lung Non-Small Cell Carcinoma_ (NCIT:C2926) and _Lung Squamous Cell Carcinoma_ + (NCIT:C3493) which are exclusive diagnoses. diff --git a/docs/filters.md b/docs/filters.md index 3e985c585..1d13f5cca 100644 --- a/docs/filters.md +++ b/docs/filters.md @@ -79,7 +79,21 @@ Alphanumerical value Filter types contain: ## Using Filters in Queries -For all query types, the logical `AND` is implied between Filters. The Filter `id` is required for all query types. +The Filter `id` is required for all query types. For all query types, the logical +**AND** is _implied_ between Filters. + +!!! Note "Boolean Logic Between Filtering Terms" + + Beacon queries as of v2 always assume a logical **AND** between query parameters + and individual filters, _i.e._ all conditions have to be met. There is currently + no support for Boolean expressions. + However, a logical exception is the use of multiple filters for the same parameter which + a Beacon implementation should treat as a logical **OR** since they otherwise + would fail in most instances. E.g. the query using `NCIT:C3493` and `NCIT:C2926` + (mapped against `biosample.histological_diagnosis.id`) would match both + _Lung Non-Small Cell Carcinoma_ (NCIT:C2926) and _Lung Squamous Cell Carcinoma_ + (NCIT:C3493) which are exclusive diagnoses. + !!! Note "Filters in `GET` Requests" From 898b22b8e3a8634191527b6c820cd509d4ec8ada Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Tue, 8 Aug 2023 17:15:10 +0200 Subject: [PATCH 49/77] Update FAQ.md --- docs/FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/FAQ.md b/docs/FAQ.md index 7ec8aaf3a..23f7beb2d 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -149,7 +149,7 @@ representations and will be adopted by Beacon v2.n after reaching a release state. -?? faq "Does the Beacon protocol support Boolean expressions?" +?? faq "Does the Beacon protocol support Boolean expressions? " !!! Note "Boolean Logic Between Filtering Terms" From 8680e9f77a0faed254168e0728713144cd0e1a97 Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Tue, 8 Aug 2023 17:15:37 +0200 Subject: [PATCH 50/77] Update FAQ.md --- docs/FAQ.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/FAQ.md b/docs/FAQ.md index 23f7beb2d..11758f132 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -149,9 +149,7 @@ representations and will be adopted by Beacon v2.n after reaching a release state. -?? faq "Does the Beacon protocol support Boolean expressions? " - -!!! Note "Boolean Logic Between Filtering Terms" +??? faq "Does the Beacon protocol support Boolean expressions? " No (...but). Beacon queries as of v2 always assume a logical **AND** between query parameters and individual filters, _i.e._ all conditions have to be met. There is currently From c09c3efc9ffb703ab5e42f4e447001bed7e8930c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oriol=20L=C3=B3pez-Doriga?= Date: Thu, 17 Aug 2023 11:06:16 +0200 Subject: [PATCH 51/77] updating branch organization description --- docs/code-organization.md | 112 +++++++++++++++++++++++++++++++++++++- 1 file changed, 111 insertions(+), 1 deletion(-) diff --git a/docs/code-organization.md b/docs/code-organization.md index 4c7769ac6..70e5d4fc2 100644 --- a/docs/code-organization.md +++ b/docs/code-organization.md @@ -22,7 +22,117 @@ Changes to the Markdown files in the `/docs` directory (and its children) will i The `gh-pages` branch is generated from the `/docs` directory through its `mkdocs` workflow and contains the website itself. **Do not edit** -## Topic branches +## Hotfix branches + +These are the branches that are meant to fix some bugs that break the specifications and need an urgent fix. The branches are directly deployed towards the `main` branch. + +### `entry-type-definitions-cleanup` + +This branch aims to redefine the wording of the entry types in a way that makes more clear what are the entry types. As the old definitions could mislead to some confusions, this is a sensible change that is needed to directly affect the current modification. + +Current status:Waiting for PR to be accepted. + +### `hotfix_filteringTermsResults` + +As the beaconFilteringTermsResults.json "type" property of the FilteringTerm is ambiguous, this branch has the objective to fix this and make filtering terms object to be operative and ready to point to the filtering terms type. + +Current status:Waiting for PR to be accepted. + +### `schema-urgent-fixes` + +Some of the instances of the schema were missing attributes and other aspects that are required to make a beacon work. This is mandatory to be urgently fixed and this is the purpose of this branch deployment. + +Current status:Waiting for PR to be accepted. + +## Feature and subfeature branches + +The feature branches are the branches that bring a lot of changes together to change some specific part of the specifications. They can be composed by different subfeature branches that commit to them or just have one single working branch. The feature branches commit to the `develop` branch as they are the changes that will lead beacon to be upgraded to a new version. The subfeature branches commit to their parent feature branch, as they are a microchange of all the aspects that have to change in a new feature that is being developed. The branches are named as the main purpose of them, so it is made very clear what is the working area of them and the subfeature branches add the name of the feature branch they belong as a prefix followed by an underscore. The list of these feature branches with their subfeature branches is the one shown next: + +### `clean-up` + +#### `clean-up_sticky_modified_files` + +Current status:Last commit by @jrambla. + +#### `clean-up_renaming_entity_to_entry_type` + +Current status:Added in framework-refactor-entry-type-definitions branch by @mbaudis and waiting for a PR to be accepted. + +#### `clean-up_decouple-model-framework-refs` + +Current status:Last commit by @mbaudis. + +#### `clean-up_move-CURIE-to-beaconCommonComponents` + +Current status:This branch has not had any commit. + +#### `clean-up_de-snakify-token-names` + +Current status:This branch has not had any commit. + +#### `clean-up_refactor-analysys-pipeline-info` + +Current status:Last commit by @mbaudis. + +### `resultsets` + +#### `resultsets_remove-requirement-results-resultsCount` + +Current status:Last commit by @mbaudis. + +### `requestParameters` + +#### `requestParameters_genomicVariations-fix` + +Current status:Last commit by @mbaudis. + +#### `requestParameters_list-parameters-with-comma` + +Current status:This branch has not had any commit. + +### `phenopackets` + +#### `phenopackets_standards-alignment` + +Current status:Last commit by @mbaudis. + +### `network` + +#### `network_aggregator-and-networks-support` + +Current status:This branch has not had any commit. + +#### `network_meta-add-aggregator-flag` + +Current status:Last commit by @mbaudis. + +### `anyOf` + +#### `anyOf_filteringTerms` + +Current status:This branch has not had any commit. + +### `genomicVariations` + +Current status:Waiting for PR to be accepted. + +### `received-filters` + +Current status:Waiting for PR to be accepted. + +### `response-meta-add-warnings` + +Current status:Waiting for PR to be accepted. + +### `framework-refactor-entry-type-definitions` + +Current status:Waiting for PR to be accepted. + + + + + + ==TBD== From e2190ef3a9248c63f2963f4fb568a7190990dfec Mon Sep 17 00:00:00 2001 From: redmitry Date: Tue, 5 Sep 2023 11:15:17 +0200 Subject: [PATCH 52/77] add scopes[] to the FilteringTerm --- .../sections/beaconFilteringTermsResults.json | 10 ++++++++++ .../sections/beaconFilteringTermsResults.yaml | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/framework/json/responses/sections/beaconFilteringTermsResults.json b/framework/json/responses/sections/beaconFilteringTermsResults.json index e7a0ab74a..daaf0fc92 100644 --- a/framework/json/responses/sections/beaconFilteringTermsResults.json +++ b/framework/json/responses/sections/beaconFilteringTermsResults.json @@ -28,6 +28,16 @@ "alphanumeric" ], "type": "string" + }, + "scopes": { + "description": "Entry types this filter may be applied to.", + "examples": [ + "[\"individual\", \"biosample\"]" + ], + "type": "array", + "items": { + "type": "string" + } } }, "required": [ diff --git a/framework/src/responses/sections/beaconFilteringTermsResults.yaml b/framework/src/responses/sections/beaconFilteringTermsResults.yaml index 4c3bd96c3..ff1474355 100644 --- a/framework/src/responses/sections/beaconFilteringTermsResults.yaml +++ b/framework/src/responses/sections/beaconFilteringTermsResults.yaml @@ -46,6 +46,14 @@ definitions: examples: - 'B Lymphoblastic Leukemia/Lymphoma' - 'Aplasia/Hypoplasia of the middle ear' + scopes: + description: >- + Entry types this filter may be applied to. + examples: + - '["individual", "biosample"]' + type: array + items: + type: string Resource: type: object description: >- From 8c1340d0b1dc015551f3daae53ebe457a9ae2a3d Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Wed, 20 Sep 2023 15:06:39 -0700 Subject: [PATCH 53/77] Removing the AND exception note --- docs/filters.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/filters.md b/docs/filters.md index 1d13f5cca..ddfa7d17a 100644 --- a/docs/filters.md +++ b/docs/filters.md @@ -87,13 +87,6 @@ The Filter `id` is required for all query types. For all query types, the logica Beacon queries as of v2 always assume a logical **AND** between query parameters and individual filters, _i.e._ all conditions have to be met. There is currently no support for Boolean expressions. - However, a logical exception is the use of multiple filters for the same parameter which - a Beacon implementation should treat as a logical **OR** since they otherwise - would fail in most instances. E.g. the query using `NCIT:C3493` and `NCIT:C2926` - (mapped against `biosample.histological_diagnosis.id`) would match both - _Lung Non-Small Cell Carcinoma_ (NCIT:C2926) and _Lung Squamous Cell Carcinoma_ - (NCIT:C3493) which are exclusive diagnoses. - !!! Note "Filters in `GET` Requests" From 394a4099c0a0d3a7bddf39aa213a8c51e6a7d0ed Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Wed, 20 Sep 2023 15:07:28 -0700 Subject: [PATCH 54/77] Update filters.md --- docs/filters.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/filters.md b/docs/filters.md index ddfa7d17a..3b5ce709c 100644 --- a/docs/filters.md +++ b/docs/filters.md @@ -79,12 +79,11 @@ Alphanumerical value Filter types contain: ## Using Filters in Queries -The Filter `id` is required for all query types. For all query types, the logical -**AND** is _implied_ between Filters. +The Filter `id` is required for all query types. !!! Note "Boolean Logic Between Filtering Terms" - Beacon queries as of v2 always assume a logical **AND** between query parameters + Beacon queries as of v2 always omply a logical **AND** between query parameters and individual filters, _i.e._ all conditions have to be met. There is currently no support for Boolean expressions. From a45ccc786aba78e1e393bb4c087c1d87d9ae5306 Mon Sep 17 00:00:00 2001 From: redmitry Date: Fri, 6 Oct 2023 16:14:36 +0200 Subject: [PATCH 55/77] provide "required" properties for the "age" and "ageRange" schemas --- models/json/beacon-v2-default-model/common/age.json | 3 +++ models/json/beacon-v2-default-model/common/ageRange.json | 4 ++++ models/src/beacon-v2-default-model/common/age.yaml | 2 ++ models/src/beacon-v2-default-model/common/ageRange.yaml | 3 +++ 4 files changed, 12 insertions(+) diff --git a/models/json/beacon-v2-default-model/common/age.json b/models/json/beacon-v2-default-model/common/age.json index 9ca29f0da..f6b941fde 100644 --- a/models/json/beacon-v2-default-model/common/age.json +++ b/models/json/beacon-v2-default-model/common/age.json @@ -8,6 +8,9 @@ "type": "string" } }, + "required": [ + "iso8601duration" + ], "title": "Age", "type": "object" } \ No newline at end of file diff --git a/models/json/beacon-v2-default-model/common/ageRange.json b/models/json/beacon-v2-default-model/common/ageRange.json index 204fef563..31fb79c76 100644 --- a/models/json/beacon-v2-default-model/common/ageRange.json +++ b/models/json/beacon-v2-default-model/common/ageRange.json @@ -11,6 +11,10 @@ "description": "Represents age as an ISO8601 duration (e.g., P18Y)." } }, + "required": [ + "end", + "start" + ], "title": "AgeRange", "type": "object" } \ No newline at end of file diff --git a/models/src/beacon-v2-default-model/common/age.yaml b/models/src/beacon-v2-default-model/common/age.yaml index 04e0bfb3c..51a105065 100644 --- a/models/src/beacon-v2-default-model/common/age.yaml +++ b/models/src/beacon-v2-default-model/common/age.yaml @@ -7,3 +7,5 @@ properties: description: Represents age as a ISO8601 duration (e.g., P40Y10M05D). type: string example: P32Y6M1D +required: + - iso8601duration diff --git a/models/src/beacon-v2-default-model/common/ageRange.yaml b/models/src/beacon-v2-default-model/common/ageRange.yaml index 02011e6c4..cd15ccad5 100644 --- a/models/src/beacon-v2-default-model/common/ageRange.yaml +++ b/models/src/beacon-v2-default-model/common/ageRange.yaml @@ -9,3 +9,6 @@ properties: end: description: Represents age as an ISO8601 duration (e.g., P59Y). $ref: ./age.yaml +required: + - start + - end From 1f6fb0bae286687066e5b6a2ea8b3fc161fdc03c Mon Sep 17 00:00:00 2001 From: Dmitry Repchevsky Date: Tue, 10 Oct 2023 10:48:08 +0200 Subject: [PATCH 56/77] comment changes add this to trigger stalled workflow action --- models/json/beacon-v2-default-model/common/age.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/json/beacon-v2-default-model/common/age.json b/models/json/beacon-v2-default-model/common/age.json index f6b941fde..e7f4a6c66 100644 --- a/models/json/beacon-v2-default-model/common/age.json +++ b/models/json/beacon-v2-default-model/common/age.json @@ -3,7 +3,7 @@ "description": "Age value definition. Provenance: GA4GH Phenopackets v2 `Age`", "properties": { "iso8601duration": { - "description": "Represents age as a ISO8601 duration (e.g., P40Y10M05D).", + "description": "Represents age as a ISO8601 duration (e.g., 'P40Y10M05D').", "example": "P32Y6M1D", "type": "string" } @@ -13,4 +13,4 @@ ], "title": "Age", "type": "object" -} \ No newline at end of file +} From 401a0cb345b87f269a8b7f3dbd1d22b3e9cac7ea Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Tue, 10 Oct 2023 21:41:03 +0900 Subject: [PATCH 57/77] Update filters.md --- docs/filters.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/filters.md b/docs/filters.md index 3b5ce709c..ff343c4ba 100644 --- a/docs/filters.md +++ b/docs/filters.md @@ -72,8 +72,7 @@ Alphanumerical value Filter types contain: "type": "alphanumeric", "id": "PATO:0000011", "label": "age" - }, - ... + } ] ``` From c1e8f5f2a3154580e15227fbef57055088e3f11e Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Tue, 31 Oct 2023 17:16:54 +0100 Subject: [PATCH 58/77] Update variant-queries.md --- docs/variant-queries.md | 42 +++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/docs/variant-queries.md b/docs/variant-queries.md index 656215cba..b12c0f7f8 100644 --- a/docs/variant-queries.md +++ b/docs/variant-queries.md @@ -186,6 +186,36 @@ a positional translation is being applied. ?geneId=EIF4A1&variantMaxLength=1000000&variantType=DEL ``` +=== "Beacon v2 POST for `geneId` (deletion CNV)" + + ``` + { + "$schema":"https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/requests/beaconRequestBody.json", + "meta": { + "apiVersion": "2.0", + "requestedSchemas": [ + { + "entityType": "genomicVariation", + "schema:": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/models/json/beacon-v2-default-model/genomicVariations/defaultSchema.json" + } + ] + }, + "query": { + "requestParameters": { + "g_variant": + "geneId": "EIF4A1", + "variantType": "EFO:0030067" + } + } + }, + "requestedGranularity": "record", + "pagination": { + "skip": 0, + "limit": 5 + } + } + ``` + ## Beacon _Bracket Queries_ @@ -292,27 +322,27 @@ larger than approx. 5Mb (operational definitions of focality vary between 1 and ## Genomic Allele Query (Short Form) -==TBD== +When available variants can be identified through their genomic HGVS short form. === "Beacon v2 GET" ``` - ?allele=NM_004006.2:c.4375C>T + ?genomicAlleleShortForm=NM_004006.2:c.4375C>T ``` - ==to be completed== ## Aminoacid Change Query -==TBD== +Annotated variants can potentiallyqueried using the single amino acid replacement +format. The `aminoacidChange` parameter may be combined with e.g. a `geneId` to increase +specificity === "Beacon v2 GET" ``` - ?aminoacidChange=V600E + ?aminoacidChange=V600E&geneId=BRAF ``` - ==to be completed== ## `variantType` Parameter Interpretation From 492181029ac141a93b3ae647e56a87d0c43f436d Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Thu, 9 Nov 2023 16:14:37 +0100 Subject: [PATCH 59/77] BeaconGeneQuery-graphics --- docs/img/BeaconGeneQuery-graphics.png | Bin 0 -> 88016 bytes docs/variant-queries.md | 5 ++++- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 docs/img/BeaconGeneQuery-graphics.png diff --git a/docs/img/BeaconGeneQuery-graphics.png b/docs/img/BeaconGeneQuery-graphics.png new file mode 100644 index 0000000000000000000000000000000000000000..aa646eeac3eac5a088e954f430f3e74ee320e157 GIT binary patch literal 88016 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 wsns<92~89x{!b3<|3Ci!*8;4T|GgZzpCH%qyE9 Date: Sun, 12 Nov 2023 11:28:44 +0100 Subject: [PATCH 60/77] Update BeaconGeneQuery-graphics.png --- docs/img/BeaconGeneQuery-graphics.png | Bin 88016 -> 80160 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/img/BeaconGeneQuery-graphics.png b/docs/img/BeaconGeneQuery-graphics.png index aa646eeac3eac5a088e954f430f3e74ee320e157..7f75655d41bf3d8a8922b30e0e75f47fed6b7e84 100644 GIT binary patch delta 44062 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

Pl82j{yRhUIx^yy1zSJux&i7v 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�Mb5gUd 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 Oh=Qz&Or@0B=l=^JqvI<8 From c1ccadc316d63a57d354aa247ebb91fdd4325fe7 Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Tue, 14 Nov 2023 08:20:13 +0100 Subject: [PATCH 61/77] query options first order nav links --- mkdocs.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mkdocs.yaml b/mkdocs.yaml index 50a6e5186..8a4786bf1 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -22,9 +22,8 @@ nav: - Changes: changes-todo - Beacon News ↗: https://beacon-project.io/news/ - Using Beacons: - - Data Discovery: - - Genomic Queries: variant-queries - - Phenotypes and More...: /filters/#using-filters-in-queries + - Genomic Queries: variant-queries + - Phenotypes and More...: /filters/#using-filters-in-queries - Data Delivery: - Biosamples, Variants...: records - Data Handovers: handovers From edf561ed1a4c612efd3921beecbb5f6378c684f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oriol=20L=C3=B3pez-Doriga?= Date: Wed, 20 Mar 2024 16:02:44 +0100 Subject: [PATCH 62/77] filtering terms results example listed --- .../sections/beaconFilteringTermsResults.json | 2 +- .../sections/beaconFilteringTermsResults.yaml | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/framework/json/responses/sections/beaconFilteringTermsResults.json b/framework/json/responses/sections/beaconFilteringTermsResults.json index daaf0fc92..29a1761bd 100644 --- a/framework/json/responses/sections/beaconFilteringTermsResults.json +++ b/framework/json/responses/sections/beaconFilteringTermsResults.json @@ -30,7 +30,7 @@ "type": "string" }, "scopes": { - "description": "Entry types this filter may be applied to.", + "description": "Entry types affected by this filter.", "examples": [ "[\"individual\", \"biosample\"]" ], diff --git a/framework/src/responses/sections/beaconFilteringTermsResults.yaml b/framework/src/responses/sections/beaconFilteringTermsResults.yaml index ff1474355..5c4ddec4a 100644 --- a/framework/src/responses/sections/beaconFilteringTermsResults.yaml +++ b/framework/src/responses/sections/beaconFilteringTermsResults.yaml @@ -48,9 +48,16 @@ definitions: - 'Aplasia/Hypoplasia of the middle ear' scopes: description: >- - Entry types this filter may be applied to. - examples: - - '["individual", "biosample"]' + Entry types affected by this filter. + examples: + - + - individual + - biosample + - analysis + - run + - genomicVariation + - + - biosample type: array items: type: string From 1447418ae20062d48c6644b705a4e0c31b8355af Mon Sep 17 00:00:00 2001 From: Dmitry Repchevsky Date: Wed, 20 Mar 2024 16:28:22 +0100 Subject: [PATCH 63/77] fix "examples" beaconFilteringTermsResults.json should be an array of arrays... --- .../json/responses/sections/beaconFilteringTermsResults.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/framework/json/responses/sections/beaconFilteringTermsResults.json b/framework/json/responses/sections/beaconFilteringTermsResults.json index 29a1761bd..a821680e8 100644 --- a/framework/json/responses/sections/beaconFilteringTermsResults.json +++ b/framework/json/responses/sections/beaconFilteringTermsResults.json @@ -32,7 +32,8 @@ "scopes": { "description": "Entry types affected by this filter.", "examples": [ - "[\"individual\", \"biosample\"]" + ["individual", "biosample", "analysis", "run", "genomicVariation"], + ["biosample"] ], "type": "array", "items": { @@ -114,4 +115,4 @@ } }, "type": "object" -} \ No newline at end of file +} From d3c26923f23d2fa9715ba2c41ddd2842d004ae08 Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Fri, 22 Mar 2024 09:40:26 +0100 Subject: [PATCH 64/77] link fix and different TOC style --- docs/formats-standards.md | 2 +- mkdocs.yaml | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/formats-standards.md b/docs/formats-standards.md index d2da97509..d5f42384d 100644 --- a/docs/formats-standards.md +++ b/docs/formats-standards.md @@ -376,5 +376,5 @@ Beacon directly uses the (IMO preferable) [representation through an ontology te ##### LINK: [Phenopackets Documentation](https://phenopacket-schema.readthedocs.io/en/latest/index.html) -[^1]: Source: [@andrewyatz](https://github.com/@andrewyatz/) at [SchemaBlocks {S}[B]](https://schemablocks.org/standards/genome-coordinates.html) +[^1]: Source: [@andrewyatz](https://github.com/@andrewyatz/) at [GenomeStandards](https://genomestandards.org/standards/genome-coordinates/) diff --git a/mkdocs.yaml b/mkdocs.yaml index 8a4786bf1..d2803ef51 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -115,13 +115,11 @@ theme: - navigation.instant - navigation.tracking - navigation.sections - - toc.integrate + # - toc.integrate # Options extra: social: - - icon: fontawesome/brands/twitter - link: https://twitter.com/genomebeacons - icon: fontawesome/brands/github link: https://github.com/ga4gh-beacon From aaf202858760664cf92377afba47f2eaec41dc4f Mon Sep 17 00:00:00 2001 From: Manuel Rueda Date: Tue, 26 Mar 2024 17:23:13 +0100 Subject: [PATCH 65/77] Fix file naming conflict error in schemas-md on macOS APFS (case-insensitive) --- .gitignore | 1 - bin/SCHEMAS2MD.md | 2 +- bin/{jsonref2json.py => _jsonref2json.py} | 0 bin/beacon_yaml2md.pl | 60 ++++++++++++++--------- bin/transform_json2md.sh | 11 +++-- docs/schemas-md/beacon_terms.md | 4 +- docs/schemas-md/obj/AgeRange_PXF.md | 3 ++ docs/schemas-md/obj/Complex Value.md | 2 +- docs/schemas-md/obj/Value_PXF.md | 3 ++ docs/schemas-md/obj/ageAtProcedure.md | 2 +- docs/schemas-md/obj/ageOfOnset.md | 2 +- docs/schemas-md/obj/alternateBases.md | 2 +- docs/schemas-md/obj/date.md | 2 +- docs/schemas-md/obj/geneIds.md | 2 +- docs/schemas-md/obj/id.md | 2 +- docs/schemas-md/obj/measurementValue.md | 2 +- docs/schemas-md/obj/notes.md | 2 +- docs/schemas-md/obj/observationMoment.md | 2 +- docs/schemas-md/obj/onset.md | 2 +- docs/schemas-md/obj/population.md | 2 +- docs/schemas-md/obj/referenceBases.md | 2 +- docs/schemas-md/obj/resolution.md | 2 +- docs/schemas-md/obj/unit.md | 2 +- docs/schemas-md/obj/value.md | 2 +- docs/schemas-md/obj/variantType.md | 2 +- 25 files changed, 68 insertions(+), 50 deletions(-) rename bin/{jsonref2json.py => _jsonref2json.py} (100%) create mode 100644 docs/schemas-md/obj/AgeRange_PXF.md create mode 100644 docs/schemas-md/obj/Value_PXF.md diff --git a/.gitignore b/.gitignore index ff647f764..bd691366a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,3 @@ site .DS_Store models/.DS_Store /.vs -docs/schemas-md diff --git a/bin/SCHEMAS2MD.md b/bin/SCHEMAS2MD.md index cc7ff5b63..7ae735205 100644 --- a/bin/SCHEMAS2MD.md +++ b/bin/SCHEMAS2MD.md @@ -132,7 +132,7 @@ _NB:_ The script was built to work with the Beacon v2 Model schemas and the auth _NB:_ The decission to take YAMLs (and not JSON) as an input is deliberate and made by the author. -_NB:_ The script only processes the `Terms` nested **up to 3 degrees of hierarchy**. Before Adoption of VRS/PHX that limit was OK. +_NB:_ The script only processes the `Terms` nested **up to 3 degrees of hierarchy**. Before Adoption of VRS/PXF that limit was OK. _NB:_ The script also includes the Beacon v2 Models examples from [beacon-v2 repo](https://github.com/ga4gh-beacon/beacon-v2) in JSON format. diff --git a/bin/jsonref2json.py b/bin/_jsonref2json.py similarity index 100% rename from bin/jsonref2json.py rename to bin/_jsonref2json.py diff --git a/bin/beacon_yaml2md.pl b/bin/beacon_yaml2md.pl index 9c8be4f38..96e59c17f 100755 --- a/bin/beacon_yaml2md.pl +++ b/bin/beacon_yaml2md.pl @@ -2,11 +2,11 @@ # # Script to convert Beacon v2 Models schemas to Markdown tables # -# Last Modified: May/05/2022 +# Last Modified: Mar/26/2024 # # Version 2.0.0 # -# Copyright (C) 2021-2022 Manuel Rueda (manuel.rueda@crg.eu) +# Copyright (C) 2021-2024 Manuel Rueda (manuel.rueda@cnag.eu) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -236,6 +236,10 @@ sub yaml2md_obj { # We parse $yaml to get paths and more... my ( $base, $dir, $ext ) = fileparse( $yaml, '.yaml' ); $ext =~ s/\.yaml/.md/; + + # Ad hoc fix for two files that have same namex except for uc/lc + # AgeRange == ageRange and Value == value on MacOS cwAPFS (Case insensitive) + $base = $base . '_PXF' if ( $base eq 'AgeRange' || $base eq 'Value' ); my $file = catfile( $mo_dir, $base . $ext ); # Note -> $base.$ext write_file( $file, $out_str ); @@ -278,11 +282,11 @@ sub yaml_slicer { # one YAML file for each property and then re-use code from the 'main' schema ########################################## - # **** Note about VRS / PHX adoption *** # + # **** Note about VRS / PXF adoption *** # ########################################## # The adoption of those standards had technical implications. The script expects objects to have - # for the object and then . VRS/PHX follow JSON schemas that include /oneOf allOf anyOf/ + # for the object and then . VRS/PXF follow JSON schemas that include /oneOf allOf anyOf/ # plus other complex intructions such as . # This becomes a real challenge with $ref as, for instance, in we can not find the key for # 'MolecularVariation', 'SystemicVariation', 'LegacyVariation' @@ -352,7 +356,7 @@ sub yaml_slicer { sub table_content { my ( $yaml_properties, $ra_properties, $headers, $obj, $link ) = @_; - my @lc_headers = map { lc } @$headers; # Copy array uc to avoid modifying original $ref + my @lc_headers = map { lc } @$headers; # Copy array uc to avoid modifying original $ref my $out_str = ''; #---------------------------------------------------------| @@ -394,10 +398,10 @@ sub table_content { if $header eq 'example'; # Slice differentely if $object->{type} eq 'array' - if ($object->{type} eq 'array' ) { - for ('description', 'properties'){ - $value_header = $object->{items}{$_} if $header eq $_; - } + if ( $object->{type} eq 'array' ) { + for ( 'description', 'properties' ) { + $value_header = $object->{items}{$_} if $header eq $_; + } } # Now convert data structure to string @@ -454,7 +458,7 @@ sub ref2str { # string or undef else { - $out_str = defined $data->[0] ? join ', ', @$data : 'NA'; # Note ', ' to allow HTML column rendering + $out_str = defined $data->[0] ? join ', ', @$data : 'NA'; # Note ', ' to allow HTML column rendering } } elsif ( ref $data eq 'HASH' ) { @@ -480,15 +484,20 @@ sub add_external_links { my ( $tmp_str, $key ) = @_; # Note: This is an ad hoc solution to fix errors with deeply-nested data - my @phx = qw( typedQuantities days weeks Quantity high low); - my @vrs = qw(_id state type CURIE Location); + my @pxf = qw( typedQuantities days weeks Quantity high low); + my @vrs = qw(_id state type CURIE Location); my @framework = ("ontologyTerm"); - return ( any { ( $_ eq $key ) } @phx ) + + return ( any { ( $_ eq $key ) } @pxf ) ? "[$key](https://phenopacket-schema.readthedocs.io/en/latest/building-blocks.html)" : ( any { ( $_ eq $key ) } @vrs ) ? "[$key](https://vrs.ga4gh.org/en/stable/terms_and_model.html#$key)" - : ( any { ( $_ eq $key ) } @framework ) - ? "[$key](https://github.com/ga4gh-beacon/beacon-v2/blob/main/framework/src/common/$key.yaml)" + : ( any { ( $_ eq $key ) } @framework ) + ? "[$key](https://github.com/ga4gh-beacon/beacon-v2/blob/main/framework/src/common/$key.yaml)" + + # NB: Ad hoc solution for properties having equal name (lc) + : ( $key eq 'AgeRange' || $key eq 'Value' ) + ? "[$key]($tmp_str/${key}_PXF.md)" : "[$key]($tmp_str/$key.md)"; } @@ -588,7 +597,7 @@ sub create_str_yaml { ## ontologyTerm.yaml is needed due to a bug with jsonref2json.js that overrided "parent" field - my $str_ontologyTerm = < [ 'MolecularVariation', 'SystemicVariation', 'LegacyVariation' ], 'SystemicVariation' => ['CopyNumber'], - 'MolecularVariation' => [ 'Allele', 'Haplotype' ], - 'location' => [ 'CURIE', 'Location' ], + 'MolecularVariation' => [ 'Allele', 'Haplotype' ], + 'location' => [ 'CURIE', 'Location' ], 'state' => [ 'SequenceState', 'SequenceExpression' ], - 'Value' => [ 'Quantity', 'ontologyTerm' ] + 'Value' => [ 'Quantity', 'ontologyTerm' ] }; # We'll be checking @@ -699,14 +708,17 @@ sub parse_json_keywords { # my $const = $pointer->get("/$keyword/$property/$count/properties/type/const"); # $tmp_hash->{properties}{$const} = $elements; #} else{ - my $tmp_term = ( $pointer->contains("/$keyword/$count/title") && $pointer->get("/$keyword/$count/title") ne 'Ontology Term' ) + my $tmp_term = + ( $pointer->contains("/$keyword/$count/title") + && $pointer->get("/$keyword/$count/title") ne + 'Ontology Term' ) ? $pointer->get("/$keyword/$count/title") : @{ $terms->{$property} }[$count]; - $tmp_hash->{properties}{$tmp_term} = $elements if $tmp_term; # Ad-hoc some terms appear duplicated and come empty.... - #} + $tmp_hash->{properties}{$tmp_term} = $elements if $tmp_term; # Ad-hoc some terms appear duplicated and come empty.... + #} $count++; } - $data = $tmp_hash; # Adding new reference + $data = $tmp_hash; # Adding new reference } } return $data; @@ -872,7 +884,7 @@ =head1 HOW TO RUN BEACON_YAML2MD I The decission to take YAMLs (and not JSON) as an input is deliberate and made by the author. -I The script only processes the C nested B. Before Adoption of VRS/PHX that limit was OK. +I The script only processes the C nested B. Before Adoption of VRS/PXF that limit was OK. I The script also includes the Beacon v2 Models examples from L in JSON format. diff --git a/bin/transform_json2md.sh b/bin/transform_json2md.sh index 371471265..ce73254fc 100755 --- a/bin/transform_json2md.sh +++ b/bin/transform_json2md.sh @@ -2,11 +2,11 @@ # # Script to convert Beacon v2 Models to Markdown # -# Last Modified: Jul/20/2022 +# Last Modified: Mar/26/2022 # # Version 2.0.0 # -# Copyright (C) 2021-2022 Manuel Rueda (manuel.rueda@crg.eu) +# Copyright (C) 2021-2024 Manuel Rueda (manuel.rueda@cnag.eu) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -26,11 +26,12 @@ set -eu mod_dir=../models/json/beacon-v2-default-model fwk_dir=../framework/json -adhoc_url='https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/bin/adhoc' +#adhoc_url='https://raw.githubusercontent.com/g4gh-beacon/beacon-v2/main/bin/adhoc' +adhoc_url='https://raw.githubusercontent.com/mrueda/beacon-v2/main/bin/adhoc' out_dir=./deref_schemas jsonref='node ./jsonref2json.js' yaml2md=./beacon_yaml2md.pl -yaml2json='perl -MYAML -MJSON -0777 -wnl -e' +yaml2json='perl -MYAML::XS -MJSON::XS -0777 -wnl -e' mkdir -p $out_dir/obj @@ -75,7 +76,7 @@ do rm $out_dir/$schema/defaultSchema.mod.json echo "Transforming $schema JSON to YAML ..." - $yaml2json 'print YAML::Dump(decode_json($_))' $out_dir/$schema/defaultSchema.json | perl -pe 's/ \*(\d+)$/ $1/' > $out_dir/$schema/defaultSchema.yaml + $yaml2json 'print YAML::XS::Dump(decode_json($_))' $out_dir/$schema/defaultSchema.json | perl -pe 's/ \*(\d+)$/ $1/' > $out_dir/$schema/defaultSchema.yaml echo "---" done diff --git a/docs/schemas-md/beacon_terms.md b/docs/schemas-md/beacon_terms.md index 79b4edc88..cefc4a524 100644 --- a/docs/schemas-md/beacon_terms.md +++ b/docs/schemas-md/beacon_terms.md @@ -5,7 +5,7 @@ * [ageAtProcedure](./obj/ageAtProcedure.md) * [ageOfOnset](./obj/ageOfOnset.md) * [ageRange](./obj/ageRange.md) -* [AgeRange](./obj/AgeRange.md) +* [AgeRange_PXF](./obj/AgeRange_PXF.md) * [aligner](./obj/aligner.md) * [Allele](./obj/Allele.md) * [alleleFrequency](./obj/alleleFrequency.md) @@ -167,8 +167,8 @@ * [tumorProgression](./obj/tumorProgression.md) * [unit](./obj/unit.md) * [updateDateTime](./obj/updateDateTime.md) -* [Value](./obj/Value.md) * [value](./obj/value.md) +* [Value_PXF](./obj/Value_PXF.md) * [variantAlternativeIds](./obj/variantAlternativeIds.md) * [variantCaller](./obj/variantCaller.md) * [variantInternalId](./obj/variantInternalId.md) diff --git a/docs/schemas-md/obj/AgeRange_PXF.md b/docs/schemas-md/obj/AgeRange_PXF.md new file mode 100644 index 000000000..3c339728a --- /dev/null +++ b/docs/schemas-md/obj/AgeRange_PXF.md @@ -0,0 +1,3 @@ +|Term | Description | Type | Properties | Example | Enum| +| ---| ---| ---| ---| ---| --- | +| AgeRange | Age range definition. Provenance: GA4GH Phenopackets v2 `AgeRange` | object | [end](./end.md), [start](./start.md) | NA | NA| diff --git a/docs/schemas-md/obj/Complex Value.md b/docs/schemas-md/obj/Complex Value.md index c2ef54bca..fcfd3be4a 100644 --- a/docs/schemas-md/obj/Complex Value.md +++ b/docs/schemas-md/obj/Complex Value.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| Complex Value | Definition of a complex value class. Provenance: GA4GH Phenopackets v2 `TypedQuantity` | object | [typedQuantities](https://phenopacket-schema.readthedocs.io/en/latest/building-blocks.html) | NA | NA| +| Complex Value | Definition of a complex value class. Provenance: GA4GH Phenopackets v2 `TypedQuantity` | object | [required](./required.md), [typedQuantities](https://phenopacket-schema.readthedocs.io/en/latest/building-blocks.html) | NA | NA| diff --git a/docs/schemas-md/obj/Value_PXF.md b/docs/schemas-md/obj/Value_PXF.md new file mode 100644 index 000000000..e4923d337 --- /dev/null +++ b/docs/schemas-md/obj/Value_PXF.md @@ -0,0 +1,3 @@ +|Term | Description | Type | Properties | Example | Enum| +| ---| ---| ---| ---| ---| --- | +| Value | NA | oneOf | [Quantity](https://phenopacket-schema.readthedocs.io/en/latest/building-blocks.html), [ontologyTerm](https://github.com/ga4gh-beacon/beacon-v2/blob/main/framework/src/common/ontologyTerm.yaml) | NA | NA| diff --git a/docs/schemas-md/obj/ageAtProcedure.md b/docs/schemas-md/obj/ageAtProcedure.md index 30a208cf2..159874807 100644 --- a/docs/schemas-md/obj/ageAtProcedure.md +++ b/docs/schemas-md/obj/ageAtProcedure.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| ageAtProcedure | NA | oneOf | [Age](./Age.md), [AgeRange](./AgeRange.md), [GestationalAge](./GestationalAge.md), [TimeInterval](./TimeInterval.md) | NA | NA| +| ageAtProcedure | NA | oneOf | [Age](./Age.md), [AgeRange](./AgeRange_PXF.md), [GestationalAge](./GestationalAge.md), [TimeInterval](./TimeInterval.md) | NA | NA| diff --git a/docs/schemas-md/obj/ageOfOnset.md b/docs/schemas-md/obj/ageOfOnset.md index db5e513d8..8d7a32bdd 100644 --- a/docs/schemas-md/obj/ageOfOnset.md +++ b/docs/schemas-md/obj/ageOfOnset.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| ageOfOnset | NA | oneOf | [Age](./Age.md), [AgeRange](./AgeRange.md), [GestationalAge](./GestationalAge.md), [TimeInterval](./TimeInterval.md) | NA | NA| +| ageOfOnset | NA | oneOf | [Age](./Age.md), [AgeRange](./AgeRange_PXF.md), [GestationalAge](./GestationalAge.md), [TimeInterval](./TimeInterval.md) | NA | NA| diff --git a/docs/schemas-md/obj/alternateBases.md b/docs/schemas-md/obj/alternateBases.md index f564a83b5..1b51c83e5 100644 --- a/docs/schemas-md/obj/alternateBases.md +++ b/docs/schemas-md/obj/alternateBases.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| alternateBases | Alternate bases for this variant (starting from `start`). * Accepted values: IUPAC codes for nucleotides (e.g. `https://www.bioinformatics.org/sms/iupac.html`). * N is a wildcard, that denotes the position of any base, and can beused as a standalone base of any type or within a partially knownsequence. As example, a query of `ANNT` the Ns can take take any form of[ACGT] and will match `ANNT`, `ACNT`, `ACCT`, `ACGT` ... and so forth.* an *empty value* is used in the case of deletions with the maximally trimmed, deleted sequence being indicated in `ReferenceBases`* Categorical variant queries, e.g. such *not* being represented through sequence & position, make use of the `variantType` parameter.* Either `alternateBases` or `variantType` is required.' | string | NA | T, G, N, AG, | NA| +| alternateBases | Alternate bases for this variant (starting from `start`). * Accepted values: IUPAC codes for nucleotides (e.g. `https://www.bioinformatics.org/sms/iupac.html`). * N is a wildcard, that denotes the position of any base, and can be used as a standalone base of any type or within a partially known sequence.* an *empty value* is used in the case of deletions with the maximally trimmed, deleted sequence being indicated in `ReferenceBases` | string | NA | T, G, N, AG, | NA| diff --git a/docs/schemas-md/obj/date.md b/docs/schemas-md/obj/date.md index 265b422f2..0a06f4730 100644 --- a/docs/schemas-md/obj/date.md +++ b/docs/schemas-md/obj/date.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| date | Date of the exposure in ISO8601 format. | string | NA | NA | NA| +| date | Date of measurement. Addition compared to Phenopackets model. | string | NA | NA | NA| diff --git a/docs/schemas-md/obj/geneIds.md b/docs/schemas-md/obj/geneIds.md index e6bfc8ee0..f49486aa2 100644 --- a/docs/schemas-md/obj/geneIds.md +++ b/docs/schemas-md/obj/geneIds.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| geneIds | NA | array | NA | `["ACE2"]`,
`["BRCA1"]` | NA| +| geneIds | NA | array | NA | `["ACE2"]`,
`["BRCA1", "ENSG00000012048"]` | NA| diff --git a/docs/schemas-md/obj/id.md b/docs/schemas-md/obj/id.md index 75ad8e9c2..9b1a75368 100644 --- a/docs/schemas-md/obj/id.md +++ b/docs/schemas-md/obj/id.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| id | Run ID. | string | NA | SRR10903401 | NA| +| id | A CURIE identifier, e.g. as `id` for an ontology term. | string | NA | ga4gh:GA.01234abcde, DUO:0000004, orcid:0000-0003-3463-0775, PMID:15254584 | NA| diff --git a/docs/schemas-md/obj/measurementValue.md b/docs/schemas-md/obj/measurementValue.md index 51ef7d07c..7a7d07e97 100644 --- a/docs/schemas-md/obj/measurementValue.md +++ b/docs/schemas-md/obj/measurementValue.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| measurementValue | NA | oneOf | [Complex Value](./Complex Value.md), [Value](./Value.md) | NA | NA| +| measurementValue | NA | oneOf | [Complex Value](./Complex Value.md), [Value](./Value_PXF.md) | NA | NA| diff --git a/docs/schemas-md/obj/notes.md b/docs/schemas-md/obj/notes.md index 34da3f8f7..8c32f7e29 100644 --- a/docs/schemas-md/obj/notes.md +++ b/docs/schemas-md/obj/notes.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| notes | Unstructured text to describe additional properties of this disease instance. | string | NA | Some free text | NA| +| notes | Unstructured text to describe this measurement. Addition compared to Phenopackets model. | string | NA | Some free text | NA| diff --git a/docs/schemas-md/obj/observationMoment.md b/docs/schemas-md/obj/observationMoment.md index fc75d56bb..4e0e8bdf1 100644 --- a/docs/schemas-md/obj/observationMoment.md +++ b/docs/schemas-md/obj/observationMoment.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| observationMoment | NA | oneOf | [Age](./Age.md), [AgeRange](./AgeRange.md), [GestationalAge](./GestationalAge.md), [TimeInterval](./TimeInterval.md) | NA | NA| +| observationMoment | NA | oneOf | [Age](./Age.md), [AgeRange](./AgeRange_PXF.md), [GestationalAge](./GestationalAge.md), [TimeInterval](./TimeInterval.md) | NA | NA| diff --git a/docs/schemas-md/obj/onset.md b/docs/schemas-md/obj/onset.md index fc975e055..254bb2206 100644 --- a/docs/schemas-md/obj/onset.md +++ b/docs/schemas-md/obj/onset.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| onset | NA | oneOf | [Age](./Age.md), [AgeRange](./AgeRange.md), [GestationalAge](./GestationalAge.md), [TimeInterval](./TimeInterval.md) | NA | NA| +| onset | NA | oneOf | [Age](./Age.md), [AgeRange](./AgeRange_PXF.md), [GestationalAge](./GestationalAge.md), [TimeInterval](./TimeInterval.md) | NA | NA| diff --git a/docs/schemas-md/obj/population.md b/docs/schemas-md/obj/population.md index cbe5a0719..f68bc1929 100644 --- a/docs/schemas-md/obj/population.md +++ b/docs/schemas-md/obj/population.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| population | A name for the population. A population could an ethnic, geographical one or just the `members`of a study. | string | NA | East Asian, ICGC Chronic Lymphocytic Leukemia-ES, Men, Children | NA| +| population | A name for the population. A population could an ethnic, geographical one or just the members of a study. | string | NA | East Asian, ICGC Chronic Lymphocytic Leukemia-ES, Men, Children | NA| diff --git a/docs/schemas-md/obj/referenceBases.md b/docs/schemas-md/obj/referenceBases.md index 52d7f35d9..9065277f6 100644 --- a/docs/schemas-md/obj/referenceBases.md +++ b/docs/schemas-md/obj/referenceBases.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| referenceBases | Reference bases for this variant (starting from `start`). * Accepted values: IUPAC codes for nucleotides (e.g. `https://www.bioinformatics.org/sms/iupac.html`). * N is a wildcard, that denotes the position of any base, and can be used as a standalone base of any type or within a partially known sequence. As example, a query of `ANNT` the Ns can take take any form of `[ACGT]` and will match `ANNT`, `ACNT`, `ACCT`, `ACGT` ... and so forth.* an *empty value* is used in the case of insertions with the maximally trimmed, inserted sequence being indicated in `AlternateBases`.NOTE: Beacon instances may not support UIPAC codes and it is not mandatory for them to do so. In such cases the use of [ACGTN] is mandated. | string | NA | A, T, N, , ACG | NA| +| referenceBases | Reference bases for this variant (starting from `start`). * Accepted values: IUPAC codes for nucleotides (e.g. `https://www.bioinformatics.org/sms/iupac.html`). * N is a wildcard, that denotes the position of any base, and can be used as a standalone base of any type or within a partially known sequence.* an *empty value* is used in the case of insertions with the maximally trimmed, inserted sequence being indicated in `AlternateBases`. | string | NA | A, T, N, , ACG | NA| diff --git a/docs/schemas-md/obj/resolution.md b/docs/schemas-md/obj/resolution.md index c435266b9..302e9b009 100644 --- a/docs/schemas-md/obj/resolution.md +++ b/docs/schemas-md/obj/resolution.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| resolution | NA | oneOf | [Age](./Age.md), [AgeRange](./AgeRange.md), [GestationalAge](./GestationalAge.md), [TimeInterval](./TimeInterval.md) | NA | NA| +| resolution | NA | oneOf | [Age](./Age.md), [AgeRange](./AgeRange_PXF.md), [GestationalAge](./GestationalAge.md), [TimeInterval](./TimeInterval.md) | NA | NA| diff --git a/docs/schemas-md/obj/unit.md b/docs/schemas-md/obj/unit.md index b7f641e54..be78d0896 100644 --- a/docs/schemas-md/obj/unit.md +++ b/docs/schemas-md/obj/unit.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| unit | The kind of unit. Recommended from NCIT Unit of Category ontology term (NCIT:C42568) descendants | object | [id](./id.md), [label](./label.md) | `[{"id": "NCIT:C70575", "label": "Roentgen"}, {"id": "NCIT:C28252", "label": "Kilogram"}, {"id": "NCIT:C28253", "label": "Milligram"}]` | NA| +| unit | Unit of the exposure. Recommended from NCIT Unit of Category ontology term (NCIT:C42568) descendants. | object | [id](./id.md), [label](./label.md) | `[{"id": "NCIT:C70575", "label": "Roentgen"}, {"id": "NCIT:C28252", "label": "Kilogram"}, {"id": "NCIT:C28253", "label": "Milligram"}]` | NA| diff --git a/docs/schemas-md/obj/value.md b/docs/schemas-md/obj/value.md index 9f7ec9ebd..efbfedc5c 100644 --- a/docs/schemas-md/obj/value.md +++ b/docs/schemas-md/obj/value.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| value | The value of the quantity in the units | number | NA | NA | NA| +| value | Quantification of the exposure. | number | NA | NA | NA| diff --git a/docs/schemas-md/obj/variantType.md b/docs/schemas-md/obj/variantType.md index e2f950ad2..6b3ab66be 100644 --- a/docs/schemas-md/obj/variantType.md +++ b/docs/schemas-md/obj/variantType.md @@ -1,3 +1,3 @@ |Term | Description | Type | Properties | Example | Enum| | ---| ---| ---| ---| ---| --- | -| variantType | The `variantType` declares the nature of the variation in relation to a reference. In a response, it is used to describe the variation. In a request, it is used to declare the type of event the Beacon client is looking for. If in queries variants can not be defined through a sequence of one or more bases (`precise` variants) it can be used standalone (i.e. without `alternateBases`) together with positional parameters. Examples here are e.g. queries for structural variants such as `DUP` (increased allelic count of material from the genomic region between `start` and `end` positions without assumption about the placement of the additional sequence) or `DEL` (deletion of sequence following `start`). Either `alternateBases` or `variantType` is required, with the exception of range queries (single `start` and `end` parameters). | string | NA | SNP, DEL, DUP, BND | NA| +| variantType | The `variantType` declares the nature of the variation in relation to a reference. In a response, it is used to describe the variation. Examples here are e.g. structural variants such as `DUP` (increased allelic count of material from the genomic region between `start` and `end` positions without assumption about the placement of the additional sequence) or `DEL` (deletion of sequence following `start`). Either `alternateBases` or `variantType` is required in representing a `LegacyVariation`. | string | NA | SNP, DEL, DUP, BND | NA| From f2f08cacb306cd9990241a51d28b56076d1a3467 Mon Sep 17 00:00:00 2001 From: Manuel Rueda Date: Tue, 26 Mar 2024 17:24:58 +0100 Subject: [PATCH 66/77] Remove clashing files --- docs/schemas-md/obj/AgeRange.md | 3 --- docs/schemas-md/obj/Value.md | 3 --- 2 files changed, 6 deletions(-) delete mode 100644 docs/schemas-md/obj/AgeRange.md delete mode 100644 docs/schemas-md/obj/Value.md diff --git a/docs/schemas-md/obj/AgeRange.md b/docs/schemas-md/obj/AgeRange.md deleted file mode 100644 index 3c339728a..000000000 --- a/docs/schemas-md/obj/AgeRange.md +++ /dev/null @@ -1,3 +0,0 @@ -|Term | Description | Type | Properties | Example | Enum| -| ---| ---| ---| ---| ---| --- | -| AgeRange | Age range definition. Provenance: GA4GH Phenopackets v2 `AgeRange` | object | [end](./end.md), [start](./start.md) | NA | NA| diff --git a/docs/schemas-md/obj/Value.md b/docs/schemas-md/obj/Value.md deleted file mode 100644 index e4923d337..000000000 --- a/docs/schemas-md/obj/Value.md +++ /dev/null @@ -1,3 +0,0 @@ -|Term | Description | Type | Properties | Example | Enum| -| ---| ---| ---| ---| ---| --- | -| Value | NA | oneOf | [Quantity](https://phenopacket-schema.readthedocs.io/en/latest/building-blocks.html), [ontologyTerm](https://github.com/ga4gh-beacon/beacon-v2/blob/main/framework/src/common/ontologyTerm.yaml) | NA | NA| From b154ddaeb17b88ca39f6e0396feba4447ade12de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oriol=20L=C3=B3pez-Doriga?= Date: Thu, 11 Apr 2024 15:35:03 +0200 Subject: [PATCH 67/77] complexValue required relocated to correct level --- models/json/beacon-v2-default-model/common/complexValue.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/json/beacon-v2-default-model/common/complexValue.json b/models/json/beacon-v2-default-model/common/complexValue.json index aba373e2f..fd9993392 100644 --- a/models/json/beacon-v2-default-model/common/complexValue.json +++ b/models/json/beacon-v2-default-model/common/complexValue.json @@ -38,9 +38,9 @@ "$ref": "#/definitions/TypedQuantity" }, "type": "array" - }, - "required": [ "typedQuantities" ] + } }, + "required": [ "typedQuantities" ], "title": "Complex Value", "type": "object" } \ No newline at end of file From f5be698a78da255986d6b3b02d21eba7c0b36641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oriol=20L=C3=B3pez-Doriga?= Date: Fri, 3 May 2024 15:45:04 +0200 Subject: [PATCH 68/77] adding github actions demo file --- .github/workflows/github-actions-demo.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/workflows/github-actions-demo.yml diff --git a/.github/workflows/github-actions-demo.yml b/.github/workflows/github-actions-demo.yml new file mode 100644 index 000000000..8a9c1ffdf --- /dev/null +++ b/.github/workflows/github-actions-demo.yml @@ -0,0 +1,18 @@ +name: GitHub Actions Demo +run-name: ${{ github.actor }} is testing out GitHub Actions 🚀 +on: [push] +jobs: + Explore-GitHub-Actions: + runs-on: ubuntu-latest + steps: + - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." + - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" + - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." + - name: Check out repository code + uses: actions/checkout@v3 + - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." + - run: echo "🖥️ The workflow is now ready to test your code on the runner." + - name: List files in the repository + run: | + ls ${{ github.workspace }} + - run: echo "🍏 This job's status is ${{ job.status }}." \ No newline at end of file From cfcc85d34df506f726c89f68c9fb367f945e265f Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Sat, 6 Jul 2024 15:51:54 +0200 Subject: [PATCH 69/77] Hot Fix to align with json The last fix for the wrong level of `required` was only done in json... Please always add `src` first since (well, both). --- models/src/beacon-v2-default-model/common/complexValue.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/models/src/beacon-v2-default-model/common/complexValue.yaml b/models/src/beacon-v2-default-model/common/complexValue.yaml index 98207b12b..058a91b9f 100644 --- a/models/src/beacon-v2-default-model/common/complexValue.yaml +++ b/models/src/beacon-v2-default-model/common/complexValue.yaml @@ -9,8 +9,8 @@ properties: type: array items: $ref: '#/definitions/TypedQuantity' - required: - - typedQuantities +required: + - typedQuantities definitions: TypedQuantity: @@ -32,4 +32,4 @@ definitions: label: Millimeter of Mercury required: - quantityType - - quantity \ No newline at end of file + - quantity From 971a2adb46c2c6a7706d58e1493c06108c049e06 Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Sat, 6 Jul 2024 15:59:49 +0200 Subject: [PATCH 70/77] Update requestParameters.yaml for at least 1 end value --- .../genomicVariations/requestParameters.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/src/beacon-v2-default-model/genomicVariations/requestParameters.yaml b/models/src/beacon-v2-default-model/genomicVariations/requestParameters.yaml index 37c5b9e48..112bdb2ab 100644 --- a/models/src/beacon-v2-default-model/genomicVariations/requestParameters.yaml +++ b/models/src/beacon-v2-default-model/genomicVariations/requestParameters.yaml @@ -16,7 +16,7 @@ g_variant: - typical use are queries for SNV and small InDels - the use of `start` without an `end` parameter requires the use of `alternateBases` - * `start` and `end`: + * 1 value in both `start` and `end`: - for searching any variant falling fully or partially within the range between `start` and `end` (a.k.a. "range query") - additional use of `variantType` OR `alternateBases` can limit the @@ -48,7 +48,7 @@ g_variant: type: integer format: int64 minimum: 1 - minItems: 0 + minItems: 1 maxItems: 2 referenceBases: $ref: ./requestParametersComponents.yaml#/definitions/ReferenceBases From 33d22289f1c6355be8014d545abe02b4b0cee58e Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Sat, 6 Jul 2024 16:03:38 +0200 Subject: [PATCH 71/77] Update requestParameters.json for at least 1 value in end --- .../genomicVariations/requestParameters.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/models/json/beacon-v2-default-model/genomicVariations/requestParameters.json b/models/json/beacon-v2-default-model/genomicVariations/requestParameters.json index 48381aaf7..e469211f4 100644 --- a/models/json/beacon-v2-default-model/genomicVariations/requestParameters.json +++ b/models/json/beacon-v2-default-model/genomicVariations/requestParameters.json @@ -17,14 +17,14 @@ "$ref": "./requestParametersComponents.json#/definitions/Assembly" }, "end": { - "description": "Precise or bracketing the end of the variants of interest: * (0-based, exclusive) - see `start` * for bracket queries, provide 2 values (e.g. [111,222]).\"", + "description": "Precise or bracketing the end of the variants of interest: * (0-based, exclusive) - see `start` * for bracket queries, provide 2 values (e.g. [111,222]).", "items": { "format": "int64", "minimum": 1, "type": "integer" }, "maxItems": 2, - "minItems": 0, + "minItems": 1, "type": "array" }, "geneId": { @@ -52,7 +52,7 @@ "$ref": "./requestParametersComponents.json#/definitions/RefSeqId" }, "start": { - "description": "Precise or fuzzy start coordinate position(s), allele locus (0-based, inclusive). * `start` only:\n - for single positions, e.g. the start of a specified sequence\n alteration where the size is given through the specified `alternateBases`\n - typical use are queries for SNV and small InDels\n - the use of `start` without an `end` parameter requires the use of\n `alternateBases`\n* `start` and `end`:\n - for searching any variant falling fully or partially within the range\n between `start` and `end` (a.k.a. \"range query\")\n - additional use of `variantType` OR `alternateBases` can limit the\n scope of the query\n - by convention, partial overlaps of variants with the indicated genomic\n range are accepted; for specific overlap requirements the 4-parameter\n \"Bracket Queries\" should be employed\n* 2 values in both `start` and `end` for constructing a \"Bracket Query\":\n - can be used to match any contiguous genomic interval, e.g. for querying\n imprecise positions\n - identifies all structural variants starting between `start[0]` and `start[1]`,\n and ending between `end[0]` <-> `end[1]`\n - single or double sided precise matches can be achieved by setting\n `start[1]=start[0]+1` and `end[1]=end[0]+1`", + "description": "Precise or fuzzy start coordinate position(s), allele locus (0-based, inclusive). * `start` only:\n - for single positions, e.g. the start of a specified sequence\nalteration where the size is given through the specified `alternateBases`\n - typical use are queries for SNV and small InDels\n - the use of `start` without an `end` parameter requires the use of\n`alternateBases`\n* 1 value each in both `start` and `end`:\n - for searching any variant falling fully or partially within the range\n between `start` and `end` (a.k.a. \"range query\")\n - additional use of `variantType` OR `alternateBases` can limit the\n scope of the query\n - by convention, partial overlaps of variants with the indicated genomic\n range are accepted; for specific overlap requirements the 4-parameter\n \"Bracket Queries\" should be employed\n* 2 values in both `start` and `end` for constructing a \"Bracket Query\":\n - can be used to match any contiguous genomic interval, e.g. for querying\n imprecise positions\n - identifies all structural variants starting between `start[0]` and `start[1]`,\n and ending between `end[0]` <-> `end[1]`\n - single or double sided precise matches can be achieved by setting\n `start[1]=start[0]+1` and `end[1]=end[0]+1`", "items": { "format": "int64", "minimum": 0, @@ -87,4 +87,4 @@ }, "type": "object" } -} \ No newline at end of file +} From 9f9c96ab9f6c4f2b5b14ed33db10b26325d9ac14 Mon Sep 17 00:00:00 2001 From: Oriol Lopez-Doriga Date: Wed, 10 Jul 2024 14:59:03 +0200 Subject: [PATCH 72/77] renaming endpoints for beaconMap --- .../beacon-v2-default-model/beaconMap.json | 62 +++++++++---------- .../beacon-v2-default-model/beaconMap.yaml | 62 +++++++++---------- 2 files changed, 62 insertions(+), 62 deletions(-) diff --git a/models/json/beacon-v2-default-model/beaconMap.json b/models/json/beacon-v2-default-model/beaconMap.json index 4c9a12a78..a7681a24f 100644 --- a/models/json/beacon-v2-default-model/beaconMap.json +++ b/models/json/beacon-v2-default-model/beaconMap.json @@ -1,9 +1,9 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", "endpointSets": { - "analysis": { + "analysisEndpoints": { "endpoints": { - "genomicVariant": { + "genomicVariantLookup": { "returnedEntryType": "genomicVariant", "url": "https://exampleBeacons.org/analyses/{id}/g_variants" } @@ -13,17 +13,17 @@ "rootUrl": "https://exampleBeacons.org/analyses", "singleEntryUrl": "https://exampleBeacons.org/analyses/{id}" }, - "biosample": { + "biosampleEndpoints": { "endpoints": { - "analysis": { + "analysisLookup": { "returnedEntryType": "analysis", "url": "https://exampleBeacons.org/biosamples/{id}/analyses" }, - "genomicVariant": { + "genomicVariantLookup": { "returnedEntryType": "genomicVariant", "url": "https://exampleBeacons.org/biosamples/{id}/g_variants" }, - "run": { + "runLookup": { "returnedEntryType": "run", "url": "https://exampleBeacons.org/biosamples/{id}/runs" } @@ -33,25 +33,25 @@ "rootUrl": "https://exampleBeacons.org/biosamples", "singleEntryUrl": "https://exampleBeacons.org/biosamples/{id}" }, - "cohort": { + "cohortEndpoints": { "endpoints": { - "analyses": { + "analysisLookup": { "returnedEntryType": "analysis", "url": "https://exampleBeacons.org/cohorts/{id}/analyses" }, - "biosample": { + "biosampleLookup": { "returnedEntryType": "biosample", "url": "https://exampleBeacons.org/cohorts/{id}/biosamples" }, - "genomicVariant": { + "genomicVariantLookup": { "returnedEntryType": "genomicVariant", "url": "https://exampleBeacons.org/cohorts/{id}/g_variants" }, - "individual": { + "individualLookup": { "returnedEntryType": "individual", "url": "https://exampleBeacons.org/cohorts/{id}/individuals" }, - "runs": { + "runLookup": { "returnedEntryType": "run", "url": "https://exampleBeacons.org/cohorts/{id}/runs" } @@ -62,25 +62,25 @@ "rootUrl": "https://exampleBeacons.org/cohorts", "singleEntryUrl": "https://exampleBeacons.org/cohorts/{id}" }, - "dataset": { + "datasetEndpoints": { "endpoints": { - "analyses": { + "analysisLookup": { "returnedEntryType": "analysis", "url": "https://exampleBeacons.org/datasets/{id}/analyses" }, - "biosample": { + "biosampleLookup": { "returnedEntryType": "biosample", "url": "https://exampleBeacons.org/datasets/{id}/biosamples" }, - "genomicVariant": { + "genomicVariantLookup": { "returnedEntryType": "genomicVariant", "url": "https://exampleBeacons.org/datasets/{id}/g_variants" }, - "individual": { + "individualLookup": { "returnedEntryType": "individual", "url": "https://exampleBeacons.org/datasets/{id}/individuals" }, - "runs": { + "runLookup": { "returnedEntryType": "run", "url": "https://exampleBeacons.org/datasets/{id}/runs" } @@ -91,21 +91,21 @@ "rootUrl": "https://exampleBeacons.org/datasets", "singleEntryUrl": "https://exampleBeacons.org/datasets/{id}" }, - "genomicVariant": { + "genomicVariantEndpoints": { "endpoints": { - "analyses": { + "analysisLookup": { "returnedEntryType": "analysis", "url": "https://exampleBeacons.org/g_variants/{id}/analyses" }, - "biosample": { + "biosampleLookup": { "returnedEntryType": "biosample", "url": "https://exampleBeacons.org/g_variants/{id}/biosamples" }, - "individual": { + "individualLookup": { "returnedEntryType": "individual", "url": "https://exampleBeacons.org/g_variants/{id}/individuals" }, - "runs": { + "runLookup": { "returnedEntryType": "run", "url": "https://exampleBeacons.org/g_variants/{id}/runs" } @@ -115,21 +115,21 @@ "rootUrl": "https://exampleBeacons.org/g_variants", "singleEntryUrl": "https://exampleBeacons.org/g_variants/{id}" }, - "individual": { + "individualEndpoints": { "endpoints": { - "analyses": { + "analysisLookup": { "returnedEntryType": "analysis", "url": "https://exampleBeacons.org/individuals/{id}/analyses" }, - "biosample": { + "biosampleLookup": { "returnedEntryType": "biosample", "url": "https://exampleBeacons.org/individuals/{id}/biosamples" }, - "genomicVariant": { + "genomicVariantLookup": { "returnedEntryType": "genomicVariant", "url": "https://exampleBeacons.org/individuals/{id}/g_variants" }, - "runs": { + "runLookup": { "returnedEntryType": "run", "url": "https://exampleBeacons.org/individuals/{id}/runs" } @@ -140,13 +140,13 @@ "rootUrl": "https://exampleBeacons.org/individuals", "singleEntryUrl": "https://exampleBeacons.org/individuals/{id}" }, - "run": { + "runEndpoints": { "endpoints": { - "analysis": { + "analysisLookup": { "returnedEntryType": "analysis", "url": "https://exampleBeacons.org/runs/{id}/analyses" }, - "genomicVariant": { + "genomicVariantLookup": { "returnedEntryType": "genomicVariant", "url": "https://exampleBeacons.org/runs/{id}/g_variants" } diff --git a/models/src/beacon-v2-default-model/beaconMap.yaml b/models/src/beacon-v2-default-model/beaconMap.yaml index 3da0cd2a4..823d60f74 100644 --- a/models/src/beacon-v2-default-model/beaconMap.yaml +++ b/models/src/beacon-v2-default-model/beaconMap.yaml @@ -1,119 +1,119 @@ $schema: https://json-schema.org/draft/2020-12/schema endpointSets: - dataset: + datasetEndpoints: entryType: dataset openAPIEndpointsDefinition: https://exampleBeacons.org/datasets/endpoints.json rootUrl: https://exampleBeacons.org/datasets singleEntryUrl: https://exampleBeacons.org/datasets/{id} filteringTermsUrl: https://exampleBeacons.org/datasets/{id}/filtering_terms endpoints: - genomicVariant: + genomicVariantLookup: returnedEntryType: genomicVariant url: https://exampleBeacons.org/datasets/{id}/g_variants - biosample: + biosampleLookup: returnedEntryType: biosample url: https://exampleBeacons.org/datasets/{id}/biosamples - individual: + individualLookup: returnedEntryType: individual url: https://exampleBeacons.org/datasets/{id}/individuals - runs: + runLookup: returnedEntryType: run url: https://exampleBeacons.org/datasets/{id}/runs - analyses: + analysisLookup: returnedEntryType: analysis url: https://exampleBeacons.org/datasets/{id}/analyses - cohort: + cohortEndpoints: entryType: cohort openAPIEndpointsDefinition: https://exampleBeacons.org/cohorts/endpoints.json rootUrl: https://exampleBeacons.org/cohorts singleEntryUrl: https://exampleBeacons.org/cohorts/{id} filteringTermsUrl: https://exampleBeacons.org/cohorts/{id}/filtering_terms endpoints: - individual: + individualLookup: returnedEntryType: individual url: https://exampleBeacons.org/cohorts/{id}/individuals - genomicVariant: + genomicVariantLookup: returnedEntryType: genomicVariant url: https://exampleBeacons.org/cohorts/{id}/g_variants - biosample: + biosampleLookup: returnedEntryType: biosample url: https://exampleBeacons.org/cohorts/{id}/biosamples - runs: + runLookup: returnedEntryType: run url: https://exampleBeacons.org/cohorts/{id}/runs - analyses: + analysisLookup: returnedEntryType: analysis url: https://exampleBeacons.org/cohorts/{id}/analyses - genomicVariant: + genomicVariantEndpoints: entryType: genomicVariant openAPIEndpointsDefinition: https://exampleBeacons.org/genomicVariations/endpoints.json rootUrl: https://exampleBeacons.org/g_variants singleEntryUrl: https://exampleBeacons.org/g_variants/{id} endpoints: - biosample: + biosampleLookup: returnedEntryType: biosample url: https://exampleBeacons.org/g_variants/{id}/biosamples - individual: + individualLookup: returnedEntryType: individual url: https://exampleBeacons.org/g_variants/{id}/individuals - runs: + runLookup: returnedEntryType: run url: https://exampleBeacons.org/g_variants/{id}/runs - analyses: + analysisLookup: returnedEntryType: analysis url: https://exampleBeacons.org/g_variants/{id}/analyses - individual: + individualEndpoints: entryType: individual openAPIEndpointsDefinition: https://exampleBeacons.org/individuals/endpoints.json rootUrl: https://exampleBeacons.org/individuals singleEntryUrl: https://exampleBeacons.org/individuals/{id} filteringTermsUrl: https://exampleBeacons.org/individuals/{id}/filtering_terms endpoints: - genomicVariant: + genomicVariantLookup: returnedEntryType: genomicVariant url: https://exampleBeacons.org/individuals/{id}/g_variants - biosample: + biosampleLookup: returnedEntryType: biosample url: https://exampleBeacons.org/individuals/{id}/biosamples - runs: + runLookup: returnedEntryType: run url: https://exampleBeacons.org/individuals/{id}/runs - analyses: + analysisLookup: returnedEntryType: analysis url: https://exampleBeacons.org/individuals/{id}/analyses - biosample: + biosampleEndpoints: entryType: biosample openAPIEndpointsDefinition: https://exampleBeacons.org/biosamples/endpoints.json rootUrl: https://exampleBeacons.org/biosamples singleEntryUrl: https://exampleBeacons.org/biosamples/{id} endpoints: - run: + runLookup: returnedEntryType: run url: https://exampleBeacons.org/biosamples/{id}/runs - analysis: + analysisLookup: returnedEntryType: analysis url: https://exampleBeacons.org/biosamples/{id}/analyses - genomicVariant: + genomicVariantLookup: returnedEntryType: genomicVariant url: https://exampleBeacons.org/biosamples/{id}/g_variants - run: + runEndpoints: entryType: run openAPIEndpointsDefinition: https://exampleBeacons.org/runs/endpoints.json rootUrl: https://exampleBeacons.org/runs singleEntryUrl: https://exampleBeacons.org/runs/{id} endpoints: - analysis: + analysisLookup: returnedEntryType: analysis url: https://exampleBeacons.org/runs/{id}/analyses - genomicVariant: + genomicVariantLookup: returnedEntryType: genomicVariant url: https://exampleBeacons.org/runs/{id}/g_variants - analysis: + analysisEndpoints: entryType: analysis openAPIEndpointsDefinition: https://exampleBeacons.org/analyses/endpoints.json rootUrl: https://exampleBeacons.org/analyses singleEntryUrl: https://exampleBeacons.org/analyses/{id} endpoints: - genomicVariant: + genomicVariantLookup: returnedEntryType: genomicVariant url: https://exampleBeacons.org/analyses/{id}/g_variants From de829f38908493751d38a8fc9278a339d16bc9e8 Mon Sep 17 00:00:00 2001 From: Michael Baudis Date: Sat, 13 Jul 2024 16:51:32 +0200 Subject: [PATCH 73/77] updated CNV term mapping table This brings it in line with the hCNV version where it is being maintained (adjustment for VRS official status etc.). See https://cnvar.org/resources/CNV-annotation-standards/ --- docs/variant-queries.md | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/docs/variant-queries.md b/docs/variant-queries.md index 698ccc016..9ffc7e393 100644 --- a/docs/variant-queries.md +++ b/docs/variant-queries.md @@ -374,18 +374,19 @@ values to underlying genomic variations had not been precisely defined. This table is maintained in parallel with the [hCNV community documentation](https://cnvar.org/resources/CNV-annotation-standards/#cnv-term-use-comparison-in-computational-fileschema-formats). -| [EFO](https://www.ebi.ac.uk/efo/EFO_0030063) | Beacon | [VCF](https://samtools.github.io/hts-specs/) | SO | GA4GH [VRS](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒
[VRS proposal](https://github.com/ga4gh/vrs/issues/404)[^1] | Notes | +| [EFO](http://www.ebi.ac.uk/efo/EFO_0030063) | Beacon | [VCF](https://samtools.github.io/hts-specs/) | SO | GA4GH [VRS](https://vrs.ga4gh.org/en/latest/terms_and_model.html#copynumberchange)[^1] | Notes | | ------------------------------------------- | ------------------------------------------------------------------------------ | -------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----- | -| [`EFO:0030070`](https://www.ebi.ac.uk/efo/EFO_0030070) copy number gain | `DUP`[^2] or
[`EFO:0030070`](https://www.ebi.ac.uk/efo/EFO_0030070) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](https://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`low-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) (implicit) ⇒ [`EFO:0030070`](https://www.ebi.ac.uk/efo/EFO_0030070) copy number gain | a sequence alteration whereby the copy number of a given genomic region is greater than the reference sequence | -| [`EFO:0030071`](https://www.ebi.ac.uk/efo/EFO_0030071) low-level copy number gain| `DUP`[^2] or
[`EFO:0030071`](https://www.ebi.ac.uk/efo/EFO_0030071) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](https://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`low-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030071`](https://www.ebi.ac.uk/efo/EFO_0030071) low-level copy number gain | | -| [`EFO:0030072`](https://www.ebi.ac.uk/efo/EFO_0030072) high-level copy number gain | `DUP`[^2] or
[`EFO:0030072`](https://www.ebi.ac.uk/efo/EFO_0030072) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](https://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`high-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030072`](https://www.ebi.ac.uk/efo/EFO_0030072) high-level copy number gain | commonly but not consistently used for >=5 copies on a bi-allelic genome region | -| [`EFO:0030073`](https://www.ebi.ac.uk/efo/EFO_0030073) focal genome amplification | `DUP`[^2] or
[`EFO:0030073`](https://www.ebi.ac.uk/efo/EFO_0030073) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](https://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`high-level gain`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030073`](https://www.ebi.ac.uk/efo/EFO_0030073) focal genome amplification | commonly but not consistently used for >=5 copies on a bi-allelic genome region, of limited size (operationally max. 1-5Mb) | -| [`EFO:0030067`](https://www.ebi.ac.uk/efo/EFO_0030067) copy number loss | `DEL`[^2] or
[`EFO:0030067`](https://www.ebi.ac.uk/efo/EFO_0030067) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](https://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`partial loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) (implicit) ⇒ [`EFO:0030067`](https://www.ebi.ac.uk/efo/EFO_0030067) copy number loss | a sequence alteration whereby the copy number of a given genomic region is smaller than the reference sequence | -| [`EFO:0030068`](https://www.ebi.ac.uk/efo/EFO_0030068) low-level copy number loss | `DEL`[^2] or
[`EFO:0030068`](https://www.ebi.ac.uk/efo/EFO_0030068) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](https://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`partial loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030068`](https://www.ebi.ac.uk/efo/EFO_0030068) low-level copy number loss | | -| [`EFO:0020073`](https://www.ebi.ac.uk/efo/EFO_0020073) high-level copy number loss | `DEL`[^2] or
[`EFO:0020073`](https://github.com/EBISPOT/efo/issues/1941) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](https://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`partial loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0020073`](https://github.com/EBISPOT/efo/issues/1941) high-level copy number loss | a loss of several copies; also used in cases where a complete genomic deletion cannot be asserted | -| [`EFO:0030069`](https://www.ebi.ac.uk/efo/EFO_0030069) complete genomic deletion | `DEL`[^2] or
[`EFO:0030069`](https://www.ebi.ac.uk/efo/EFO_0030069) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](https://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`complete loss`](https://vrs.ga4gh.org/en/latest/terms_and_model.html#relativecopynumber) ⇒ [`EFO:0030069`](https://www.ebi.ac.uk/efo/EFO_0030069) complete genomic deletion | complete genomic deletion (e.g. homozygous deletion on a bi-allelic genome region) | - -##### Last updated 2023-03-22 by @mbaudis (EFO:0020073) +| [`EFO:0030070`](http://www.ebi.ac.uk/efo/EFO_0030070) copy number gain | `DUP`[^2] or
[`EFO:0030070`](http://www.ebi.ac.uk/efo/EFO_0030070) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](http://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`EFO:0030070`](http://www.ebi.ac.uk/efo/EFO_0030070) gain | a sequence alteration whereby the copy number of a given genomic region is greater than the reference sequence | +| [`EFO:0030071`](http://www.ebi.ac.uk/efo/EFO_0030071) low-level copy number gain| `DUP`[^2] or
[`EFO:0030071`](http://www.ebi.ac.uk/efo/EFO_0030071) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](http://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`EFO:0030071`](http://www.ebi.ac.uk/efo/EFO_0030071) low-level gain | | +| [`EFO:0030072`](http://www.ebi.ac.uk/efo/EFO_0030072) high-level copy number gain | `DUP`[^2] or
[`EFO:0030072`](http://www.ebi.ac.uk/efo/EFO_0030072) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](http://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`EFO:0030072`](http://www.ebi.ac.uk/efo/EFO_0030072) high-level gain | commonly but not consistently used for >=5 copies on a bi-allelic genome region | +| [`EFO:0030073`](http://www.ebi.ac.uk/efo/EFO_0030073) focal genome amplification | `DUP`[^2] or
[`EFO:0030073`](http://www.ebi.ac.uk/efo/EFO_0030073) | `DUP`
`SVCLAIM=D`[^3] | [`SO:0001742`](http://www.sequenceontology.org/browser/current_release/term/SO:0001742) copy_number_gain | [`EFO:0030072`](http://www.ebi.ac.uk/efo/EFO_0030072) high-level gain[^4] | commonly but not consistently used for >=5 copies on a bi-allelic genome region, of limited size (operationally max. 1-5Mb) | +| [`EFO:0030067`](http://www.ebi.ac.uk/efo/EFO_0030067) copy number loss | `DEL`[^2] or
[`EFO:0030067`](http://www.ebi.ac.uk/efo/EFO_0030067) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](http://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`EFO:0030067`](http://www.ebi.ac.uk/efo/EFO_0030067) loss | a sequence alteration whereby the copy number of a given genomic region is smaller than the reference sequence | +| [`EFO:0030068`](http://www.ebi.ac.uk/efo/EFO_0030068) low-level copy number loss | `DEL`[^2] or
[`EFO:0030068`](http://www.ebi.ac.uk/efo/EFO_0030068) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](http://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`EFO:0030068`](http://www.ebi.ac.uk/efo/EFO_0030068) low-level loss | | +| [`EFO:0020073`](http://www.ebi.ac.uk/efo/EFO_0020073) high-level copy number loss | `DEL`[^2] or
[`EFO:0020073`](https://github.com/EBISPOT/efo/issues/1941) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](http://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`EFO:0020073`](https://github.com/EBISPOT/efo/issues/1941) high-level loss | a loss of several copies; also used in cases where a complete genomic deletion cannot be asserted | +| [`EFO:0030069`](http://www.ebi.ac.uk/efo/EFO_0030069) complete genomic deletion | `DEL`[^2] or
[`EFO:0030069`](http://www.ebi.ac.uk/efo/EFO_0030069) | `DEL`
`SVCLAIM=D`[^3] | [`SO:0001743`](http://www.sequenceontology.org/browser/current_release/term/SO:0001743) copy_number_loss | [`EFO:0030069`](http://www.ebi.ac.uk/efo/EFO_0030069) complete genomic loss | complete genomic deletion (e.g. homozygous deletion on a bi-allelic genome region) | + + +##### Last updated 2023-07-13 to align with 2023-03-22 hCNV documentation (VRS 1.3 adjustment) by @mbaudis ##### updated 2023-03-20 by @mbaudis (VRS proposal) ## Query Parameter Change Log @@ -417,17 +418,17 @@ recommended for query forms and `alternateBases` -[^1]: The VRS annotations refer to the status at v1.2 (2022). The GA4GH VRS team -is currently (Spring 2023) preparing an updated specification which will introduce -the new class `CopyNumberChange` ([discussion...](https://github.com/ga4gh/vrs/issues/404#issuecomment-1472599849)) with the use of the EFO terms (including a new term -for `high level deletion (EFO:0020073)` in the April 2023 EFO release). +[^1]: The VRS annotations refer to the status from v1.3 (2022) when +the new class `CopyNumberChange` ([discussion...](https://github.com/ga4gh/vrs/issues/404#issuecomment-1472599849)) +with the use of the EFO terms. [^2]: While the use of VCF derived (`DUP`, `DEL`) values had been introduced with beacon v1, usage of these terms has always been a _recommendation_ rather than an integral part of the API. We now encourage the support of more specific terms (particularly EFO) -by Beacon developers. As example, the Progentix Beacon API [uses EFO terms](https://progenetix.org/search/) but +by Beacon developers. As example, the Progentix Beacon API [uses EFO terms](http://progenetix.org/search/) but provides an internal term expansion for legacy `DUP`, `DEL` support. [^3]: VCFv4.4 introduces an `SVCLAIM` field to disambiguate between _in situ_ events (such as tandem duplications; known _adjacency_/ _break junction_: `SVCLAIM=J`) and events where e.g. only the change in _abundance_ / _read depth_ (`SVCLAIM=D`) has been determined. Both **J** and **D** flags can be combined. +[^4]: VRS did not adopt the "amplification" term due to possible inconsistencies From 18eff1cd645c312fe17f205b0b22e49ce5fb356a Mon Sep 17 00:00:00 2001 From: Oriol Lopez-Doriga Date: Tue, 16 Jul 2024 10:42:38 +0200 Subject: [PATCH 74/77] deleting aggregated from Granularity enum --- framework/json/common/beaconCommonComponents.json | 1 - framework/src/common/beaconCommonComponents.yaml | 1 - 2 files changed, 2 deletions(-) diff --git a/framework/json/common/beaconCommonComponents.json b/framework/json/common/beaconCommonComponents.json index 768d938c4..f53235861 100644 --- a/framework/json/common/beaconCommonComponents.json +++ b/framework/json/common/beaconCommonComponents.json @@ -80,7 +80,6 @@ "enum": [ "boolean", "count", - "aggregated", "record" ], "type": "string" diff --git a/framework/src/common/beaconCommonComponents.yaml b/framework/src/common/beaconCommonComponents.yaml index 53296705a..09b1340b9 100644 --- a/framework/src/common/beaconCommonComponents.yaml +++ b/framework/src/common/beaconCommonComponents.yaml @@ -147,7 +147,6 @@ definitions: enum: - boolean - count - - aggregated - record default: boolean TestMode: From 556e5b5bc11f37b1cc1c1a718c00c1ea6501720a Mon Sep 17 00:00:00 2001 From: Oriol Lopez-Doriga Date: Tue, 16 Jul 2024 10:45:31 +0200 Subject: [PATCH 75/77] deleting aggregated from Granularity description --- framework/json/common/beaconCommonComponents.json | 2 +- framework/src/common/beaconCommonComponents.yaml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/framework/json/common/beaconCommonComponents.json b/framework/json/common/beaconCommonComponents.json index f53235861..a6b922664 100644 --- a/framework/json/common/beaconCommonComponents.json +++ b/framework/json/common/beaconCommonComponents.json @@ -76,7 +76,7 @@ }, "Granularity": { "default": "boolean", - "description": "Level of detail of the response:\n* `boolean`: returns true/false' responses * `count`: adds the total number of positive results found * `aggregated`: returns summary, aggregated or distribution like responses * `record`: returns details for every row. In cases where a Beacon prefers to return records with fewer than allattributes, different strategies have to be considered w/o adding them to the current design, e.g.:\n - keeping non-mandatory attributes empty\n - Beacon to provide a minimal record definition", + "description": "Level of detail of the response:\n* `boolean`: returns true/false' responses * `count`: adds the total number of positive results found * `record`: returns details for every row. In cases where a Beacon prefers to return records with fewer than allattributes, different strategies have to be considered w/o adding them to the current design, e.g.:\n - keeping non-mandatory attributes empty\n - Beacon to provide a minimal record definition", "enum": [ "boolean", "count", diff --git a/framework/src/common/beaconCommonComponents.yaml b/framework/src/common/beaconCommonComponents.yaml index 09b1340b9..f8f479fa5 100644 --- a/framework/src/common/beaconCommonComponents.yaml +++ b/framework/src/common/beaconCommonComponents.yaml @@ -137,7 +137,6 @@ definitions: * `boolean`: returns true/false' responses * `count`: adds the total number of positive results found - * `aggregated`: returns summary, aggregated or distribution like responses * `record`: returns details for every row. In cases where a Beacon prefers to return records with fewer than allattributes, different strategies have to be considered w/o adding them to the current design, e.g.: From bcec830809ebefb22500b78665318e5d00e4ffb3 Mon Sep 17 00:00:00 2001 From: Oriol Lopez-Doriga Date: Thu, 18 Jul 2024 09:55:43 +0200 Subject: [PATCH 76/77] updated changelog of versions --- README.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e54f57934..05aef44a8 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,29 @@ As with other schema projects, here we separate between the schema source files There is a set of tools in [`/bin`](./bin/) to facilitate the conversion. ATM, after editing `...yaml` schema files somewhere in the `/src` tree, a (local) run of `bin/yamlerRunner.sh` - which re-generates the `....json` files in the `/json` tree) has to be performed before pushing changes. -### Changes +### Changelog + +## 2.1.0 + +*To be released September, 30, 2024* + +* Relocated TypedQuantity required to proper level of the schema for complexValue +* Added end and start entities for ageRange and iso8601duration for age +* Filtering terms scopes changed from string to array of strings + +## 2.0.1 + +*Released July, 16, 2024* + +* Replaced ENSGLOSSARY for SO ontology family in documentation examples +* Moved CURIE to beaconCommonComponents +* Created filtering terms entity +* Removed validation directories +* Several fixes to entity types, typos and other non-breaking changes + +## 2.0.0 + +*Released June, 21, 2022* * change notes with respect to the repository & documentation are now in [docs.genomebeacons.org](https://docs.genomebeacons.org/changes-todo/) * NOTE: on 2022-06-20 the previous development repositories have been archived: From fb343167f8a44df5499c2b9b6f92a5a24006eee3 Mon Sep 17 00:00:00 2001 From: Oriol Lopez-Doriga Date: Thu, 18 Jul 2024 16:07:54 +0200 Subject: [PATCH 77/77] updated release date for version 2.1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 05aef44a8..48e72a7cd 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ There is a set of tools in [`/bin`](./bin/) to facilitate the conversion. ATM, a ## 2.1.0 -*To be released September, 30, 2024* +*Released, July, 19, 2024* * Relocated TypedQuantity required to proper level of the schema for complexValue * Added end and start entities for ageRange and iso8601duration for age