JBrowse 2 · Build Your Own examples

Gene lanes across genomes

Twelve E. coli genomes under one view, joined on gene symbol.

View source — 117 lines
import {
  EmbedProvider,
  Legend,
  LocationBox,
  NavButton,
  Scalebar,
  Toolbar,
  TrackStack,
} from '@jbrowse/display-ui/embed'
import { useCreateViewState } from '@jbrowse/react-app2'
import { observer } from 'mobx-react'

import type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'

const base = 'https://jbrowse.org/demos/ecoli_orthologs'

const genomes = [
  'MG1655',
  'DH10B',
  'Sakai',
  'EDL933',
  'CFT073',
  'UTI89',
  'S88',
  'UMN026',
  'IAI39',
  'IAI1',
  '55989',
  'ED1a',
]

const loci = [
  { label: 'atp operon', loc: 'NC_000913.3:3,910,000-3,925,000' },
  { label: 'O-antigen cluster', loc: 'NC_000913.3:2,095,000-2,115,000' },
]

const Loci = observer(function Loci({ view }: { view: LinearGenomeViewModel }) {
  return (
    <Toolbar>
      <LocationBox view={view} />
      {loci.map(({ label, loc }) => (
        <NavButton key={label} view={view} loc={loc}>
          {label}
        </NavButton>
      ))}
    </Toolbar>
  )
})

const GeneLanes = observer(function GeneLanes() {
  const state = useCreateViewState({
    config: {
      assemblies: genomes.map(name => ({
        name,
        uri: `${base}/${name}.chrom.sizes`,
      })),
      tracks: [
        ...genomes.map(name => ({
          trackId: `${name}_genes`,
          name: `${name} genes`,
          assemblyNames: [name],
          uri: `${base}/${name}.gff.gz`,
        })),
        {
          type: 'SyntenyTrack',
          trackId: 'orthologs',
          name: 'E. coli orthologs by gene symbol',
          assemblyNames: genomes,
          adapter: {
            type: 'MCScanBlocksAdapter',
            mcscanBlocksLocation: { uri: `${base}/ecoli.blocks.gz` },
            blockAssemblies: genomes,
            bedLocations: genomes.map(name => ({
              uri: `${base}/${name}.bed.gz`,
            })),
          },
          displays: [
            {
              type: 'MultiWaySyntenyDisplay',
              displayId: 'orthologs-MultiWaySyntenyDisplay',
              color: { field: 'cluster' },
              height: 330,
              showLegend: false,
            },
          ],
        },
      ],
      defaultSession: {
        name: 'gene lanes',
        views: [
          {
            type: 'LinearGenomeView',
            assembly: 'MG1655',
            loc: loci[0]!.loc,
            tracks: ['orthologs'],
          },
        ],
      },
    },
  })
  if (!state) {
    return null
  }
  const { session } = state
  const view = session.views[0] as LinearGenomeViewModel
  return (
    <EmbedProvider session={session}>
      <Loci view={view} />
      <Legend view={view} trackId="orthologs" style={{ paddingBottom: 6 }} />
      <TrackStack view={view}>
        <Scalebar view={view} />
      </TrackStack>
    </EmbedProvider>
  )
})

export default GeneLanes