# CircularView

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 `circular-view` plugin. [View source](https://github.com/GMOD/jbrowse-components/blob/main/plugins/circular-view/src/CircularView/model.ts).

## Example usage

Hand-authored under `defaultSession.views`, with every setting written
directly on the view object. `assembly` picks the genome, a `tracks` entry may
carry display config inline, and `displayedRegionNames` keeps an assembly's
alt/unplaced contigs off the circle:

```js
{
  type: 'CircularView',
  assembly: 'hg38',
  displayedRegionNames: ['chr1', 'chr2', 'chr3'],
  tracks: [{ trackId: 'my-sv-vcf', color: 'red' }],
}
```

`assembly` also takes a list, for a synteny ribbon plot: each
assembly lays its contigs out in turn, so the first genome takes one arc of
the circle and the second the next, and a `SyntenyTrack` covering both draws
a ribbon per alignment between them. `displayedRegionNames` keyed by assembly
restricts each genome separately, and `autoDiagonalize` reorders the second
to follow the first:

```js
{
  type: 'CircularView',
  assembly: ['hg38', 'mm39'],
  displayedRegionNames: { hg38: ['chr1', 'chr2'] },
  tracks: ['hg38_vs_mm39'],
  autoDiagonalize: true,
}
```

Lays one or more assemblies' chromosomes around a circle, and draws
structural variants as chords and synteny alignments as ribbons across it.

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

## Properties

| Member | Description |
| --- | --- |
| **type**<br><code>type: types.literal('CircularView') as unknown as string</code> | this is a string instead of the const literal 'CircularView' to reduce some typescripting strictness, but you should pass the string 'CircularView' to the model explicitly |
| **offsetRadians**<br><code>offsetRadians: types.stripDefault(types.number, defaultOffsetRadians)</code> | similar to offsetPx in linear genome view |
| **bpPerPx**<br><code>bpPerPx: types.stripDefault(types.number, defaultBpPerPx)</code> | the zoom level, base-pairs per pixel. Capped by `minimumRadiusPx`, and refit over by the first resize unless `autoFit` is false. |
| **autoFit**<br><code>autoFit: types.stripDefault(types.boolean, true)</code> | whether the view keeps re-fitting to its container on resize. Cleared once the user manually zooms/pans so their view (persisted via bpPerPx/offsetRadians) is preserved across resizes and reloads. |
| **tracks**<br><code>tracks: types.array( pluginManager.pluggableMstType('track', 'stateModel'), )</code> |  |
| **hideVerticalResizeHandle**<br><code>hideVerticalResizeHandle: types.stripDefault(types.boolean, false)</code> | chrome switch, for an embed that drives the view itself |
| **hideTrackSelectorButton**<br><code>hideTrackSelectorButton: types.stripDefault(types.boolean, false)</code> | chrome switch, for an embed that drives the view itself |
| **disableImportForm**<br><code>disableImportForm: types.stripDefault(types.boolean, false)</code> | suppress the import form even on an error — what the SV inspector's circle wants, since its assembly comes from the sheet beside it and a form there would offer a control that cannot work |
| **showLegend**<br><code>showLegend: types.stripDefault(types.boolean, false)</code> | a key naming each track's ring, chords or ribbons in the corner |
| **height**<br><code>height: types.stripDefault(types.number, defaultHeight)</code> | the height of the view in pixels. The circle auto-fits its container, so this is what sizes the drawing. |
| **displayedRegions**<br><code>displayedRegions: types.stripDefault(types.frozen&lt;Region[]&gt;(), [])</code> | the regions the circle lays out, one arc each, in this order. `displayedRegionNames` names the same thing by refName and is the shorter form. |
| **minimumRadiusPx**<br><code>minimumRadiusPx: types.stripDefault( types.number, defaultMinimumRadiusPx, )</code> | how far in the circle may be zoomed, as a floor on the radius; it is what caps bpPerPx |
| **spacingPx**<br><code>spacingPx: types.stripDefault(types.number, defaultSpacingPx)</code> | the gap drawn between adjacent chromosome arcs |
| **paddingPx**<br><code>paddingPx: types.stripDefault(types.number, defaultPaddingPx)</code> | blank margin between the circle and the edge of the figure |
| **minVisibleWidth**<br><code>minVisibleWidth: types.stripDefault( types.number, defaultMinVisibleWidth, )</code> | arcs thinner than this many pixels are elided instead of drawn, so a few thousand unplaced contigs do not become a ring of hairlines |
| **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. |
| **launch**<br><code>launch: types.frozen&lt;LaunchInput&lt;CircularViewCommands&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 assembly the circle is drawn from, the refNames to restrict it to, chord track recipes. `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. |

9 inherited properties from 4 models:

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

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)

From [SyntenyFadeMixin](../syntenyfademixin): [`fadeThinAlignmentsMode`](../syntenyfademixin#property-fadethinalignmentsmode)


## Volatiles

| Member | Description |
| --- | --- |
| **volatileWidth**<br><code>number &#124; undefined</code> |  |
| **volatileError**<br><code>unknown</code> |  |
| **panX**<br><code>number</code> |  |
| **panY**<br><code>number</code> |  |
| **ringHost**<br><code>ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; {…} &amp; { setWidth(): void; setBodyMounted(): void; setMinimized(): void; setDisplayName(): void; scrollZoom(): void; setStripElement(displayId: string, el: HTMLElement &#124; null): void; setCoarseDynamicBlocks(blocks: BlockSet, bpPerPx: number): void; syncRings(displayIds: string[]): void; } &amp; { setView(view: RingHostView): void; beforeDestroy(): void; } &amp; IStateTreeNode&lt;…&gt;</code> | the strip every linear display in this view lays out along, and the rings drawn from it — see `regionHost` |
| **hover**<br><code>PointerTarget &#124; undefined</code> | the chord or ribbon under the pointer, which the highlight paths and the tooltip read |
| **hoverClientXY**<br><code>[number, number] &#124; undefined</code> | where the pointer was on the page while it was on `hover`, which only the tooltip follows |
| **chordPass**<br><code>ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; { attachRenderingBackend&lt;B&gt;(backend: B, setup: () =&gt; RenderingBackendCallbacks&lt;…&gt;): void; } &amp; { view: ChordPassView &#124; undefined; drawnCells: ReadonlySet&lt;…&gt;; } &amp; { readonly frame: ChordLayerFrame; readonly cells: ReadonlyMap&lt;…&gt;; readonly canRender: boolean; readonly rendersCanvas: boolean; drew(cell: ChordCell): boolean; } &amp; { setView(view: ChordPassView): void; setDrawnCells(cells: ReadonlyMap&lt;…&gt;): void; } &amp; { startRenderingBackend(backend: ChordBackend): void; } &amp; IStateTreeNode&lt;…&gt;</code> | the canvas the chords and ribbons of every chord display draw on |

10 inherited volatiles from 5 models:

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

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 [TrackColorsMixin](../trackcolorsmixin): [`seenAttributeRanges`](../trackcolorsmixin#volatile-seenattributeranges)

From [SyntenyFadeMixin](../syntenyfademixin): [`fadeThinLatch`](../syntenyfademixin#volatile-fadethinlatch)


## 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> |  |
| **circleRegions**<br><code>(Region &#124; { circular: boolean; assemblyName: string; refName: string; start: number; end: number; reversed?: boolean &#124; undefined; })[]</code> | `displayedRegions`, each marked `circular` where it is a whole sequence its assembly lists in `circularRefNames` |
| **fitLayout**<br><code>FitLayout</code> | the circle that fills the box: its scale and radius, and the padding the view keeps at every zoom. A pure function of the regions and the box — see `fitLayout` |
| **effectivePaddingPx**<br><code>number</code> | `paddingPx`, capped at a share of a small box and floored at what the labels drawn at the fit reach, so a label is never drawn at a negative x and clipped by the box |
| **ring**<br><code>{ spacingPx: number; radiusPx: number; }</code> | the ring at this zoom: its gaps' spacing and the radius that closes it — see `ringAt` |
| **effectiveSpacingPx**<br><code>number</code> | `spacingPx`, capped so the gaps take at most a quarter of the ring |
| **totalGapUnits**<br><code>number</code> | how many inter-slice gaps go round the circle, a genome boundary counting as several |
| **radiusPx**<br><code>number</code> |  |
| **circumferencePx**<br><code>number</code> |  |
| **bpPerRadian**<br><code>number</code> |  |
| **centerXY**<br><code>[number, number]</code> |  |
| **totalBp**<br><code>number</code> |  |
| **maxBpPerPx**<br><code>number</code> |  |
| **minBpPerPx**<br><code>number</code> |  |
| **atMaxBpPerPx**<br><code>boolean</code> |  |
| **atMinBpPerPx**<br><code>boolean</code> |  |
| **figureSize**<br><code>number</code> | figure is always square, so width === height |
| **figureOriginXY**<br><code>[number, number]</code> | top-left of the figure within the view's box, then shifted by the zoom-to-cursor pan.<br><br>Centered horizontally: a view much wider than it is tall would otherwise leave the circle jammed in the corner under the controls.<br><br>Vertically it hangs from the top of a box taller than it is wide — see `figureMiddleY`, which `zoomToPoint` reads for the same reason. |
| **elisionMask**<br><code>string</code> | which displayed regions are too narrow at this zoom to draw as themselves, one character each |
| **elidedRegions**<br><code>SliceRegion[]</code> | this is displayedRegions, post-processed to elide regions that are too small to see reasonably. A run of them never crosses from one assembly into the next, so each genome's arcs stay its own. Read off `elisionMask`, so a zoom that elides nothing new rebuilds nothing |
| **pendingLaunch**<br><code>LaunchInput&lt;CircularViewCommands &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;CircularViewCommands&gt; &#124; undefined, LaunchInput&lt;CircularViewCommands&gt; &#124; undefined, LaunchInput&lt;CircularViewCommands&gt; &#124; undefined&gt;&gt;&gt; &#124; undefined</code> | the launch state that still has something to apply — the gate the loading and import-form paths below read. |
| **assemblyNames**<br><code>string[]</code> |  |
| **chordSyntenyDisplays**<br><code>ChordSyntenyDisplaySelf[]</code> | the ribbon displays of `syntenyTracks()`; a chromosome reorder reads its alignments from these |
| **canDiagonalize**<br><code>boolean</code> | Whether a chromosome reorder has anything to do: a ribbon track to take alignments from, and exactly the two genomes a mirrored layout is defined for. One is a self-alignment, with no second arc to reorder; three or more have no layout in which every pair reads as a band. |
| **paintedAssemblyName**<br><code>string &#124; undefined</code> | the genome whose ideogram a ribbon track paints by what aligns to it from the first, rather than in its own chromosomes' colors |
| **ideogramPaint**<br><code>ReadonlyMap&lt;string, PaintRun[]&gt;</code> | that genome's paint, by slice key |
| **launchAssemblyNames**<br><code>string[]</code> | The assemblies a pending launch names, which the gates below wait on before `displayedRegions` exist. A blob carrying only tracks names none, and waiting on one nobody named never ends. |
| **initialized**<br><code>boolean</code> |  |
| **assemblyErrors**<br><code>string &#124; undefined</code> |  |
| **error**<br><code>unknown</code> |  |
| **hasSomethingToShow**<br><code>boolean</code> |  |
| **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. A pending launch names them before displayedRegions exist, so it is the source until then — the same order `initialized` above resolves in. |
| **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. |
| **showView**<br><code>boolean</code> | Whether the view is fully initialized and ready to display |
| **showImportForm**<br><code>boolean</code> | `!hasSomethingToShow \|\| !!error`, the same predicate as every other view, with `disableImportForm` suppressing the whole thing rather than only its first half.<br><br>The `\|\|` used to bind the other way, so an error re-enabled a form the embedder had turned off. That is reachable, and the sv-inspector — `disableImportForm`'s only setter — is where: its circle is driven by the spreadsheet's assembly, so a circle left sitting on regions whose assembly the config no longer has reports an error (the case the region-binding autorun's comment describes). The inspector then grew a circular-view import form inside its own panel, offering an assembly dropdown whose Open the inspector's autorun overwrites on the next pass — a control that cannot work, in a view that asked not to have it.<br><br>The error still has to be reported, so the component renders a bare ErrorBanner in that case; the form is only the *usual* place a circular view puts one. |
| **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`. |
| **regionHost**<br><code>ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; {…} &amp; { setWidth(): void; setBodyMounted(): void; setMinimized(): void; setDisplayName(): void; scrollZoom(): void; setStripElement(displayId: string, el: HTMLElement &#124; null): void; setCoarseDynamicBlocks(blocks: BlockSet, bpPerPx: number): void; syncRings(displayIds: string[]): void; } &amp; { setView(view: RingHostView): void; beforeDestroy(): void; } &amp; IStateTreeNode&lt;…&gt;</code> | The node a linear display's foundation reads as its view: the circumference unrolled into a strip. A display registered for the linear genome view draws on this view as a ring of that strip, so `containingHost` answers this rather than the view itself. |
| **chordRadiusPx**<br><code>number</code> | Where the chord displays start: inside the innermost ring, or at the ruler when the view holds none. |
| **chordDisplays**<br><code>ChordLayerDisplay[]</code> | the displays drawing across the circle, in track order: every first display registered for this view rather than laid out as a ring |
| **hoveredChord**<br><code>ChordHit &#124; undefined</code> | the chord or ribbon under the pointer |
| **hoveredBand**<br><code>AxisSlice</code> | the chromosome whose band is under the pointer, on the chord axis |
| **chordFocusGaps**<br><code>number</code> | that chromosome as the chord stage's focus: its slice's gap count, the name a foot gives it, or -1 for none |
| **bandComposition**<br><code>{ name: string; shares: PartnerShare[]; } &#124; undefined</code> | the hovered chromosome's name and the share of it each chromosome aligned to it covers, most first |
| **hoversChord**<br><code>boolean</code> | whether the pointer is on a chord or ribbon, which only changes as it crosses onto one or off it |
| **chordAxis**<br><code>ChordAxis</code> | the circle's slices on the unrolled genome axis, which the chord displays place their feet on; rebuilt when the regions or their elision change, never by a zoom or a rotation alone |
| **chordScale**<br><code>{ radiansPerBp: number; gapRadians: number; }</code> | the polar stage's scale from the unrolled axis to radians: per base, and per gap between slices |
| **autoFadeWidthPx**<br><code>number</code> | The width 'auto' compares against its thresholds: the narrowest capped mean span, on screen, of any ribbon display with enough alignments to judge, and nothing to judge before the circle has a size |
| **chordThinFadeFloor**<br><code>1 &#124; 0.15</code> | the least alpha the thin fade leaves a ribbon, 1 while it is off |
| **staticSlices**<br><code>Slice[]</code> |  |
| **legendSpec**<br><code>LegendSpec</code> | one row per track: its name beside the color or ramp it paints with |

22 inherited getters from 4 models:

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

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)

From [SyntenyFadeMixin](../syntenyfademixin): [`fadeThinAlignments`](../syntenyfademixin#getter-fadethinalignments)


## Methods

| Member | Description |
| --- | --- |
| **syntenyTracks**<br><code>() =&gt; ComparativeTrackModel[]</code> | the tracks drawing ribbons, which the view's color settings paint |
| **loadedAttributeRanges**<br><code>() =&gt; Record&lt;string, AttributeRange&gt;[]</code> | each ribbon display's attribute spans, over the alignments it holds |
| **legendCigarOps**<br><code>() =&gt; number</code> | a ribbon draws no indel blocks, so the key lists none |
| **shapeShowsStrand**<br><code>() =&gt; boolean</code> | a ribbon twists against its two arcs' directions, and nothing on the circle shows which way an arc runs |
| **chordAt**<br><code>(dx: number, dy: number) =&gt; ChordHit &#124; undefined</code> | the chord or ribbon under a point `dx`,`dy` CSS px from the circle's centre in the screen frame |
| **bandAt**<br><code>(dx: number, dy: number) =&gt; string &#124; undefined</code> | the place of the chromosome whose ideogram band holds a point `dx`,`dy` CSS px from the circle's centre in the screen frame |
| **bandCenter**<br><code>(key: string) =&gt; [number, number] &#124; undefined</code> | the middle of the ideogram band `key` names, CSS px from the circle's centre in the screen frame: the point `bandAt` answers `key` for |
| **linearTracksFor**<br><code>(assemblyName: string) =&gt; TrackInit[]</code> | the tracks a linear view of one genome on this circle opens with: each track on that genome but the synteny tracks, a ring as its display and a chord track as the linear view's own |
| **tracksMenuItem**<br><code>() =&gt; MenuItem</code> | each track's own menu, which on a linear view hangs off its label and on the circle has nowhere else to go |
| **legendSpecIn**<br><code>(palette?: JBrowsePalette &#124; undefined) =&gt; LegendSpec</code> | `legendSpec` in another theme, the SVG export's, which keys a ring whose colors follow the theme (alignments, MAF) in that theme. The ribbon key takes no colors from the theme. |
| **menuItems**<br><code>() =&gt; MenuItem[]</code> | return the view menu items |

6 inherited methods from 2 models:

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

From [TrackColorsMixin](../trackcolorsmixin): [`colorSurface`](../trackcolorsmixin#method-colorsurface), [`offersReferenceColor`](../trackcolorsmixin#method-offersreferencecolor), [`trackColorFor`](../trackcolorsmixin#method-trackcolorfor)


## Actions

| Member | Description |
| --- | --- |
| **fitToWindow**<br><code>() =&gt; void</code> | size the figure so it exactly fills the smaller of the view's two dimensions |
| **setWidth**<br><code>(newWidth: number) =&gt; number</code> |  |
| **setHeight**<br><code>(newHeight: number) =&gt; number</code> |  |
| **setShowLegend**<br><code>(flag: boolean) =&gt; void</code> |  |
| **rotateClockwiseButton**<br><code>() =&gt; void</code> |  |
| **rotateCounterClockwiseButton**<br><code>() =&gt; void</code> |  |
| **rotate**<br><code>(delta: number) =&gt; void</code> |  |
| **resetView**<br><code>() =&gt; void</code> | reset rotation, pan, and zoom back to the default fit-to-window view |
| **zoomInButton**<br><code>() =&gt; void</code> |  |
| **zoomOutButton**<br><code>() =&gt; void</code> |  |
| **zoomAboutViewMiddle**<br><code>(newBpPerPx: number) =&gt; void</code> | zoom about the circle's middle while the figure sits where the fit put it, and about the view's middle once a zoom to the cursor has panned it, so what the user zoomed toward stays in view |
| **setBpPerPx**<br><code>(newVal: number) =&gt; void</code> |  |
| **zoomToPoint**<br><code>(newBpPerPx: number, cursorX: number, cursorY: number) =&gt; void</code> | zoom toward/away from a point on the figure, keeping whatever is under it visually fixed. The point is its offset in screen px from the middle of the circle — what `offsetFromCenter` in the component hands back |
| **setDisplayedRegions**<br><code>(regions: Region[]) =&gt; void</code> |  |
| **activateTrackSelector**<br><code>() =&gt; Widget &#124; undefined</code> |  |
| **toggleTrack**<br><code>(trackId: string) =&gt; boolean</code> |  |
| **setError**<br><code>(error: unknown) =&gt; void</code> |  |
| **setHover**<br><code>(target: PointerTarget &#124; undefined, clientX?: any, clientY?: any) =&gt; void</code> | the pointer is on `target`, or on nothing, at client `x`,`y`. A move that stays on one target keeps it, so only the tooltip follows it |
| **setLaunch**<br><code>(launch?: LaunchInput&lt;CircularViewCommands&gt; &#124; undefined) =&gt; void</code> |  |
| **clearView**<br><code>() =&gt; void</code> | back to the import form: no regions, no tracks, no pending launch and no error from the one before |
| **showTrack**<br><code>(trackId: string, initialSnapshot?: any, displayInitialSnapshot?: any, inlineConf?: Record&lt;string, unknown&gt; &#124; undefined) =&gt; any</code> |  |
| **addTrackConf**<br><code>(configuration: Record&lt;string, unknown&gt;, initialSnapshot?: any) =&gt; any</code> |  |
| **hideTrack**<br><code>(trackId: string) =&gt; boolean</code> |  |
| **openExportDialog**<br><code>() =&gt; void</code> |  |
| **openReorderChromosomesDialog**<br><code>() =&gt; void</code> |  |
| **openInLinearSyntenyView**<br><code>() =&gt; void</code> | a linear synteny view of this circle's genomes, a row each over the chromosomes the circle shows with the tracks it shows for that genome, its ribbon tracks between them, reordered, in this view's color and length filter. A self-alignment opens the genome against itself |
| **autoDiagonalize**<br><code>() =&gt; Promise&lt;void&gt;</code> | The init-time reorder, behind the "Reordering chromosomes" screen `withDiagonalizeProgress` drives. |
| **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` |
| **launchTrack**<br><code>(trackId: string, initialSnapshot?: any, displayInitialSnapshot?: any) =&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 |
| **launchTrackConf**<br><code>(configuration: Record&lt;string, unknown&gt;, initialSnapshot?: any) =&gt; Promise&lt;any&gt;</code> | `addTrackConf` with `launchTrack`'s loading behavior, for a track handed over inline rather than from a session list |
| **resizeHeight**<br><code>(distance: number) =&gt; number</code> |  |
| **resizeWidth**<br><code>(distance: number) =&gt; number</code> |  |

23 inherited actions from 6 models:

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

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 [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)

From [SyntenyFadeMixin](../syntenyfademixin): [`setFadeThinAlignmentsMode`](../syntenyfademixin#action-setfadethinalignmentsmode), [`setFadeThinLatch`](../syntenyfademixin#action-setfadethinlatch)


