JBrowse 2 · Build Your Own examples

Track settings

A Color by menu, a legend toggle and a read-height slider.

A Color by menu, and the legend it raises

View source — 120 lines
import { SessionPaletteProvider } from '@jbrowse/core/ui/PaletteContext'
import { DisplayUIProvider } from '@jbrowse/display-ui'
import { RegionSeams, TrackStack } from '@jbrowse/display-ui/embed'
import { pickColorOptions } from '@jbrowse/plugin-alignments'
import { useCreateViewState } from '@jbrowse/react-linear-genome-view2'
import { observer } from 'mobx-react'

import type { LinearAlignmentsDisplayModel } from '@jbrowse/plugin-alignments'

const schemes = pickColorOptions(
  'normal',
  'strand',
  'pairOrientation',
  'insertSizeAndOrientation',
  'mappingQuality',
)

const Settings = observer(function Settings({
  display,
}: {
  display: LinearAlignmentsDisplayModel
}) {
  return (
    <div
      style={{
        display: 'flex',
        flexWrap: 'wrap',
        gap: 16,
        paddingBottom: 8,
        fontSize: '0.85rem',
      }}
    >
      <label>
        Color by{' '}
        <select
          value={display.colorBy.type}
          onChange={event => {
            display.setColorBy({
              type: event.target.value as (typeof schemes)[number]['type'],
            })
          }}
        >
          {schemes.map(({ type, label }) => (
            <option key={type} value={type}>
              {label}
            </option>
          ))}
        </select>
      </label>
      <label>
        <input
          type="checkbox"
          checked={display.showLegend}
          onChange={event => {
            display.setShowLegend(event.target.checked)
          }}
        />
        Show legend
      </label>
      <label>
        Read height{' '}
        <input
          type="range"
          min={2}
          max={12}
          value={display.featureHeight}
          onChange={event => {
            display.setFeatureHeight(Number(event.target.value))
          }}
        />{' '}
        {display.featureHeight}px
      </label>
    </div>
  )
})

const TrackSettings = observer(function TrackSettings() {
  const state = useCreateViewState({
    assembly: {
      name: 'hg38',
      uri: 'https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz',
      refNameAliases: {
        uri: 'https://jbrowse.org/genomes/GRCh38/hg38_aliases.txt',
      },
      geneticCodes: { chrM: 2 },
    },
    tracks: [
      {
        trackId: 'na12878_exome',
        name: 'NA12878 exome reads',
        uri: 'https://s3.amazonaws.com/jbrowse.org/genomes/GRCh38/alignments/NA12878/NA12878.alt_bwamem_GRCh38DH.20150826.CEU.exome.cram',
        displayDefaults: { height: 150 },
      },
    ],
    init: {
      loc: 'chr17:43,044,295..43,052,295 chr17:43,090,000..43,098,000',
      tracks: ['na12878_exome'],
    },
  })
  if (!state) {
    return null
  }
  const { session } = state
  const { view } = session
  const display = view.getTrack('na12878_exome')?.activeDisplay as
    | LinearAlignmentsDisplayModel
    | undefined
  return (
    <SessionPaletteProvider session={session}>
      <DisplayUIProvider>
        {display ? <Settings display={display} /> : null}
        <TrackStack view={view}>
          <RegionSeams view={view} />
        </TrackStack>
      </DisplayUIProvider>
    </SessionPaletteProvider>
  )
})

export default TrackSettings