Skip to content

Commit

Permalink
Allow searching by gene name using linear synteny view
Browse files Browse the repository at this point in the history
  • Loading branch information
cmdcolin committed Nov 29, 2023
1 parent 0b51595 commit e2f2fbd
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 37 deletions.
11 changes: 8 additions & 3 deletions plugins/linear-comparative-view/src/LaunchLinearSyntenyView.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import PluginManager from '@jbrowse/core/PluginManager'
import { AbstractSessionModel } from '@jbrowse/core/util'
import { LinearSyntenyViewModel } from './LinearSyntenyView/model'
import { when } from 'mobx'

// locals
import { LinearSyntenyViewModel } from './LinearSyntenyView/model'
type LSV = LinearSyntenyViewModel

export default function LaunchLinearSyntenyView(pluginManager: PluginManager) {
Expand Down Expand Up @@ -48,8 +49,12 @@ export default function LaunchLinearSyntenyView(pluginManager: PluginManager) {
await Promise.all(
views.map(async (data, idx) => {
const view = model.views[idx]
const { loc, tracks = [] } = data
await view.navToLocString(loc)
const { assembly, loc, tracks = [] } = data
const asm = await assemblyManager.waitForAssembly(assembly)
if (!asm) {
throw new Error(`Assembly ${data.assembly} failed to load`)
}
await view.navToSearch({ input: loc, assembly: asm })
tracks.forEach(track => tryTrack(view, track, idsNotFound))
}),
)
Expand Down
22 changes: 22 additions & 0 deletions plugins/linear-genome-view/src/LinearGenomeView/model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ import MenuOpenIcon from '@mui/icons-material/MenuOpen'
import MiniControls from './components/MiniControls'
import Header from './components/Header'
import { generateLocations, parseLocStrings } from './util'
import { Assembly } from '@jbrowse/core/assemblyManager/assembly'
import { handleSelectedRegion } from '../searchUtils'
// lazies
const ReturnToImportFormDialog = lazy(
() => import('@jbrowse/core/ui/ReturnToImportFormDialog'),
Expand Down Expand Up @@ -1315,6 +1317,26 @@ export function stateModelFactory(pluginManager: PluginManager) {
)
},

/**
* #action
* Performs a text index search, and navigates to it immediately if a
* single result is returned. Will pop up a search dialog if multiple
* results are returned
*/
async navToSearch({
input,
assembly,
}: {
input: string
assembly: Assembly
}) {
await handleSelectedRegion({
input,
assembly,
model: self as LinearGenomeViewModel,
})
},

/**
* #action
* Similar to `navToLocString`, but accepts parsed location objects
Expand Down
55 changes: 25 additions & 30 deletions plugins/linear-genome-view/src/searchUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,38 +41,33 @@ export async function handleSelectedRegion({
model: LinearGenomeViewModel
assembly: Assembly
}) {
try {
const allRefs = assembly?.allRefNamesWithLowerCase || []
const assemblyName = assembly.name
if (input.split(' ').every(entry => checkRef(entry, allRefs))) {
await model.navToLocString(input, assembly.name)
} else {
const searchScope = model.searchScope(assemblyName)
const { textSearchManager } = getSession(model)
const results = await fetchResults({
queryString: input,
searchType: 'exact',
searchScope,
rankSearchResults: model.rankSearchResults,
textSearchManager,
assembly,
})
const allRefs = assembly?.allRefNamesWithLowerCase || []
const assemblyName = assembly.name
if (input.split(' ').every(entry => checkRef(entry, allRefs))) {
await model.navToLocString(input, assembly.name)
} else {
const searchScope = model.searchScope(assemblyName)
const { textSearchManager } = getSession(model)
const results = await fetchResults({
queryString: input,
searchType: 'exact',
searchScope,
rankSearchResults: model.rankSearchResults,
textSearchManager,
assembly,
})

if (results.length > 1) {
model.setSearchResults(results, input.toLowerCase(), assemblyName)
} else if (results.length === 1) {
await navToOption({
option: results[0],
model,
assemblyName,
})
} else {
await model.navToLocString(input, assemblyName)
}
if (results.length > 1) {
model.setSearchResults(results, input.toLowerCase(), assemblyName)
} else if (results.length === 1) {
await navToOption({
option: results[0],
model,
assemblyName,
})
} else {
await model.navToLocString(input, assemblyName)
}
} catch (e) {
console.error(e)
getSession(model).notify(`${e}`, 'warning')
}
}

Expand Down
8 changes: 4 additions & 4 deletions products/jbrowse-web/src/tests/JBrowse.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jest.mock('../makeWorkerInstance', () => () => {})

setup()

const delay = { timeout: 15000 }
const delay = { timeout: 30000 }

beforeEach(() => {
doBeforeEach()
Expand Down Expand Up @@ -70,7 +70,7 @@ test('assembly aliases', async () => {
await findByTestId(hts('volvox_filtered_vcf_assembly_alias'), {}, delay),
)
await findByTestId('box-test-vcf-604453', {}, delay)
}, 15000)
}, 30000)

test('nclist track test with long name', async () => {
const { view, findByTestId, findByText } = await createView()
Expand Down Expand Up @@ -98,7 +98,7 @@ test('test sharing', async () => {
expect(
((await findByLabelText('URL', {}, delay)) as HTMLInputElement).value,
).toBe('http://localhost/?session=share-abc&password=123')
}, 15000)
}, 30000)

test('looks at about this track dialog', async () => {
const { findByTestId, findAllByText, findByText } = await createView()
Expand All @@ -108,4 +108,4 @@ test('looks at about this track dialog', async () => {
fireEvent.click(await findByTestId('track_menu_icon', {}, delay))
fireEvent.click(await findByText('About track'))
await findAllByText(/SQ/, {}, delay)
}, 15000)
}, 30000)

0 comments on commit e2f2fbd

Please sign in to comment.