From fd47c3434b1e92927e52dab816027788061b468a Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 13 Sep 2024 14:08:10 -0400 Subject: [PATCH] Misc --- .../BreakpointSplitView.ts | 16 ++++++----- .../components/PairedFeatures.tsx | 12 ++++---- .../components/Translocations.tsx | 17 ++++++----- .../src/BreakpointSplitView/util.ts | 10 ++----- .../src/LaunchSpreadsheetView/index.ts | 5 ---- .../components/ImportWizard.tsx | 2 +- .../importAdapters/BedImport.ts | 18 ++++++------ .../importAdapters/BedpeImport.ts | 28 +++++++++---------- .../importAdapters/STARFusionImport.ts | 2 +- .../importAdapters/VcfImport.ts | 4 +-- .../SpreadsheetView/importAdapters/util.ts | 12 ++++---- .../SpreadsheetView/models/ImportWizard.ts | 7 +---- .../src/LaunchSvInspectorView/index.ts | 6 ---- .../components/SvInspectorView.tsx | 1 + .../sv-inspector/src/SvInspectorView/index.ts | 3 ++ .../SvInspectorView/models/SvInspectorView.ts | 5 ++-- 16 files changed, 66 insertions(+), 82 deletions(-) diff --git a/plugins/breakpoint-split-view/src/BreakpointSplitView/BreakpointSplitView.ts b/plugins/breakpoint-split-view/src/BreakpointSplitView/BreakpointSplitView.ts index b24755d432..9b8c3d0485 100644 --- a/plugins/breakpoint-split-view/src/BreakpointSplitView/BreakpointSplitView.ts +++ b/plugins/breakpoint-split-view/src/BreakpointSplitView/BreakpointSplitView.ts @@ -1,4 +1,9 @@ -import { getSession, Feature, Region } from '@jbrowse/core/util' +import { + getSession, + Feature, + Region, + AbstractSessionModel, +} from '@jbrowse/core/util' import ViewType from '@jbrowse/core/pluggableElementTypes/ViewType' import { parseBreakend } from '@gmod/vcf' import { IStateTreeNode } from 'mobx-state-tree' @@ -103,15 +108,12 @@ export default class BreakpointSplitViewType extends ViewType { featureData: undefined as unknown, } } - - snapshotFromBreakendFeature( + async snapshotFromBreakendFeature( feature: Feature, - view: { displayedRegions: Region[] } & IStateTreeNode, + assemblyName: string, + session: AbstractSessionModel, ) { - const session = getSession(view) const bpPerPx = 10 - const { assemblyName } = view.displayedRegions[0]! - const { assemblyManager } = session const assembly = assemblyManager.get(assemblyName) if (!assembly) { diff --git a/plugins/breakpoint-split-view/src/BreakpointSplitView/components/PairedFeatures.tsx b/plugins/breakpoint-split-view/src/BreakpointSplitView/components/PairedFeatures.tsx index d3e6645498..ff15dcfb17 100644 --- a/plugins/breakpoint-split-view/src/BreakpointSplitView/components/PairedFeatures.tsx +++ b/plugins/breakpoint-split-view/src/BreakpointSplitView/components/PairedFeatures.tsx @@ -37,11 +37,9 @@ const PairedFeatures = observer(function ({ const [mouseoverElt, setMouseoverElt] = useState() const snap = getSnapshot(model) useNextFrame(snap) - const assembly = assemblyManager.get(views[0]!.assemblyNames[0]!) - - if (!assembly) { - return null - } + const assembly = views[0] + ? assemblyManager.get(views[0].assemblyNames[0]!) + : undefined let yoff = 0 if (ref.current) { @@ -49,7 +47,7 @@ const PairedFeatures = observer(function ({ yoff = rect.top } - return ( + return assembly ? ( - ) + ) : null }) export default PairedFeatures diff --git a/plugins/breakpoint-split-view/src/BreakpointSplitView/components/Translocations.tsx b/plugins/breakpoint-split-view/src/BreakpointSplitView/components/Translocations.tsx index 24c73536be..08cfb45ba1 100644 --- a/plugins/breakpoint-split-view/src/BreakpointSplitView/components/Translocations.tsx +++ b/plugins/breakpoint-split-view/src/BreakpointSplitView/components/Translocations.tsx @@ -49,7 +49,9 @@ const Translocations = observer(function ({ const snap = getSnapshot(model) useNextFrame(snap) - const assembly = assemblyManager.get(views[0]!.assemblyNames[0]!) + const assembly = views[0] + ? assemblyManager.get(views[0].assemblyNames[0]!) + : undefined let yOffset = 0 if (ref.current) { const rect = ref.current.getBoundingClientRect() @@ -60,7 +62,6 @@ const Translocations = observer(function ({ // just return null here note: would need to do processing of the INFO // CHR2/END and see which view could contain those coordinates to really do // it properly - return !assembly || views.length < 2 ? null : ( { const view = session.addView('SpreadsheetView') as SpreadsheetViewModel - - if (!view) { - throw new Error('Failed to initialize view') - } - view.importWizard.setSelectedAssemblyName(assembly) view.importWizard.setSpreadsheetFilehandle({ uri, diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/components/ImportWizard.tsx b/plugins/spreadsheet-view/src/SpreadsheetView/components/ImportWizard.tsx index 6af5f6b80f..9764461738 100644 --- a/plugins/spreadsheet-view/src/SpreadsheetView/components/ImportWizard.tsx +++ b/plugins/spreadsheet-view/src/SpreadsheetView/components/ImportWizard.tsx @@ -45,7 +45,7 @@ const ImportWizard = observer(({ model }: { model: ImportWizardModel }) => { const { assemblyNames, assemblyManager } = session const { fileTypes, error, loading } = model const [selected, setSelected] = useState(assemblyNames[0]) - const err = assemblyManager.get(selected)?.error || error + const err = assemblyManager.get(selected || '')?.error || error const rootModel = getRoot(model) const [tmp, setTmp] = useState() const [fileType, setFileType] = useState(getFileType(tmp)) diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedImport.ts b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedImport.ts index 2a7871dd15..f8a82dc9ce 100644 --- a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedImport.ts +++ b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedImport.ts @@ -13,9 +13,9 @@ export async function parseBedBuffer(buffer: Buffer) { for ( ; i < lines.length && - (lines[i].startsWith('#') || - lines[i].startsWith('browser') || - lines[i].startsWith('track')); + (lines[i]!.startsWith('#') || + lines[i]!.startsWith('browser') || + lines[i]!.startsWith('track')); i++ ) { headerLines.push(lines[i]) @@ -45,13 +45,13 @@ export async function parseBedBuffer(buffer: Buffer) { ]) const rows = [] for (let j = 0; i < lines.length; i++, j++) { - const line = lines[i] + const line = lines[i]! const l = line.split('\t') - const refName = l[0] - const start = +l[1] - const end = +l[2] - const name = l[3] - const score = +l[4] + const refName = l[0]! + const start = +l[1]! + const end = +l[2]! + const name = l[3]! + const score = +l[4]! const strand = parseStrand(l[5]) const extra = l.slice(MAX_BED_COL) diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedpeImport.ts b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedpeImport.ts index 5751953b6c..f3da3f82a2 100644 --- a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedpeImport.ts +++ b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/BedpeImport.ts @@ -11,9 +11,9 @@ export async function parseBedPEBuffer(buffer: Buffer) { for ( ; i < lines.length && - (lines[i].startsWith('#') || - lines[i].startsWith('browser') || - lines[i].startsWith('track')); + (lines[i]!.startsWith('#') || + lines[i]!.startsWith('browser') || + lines[i]!.startsWith('track')); i++ ) { headerLines.push(lines[i]) @@ -43,22 +43,22 @@ export async function parseBedPEBuffer(buffer: Buffer) { ]) const rows = [] for (let j = 0; i < lines.length; i++, j++) { - const line = lines[i] + const line = lines[i]! const l = line.split('\t') - const ref1 = l[0] - const start1 = +l[1] - const end1 = +l[2] - const ref2 = l[3] - const start2 = +l[4] - const end2 = +l[5] - const name = l[6] - const score = +l[7] + const ref1 = l[0]! + const start1 = +l[1]! + const end1 = +l[2]! + const ref2 = l[3]! + const start2 = +l[4]! + const end2 = +l[5]! + const name = l[6]! + const score = +l[7]! const strand1 = parseStrand(l[8]) const strand2 = parseStrand(l[9]) let extra = l.slice(MAX_BEDPE_COL) - let ALT - if (['DUP', 'TRA', 'INV', 'CNV', 'DEL'].includes(extra[0])) { + let ALT: string | undefined + if (['DUP', 'TRA', 'INV', 'CNV', 'DEL'].includes(extra[0] || '')) { ALT = `<${extra[0]}>` if (j < MAX_SET_SCAN) { columns.add('ALT') diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/STARFusionImport.ts b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/STARFusionImport.ts index ca8c7f4583..b686b9a9e7 100644 --- a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/STARFusionImport.ts +++ b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/STARFusionImport.ts @@ -1,7 +1,7 @@ export function parseSTARFusionBuffer(buffer: Buffer) { const str = new TextDecoder('utf8').decode(buffer) const lines = str.split(/\n|\r\n/) - const header = lines[0].slice(1).split('\t') + const header = lines[0]?.slice(1).split('\t') || [] return { rows: lines .slice(1) diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/VcfImport.ts b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/VcfImport.ts index 89a61c027a..348ccaff6c 100644 --- a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/VcfImport.ts +++ b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/VcfImport.ts @@ -10,7 +10,7 @@ function getRows(lines: string[], vcfParser: VCF) { .map(f => f.trim()) .map(e => { const [key, val = 'true'] = e.split('=') - const k = `INFO.${key.trim()}` + const k = `INFO.${key!.trim()}` keys.add(k) return [k, val.trim()] }) || [], @@ -45,7 +45,7 @@ export function parseVcfBuffer(buffer: Buffer) { .filter(f => !!f) const headerLines = [] let i = 0 - for (; i < lines.length && lines[i].startsWith('#'); i++) { + for (; i < lines.length && lines[i]!.startsWith('#'); i++) { headerLines.push(lines[i]) } const header = headerLines.join('\n') diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/util.ts b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/util.ts index c861c03fc1..b47ca989ca 100644 --- a/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/util.ts +++ b/plugins/spreadsheet-view/src/SpreadsheetView/importAdapters/util.ts @@ -12,7 +12,7 @@ import VCF, { parseBreakend } from '@gmod/vcf' import { locationLinkClick } from '../components/util' import { SpreadsheetModel } from '../models/Spreadsheet' -export function parseStrand(strand: string) { +export function parseStrand(strand?: string) { if (strand === '+') { return 1 } else if (strand === '-') { @@ -83,8 +83,8 @@ function getBreakpoints(feature: Feature) { const alt = feature.get('ALT')?.[0] const bnd = alt ? parseBreakend(alt) : undefined - let endPos - let mateRefName: string | undefined + let endPos: number + let mateRefName: string // a VCF breakend feature if (alt === '') { @@ -93,12 +93,14 @@ function getBreakpoints(feature: Feature) { mateRefName = INFO.CHR2[0] } else if (bnd?.MatePosition) { const matePosition = bnd.MatePosition.split(':') - endPos = +matePosition[1] - 1 - mateRefName = matePosition[0] + endPos = +matePosition[1]! - 1 + mateRefName = matePosition[0]! } else if (feature.get('mate')) { const mate = feature.get('mate') mateRefName = mate.refName endPos = mate.start + } else { + throw new Error('unknown mate') } return [ diff --git a/plugins/spreadsheet-view/src/SpreadsheetView/models/ImportWizard.ts b/plugins/spreadsheet-view/src/SpreadsheetView/models/ImportWizard.ts index 78e8fad130..fecd5807da 100644 --- a/plugins/spreadsheet-view/src/SpreadsheetView/models/ImportWizard.ts +++ b/plugins/spreadsheet-view/src/SpreadsheetView/models/ImportWizard.ts @@ -8,7 +8,6 @@ import { import { GenericFilehandle } from 'generic-filehandle' // locals -import { SpreadsheetViewStateModel } from './SpreadsheetView' import { autorun } from 'mobx' import { getFileType, getFilename } from '../components/util' @@ -143,10 +142,6 @@ function stateModelFactory() { self.fileType as keyof typeof fileTypeParsers ]() - if (!typeParser) { - throw new Error(`cannot open files of type '${self.fileType}'`) - } - const { unzip } = await import('@gmod/bgzf-filehandle') const { pluginManager } = getEnv(self) const f = openLocation(spreadsheetFilehandle, pluginManager) @@ -162,7 +157,7 @@ function stateModelFactory() { const buffer = await f.readFile() const buf2 = self.requiresUnzip ? await unzip(buffer) : buffer const spreadsheet = await typeParser(buf2) - getParent(self).displaySpreadsheet( + getParent(self).displaySpreadsheet( spreadsheet, self.selectedAssemblyName, ) diff --git a/plugins/sv-inspector/src/LaunchSvInspectorView/index.ts b/plugins/sv-inspector/src/LaunchSvInspectorView/index.ts index ebdfddab0a..834b371a11 100644 --- a/plugins/sv-inspector/src/LaunchSvInspectorView/index.ts +++ b/plugins/sv-inspector/src/LaunchSvInspectorView/index.ts @@ -15,13 +15,7 @@ export default function LaunchSvInspectorViewF(pluginManager: PluginManager) { assembly: string uri: string }) => { - // add view, make typescript happy with return type const view = session.addView('SvInspectorView') as SvInspectorViewModel - - if (!view) { - throw new Error('Failed to initialize view') - } - view.spreadsheetView.importWizard.setSelectedAssemblyName(assembly) view.spreadsheetView.importWizard.setSpreadsheetFilehandle({ uri, diff --git a/plugins/sv-inspector/src/SvInspectorView/components/SvInspectorView.tsx b/plugins/sv-inspector/src/SvInspectorView/components/SvInspectorView.tsx index f31e0339dd..c98b35539e 100644 --- a/plugins/sv-inspector/src/SvInspectorView/components/SvInspectorView.tsx +++ b/plugins/sv-inspector/src/SvInspectorView/components/SvInspectorView.tsx @@ -61,6 +61,7 @@ const SvInspectorView = observer(function ({ onDrag={(_, total) => { circularView.setWidth(initialCircWidth + total) spreadsheetView.setWidth(initialSpreadsheetWidth - total) + return undefined }} onMouseDown={() => { setInitialSpreadsheetWidth(spreadsheetView.width) diff --git a/plugins/sv-inspector/src/SvInspectorView/index.ts b/plugins/sv-inspector/src/SvInspectorView/index.ts index 00a1f7093a..5e57212a36 100644 --- a/plugins/sv-inspector/src/SvInspectorView/index.ts +++ b/plugins/sv-inspector/src/SvInspectorView/index.ts @@ -20,6 +20,9 @@ async function defaultOnChordClick( 'BreakpointSplitView', ) as BreakpointSplitViewType const [assemblyName] = view.assemblyNames + if (!assemblyName) { + throw new Error('error trying to understand what assembly to use') + } const viewSnapshot = await viewType.snapshotFromBreakendFeature( feature, assemblyName, diff --git a/plugins/sv-inspector/src/SvInspectorView/models/SvInspectorView.ts b/plugins/sv-inspector/src/SvInspectorView/models/SvInspectorView.ts index 2ee52b3390..5ffc5bc7ff 100644 --- a/plugins/sv-inspector/src/SvInspectorView/models/SvInspectorView.ts +++ b/plugins/sv-inspector/src/SvInspectorView/models/SvInspectorView.ts @@ -154,7 +154,8 @@ function SvInspectorViewF(pluginManager: PluginManager) { { type: 'ChordVariantDisplay', displayId: `sv-inspector-variant-track-chord-display-${self.id}`, - onChordClick: `jexl:defaultOnChordClick(feature, track, pluginManager)`, + onChordClick: + 'jexl:defaultOnChordClick(feature, track, pluginManager)', renderer: { type: 'StructuralVariantChordRenderer', }, @@ -308,7 +309,7 @@ function SvInspectorViewF(pluginManager: PluginManager) { circularView.hideTrack(t.configuration.trackId), ) // put our track in as the only track - if (assemblyName && featuresCircularTrackConfiguration) { + if (assemblyName) { circularView.addTrackConf(featuresCircularTrackConfiguration) } }),