Skip to content

Commit

Permalink
Annotation rendering configuration new section updates (#104)
Browse files Browse the repository at this point in the history
* annotation rendering configuration frontend updates (#84)

* updated annotation configuration, updated unit tests, partially updated system tests

* updating the sidebar style to remained a fixed size, updated the logic for removing '_' from the anchors when displaying them

* fixed system test & made the anchors have consistent naming style

* added back the dataset data for each model

* lint fix

* unit test update

* removed file upload where not needed

* made requested PR changes, updating variant to hgvs_variant for attachment/genomic Type type, update styling to use variable set in main.css

* Update frontend/src/models/analyses.js

Co-authored-by: Angelina Uno-Antonison <ange.unoantonison@gmail.com>
Signed-off-by: Alex Moss <kuthedk@users.noreply.github.com>

* Update frontend/src/models/analyses.js

Co-authored-by: Angelina Uno-Antonison <ange.unoantonison@gmail.com>
Signed-off-by: Alex Moss <kuthedk@users.noreply.github.com>

* Update frontend/src/models/analyses.js

Co-authored-by: Angelina Uno-Antonison <ange.unoantonison@gmail.com>
Signed-off-by: Alex Moss <kuthedk@users.noreply.github.com>

* Update case_annotation_section_anchors.cy.js

* Update frontend/src/models/analyses.js

Co-authored-by: Angelina Uno-Antonison <ange.unoantonison@gmail.com>
Signed-off-by: Alex Moss <kuthedk@users.noreply.github.com>

---------

Signed-off-by: Alex Moss <kuthedk@users.noreply.github.com>
Co-authored-by: Angelina Uno-Antonison <ange.unoantonison@gmail.com>

* Alliance genome models into new configuration (#88)

* Update Annotation Configuration to include new annotations from Alliance Genome (#81)
* Now fetching the proper alliance genomic identifiers, with the correct identifiers the models are now being pulled in as expected
* Create Animal Model Card to represent the animal models from Alliance Genome (#86)
* Adding scrolling to the cards
* Changed the model annotations to get a limit of 100 models, rather than 20 models. Updated the fixtures to contain ALL models
* Removed display: block, position: relative from card-base. Changed li margin-left to use variable. Removed the overflow-y from card-source
* Consolidated duplicate conditional code to determine if a section is empty and change the text color in AlliangeGenomeCard
* Updated the AllianceGenomeCard.spec.js toContain to be to.include
* Merged and updated for the new configuration to allign with the new datasets being introduced.

---------

Signed-off-by: Angelina Uno-Antonison <ange.unoantonison@gmail.com>
Co-authored-by: James Scherer <jscherer@uab.edu>

* Migration script to update the data layer for the additional sections (#89)

* Created migration script file to add additional annotation sections

* Migration script saving changes in database. Debugging comments removed

* Update etc/fixtures/migrations/migrate-additional-sections.js

Added suggestion to update section name to match configuration

Co-authored-by: Angelina Uno-Antonison <ange.unoantonison@gmail.com>
Signed-off-by: Rabab Fatima <fr.rabab@gmail.com>

---------

Signed-off-by: Rabab Fatima <fr.rabab@gmail.com>
Co-authored-by: Angelina Uno-Antonison <ange.unoantonison@gmail.com>

* Investigate why CPAM0084 breaks when re-running annotation from the api docs (#91)

* Updated the fixtures for CPAM0084

* Updated python tests

* As a Computational Biologist, I want to see the various summaries for animal models in the relevant section so I can have all the information consolidated in one location (#92)

* Updated annotation configuration to have both automated and specificed alliance genome animal summaries, updated the fixtures to include both summaries and are accurate to the gene identifier, and updated the annotation rendering configuration to display the new annotations

* Updated the python tests to include the 4 extra annotations in the configuration

* updated the existing tests and removed the mongo ids from the imported fixtures

* updated the existing tests and removed the mongo ids from the imported fixtures

* Updated the Text Dataset in the Annotation components to display as unavailable if the value also has empty string

* Updated the fixtures for genomic unit collection

* Removed the mongoids from the genomic units collection initial seed

* additional annottations

* resolved unit test failures

* Fixing the backend tests

* Updated the integration tests for backend

* As a Developer, provide a way to remove all automatic annotations from analyses, so they can be re-annotated with the correct information (#99)

* Adding the remove annotation and annotation queueing scripts

* Adding documentation and run feedback

* Updated the analysis annotation script to give relevant output

* Fixed the annotation config that broke annotation

* Linting should be passing

* Removed debugging print statements

* Added a note to the annotate-all-existing-analyses.sh that it may need to be run more than once

* Removed a space

* Updated the the annotation configuration to uitilize the tag dataset to visualize the HPO terms

* Fixed the unit test failing due to the addition of the tag datasets component

* fixed the mised merge issue

* pushing up system test changes

* Skipping the 'should allow the user to navigate the analysis via the logo, header, and section anchor links' for now until we fix it

---------

Signed-off-by: Alex Moss <kuthedk@users.noreply.github.com>
Signed-off-by: Angelina Uno-Antonison <ange.unoantonison@gmail.com>
Signed-off-by: Rabab Fatima <fr.rabab@gmail.com>
Co-authored-by: Alex Moss <kuthedk@users.noreply.github.com>
Co-authored-by: James Scherer <jscherer@uab.edu>
Co-authored-by: Rabab Fatima <rfatima@uab.edu>
  • Loading branch information
4 people authored Jul 7, 2023
1 parent ad958d8 commit 0ef93e7
Show file tree
Hide file tree
Showing 22 changed files with 24,064 additions and 4,306 deletions.
2 changes: 1 addition & 1 deletion backend/tests/integration/test_analysis_routers.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ def test_import_analysis_with_phenotips_json(

phenotips_file.close()

assert mock_annotation_queue.put.call_count == 29
assert mock_annotation_queue.put.call_count == 45

mock_background_add_task.assert_called_once_with(
AnnotationService.process_tasks, mock_annotation_queue, mock_repositories['genomic_unit']
Expand Down
14 changes: 7 additions & 7 deletions backend/tests/unit/core/test_annotate.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ def test_queuing_annotations_for_genomic_units(cpam0046_analysis, annotation_col
annotation_service = AnnotationService(annotation_collection)
mock_queue = Mock()
annotation_service.queue_annotation_tasks(cpam0046_analysis, mock_queue)
assert mock_queue.put.call_count == 29
assert mock_queue.put.call_count == 45


# Patching the temporary helper method that is writing to a file, this will be
Expand Down Expand Up @@ -52,11 +52,11 @@ def dependency_mock_side_effect(*args, **kwargs): # pylint: disable=unused-argu
AnnotationService.process_tasks(cpam0046_annotation_queue, mock_genomic_unit_collection)
assert cpam0046_annotation_queue.empty()

assert http_task_annotate.call_count == 23
assert http_task_annotate.call_count == 35
assert none_task_annotate.call_count == 0
assert forge_task_annotate.call_count == 6
assert forge_task_annotate.call_count == 10

assert annotate_extract_mock.call_count == 29
assert annotate_extract_mock.call_count == 45


@patch("src.core.annotation.log_to_file")
Expand Down Expand Up @@ -86,11 +86,11 @@ def test_processing_cpam0002_annotations_tasks(

AnnotationService.process_tasks(cpam0002_annotation_queue, mock_genomic_unit_collection)

assert http_task_annotate.call_count == 23
assert forge_task_annotate.call_count == 6
assert http_task_annotate.call_count == 35
assert forge_task_annotate.call_count == 10
assert none_task_annotate.call_count == 0

assert annotate_extract_mock.call_count == 29
assert annotate_extract_mock.call_count == 45

mock_genomic_unit_collection.annotate_genomic_unit.assert_called()

Expand Down
4 changes: 2 additions & 2 deletions backend/tests/unit/repository/test_annotation_collection.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ def test_get_datasets_configuration_by_type(annotation_collection):
"""Tests getting the datasets for the provided types of genomic units"""
types = set({GenomicUnitType.GENE, GenomicUnitType.HGVS_VARIANT})
datasets = annotation_collection.datasets_to_annotate_by_type(types)
assert len(datasets) == 29
assert len(datasets) == 45


def test_get_datasets_to_annotate_for_units(annotation_collection, genomic_units_for_annotation):
"""Tests if the configuration for datasets is return as expected"""
actual_configuration = annotation_collection.datasets_to_annotate_for_units(genomic_units_for_annotation)
assert len(actual_configuration["gene"]) == 19
assert len(actual_configuration["gene"]) == 35
assert len(actual_configuration["hgvs_variant"]) == 10


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
def test_find_genomic_units(genomic_unit_collection):
""" Gets all the genomic units from the genomic unit collection """
all_genomic_units = genomic_unit_collection.all()
assert len(all_genomic_units) == 14
assert len(all_genomic_units) == 18


def test_transcript_annotation_not_exist_with_no_annotations(genomic_unit_collection, hgvs_variant_genomic_unit_json):
Expand Down
77 changes: 77 additions & 0 deletions etc/api/annotate-all-existing-analyses.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#! /bin/bash
# ./annotate-all-existing-analyses.sh

usage() {
echo " "
echo "usage: $0"
echo " "
echo " -h Prints usage"
echo " "
echo "Kicks off annotation jobs for all the existing analyses in Rosalution"
echo " "
echo "To run the annotations, please log in to Rosalution to retrieve the"
echo "Client ID and Client Secret credentials. These can be found by"
echo "clicking on your username or going to: <rosalution url>/rosalution/account"
echo " "
echo "Note: This script may need to be run multiple times due to the Rosalution"
echo "annotation system not being built for large sets of annotations queued."
echo " "
echo "Please install jq for this script to work. https://stedolan.github.io/jq/"
echo " "
exit
}

while getopts ":h" opt; do
case $opt in
h) usage;;
\?) echo "Invalid option -$OPTARG" && exit 127;;
esac
done

if ! jq --version &> /dev/null
then
echo "Error: jq could not be found. Exiting."
usage
fi

echo "Please enter your Client Id";
read -r CLIENT_ID;

echo "Please enter your Client Secret";
read -r -s CLIENT_SECRET;

if [ -z "${CLIENT_ID}" ] || [ -z "${CLIENT_SECRET}" ]; then
echo " "
echo "Please enter required credentials."
usage
fi

echo "Fetching valid authentication token..."

AUTH_TOKEN=$(curl -s -X 'POST' \
"http://local.rosalution.cgds/rosalution/api/auth/token" \
-H "accept: application/json" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=&scope=&client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET" | jq -r '.access_token')

echo "Fetching existing analyses in Rosalution..."

RESPONSE=$(curl -s -X "GET" \
"http://local.rosalution.cgds/rosalution/api/analysis/" \
-H "accept: application/json" \
-H "Authorization: Bearer $AUTH_TOKEN")

ANALYSES=()
while IFS='' read -r line; do ANALYSES+=("$line"); done < <(echo "$RESPONSE" | jq -c '[.[].name]')

echo "${ANALYSES[@]}" | jq -r '.[]' | while read -r ANALYSIS; do
echo "Starting annotations for analysis $ANALYSIS..."
curl -s -X "POST" \
"http://local.rosalution.cgds/rosalution/api/annotate/$ANALYSIS" \
-H "accept: application/json" \
-H "Authorization: Bearer $AUTH_TOKEN" \
> /dev/null
sleep 5
done

echo "Done. Exiting."
176 changes: 160 additions & 16 deletions etc/fixtures/initial-seed/annotations-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,37 +111,73 @@
"attribute": "{ \"HPO_gene_search_url\": .HPO_gene_search_url }"
},
{
"data_set": "Model Systems - Rat",
"data_source": "Aliance Genome",
"data_set": "Rat Gene Identifier",
"data_source": "Alliance Genome",
"genomic_unit_type": "gene",
"annotation_source_type": "http",
"url": "https://www.alliancegenome.org/api/search_autocomplete?q={gene}",
"attribute": ".results[] | { \"name_key\": .name_key, \"name\": .name, \"primaryKey\": .primaryKey, \"searchKey\": \"{gene} (Rno)\" } | . + { \"searchKey\": .searchKey | ascii_downcase, \"name_key\": .name_key | ascii_downcase } | select( .name_key == .searchKey) | { \"Rat Gene Identifier\": .primaryKey }"
},
{
"data_set": "Rat_Alliance_Genome_Automated_Summary",
"data_source": "Alliance Genome",
"genomic_unit_type": "gene",
"annotation_source_type": "http",
"url": "https://www.alliancegenome.org/api/gene/{Rat Gene Identifier}",
"attribute": "{ \"Model Systems - Rat\": .geneSynopsis}",
"attribute": "{ \"Rat_Alliance_Genome_Automated_Summary\": .automatedGeneSynopsis }",
"dependencies": ["Rat Gene Identifier"]
},
{
"data_set": "Rat Gene Identifier",
"data_set": "Rat_Alliance_Genome_RGD_Summary",
"data_source": "Alliance Genome",
"genomic_unit_type": "gene",
"annotation_source_type": "http",
"url": "https://www.alliancegenome.org/api/search_autocomplete?q={gene}",
"attribute": ".results[] | select( .primaryKey | contains(\"RGD\")) | { \"Rat Gene Identifier\": .primaryKey }"
"url": "https://www.alliancegenome.org/api/gene/{Rat Gene Identifier}",
"attribute": "{ \"Rat_Alliance_Genome_RGD_Summary\": .geneSynopsis}",
"dependencies": ["Rat Gene Identifier"]
},
{
"data_set": "Rat_Alliance_Genome_Models",
"data_source": "Alliance Genome",
"genomic_unit_type": "gene",
"annotation_source_type": "http",
"url": "https://www.alliancegenome.org/api/gene/{Rat Gene Identifier}/models?limit=100",
"attribute": "{ \"Rat_Alliance_Genome_Models\": [.results[]] }",
"dependencies": ["Rat Gene Identifier"]
},
{
"data_set": "Mouse Gene Identifier",
"data_source": "Alliance Genome",
"genomic_unit_type": "gene",
"annotation_source_type": "http",
"url": "https://www.alliancegenome.org/api/search_autocomplete?q={gene}",
"attribute": ".results[] | select( .primaryKey | contains(\"MGI\")) | select( .name | contains(\"-\") | not ) |{ \"Mouse Gene Identifier\": .primaryKey }"
"attribute": ".results[] | { \"name_key\": .name_key, \"name\": .name, \"primaryKey\": .primaryKey, \"searchKey\": \"{gene} (Mmu)\" } | . + { \"searchKey\": .searchKey | ascii_downcase, \"name_key\": .name_key | ascii_downcase } | select( .name_key == .searchKey) | { \"Mouse Gene Identifier\": .primaryKey }"
},
{
"data_set": "Model Systems - Mouse - Automated",
"data_source": "Aliance Genome",
"data_set": "Mouse_Alliance_Genome_Automated_Summary",
"data_source": "Alliance Genome",
"genomic_unit_type": "gene",
"annotation_source_type": "http",
"url": "https://www.alliancegenome.org/api/gene/{Mouse Gene Identifier}",
"attribute": "{ \"Model Systems - Mouse\": .automatedGeneSynopsis}",
"attribute": "{ \"Mouse_Alliance_Genome_Automated_Summary\": .automatedGeneSynopsis }",
"dependencies": ["Mouse Gene Identifier"]
},
{
"data_set": "Mouse_Alliance_Genome_MGI_Summary",
"data_source": "Alliance Genome",
"genomic_unit_type": "gene",
"annotation_source_type": "http",
"url": "https://www.alliancegenome.org/api/gene/{Mouse Gene Identifier}",
"attribute": "{ \"Mouse_Alliance_Genome_MGI_Summary\": .geneSynopsis }",
"dependencies": ["Mouse Gene Identifier"]
},
{
"data_set": "Mouse_Alliance_Genome_Models",
"data_source": "Alliance Genome",
"genomic_unit_type": "gene",
"annotation_source_type": "http",
"url": "https://www.alliancegenome.org/api/gene/{Mouse Gene Identifier}/models?limit=100",
"attribute": "{ \"Mouse_Alliance_Genome_Models\": [.results[]] }",
"dependencies": ["Mouse Gene Identifier"]
},
{
Expand All @@ -150,15 +186,33 @@
"genomic_unit_type": "gene",
"annotation_source_type": "http",
"url": "https://www.alliancegenome.org/api/search_autocomplete?q={gene}",
"attribute": ".results[] | select( .primaryKey | contains(\"ZFIN\")) | select( .name | contains(\"-\") | not ) |{ \"Zebrafish Gene Identifier\": .primaryKey }"
"attribute": ".results[] | { \"name_key\": .name_key, \"name\": .name, \"primaryKey\": .primaryKey, \"searchKey\": \"{gene} (Dre)\" } | . + { \"searchKey\": .searchKey | ascii_downcase, \"name_key\": .name_key | ascii_downcase } | select( .name_key == .searchKey) | { \"Zebrafish Gene Identifier\": .primaryKey }"
},
{
"data_set": "Model Systems - Zebrafish - Automated",
"data_set": "Zebrafish_Alliance_Genome_Automated_Summary",
"data_source": "Alliance Genome",
"genomic_unit_type": "gene",
"annotation_source_type": "http",
"url": "https://www.alliancegenome.org/api/gene/{Zebrafish Gene Identifier}",
"attribute": "{ \"Model Systems - Zebrafish\": .automatedGeneSynopsis}",
"attribute": "{ \"Zebrafish_Alliance_Genome_Automated_Summary\": .automatedGeneSynopsis }",
"dependencies": ["Zebrafish Gene Identifier"]
},
{
"data_set": "Zebrafish_Alliance_Genome_ZFIN_Summary",
"data_source": "Alliance Genome",
"genomic_unit_type": "gene",
"annotation_source_type": "http",
"url": "https://www.alliancegenome.org/api/gene/{Zebrafish Gene Identifier}",
"attribute": "{ \"Zebrafish_Alliance_Genome_ZFIN_Summary\": .geneSynopsis }",
"dependencies": ["Zebrafish Gene Identifier"]
},
{
"data_set": "Zebrafish_Alliance_Genome_Models",
"data_source": "Alliance Genome",
"genomic_unit_type": "gene",
"annotation_source_type": "http",
"url": "https://www.alliancegenome.org/api/gene/{Zebrafish Gene Identifier}/models?limit=100",
"attribute": "{ \"Zebrafish_Alliance_Genome_Models\": [.results[]] }",
"dependencies": ["Zebrafish Gene Identifier"]
},
{
Expand All @@ -167,15 +221,33 @@
"genomic_unit_type": "gene",
"annotation_source_type": "http",
"url": "https://www.alliancegenome.org/api/search_autocomplete?q={gene}",
"attribute": ".results[] | select( .primaryKey | contains(\"WB\")) | select( .name | contains(\"-\") | not ) |{ \"C-Elegens Gene Identifier\": .primaryKey }"
"attribute": ".results[] | { \"name_key\": .name_key, \"name\": .name, \"primaryKey\": .primaryKey, \"searchKey\": \"{gene} (Cel)\" } | . + { \"searchKey\": .searchKey | ascii_downcase, \"name_key\": .name_key | ascii_downcase } | select( .name_key == .searchKey) | { \"C-Elegens Gene Identifier\": .primaryKey }"
},
{
"data_set": "Model Systems - C-Elegens - Automated",
"data_set": "C-Elegens_Alliance_Genome_Automated_Summary",
"data_source": "Alliance Genome",
"genomic_unit_type": "gene",
"annotation_source_type": "http",
"url": "https://www.alliancegenome.org/api/gene/{C-Elegens Gene Identifier}",
"attribute": "{ \"Model Systems - C-Elegens\": .automatedGeneSynopsis}",
"attribute": "{ \"C-Elegens_Alliance_Genome_Automated_Summary\": .automatedGeneSynopsis }",
"dependencies": ["C-Elegens Gene Identifier"]
},
{
"data_set": "C-Elegens_Alliance_Genome_WB_Summary",
"data_source": "Alliance Genome",
"genomic_unit_type": "gene",
"annotation_source_type": "http",
"url": "https://www.alliancegenome.org/api/gene/{C-Elegens Gene Identifier}",
"attribute": "{ \"C-Elegens_Alliance_Genome_WB_Summary\": .geneSynopsis }",
"dependencies": ["C-Elegens Gene Identifier"]
},
{
"data_set": "C-Elegens_Alliance_Genome_Models",
"data_source": "Alliance Genome",
"genomic_unit_type": "gene",
"annotation_source_type": "http",
"url": "https://www.alliancegenome.org/api/gene/{C-Elegens Gene Identifier}/models?limit=100",
"attribute": "{ \"C-Elegens_Alliance_Genome_Models\": [.results[]] }",
"dependencies": ["C-Elegens Gene Identifier"]
},
{
Expand Down Expand Up @@ -249,5 +321,77 @@
"annotation_source_type": "http",
"url": "http://grch37.rest.ensembl.org/vep/human/hgvs/{hgvs_variant}?content-type=application/json;refseq=1;",
"attribute": ".[].transcript_consequences[] | { impact: .impact, transcript_id: .transcript_id }"
},
{
"data_set": "Rat_Alliance_Genome_url",
"data_source": "Rosalution",
"genomic_unit_type": "gene",
"annotation_source_type": "forge",
"base_string": "https://www.alliancegenome.org/gene/{Rat Gene Identifier}",
"attribute": "{ \"Rat_Alliance_Genome_url\": .Rat_Alliance_Genome_url }",
"dependencies": ["Rat Gene Identifier"]
},
{
"data_set": "Rat_Rat_Genome_Database_url",
"data_source": "Alliance genome",
"annotation_source_type": "http",
"genomic_unit_type": "gene",
"url": "https://www.alliancegenome.org/api/gene/{Rat Gene Identifier}",
"attribute": "{ \"Rat_Rat_Genome_Database_url\": .modCrossRefCompleteUrl }",
"dependencies": ["Rat Gene Identifier"]
},
{
"data_set": "Mouse_Alliance_Genome_url",
"data_source": "Rosalution",
"genomic_unit_type": "gene",
"annotation_source_type": "forge",
"base_string": "https://www.alliancegenome.org/gene/{Mouse Gene Identifier}",
"attribute": "{ \"Mouse_Alliance_Genome_url\": .Mouse_Alliance_Genome_url }",
"dependencies": ["Mouse Gene Identifier"]
},
{
"data_set": "Mouse_Mouse_Genome_Database_url",
"data_source": "Alliance genome",
"annotation_source_type": "http",
"genomic_unit_type": "gene",
"url": "https://www.alliancegenome.org/api/gene/{Mouse Gene Identifier}",
"attribute": "{ \"Mouse_Mouse_Genome_Database_url\": .modCrossRefCompleteUrl }",
"dependencies": ["Mouse Gene Identifier"]
},
{
"data_set": "Zebrafish_Alliance_Genome_url",
"data_source": "Rosalution",
"genomic_unit_type": "gene",
"annotation_source_type": "forge",
"base_string": "https://www.alliancegenome.org/gene/{Zebrafish Gene Identifier}",
"attribute": "{ \"Zebrafish_Alliance_Genome_url\": .Zebrafish_Alliance_Genome_url }",
"dependencies": ["Zebrafish Gene Identifier"]
},
{
"data_set": "Zebrafish_Zebrafish_Information_Network_url",
"data_source": "Alliance genome",
"annotation_source_type": "http",
"genomic_unit_type": "gene",
"url": "https://www.alliancegenome.org/api/gene/{Zebrafish Gene Identifier}",
"attribute": "{ \"Zebrafish_Zebrafish_Information_Network_url\": .modCrossRefCompleteUrl }",
"dependencies": ["Zebrafish Gene Identifier"]
},
{
"data_set": "C-Elegens_Alliance_Genome_url",
"data_source": "Rosalution",
"genomic_unit_type": "gene",
"annotation_source_type": "forge",
"base_string": "https://www.alliancegenome.org/gene/{C-Elegens Gene Identifier}",
"attribute": "{ \"C-Elegens_Alliance_Genome_url\": .C-Elegens_Alliance_Genome_url }",
"dependencies": ["C-Elegens Gene Identifier"]
},
{
"data_set": "C-Elegens_Worm_Base_url",
"data_source": "Alliance genome",
"annotation_source_type": "http",
"genomic_unit_type": "gene",
"url": "https://www.alliancegenome.org/api/gene/{C-Elegens Gene Identifier}",
"attribute": "{ \"C-Elegens_Worm_Base_url\": .modCrossRefCompleteUrl }",
"dependencies": ["C-Elegens Gene Identifier"]
}
]
Loading

0 comments on commit 0ef93e7

Please sign in to comment.