# DotplotView

Auto-generated from the @jbrowse/mobx-state-tree model in the source — see the [developer guide](https://jbrowse.org/jb2/docs/developer_guide/) for concepts. Provided by the `dotplot-view` plugin. [View source](https://github.com/GMOD/jbrowse-components/blob/main/plugins/dotplot-view/src/DotplotView/model.ts).

## Example usage

Hand-authored under `defaultSession.views`, with every setting written
directly on the view object. `views` lists the two assemblies on the axes and
`tracks` the synteny track(s) to plot (self-vs-self is allowed):

```js
{
  type: 'DotplotView',
  views: [{ assembly: 'hg38' }, { assembly: 'mm10' }],
  tracks: ['hg38_vs_mm10.paf'],
  color: { field: 'query' },
}
```

`autoDiagonalize` and a per-axis `loc` on each `views` entry are the other
launch keys; everything else is a property below.

Plots the alignments between two assemblies, one on each axis, as a dot
plot.

Each section ends with the members a composed model contributes, linked to the page that documents them.

## Properties

| Member | Description |
| --- | --- |
| **id**<br><code>id: ElementId</code> |  |
| **type**<br><code>type: types.literal('DotplotView')</code> |  |
| **height**<br><code>height: types.stripDefault(types.number, defaultHeight)</code> | the height of the plot in pixels |
| **trackSelectorType**<br><code>trackSelectorType: types.stripDefault(types.string, 'hierarchical')</code> | vestigial: the hierarchical selector is the only one that exists, so this value is ignored. Retained because saved sessions and share links persist it. |
| **assemblyNames**<br><code>assemblyNames: types.stripDefault(types.array(types.string), [])</code> | the two assemblies being compared, horizontal axis first. A spec normally names these per axis instead, as `views[0].assembly` and `views[1].assembly`. |
| **drawCigar**<br><code>drawCigar: types.stripDefault(types.boolean, true)</code> | resolve each alignment's CIGAR into the drawn shape rather than plotting it as a single straight segment |
| **showGridlines**<br><code>showGridlines: types.stripDefault(types.boolean, true)</code> | carry each axis' ruler ticks across the plot as faint lines, the way LinearGenomeView's gridlines carry its own down over the tracks |
| **showTickLabels**<br><code>showTickLabels: types.stripDefault(types.boolean, true)</code> | number each axis' major ticks; off keeps the tick marks and the chromosome names |
| **lockAspectRatio**<br><code>lockAspectRatio: types.stripDefault(types.boolean, false)</code> | When true, hview and vview are kept at the same bpPerPx so the dotplot stays square. Wheel zoom already preserves the ratio; box-zoom and other independent ops trigger an autorun resync. |
| **lineWidth**<br><code>lineWidth: types.stripDefault(types.number, DEFAULT_LINE_WIDTH)</code> | Line width in CSS pixels of every alignment in the plot |
| **minIdentity**<br><code>minIdentity: types.stripDefault(types.number, DEFAULT_MIN_IDENTITY)</code> | Hide alignments whose sequence identity is below this fraction (0-1), enforced per feature in buildLineSegments beside minAlignmentLength. A feature carrying no identity at all is kept at every threshold — the alternative blanks a plot whose adapter simply never reported one. |
| **hview**<br><code>hview: types.optional(DotplotHView, {})</code> | the horizontal axis, as a full 1D view state. A spec writes `views[0]` instead, which the launcher resolves into this. |
| **vview**<br><code>vview: types.optional(DotplotVView, {})</code> | the vertical axis, the counterpart to `hview`. A spec writes `views[1]`. |
| **tracks**<br><code>tracks: types.array(pm.pluggableMstType('track', 'stateModel'))</code> |  |
| **launch**<br><code>launch: types.frozen&lt;LaunchInput&lt;DotplotViewCommands&gt; &#124; undefined&gt;()</code> | transient launch state: the settings written on the view object that need resolving before they can be view state — the two axis assemblies, track recipes, highlights. `preProcessSnapshot` moves them here off the snapshot, the afterAttach autorun applies them and clears this, so a saved session never retains it. Not written by hand: author every setting directly on the view. |

8 inherited properties from 4 models:

From [BaseViewModel](../baseviewmodel): [`displayName`](../baseviewmodel#property-displayname), [`minimized`](../baseviewmodel#property-minimized)

From [SyntenyViewMixin](../syntenyviewmixin): [`lodMode`](../syntenyviewmixin#property-lodmode)

From [SyntenyColorsMixin](../syntenycolorsmixin): [`opacity`](../syntenycolorsmixin#property-opacity), [`minAlignmentLength`](../syntenycolorsmixin#property-minalignmentlength)

From [TrackColorsMixin](../trackcolorsmixin): [`color`](../trackcolorsmixin#property-color), [`trackColors`](../trackcolorsmixin#property-trackcolors), [`hideUnlabelled`](../trackcolorsmixin#property-hideunlabelled)


## Volatiles

| Member | Description |
| --- | --- |
| **volatileWidth**<br><code>number &#124; undefined</code> |  |
| **volatileError**<br><code>unknown</code> |  |
| **cursorMode**<br><code>string</code> | these are 'personal preferences', stored in volatile and loaded/written to localStorage |

17 inherited volatiles from 6 models:

From [BaseViewModel](../baseviewmodel): [`width`](../baseviewmodel#volatile-width), [`bodyMounted`](../baseviewmodel#volatile-bodymounted)

From [RenderLifecycleMixin](../renderlifecyclemixin): [`canvasDrawn`](../renderlifecyclemixin#volatile-canvasdrawn), [`paintCount`](../renderlifecyclemixin#volatile-paintcount), [`currentRenderingBackend`](../renderlifecyclemixin#volatile-currentrenderingbackend), [`renderTick`](../renderlifecyclemixin#volatile-rendertick), [`autorunsInstalled`](../renderlifecyclemixin#volatile-autorunsinstalled), [`renderError`](../renderlifecyclemixin#volatile-rendererror), [`offScreen`](../renderlifecyclemixin#volatile-offscreen)

From [DiagonalizeProgressMixin](../diagonalizeprogressmixin): [`awaitingAutoDiagonalize`](../diagonalizeprogressmixin#volatile-awaitingautodiagonalize), [`pendingAutoDiagonalize`](../diagonalizeprogressmixin#volatile-pendingautodiagonalize), [`diagonalizeStatus`](../diagonalizeprogressmixin#volatile-diagonalizestatus), [`diagonalizeCancel`](../diagonalizeprogressmixin#volatile-diagonalizecancel), [`diagonalizeError`](../diagonalizeprogressmixin#volatile-diagonalizeerror)

From [ImportFormSyntenyMixin](../importformsyntenymixin): [`importFormSyntenyTrackSelections`](../importformsyntenymixin#volatile-importformsyntenytrackselections)

From [SyntenyViewMixin](../syntenyviewmixin): [`colorLegendDismissedFor`](../syntenyviewmixin#volatile-colorlegenddismissedfor)

From [TrackColorsMixin](../trackcolorsmixin): [`seenAttributeRanges`](../trackcolorsmixin#volatile-seenattributeranges)


## Getters

| Member | Description |
| --- | --- |
| **ownTracks**<br><code>any[]</code> | The census entry for this view: the tracks it holds itself. Declared rather than derived — see `BaseViewModel.ownTracks`. |
| **width**<br><code>number</code> |  |
| **borderX**<br><code>number</code> | Left margin: fits the vertical (vview) axis labels. Derived purely from that axis's regions + zoom — never from viewWidth — so it can't feed back through viewWidth = width - borderX into a render loop. |
| **borderY**<br><code>number</code> | Bottom margin: fits the horizontal (hview) axis labels. See borderX. |
| **pendingLaunch**<br><code>LaunchInput&lt;DotplotViewCommands &amp; { unknown?: Record&lt;string, unknown&gt; &#124; undefined; malformed?: Record&lt;string, unknown&gt; &#124; undefined; legacyInit?: boolean &#124; undefined; } &amp; IStateTreeNode&lt;IType&lt;LaunchInput&lt;DotplotViewCommands&gt; &#124; undefined, LaunchInput&lt;DotplotViewCommands&gt; &#124; undefined, LaunchInput&lt;DotplotViewCommands&gt; &#124; undefined&gt;&gt;&gt; &#124; undefined</code> | the launch state that still has something to apply — the gate every loading and import-form path below reads. |
| **assemblyErrors**<br><code>string &#124; undefined</code> |  |
| **highlights**<br><code>HighlightType[]</code> | the session's highlights on either axis' assembly |
| **assembliesInitialized**<br><code>boolean</code> |  |
| **axisAssemblyError**<br><code>Error &#124; undefined</code> | A dotplot plots one assembly against another, so anything but two names here cannot lay out. `initializeDisplayedRegions` walks the two axes in step with this array, so one name leaves the other axis with no regions and `initialized` never comes true — the view sat on its spinner saying "Loading" forever, with the assembly it was supposedly waiting for already loaded. Extra names fail the other way: nothing reads past the second, so a third assembly is not plotted and nothing says so.<br><br>Only reachable from a hand-authored snapshot — `setAssemblyNames` writes both, and `applyInit` already rejects an init naming one — and that snapshot is the case this error reports. Zero names is not an error: it is the import form. |
| **error**<br><code>unknown</code> | The view's terminal state: whatever the import form's submit threw, else a pair of axes that cannot lay out, else whatever the assemblies did. Declared here rather than beside `menuItems` so every reader below is the same expression — `showImportForm` and `showLoading` each used to re-spell it, and `showLoading` spelled it as a two-term `&&` that a third source of error would have to be added to in three places. |
| **initialized**<br><code>boolean</code> |  |
| **hasSomethingToShow**<br><code>boolean</code> |  |
| **initPending**<br><code>boolean</code> | An `init` blob that has not been applied yet — `installInitAutorun` clears it as the last thing an apply pass does. The plot is assembling itself: the axes can already exist, and be initialized, while the tracks or the region restriction are still to come, which is why the `settled` gate reads this.<br><br>Read by `settled`, deliberately **not** by `showLoading` — a plot whose axes are up is worth showing while the rest lands. LGV's equivalent is `awaitingInitNavigation`, a narrower thing (init set and nothing on screen at all) that it does fold into `showLoading`; it used to share this name, and the two disagree exactly where a reader would assume they agree. |
| **showImportForm**<br><code>boolean</code> | Whether to show the import form |
| **showLoading**<br><code>boolean</code> | Whether to show a loading indicator instead of the import form or view |
| **loadingAssembly**<br><code>(ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; { getCanonicalRefName2(refName: string): string; isValidRefName(refName: string): boolean; } &amp; { isCircularRefName(refName: string): boolean; getRefNamePosition(refName: string): number &#124; undefined; getAliasesForRefName(refName: string): string[]; getRefNameMapForAdapter(adapterConf: AdapterConf, options: BaseOptions): Promise&lt;…&gt;; getRefNameMismatch(adapterCacheKey: string): RefNameMismatch &#124; undefined; } &amp; IStateTreeNode&lt;…&gt;) &#124; undefined</code> | The assembly whose load the spinner is waiting on. `init` names them before assemblyNames is materialized, so it is the source until then. |
| **loading**<br><code>ViewLoading &#124; undefined</code> | What the loading screen says while `showLoading`, read off the assembly whose load is the wait; undefined otherwise. |
| **status**<br><code>ViewStatus</code> | The view's lifecycle as one value — ready, error, loading or noRegions — for a host that draws its own chrome and has to render all four. Same shape and same precedence as the linear view's, through `computeViewStatus`. |
| **viewWidth**<br><code>number</code> | Plot area width. Floored at 0: the axis borders have their own MIN_BORDER floor, so a container narrower than that would otherwise yield a negative canvas dimension and a negative maxBpPerPx. |
| **viewHeight**<br><code>number</code> | Plot area height. Floored at 0, see viewWidth. |
| **gridlinesEmpty**<br><code>boolean</code> | The setting is on and neither axis has a ruler to cast — a ticked checkbox doing nothing observable, which the menu says out loud rather than looking broken. The whole-genome view is this. |
| **hasVisibleRegions**<br><code>boolean</code> | Both axes have a region on screen, so the plot has a grid to draw and a first block to anchor its backdrop rect on. The grid reads the two block lists' heads, which only this makes safe. |
| **views**<br><code>(ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; { readonly width: number; readonly maxBpPerPx: number; readonly labelMarginPx: number; toScreenPx(alongPx: number): number; fromScreenPx(screenPx: number): number; readonly regionLines: AxisLine[]; readonly gridlines: TickLine[]; } &amp; IStateTreeNode&lt;…&gt;)[]</code> |  |
| **sharedFitBpPerPx**<br><code>number</code> | The zoom-out limit both axes share under `lockAspectRatio`: one bpPerPx has to fit the LONGER genome, so it is the larger of the two axes' own fits. Read back by each axis as its `maxBpPerPx` (see `axisMaxBpPerPx`), so every route to a zoom — the buttons, the wheel, box-zoom, `showAllRegions` — clamps against the same ceiling. |
| **dotplotDisplays**<br><code>DotplotDisplayModel[]</code> | Every DotplotDisplay under this view's tracks. Filtered by `type` rather than taken as `tracks[i].displays[0]`: `showTrack` only ever builds one view-compatible display, but a hand-written or legacy session snapshot is hydrated verbatim, and an empty or foreign `displays` array put an `undefined` into this list that every consumer below dereferences — `settled` and `geometryByDisplayKey` both crash the view on it. Same spelling as the synteny level's `linearSyntenyDisplays`.<br><br>Not index-aligned with `tracks`, so a consumer that wants a display's track reads `display.parentTrack` rather than `tracks[i]`. |
| **trackWarnings**<br><code>TrackWarning[]</code> | Every loaded track's render warnings, under the name to report them by. Shared with the synteny view's own report (see `collectTrackWarnings` for why the name has to come off the display's `parentTrack`), and a cached computed rather than a render-time flatMap: the header that reads it re-renders on every pointermove of a selection drag, and resolving a name is a `getConf` per track. |
| **surfaceReadiness**<br><code>ComparativeSurface</code> | The plot rect as the displays drawing onto it see it: first paint, plus the two flags that mean what is on screen is not the answer yet. Published here so a display reads one field, and so `settled` below and every display's `displayPhase` are computed from the same three values. |
| **displayPhase**<br><code>DisplayStatusPhase</code> | What the shared canvas publishes as `data-display-phase`: the ranking over the plots drawing onto it. Its twin `settled` below is the stricter question — see `comparativeReadiness`. |
| **settled**<br><code>boolean</code> | Canvas has painted and no display is still fetching, so what's on screen is the final settled content. Drives the `data-display-drawn` on `dotplot_webgl_canvas` that screenshot capture and the browser-test suites wait on — so it must mean "done", not just "first paint".<br><br>Not the same question as "is every display finished" — see `comparativeReadiness`, which holds both and says why an error answers them differently. |
| **hoveredDisplay**<br><code>DotplotDisplayModel &#124; undefined</code> | The one track that owns the plot's hover, or undefined. At most one can: `setHoveredFeature` points a single display at the hit and clears every other in the same batch.<br><br>Resolved here so the two readers below — and the components — take the view they already have rather than looping the tracks themselves. |
| **hoveredTooltipLines**<br><code>string[] &#124; undefined</code> | The hovered alignment's tooltip lines, or undefined when nothing is hovered. |
| **hoveredHighlight**<br><code>DotplotHoverHighlight &#124; undefined</code> | The hovered alignment's restroke geometry — see `DotplotDisplay.hoveredFeatureHighlight`. |
| **geometryByDisplayKey**<br><code>Map&lt;number, DotplotGeometryData&gt;</code> | Per-display GPU geometry keyed by `displayKey`. The upload autorun diffs this map: new entries upload, vanished entries evict. Drawn in insertion order, so tracks paint bottom-of-the-list last. |
| **plotTransform**<br><code>{ viewBpH: number; viewBpV: number; bpPerPxHInv: number; bpPerPxVInv: number; viewHeight: number; }</code> | The cumBp -> plot px reconstruction, as the numbers everything that draws or hit-tests this plot runs on: the viewport-start cumBp per axis, the inverse bpPerPx per axis, and the plot height the v axis is flipped through (it lays out bottom-up).<br><br>Its own getter because three readers want exactly these and nothing else — the render state below, the pick's exact test, and `DotplotDisplay.hoveredFeatureHighlight`. Taking them off `dotplotRenderState` also subscribes to `alpha`, `lineWidth` and the display-key list, so an opacity drag rebuilt the hover path.<br><br>`viewHeight` belongs in here and not beside it: this is also what `setupClearHoverOnPlotMove` watches to decide the plot has moved under a stationary cursor, and a height change slides every alignment down the canvas exactly as a pan does. Left out, it was the one way to move the plot that kept the hover pinned to the alignment it no longer pointed at. |
| **dotplotBlocks**<br><code>RenderBlock[]</code> | One canvas-wide block per loaded display, in the map's insertion order, so tracks paint bottom-of-the-list last. An empty list is a real frame, not a skip: the backend clears before drawing, so painting zero displays is what wipes the plot when the last track is hidden. |
| **dotplotRenderState**<br><code>DotplotRenderState</code> | Aggregated per-frame render state — a resolved value, never undefined; "the view isn't measured yet" is the `canRender` precondition below. |
| **canRender**<br><code>boolean</code> | Render-lifecycle precondition (overrides `RenderLifecycleMixin`'s default-true hook): before the axes have regions and a measured width there is nothing to paint against. Gating the autorun pair here lets `dotplotRenderState` stay a resolved getter. |
| **paintInert**<br><code>boolean</code> | Overrides `RenderLifecycleMixin`'s hook: a measured plot with no tracks on it paints nothing this tick and nothing is coming, so it has finished rather than being pending. The backend answers "did content reach the canvas" off the blocks it drew, which is the right answer for a track still fetching and the wrong one for a canvas with nothing to draw on it.<br><br>`initialized` is the other half and is not redundant with `canRender`: an import form has no tracks either, and it is *not* finished — `AppReadyMarkerComparative` pins that its `settled` stays false, and the marker asks its displays rather than this. |

27 inherited getters from 5 models:

From [BaseViewModel](../baseviewmodel): [`rendersDisplays`](../baseviewmodel#getter-rendersdisplays), [`effectiveBodyMounted`](../baseviewmodel#getter-effectivebodymounted), [`ownViews`](../baseviewmodel#getter-ownviews)

From [RenderLifecycleMixin](../renderlifecyclemixin): [`rendersCanvas`](../renderlifecyclemixin#getter-renderscanvas), [`paintSuperseded`](../renderlifecyclemixin#getter-paintsuperseded), [`painted`](../renderlifecyclemixin#getter-painted)

From [SyntenyViewMixin](../syntenyviewmixin): [`hasLodCapableAdapter`](../syntenyviewmixin#getter-haslodcapableadapter), [`showLegend`](../syntenyviewmixin#getter-showlegend), [`legendSpec`](../syntenyviewmixin#getter-legendspec)

From [SyntenyColorsMixin](../syntenycolorsmixin): [`defaultOpacity`](../syntenycolorsmixin#getter-defaultopacity), [`opacitySetting`](../syntenycolorsmixin#getter-opacitysetting), [`opacityFade`](../syntenycolorsmixin#getter-opacityfade), [`opacityLevel`](../syntenycolorsmixin#getter-opacitylevel), [`opacityField`](../syntenycolorsmixin#getter-opacityfield)

From [TrackColorsMixin](../trackcolorsmixin): [`colorSetting`](../trackcolorsmixin#getter-colorsetting), [`colorPaint`](../trackcolorsmixin#getter-colorpaint), [`colorValue`](../trackcolorsmixin#getter-colorvalue), [`colorDomain`](../trackcolorsmixin#getter-colordomain), [`colorRange`](../trackcolorsmixin#getter-colorrange), [`colorableAttributes`](../trackcolorsmixin#getter-colorableattributes), [`attributeRanges`](../trackcolorsmixin#getter-attributeranges), [`colorableTracks`](../trackcolorsmixin#getter-colorabletracks), [`trackColorAssignments`](../trackcolorsmixin#getter-trackcolorassignments), [`colorField`](../trackcolorsmixin#getter-colorfield), [`hasLegendKey`](../trackcolorsmixin#getter-haslegendkey), [`colorLegendChips`](../trackcolorsmixin#getter-colorlegendchips), [`colorScales`](../trackcolorsmixin#getter-colorscales)


## Methods

| Member | Description |
| --- | --- |
| **syntenyTracks**<br><code>() =&gt; ComparativeTrackModel[]</code> | Annotated for the reason `ComparativeTrackModel` documents: the array is `any`. |
| **loadedAttributeRanges**<br><code>() =&gt; Record&lt;string, AttributeRange&gt;[]</code> | Each loaded display's observed attribute spans, which the mixin unions into the domain the legend labels its ramp with. |
| **colorSurface**<br><code>() =&gt; "points"</code> | Flat points, never a CIGAR op. |
| **svgLegendWidth**<br><code>() =&gt; number</code> | The export parks the key beside the plot rather than over it: a diagonalized plot's alignments run into the top-right corner the key would otherwise cover. |
| **getCoords**<br><code>(mousedown: Coord, mouseup: Coord) =&gt; { x1: PxToBpResult; x2: PxToBpResult; y1: PxToBpResult; y2: PxToBpResult; } &#124; undefined</code> | Both corners of a drag rect, in bp on each axis. Undefined for a drag too small to be a selection — the same threshold the interaction hook uses to tell a drag from a click. |
| **pickFeatureAt**<br><code>(x: number, y: number) =&gt; DotplotPlotPickHit &#124; undefined</code> | The alignment under a pointer position (plot px, y downward), across every track on the shared canvas, or undefined.<br><br>Resolved on the model rather than through the rendering backend, which is where this departs from synteny's `backend.pick(...)`: dotplot geometry is already here in absolute cumBp (`display.instanceData`), so this answers with NO backend attached at all — before the first paint, through a context loss that has not recovered, and in a test with no canvas. (Both of synteny's backends implement `pick`, so its hover is not GPU-only either despite `gpuRenderingBackend`'s name; what it cannot do is answer while nothing is attached. It lives in the backend because the projected geometry it indexes does, which also means each backend builds its own index.)<br><br>Nearest wins ACROSS tracks too, ties going to the later track (the one drawn on top) — see `pickDotplotFeature` for why a dotplot answers nearest where a ribbon answers topmost. |
| **getHHighlightCoords**<br><code>(region: { assemblyName?: string &#124; undefined; refName: string; start: number; end: number; }) =&gt; { width: number; left: number; } &#124; undefined</code> | Map a highlight region to {left, width} px on the horizontal axis. left is already screen-offset. Returns undefined when the region isn't on hview's assembly/displayed regions. |
| **getVHighlightCoords**<br><code>(region: { assemblyName?: string &#124; undefined; refName: string; start: number; end: number; }) =&gt; { top: number; height: number; } &#124; undefined</code> | Map a highlight region to {top, height} px on the vertical axis. Returns undefined when the region isn't on vview's assembly/displayed regions. |
| **menuItems**<br><code>() =&gt; ({ label: string; icon: OverridableComponent&lt;SvgIconTypeMap&lt;{}, "svg"&gt;&gt; &amp; { muiName: string; }; onClick: () =&gt; void; type?: undefined; checked?: undefined; } &#124; { label: string; onClick: () =&gt; void; icon: (props: SvgIconProps) =&gt; Element; type?: undefined; checked?: undefined; } &#124; { label: string; icon: OverridableComponent&lt;SvgIconTypeMap&lt;{}, "svg"&gt;&gt; &amp; { muiName: string; }; type: "checkbox"; checked: boolean; onClick: () =&gt; void; })[]</code> |  |

7 inherited methods from 2 models:

From [SyntenyColorsMixin](../syntenycolorsmixin): [`colorableTrackConfigs`](../syntenycolorsmixin#method-colorabletrackconfigs), [`colorableAttributeNames`](../syntenycolorsmixin#method-colorableattributenames), [`legendAlpha`](../syntenycolorsmixin#method-legendalpha)

From [TrackColorsMixin](../trackcolorsmixin): [`legendCigarOps`](../trackcolorsmixin#method-legendcigarops), [`offersReferenceColor`](../trackcolorsmixin#method-offersreferencecolor), [`shapeShowsStrand`](../trackcolorsmixin#method-shapeshowsstrand), [`trackColorFor`](../trackcolorsmixin#method-trackcolorfor)


## Actions

| Member | Description |
| --- | --- |
| **startRenderingBackend**<br><code>(backend: DotplotRenderingBackend) =&gt; void</code> |  |
| **setHoveredFeature**<br><code>(hit: DotplotPlotPickHit &#124; undefined) =&gt; void</code> | Point the whole plot's hover state at one pick hit: the track whose geometry was hit takes the segment index, every other track clears, so `undefined` (a miss) clears the plot. An action rather than a loop in the pointer handler so the N writes land in one MobX batch — and so nothing outside the model has to resolve a `displayKey` to a display. Same shape as the synteny level's `setHoveredFeature`. |
| **setCursorMode**<br><code>(mode: CursorMode) =&gt; void</code> |  |
| **setDrawCigar**<br><code>(flag: boolean) =&gt; void</code> |  |
| **setShowGridlines**<br><code>(flag: boolean) =&gt; void</code> |  |
| **setShowTickLabels**<br><code>(flag: boolean) =&gt; void</code> |  |
| **setLockAspectRatio**<br><code>(flag: boolean) =&gt; void</code> |  |
| **setLineWidth**<br><code>(value: number) =&gt; void</code> |  |
| **setMinIdentity**<br><code>(value: number) =&gt; void</code> |  |
| **clearView**<br><code>() =&gt; void</code> | returns to the import form |
| **setWidth**<br><code>(newWidth: number) =&gt; number</code> |  |
| **setHeight**<br><code>(newHeight: number) =&gt; number</code> |  |
| **setError**<br><code>(e: unknown) =&gt; void</code> |  |
| **setLaunch**<br><code>(launch?: LaunchInput&lt;DotplotViewCommands&gt; &#124; undefined) =&gt; void</code> |  |
| **zoomOut**<br><code>() =&gt; void</code> |  |
| **zoomIn**<br><code>() =&gt; void</code> |  |
| **scrollXY**<br><code>(dx: number, dy: number) =&gt; void</code> | Pan both axes one gesture step. Each delta is in its own axis' scroll direction, not screen px — the vertical axis lays out bottom-up, and both callers (wheel, drag) already hold the flipped value for their own reasons.<br><br>One action rather than two `scroll` calls, because an MST action is a MobX action: unbatched, the render autorun ran twice per pointermove and drew a whole frame against a moved h axis and a stale v one. |
| **zoomAt**<br><code>(factor: number, [x, y]: Coord) =&gt; void</code> | Zoom both axes by `factor`, holding the locus under a plot-area point still. The anchor is the same component-px `Coord` the drag handlers pass around, so each axis takes it through its own `fromScreenPx`, as `getCoords` does.<br><br>Multiplying both axes by one factor keeps wheel zoom ratio-preserving, so the aspect lock never has to correct it. One action, for the reason `scrollXY` documents. |
| **activateTrackSelector**<br><code>() =&gt; Widget</code> |  |
| **showTrack**<br><code>(trackId: string, initialSnapshot?: object, displayInitialSnapshot?: DisplayInitialSnapshot, inlineConf?: Record&lt;string, unknown&gt; &#124; undefined) =&gt; any</code> | `initialSnapshot` is annotated rather than inferred from its default. A bare `{}` accepts a number, so this signature satisfied `applySyntenyTrackSelections`' `(trackId, level) => void` callback — passing `model.showTrack` there typechecked and handed the pair index over as the new track's snapshot. |
| **hideTrack**<br><code>(trackId: string) =&gt; boolean</code> |  |
| **toggleTrack**<br><code>(trackId: string) =&gt; boolean</code> |  |
| **setAssemblyNames**<br><code>(x: string, y: string) =&gt; void</code> |  |
| **zoomInToMouseCoords**<br><code>(mousedown: Coord, mouseup: Coord) =&gt; void</code> | zooms into clicked and dragged region. Under `lockAspectRatio` both axes take the larger of the two fits, so the whole box stays in view on the axis whose plot dimension is shorter. |
| **addHighlightFromMouseCoords**<br><code>(mousedown: Coord, mouseup: Coord) =&gt; void</code> | highlights the clicked and dragged region: the x-span becomes a band on the horizontal axis and the y-span a band on the vertical axis, so the drag rect is their intersection |
| **showAllRegions**<br><code>() =&gt; void</code> |  |
| **initializeDisplayedRegions**<br><code>() =&gt; void</code> |  |
| **openInCircularSyntenyView**<br><code>() =&gt; void</code> | a circular view of the two axes' genomes with this view's tracks as ribbons, the second genome reordered to follow the first, and this view's color and length filter |
| **launchLinearSyntenyView**<br><code>(mousedown: Coord, mouseup: Coord) =&gt; void</code> | opens a linear synteny view on the clicked and dragged region: the horizontal axis' span on the top row, the vertical axis' below, each fitted to this view's width, with every track that has a linear synteny display, painted and filtered by the settings the two views share |
| **launchTrack**<br><code>(trackId: string, initialSnapshot?: object, displayInitialSnapshot?: DisplayInitialSnapshot, inlineConf?: Record&lt;string, unknown&gt; &#124; undefined) =&gt; Promise&lt;any&gt;</code> | showTrack for a track whose display state model may be lazily loaded: loads it, then shows |
| **launchToggleTrack**<br><code>(trackId: string) =&gt; Promise&lt;boolean&gt;</code> | toggleTrack with launchTrack's loading behavior |
| **exportSvg**<br><code>(opts?: ViewExportSvgOptions) =&gt; Promise&lt;string&gt;</code> | renders the view to SVG markup, which it returns; saves it through FileSaver unless `save: false` |
| **applySquare**<br><code>(ratio: number) =&gt; void</code> | Set both axes to the average bpPerPx (hview divided by `ratio`), re-anchoring each on the locus that was at its center. setBpPerPx alone would leave offsetPx untouched while bpPerPx changed under it, scrolling the plot; the centerAt calls are what hold it still. |
| **squareView**<br><code>() =&gt; void</code> | Equalize both axes' bpPerPx. Also what the aspect-ratio lock applies to absorb divergence from box-zoom and other per-axis operations — deliberately not clamped to either axis's own maxBpPerPx, since a shared bpPerPx that fits the larger genome necessarily exceeds the smaller axis's limit, and it converges in one step where a clamped one would ping-pong between the two maxima. |
| **squareViewProportional**<br><code>() =&gt; void</code> |  |

31 inherited actions from 7 models:

From [BaseViewModel](../baseviewmodel): [`setDisplayName`](../baseviewmodel#action-setdisplayname), [`setBodyMounted`](../baseviewmodel#action-setbodymounted), [`setMinimized`](../baseviewmodel#action-setminimized)

From [RenderLifecycleMixin](../renderlifecyclemixin): [`markCanvasDrawn`](../renderlifecyclemixin#action-markcanvasdrawn), [`resetCanvasDrawn`](../renderlifecyclemixin#action-resetcanvasdrawn), [`stopRenderingBackend`](../renderlifecyclemixin#action-stoprenderingbackend), [`renderNow`](../renderlifecyclemixin#action-rendernow), [`setOffScreen`](../renderlifecyclemixin#action-setoffscreen), [`setRenderError`](../renderlifecyclemixin#action-setrendererror), [`attachRenderingBackend`](../renderlifecyclemixin#action-attachrenderingbackend)

From [DiagonalizeProgressMixin](../diagonalizeprogressmixin): [`setAwaitingAutoDiagonalize`](../diagonalizeprogressmixin#action-setawaitingautodiagonalize), [`beginAutoDiagonalize`](../diagonalizeprogressmixin#action-beginautodiagonalize), [`finishAutoDiagonalize`](../diagonalizeprogressmixin#action-finishautodiagonalize), [`setDiagonalizeError`](../diagonalizeprogressmixin#action-setdiagonalizeerror), [`setDiagonalizeCancel`](../diagonalizeprogressmixin#action-setdiagonalizecancel), [`cancelAutoDiagonalize`](../diagonalizeprogressmixin#action-cancelautodiagonalize)

From [ImportFormSyntenyMixin](../importformsyntenymixin): [`setImportFormSyntenyTrack`](../importformsyntenymixin#action-setimportformsyntenytrack), [`clearImportFormSyntenyTracks`](../importformsyntenymixin#action-clearimportformsyntenytracks)

From [SyntenyViewMixin](../syntenyviewmixin): [`setLodMode`](../syntenyviewmixin#action-setlodmode), [`setShowLegend`](../syntenyviewmixin#action-setshowlegend), [`dismissLegendSection`](../syntenyviewmixin#action-dismisslegendsection)

From [SyntenyColorsMixin](../syntenycolorsmixin): [`setOpacity`](../syntenycolorsmixin#action-setopacity), [`setOpacityField`](../syntenycolorsmixin#action-setopacityfield), [`setMinAlignmentLength`](../syntenycolorsmixin#action-setminalignmentlength)

From [TrackColorsMixin](../trackcolorsmixin): [`observeAttributeRanges`](../trackcolorsmixin#action-observeattributeranges), [`resetAttributeRanges`](../trackcolorsmixin#action-resetattributeranges), [`setHideUnlabelled`](../trackcolorsmixin#action-sethideunlabelled), [`setColorField`](../trackcolorsmixin#action-setcolorfield), [`setColorDomain`](../trackcolorsmixin#action-setcolordomain), [`setTrackColor`](../trackcolorsmixin#action-settrackcolor), [`clearTrackColors`](../trackcolorsmixin#action-cleartrackcolors)


