From 980166ff456fc6eaba02cbaaec9289a482cf3ae5 Mon Sep 17 00:00:00 2001 From: sagely1 <114952739+sagely1@users.noreply.github.com> Date: Sun, 5 Jan 2025 01:07:37 +0000 Subject: [PATCH] syncing changes from Q4 2024 and code cleanup --- apps/agora/api/src/models/genes.ts | 5 +- apps/agora/app/src/app/app.routes.ts | 5 + apps/agora/data/.env.example | 2 +- .../src/lib/model/druggability.ts | 2 +- .../api-client-angular/src/lib/model/gene.ts | 5 +- libs/agora/api-description/build/openapi.yaml | 17 ++- .../src/components/schemas/Druggability.yaml | 5 +- .../src/components/schemas/Gene.yaml | 12 +- .../score-barchart.component.ts | 5 - .../src/lib/gene-comparison-tool.component.ts | 9 -- libs/agora/genes/src/index.ts | 1 + .../gene-druggability.component.ts | 22 ++- .../gene-hero/gene-hero.component.html | 35 +++-- .../gene-hero/gene-hero.component.scss | 19 ++- .../gene-hero/gene-hero.component.ts | 19 +-- .../gene-resources.component.html | 33 ++++- .../gene-resources.component.ts | 121 ++++++++++++---- .../gene-similar/gene-similar.component.html | 47 ++++++ .../gene-similar/gene-similar.component.scss | 29 ++++ .../gene-similar.component.spec.ts.off | 59 ++++++++ .../gene-similar/gene-similar.component.ts | 120 ++++++++++++++++ .../gene-table/gene-table.component.ts | 17 +-- libs/agora/genes/tsconfig.lib.json | 2 +- libs/agora/genes/tsconfig.spec.json | 8 +- libs/agora/models/ResourceCard.ts | 6 + libs/agora/models/additional-resource.ts | 6 - libs/agora/models/genes.ts | 11 +- libs/agora/models/index.ts | 2 +- .../nominated-targets.component.ts | 43 ++---- .../agora/testing/src/lib/mocks/gene-mocks.ts | 135 +++++++++--------- tsconfig.base.json | 1 + 31 files changed, 576 insertions(+), 227 deletions(-) create mode 100644 libs/agora/genes/src/lib/components/gene-similar/gene-similar.component.html create mode 100644 libs/agora/genes/src/lib/components/gene-similar/gene-similar.component.scss create mode 100644 libs/agora/genes/src/lib/components/gene-similar/gene-similar.component.spec.ts.off create mode 100644 libs/agora/genes/src/lib/components/gene-similar/gene-similar.component.ts create mode 100644 libs/agora/models/ResourceCard.ts delete mode 100644 libs/agora/models/additional-resource.ts diff --git a/apps/agora/api/src/models/genes.ts b/apps/agora/api/src/models/genes.ts index d706e66618..c86a51871b 100644 --- a/apps/agora/api/src/models/genes.ts +++ b/apps/agora/api/src/models/genes.ts @@ -53,7 +53,7 @@ const DruggabilitySchema = new Schema({ sm_druggability_bucket: { type: Number, required: true }, safety_bucket: { type: Number, required: true }, abability_bucket: { type: Number, required: true }, - pharos_class: { type: String, required: true }, + pharos_class: { type: [String], required: true }, classification: { type: String, required: true }, safety_bucket_definition: { type: String, required: true }, abability_bucket_definition: { type: String, required: true }, @@ -67,6 +67,7 @@ const GeneSchema = new Schema( summary: { type: String, required: true }, hgnc_symbol: { type: String, required: true }, alias: [{ type: String, required: true }], + uniprotkb_accessions: [{ type: String, required: true }], is_igap: { type: Boolean, required: true }, is_eqtl: { type: Boolean, required: true }, is_any_rna_changed_in_ad_brain: { type: Boolean, required: true }, @@ -75,7 +76,7 @@ const GeneSchema = new Schema( protein_brain_change_studied: { type: Boolean, required: true }, target_nominations: { type: [TargetNominationSchema], required: true }, median_expression: { type: [MedianExpressionSchema], required: true }, - druggability: { type: [DruggabilitySchema], required: true }, + druggability: { type: DruggabilitySchema, required: true }, total_nominations: { type: Number, required: true }, ensembl_info: { type: EnsemblInfoSchema, required: true }, }, diff --git a/apps/agora/app/src/app/app.routes.ts b/apps/agora/app/src/app/app.routes.ts index 5edb4d2f16..3dae949037 100644 --- a/apps/agora/app/src/app/app.routes.ts +++ b/apps/agora/app/src/app/app.routes.ts @@ -60,6 +60,11 @@ export const routes: Route[] = [ description: 'Nominate a gene as a new candidate for AD treatment or prevention.', }, }, + { + path: 'genes/:id/similar', + loadChildren: () => + import('@sagebionetworks/agora/gene-similar').then((routes) => routes.routes), + }, { path: 'genes/:id/:tab/:subtab', loadChildren: () => diff --git a/apps/agora/data/.env.example b/apps/agora/data/.env.example index 816c6eb0ac..a9ecb1712f 100644 --- a/apps/agora/data/.env.example +++ b/apps/agora/data/.env.example @@ -7,6 +7,6 @@ DB_HOST="agora-mongo" # must match mongo service name # specifies data release manifest and team images folder DATA_FILE="syn13363290" -DATA_VERSION="68" +DATA_VERSION="71" TEAM_IMAGES_ID="syn12861877" SYNAPSE_AUTH_TOKEN="agora-service-user-pat-here" \ No newline at end of file diff --git a/libs/agora/api-client-angular/src/lib/model/druggability.ts b/libs/agora/api-client-angular/src/lib/model/druggability.ts index 20d0e4a3a5..3b17537dbb 100644 --- a/libs/agora/api-client-angular/src/lib/model/druggability.ts +++ b/libs/agora/api-client-angular/src/lib/model/druggability.ts @@ -17,7 +17,7 @@ export interface Druggability { sm_druggability_bucket: number; safety_bucket: number; abability_bucket: number; - pharos_class: string; + pharos_class: Array; classification: string; safety_bucket_definition: string; abability_bucket_definition: string; diff --git a/libs/agora/api-client-angular/src/lib/model/gene.ts b/libs/agora/api-client-angular/src/lib/model/gene.ts index 377938232d..5824d42f23 100644 --- a/libs/agora/api-client-angular/src/lib/model/gene.ts +++ b/libs/agora/api-client-angular/src/lib/model/gene.ts @@ -31,6 +31,7 @@ export interface Gene { summary: string; hgnc_symbol: string; alias: Array; + uniprotkb_accessions?: Array; is_igap: boolean; is_eqtl: boolean; is_any_rna_changed_in_ad_brain: boolean; @@ -39,7 +40,7 @@ export interface Gene { protein_brain_change_studied: boolean; target_nominations: Array | null; median_expression: Array; - druggability: Array; + druggability: Druggability; total_nominations: number | null; is_adi?: boolean; is_tep?: boolean; @@ -57,7 +58,7 @@ export interface Gene { ab_modality_display_value?: string | null; safety_rating_display_value?: string | null; sm_druggability_display_value?: string | null; - pharos_class_display_value?: string | null; + pharos_class_display_value?: Array | null; is_any_rna_changed_in_ad_brain_display_value?: string | null; is_any_protein_changed_in_ad_brain_display_value?: string | null; nominated_target_display_value?: boolean | null; diff --git a/libs/agora/api-description/build/openapi.yaml b/libs/agora/api-description/build/openapi.yaml index 600450d266..47c75e2c44 100644 --- a/libs/agora/api-description/build/openapi.yaml +++ b/libs/agora/api-description/build/openapi.yaml @@ -421,8 +421,9 @@ components: type: integer example: 3 pharos_class: - type: string - example: Tclin + type: array + items: + type: string classification: type: string example: Enzyme @@ -730,6 +731,10 @@ components: type: array items: type: string + uniprotkb_accessions: + type: array + items: + type: string is_igap: type: boolean is_eqtl: @@ -752,9 +757,7 @@ components: items: $ref: '#/components/schemas/MedianExpression' druggability: - type: array - items: - $ref: '#/components/schemas/Druggability' + $ref: '#/components/schemas/Druggability' total_nominations: type: integer nullable: true @@ -820,7 +823,9 @@ components: type: string nullable: true pharos_class_display_value: - type: string + type: array + items: + type: string nullable: true is_any_rna_changed_in_ad_brain_display_value: type: string diff --git a/libs/agora/api-description/src/components/schemas/Druggability.yaml b/libs/agora/api-description/src/components/schemas/Druggability.yaml index c4f0db0e06..96568e21e6 100644 --- a/libs/agora/api-description/src/components/schemas/Druggability.yaml +++ b/libs/agora/api-description/src/components/schemas/Druggability.yaml @@ -11,8 +11,9 @@ properties: type: integer example: 3 pharos_class: - type: string - example: 'Tclin' + type: array + items: + type: string classification: type: string example: 'Enzyme' diff --git a/libs/agora/api-description/src/components/schemas/Gene.yaml b/libs/agora/api-description/src/components/schemas/Gene.yaml index 7a7cff7ab9..cc652d1cae 100644 --- a/libs/agora/api-description/src/components/schemas/Gene.yaml +++ b/libs/agora/api-description/src/components/schemas/Gene.yaml @@ -15,6 +15,10 @@ properties: type: array items: type: string + uniprotkb_accessions: + type: array + items: + type: string is_igap: type: boolean is_eqtl: @@ -37,9 +41,7 @@ properties: items: $ref: MedianExpression.yaml druggability: - type: array - items: - $ref: Druggability.yaml + $ref: Druggability.yaml total_nominations: type: integer nullable: true @@ -105,7 +107,9 @@ properties: type: string nullable: true pharos_class_display_value: - type: string + type: array + items: + type: string nullable: true is_any_rna_changed_in_ad_brain_display_value: type: string diff --git a/libs/agora/charts/src/lib/score-barchart/score-barchart.component.ts b/libs/agora/charts/src/lib/score-barchart/score-barchart.component.ts index dbf54b7c54..a6a47304af 100644 --- a/libs/agora/charts/src/lib/score-barchart/score-barchart.component.ts +++ b/libs/agora/charts/src/lib/score-barchart/score-barchart.component.ts @@ -68,7 +68,6 @@ export class ScoreBarChartComponent implements OnChanges, AfterViewInit, OnDestr @HostListener('window:resize', ['$event.target']) onResize() { - console.log('sbc-onresize'); if (this.shouldResize && this.initialized) { const divSize = this.scoreBarChartContainer.nativeElement.getBoundingClientRect().width; clearTimeout(this.resizeTimer); @@ -79,8 +78,6 @@ export class ScoreBarChartComponent implements OnChanges, AfterViewInit, OnDestr } ngOnChanges(changes: SimpleChanges): void { - console.log('sbc-changes', changes); - if ( (changes['data'] && !changes['data'].firstChange) || (changes['score'] && !changes['score'].firstChange) || @@ -98,8 +95,6 @@ export class ScoreBarChartComponent implements OnChanges, AfterViewInit, OnDestr } ngAfterViewInit(): void { - console.log('ngAfterViewInit'); - if (this.score === null) this.hideChart(); else this.createChart(); } diff --git a/libs/agora/gene-comparison-tool/src/lib/gene-comparison-tool.component.ts b/libs/agora/gene-comparison-tool/src/lib/gene-comparison-tool.component.ts index 9a739fa07f..1c92c3c3c8 100644 --- a/libs/agora/gene-comparison-tool/src/lib/gene-comparison-tool.component.ts +++ b/libs/agora/gene-comparison-tool/src/lib/gene-comparison-tool.component.ts @@ -263,7 +263,6 @@ export class GeneComparisonToolComponent implements OnInit, AfterViewInit, OnDes combineLatest([genesApi$, distributionApi$]).subscribe(([genesResult, distributionResult]) => { if (genesResult.items) { - console.log('# of items', genesResult.items.length); this.initData(genesResult.items); this.sortTable(this.headerTable); this.refresh(); @@ -271,8 +270,6 @@ export class GeneComparisonToolComponent implements OnInit, AfterViewInit, OnDes this.scoresDistribution = distributionResult.overall_scores; this.isLoading = false; - // console.log('calling setLoading false'); - // this.helperService.setLoading(false); } }); } @@ -1295,14 +1292,8 @@ export class GeneComparisonToolComponent implements OnInit, AfterViewInit, OnDes updateColumnWidth() { const count = this.columns.length < 5 ? 5 : this.columns.length; - console.log('count is: ', count); - const width = this.headerTable?.containerViewChild?.nativeElement?.offsetWidth || 0; - console.log('ht', this.headerTable?.containerViewChild?.nativeElement?.offsetWidth); - console.log('width is: ', width); - this.columnWidth = Math.ceil((width - 300) / count) + 'px'; - console.log('column width is: ', this.columnWidth); } onResize() { diff --git a/libs/agora/genes/src/index.ts b/libs/agora/genes/src/index.ts index d3639ced7e..1f78ba7bb3 100644 --- a/libs/agora/genes/src/index.ts +++ b/libs/agora/genes/src/index.ts @@ -12,6 +12,7 @@ export * from './lib/components/gene-nominations/gene-nominations.component'; export * from './lib/components/gene-protein-selector/gene-protein-selector.component'; export * from './lib/components/gene-resources/gene-resources.component'; export * from './lib/components/gene-search/gene-search.component'; +export * from './lib/components/gene-similar/gene-similar.component'; export * from './lib/components/gene-soe/gene-soe.component'; export * from './lib/components/gene-soe-charts/gene-soe-charts.component'; export * from './lib/components/gene-soe-list/gene-soe-list.component'; diff --git a/libs/agora/genes/src/lib/components/gene-druggability/gene-druggability.component.ts b/libs/agora/genes/src/lib/components/gene-druggability/gene-druggability.component.ts index 3bc04d6a8b..a0cdca5432 100644 --- a/libs/agora/genes/src/lib/components/gene-druggability/gene-druggability.component.ts +++ b/libs/agora/genes/src/lib/components/gene-druggability/gene-druggability.component.ts @@ -45,20 +45,18 @@ export class GeneDruggabilityComponent { // Update the initial buckets if (this.gene) { if (!this.gene.druggability) { - this.gene.druggability = [ - { - sm_druggability_bucket: this.getDefaultBucketNumber(), - safety_bucket: this.getDefaultBucketNumber(), - abability_bucket: this.getDefaultBucketNumber(), - pharos_class: '', - classification: this.getDefaultText(), - safety_bucket_definition: this.getDefaultText(), - abability_bucket_definition: this.getDefaultText(), - }, - ]; + this.gene.druggability = { + sm_druggability_bucket: this.getDefaultBucketNumber(), + safety_bucket: this.getDefaultBucketNumber(), + abability_bucket: this.getDefaultBucketNumber(), + pharos_class: [], + classification: this.getDefaultText(), + safety_bucket_definition: this.getDefaultText(), + abability_bucket_definition: this.getDefaultText(), + }; } - this.druggability = this.gene.druggability[0]; + this.druggability = this.gene.druggability; this.currentBucketSM = this.druggability.sm_druggability_bucket; this.currentBucketAB = this.druggability.abability_bucket; this.currentBucketSF = this.druggability.safety_bucket; diff --git a/libs/agora/genes/src/lib/components/gene-hero/gene-hero.component.html b/libs/agora/genes/src/lib/components/gene-hero/gene-hero.component.html index d4641a34fa..cdc6363231 100644 --- a/libs/agora/genes/src/lib/components/gene-hero/gene-hero.component.html +++ b/libs/agora/genes/src/lib/components/gene-hero/gene-hero.component.html @@ -19,7 +19,7 @@

{{ getSummary() }}

- @if (gene.bio_domains || getAlias() || getEnsemblUrl() !== '') { + @if (gene.bio_domains || getAliases() || getEnsemblUrl() !== '') {
@if (gene.bio_domains) {
@@ -29,10 +29,16 @@

Biological Domains

} + @if (gene.druggability && gene.druggability.pharos_class) { +
+

Pharos Class

+

{{ gene.druggability.pharos_class.join(', ') }}

+
+ }

Also known as

- @if (getEnsemblUrl() !== '') { -

+ @if (getEnsemblUrl()) { +

{{ gene.ensembl_gene_id }} @if (gene.ensembl_info.ensembl_release) { (Ensembl Release {{ gene.ensembl_info.ensembl_release }}) @@ -40,11 +46,12 @@

Also known as

} @if (getEnsemblUrl() === '') { - {{ gene.ensembl_gene_id }} +

+ {{ gene.ensembl_gene_id }} +

} - @if (gene.ensembl_info.ensembl_possible_replacements.length > 0) { -

+

Possible replacement valueAlso known as

{{ gene.ensembl_info.ensembl_possible_replacements.join(', ') }}

} - @if (alias !== '') { -

{{ alias }}

+ @if (gene.uniprotkb_accessions) { +

+ UNIPROTKB + + {{ accession }}, + +

+

+ {{ getAliases() }} +

} } diff --git a/libs/agora/genes/src/lib/components/gene-hero/gene-hero.component.scss b/libs/agora/genes/src/lib/components/gene-hero/gene-hero.component.scss index 6f9f580dc9..7cec8a91c8 100644 --- a/libs/agora/genes/src/lib/components/gene-hero/gene-hero.component.scss +++ b/libs/agora/genes/src/lib/components/gene-hero/gene-hero.component.scss @@ -38,7 +38,17 @@ hr { } .gene-hero-biodomains { - margin-bottom: 30px; + margin-bottom: 15px; + + p { + margin-left: 10px; + } +} + +.gene-hero-pharos { + p { + margin-left: 10px; + } } .gene-hero-summary { @@ -50,11 +60,16 @@ hr { } .gene-hero-aliases-heading, -.gene-hero-biodomains-heading { +.gene-hero-biodomains-heading, +.gene-hero-pharos-heading { text-transform: uppercase; margin-bottom: 15px; } +.aliases { + margin: 0 0 0 10px; +} + .possible-replacements { margin-bottom: 15px; } diff --git a/libs/agora/genes/src/lib/components/gene-hero/gene-hero.component.ts b/libs/agora/genes/src/lib/components/gene-hero/gene-hero.component.ts index 6b70bf60f2..f2faa98418 100644 --- a/libs/agora/genes/src/lib/components/gene-hero/gene-hero.component.ts +++ b/libs/agora/genes/src/lib/components/gene-hero/gene-hero.component.ts @@ -1,5 +1,5 @@ import { CommonModule } from '@angular/common'; -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input } from '@angular/core'; import { Gene } from '@sagebionetworks/agora/api-client-angular'; import { ascending } from 'd3'; @@ -10,15 +10,9 @@ import { ascending } from 'd3'; templateUrl: './gene-hero.component.html', styleUrls: ['./gene-hero.component.scss'], }) -export class GeneHeroComponent implements OnInit { +export class GeneHeroComponent { @Input() gene: Gene | undefined; - alias = ''; - - ngOnInit() { - this.alias = this.getAlias(); - } - showNominationsOrTEP() { if (!this.gene) return false; return this.gene.total_nominations || this.gene.is_adi || this.gene.is_tep; @@ -91,13 +85,20 @@ export class GeneHeroComponent implements OnInit { } } - getAlias(): string { + getAliases(): string { if (this.gene?.alias && this.gene.alias.length > 0) { return this.gene.alias.join(', '); } return ''; } + getUniProtKBLink(uniProtId: string) { + if (uniProtId) { + return `https://www.uniprot.org/uniprotkb/${uniProtId}/entry`; + } + return ''; + } + getBiodomains(): string { if (!this.gene || !this.gene.bio_domains) return ''; const biodomains = this.gene.bio_domains.gene_biodomains diff --git a/libs/agora/genes/src/lib/components/gene-resources/gene-resources.component.html b/libs/agora/genes/src/lib/components/gene-resources/gene-resources.component.html index aa52e909e9..ca2bd56a9f 100644 --- a/libs/agora/genes/src/lib/components/gene-resources/gene-resources.component.html +++ b/libs/agora/genes/src/lib/components/gene-resources/gene-resources.component.html @@ -72,16 +72,45 @@

Target Enabling Resources

} } +@if (gene) { +
+
+
+

Drug Development Resources

+

+ These external sites provide information and resources related to drug development. +

+
+
{{ r.title }}
+ +
+ {{ r.description }} +
+
+
+
+
+} + @if (additionalResources) {

Additional Resources

-

These external sites provide additional useful information for exploring AD targets.

+

+ These external sites provide additional information about therapeutic targets for AD and + related dementias. +

{{ r.title }}
{{ r.description }} diff --git a/libs/agora/genes/src/lib/components/gene-resources/gene-resources.component.ts b/libs/agora/genes/src/lib/components/gene-resources/gene-resources.component.ts index b158b6e160..4f80ef2f27 100644 --- a/libs/agora/genes/src/lib/components/gene-resources/gene-resources.component.ts +++ b/libs/agora/genes/src/lib/components/gene-resources/gene-resources.component.ts @@ -1,7 +1,7 @@ import { Component, Input, OnInit } from '@angular/core'; import { Gene } from '@sagebionetworks/agora/api-client-angular'; -import { AdditionalResource } from '@sagebionetworks/agora/models'; +import { ResourceCard } from '@sagebionetworks/agora/models'; import { CommonModule } from '@angular/common'; @Component({ @@ -14,7 +14,8 @@ import { CommonModule } from '@angular/common'; export class GeneResourcesComponent implements OnInit { @Input() gene: Gene | undefined; - additionalResources: AdditionalResource[] = []; + additionalResources: ResourceCard[] = []; + drugDevelopmentResources: ResourceCard[] = []; ngOnInit(): void { this.init(); @@ -33,66 +34,130 @@ export class GeneResourcesComponent implements OnInit { return; } - this.additionalResources = [ + this.drugDevelopmentResources = [ + { + title: 'Chemical Probes', + description: + 'View expert reviews and evaluations of any chemical probes that are available for this target.', + linkText: 'Visit Chemical Probes', + link: `https://www.chemicalprobes.org/?q=${this.gene?.hgnc_symbol}`, + }, { title: 'Open Targets', description: - 'View this gene on Open Targets, a resource that provides evidence on the validity of therapeutic targets based on genome-scale experiments and analysis.', + 'View evidence on the validity of this therapeutic target based on genome-scale experiments and analysis.', linkText: 'Visit Open Targets', link: `https://platform.opentargets.org/target/${this.gene?.ensembl_gene_id}`, }, + { + title: 'PharmGKB', + description: 'Search for information on gene-drug and gene-phenotype relationships.', + linkText: 'Visit PharmGKB', + link: 'https://www.pharmgkb.org', + }, { title: 'Pharos', description: - 'View this gene on Pharos, a resource that provides access to the integrated knowledge-base from the Illuminating the Druggable Genome program.', + 'View information about this target in the Knowledge Management Center for the Illuminating the Druggable Genome program.', linkText: 'Visit Pharos', link: `https://pharos.nih.gov/targets?q=${this.gene?.ensembl_gene_id}`, }, { - title: 'Brain RNAseq', + title: 'Probe Miner', description: - 'Search for this gene on the Brain RNAseq site, which hosts single-cell RNAseq data.', - linkText: 'Visit BrainRNAseq', - link: 'http://www.brainrnaseq.org/', + 'Search for information on chemical probes based on large-scale, publicly available, medicinal chemistry data.', + linkText: 'Visit Probe Miner', + link: 'https://probeminer.icr.ac.uk/#/', }, { - title: 'Genomics DB', - description: - "View this gene on the National Institute on Aging Genetics of Alzheimer's Disease Data Storage Site (NIAGADS) Genomics Database.", - linkText: 'Visit Genomics DB', - link: `https://www.niagads.org/genomics/app/record/gene/${this.gene?.ensembl_gene_id}`, + title: 'Protein Data Bank', + description: 'Search for experimental and computed 3D protein structure information.', + linkText: 'Visit PDB', + link: 'https://www.rcsb.org', }, + ]; + + this.additionalResources = [ { title: 'AD Atlas', description: - 'View this gene on the AD Atlas site, a network-based resource for investigating AD in a multi-omic context.', + 'Perform interactive network and enrichment analyses on this target using a heterogenous network of multiomic, association, and endophenotypic data.', linkText: 'Visit AD Atlas', - link: `https://adatlas.org/?geneID=${this.gene?.ensembl_gene_id}`, + link: `https://adatlas.org/?type=geneEnsembl&ids=${this.gene?.ensembl_gene_id}`, }, { - title: 'Pub AD', - description: 'View dementia-related publication information for this gene on PubAD.', - linkText: 'Visit PubAD', - link: `${this.getPubADLink()}`, + title: 'Alzforum', + description: + 'Visit Alzforum for news and information resources about AD and related disorders.', + linkText: 'Visit Alzforum', + link: 'https://www.alzforum.org', + }, + { + title: 'AlzPED', + description: + 'Search for information on preclinical efficacy studies of candidate AD therapeutics.', + linkText: 'Visit AlzPED', + link: 'https://alzped.nia.nih.gov', + }, + { + title: 'AMP-PD Target Explorer', + description: + "View evidence about whether this target is associated with Parkinson's Disease.", + linkText: 'Visit AMP-PD', + link: `https://target-explorer.amp-pd.org/genes/target-search?gene=${this.gene?.ensembl_gene_id}`, + }, + { + title: 'Brain Knowledge Platform', + description: + 'View single nucleus RNAseq results for this target using the Allen Institute SEA-AD Comparative Viewer.', + linkText: 'Visit Brain Knowledge Platform', + link: `https://knowledge.brain-map.org/data/5IU4U8BP711TR6KZ843/2CD0HDC5PS6A58T0P6E/compare?geneOption=${this.gene?.hgnc_symbol ?? this.gene?.ensembl_gene_id}`, }, { title: 'Gene Ontology', - description: 'View the gene ontology information for this gene on Ensembl.', - linkText: 'Visit Ensembl', - link: `https://www.ensembl.org/Homo_sapiens/Gene/Ontologies/molecular_function?g=${this.gene?.ensembl_gene_id}`, + description: + 'View the GO terms associated with this target and explore ontology-related tools.', + linkText: 'Visit AmiGO 2', + link: `https://amigo.geneontology.org/amigo/search/annotation?q=${this.gene?.hgnc_symbol ?? this.gene?.ensembl_gene_id}`, + }, + { + title: 'GeneCards', + description: + 'View integrated information about this target gathered from a comprehensive collection of public sources.', + linkText: 'Visit GeneCards', + link: `https://www.genecards.org/cgi-bin/carddisp.pl?gene=${this.gene?.hgnc_symbol ?? this.gene?.ensembl_gene_id}`, + }, + { + title: 'Genomics DB', + description: + "View information about this target on the National Institute on Aging Genetics of Alzheimer's Disease Data Storage Site (NIAGADS) Genomics Database.", + linkText: 'Visit Genomics DB', + link: `https://www.niagads.org/genomics/app/record/gene/${this.gene?.ensembl_gene_id}`, + }, + { + title: 'Pub AD', + description: 'View dementia-related publication information for this target.', + linkText: 'Visit PubAD', + link: `${this.getPubADLink()}`, }, { title: 'Reactome Pathways', - description: 'View the reactome pathway information for this gene on Ensembl.', + description: 'View the reactome pathway information for this target on Ensembl.', linkText: 'Visit Ensembl', link: `https://www.ensembl.org/Homo_sapiens/Gene/Pathway?g=${this.gene?.ensembl_gene_id}`, }, { - title: 'AMP-PD Target Explorer', + title: 'SEA-AD', description: - "View this gene in the AMP-PD Target Explorer, a resource that hosts evidence about whether genes are associated with Parkinson's Disease.", - linkText: 'Visit AMP-PD', - link: `https://target-explorer.amp-pd.org/genes/target-search?gene=${this.gene?.ensembl_gene_id}`, + 'Explore the Seattle Alzheimer’s Disease Brain Cell Atlas resources from the Allen Institute.', + linkText: 'Visit SEA-AD', + link: 'https://portal.brain-map.org/explore/seattle-alzheimers-disease', + }, + { + title: 'UniProtKB', + description: 'View protein sequence and functional information about this target.', + linkText: 'Visit UniProtKB', + link: `https://www.uniprot.org/uniprotkb?query=${this.gene?.ensembl_gene_id}`, }, ]; } diff --git a/libs/agora/genes/src/lib/components/gene-similar/gene-similar.component.html b/libs/agora/genes/src/lib/components/gene-similar/gene-similar.component.html new file mode 100644 index 0000000000..d7294137f5 --- /dev/null +++ b/libs/agora/genes/src/lib/components/gene-similar/gene-similar.component.html @@ -0,0 +1,47 @@ +
+
+
+

Similar Genes

+ @if (gene?.ensembl_gene_id) { +

+ Genes that are similar to + {{ + gene.hgnc_symbol || gene.ensembl_gene_id + }} + based on network coexpression. +

+ } + @if (!gene?.ensembl_gene_id) { +

Genes that are similar based on network coexpression.

+ } + + +
+
+
+ +
+
+
+
+ +
+
+ + Use + Agora's Gene Comparison Tool + to compare similar genes in this list. +
+
+
+
diff --git a/libs/agora/genes/src/lib/components/gene-similar/gene-similar.component.scss b/libs/agora/genes/src/lib/components/gene-similar/gene-similar.component.scss new file mode 100644 index 0000000000..6eb98715ac --- /dev/null +++ b/libs/agora/genes/src/lib/components/gene-similar/gene-similar.component.scss @@ -0,0 +1,29 @@ +// Most of the table styling in styles.scss to avoid repeating +// code + +.small-margin-left { + margin-left: 15px; +} + +.search-box { + position: relative; + + .search-box-icon { + display: flex; + width: 60px; + height: 100%; + position: absolute; + align-items: center; + justify-content: center; + color: var(--color-gray-300); + } + + input { + padding: 20px 25px 20px 60px; + border-radius: 5px; + width: 100%; + border: 1px solid var(--color-gray-400); + outline: none; + box-sizing: border-box; + } +} diff --git a/libs/agora/genes/src/lib/components/gene-similar/gene-similar.component.spec.ts.off b/libs/agora/genes/src/lib/components/gene-similar/gene-similar.component.spec.ts.off new file mode 100644 index 0000000000..00fc7a9563 --- /dev/null +++ b/libs/agora/genes/src/lib/components/gene-similar/gene-similar.component.spec.ts.off @@ -0,0 +1,59 @@ +// -------------------------------------------------------------------------- // +// External +// -------------------------------------------------------------------------- // +import { TestBed, ComponentFixture } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; + +// -------------------------------------------------------------------------- // +// Internal +// -------------------------------------------------------------------------- // +import { GeneSimilarComponent } from './gene-similar.component'; +import { geneMock1, geneMock2, geneMock3 } from '@sagebionetworks/agora/testing'; +import { GenesService } from '@sagebionetworks/agora/api-client-angular'; +import { HelperService } from '@sagebionetworks/agora/services'; + +// -------------------------------------------------------------------------- // +// Tests +// -------------------------------------------------------------------------- // +describe('Component: Gene Similar', () => { + let fixture: ComponentFixture; + let component: GeneSimilarComponent; + let element: HTMLElement; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [GeneSimilarComponent], + imports: [RouterTestingModule, HttpClientTestingModule], + providers: [GenesService, HelperService], + }).compileComponents(); + }); + + beforeEach(async () => { + fixture = TestBed.createComponent(GeneSimilarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + element = fixture.nativeElement; + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should order by hgnc-symbol ascending', () => { + const expectedHgnc = [geneMock1.hgnc_symbol, geneMock2.hgnc_symbol, geneMock3.hgnc_symbol]; + expectedHgnc.sort(); + + component.genes = [geneMock1, geneMock2, geneMock3]; + fixture.detectChanges(); + + const table = element.querySelector('.similar-gene-table'); + expect(table).not.toBeNull(); + + const rows = Array.from(table?.querySelectorAll('tbody tr') || []) as HTMLTableRowElement[]; + expect(rows.length).toBe(3); + + const actualHgnc = rows.map((row) => row.cells[0].textContent?.trim()); + expect(actualHgnc).toEqual(expectedHgnc); + }); +}); diff --git a/libs/agora/genes/src/lib/components/gene-similar/gene-similar.component.ts b/libs/agora/genes/src/lib/components/gene-similar/gene-similar.component.ts new file mode 100644 index 0000000000..f407bad551 --- /dev/null +++ b/libs/agora/genes/src/lib/components/gene-similar/gene-similar.component.ts @@ -0,0 +1,120 @@ +import { Component, inject, OnInit } from '@angular/core'; +import { Router, ActivatedRoute, ParamMap, RouterLink } from '@angular/router'; +import { Gene, GenesService } from '@sagebionetworks/agora/api-client-angular'; +import { HelperService } from '@sagebionetworks/agora/services'; +import { GeneTableComponent } from '../gene-table/gene-table.component'; +import { ModalLinkComponent, SvgIconComponent } from '@sagebionetworks/agora/shared'; + +interface TableColumn { + field: string; + header: string; + selected?: boolean; +} + +@Component({ + selector: 'agora-gene-similar', + standalone: true, + imports: [ModalLinkComponent, GeneTableComponent, RouterLink, SvgIconComponent], + providers: [GenesService], + templateUrl: './gene-similar.component.html', + styleUrls: ['./gene-similar.component.scss'], +}) +export class GeneSimilarComponent implements OnInit { + route = inject(ActivatedRoute); + router = inject(Router); + genesService = inject(GenesService); + helperService = inject(HelperService); + + gene: Gene = {} as Gene; + genes: Gene[] = []; + + tableColumns: TableColumn[] = [ + { field: 'hgnc_symbol', header: 'Gene name', selected: true }, + { + field: 'nominated_target_display_value', + header: 'Nominated Target', + selected: true, + }, + { + field: 'is_igap', + header: 'Genetic Association with LOAD', + selected: true, + }, + { field: 'is_eqtl', header: 'Brain eQTL', selected: true }, + { + field: 'is_any_rna_changed_in_ad_brain_display_value', + header: 'RNA Expression Change', + selected: true, + }, + { + field: 'is_any_protein_changed_in_ad_brain_display_value', + header: 'Protein Expression Change', + }, + { field: 'pharos_class_display_value', header: 'Pharos Class' }, + ]; + + gctLink: { [key: string]: string } | undefined; + + ngOnInit() { + this.route.paramMap.subscribe((params: ParamMap) => { + if (params.get('id')) { + this.helperService.setLoading(true); + this.genesService.getGene(params.get('id') as string).subscribe((gene: Gene | null) => { + if (!gene) { + this.helperService.setLoading(false); + // https://github.com/angular/angular/issues/45202 + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.router.navigateByUrl('/404-not-found', { skipLocationChange: true }); + } else { + this.gene = gene; + this.init(); + } + }); + } + }); + } + + init() { + if (!this.gene?.similar_genes_network?.nodes?.length) { + return; + } + + const ids: any = []; + this.gene.similar_genes_network.nodes.forEach((obj: any) => { + ids.push(obj.ensembl_gene_id); + }); + + this.genesService.getGenes(ids).subscribe((response) => { + const genes = response; + + genes.forEach((de: Gene) => { + // Populate display fields & set default values + de.is_any_rna_changed_in_ad_brain_display_value = de.rna_brain_change_studied + ? de.is_any_rna_changed_in_ad_brain.toString() + : 'No data'; + de.is_any_protein_changed_in_ad_brain_display_value = de.protein_brain_change_studied + ? de.is_any_protein_changed_in_ad_brain.toString() + : 'No data'; + if (de.total_nominations) de.nominated_target_display_value = de.total_nominations > 0; + else de.nominated_target_display_value = false; + + // Populate Druggability display fields + if (de.druggability) { + de.pharos_class_display_value = de.druggability.pharos_class; + } + }); + + this.genes = genes; + }); + + this.helperService.setLoading(false); + } + + navigateToGeneComparisonTool() { + const ids: string[] = this.genes.map((g: Gene) => g.ensembl_gene_id); + this.helperService.setGCTSelection(ids); + // https://github.com/angular/angular/issues/45202 + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.router.navigate(['/genes/comparison']); + } +} diff --git a/libs/agora/genes/src/lib/components/gene-table/gene-table.component.ts b/libs/agora/genes/src/lib/components/gene-table/gene-table.component.ts index 12833a8f46..f97d151879 100644 --- a/libs/agora/genes/src/lib/components/gene-table/gene-table.component.ts +++ b/libs/agora/genes/src/lib/components/gene-table/gene-table.component.ts @@ -124,22 +124,7 @@ export class GeneTableComponent { } else if (a == null && b == null) { result = 0; } else if (typeof a === 'string' && typeof b === 'string') { - // Natural sorting for this score type, which can be >= 10 - if ( - event.field === 'sm_druggability_display_value' || - event.field === 'safety_rating_display_value' || - event.field === 'ab_modality_display_value' - ) { - let nA = parseInt(a.split(':')[0], 10); - let nB = parseInt(b.split(':')[0], 10); - - nA = !isNaN(nA) ? nA : 999 * event.order; - nB = !isNaN(nB) ? nB : 999 * event.order; - - result = nA < nB ? -1 : nA > nB ? 1 : 0; - } else { - result = a.localeCompare(b); - } + result = a.localeCompare(b); } else { result = a < b ? -1 : a > b ? 1 : 0; } diff --git a/libs/agora/genes/tsconfig.lib.json b/libs/agora/genes/tsconfig.lib.json index b228a1a081..4f08aa6032 100644 --- a/libs/agora/genes/tsconfig.lib.json +++ b/libs/agora/genes/tsconfig.lib.json @@ -8,5 +8,5 @@ "types": [] }, "exclude": ["src/test-setup.ts", "**/*.spec.ts", "**/*.test.ts", "jest.config.ts"], - "include": ["**/*.ts"] + "include": ["**/*.ts", "src/lib/components/gene-similar/gene-similar.component.spec.ts"] } diff --git a/libs/agora/genes/tsconfig.spec.json b/libs/agora/genes/tsconfig.spec.json index d3889a9881..42ad3758ea 100644 --- a/libs/agora/genes/tsconfig.spec.json +++ b/libs/agora/genes/tsconfig.spec.json @@ -6,5 +6,11 @@ "types": ["jest", "node"] }, "files": ["src/test-setup.ts"], - "include": ["**/*.test.ts", "**/*.spec.ts", "**/*.d.ts", "jest.config.ts"] + "include": [ + "**/*.test.ts", + "**/*.spec.ts", + "**/*.d.ts", + "jest.config.ts", + "src/lib/components/gene-similar/gene-similar.component.spec.ts" + ] } diff --git a/libs/agora/models/ResourceCard.ts b/libs/agora/models/ResourceCard.ts new file mode 100644 index 0000000000..eaf0842c74 --- /dev/null +++ b/libs/agora/models/ResourceCard.ts @@ -0,0 +1,6 @@ +export interface ResourceCard { + title: string; + description: string; + linkText: string; + link: string; +} diff --git a/libs/agora/models/additional-resource.ts b/libs/agora/models/additional-resource.ts deleted file mode 100644 index 35d2aa8203..0000000000 --- a/libs/agora/models/additional-resource.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface AdditionalResource { - title: string; - description: string; - linkText: string; - link: string; -} diff --git a/libs/agora/models/genes.ts b/libs/agora/models/genes.ts index a69134818e..e120ea399d 100644 --- a/libs/agora/models/genes.ts +++ b/libs/agora/models/genes.ts @@ -23,7 +23,6 @@ export interface TargetNomination { input_data: string; validation_study_details: string; initial_nomination: number; - // team_data?: Team; } @@ -41,7 +40,7 @@ export interface Druggability { sm_druggability_bucket: number; safety_bucket: number; abability_bucket: number; - pharos_class: string; + pharos_class?: string[]; // classification should really be named sm_druggability_bucket_definition classification: string; safety_bucket_definition: string; @@ -55,6 +54,7 @@ export interface Gene { summary: string; hgnc_symbol: string; alias: string[]; + uniprotkb_accessions: string[]; is_igap: boolean; is_eqtl: boolean; is_any_rna_changed_in_ad_brain: boolean; @@ -63,7 +63,7 @@ export interface Gene { protein_brain_change_studied: boolean; target_nominations: TargetNomination[] | null; median_expression: MedianExpression[]; - druggability: Druggability[]; + druggability: Druggability; total_nominations: number | null; is_adi: boolean; is_tep: boolean; @@ -84,10 +84,7 @@ export interface Gene { similar_genes_network?: SimilarGenesNetwork; // Similar table (not in mongo document) - ab_modality_display_value?: string; - safety_rating_display_value?: string; - sm_druggability_display_value?: string; - pharos_class_display_value?: string; + pharos_class_display_value?: string[]; is_any_rna_changed_in_ad_brain_display_value?: string; is_any_protein_changed_in_ad_brain_display_value?: string; nominated_target_display_value?: boolean; diff --git a/libs/agora/models/index.ts b/libs/agora/models/index.ts index 3e1bfde560..c92124d194 100644 --- a/libs/agora/models/index.ts +++ b/libs/agora/models/index.ts @@ -1,4 +1,3 @@ -export * from './additional-resource'; export * from './biodomains'; export * from './chart-range'; export * from './charts'; @@ -14,6 +13,7 @@ export * from './misc'; export * from './neuropathologic-correlations'; export * from './overall-scores'; export * from './proteomics'; +export * from './ResourceCard'; export * from './rna'; export * from './scores'; export * from './synapse-wiki'; diff --git a/libs/agora/nominated-targets/src/lib/nominated-targets/nominated-targets.component.ts b/libs/agora/nominated-targets/src/lib/nominated-targets/nominated-targets.component.ts index 1953cb5400..760884b205 100644 --- a/libs/agora/nominated-targets/src/lib/nominated-targets/nominated-targets.component.ts +++ b/libs/agora/nominated-targets/src/lib/nominated-targets/nominated-targets.component.ts @@ -56,39 +56,27 @@ export class NominatedTargetsComponent implements OnInit { header: 'Pharos Class', selected: false, }, - { - field: 'sm_druggability_display_value', - header: 'Small Molecule Druggability', - selected: false, - }, - { - field: 'safety_rating_display_value', - header: 'Safety Rating', - selected: false, - }, - { - field: 'ab_modality_display_value', - header: 'Antibody Modality', - selected: false, - }, ]; ngOnInit() { this.apiService.getNominatedGenes().subscribe((response) => { if (!response.items) return; const genes = response.items; + genes.forEach((de: Gene) => { let teamsArray: string[] = []; let studyArray: string[] = []; let programsArray: string[] = []; let inputDataArray: string[] = []; let initialNominationArray: number[] = []; + if (de.total_nominations) { if (!this.nominations.includes(de.total_nominations)) { this.nominations.push(de.total_nominations); this.nominations.sort(); } } + // Handle TargetNomination fields // First map all entries nested in the data to a new array if (de.target_nominations?.length) { @@ -98,45 +86,36 @@ export class NominatedTargetsComponent implements OnInit { ); programsArray = de.target_nominations.map((nt: TargetNomination) => nt.source); inputDataArray = de.target_nominations.map((nt: TargetNomination) => nt.input_data); + initialNominationArray = de.target_nominations .map((nt: TargetNomination) => nt.initial_nomination) .filter((item) => item !== undefined); } + // Check if there are any strings with commas inside, // if there are separate those into new split strings teamsArray = this.commaFlattenArray(teamsArray); studyArray = this.commaFlattenArray(studyArray); programsArray = this.commaFlattenArray(programsArray); inputDataArray = this.commaFlattenArray(inputDataArray); + // Populate targetNomination display fields de.teams_display_value = this.getCommaSeparatedStringOfUniqueSortedValues(teamsArray); de.study_display_value = this.getCommaSeparatedStringOfUniqueSortedValues(studyArray); de.programs_display_value = this.getCommaSeparatedStringOfUniqueSortedValues(programsArray); de.input_data_display_value = this.getCommaSeparatedStringOfUniqueSortedValues(inputDataArray); + de.initial_nomination_display_value = initialNominationArray.length ? Math.min(...initialNominationArray) : undefined; + // Populate Druggability display fields - if (de.druggability && de.druggability.length) { - de.pharos_class_display_value = de.druggability[0].pharos_class - ? de.druggability[0].pharos_class - : 'No value'; - de.sm_druggability_display_value = - de.druggability[0].sm_druggability_bucket + ': ' + de.druggability[0].classification; - de.safety_rating_display_value = - de.druggability[0].safety_bucket + ': ' + de.druggability[0].safety_bucket_definition; - de.ab_modality_display_value = - de.druggability[0].abability_bucket + - ': ' + - de.druggability[0].abability_bucket_definition; - } else { - de.pharos_class_display_value = 'No value'; - de.sm_druggability_display_value = 'No value'; - de.safety_rating_display_value = 'No value'; - de.ab_modality_display_value = 'No value'; + if (de.druggability) { + de.pharos_class_display_value = de.druggability.pharos_class; } }); + this.genes = genes; }); } diff --git a/libs/agora/testing/src/lib/mocks/gene-mocks.ts b/libs/agora/testing/src/lib/mocks/gene-mocks.ts index 97752ab619..811dda26cb 100644 --- a/libs/agora/testing/src/lib/mocks/gene-mocks.ts +++ b/libs/agora/testing/src/lib/mocks/gene-mocks.ts @@ -28,6 +28,7 @@ export const geneMock1: Gene = { 'Moesin (for membrane-organizing extension spike protein) is a member of the ERM family which includes ezrin and radixin. ERM proteins appear to function as cross-linkers between plasma membranes and actin-based cytoskeletons. Moesin is localized to filopodia and other membranous protrusions that are important for cell-cell recognition and signaling and for cell movement. [provided by RefSeq, Jul 2008].', hgnc_symbol: 'MSN', alias: ['HEL70', 'IMD50'], + uniprotkb_accessions: [], is_igap: false, is_eqtl: false, is_any_rna_changed_in_ad_brain: true, @@ -203,20 +204,18 @@ export const geneMock1: Gene = { tissue: 'STG', }, ], - druggability: [ - { - sm_druggability_bucket: 3, - safety_bucket: 4, - abability_bucket: 3, - pharos_class: 'Tbio', - classification: - 'Targetable by structure: Structurally druggable protein, based on the presence of a druggable pocket in the protein (DrugEBIlity/CanSAR).', - safety_bucket_definition: - 'More than two of: high off target gene expression, cancer driver, essential gene, associated deleterious genetic disorder, HPO phenotype associated gene, or black box warning on clinically used drug.', - abability_bucket_definition: - 'Cell membrane-bound proteins. Highly accessible to antibody-based therapies, but potentially less so than secreted proteins or ECM components.', - }, - ], + druggability: { + sm_druggability_bucket: 3, + safety_bucket: 4, + abability_bucket: 3, + pharos_class: ['Tbio'], + classification: + 'Targetable by structure: Structurally druggable protein, based on the presence of a druggable pocket in the protein (DrugEBIlity/CanSAR).', + safety_bucket_definition: + 'More than two of: high off target gene expression, cancer driver, essential gene, associated deleterious genetic disorder, HPO phenotype associated gene, or black box warning on clinically used drug.', + abability_bucket_definition: + 'Cell membrane-bound proteins. Highly accessible to antibody-based therapies, but potentially less so than secreted proteins or ECM components.', + }, total_nominations: 5, rna_differential_expression: [ { @@ -2978,6 +2977,7 @@ export const geneMock2: Gene = { 'PLEC1b', 'PLTN', ], + uniprotkb_accessions: [], is_igap: false, is_eqtl: true, is_any_rna_changed_in_ad_brain: true, @@ -3117,20 +3117,18 @@ export const geneMock2: Gene = { tissue: 'STG', }, ], - druggability: [ - { - sm_druggability_bucket: 3, - safety_bucket: 4, - abability_bucket: 3, - pharos_class: 'Tbio', - classification: - 'Targetable by structure: Structurally druggable protein, based on the presence of a druggable pocket in the protein (DrugEBIlity/CanSAR).', - safety_bucket_definition: - 'More than two of: high off target gene expression, cancer driver, essential gene, associated deleterious genetic disorder, HPO phenotype associated gene, or black box warning on clinically used drug.', - abability_bucket_definition: - 'Cell membrane-bound proteins. Highly accessible to antibody-based therapies, but potentially less so than secreted proteins or ECM components.', - }, - ], + druggability: { + sm_druggability_bucket: 3, + safety_bucket: 4, + abability_bucket: 3, + pharos_class: ['Tbio'], + classification: + 'Targetable by structure: Structurally druggable protein, based on the presence of a druggable pocket in the protein (DrugEBIlity/CanSAR).', + safety_bucket_definition: + 'More than two of: high off target gene expression, cancer driver, essential gene, associated deleterious genetic disorder, HPO phenotype associated gene, or black box warning on clinically used drug.', + abability_bucket_definition: + 'Cell membrane-bound proteins. Highly accessible to antibody-based therapies, but potentially less so than secreted proteins or ECM components.', + }, total_nominations: 3, is_adi: false, is_tep: true, @@ -3152,6 +3150,7 @@ export const geneMock3: Gene = { 'The protein encoded by this gene is a member of the Src family of tyrosine kinases. This protein is primarily hemopoietic, particularly in cells of the myeloid and B-lymphoid lineages. It may help couple the Fc receptor to the activation of the respiratory burst. In addition, it may play a role in neutrophil migration and in the degranulation of neutrophils. Multiple isoforms with different subcellular distributions are produced due to both alternative splicing and the use of alternative translation initiation codons, including a non-AUG (CUG) codon. [provided by RefSeq, Feb 2010].', hgnc_symbol: 'HCK', alias: ['JTK9', 'p59Hck', 'p61Hck'], + uniprotkb_accessions: [], is_igap: false, is_eqtl: true, is_any_rna_changed_in_ad_brain: true, @@ -3242,20 +3241,18 @@ export const geneMock3: Gene = { tissue: 'STG', }, ], - druggability: [ - { - sm_druggability_bucket: 3, - safety_bucket: 4, - abability_bucket: 3, - pharos_class: 'Tbio', - classification: - 'Targetable by structure: Structurally druggable protein, based on the presence of a druggable pocket in the protein (DrugEBIlity/CanSAR).', - safety_bucket_definition: - 'More than two of: high off target gene expression, cancer driver, essential gene, associated deleterious genetic disorder, HPO phenotype associated gene, or black box warning on clinically used drug.', - abability_bucket_definition: - 'Cell membrane-bound proteins. Highly accessible to antibody-based therapies, but potentially less so than secreted proteins or ECM components.', - }, - ], + druggability: { + sm_druggability_bucket: 3, + safety_bucket: 4, + abability_bucket: 3, + pharos_class: ['Tbio'], + classification: + 'Targetable by structure: Structurally druggable protein, based on the presence of a druggable pocket in the protein (DrugEBIlity/CanSAR).', + safety_bucket_definition: + 'More than two of: high off target gene expression, cancer driver, essential gene, associated deleterious genetic disorder, HPO phenotype associated gene, or black box warning on clinically used drug.', + abability_bucket_definition: + 'Cell membrane-bound proteins. Highly accessible to antibody-based therapies, but potentially less so than secreted proteins or ECM components.', + }, total_nominations: null, is_adi: false, is_tep: true, @@ -3358,6 +3355,7 @@ export const nominatedGeneMock1: Gene = { summary: '', hgnc_symbol: 'MSN', alias: [], + uniprotkb_accessions: [], is_igap: false, is_eqtl: false, is_any_rna_changed_in_ad_brain: false, @@ -3423,20 +3421,18 @@ export const nominatedGeneMock1: Gene = { }, ], median_expression: [], - druggability: [ - { - sm_druggability_bucket: 3, - safety_bucket: 4, - abability_bucket: 3, - pharos_class: 'Tbio', - classification: - 'Targetable by structure: Structurally druggable protein, based on the presence of a druggable pocket in the protein (DrugEBIlity/CanSAR).', - safety_bucket_definition: - 'More than two of: high off target gene expression, cancer driver, essential gene, associated deleterious genetic disorder, HPO phenotype associated gene, or black box warning on clinically used drug.', - abability_bucket_definition: - 'Cell membrane-bound proteins. Highly accessible to antibody-based therapies, but potentially less so than secreted proteins or ECM components.', - }, - ], + druggability: { + sm_druggability_bucket: 3, + safety_bucket: 4, + abability_bucket: 3, + pharos_class: ['Tbio'], + classification: + 'Targetable by structure: Structurally druggable protein, based on the presence of a druggable pocket in the protein (DrugEBIlity/CanSAR).', + safety_bucket_definition: + 'More than two of: high off target gene expression, cancer driver, essential gene, associated deleterious genetic disorder, HPO phenotype associated gene, or black box warning on clinically used drug.', + abability_bucket_definition: + 'Cell membrane-bound proteins. Highly accessible to antibody-based therapies, but potentially less so than secreted proteins or ECM components.', + }, total_nominations: 4, is_adi: false, is_tep: false, @@ -3456,6 +3452,7 @@ export const noHGNCgeneMock: Gene = { summary: '', hgnc_symbol: '', alias: [], + uniprotkb_accessions: [], is_igap: false, is_eqtl: false, is_any_rna_changed_in_ad_brain: false, @@ -3526,20 +3523,18 @@ export const noHGNCgeneMock: Gene = { }, ], median_expression: [], - druggability: [ - { - sm_druggability_bucket: 3, - safety_bucket: 4, - abability_bucket: 3, - pharos_class: 'Tbio', - classification: - 'Targetable by structure: Structurally druggable protein, based on the presence of a druggable pocket in the protein (DrugEBIlity/CanSAR).', - safety_bucket_definition: - 'More than two of: high off target gene expression, cancer driver, essential gene, associated deleterious genetic disorder, HPO phenotype associated gene, or black box warning on clinically used drug.', - abability_bucket_definition: - 'Cell membrane-bound proteins. Highly accessible to antibody-based therapies, but potentially less so than secreted proteins or ECM components.', - }, - ], + druggability: { + sm_druggability_bucket: 3, + safety_bucket: 4, + abability_bucket: 3, + pharos_class: ['Tbio'], + classification: + 'Targetable by structure: Structurally druggable protein, based on the presence of a druggable pocket in the protein (DrugEBIlity/CanSAR).', + safety_bucket_definition: + 'More than two of: high off target gene expression, cancer driver, essential gene, associated deleterious genetic disorder, HPO phenotype associated gene, or black box warning on clinically used drug.', + abability_bucket_definition: + 'Cell membrane-bound proteins. Highly accessible to antibody-based therapies, but potentially less so than secreted proteins or ECM components.', + }, total_nominations: 4, is_adi: false, is_tep: false, diff --git a/tsconfig.base.json b/tsconfig.base.json index 1201276f64..b205fee496 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -25,6 +25,7 @@ "libs/agora/gene-comparison-tool/src/index.ts" ], "@sagebionetworks/agora/gene-details": ["libs/agora/genes/src/index.ts"], + "@sagebionetworks/agora/gene-similar": ["libs/agora/genes/src/index.ts"], "@sagebionetworks/agora/genes": ["libs/agora/genes/src/index.ts"], "@sagebionetworks/agora/home": ["libs/agora/home/src/index.ts"], "@sagebionetworks/agora/models": ["libs/agora/models/index.ts"],