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 3e5cd80
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 33 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

0 comments on commit 3e5cd80

Please sign in to comment.