From 5dcc523c9a574f90c0aa963e918859a65d31c355 Mon Sep 17 00:00:00 2001 From: Colin Date: Tue, 21 Nov 2023 15:26:42 -0500 Subject: [PATCH 1/6] Single file hub --- .../src/ucsc-trackhub/model.ts | 4 +- .../src/ucsc-trackhub/ucscTrackHub.ts | 52 ++-- test_data/volvox/config.json | 27 ++ test_data/volvoxhub/config.json | 9 + test_data/volvoxhub/singlefile.hub.txt | 252 ++++++++++++++++++ 5 files changed, 315 insertions(+), 29 deletions(-) create mode 100644 test_data/volvoxhub/singlefile.hub.txt diff --git a/plugins/data-management/src/ucsc-trackhub/model.ts b/plugins/data-management/src/ucsc-trackhub/model.ts index d84b2b17e0..4681be9e95 100644 --- a/plugins/data-management/src/ucsc-trackhub/model.ts +++ b/plugins/data-management/src/ucsc-trackhub/model.ts @@ -34,7 +34,7 @@ export default function UCSCTrackHubConnection(pluginManager: PluginManager) { fetchHubFile, } = await import('./ucscTrackHub') const hubFile = await fetchHubFile(hubFileLocation) - const genomeFile = hubFile.get('genomesFile') + const genomeFile = hubFile.data.genomesFile if (!genomeFile) { throw new Error('genomesFile not found on hub') } @@ -51,7 +51,7 @@ export default function UCSCTrackHubConnection(pluginManager: PluginManager) { } const genomesFile = await fetchGenomesFile(genomesFileLocation) const map = {} as Record - for (const [genomeName, genome] of genomesFile) { + for (const [genomeName, genome] of Object.entries(genomesFile)) { const assemblyNames = getConf(self, 'assemblyNames') if ( assemblyNames.length > 0 && diff --git a/plugins/data-management/src/ucsc-trackhub/ucscTrackHub.ts b/plugins/data-management/src/ucsc-trackhub/ucscTrackHub.ts index f7f7a517a8..e9bab02eda 100644 --- a/plugins/data-management/src/ucsc-trackhub/ucscTrackHub.ts +++ b/plugins/data-management/src/ucsc-trackhub/ucscTrackHub.ts @@ -60,8 +60,8 @@ export function generateTracks( ) { const tracks: any = [] - for (const [trackName, track] of trackDb.entries()) { - const trackKeys = [...track.keys()] + for (const [trackName, track] of Object.entries(trackDb.data)) { + const trackKeys = Object.keys(track!) const parentTrackKeys = new Set([ 'superTrack', 'compositeTrack', @@ -74,18 +74,18 @@ export function generateTracks( const parentTracks = [] let currentTrackName = trackName do { - currentTrackName = trackDb.get(currentTrackName)?.get('parent') || '' + currentTrackName = trackDb.data[currentTrackName]?.data.parent || '' if (currentTrackName) { ;[currentTrackName] = currentTrackName.split(' ') - parentTracks.push(trackDb.get(currentTrackName)) + parentTracks.push(trackDb.data[currentTrackName]) } } while (currentTrackName) parentTracks.reverse() const categories = parentTracks - .map(p => p?.get('shortLabel')) + .map(p => p?.data.shortLabel) .filter((f): f is string => !!f) const res = makeTrackConfig( - track, + track!, categories, trackDbLoc, trackDb, @@ -108,14 +108,12 @@ function makeTrackConfig( trackDb: TrackDbFile, sequenceAdapter: any, ) { - let trackType = track.get('type') - const name = track.get('shortLabel') || '' - const bigDataUrl = track.get('bigDataUrl') || '' - const bigDataIdx = track.get('bigDataIndex') || '' + const trackType = + track.data.type || trackDb.data[track.data.parent || '']?.data.type || '' + const name = track.data.shortLabel || '' + const bigDataUrl = track.data.bigDataUrl || '' + const bigDataIdx = track.data.bigDataIndex || '' const isUri = isUriLocation(trackDbLoc) - if (!trackType) { - trackType = trackDb.get(track.get('parent') || '')?.get('type') - } let baseTrackType = trackType?.split(' ')[0] || '' if (baseTrackType === 'bam' && bigDataUrl.toLowerCase().endsWith('cram')) { baseTrackType = 'cram' @@ -128,8 +126,8 @@ function makeTrackConfig( case 'bam': return { type: 'AlignmentsTrack', - name: track.get('shortLabel'), - description: track.get('longLabel'), + name: track.data.longLabel, + description: track.data.longLabel, category: categories, adapter: { type: 'BamAdapter', @@ -146,7 +144,7 @@ function makeTrackConfig( return { type: 'FeatureTrack', name, - description: track.get('longLabel'), + description: track.data.longLabel, category: categories, adapter: { type: 'BigBedAdapter', @@ -160,7 +158,7 @@ function makeTrackConfig( return { type: 'FeatureTrack', name, - description: track.get('longLabel'), + description: track.data.longLabel, category: categories, adapter: { type: 'BigBedAdapter', @@ -171,7 +169,7 @@ function makeTrackConfig( return { type: 'FeatureTrack', name, - description: track.get('longLabel'), + description: track.data.longLabel, category: categories, adapter: { type: 'BigBedAdapter', @@ -182,7 +180,7 @@ function makeTrackConfig( return { type: 'FeatureTrack', name, - description: track.get('longLabel'), + description: track.data.longLabel, category: categories, adapter: { type: 'BigBedAdapter', @@ -196,7 +194,7 @@ function makeTrackConfig( return { type: 'FeatureTrack', name, - description: track.get('longLabel'), + description: track.data.longLabel, category: categories, adapter: { type: 'BigBedAdapter', @@ -210,7 +208,7 @@ function makeTrackConfig( return { type: 'FeatureTrack', name, - description: track.get('longLabel'), + description: track.data.longLabel, category: categories, adapter: { type: 'BigBedAdapter', @@ -224,7 +222,7 @@ function makeTrackConfig( return { type: 'FeatureTrack', name, - description: track.get('longLabel'), + description: track.data.longLabel, category: categories, adapter: { type: 'BigBedAdapter', @@ -238,7 +236,7 @@ function makeTrackConfig( return { type: 'QuantitativeTrack', name, - description: track.get('longLabel'), + description: track.data.longLabel, category: categories, adapter: { type: 'BigWigAdapter', @@ -250,7 +248,7 @@ function makeTrackConfig( return { type: 'AlignmentsTrack', name, - description: track.get('longLabel'), + description: track.data.longLabel, category: categories, adapter: { type: 'CramAdapter', @@ -266,7 +264,7 @@ function makeTrackConfig( return { type: 'FeatureTrack', name, - description: track.get('longLabel'), + description: track.data.longLabel, category: categories, adapter: { type: 'BigBedAdapter', @@ -279,7 +277,7 @@ function makeTrackConfig( return { type: 'VariantTrack', name, - description: track.get('longLabel'), + description: track.data.longLabel, category: categories, adapter: { type: 'VcfTabixAdapter', @@ -296,7 +294,7 @@ function makeTrackConfig( return { type: 'HicTrack', name, - description: track.get('longLabel'), + description: track.data.longLabel, category: categories, adapter: { type: 'HicAdapter', diff --git a/test_data/volvox/config.json b/test_data/volvox/config.json index 0d93cea6a9..a0764eb96b 100644 --- a/test_data/volvox/config.json +++ b/test_data/volvox/config.json @@ -2170,6 +2170,33 @@ "displayId": "volvox_bedpe-LinearPairedArcDisplay" } ] + }, + { + "type": "AlignmentsTrack", + "trackId": "volvox-sorted", + "name": "volvox-sorted", + "adapter": { + "type": "BamAdapter", + "bamLocation": { + "uri": "volvox-sorted.bam", + "locationType": "UriLocation" + }, + "index": { + "location": { + "uri": "volvox-sorted.bam.bai", + "locationType": "UriLocation" + }, + "indexType": "BAI" + }, + "sequenceAdapter": { + "type": "TwoBitAdapter", + "twoBitLocation": { + "uri": "volvox.2bit", + "locationType": "UriLocation" + } + } + }, + "assemblyNames": ["volvox"] } ], "plugins": [ diff --git a/test_data/volvoxhub/config.json b/test_data/volvoxhub/config.json index 04583515a4..836ed1d860 100644 --- a/test_data/volvoxhub/config.json +++ b/test_data/volvoxhub/config.json @@ -66,6 +66,15 @@ "locationType": "UriLocation" } }, + { + "type": "UCSCTrackHubConnection", + "connectionId": "UCSCTrackHubConnection-volvox-hub3", + "name": "UCSCTrackHubConnection-volvox-hub3", + "hubTxtLocation": { + "uri": "singlefile.hub.txt", + "locationType": "UriLocation" + } + }, { "type": "UCSCTrackHubConnection", "connectionId": "UCSCTrackHubConnection-volvox-hub2", diff --git a/test_data/volvoxhub/singlefile.hub.txt b/test_data/volvoxhub/singlefile.hub.txt new file mode 100644 index 0000000000..bc359e5123 --- /dev/null +++ b/test_data/volvoxhub/singlefile.hub.txt @@ -0,0 +1,252 @@ +hub GCF_000002985.6 genome assembly +shortLabel roundworm +longLabel roundworm/Caenorhabditis elegans/GCF_000002985.6_WBcel235 genome assembly +useOneFile on +email hclawson@ucsc.edu +descriptionUrl html/GCF_000002985.6_WBcel235.description.html + +genome GCF_000002985.6 +taxId 6239 +groups groups.txt +description roundworm +twoBitPath GCF_000002985.6.2bit +twoBitBptUrl GCF_000002985.6.2bit.bpt +chromSizes GCF_000002985.6.chrom.sizes.txt +chromAliasBb GCF_000002985.6.chromAlias.bb +chromAuthority ucsc +organism WBcel235 Feb. 2013 +defaultPos NC_003283.11:6974726-6984726 +scientificName Caenorhabditis elegans +htmlPath html/GCF_000002985.6_WBcel235.description.html +blat dynablat-01.soe.ucsc.edu 4040 dynamic GCF/000/002/985/GCF_000002985.6 +transBlat dynablat-01.soe.ucsc.edu 4040 dynamic GCF/000/002/985/GCF_000002985.6 +isPcr dynablat-01.soe.ucsc.edu 4040 dynamic GCF/000/002/985/GCF_000002985.6 + +track assembly +longLabel Assembly +shortLabel Assembly +visibility pack +colorByStrand 150,100,30 230,170,40 +color 150,100,30 +altColor 230,170,40 +bigDataUrl bbi/GCF_000002985.6_WBcel235.assembly.bb +type bigBed 6 +html html/GCF_000002985.6_WBcel235.assembly +searchIndex name +searchTrix ixIxx/GCF_000002985.6_WBcel235.assembly.ix +url https://www.ncbi.nlm.nih.gov/nuccore/$$ +urlLabel NCBI Nucleotide database: +group map + +track cytoBandIdeo +shortLabel Chromosome Band (Ideogram) +longLabel Ideogram for Orientation +group map +visibility dense +type bigBed 4 + +bigDataUrl bbi/GCF_000002985.6_WBcel235.cytoBand.bb + +track gc5Base +shortLabel GC Percent +longLabel GC Percent in 5-Base Windows +group map +visibility full +autoScale Off +maxHeightPixels 128:36:16 +graphTypeDefault Bar +gridDefault OFF +windowingFunction Mean +color 0,0,0 +altColor 128,128,128 +viewLimits 30:70 +type bigWig 0 100 +bigDataUrl bbi/GCF_000002985.6_WBcel235.gc5Base.bw +html html/GCF_000002985.6_WBcel235.gc5Base + +track tanDups +shortLabel Tandem Dups +longLabel Paired identical sequences +compositeTrack on +visibility hide +type bigBed 12 +group map +html html/GCF_000002985.6_WBcel235.tanDups + + track tandemDups + parent tanDups on + shortLabel Tandem Dups + longLabel Paired exactly identical sequence survey over entire genome assembly + bigDataUrl bbi/GCF_000002985.6_WBcel235.tandemDups.bb + type bigBed 12 + +track repeatMasker +shortLabel RepeatMasker +longLabel RepeatMasker Repetitive Elements +type bigRmsk 9 + +visibility pack +group varRep +bigDataUrl bbi/GCF_000002985.6_WBcel235.rmsk.bb +maxWindowToDraw 5000000 +html html/GCF_000002985.6_WBcel235.repeatMasker + +track simpleRepeat +shortLabel Simple Repeats +longLabel Simple Tandem Repeats by TRF +group varRep +visibility dense +type bigBed 4 + +bigDataUrl bbi/GCF_000002985.6_WBcel235.simpleRepeat.bb +html html/GCF_000002985.6_WBcel235.simpleRepeat + +track refSeqComposite +compositeTrack on +shortLabel NCBI RefSeq +longLabel RefSeq gene predictions from NCBI +group genes +visibility pack +type bigBed +dragAndDrop subTracks +allButtonPair on +dataVersion WormBase WS277 (2020-05-29) +html html/GCF_000002985.6_WBcel235.refSeqComposite +priority 2 + + track ncbiRefSeq + parent refSeqComposite on + color 12,12,120 + altColor 120,12,12 + shortLabel RefSeq All + type bigGenePred + labelFields name,geneName,geneName2 + defaultLabelFields geneName2 + searchIndex name + searchTrix ixIxx/GCF_000002985.6_WBcel235.ncbiRefSeq.ix + bigDataUrl bbi/GCF_000002985.6_WBcel235.ncbiRefSeq.bb + longLabel NCBI RefSeq genes, curated and predicted sets (NM_*, XM_*, NR_*, XR_*, NP_* or YP_*) + idXref ncbiRefSeqLink mrnaAcc name + baseColorUseCds given + baseColorDefault genomicCodons + priority 1 + + track ncbiRefSeqCurated + color 12,12,120 + parent refSeqComposite on + shortLabel RefSeq Curated + longLabel NCBI RefSeq genes, curated subset (NM_*, NR_*, NP_* or YP_*) + type bigGenePred + labelFields name,geneName,geneName2 + defaultLabelFields geneName2 + searchIndex name + searchTrix ixIxx/GCF_000002985.6_WBcel235.ncbiRefSeqCurated.ix + idXref ncbiRefSeqLink mrnaAcc name + bigDataUrl bbi/GCF_000002985.6_WBcel235.ncbiRefSeqCurated.bb + baseColorUseCds given + baseColorDefault genomicCodons + priority 2 + + track ncbiRefSeqOther + color 32,32,32 + parent refSeqComposite on + shortLabel RefSeq Other + longLabel NCBI RefSeq other annotations (not NM_*, NR_*, XM_*, XR_*, NP_* or YP_*) + priority 4 + searchIndex name + searchTrix ixIxx/GCF_000002985.6_WBcel235.ncbiRefSeqOther.ix + bigDataUrl bbi/GCF_000002985.6_WBcel235.ncbiRefSeqOther.bb + type bigBed 12 + + labelFields name + skipEmptyFields on + urls GeneID="https://www.ncbi.nlm.nih.gov/gene/$$" MIM="https://www.ncbi.nlm.nih.gov/omim/$$" HGNC="http://www.genenames.org/cgi-bin/gene_symbol_report?hgnc_id=$$" FlyBase="http://flybase.org/reports/$$" WormBase="http://www.wormbase.org/db/gene/gene?name=$$" RGD="https://rgd.mcw.edu/rgdweb/search/search.html?term=$$" SGD="https://www.yeastgenome.org/locus/$$" miRBase="http://www.mirbase.org/cgi-bin/mirna_entry.pl?acc=$$" ZFIN="https://zfin.org/$$" MGI="http://www.informatics.jax.org/marker/$$" + + track ncbiRefSeqPsl + priority 5 + parent refSeqComposite off + shortLabel RefSeq Alignments + longLabel RefSeq Alignments of RNAs + type bigPsl + searchIndex name + bigDataUrl bbi/GCF_000002985.6_WBcel235.bigPsl.bb + indelDoubleInsert on + indelQueryInsert on + showDiffBasesAllScales . + showDiffBasesMaxZoom 10000.0 + showCdsMaxZoom 10000.0 + showCdsAllScales . + baseColorDefault diffCodons + pslSequence no + baseColorUseSequence lfExtra + baseColorUseCds table given + color 0,0,0 + +track cpgIslands +compositeTrack on +shortLabel CpG Islands +longLabel CpG Islands (Islands < 300 Bases are Light Green) +group regulation +visibility pack +type bigBed 4 + +html html/GCF_000002985.6_WBcel235.cpgIslands + + track cpgIslandExt + parent cpgIslands off + shortLabel CpG Islands + longLabel CpG Islands (Islands < 300 Bases are Light Green) + type bigBed 4 + + priority 1 + bigDataUrl bbi/GCF_000002985.6_WBcel235.cpgIslandExt.bb + + track cpgIslandExtUnmasked + parent cpgIslands on + shortLabel Unmasked CpG + longLabel CpG Islands on All Sequence (Islands < 300 Bases are Light Green) + type bigBed 4 + + priority 2 + bigDataUrl bbi/GCF_000002985.6_WBcel235.cpgIslandExtUnmasked.bb + +track windowMasker +shortLabel WM + SDust +longLabel Genomic Intervals Masked by WindowMasker + SDust +group varRep +visibility dense +type bigBed 3 +bigDataUrl bbi/GCF_000002985.6_WBcel235.windowMasker.bb +html html/GCF_000002985.6_WBcel235.windowMasker + +track augustus +shortLabel Augustus +longLabel Augustus Gene Predictions +group genes +visibility dense +color 180,0,0 +type bigGenePred +bigDataUrl bbi/GCF_000002985.6_WBcel235.augustus.bb +html html/GCF_000002985.6_WBcel235.augustus + +track xenoRefGene +shortLabel RefSeq mRNAs +longLabel RefSeq mRNAs mapped to this assembly +group rna +visibility pack +color 180,0,0 +type bigGenePred +bigDataUrl bbi/GCF_000002985.6_WBcel235.xenoRefGene.bb +url https://www.ncbi.nlm.nih.gov/nuccore/$$ +urlLabel NCBI Nucleotide database: +labelFields name,geneName,geneName2 +defaultLabelFields geneName +searchIndex name +searchTrix ixIxx/GCF_000002985.6_WBcel235.xenoRefGene.ix +html html/GCF_000002985.6_WBcel235.xenoRefGene + +track ensGene +shortLabel Ensembl genes +longLabel Ensembl genes version 103/Feb. 2021 +group genes +priority 40 +visibility pack +color 150,0,0 +type bigBed 12 . +bigDataUrl bbi/GCF_000002985.6_WBcel235.ensGene.bb +searchIndex name +searchTrix ixIxx/GCF_000002985.6_WBcel235.ensGene.ix +html html/GCF_000002985.6_WBcel235.ensGene From 0e514af5a0859ae42b4249d9a11ef53820b0f6a4 Mon Sep 17 00:00:00 2001 From: Colin Date: Tue, 21 Nov 2023 17:28:25 -0500 Subject: [PATCH 2/6] [skip ci] Misc --- .../src/ucsc-trackhub/doConnect.ts | 137 ++++++++++ .../src/ucsc-trackhub/model.ts | 92 +------ .../src/ucsc-trackhub/ucscTrackHub.ts | 64 ++--- .../bbi/volvox-sorted.bam.coverage.bw | Bin 0 -> 213750 bytes test_data/volvoxhub/bbi/volvox.bb | Bin 0 -> 27003 bytes test_data/volvoxhub/config.json | 13 +- .../volvoxhub/html/volvox.description.html | 7 + test_data/volvoxhub/singlefile.hub.txt | 252 ------------------ test_data/volvoxhub/singlefile.volvox.hub.txt | 34 +++ 9 files changed, 222 insertions(+), 377 deletions(-) create mode 100644 plugins/data-management/src/ucsc-trackhub/doConnect.ts create mode 100644 test_data/volvoxhub/bbi/volvox-sorted.bam.coverage.bw create mode 100644 test_data/volvoxhub/bbi/volvox.bb create mode 100644 test_data/volvoxhub/html/volvox.description.html delete mode 100644 test_data/volvoxhub/singlefile.hub.txt create mode 100644 test_data/volvoxhub/singlefile.volvox.hub.txt diff --git a/plugins/data-management/src/ucsc-trackhub/doConnect.ts b/plugins/data-management/src/ucsc-trackhub/doConnect.ts new file mode 100644 index 0000000000..1c9c188c78 --- /dev/null +++ b/plugins/data-management/src/ucsc-trackhub/doConnect.ts @@ -0,0 +1,137 @@ +import { HubFile, SingleFileHub } from '@gmod/ucsc-hub' +import { + generateTracks, + fetchGenomesFile, + fetchTrackDbFile, +} from './ucscTrackHub' + +import { getConf } from '@jbrowse/core/configuration' +import { FileLocation, getSession } from '@jbrowse/core/util' +import { openLocation } from '@jbrowse/core/util/io' +import { nanoid } from '@jbrowse/core/util/nanoid' + +function resolve(uri: string, baseUri: string) { + return new URL(uri, baseUri).href +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export async function doConnect(self: any) { + const session = getSession(self) + const notLoadedAssemblies = [] as string[] + try { + const hubFileLocation = getConf(self, 'hubTxtLocation') as FileLocation + const hubFileText = await openLocation(hubFileLocation).readFile('utf8') + const hubUri = resolve(hubFileLocation.uri, hubFileLocation.baseUri) + const { assemblyManager } = session + if (hubFileText.includes('useOneFile on')) { + const hub = new SingleFileHub(hubFileText) + const { genome, tracks } = hub + const genomeName = genome.name! + + const asm = assemblyManager.get(genomeName) + if (!asm) { + // @ts-expect-error + session.addAssemblyConf({ + name: genomeName, + sequence: { + type: 'ReferenceSequenceTrack', + trackId: `${genomeName}-${nanoid()}`, + adapter: { + type: 'TwoBitAdapter', + twoBitLocation: { + uri: resolve(genome.data.twoBitPath, hubUri), + }, + chromSizesLocation: { + uri: resolve(genome.data.chromSizes, hubUri), + }, + }, + }, + }) + } + const asm2 = assemblyManager.get(genomeName) + const sequenceAdapter = getConf(asm2!, ['sequence', 'adapter']) + const tracksNew = generateTracks({ + trackDb: tracks, + trackDbLoc: hubFileLocation, + assemblyName: genomeName, + sequenceAdapter, + }) + self.addTrackConfs(tracksNew) + } else { + const hubFile = new HubFile(hubFileText) + const genomeFile = hubFile.data.genomesFile + if (!genomeFile) { + throw new Error('genomesFile not found on hub') + } + + // @ts-expect-error + const hubUri = resolve(hubFileLocation.uri, hubFileLocation.baseUri) + const genomesFileLocation = hubUri + ? { + uri: resolve(genomeFile, hubUri), + locationType: 'UriLocation' as const, + } + : { + localPath: genomeFile, + locationType: 'LocalPathLocation' as const, + } + const genomesFile = await fetchGenomesFile(genomesFileLocation) + const map = {} as Record + for (const [genomeName, genome] of Object.entries(genomesFile.data)) { + const assemblyNames = getConf(self, 'assemblyNames') + if (assemblyNames.length > 0 && !assemblyNames.includes(genomeName)) { + continue + } + + const asm = assemblyManager.get(genomeName) + if (!asm) { + notLoadedAssemblies.push(genomeName) + continue + } + + // @ts-expect-error + const db = genome.data.trackDb + if (!db) { + throw new Error('genomesFile not found on hub') + } + const base = new URL(genomeFile, hubUri) + const loc = hubUri + ? { + uri: new URL(db, base).href, + locationType: 'UriLocation' as const, + } + : { + localPath: db, + locationType: 'LocalPathLocation' as const, + } + const trackDb = await fetchTrackDbFile(loc) + const sequenceAdapter = getConf(asm, ['sequence', 'adapter']) + const tracks = generateTracks({ + trackDb, + trackDbLoc: loc, + assemblyName: genomeName, + sequenceAdapter, + }) + self.addTrackConfs(tracks) + map[genomeName] = tracks.length + } + + const loadedAssemblies = Object.entries(map) + const str1 = loadedAssemblies.length + ? `Loaded data from these assemblies: ${loadedAssemblies + .map(([key, val]) => `${key} (${val} tracks)`) + .join(', ')}` + : '' + const str2 = notLoadedAssemblies.length + ? `Skipped data from these assemblies: ${notLoadedAssemblies.join( + ', ', + )}` + : '' + session.notify([str1, str2].filter(f => !!f).join('. '), 'success') + } + } catch (e) { + console.error(e) + session.notify(`${getConf(self, 'name')}: "${e}"`, 'error') + session.breakConnection?.(self.configuration) + } +} diff --git a/plugins/data-management/src/ucsc-trackhub/model.ts b/plugins/data-management/src/ucsc-trackhub/model.ts index 4681be9e95..b7cb1d047f 100644 --- a/plugins/data-management/src/ucsc-trackhub/model.ts +++ b/plugins/data-management/src/ucsc-trackhub/model.ts @@ -1,11 +1,6 @@ import PluginManager from '@jbrowse/core/PluginManager' import { BaseConnectionModelFactory } from '@jbrowse/core/pluggableElementTypes/models' -import { - ConfigurationReference, - readConfObject, - getConf, -} from '@jbrowse/core/configuration' -import { getSession } from '@jbrowse/core/util' +import { ConfigurationReference } from '@jbrowse/core/configuration' import { types } from 'mobx-state-tree' // locals @@ -23,89 +18,10 @@ export default function UCSCTrackHubConnection(pluginManager: PluginManager) { ) .actions(self => ({ async connect() { - const session = getSession(self) - const notLoadedAssemblies = [] as string[] - try { - const hubFileLocation = getConf(self, 'hubTxtLocation') - const { - generateTracks, - fetchGenomesFile, - fetchTrackDbFile, - fetchHubFile, - } = await import('./ucscTrackHub') - const hubFile = await fetchHubFile(hubFileLocation) - const genomeFile = hubFile.data.genomesFile - if (!genomeFile) { - throw new Error('genomesFile not found on hub') - } + const { doConnect } = await import('./doConnect') - const hubUri = new URL(hubFileLocation.uri, hubFileLocation.baseUri) - const genomesFileLocation = hubUri - ? { - uri: new URL(genomeFile, hubUri).href, - locationType: 'UriLocation' as const, - } - : { - localPath: genomeFile, - locationType: 'LocalPathLocation' as const, - } - const genomesFile = await fetchGenomesFile(genomesFileLocation) - const map = {} as Record - for (const [genomeName, genome] of Object.entries(genomesFile)) { - const assemblyNames = getConf(self, 'assemblyNames') - if ( - assemblyNames.length > 0 && - !assemblyNames.includes(genomeName) - ) { - continue - } - - const conf = session.assemblyManager.get(genomeName)?.configuration - if (!conf) { - notLoadedAssemblies.push(genomeName) - continue - } - const db = genome.get('trackDb') - if (!db) { - throw new Error('genomesFile not found on hub') - } - const base = new URL(genomeFile, hubUri) - const loc = hubUri - ? { - uri: new URL(db, base).href, - locationType: 'UriLocation' as const, - } - : { - localPath: db, - locationType: 'LocalPathLocation' as const, - } - const trackDb = await fetchTrackDbFile(loc) - const seqAdapter = readConfObject(conf, ['sequence', 'adapter']) - const tracks = generateTracks(trackDb, loc, genomeName, seqAdapter) - self.addTrackConfs(tracks) - map[genomeName] = tracks.length - } - - const loadedAssemblies = Object.entries(map) - const str1 = loadedAssemblies.length - ? `Loaded data from these assemblies: ${loadedAssemblies - .map(([key, val]) => `${key} (${val} tracks)`) - .join(', ')}` - : '' - const str2 = notLoadedAssemblies.length - ? `Skipped data from these assemblies: ${notLoadedAssemblies.join( - ', ', - )}` - : '' - session.notify([str1, str2].filter(f => !!f).join('. '), 'success') - } catch (e) { - console.error(e) - session.notify( - `There was a problem connecting to the UCSC Track Hub "${self.configuration.name}". Please make sure you have entered a valid hub.txt file. The error that was thrown is: "${e}"`, - 'error', - ) - session.breakConnection?.(self.configuration) - } + // eslint-disable-next-line @typescript-eslint/no-floating-promises + doConnect(self) }, })) } diff --git a/plugins/data-management/src/ucsc-trackhub/ucscTrackHub.ts b/plugins/data-management/src/ucsc-trackhub/ucscTrackHub.ts index e9bab02eda..8eca3c231c 100644 --- a/plugins/data-management/src/ucsc-trackhub/ucscTrackHub.ts +++ b/plugins/data-management/src/ucsc-trackhub/ucscTrackHub.ts @@ -1,37 +1,28 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { RaStanza, TrackDbFile } from '@gmod/ucsc-hub' import { FileLocation, isUriLocation, objectHash } from '@jbrowse/core/util' import { openLocation } from '@jbrowse/core/util/io' import { generateUnsupportedTrackConf, generateUnknownTrackConf, } from '@jbrowse/core/util/tracks' - -export async function fetchHubFile(hubLocation: FileLocation) { - try { - const hubFileText = await openLocation(hubLocation).readFile('utf8') - const { HubFile } = await import('@gmod/ucsc-hub') - return new HubFile(hubFileText) - } catch (error) { - throw new Error(`Not a valid hub.txt file, got error: '${error}'`) - } -} +import { RaStanza, GenomesFile, TrackDbFile } from '@gmod/ucsc-hub' export async function fetchGenomesFile(genomesLoc: FileLocation) { const genomesFileText = await openLocation(genomesLoc).readFile('utf8') - const { GenomesFile } = await import('@gmod/ucsc-hub') return new GenomesFile(genomesFileText) } export async function fetchTrackDbFile(trackDbLoc: FileLocation) { const text = await openLocation(trackDbLoc).readFile('utf8') - const { TrackDbFile } = await import('@gmod/ucsc-hub') return new TrackDbFile(text) } -export function makeLoc(first: string, base: { uri: string }) { +export function makeLoc( + first: string, + base: { uri: string; baseUri?: string }, +) { return { - uri: new URL(first, base.uri).href, + uri: new URL(first, new URL(base.uri, base.baseUri)).href, locationType: 'UriLocation', } } @@ -52,12 +43,17 @@ export function makeLoc2(first: string, alt?: string) { } } -export function generateTracks( - trackDb: TrackDbFile, - trackDbLoc: FileLocation, - assemblyName: string, - sequenceAdapter: any, -) { +export function generateTracks({ + trackDb, + trackDbLoc, + assemblyName, + sequenceAdapter, +}: { + trackDb: TrackDbFile + trackDbLoc: FileLocation + assemblyName: string + sequenceAdapter: any +}) { const tracks: any = [] for (const [trackName, track] of Object.entries(trackDb.data)) { @@ -84,13 +80,13 @@ export function generateTracks( const categories = parentTracks .map(p => p?.data.shortLabel) .filter((f): f is string => !!f) - const res = makeTrackConfig( - track!, + const res = makeTrackConfig({ + track: track!, categories, trackDbLoc, trackDb, sequenceAdapter, - ) + }) tracks.push({ ...res, trackId: `ucsc-trackhub-${objectHash(res)}`, @@ -101,13 +97,19 @@ export function generateTracks( return tracks } -function makeTrackConfig( - track: RaStanza, - categories: string[], - trackDbLoc: FileLocation, - trackDb: TrackDbFile, - sequenceAdapter: any, -) { +function makeTrackConfig({ + track, + categories, + trackDbLoc, + trackDb, + sequenceAdapter, +}: { + track: RaStanza + categories: string[] + trackDbLoc: FileLocation + trackDb: TrackDbFile + sequenceAdapter: any +}) { const trackType = track.data.type || trackDb.data[track.data.parent || '']?.data.type || '' const name = track.data.shortLabel || '' diff --git a/test_data/volvoxhub/bbi/volvox-sorted.bam.coverage.bw b/test_data/volvoxhub/bbi/volvox-sorted.bam.coverage.bw new file mode 100644 index 0000000000000000000000000000000000000000..c6ca75740fb3b062a26fc432c2cd1aaea33f2e63 GIT binary patch literal 213750 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 H$6ov&VhRCt literal 0 HcmV?d00001 diff --git a/test_data/volvoxhub/bbi/volvox.bb b/test_data/volvoxhub/bbi/volvox.bb new file mode 100644 index 0000000000000000000000000000000000000000..08839236f48729781293c87938f3ad0a3f9d1642 GIT binary patch literal 27003 zcmeI*UuYaf90%~pzgl7qX>BdRTBk>75=+8f60{|XmtM{!l%(d5QB$M0x3_n<_U`t& zyO$>MPr=%%7;Oc$Etb|7iME3JkRrr~*kBQh8Wl956>13*X{{mn5LCpO+1=jdszo1s z2z&>!GqdyC*`3c$HV?yYF3rF2Tp`IPTZ@QDhLdktX4hAe6-3Ij%V!GhocIX2;*|HT zv-kC_xAXU%e6?ZMFW+hBYwxo2rM|V~P+X-^HL2)fwb;`fX!mb#3h*7O=_#g^R`QK$ z8Co(*m6)L?8d#ktPp2AD4R)YPO?6jV6hwe->Is$V1~nBq64B#f(N9`STI?th(Phbo z#rpAx0!`_rW@&noYDv3Y^l;5lfn->m+rtXiJI1-#q?}OQYo(rcR-<}^YL=R)$#iWh zx{-V_HI49Liv5{Bt(d0lbcg7Uk)3*X zjB(MhW~SouAT?upIv%DWm5O*;X>t_GZiAk*&nv`4qdRgchW>B5(o@&;WT>WU^sBZZ z^*mszVJe#fq%#`gMb>exB-K}Yz16j~Vm$nwh2pxh)32wK{Eji9_H-ho8a!CE*t3KM z?#Kl8*-c&AkZLwik6%wDWHw1svLRdStZ~h>t{zWK9_5~GQ74(X!h2afS4?WCaoN)P znV+6Dt3*f64B(TvHB9ZxZe|tQ+LYVQ=LHY&h;}|_vLh0z71Ld@Zg%@k#n4g~wFXm* z;`o`iYI--@&8}2*#j3ecmKzJ_P zczNLHQ!kH|oR(Guej$6K8zZ-rcZMt4{Pz|1O_!BTm7ZAW{qxy1BONE_UVZD_Z**`+dnmXf7|HVo2SdZ4E3qcacwrrdD;!1&KYCr;O0!QjEL96UTS zK0bNJ1j#S)&5XY}`t?gcSfdRsq?btICxsY7>mAf3lyLOYi)bM1G5O@8VEoqCCyBxt|WM_>!Yaz!D#ufq) zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwx`B`3gNOvo%pyxkfME(G&ur245kY4c_& zcK0qNb?jmZX}+!Kb9b4+eXD_wHG7%i>g#ORS!S4XUVW=ra!|Nn2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00eRc_y?i*N05qHLn-@lznbU9<*_}1ra*g*m+#5_Hj-$m z{l}KNziTm)a&==W6<6zWd*jha5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< N0{_3jCH8NZ{sQ-&-%J1i literal 0 HcmV?d00001 diff --git a/test_data/volvoxhub/config.json b/test_data/volvoxhub/config.json index 836ed1d860..02e6baa927 100644 --- a/test_data/volvoxhub/config.json +++ b/test_data/volvoxhub/config.json @@ -66,21 +66,22 @@ "locationType": "UriLocation" } }, + { "type": "UCSCTrackHubConnection", - "connectionId": "UCSCTrackHubConnection-volvox-hub3", - "name": "UCSCTrackHubConnection-volvox-hub3", + "connectionId": "UCSCTrackHubConnection-volvox-hub2", + "name": "UCSCTrackHubConnection-volvox-hub2", "hubTxtLocation": { - "uri": "singlefile.hub.txt", + "uri": "hub2/hub.txt", "locationType": "UriLocation" } }, { "type": "UCSCTrackHubConnection", - "connectionId": "UCSCTrackHubConnection-volvox-hub2", - "name": "UCSCTrackHubConnection-volvox-hub2", + "connectionId": "UCSCTrackHubConnection-volvox-singlefilehub", + "name": "UCSCTrackHubConnection-volvox-singlefilehub", "hubTxtLocation": { - "uri": "hub2/hub.txt", + "uri": "singlefile.volvox.hub.txt", "locationType": "UriLocation" } }, diff --git a/test_data/volvoxhub/html/volvox.description.html b/test_data/volvoxhub/html/volvox.description.html new file mode 100644 index 0000000000..1c7892fd93 --- /dev/null +++ b/test_data/volvoxhub/html/volvox.description.html @@ -0,0 +1,7 @@ + + + +

Hello world!

+

Volvox single file trackhub

+ + diff --git a/test_data/volvoxhub/singlefile.hub.txt b/test_data/volvoxhub/singlefile.hub.txt deleted file mode 100644 index bc359e5123..0000000000 --- a/test_data/volvoxhub/singlefile.hub.txt +++ /dev/null @@ -1,252 +0,0 @@ -hub GCF_000002985.6 genome assembly -shortLabel roundworm -longLabel roundworm/Caenorhabditis elegans/GCF_000002985.6_WBcel235 genome assembly -useOneFile on -email hclawson@ucsc.edu -descriptionUrl html/GCF_000002985.6_WBcel235.description.html - -genome GCF_000002985.6 -taxId 6239 -groups groups.txt -description roundworm -twoBitPath GCF_000002985.6.2bit -twoBitBptUrl GCF_000002985.6.2bit.bpt -chromSizes GCF_000002985.6.chrom.sizes.txt -chromAliasBb GCF_000002985.6.chromAlias.bb -chromAuthority ucsc -organism WBcel235 Feb. 2013 -defaultPos NC_003283.11:6974726-6984726 -scientificName Caenorhabditis elegans -htmlPath html/GCF_000002985.6_WBcel235.description.html -blat dynablat-01.soe.ucsc.edu 4040 dynamic GCF/000/002/985/GCF_000002985.6 -transBlat dynablat-01.soe.ucsc.edu 4040 dynamic GCF/000/002/985/GCF_000002985.6 -isPcr dynablat-01.soe.ucsc.edu 4040 dynamic GCF/000/002/985/GCF_000002985.6 - -track assembly -longLabel Assembly -shortLabel Assembly -visibility pack -colorByStrand 150,100,30 230,170,40 -color 150,100,30 -altColor 230,170,40 -bigDataUrl bbi/GCF_000002985.6_WBcel235.assembly.bb -type bigBed 6 -html html/GCF_000002985.6_WBcel235.assembly -searchIndex name -searchTrix ixIxx/GCF_000002985.6_WBcel235.assembly.ix -url https://www.ncbi.nlm.nih.gov/nuccore/$$ -urlLabel NCBI Nucleotide database: -group map - -track cytoBandIdeo -shortLabel Chromosome Band (Ideogram) -longLabel Ideogram for Orientation -group map -visibility dense -type bigBed 4 + -bigDataUrl bbi/GCF_000002985.6_WBcel235.cytoBand.bb - -track gc5Base -shortLabel GC Percent -longLabel GC Percent in 5-Base Windows -group map -visibility full -autoScale Off -maxHeightPixels 128:36:16 -graphTypeDefault Bar -gridDefault OFF -windowingFunction Mean -color 0,0,0 -altColor 128,128,128 -viewLimits 30:70 -type bigWig 0 100 -bigDataUrl bbi/GCF_000002985.6_WBcel235.gc5Base.bw -html html/GCF_000002985.6_WBcel235.gc5Base - -track tanDups -shortLabel Tandem Dups -longLabel Paired identical sequences -compositeTrack on -visibility hide -type bigBed 12 -group map -html html/GCF_000002985.6_WBcel235.tanDups - - track tandemDups - parent tanDups on - shortLabel Tandem Dups - longLabel Paired exactly identical sequence survey over entire genome assembly - bigDataUrl bbi/GCF_000002985.6_WBcel235.tandemDups.bb - type bigBed 12 - -track repeatMasker -shortLabel RepeatMasker -longLabel RepeatMasker Repetitive Elements -type bigRmsk 9 + -visibility pack -group varRep -bigDataUrl bbi/GCF_000002985.6_WBcel235.rmsk.bb -maxWindowToDraw 5000000 -html html/GCF_000002985.6_WBcel235.repeatMasker - -track simpleRepeat -shortLabel Simple Repeats -longLabel Simple Tandem Repeats by TRF -group varRep -visibility dense -type bigBed 4 + -bigDataUrl bbi/GCF_000002985.6_WBcel235.simpleRepeat.bb -html html/GCF_000002985.6_WBcel235.simpleRepeat - -track refSeqComposite -compositeTrack on -shortLabel NCBI RefSeq -longLabel RefSeq gene predictions from NCBI -group genes -visibility pack -type bigBed -dragAndDrop subTracks -allButtonPair on -dataVersion WormBase WS277 (2020-05-29) -html html/GCF_000002985.6_WBcel235.refSeqComposite -priority 2 - - track ncbiRefSeq - parent refSeqComposite on - color 12,12,120 - altColor 120,12,12 - shortLabel RefSeq All - type bigGenePred - labelFields name,geneName,geneName2 - defaultLabelFields geneName2 - searchIndex name - searchTrix ixIxx/GCF_000002985.6_WBcel235.ncbiRefSeq.ix - bigDataUrl bbi/GCF_000002985.6_WBcel235.ncbiRefSeq.bb - longLabel NCBI RefSeq genes, curated and predicted sets (NM_*, XM_*, NR_*, XR_*, NP_* or YP_*) - idXref ncbiRefSeqLink mrnaAcc name - baseColorUseCds given - baseColorDefault genomicCodons - priority 1 - - track ncbiRefSeqCurated - color 12,12,120 - parent refSeqComposite on - shortLabel RefSeq Curated - longLabel NCBI RefSeq genes, curated subset (NM_*, NR_*, NP_* or YP_*) - type bigGenePred - labelFields name,geneName,geneName2 - defaultLabelFields geneName2 - searchIndex name - searchTrix ixIxx/GCF_000002985.6_WBcel235.ncbiRefSeqCurated.ix - idXref ncbiRefSeqLink mrnaAcc name - bigDataUrl bbi/GCF_000002985.6_WBcel235.ncbiRefSeqCurated.bb - baseColorUseCds given - baseColorDefault genomicCodons - priority 2 - - track ncbiRefSeqOther - color 32,32,32 - parent refSeqComposite on - shortLabel RefSeq Other - longLabel NCBI RefSeq other annotations (not NM_*, NR_*, XM_*, XR_*, NP_* or YP_*) - priority 4 - searchIndex name - searchTrix ixIxx/GCF_000002985.6_WBcel235.ncbiRefSeqOther.ix - bigDataUrl bbi/GCF_000002985.6_WBcel235.ncbiRefSeqOther.bb - type bigBed 12 + - labelFields name - skipEmptyFields on - urls GeneID="https://www.ncbi.nlm.nih.gov/gene/$$" MIM="https://www.ncbi.nlm.nih.gov/omim/$$" HGNC="http://www.genenames.org/cgi-bin/gene_symbol_report?hgnc_id=$$" FlyBase="http://flybase.org/reports/$$" WormBase="http://www.wormbase.org/db/gene/gene?name=$$" RGD="https://rgd.mcw.edu/rgdweb/search/search.html?term=$$" SGD="https://www.yeastgenome.org/locus/$$" miRBase="http://www.mirbase.org/cgi-bin/mirna_entry.pl?acc=$$" ZFIN="https://zfin.org/$$" MGI="http://www.informatics.jax.org/marker/$$" - - track ncbiRefSeqPsl - priority 5 - parent refSeqComposite off - shortLabel RefSeq Alignments - longLabel RefSeq Alignments of RNAs - type bigPsl - searchIndex name - bigDataUrl bbi/GCF_000002985.6_WBcel235.bigPsl.bb - indelDoubleInsert on - indelQueryInsert on - showDiffBasesAllScales . - showDiffBasesMaxZoom 10000.0 - showCdsMaxZoom 10000.0 - showCdsAllScales . - baseColorDefault diffCodons - pslSequence no - baseColorUseSequence lfExtra - baseColorUseCds table given - color 0,0,0 - -track cpgIslands -compositeTrack on -shortLabel CpG Islands -longLabel CpG Islands (Islands < 300 Bases are Light Green) -group regulation -visibility pack -type bigBed 4 + -html html/GCF_000002985.6_WBcel235.cpgIslands - - track cpgIslandExt - parent cpgIslands off - shortLabel CpG Islands - longLabel CpG Islands (Islands < 300 Bases are Light Green) - type bigBed 4 + - priority 1 - bigDataUrl bbi/GCF_000002985.6_WBcel235.cpgIslandExt.bb - - track cpgIslandExtUnmasked - parent cpgIslands on - shortLabel Unmasked CpG - longLabel CpG Islands on All Sequence (Islands < 300 Bases are Light Green) - type bigBed 4 + - priority 2 - bigDataUrl bbi/GCF_000002985.6_WBcel235.cpgIslandExtUnmasked.bb - -track windowMasker -shortLabel WM + SDust -longLabel Genomic Intervals Masked by WindowMasker + SDust -group varRep -visibility dense -type bigBed 3 -bigDataUrl bbi/GCF_000002985.6_WBcel235.windowMasker.bb -html html/GCF_000002985.6_WBcel235.windowMasker - -track augustus -shortLabel Augustus -longLabel Augustus Gene Predictions -group genes -visibility dense -color 180,0,0 -type bigGenePred -bigDataUrl bbi/GCF_000002985.6_WBcel235.augustus.bb -html html/GCF_000002985.6_WBcel235.augustus - -track xenoRefGene -shortLabel RefSeq mRNAs -longLabel RefSeq mRNAs mapped to this assembly -group rna -visibility pack -color 180,0,0 -type bigGenePred -bigDataUrl bbi/GCF_000002985.6_WBcel235.xenoRefGene.bb -url https://www.ncbi.nlm.nih.gov/nuccore/$$ -urlLabel NCBI Nucleotide database: -labelFields name,geneName,geneName2 -defaultLabelFields geneName -searchIndex name -searchTrix ixIxx/GCF_000002985.6_WBcel235.xenoRefGene.ix -html html/GCF_000002985.6_WBcel235.xenoRefGene - -track ensGene -shortLabel Ensembl genes -longLabel Ensembl genes version 103/Feb. 2021 -group genes -priority 40 -visibility pack -color 150,0,0 -type bigBed 12 . -bigDataUrl bbi/GCF_000002985.6_WBcel235.ensGene.bb -searchIndex name -searchTrix ixIxx/GCF_000002985.6_WBcel235.ensGene.ix -html html/GCF_000002985.6_WBcel235.ensGene diff --git a/test_data/volvoxhub/singlefile.volvox.hub.txt b/test_data/volvoxhub/singlefile.volvox.hub.txt new file mode 100644 index 0000000000..e453dc091c --- /dev/null +++ b/test_data/volvoxhub/singlefile.volvox.hub.txt @@ -0,0 +1,34 @@ +hub volvox genome assembly +shortLabel volvox +longLabel Volvox mythicus genome assembly +useOneFile on +email colin.diesh@gmail.com +descriptionUrl html/volvox.description.html + +genome volvox +taxId 1234 +groups groups.txt +description roundworm +twoBitPath volvox.2bit +twoBitBptUrl volvox.2bit.bpt +chromSizes volvox.chrom.sizes +chromAliasBb volvox.chromAlias.bb +chromAuthority ucsc +organism Volvox mythicus Feb. 2013 +defaultPos ctgA:5000-10000 +scientificName Volvox mythicus +htmlPath html/volvox.description.html + +track genes +longLabel Genes +shortLabel Genes +bigDataUrl bbi/volvox.bb +type bigBed 6 +html html/volvox.genes.html + +track coverage +shortLabel Coverage +longLabel Coverage for volvox-sorted.bam +bigDataUrl bbi/volvox-sorted.bam.coverage.bw +type bigWig 0 100 +html html/volvox.coverage.html From 992b05974d69b2740cc7f89113ec09640426c04b Mon Sep 17 00:00:00 2001 From: Colin Date: Wed, 29 Nov 2023 20:47:27 -0500 Subject: [PATCH 3/6] Bump --- plugins/data-management/package.json | 2 +- .../facetedModel.ts | 11 +- .../HierarchicalTrackSelectorWidget/model.ts | 24 +-- .../src/ucsc-trackhub/doConnect.ts | 1 + .../__snapshots__/jbrowseModel.test.ts.snap | 54 ++++++ yarn.lock | 174 +++++++++--------- 6 files changed, 162 insertions(+), 104 deletions(-) diff --git a/plugins/data-management/package.json b/plugins/data-management/package.json index 6c0f3c442f..0b1fdb01ab 100644 --- a/plugins/data-management/package.json +++ b/plugins/data-management/package.json @@ -36,7 +36,7 @@ "clean": "rimraf dist esm *.tsbuildinfo" }, "dependencies": { - "@gmod/ucsc-hub": "^0.1.6", + "@gmod/ucsc-hub": "^0.3.0", "@mui/icons-material": "^5.0.1", "@mui/x-data-grid": "^6.0.1", "clsx": "^2.0.0", diff --git a/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts b/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts index 9e8d8cb2f7..0b76c9025b 100644 --- a/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts +++ b/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts @@ -114,9 +114,10 @@ export function facetedStateTreeF() { /** * #getter */ - get trackConfigurations() { - return getParent<{ trackConfigurations: AnyConfigurationModel[] }>(self) - .trackConfigurations + get allTrackConfigurations() { + return getParent<{ allTrackConfigurations: AnyConfigurationModel[] }>( + self, + ).allTrackConfigurations }, })) .views(self => ({ @@ -125,10 +126,10 @@ export function facetedStateTreeF() { */ get rows() { const session = getSession(self) - const { trackConfigurations, filterText } = self + const { allTrackConfigurations, filterText } = self // metadata is spread onto the object for easier access and sorting // by the mui data grid (it's unable to sort by nested objects) - return trackConfigurations + return allTrackConfigurations .filter(conf => matches(filterText, conf, session)) .map(track => { const metadata = readConfObject(track, 'metadata') diff --git a/plugins/data-management/src/HierarchicalTrackSelectorWidget/model.ts b/plugins/data-management/src/HierarchicalTrackSelectorWidget/model.ts index c0f10a1abc..718475b9d9 100644 --- a/plugins/data-management/src/HierarchicalTrackSelectorWidget/model.ts +++ b/plugins/data-management/src/HierarchicalTrackSelectorWidget/model.ts @@ -203,6 +203,7 @@ export default function stateTreeFactory(pluginManager: PluginManager) { */ addToRecentlyUsed(id: string) { self.recentlyUsedCounter += 1 + console.log({ id }) if (!self.recentlyUsed.includes(id)) { if (self.recentlyUsed.length >= 10) { self.recentlyUsed.shift() @@ -320,24 +321,25 @@ export default function stateTreeFactory(pluginManager: PluginManager) { getConf(getSession(self), ['hierarchical', 'sort', 'categories']) ) }, - /** - * #method - * filter out tracks that don't match the current display types - */ - connectionTrackConfigurations(conn: { tracks: AnyConfigurationModel[] }) { - return filterTracks(conn.tracks, self) - }, /** * #getter * filter out tracks that don't match the current assembly/display types */ - get trackConfigurations() { + get configAndSessionTrackConfigurations() { return [ ...self.assemblyNames.map(a => self.getRefSeqTrackConf(a)), ...filterTracks(getSession(self).tracks, self), ].filter(notEmpty) }, + + get allTrackConfigurations() { + const { connectionInstances = [] } = getSession(self) + return [ + ...this.configAndSessionTrackConfigurations, + ...connectionInstances?.flatMap(c => c.tracks), + ] + }, })) .views(self => ({ /** @@ -345,7 +347,7 @@ export default function stateTreeFactory(pluginManager: PluginManager) { * filters out tracks that are not in the favorites group */ get favoriteTracks() { - return self.trackConfigurations.filter(t => + return self.allTrackConfigurations.filter(t => self.favoritesSet.has(t.trackId), ) }, @@ -355,7 +357,7 @@ export default function stateTreeFactory(pluginManager: PluginManager) { * filters out tracks that are not in the recently used group */ get recentlyUsedTracks() { - return self.trackConfigurations.filter(t => + return self.allTrackConfigurations.filter(t => self.recentlyUsedSet.has(t.trackId), ) }, @@ -369,7 +371,7 @@ export default function stateTreeFactory(pluginManager: PluginManager) { return [ { group: 'Tracks', - tracks: self.trackConfigurations, + tracks: self.configAndSessionTrackConfigurations, noCategories: false, menuItems: [], }, diff --git a/plugins/data-management/src/ucsc-trackhub/doConnect.ts b/plugins/data-management/src/ucsc-trackhub/doConnect.ts index 1c9c188c78..1dede0aa21 100644 --- a/plugins/data-management/src/ucsc-trackhub/doConnect.ts +++ b/plugins/data-management/src/ucsc-trackhub/doConnect.ts @@ -21,6 +21,7 @@ export async function doConnect(self: any) { try { const hubFileLocation = getConf(self, 'hubTxtLocation') as FileLocation const hubFileText = await openLocation(hubFileLocation).readFile('utf8') + // @ts-expect-error const hubUri = resolve(hubFileLocation.uri, hubFileLocation.baseUri) const { assemblyManager } = session if (hubFileText.includes('useOneFile on')) { diff --git a/products/jbrowse-web/src/__snapshots__/jbrowseModel.test.ts.snap b/products/jbrowse-web/src/__snapshots__/jbrowseModel.test.ts.snap index 4febd03643..2111838a4d 100644 --- a/products/jbrowse-web/src/__snapshots__/jbrowseModel.test.ts.snap +++ b/products/jbrowse-web/src/__snapshots__/jbrowseModel.test.ts.snap @@ -4236,6 +4236,60 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` "trackId": "volvox_bedpe", "type": "VariantTrack", }, + { + "adapter": { + "bamLocation": { + "internetAccountId": undefined, + "internetAccountPreAuthorization": undefined, + "locationType": "UriLocation", + "uri": "volvox-sorted.bam", + }, + "index": { + "location": { + "internetAccountId": undefined, + "internetAccountPreAuthorization": undefined, + "locationType": "UriLocation", + "uri": "volvox-sorted.bam.bai", + }, + }, + "sequenceAdapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "volvox.2bit", + }, + "type": "TwoBitAdapter", + }, + "type": "BamAdapter", + }, + "assemblyNames": [ + "volvox", + ], + "displays": [ + { + "displayId": "volvox-sorted-LinearAlignmentsDisplay", + "type": "LinearAlignmentsDisplay", + }, + { + "displayId": "volvox-sorted-LinearPileupDisplay", + "type": "LinearPileupDisplay", + }, + { + "displayId": "volvox-sorted-LinearSNPCoverageDisplay", + "type": "LinearSNPCoverageDisplay", + }, + { + "displayId": "volvox-sorted-LinearReadArcsDisplay", + "type": "LinearReadArcsDisplay", + }, + { + "displayId": "volvox-sorted-LinearReadCloudDisplay", + "type": "LinearReadCloudDisplay", + }, + ], + "name": "volvox-sorted", + "trackId": "volvox-sorted", + "type": "AlignmentsTrack", + }, ], } `; diff --git a/yarn.lock b/yarn.lock index f0ba958ddd..879a7d97e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1052,7 +1052,7 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.8", "@babel/runtime@^7.17.9", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.6", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.8", "@babel/runtime@^7.17.9", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.6", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.5.tgz#11edb98f8aeec529b82b211028177679144242db" integrity sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w== @@ -1615,10 +1615,10 @@ generic-filehandle "^3.0.0" long "^4.0.0" -"@gmod/ucsc-hub@^0.1.6": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@gmod/ucsc-hub/-/ucsc-hub-0.1.7.tgz#ea8d0c1978fc8bbd1ab63061e8105beb3d1509f1" - integrity sha512-FHCgRLOYn5wjCGVDkGnW0wda7UAIFqVrKE5+0lh1EpUOu/UM1kfaidsJnha4Jc9V0+KCevSl4haVv0ZaMWqw2w== +"@gmod/ucsc-hub@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@gmod/ucsc-hub/-/ucsc-hub-0.3.0.tgz#375eeab1c515605510c706f6e2d76d6b42454f8c" + integrity sha512-M8r1rpmNOVH6UHwUTSOR5Z86upWEhvI3BKbyYVq8imTS+nZAq8Gr9RJTBsGlL0sgX7fmLSXms8/pTyp7e3YAQA== "@gmod/vcf@^5.0.9": version "5.0.10" @@ -2067,94 +2067,94 @@ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz#c3ec604a0b54b9a9b87e9735dfc59e1a5da6a5fb" integrity sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug== -"@mui/base@5.0.0-beta.24": - version "5.0.0-beta.24" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.24.tgz#1a0638388291828dacf9547b466bc21fbaad3a2a" - integrity sha512-bKt2pUADHGQtqWDZ8nvL2Lvg2GNJyd/ZUgZAJoYzRgmnxBL9j36MSlS3+exEdYkikcnvVafcBtD904RypFKb0w== +"@mui/base@5.0.0-beta.25": + version "5.0.0-beta.25" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.25.tgz#e1bc39f7a2daa9851fa8d0774ae6d89f0453bdc3" + integrity sha512-Iiv+IcappRRv6IBlknIVmLkXxfp51NEX1+l9f+dIbBuPU4PaRULegr1lCeHKsC45KU5ruxM5xMg4R/de03aJQg== dependencies: - "@babel/runtime" "^7.23.2" + "@babel/runtime" "^7.23.4" "@floating-ui/react-dom" "^2.0.4" - "@mui/types" "^7.2.9" - "@mui/utils" "^5.14.18" + "@mui/types" "^7.2.10" + "@mui/utils" "^5.14.19" "@popperjs/core" "^2.11.8" clsx "^2.0.0" prop-types "^15.8.1" -"@mui/core-downloads-tracker@^5.14.18": - version "5.14.18" - resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.18.tgz#f8b187dc89756fa5c0b7d15aea537a6f73f0c2d8" - integrity sha512-yFpF35fEVDV81nVktu0BE9qn2dD/chs7PsQhlyaV3EnTeZi9RZBuvoEfRym1/jmhJ2tcfeWXiRuHG942mQXJJQ== +"@mui/core-downloads-tracker@^5.14.19": + version "5.14.19" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.19.tgz#9c04ad047c378d857d529ef9c535b60a10b9a47c" + integrity sha512-y4JseIen5pmZs1n9hHy95HKKioKco8f6N2lford2AmjJigVJOv0KsU0qryiCpyuEUZmi/xCduVilHsK9DSkPcA== "@mui/icons-material@^5.0.0", "@mui/icons-material@^5.0.1", "@mui/icons-material@^5.0.2": - version "5.14.18" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.14.18.tgz#9e92964cde8c7ba32cf50438a83403dc283f2328" - integrity sha512-o2z49R1G4SdBaxZjbMmkn+2OdT1bKymLvAYaB6pH59obM1CYv/0vAVm6zO31IqhwtYwXv6A7sLIwCGYTaVkcdg== + version "5.14.19" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.14.19.tgz#6e0f4e9d89f99517d3c0ee65dee7ac97753755af" + integrity sha512-yjP8nluXxZGe3Y7pS+yxBV+hWZSsSBampCxkZwaw+1l+feL+rfP74vbEFbMrX/Kil9I/Y1tWfy5bs/eNvwNpWw== dependencies: - "@babel/runtime" "^7.23.2" + "@babel/runtime" "^7.23.4" "@mui/material@^5.0.0", "@mui/material@^5.10.17": - version "5.14.18" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.14.18.tgz#d0a89be3e27afe90135d542ddbf160b3f34e869c" - integrity sha512-y3UiR/JqrkF5xZR0sIKj6y7xwuEiweh9peiN3Zfjy1gXWXhz5wjlaLdoxFfKIEBUFfeQALxr/Y8avlHH+B9lpQ== - dependencies: - "@babel/runtime" "^7.23.2" - "@mui/base" "5.0.0-beta.24" - "@mui/core-downloads-tracker" "^5.14.18" - "@mui/system" "^5.14.18" - "@mui/types" "^7.2.9" - "@mui/utils" "^5.14.18" - "@types/react-transition-group" "^4.4.8" + version "5.14.19" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.14.19.tgz#6b81f6248da04ee73f935a79d81e7819c7115089" + integrity sha512-jSPLXst/YPgDGolhiu4rbethKjLVrI1IkoK8YrFUv8ygxDuhQdsE6+ZqjSSRXk3ytTMf6ghPnQ88OFRk4XjpNw== + dependencies: + "@babel/runtime" "^7.23.4" + "@mui/base" "5.0.0-beta.25" + "@mui/core-downloads-tracker" "^5.14.19" + "@mui/system" "^5.14.19" + "@mui/types" "^7.2.10" + "@mui/utils" "^5.14.19" + "@types/react-transition-group" "^4.4.9" clsx "^2.0.0" csstype "^3.1.2" prop-types "^15.8.1" react-is "^18.2.0" react-transition-group "^4.4.5" -"@mui/private-theming@^5.14.18": - version "5.14.18" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.14.18.tgz#98f97139ea21570493391ab377c1deb47fc6d1a2" - integrity sha512-WSgjqRlzfHU+2Rou3HlR2Gqfr4rZRsvFgataYO3qQ0/m6gShJN+lhVEvwEiJ9QYyVzMDvNpXZAcqp8Y2Vl+PAw== +"@mui/private-theming@^5.14.19": + version "5.14.19" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.14.19.tgz#f3bae7377f987dc5f40d0c43163ae1ed1f892961" + integrity sha512-U9w39VpXLGVM8wZlUU/47YGTsBSk60ZQRRxQZtdqPfN1N7OVllQeN4cEKZKR8PjqqR3aYRcSciQ4dc6CttRoXQ== dependencies: - "@babel/runtime" "^7.23.2" - "@mui/utils" "^5.14.18" + "@babel/runtime" "^7.23.4" + "@mui/utils" "^5.14.19" prop-types "^15.8.1" -"@mui/styled-engine@^5.14.18": - version "5.14.18" - resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.14.18.tgz#82d427bc975b85cecdbab2fd9353ed6c2df7eae1" - integrity sha512-pW8bpmF9uCB5FV2IPk6mfbQCjPI5vGI09NOLhtGXPeph/4xIfC3JdIX0TILU0WcTs3aFQqo6s2+1SFgIB9rCXA== +"@mui/styled-engine@^5.14.19": + version "5.14.19" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.14.19.tgz#dee1d16044a5ef3a783b742381ea4348c159b013" + integrity sha512-jtj/Pyn/bS8PM7NXdFNTHWZfE3p+vItO4/HoQbUeAv3u+cnWXcTBGHHY/xdIn446lYGFDczTh1YyX8G4Ts0Rtg== dependencies: - "@babel/runtime" "^7.23.2" + "@babel/runtime" "^7.23.4" "@emotion/cache" "^11.11.0" csstype "^3.1.2" prop-types "^15.8.1" -"@mui/system@^5.14.18", "@mui/system@^5.14.4": - version "5.14.18" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.14.18.tgz#0f671e8f0a5e8e965b79235d77c50098f54195b5" - integrity sha512-hSQQdb3KF72X4EN2hMEiv8EYJZSflfdd1TRaGPoR7CIAG347OxCslpBUwWngYobaxgKvq6xTrlIl+diaactVww== +"@mui/system@^5.14.19", "@mui/system@^5.14.4": + version "5.14.19" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.14.19.tgz#f13387c60af129e4d61dfbf168fcee348ebe952a" + integrity sha512-4e3Q+2nx+vgEsd0h5ftxlZGB7XtkkPos/zWqCqnxUs1l/T70s0lF2YNrWHHdSQ7LgtBu0eQ0qweZG2pR7KwkAw== dependencies: - "@babel/runtime" "^7.23.2" - "@mui/private-theming" "^5.14.18" - "@mui/styled-engine" "^5.14.18" - "@mui/types" "^7.2.9" - "@mui/utils" "^5.14.18" + "@babel/runtime" "^7.23.4" + "@mui/private-theming" "^5.14.19" + "@mui/styled-engine" "^5.14.19" + "@mui/types" "^7.2.10" + "@mui/utils" "^5.14.19" clsx "^2.0.0" csstype "^3.1.2" prop-types "^15.8.1" -"@mui/types@^7.2.9": - version "7.2.9" - resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.9.tgz#730ee83a37af292a5973962f78ce5c95f31213a7" - integrity sha512-k1lN/PolaRZfNsRdAqXtcR71sTnv3z/VCCGPxU8HfdftDkzi335MdJ6scZxvofMAd/K/9EbzCZTFBmlNpQVdCg== +"@mui/types@^7.2.10": + version "7.2.10" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.10.tgz#13e3e9aa07ee6d593cfacd538e02e8e896d7a12f" + integrity sha512-wX1vbDC+lzF7FlhT6A3ffRZgEoKWPF8VqRoTu4lZwouFX2t90KyCMsgepMw5DxLak1BSp/KP86CmtZttikb/gQ== -"@mui/utils@^5.14.16", "@mui/utils@^5.14.18": - version "5.14.18" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.14.18.tgz#d2a46df9b06230423ba6b6317748b27185a56ac3" - integrity sha512-HZDRsJtEZ7WMSnrHV9uwScGze4wM/Y+u6pDVo+grUjt5yXzn+wI8QX/JwTHh9YSw/WpnUL80mJJjgCnWj2VrzQ== +"@mui/utils@^5.14.16", "@mui/utils@^5.14.19": + version "5.14.19" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.14.19.tgz#39a5846a74ba199f1a2b067ea197dc6b9c8f442f" + integrity sha512-qAHvTXzk7basbyqPvhgWqN6JbmI2wLB/mf97GkSlz5c76MiKYV6Ffjvw9BjKZQ1YRb8rDX9kgdjRezOcoB91oQ== dependencies: - "@babel/runtime" "^7.23.2" - "@types/prop-types" "^15.7.10" + "@babel/runtime" "^7.23.4" + "@types/prop-types" "^15.7.11" prop-types "^15.8.1" react-is "^18.2.0" @@ -4353,9 +4353,9 @@ "@types/estree" "*" "@types/eslint@*": - version "8.44.7" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.7.tgz#430b3cc96db70c81f405e6a08aebdb13869198f5" - integrity sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ== + version "8.44.8" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.8.tgz#f4fe1dab9b3d3dd98082d4b9f80e59ab40f1261c" + integrity sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -4479,9 +4479,9 @@ "@types/istanbul-lib-report" "*" "@types/jest-image-snapshot@^6.1.0": - version "6.2.3" - resolved "https://registry.yarnpkg.com/@types/jest-image-snapshot/-/jest-image-snapshot-6.2.3.tgz#feb86722e7d58a82a377ca634b9e0f37e4a7fc89" - integrity sha512-Lf6JNr3R+KzxfoGlxrxrbRBMBAsVADa1khItphouPOHqz6tyXoX6CeYeWMVETzV8lupc9r2Hho6hchhZH7ZdJA== + version "6.3.0" + resolved "https://registry.yarnpkg.com/@types/jest-image-snapshot/-/jest-image-snapshot-6.3.0.tgz#719dea56556db18bac8b7234595e315dcf6cc3e0" + integrity sha512-YZuZ1asbK3pK6+wzlhvs3vQ/FkvaWJfX7tTiha6TB5EOqPUSzYxheoodiCvOgIcX89NSlbJ4mMCKoVx6XMRVUA== dependencies: "@types/jest" "*" "@types/pixelmatch" "*" @@ -4594,9 +4594,9 @@ "@types/node" "*" "@types/node@*": - version "20.10.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.0.tgz#16ddf9c0a72b832ec4fcce35b8249cf149214617" - integrity sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ== + version "20.10.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.1.tgz#d2c96f356c3125fedc983d74c424910c3767141c" + integrity sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg== dependencies: undici-types "~5.26.4" @@ -4611,9 +4611,9 @@ integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A== "@types/node@^18.0.0", "@types/node@^18.11.18": - version "18.18.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.13.tgz#ae0f76c0bfe79d8fad0f910b78ae3e59b333c6e8" - integrity sha512-vXYZGRrSCreZmq1rEjMRLXJhiy8MrIeVasx+PCVlP414N7CJLHnMf+juVvjdprHyH+XRy3zKZLHeNueOpJCn0g== + version "18.18.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.14.tgz#26771c647f2842af57eb96191cd615d845164295" + integrity sha512-iSOeNeXYNYNLLOMDSVPvIFojclvMZ/HDY2dU17kUlcsOsSQETbWIslJbYLZgA+ox8g2XQwSHKTkght1a5X26lQ== dependencies: undici-types "~5.26.4" @@ -4674,7 +4674,7 @@ resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#ee1bd8c9f7a01b3445786aad0ef23aba5f511a44" integrity sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA== -"@types/prop-types@*", "@types/prop-types@^15.7.10": +"@types/prop-types@*", "@types/prop-types@^15.7.11": version "15.7.11" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== @@ -4701,7 +4701,7 @@ dependencies: "@types/react" "*" -"@types/react-transition-group@^4.4.8": +"@types/react-transition-group@^4.4.9": version "4.4.9" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.9.tgz#12a1a1b5b8791067198149867b0823fbace31579" integrity sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg== @@ -5710,9 +5710,9 @@ available-typed-arrays@^1.0.5: integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== aws-sdk@^2.1231.0: - version "2.1506.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1506.0.tgz#24824619c322c3ef8c46a0c53b191598a37c0f93" - integrity sha512-jSBbofvPa7HJykyM7Xph9psMcWPl6UgdiKjG2E7fHJb6psW+BZN9ZvSGOBvRIlT8Y6+JGzI0qkouS1OLK9slhg== + version "2.1508.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1508.0.tgz#ef88fd45e3cd4ac179aef073acb0a03e1218b0da" + integrity sha512-YiUzYqtPLIRwVkbWaA2dFSFaBLrtCUr3dE6gDJmadiH5NL2mNNZBOW+1JyFT33VOVdU8Pp8OWeNBEGCay9Psxg== dependencies: buffer "4.9.2" events "1.1.1" @@ -8307,9 +8307,9 @@ electron-publish@24.8.1: mime "^2.5.2" electron-to-chromium@^1.4.535: - version "1.4.596" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.596.tgz#6752d1aa795d942d49dfc5d3764d6ea283fab1d7" - integrity sha512-zW3zbZ40Icb2BCWjm47nxwcFGYlIgdXkAx85XDO7cyky9J4QQfq8t0W19/TLZqq3JPQXtlv8BPIGmfa9Jb4scg== + version "1.4.597" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.597.tgz#9848b9aa52749bf35be88013bab52be232889d94" + integrity sha512-0XOQNqHhg2YgRVRUrS4M4vWjFCFIP2ETXcXe/0KIQBjXE9Cpy+tgzzYfuq6HGai3hWq0YywtG+5XK8fyG08EjA== electron-updater@^6.1.1: version "6.1.7" @@ -9353,9 +9353,9 @@ flatted@^3.2.9: integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== flow-parser@0.*: - version "0.222.0" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.222.0.tgz#88decc0e35bc11c011af66dbc2f669589d69a6b2" - integrity sha512-Fq5OkFlFRSMV2EOZW+4qUYMTE0uj8pcLsYJMxXYriSBDpHAF7Ofx3PibCTy3cs5P6vbsry7eYj7Z7xFD49GIOQ== + version "0.223.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.223.0.tgz#11cf53ff95e40aa5679e1da84831ec65812c50ef" + integrity sha512-POG49J/UuvwI43iP7XzW1EBQzJtkAVT1/HUwbMVtEhNK+AvymSQwBRX6khUhgzbFgfyrWgVYHhheqe1xTruBLg== follow-redirects@^1.0.0, follow-redirects@^1.15.0: version "1.15.3" @@ -10394,9 +10394,9 @@ ignore-walk@^5.0.1: minimatch "^5.0.1" ignore-walk@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.3.tgz#0fcdb6decaccda35e308a7b0948645dd9523b7bb" - integrity sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA== + version "6.0.4" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.4.tgz#89950be94b4f522225eb63a13c56badb639190e9" + integrity sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw== dependencies: minimatch "^9.0.0" From f4a8e1e90700f0519314bc77f6f20bc00f5ff91a Mon Sep 17 00:00:00 2001 From: Colin Date: Thu, 30 Nov 2023 08:39:47 -0500 Subject: [PATCH 4/6] Move utils around --- .../components/faceted/util.ts | 5 --- .../facetedModel.ts | 40 ++++++++++++------- .../facetedUtil.ts | 13 ++++++ 3 files changed, 39 insertions(+), 19 deletions(-) delete mode 100644 plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/util.ts create mode 100644 plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedUtil.ts diff --git a/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/util.ts b/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/util.ts deleted file mode 100644 index e331804f35..0000000000 --- a/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/util.ts +++ /dev/null @@ -1,5 +0,0 @@ -export function getRootKeys(obj: Record) { - return Object.entries(obj) - .map(([key, val]) => (typeof val === 'string' ? key : '')) - .filter(f => !!f) -} diff --git a/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts b/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts index 0b76c9025b..68b3cf4463 100644 --- a/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts +++ b/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts @@ -11,18 +11,10 @@ import { measureGridWidth, } from '@jbrowse/core/util' import { autorun, observable } from 'mobx' -import { getRootKeys } from './components/faceted/util' +import { getRootKeys, findNonSparseKeys } from './facetedUtil' const nonMetadataKeys = ['category', 'adapter', 'description'] as const -function filt( - keys: readonly string[], - rows: Record[], - cb: (row: Record, f: string) => unknown, -) { - return keys.filter(f => rows.map(r => cb(r, f)).filter(f => !!f).length > 5) -} - /** * #stateModel FacetedModel */ @@ -147,22 +139,33 @@ export function facetedStateTreeF() { })) .views(self => ({ + /** + * #getter + */ get filteredNonMetadataKeys() { return self.showSparse ? nonMetadataKeys - : filt(nonMetadataKeys, self.rows, (r, f) => r[f]) + : findNonSparseKeys(nonMetadataKeys, self.rows, (r, f) => r[f]) }, - + /** + * #getter + */ get metadataKeys() { return [...new Set(self.rows.flatMap(row => getRootKeys(row.metadata)))] }, get filteredMetadataKeys() { return self.showSparse ? this.metadataKeys - : // @ts-expect-error - filt(this.metadataKeys, self.rows, (r, f) => r.metadata[f]) + : findNonSparseKeys( + this.metadataKeys, + self.rows, + // @ts-expect-error + (r, f) => r.metadata[f], + ) }, - + /** + * #getter + */ get fields() { return [ 'name', @@ -170,6 +173,9 @@ export function facetedStateTreeF() { ...this.filteredMetadataKeys.map(m => `metadata.${m}`), ] }, + /** + * #getter + */ get filteredRows() { const arrFilters = [...self.filters.entries()] .filter(f => f[1].length > 0) @@ -181,9 +187,15 @@ export function facetedStateTreeF() { }, })) .actions(self => ({ + /** + * #action + */ setVisible(args: Record) { self.visible = args }, + /** + * #action + */ setWidths(args: Record) { self.widths = args }, diff --git a/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedUtil.ts b/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedUtil.ts new file mode 100644 index 0000000000..cdc7e1a587 --- /dev/null +++ b/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedUtil.ts @@ -0,0 +1,13 @@ +export function findNonSparseKeys( + keys: readonly string[], + rows: Record[], + cb: (row: Record, f: string) => unknown, +) { + return keys.filter(f => rows.map(r => cb(r, f)).filter(f => !!f).length > 5) +} + +export function getRootKeys(obj: Record) { + return Object.entries(obj) + .map(([key, val]) => (typeof val === 'string' ? key : '')) + .filter(f => !!f) +} From 6c16e2ebfe3674f4ad160ec6d19f1593817c57a9 Mon Sep 17 00:00:00 2001 From: Colin Date: Thu, 30 Nov 2023 08:54:33 -0500 Subject: [PATCH 5/6] Misc --- .../src/AddTrackWidget/model.ts | 83 ++++++++++++- .../src/ucsc-trackhub/model.ts | 13 ++ .../src/ucsc-trackhub/ucscTrackHub.ts | 111 ++---------------- 3 files changed, 108 insertions(+), 99 deletions(-) diff --git a/plugins/data-management/src/AddTrackWidget/model.ts b/plugins/data-management/src/AddTrackWidget/model.ts index a8b0f9a5b9..5866a28d61 100644 --- a/plugins/data-management/src/AddTrackWidget/model.ts +++ b/plugins/data-management/src/AddTrackWidget/model.ts @@ -21,11 +21,24 @@ interface IndexingAttr { attributes: string[] exclude: string[] } + +/** + * #stateModel AddTrackModel + */ export default function f(pluginManager: PluginManager) { return types .model('AddTrackModel', { + /** + * #property + */ id: ElementId, + /** + * #property + */ type: types.literal('AddTrackWidget'), + /** + * #property + */ view: types.safeReference( pluginManager.pluggableMstType('view', 'stateModel'), ), @@ -45,34 +58,63 @@ export default function f(pluginManager: PluginManager) { textIndexingConf: undefined as IndexingAttr | undefined, })) .actions(self => ({ + /** + * #action + */ setAdapterHint(obj: string) { self.adapterHint = obj }, + /** + * #action + */ setTrackSource(str: string) { self.trackSource = str }, + /** + * #action + */ setTextIndexingConf(conf: IndexingAttr) { self.textIndexingConf = conf }, + /** + * #action + */ setTextIndexTrack(flag: boolean) { self.textIndexTrack = flag }, + /** + * #action + */ setTrackData(obj: FileLocation) { self.trackData = obj }, + /** + * #action + */ setIndexTrackData(obj: FileLocation) { self.indexTrackData = obj }, + /** + * #action + */ setAssembly(str: string) { self.altAssemblyName = str }, + /** + * #action + */ setTrackName(str: string) { self.altTrackName = str }, + /** + * #action + */ setTrackType(str: string) { self.altTrackType = str }, - + /** + * #action + */ clearData() { self.trackSource = '' self.altTrackName = '' @@ -86,6 +128,9 @@ export default function f(pluginManager: PluginManager) { }, })) .views(self => ({ + /** + * #getter + */ get trackAdapter() { const { trackData, indexTrackData, adapterHint } = self @@ -94,6 +139,9 @@ export default function f(pluginManager: PluginManager) { : undefined }, + /** + * #getter + */ get trackName() { return ( self.altTrackName || @@ -101,6 +149,9 @@ export default function f(pluginManager: PluginManager) { ) }, + /** + * #getter + */ get isFtp() { const { trackData: track, indexTrackData: index } = self return !!( @@ -109,29 +160,47 @@ export default function f(pluginManager: PluginManager) { ) }, + /** + * #getter + */ get isRelativeTrackUrl() { // @ts-expect-error const uri = self.trackData?.uri return uri ? !isAbsoluteUrl(uri) : false }, + /** + * #getter + */ get isRelativeIndexUrl() { // @ts-expect-error const uri = self.indexTrackData?.uri return uri ? !isAbsoluteUrl(uri) : false }, + /** + * #getter + */ get isRelativeUrl() { return this.isRelativeIndexUrl || this.isRelativeTrackUrl }, + /** + * #getter + */ get trackHttp() { // @ts-expect-error return self.trackData?.uri?.startsWith('http://') }, + /** + * #getter + */ get indexHttp() { // @ts-expect-error return self.indexTrackData?.uri?.startsWith('http://') }, + /** + * #getter + */ get wrongProtocol() { return ( window.location.protocol === 'https:' && @@ -139,14 +208,23 @@ export default function f(pluginManager: PluginManager) { ) }, + /** + * #getter + */ get unsupported() { return this.trackAdapter?.type === UNSUPPORTED }, + /** + * #getter + */ get assembly() { return self.altAssemblyName || self.view.assemblyNames?.[0] }, + /** + * #getter + */ get trackType() { return ( self.altTrackType || @@ -157,6 +235,9 @@ export default function f(pluginManager: PluginManager) { }, })) .views(self => ({ + /** + * #getter + */ get warningMessage() { if (self.isFtp) { return `Warning: JBrowse cannot access files using the ftp protocol` diff --git a/plugins/data-management/src/ucsc-trackhub/model.ts b/plugins/data-management/src/ucsc-trackhub/model.ts index b7cb1d047f..a06764d17e 100644 --- a/plugins/data-management/src/ucsc-trackhub/model.ts +++ b/plugins/data-management/src/ucsc-trackhub/model.ts @@ -6,17 +6,30 @@ import { types } from 'mobx-state-tree' // locals import configSchema from './configSchema' +/** + * #stateModel UCSCTrackHubConnection + * extends BaseConnectionModel + */ export default function UCSCTrackHubConnection(pluginManager: PluginManager) { return types .compose( 'UCSCTrackHubConnection', BaseConnectionModelFactory(pluginManager), types.model({ + /** + * #property + */ configuration: ConfigurationReference(configSchema), + /** + * #property + */ type: types.literal('UCSCTrackHubConnection'), }), ) .actions(self => ({ + /** + * #action + */ async connect() { const { doConnect } = await import('./doConnect') diff --git a/plugins/data-management/src/ucsc-trackhub/ucscTrackHub.ts b/plugins/data-management/src/ucsc-trackhub/ucscTrackHub.ts index 8eca3c231c..33f68ce34f 100644 --- a/plugins/data-management/src/ucsc-trackhub/ucscTrackHub.ts +++ b/plugins/data-management/src/ucsc-trackhub/ucscTrackHub.ts @@ -124,6 +124,8 @@ function makeTrackConfig({ ? makeLoc(bigDataUrl, trackDbLoc) : makeLoc2(bigDataUrl) + console.log({ trackType }, track.data.parent) + switch (baseTrackType) { case 'bam': return { @@ -142,84 +144,28 @@ function makeTrackConfig({ }, } - case 'bigBarChart': + case 'cram': return { - type: 'FeatureTrack', + type: 'AlignmentsTrack', name, description: track.data.longLabel, category: categories, adapter: { - type: 'BigBedAdapter', - bigBedLocation: bigDataLocation, - }, - renderer: { - type: 'SvgFeatureRenderer', + type: 'CramAdapter', + cramLocation: bigDataLocation, + craiLocation: isUri + ? makeLocAlt(bigDataIdx, bigDataUrl + '.crai', trackDbLoc) + : makeLoc2(bigDataIdx, bigDataUrl + '.crai'), + sequenceAdapter, }, } + case 'bigBarChart': case 'bigBed': - return { - type: 'FeatureTrack', - name, - description: track.data.longLabel, - category: categories, - adapter: { - type: 'BigBedAdapter', - bigBedLocation: bigDataLocation, - }, - } case 'bigGenePred': - return { - type: 'FeatureTrack', - name, - description: track.data.longLabel, - category: categories, - adapter: { - type: 'BigBedAdapter', - bigBedLocation: bigDataLocation, - }, - } case 'bigChain': - return { - type: 'FeatureTrack', - name, - description: track.data.longLabel, - category: categories, - adapter: { - type: 'BigBedAdapter', - bigBedLocation: bigDataLocation, - }, - renderer: { - type: 'SvgFeatureRenderer', - }, - } case 'bigInteract': - return { - type: 'FeatureTrack', - name, - description: track.data.longLabel, - category: categories, - adapter: { - type: 'BigBedAdapter', - bigBedLocation: bigDataLocation, - }, - renderer: { - type: 'SvgFeatureRenderer', - }, - } case 'bigMaf': - return { - type: 'FeatureTrack', - name, - description: track.data.longLabel, - category: categories, - adapter: { - type: 'BigBedAdapter', - bigBedLocation: bigDataLocation, - }, - renderer: { - type: 'SvgFeatureRenderer', - }, - } + case 'bigNarrowPeak': case 'bigPsl': return { type: 'FeatureTrack', @@ -230,9 +176,6 @@ function makeTrackConfig({ type: 'BigBedAdapter', bigBedLocation: bigDataLocation, }, - renderer: { - type: 'SvgFeatureRenderer', - }, } case 'bigWig': return { @@ -246,35 +189,6 @@ function makeTrackConfig({ }, } - case 'cram': - return { - type: 'AlignmentsTrack', - name, - description: track.data.longLabel, - category: categories, - adapter: { - type: 'CramAdapter', - cramLocation: bigDataLocation, - craiLocation: isUri - ? makeLocAlt(bigDataIdx, bigDataUrl + '.crai', trackDbLoc) - : makeLoc2(bigDataIdx, bigDataUrl + '.crai'), - sequenceAdapter, - }, - } - - case 'bigNarrowPeak': - return { - type: 'FeatureTrack', - name, - description: track.data.longLabel, - category: categories, - adapter: { - type: 'BigBedAdapter', - bigBedLocation: bigDataLocation, - }, - } - case 'peptideMapping': - return generateUnsupportedTrackConf(name, baseTrackType, categories) case 'vcfTabix': return { type: 'VariantTrack', @@ -305,6 +219,7 @@ function makeTrackConfig({ } // unsupported types + // case 'peptideMapping': // case 'gvf': // case 'ld2': // case 'narrowPeak': From b0136f11d2b62baf8bd96d2a6b4737e6bbe3e122 Mon Sep 17 00:00:00 2001 From: Colin Date: Thu, 30 Nov 2023 08:58:24 -0500 Subject: [PATCH 6/6] Use session assembly --- .../ConfigurationEditor.test.tsx.snap | 91 ++++++++++--------- .../AddConnectionWidget.test.tsx.snap | 1 + .../HierarchicalTrackSelector.test.tsx.snap | 6 +- .../HierarchicalTrackSelectorWidget/model.ts | 1 - .../PluginStoreWidget.test.tsx.snap | 2 +- .../src/ucsc-trackhub/doConnect.ts | 2 +- .../src/ucsc-trackhub/ucscTrackHub.ts | 90 +++++++++--------- .../LinearGenomeView.test.tsx.snap | 4 +- .../__snapshots__/jbrowseModel.test.ts.snap | 54 ----------- test_data/volvox/config.json | 27 ------ 10 files changed, 99 insertions(+), 179 deletions(-) diff --git a/plugins/config/src/ConfigurationEditorWidget/components/__snapshots__/ConfigurationEditor.test.tsx.snap b/plugins/config/src/ConfigurationEditorWidget/components/__snapshots__/ConfigurationEditor.test.tsx.snap index 686d52ff7e..4b36467a6f 100644 --- a/plugins/config/src/ConfigurationEditorWidget/components/__snapshots__/ConfigurationEditor.test.tsx.snap +++ b/plugins/config/src/ConfigurationEditorWidget/components/__snapshots__/ConfigurationEditor.test.tsx.snap @@ -1265,6 +1265,7 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch aria-hidden="true" aria-invalid="false" class="MuiSelect-nativeInput css-yf8vq0-MuiSelect-nativeInput" + name=":ri:" tabindex="-1" value="PileupRenderer" /> @@ -1319,8 +1320,8 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch @@ -1328,10 +1329,10 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl css-md26zr-MuiInputBase-root-MuiOutlinedInput-root" > @@ -1350,7 +1351,7 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch

the color of each feature in a pileup alignment

@@ -1407,8 +1408,8 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch @@ -1416,13 +1417,13 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl css-md26zr-MuiInputBase-root-MuiOutlinedInput-root" >
read sequencer orientation. fr is normal "reads pointing at each other ---> <--- while some other sequencers can use other options @@ -1485,8 +1487,8 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch @@ -1494,13 +1496,13 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl css-md26zr-MuiInputBase-root-MuiOutlinedInput-root" >
Alternative display modes @@ -1563,8 +1566,8 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch @@ -1572,10 +1575,10 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl css-md26zr-MuiInputBase-root-MuiOutlinedInput-root" > @@ -1594,7 +1597,7 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
the minimum width in px for a pileup mismatch feature. use for increasing/decreasing mismatch marker widths when zoomed out, e.g. 0 or 1 @@ -1618,8 +1621,8 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch @@ -1627,10 +1630,10 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl css-md26zr-MuiInputBase-root-MuiOutlinedInput-root" > @@ -1649,7 +1652,7 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
the maximum height to be used in a pileup rendering @@ -1673,8 +1676,8 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch @@ -1682,10 +1685,10 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl css-md26zr-MuiInputBase-root-MuiOutlinedInput-root" > @@ -1704,7 +1707,7 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
the max clip size to be used in a pileup rendering @@ -1728,8 +1731,8 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch @@ -1737,10 +1740,10 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl css-md26zr-MuiInputBase-root-MuiOutlinedInput-root" > @@ -1759,7 +1762,7 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
the height of each feature in a pileup alignment @@ -1857,8 +1860,8 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch @@ -1866,10 +1869,10 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl css-md26zr-MuiInputBase-root-MuiOutlinedInput-root" > @@ -1888,7 +1891,7 @@ exports[`ConfigurationEditor widget renders with defaults of the PileupTrack sch
scale at which to draw the large insertion indicators (bp/pixel) diff --git a/plugins/data-management/src/AddConnectionWidget/components/__snapshots__/AddConnectionWidget.test.tsx.snap b/plugins/data-management/src/AddConnectionWidget/components/__snapshots__/AddConnectionWidget.test.tsx.snap index f4adf06dc4..ed0ef61785 100644 --- a/plugins/data-management/src/AddConnectionWidget/components/__snapshots__/AddConnectionWidget.test.tsx.snap +++ b/plugins/data-management/src/AddConnectionWidget/components/__snapshots__/AddConnectionWidget.test.tsx.snap @@ -96,6 +96,7 @@ exports[`renders 1`] = ` aria-hidden="true" aria-invalid="false" class="MuiSelect-nativeInput css-yf8vq0-MuiSelect-nativeInput" + name=":r2:" tabindex="-1" value="UCSCTrackHubConnection" /> diff --git a/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/__snapshots__/HierarchicalTrackSelector.test.tsx.snap b/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/__snapshots__/HierarchicalTrackSelector.test.tsx.snap index 418a0e1d74..628bee023f 100644 --- a/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/__snapshots__/HierarchicalTrackSelector.test.tsx.snap +++ b/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/__snapshots__/HierarchicalTrackSelector.test.tsx.snap @@ -32,7 +32,7 @@ exports[`renders nothing with no assembly 1`] = ` class="MuiFormControl-root MuiFormControl-marginDense MuiFormControl-fullWidth MuiTextField-root css-rlnh8o-MuiFormControl-root-MuiTextField-root-searchBox" >