From 6c2c95e62db849b7fad1b545d2bf2d5350aca0a0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 15 Jun 2026 01:25:54 +0000 Subject: [PATCH 1/2] Initial plan From adc77b9b76ad5c98dc2643b78b5b7f4fab6ea3ee Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 15 Jun 2026 01:33:17 +0000 Subject: [PATCH 2/2] Change default IGV transcript display to show all RefSeq transcripts in expanded mode Switch expanded IGV view from using `genome` shorthand to explicit `reference` with RefSeq annotation track configured with `displayMode: 'EXPANDED'`. This shows all transcripts with a scrollbar instead of only the first two. Also fixes the incomplete hg38 cytobandURL. --- .../genomicOverview/GenomicOverview.tsx | 11 +- src/shared/lib/IGVUtils.spec.ts | 120 +++--------------- src/shared/lib/IGVUtils.ts | 31 ++++- 3 files changed, 57 insertions(+), 105 deletions(-) diff --git a/src/pages/patientView/genomicOverview/GenomicOverview.tsx b/src/pages/patientView/genomicOverview/GenomicOverview.tsx index ca34dcae6d5..15e5fdfc902 100644 --- a/src/pages/patientView/genomicOverview/GenomicOverview.tsx +++ b/src/pages/patientView/genomicOverview/GenomicOverview.tsx @@ -18,6 +18,7 @@ import { defaultGrch37ReferenceProps, defaultGrch38ReferenceProps, defaultMutationTrackProps, + defaultRefSeqTrackProps, defaultSegmentTrackProps, generateMutationFeatures, generateSegmentFeatures, @@ -272,9 +273,17 @@ export default class GenomicOverview extends React.Component< }, }; } else { + const genomeId = isGrch38(this.props.genome || '') + ? 'hg38' + : 'hg19'; return { ...coreProps, - genome: isGrch38(this.props.genome || '') ? 'hg38' : 'hg19', + reference: { + ...(genomeId === 'hg38' + ? defaultGrch38ReferenceProps() + : defaultGrch37ReferenceProps()), + tracks: [defaultRefSeqTrackProps(genomeId)], + }, showNavigation: true, showSearch: true, showSampleNameButton: true, diff --git a/src/shared/lib/IGVUtils.spec.ts b/src/shared/lib/IGVUtils.spec.ts index b0ca6bb6958..9aaf2d9f5e8 100644 --- a/src/shared/lib/IGVUtils.spec.ts +++ b/src/shared/lib/IGVUtils.spec.ts @@ -3,6 +3,7 @@ import { assert } from 'chai'; import { CopyNumberSeg } from 'cbioportal-ts-api-client'; import { calcIgvTrackHeight, + defaultRefSeqTrackProps, featuresWithoutFunctions, generateSegmentFeatures, generateSegmentFileContent, @@ -272,111 +273,24 @@ describe('IGVUtils', () => { }); }); - describe('getModifiedTrackNames', () => { - it('returns an empty array for empty input', () => { - assert.equal(getModifiedTrackNames([], []).length, 0); + describe('defaultRefSeqTrackProps', () => { + it('returns hg19 RefSeq track props with EXPANDED display mode', () => { + const props = defaultRefSeqTrackProps('hg19'); + assert.equal(props.name, 'Refseq Genes'); + assert.equal(props.format, 'refgene'); + assert.equal(props.displayMode, 'EXPANDED'); + assert.include(props.url, 'hg19'); + assert.include(props.url, 'ncbiRefSeq'); + assert.isDefined(props.indexURL); }); - it('returns newly added track names', () => { - const currentTracks = [ - { - name: 'MUT', - type: 'variant', - }, - ]; - - const nextTracks = [ - { - name: 'CNA', - type: 'seg', - displayMode: 'FILL', - features: [], - }, - { - name: 'MUT', - type: 'variant', - }, - ]; - - assert.equal( - getModifiedTrackNames(currentTracks, nextTracks)[0], - 'CNA' - ); - }); - - it('returns an empty array if no track has been changed', () => { - const currentTracks = [ - { - name: 'MUT', - type: 'variant', - }, - { - name: 'CNA', - type: 'seg', - displayMode: 'FILL', - features: [], - }, - ]; - - const nextTracks = [ - { - name: 'CNA', - type: 'seg', - displayMode: 'FILL', - features: [], - }, - { - name: 'MUT', - type: 'variant', - }, - ]; - - assert.equal( - getModifiedTrackNames(currentTracks, nextTracks).length, - 0 - ); - }); - - it('returns only modified tracks names', () => { - const currentTracks = [ - { - name: 'CNA', - type: 'seg', - displayMode: 'FILL', - features: [], - }, - { - name: 'MUT', - type: 'variant', - }, - ]; - - const nextTracks = [ - { - name: 'MUT', - type: 'variant', - }, - { - name: 'CNA', - type: 'seg', - displayMode: 'FILL', - features: [ - { - patient: 'p1', - sample: 's1', - }, - ], - }, - ]; - - assert.equal( - getModifiedTrackNames(currentTracks, nextTracks).length, - 1 - ); - assert.equal( - getModifiedTrackNames(currentTracks, nextTracks)[0], - 'CNA' - ); + it('returns hg38 RefSeq track props with EXPANDED display mode', () => { + const props = defaultRefSeqTrackProps('hg38'); + assert.equal(props.name, 'Refseq Genes'); + assert.equal(props.format, 'refgene'); + assert.equal(props.displayMode, 'EXPANDED'); + assert.include(props.url, 'hg38'); + assert.include(props.url, 'ncbiRefSeq'); }); }); }); diff --git a/src/shared/lib/IGVUtils.ts b/src/shared/lib/IGVUtils.ts index 3782c129622..d2b45af99eb 100644 --- a/src/shared/lib/IGVUtils.ts +++ b/src/shared/lib/IGVUtils.ts @@ -56,10 +56,39 @@ export function defaultGrch38ReferenceProps() { indexURL: 'https://s3.amazonaws.com/igv.broadinstitute.org/genomes/seq/hg38/hg38.fa.fai', cytobandURL: - 'https://s3.amazonaws.com/igv.broadinstitute.org/annotations/', + 'https://hgdownload.soe.ucsc.edu/goldenPath/hg38/database/cytoBandIdeo.txt.gz', }; } +export function defaultRefSeqTrackProps(genomeId: 'hg19' | 'hg38') { + if (genomeId === 'hg19') { + return { + name: 'Refseq Genes', + format: 'refgene', + url: + 'https://s3.amazonaws.com/igv.org.genomes/hg19/ncbiRefSeq.sorted.txt.gz', + indexURL: + 'https://s3.amazonaws.com/igv.org.genomes/hg19/ncbiRefSeq.sorted.txt.gz.tbi', + visibilityWindow: -1, + supportsWholeGenome: false, + displayMode: 'EXPANDED', + order: 1000000, + }; + } else { + return { + name: 'Refseq Genes', + format: 'refgene', + url: + 'https://hgdownload.soe.ucsc.edu/goldenPath/hg38/database/ncbiRefSeq.txt.gz', + indexed: false, + visibilityWindow: -1, + supportsWholeGenome: false, + displayMode: 'EXPANDED', + order: 1000000, + }; + } +} + export function defaultSegmentTrackProps() { return { name: CNA_TRACK_NAME,