@vitessce/launcher 4.0.0-test.3 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{GeometryAndMeshXR-arbhswbx.js → GeometryAndMeshXR-CeAaq3ae.js} +1 -1
- package/dist/{ReactNeuroglancer-BsqPWpQJ.js → ReactNeuroglancer-BLfUOvtO.js} +1 -1
- package/dist/{deflate-0ecBfpbE.js → deflate-nYfk3Mbe.js} +1 -1
- package/dist/{higlass-DjFeS4wB.js → higlass-DPgS6S1h.js} +1 -1
- package/dist/{index-6Oxzw9ho.js → index-C2U2CO2P.js} +2 -2
- package/dist/{index-DAhtQMo7.js → index-DDD3apxS.js} +395 -194
- package/dist/{index-BsUxdbVL.js → index-DuFOjj6d.js} +7 -6
- package/dist/index.js +1 -1
- package/dist/{jpeg-BegTw2ZG.js → jpeg-4XvdCEqV.js} +1 -1
- package/dist/{lerc-BKy3Cqfz.js → lerc-J5N91MJw.js} +1 -1
- package/dist/{lzw-CyLNGLTP.js → lzw-BlNLuocx.js} +1 -1
- package/dist/{packbits-CMdMha0h.js → packbits-D7jhgu7h.js} +1 -1
- package/dist/{raw-DbDdV1tN.js → raw-Dcz65jWu.js} +1 -1
- package/dist/{webimage-DYe9qPKJ.js → webimage-CMXekglL.js} +1 -1
- package/dist-tsc/ControlledLauncher.js +1 -0
- package/dist-tsc/ControlledLauncher.js.map +1 -0
- package/dist-tsc/LauncherStart.js +1 -0
- package/dist-tsc/LauncherStart.js.map +1 -0
- package/dist-tsc/UncontrolledLauncher.js +1 -0
- package/dist-tsc/UncontrolledLauncher.js.map +1 -0
- package/dist-tsc/index.js +1 -0
- package/dist-tsc/index.js.map +1 -0
- package/dist-tsc/launcher-styles.js +1 -0
- package/dist-tsc/launcher-styles.js.map +1 -0
- package/dist-tsc/use-hash-param.js +1 -0
- package/dist-tsc/use-hash-param.js.map +1 -0
- package/dist-tsc/use-query-or-hash-param.js +1 -0
- package/dist-tsc/use-query-or-hash-param.js.map +1 -0
- package/package.json +9 -9
|
@@ -4,9 +4,6 @@ import { jsx as jsx$1, jsxs, Fragment } from "react/jsx-runtime";
|
|
|
4
4
|
import { useLoaders, useCoordinationScopes, useCoordination, useDescription, useImageData, useReady, TitleInfo, useVitessceContainer, useSetWarning, useObsSetsData, useUrls, usePlotOptionsStyles, OptionsContainer, CellColorEncodingOption, OptionSelect, useComponentHover, useComponentViewInfo, useSetComponentHover, useSetComponentViewInfo, useInitialCoordination, useDeckCanvasSize, useMultiObsLabels, useObsEmbeddingData, useFeatureSelection, useObsFeatureMatrixIndices, useFeatureLabelsData, useExpandedFeatureLabelsMap, useSampleSetsData, useSampleEdgesData, useGetObsInfo, useUint8FeatureSelection, useExpressionValueGetter, useAuxiliaryCoordination, useHasLoader, useObsLocationsData, useObsLabelsData, useObsSegmentationsData, useNeighborhoodsData, useMergeCoordination, useCoordinationScopesBy, useMultiCoordinationScopesSecondaryNonNull, useMultiCoordinationScopesNonNull, useComplexCoordination, useComplexCoordinationSecondary, useGridItemSize, useMultiObsPoints, usePointMultiObsLabels, usePointMultiObsFeatureMatrixIndices, useMultiObsSpots, useSpotMultiObsSets, useSpotMultiFeatureLabels, useSpotMultiFeatureSelection, useSpotMultiObsFeatureMatrixIndices, useSegmentationMultiObsLocations, useMultiObsSegmentations, useSegmentationMultiObsSets, useSegmentationMultiFeatureSelection, useSegmentationMultiObsFeatureMatrixIndices, useMultiImages, useObsFeatureMatrixData, useUint8ObsFeatureMatrix, useGetObsMembership, PopperMenu, useComponentLayout, useClosestVitessceContainerSize, useWindowDimensions, useRemoveImageChannelInMetaCoordinationScopes, useAddImageChannelInMetaCoordinationScopes, useViewConfigStoreApi, useViewConfig, useSetViewConfig, createLoaders, useWarning, useGenomicProfilesData, useMatchingLoader, useColumnNameMapping, useFeatureStatsData, useObsSetStatsData, useAsyncFunction, useFeatureSetStatsData, useComparisonMetadata, logConfig, VitSContainer, createOnDrop } from "@vitessce/vit-s";
|
|
5
5
|
import * as ReactDOM from "react-dom";
|
|
6
6
|
import ReactDOM__default, { createPortal } from "react-dom";
|
|
7
|
-
import { Quaternion as Quaternion$1, Euler as Euler$1 } from "three";
|
|
8
|
-
import { GLTFLoader as GLTFLoader$1 } from "three/addons/loaders/GLTFLoader.js";
|
|
9
|
-
import { DRACOLoader } from "three/addons/loaders/DRACOLoader.js";
|
|
10
7
|
function _mergeNamespaces(n3, m2) {
|
|
11
8
|
for (var i2 = 0; i2 < m2.length; i2++) {
|
|
12
9
|
const e3 = m2[i2];
|
|
@@ -5881,7 +5878,7 @@ function baseClamp(number2, lower2, upper) {
|
|
|
5881
5878
|
}
|
|
5882
5879
|
return number2;
|
|
5883
5880
|
}
|
|
5884
|
-
function clamp$
|
|
5881
|
+
function clamp$8(number2, lower2, upper) {
|
|
5885
5882
|
if (upper === void 0) {
|
|
5886
5883
|
upper = lower2;
|
|
5887
5884
|
lower2 = void 0;
|
|
@@ -10213,6 +10210,7 @@ const FileType$1 = {
|
|
|
10213
10210
|
OBS_LABELS_MUDATA_ZARR: "obsLabels.mudata.zarr",
|
|
10214
10211
|
FEATURE_LABELS_MUDATA_ZARR: "featureLabels.mudata.zarr",
|
|
10215
10212
|
GENOMIC_PROFILES_ZARR: "genomic-profiles.zarr",
|
|
10213
|
+
GENOMIC_PROFILES_ZARR_ZIP: "genomic-profiles.zarr.zip",
|
|
10216
10214
|
NEIGHBORHOODS_JSON: "neighborhoods.json",
|
|
10217
10215
|
// OME-TIFF
|
|
10218
10216
|
IMAGE_OME_TIFF: "image.ome-tiff",
|
|
@@ -10507,6 +10505,7 @@ const ViewHelpMapping = {
|
|
|
10507
10505
|
[FileType$1.OBS_LABELS_MOLECULES_JSON]: DataType$3.OBS_LABELS,
|
|
10508
10506
|
// For old file types
|
|
10509
10507
|
[FileType$1.GENOMIC_PROFILES_ZARR]: DataType$3.GENOMIC_PROFILES,
|
|
10508
|
+
[FileType$1.GENOMIC_PROFILES_ZARR_ZIP]: DataType$3.GENOMIC_PROFILES,
|
|
10510
10509
|
[FileType$1.NEIGHBORHOODS_JSON]: DataType$3.NEIGHBORHOODS
|
|
10511
10510
|
});
|
|
10512
10511
|
({
|
|
@@ -10671,6 +10670,10 @@ const ALT_ZARR_STORE_TYPES = {
|
|
|
10671
10670
|
},
|
|
10672
10671
|
[FileType$1.OBS_EMBEDDING_SPATIALDATA_ZARR]: {
|
|
10673
10672
|
zip: FileType$1.OBS_EMBEDDING_SPATIALDATA_ZARR_ZIP
|
|
10673
|
+
},
|
|
10674
|
+
// For genomic profiles:
|
|
10675
|
+
[FileType$1.GENOMIC_PROFILES_ZARR]: {
|
|
10676
|
+
zip: FileType$1.GENOMIC_PROFILES_ZARR_ZIP
|
|
10674
10677
|
}
|
|
10675
10678
|
};
|
|
10676
10679
|
[
|
|
@@ -17047,7 +17050,7 @@ function useThemeProps$1({
|
|
|
17047
17050
|
});
|
|
17048
17051
|
}
|
|
17049
17052
|
const useEnhancedEffect$1 = typeof window !== "undefined" ? React.useLayoutEffect : React.useEffect;
|
|
17050
|
-
function clamp$
|
|
17053
|
+
function clamp$7(val, min2 = Number.MIN_SAFE_INTEGER, max2 = Number.MAX_SAFE_INTEGER) {
|
|
17051
17054
|
return Math.max(min2, Math.min(val, max2));
|
|
17052
17055
|
}
|
|
17053
17056
|
function clampWrapper(value2, min2 = 0, max2 = 1) {
|
|
@@ -17056,7 +17059,7 @@ function clampWrapper(value2, min2 = 0, max2 = 1) {
|
|
|
17056
17059
|
console.error(`MUI: The value provided ${value2} is out of range [${min2}, ${max2}].`);
|
|
17057
17060
|
}
|
|
17058
17061
|
}
|
|
17059
|
-
return clamp$
|
|
17062
|
+
return clamp$7(value2, min2, max2);
|
|
17060
17063
|
}
|
|
17061
17064
|
function hexToRgb$1(color2) {
|
|
17062
17065
|
color2 = color2.slice(1);
|
|
@@ -40923,7 +40926,7 @@ function useSlider(parameters2) {
|
|
|
40923
40926
|
});
|
|
40924
40927
|
const range2 = Array.isArray(valueDerived);
|
|
40925
40928
|
let values3 = range2 ? valueDerived.slice().sort(asc) : [valueDerived];
|
|
40926
|
-
values3 = values3.map((value2) => value2 == null ? min2 : clamp$
|
|
40929
|
+
values3 = values3.map((value2) => value2 == null ? min2 : clamp$7(value2, min2, max2));
|
|
40927
40930
|
const marks = marksProp === true && step !== null ? [...Array(Math.floor((max2 - min2) / step) + 1)].map((_, index2) => ({
|
|
40928
40931
|
value: min2 + step * index2
|
|
40929
40932
|
})) : marksProp || [];
|
|
@@ -40961,10 +40964,10 @@ function useSlider(parameters2) {
|
|
|
40961
40964
|
newValue = newValue < value2 ? marksValues[marksIndex - 1] : marksValues[marksIndex + 1];
|
|
40962
40965
|
}
|
|
40963
40966
|
}
|
|
40964
|
-
newValue = clamp$
|
|
40967
|
+
newValue = clamp$7(newValue, min2, max2);
|
|
40965
40968
|
if (range2) {
|
|
40966
40969
|
if (disableSwap) {
|
|
40967
|
-
newValue = clamp$
|
|
40970
|
+
newValue = clamp$7(newValue, values3[index2 - 1] || -Infinity, values3[index2 + 1] || Infinity);
|
|
40968
40971
|
}
|
|
40969
40972
|
const previousValue = newValue;
|
|
40970
40973
|
newValue = setValueIndex({
|
|
@@ -41099,7 +41102,7 @@ function useSlider(parameters2) {
|
|
|
41099
41102
|
const closestIndex = findClosest(marksValues, newValue);
|
|
41100
41103
|
newValue = marksValues[closestIndex];
|
|
41101
41104
|
}
|
|
41102
|
-
newValue = clamp$
|
|
41105
|
+
newValue = clamp$7(newValue, min2, max2);
|
|
41103
41106
|
let activeIndex = 0;
|
|
41104
41107
|
if (range2) {
|
|
41105
41108
|
if (!move2) {
|
|
@@ -41108,7 +41111,7 @@ function useSlider(parameters2) {
|
|
|
41108
41111
|
activeIndex = previousIndex.current;
|
|
41109
41112
|
}
|
|
41110
41113
|
if (disableSwap) {
|
|
41111
|
-
newValue = clamp$
|
|
41114
|
+
newValue = clamp$7(newValue, values3[activeIndex - 1] || -Infinity, values3[activeIndex + 1] || Infinity);
|
|
41112
41115
|
}
|
|
41113
41116
|
const previousValue = newValue;
|
|
41114
41117
|
newValue = setValueIndex({
|
|
@@ -49015,7 +49018,7 @@ function localStorageAvailable() {
|
|
|
49015
49018
|
function escapeRegExp(value2) {
|
|
49016
49019
|
return value2.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
|
49017
49020
|
}
|
|
49018
|
-
const clamp$
|
|
49021
|
+
const clamp$6 = (value2, min2, max2) => Math.max(min2, Math.min(max2, value2));
|
|
49019
49022
|
function range$c(from2, to) {
|
|
49020
49023
|
return Array.from({
|
|
49021
49024
|
length: to - from2
|
|
@@ -52721,7 +52724,7 @@ const hydrateColumnsWidth = (rawState, dimensions) => {
|
|
|
52721
52724
|
totalFlexUnits += column2.flex;
|
|
52722
52725
|
isFlex = true;
|
|
52723
52726
|
} else {
|
|
52724
|
-
computedWidth = clamp$
|
|
52727
|
+
computedWidth = clamp$6(column2.width || GRID_STRING_COL_DEF.width, column2.minWidth || GRID_STRING_COL_DEF.minWidth, column2.maxWidth || GRID_STRING_COL_DEF.maxWidth);
|
|
52725
52728
|
}
|
|
52726
52729
|
widthAllocatedBeforeFlex += computedWidth;
|
|
52727
52730
|
}
|
|
@@ -53321,8 +53324,8 @@ const useGridVirtualScroller = () => {
|
|
|
53321
53324
|
const maxScrollTop = Math.ceil(dimensions.minimumSize.height - dimensions.viewportOuterSize.height);
|
|
53322
53325
|
const maxScrollLeft = Math.ceil(dimensions.minimumSize.width - dimensions.viewportInnerSize.width);
|
|
53323
53326
|
const newScroll = {
|
|
53324
|
-
top: clamp$
|
|
53325
|
-
left: isRtl ? clamp$
|
|
53327
|
+
top: clamp$6(scroller.scrollTop, 0, maxScrollTop),
|
|
53328
|
+
left: isRtl ? clamp$6(scroller.scrollLeft, -maxScrollLeft, 0) : clamp$6(scroller.scrollLeft, 0, maxScrollLeft)
|
|
53326
53329
|
};
|
|
53327
53330
|
const dx = newScroll.left - scrollPosition.current.left;
|
|
53328
53331
|
const dy = newScroll.top - scrollPosition.current.top;
|
|
@@ -53760,7 +53763,7 @@ function getNearestIndexToRender(inputs, offset2, options) {
|
|
|
53760
53763
|
if (inputs.range?.lastRowIndex && !allRowsMeasured) {
|
|
53761
53764
|
allRowsMeasured = lastMeasuredIndexRelativeToAllRows >= inputs.range.lastRowIndex;
|
|
53762
53765
|
}
|
|
53763
|
-
const lastMeasuredIndexRelativeToCurrentPage = clamp$
|
|
53766
|
+
const lastMeasuredIndexRelativeToCurrentPage = clamp$6(lastMeasuredIndexRelativeToAllRows - (inputs.range?.firstRowIndex || 0), 0, inputs.rowsMeta.positions.length);
|
|
53764
53767
|
if (allRowsMeasured || inputs.rowsMeta.positions[lastMeasuredIndexRelativeToCurrentPage] >= offset2) {
|
|
53765
53768
|
return binarySearch$2(offset2, inputs.rowsMeta.positions, options);
|
|
53766
53769
|
}
|
|
@@ -53844,7 +53847,7 @@ function getIndexesToRender({
|
|
|
53844
53847
|
lastPosition: positions[positions.length - 1] + lastSize
|
|
53845
53848
|
});
|
|
53846
53849
|
const lastIndexPadded = binarySearch$2(lastPosition, positions);
|
|
53847
|
-
return [clamp$
|
|
53850
|
+
return [clamp$6(firstIndexPadded, minFirstIndex, maxLastIndex), clamp$6(lastIndexPadded, minFirstIndex, maxLastIndex)];
|
|
53848
53851
|
}
|
|
53849
53852
|
function areRenderContextsEqual(context1, context2) {
|
|
53850
53853
|
if (context1 === context2) {
|
|
@@ -63423,7 +63426,7 @@ const useGridFocus = (apiRef, props) => {
|
|
|
63423
63426
|
columnIndexToFocus = visibleColumns.length - 1;
|
|
63424
63427
|
}
|
|
63425
63428
|
}
|
|
63426
|
-
rowIndexToFocus = clamp$
|
|
63429
|
+
rowIndexToFocus = clamp$6(rowIndexToFocus, 0, currentPageRows.length - 1);
|
|
63427
63430
|
const rowToFocus = currentPageRows[rowIndexToFocus];
|
|
63428
63431
|
if (!rowToFocus) {
|
|
63429
63432
|
return;
|
|
@@ -63436,7 +63439,7 @@ const useGridFocus = (apiRef, props) => {
|
|
|
63436
63439
|
columnIndexToFocus = colSpanInfo.rightVisibleCellIndex;
|
|
63437
63440
|
}
|
|
63438
63441
|
}
|
|
63439
|
-
columnIndexToFocus = clamp$
|
|
63442
|
+
columnIndexToFocus = clamp$6(columnIndexToFocus, 0, visibleColumns.length - 1);
|
|
63440
63443
|
const columnToFocus = visibleColumns[columnIndexToFocus];
|
|
63441
63444
|
apiRef.current.setCellFocus(rowToFocus.id, columnToFocus.field);
|
|
63442
63445
|
}, [apiRef, props.pagination, props.paginationMode]);
|
|
@@ -63549,7 +63552,7 @@ const useGridFocus = (apiRef, props) => {
|
|
|
63549
63552
|
pagination: props.pagination,
|
|
63550
63553
|
paginationMode: props.paginationMode
|
|
63551
63554
|
});
|
|
63552
|
-
const nextRow = currentPage.rows[clamp$
|
|
63555
|
+
const nextRow = currentPage.rows[clamp$6(lastFocusedRowIndex, 0, currentPage.rows.length - 1)];
|
|
63553
63556
|
nextRowId = nextRow?.id ?? null;
|
|
63554
63557
|
}
|
|
63555
63558
|
apiRef.current.setState((state) => _extends$c({}, state, {
|
|
@@ -67902,7 +67905,7 @@ function extractColumnWidths(apiRef, options, columns2) {
|
|
|
67902
67905
|
const min2 = hasColumnMin ? column2.minWidth : 0;
|
|
67903
67906
|
const max2 = hasColumnMax ? column2.maxWidth : Infinity;
|
|
67904
67907
|
const maxContent = filteredWidths.length === 0 ? 0 : Math.max(...filteredWidths);
|
|
67905
|
-
widthByField[column2.field] = clamp$
|
|
67908
|
+
widthByField[column2.field] = clamp$6(maxContent, min2, max2);
|
|
67906
67909
|
});
|
|
67907
67910
|
root2.classList.remove(gridClasses.autosizing);
|
|
67908
67911
|
return widthByField;
|
|
@@ -68058,7 +68061,7 @@ const useGridColumnResize = (apiRef, props) => {
|
|
|
68058
68061
|
return;
|
|
68059
68062
|
}
|
|
68060
68063
|
let newWidth = computeNewWidth(initialOffsetToSeparator.current, nativeEvent.clientX, refs.columnHeaderElement.getBoundingClientRect(), resizeDirection.current);
|
|
68061
|
-
newWidth = clamp$
|
|
68064
|
+
newWidth = clamp$6(newWidth, refs.colDef.minWidth, refs.colDef.maxWidth);
|
|
68062
68065
|
updateWidth(newWidth);
|
|
68063
68066
|
const params2 = {
|
|
68064
68067
|
element: refs.columnHeaderElement,
|
|
@@ -68084,7 +68087,7 @@ const useGridColumnResize = (apiRef, props) => {
|
|
|
68084
68087
|
return;
|
|
68085
68088
|
}
|
|
68086
68089
|
let newWidth = computeNewWidth(initialOffsetToSeparator.current, finger.x, refs.columnHeaderElement.getBoundingClientRect(), resizeDirection.current);
|
|
68087
|
-
newWidth = clamp$
|
|
68090
|
+
newWidth = clamp$6(newWidth, refs.colDef.minWidth, refs.colDef.maxWidth);
|
|
68088
68091
|
updateWidth(newWidth);
|
|
68089
68092
|
const params2 = {
|
|
68090
68093
|
element: refs.columnHeaderElement,
|
|
@@ -116653,7 +116656,7 @@ function acos$4(radians2, result) {
|
|
|
116653
116656
|
function atan$3(radians2, result) {
|
|
116654
116657
|
return map$3(radians2, (angle2) => Math.atan(angle2), result);
|
|
116655
116658
|
}
|
|
116656
|
-
function clamp$
|
|
116659
|
+
function clamp$5(value2, min2, max2) {
|
|
116657
116660
|
return map$3(value2, (value3) => Math.max(min2, Math.min(max2, value3)));
|
|
116658
116661
|
}
|
|
116659
116662
|
function lerp$8(a2, b2, t4) {
|
|
@@ -119623,7 +119626,7 @@ class SphericalCoordinates {
|
|
|
119623
119626
|
this.radius = length$5(v);
|
|
119624
119627
|
if (this.radius > 0) {
|
|
119625
119628
|
this.theta = Math.atan2(v[0], v[1]);
|
|
119626
|
-
this.phi = Math.acos(clamp$
|
|
119629
|
+
this.phi = Math.acos(clamp$5(v[2] / this.radius, -1, 1));
|
|
119627
119630
|
}
|
|
119628
119631
|
return this.check();
|
|
119629
119632
|
}
|
|
@@ -119878,7 +119881,7 @@ class Euler extends MathArray {
|
|
|
119878
119881
|
order2 = order2 || this[3];
|
|
119879
119882
|
switch (order2) {
|
|
119880
119883
|
case Euler.XYZ:
|
|
119881
|
-
this[1] = Math.asin(clamp$
|
|
119884
|
+
this[1] = Math.asin(clamp$5(m13, -1, 1));
|
|
119882
119885
|
if (Math.abs(m13) < ALMOST_ONE) {
|
|
119883
119886
|
this[0] = Math.atan2(-m23, m33);
|
|
119884
119887
|
this[2] = Math.atan2(-m12, m11);
|
|
@@ -119888,7 +119891,7 @@ class Euler extends MathArray {
|
|
|
119888
119891
|
}
|
|
119889
119892
|
break;
|
|
119890
119893
|
case Euler.YXZ:
|
|
119891
|
-
this[0] = Math.asin(-clamp$
|
|
119894
|
+
this[0] = Math.asin(-clamp$5(m23, -1, 1));
|
|
119892
119895
|
if (Math.abs(m23) < ALMOST_ONE) {
|
|
119893
119896
|
this[1] = Math.atan2(m13, m33);
|
|
119894
119897
|
this[2] = Math.atan2(m21, m22);
|
|
@@ -119898,7 +119901,7 @@ class Euler extends MathArray {
|
|
|
119898
119901
|
}
|
|
119899
119902
|
break;
|
|
119900
119903
|
case Euler.ZXY:
|
|
119901
|
-
this[0] = Math.asin(clamp$
|
|
119904
|
+
this[0] = Math.asin(clamp$5(m32, -1, 1));
|
|
119902
119905
|
if (Math.abs(m32) < ALMOST_ONE) {
|
|
119903
119906
|
this[1] = Math.atan2(-m31, m33);
|
|
119904
119907
|
this[2] = Math.atan2(-m12, m22);
|
|
@@ -119908,7 +119911,7 @@ class Euler extends MathArray {
|
|
|
119908
119911
|
}
|
|
119909
119912
|
break;
|
|
119910
119913
|
case Euler.ZYX:
|
|
119911
|
-
this[1] = Math.asin(-clamp$
|
|
119914
|
+
this[1] = Math.asin(-clamp$5(m31, -1, 1));
|
|
119912
119915
|
if (Math.abs(m31) < ALMOST_ONE) {
|
|
119913
119916
|
this[0] = Math.atan2(m32, m33);
|
|
119914
119917
|
this[2] = Math.atan2(m21, m11);
|
|
@@ -119918,7 +119921,7 @@ class Euler extends MathArray {
|
|
|
119918
119921
|
}
|
|
119919
119922
|
break;
|
|
119920
119923
|
case Euler.YZX:
|
|
119921
|
-
this[2] = Math.asin(clamp$
|
|
119924
|
+
this[2] = Math.asin(clamp$5(m21, -1, 1));
|
|
119922
119925
|
if (Math.abs(m21) < ALMOST_ONE) {
|
|
119923
119926
|
this[0] = Math.atan2(-m23, m22);
|
|
119924
119927
|
this[1] = Math.atan2(-m31, m11);
|
|
@@ -119928,7 +119931,7 @@ class Euler extends MathArray {
|
|
|
119928
119931
|
}
|
|
119929
119932
|
break;
|
|
119930
119933
|
case Euler.XZY:
|
|
119931
|
-
this[2] = Math.asin(-clamp$
|
|
119934
|
+
this[2] = Math.asin(-clamp$5(m12, -1, 1));
|
|
119932
119935
|
if (Math.abs(m12) < ALMOST_ONE) {
|
|
119933
119936
|
this[0] = Math.atan2(m32, m22);
|
|
119934
119937
|
this[1] = Math.atan2(m13, m11);
|
|
@@ -123072,7 +123075,7 @@ function mod$2(value2, divisor) {
|
|
|
123072
123075
|
function lerp$3(start2, end2, step) {
|
|
123073
123076
|
return step * end2 + (1 - step) * start2;
|
|
123074
123077
|
}
|
|
123075
|
-
function clamp$
|
|
123078
|
+
function clamp$4(x2, min2, max2) {
|
|
123076
123079
|
return x2 < min2 ? min2 : x2 > max2 ? max2 : x2;
|
|
123077
123080
|
}
|
|
123078
123081
|
function ieLog2(x2) {
|
|
@@ -123218,7 +123221,7 @@ function getProjectionParameters(options) {
|
|
|
123218
123221
|
cameraToSeaLevelDistance += center2[2] * scale2 / Math.cos(pitchRadians) / height2;
|
|
123219
123222
|
}
|
|
123220
123223
|
const fovAboveCenter = fovRadians * (0.5 + (offset2 ? offset2[1] : 0) / height2);
|
|
123221
|
-
const topHalfSurfaceDistance = Math.sin(fovAboveCenter) * cameraToSeaLevelDistance / Math.sin(clamp$
|
|
123224
|
+
const topHalfSurfaceDistance = Math.sin(fovAboveCenter) * cameraToSeaLevelDistance / Math.sin(clamp$4(Math.PI / 2 - pitchRadians - fovAboveCenter, 0.01, Math.PI - 0.01));
|
|
123222
123225
|
const furthestDistance = Math.sin(pitchRadians) * topHalfSurfaceDistance + cameraToSeaLevelDistance;
|
|
123223
123226
|
const horizonDistance = cameraToSeaLevelDistance * 10;
|
|
123224
123227
|
const farZ = Math.min(furthestDistance * farZMultiplier, horizonDistance);
|
|
@@ -123276,8 +123279,8 @@ function fitBounds(options) {
|
|
|
123276
123279
|
} = options;
|
|
123277
123280
|
const [[west, south], [east, north]] = bounds2;
|
|
123278
123281
|
const padding2 = getPaddingObject(options.padding);
|
|
123279
|
-
const nw = lngLatToWorld([west, clamp$
|
|
123280
|
-
const se = lngLatToWorld([east, clamp$
|
|
123282
|
+
const nw = lngLatToWorld([west, clamp$4(north, -MAX_LATITUDE, MAX_LATITUDE)]);
|
|
123283
|
+
const se = lngLatToWorld([east, clamp$4(south, -MAX_LATITUDE, MAX_LATITUDE)]);
|
|
123281
123284
|
const size2 = [Math.max(Math.abs(se[0] - nw[0]), minExtent), Math.max(Math.abs(se[1] - nw[1]), minExtent)];
|
|
123282
123285
|
const targetSize = [width2 - padding2.left - padding2.right - Math.abs(offset2[0]) * 2, height2 - padding2.top - padding2.bottom - Math.abs(offset2[1]) * 2];
|
|
123283
123286
|
assert$b(targetSize[0] > 0 && targetSize[1] > 0);
|
|
@@ -124567,8 +124570,8 @@ function createProjectionMatrix({
|
|
|
124567
124570
|
top: top2 = 0,
|
|
124568
124571
|
bottom: bottom2 = 0
|
|
124569
124572
|
} = padding2;
|
|
124570
|
-
const offsetX = clamp$
|
|
124571
|
-
const offsetY = clamp$
|
|
124573
|
+
const offsetX = clamp$5((left2 + width2 - right2) / 2, 0, width2) - width2 / 2;
|
|
124574
|
+
const offsetY = clamp$5((top2 + height2 - bottom2) / 2, 0, height2) - height2 / 2;
|
|
124572
124575
|
matrix2[8] -= offsetX * 2 / width2;
|
|
124573
124576
|
matrix2[9] += offsetY * 2 / height2;
|
|
124574
124577
|
}
|
|
@@ -124683,7 +124686,7 @@ class Viewport {
|
|
|
124683
124686
|
projectFlat(xyz) {
|
|
124684
124687
|
if (this.isGeospatial) {
|
|
124685
124688
|
const result = lngLatToWorld(xyz);
|
|
124686
|
-
result[1] = clamp$
|
|
124689
|
+
result[1] = clamp$5(result[1], -318, 830);
|
|
124687
124690
|
return result;
|
|
124688
124691
|
}
|
|
124689
124692
|
return xyz;
|
|
@@ -127400,7 +127403,7 @@ class MapState extends ViewState {
|
|
|
127400
127403
|
minZoom
|
|
127401
127404
|
} = this.getViewportProps();
|
|
127402
127405
|
let zoom2 = startZoom + Math.log2(scale2);
|
|
127403
|
-
zoom2 = clamp$
|
|
127406
|
+
zoom2 = clamp$5(zoom2, minZoom, maxZoom);
|
|
127404
127407
|
const zoomedViewport = this.makeViewport({
|
|
127405
127408
|
...this.getViewportProps(),
|
|
127406
127409
|
zoom: zoom2
|
|
@@ -127477,13 +127480,13 @@ class MapState extends ViewState {
|
|
|
127477
127480
|
minZoom,
|
|
127478
127481
|
zoom: zoom2
|
|
127479
127482
|
} = props;
|
|
127480
|
-
props.zoom = clamp$
|
|
127483
|
+
props.zoom = clamp$5(zoom2, minZoom, maxZoom);
|
|
127481
127484
|
const {
|
|
127482
127485
|
maxPitch,
|
|
127483
127486
|
minPitch,
|
|
127484
127487
|
pitch
|
|
127485
127488
|
} = props;
|
|
127486
|
-
props.pitch = clamp$
|
|
127489
|
+
props.pitch = clamp$5(pitch, minPitch, maxPitch);
|
|
127487
127490
|
const {
|
|
127488
127491
|
normalize: normalize2 = true
|
|
127489
127492
|
} = props;
|
|
@@ -127544,7 +127547,7 @@ class MapState extends ViewState {
|
|
|
127544
127547
|
deltaScaleY = 1 - centerY / startY;
|
|
127545
127548
|
}
|
|
127546
127549
|
}
|
|
127547
|
-
deltaScaleY = clamp$
|
|
127550
|
+
deltaScaleY = clamp$5(deltaScaleY, -1, 1);
|
|
127548
127551
|
const {
|
|
127549
127552
|
minPitch,
|
|
127550
127553
|
maxPitch
|
|
@@ -127673,8 +127676,8 @@ function getProjectionMatrix({
|
|
|
127673
127676
|
top: t4 = 0,
|
|
127674
127677
|
bottom: b2 = 0
|
|
127675
127678
|
} = padding2;
|
|
127676
|
-
const offsetX = clamp$
|
|
127677
|
-
const offsetY = clamp$
|
|
127679
|
+
const offsetX = clamp$5((l2 + width2 - r3) / 2, 0, width2) - width2 / 2;
|
|
127680
|
+
const offsetY = clamp$5((t4 + height2 - b2) / 2, 0, height2) - height2 / 2;
|
|
127678
127681
|
left2 -= offsetX;
|
|
127679
127682
|
right2 -= offsetX;
|
|
127680
127683
|
bottom2 += offsetY;
|
|
@@ -127987,7 +127990,7 @@ class OrbitState extends ViewState {
|
|
|
127987
127990
|
startZoom = this.getViewportProps().zoom;
|
|
127988
127991
|
}
|
|
127989
127992
|
const zoom2 = startZoom + Math.log2(scale2);
|
|
127990
|
-
return clamp$
|
|
127993
|
+
return clamp$5(zoom2, minZoom, maxZoom);
|
|
127991
127994
|
}
|
|
127992
127995
|
_panFromCenter(offset2) {
|
|
127993
127996
|
const {
|
|
@@ -128017,8 +128020,8 @@ class OrbitState extends ViewState {
|
|
|
128017
128020
|
minRotationX,
|
|
128018
128021
|
rotationOrbit
|
|
128019
128022
|
} = props;
|
|
128020
|
-
props.zoom = Array.isArray(zoom2) ? [clamp$
|
|
128021
|
-
props.rotationX = clamp$
|
|
128023
|
+
props.zoom = Array.isArray(zoom2) ? [clamp$5(zoom2[0], minZoom, maxZoom), clamp$5(zoom2[1], minZoom, maxZoom)] : clamp$5(zoom2, minZoom, maxZoom);
|
|
128024
|
+
props.rotationX = clamp$5(props.rotationX, minRotationX, maxRotationX);
|
|
128022
128025
|
if (rotationOrbit < -180 || rotationOrbit > 180) {
|
|
128023
128026
|
props.rotationOrbit = mod$1(rotationOrbit + 180, 360) - 180;
|
|
128024
128027
|
}
|
|
@@ -128062,10 +128065,10 @@ class OrthographicState extends OrbitState {
|
|
|
128062
128065
|
let [newZoomX, newZoomY] = startZoom;
|
|
128063
128066
|
switch (this.zoomAxis) {
|
|
128064
128067
|
case "X":
|
|
128065
|
-
newZoomX = clamp$
|
|
128068
|
+
newZoomX = clamp$5(newZoomX + deltaZoom, minZoom, maxZoom);
|
|
128066
128069
|
break;
|
|
128067
128070
|
case "Y":
|
|
128068
|
-
newZoomY = clamp$
|
|
128071
|
+
newZoomY = clamp$5(newZoomY + deltaZoom, minZoom, maxZoom);
|
|
128069
128072
|
break;
|
|
128070
128073
|
default:
|
|
128071
128074
|
let z2 = Math.min(newZoomX + deltaZoom, newZoomY + deltaZoom);
|
|
@@ -128081,7 +128084,7 @@ class OrthographicState extends OrbitState {
|
|
|
128081
128084
|
}
|
|
128082
128085
|
return [newZoomX, newZoomY];
|
|
128083
128086
|
}
|
|
128084
|
-
return clamp$
|
|
128087
|
+
return clamp$5(startZoom + deltaZoom, minZoom, maxZoom);
|
|
128085
128088
|
}
|
|
128086
128089
|
}
|
|
128087
128090
|
class OrthographicController extends Controller {
|
|
@@ -136820,7 +136823,7 @@ class FirstPersonState extends ViewState {
|
|
|
136820
136823
|
longitude: longitude2,
|
|
136821
136824
|
bearing
|
|
136822
136825
|
} = props;
|
|
136823
|
-
props.pitch = clamp$
|
|
136826
|
+
props.pitch = clamp$5(pitch, minPitch, maxPitch);
|
|
136824
136827
|
if (longitude2 !== null && (longitude2 < -180 || longitude2 > 180)) {
|
|
136825
136828
|
props.longitude = mod$1(longitude2 + 180, 360) - 180;
|
|
136826
136829
|
}
|
|
@@ -136869,7 +136872,7 @@ class GlobeState extends MapState {
|
|
|
136869
136872
|
minZoom,
|
|
136870
136873
|
zoom: zoom2
|
|
136871
136874
|
} = props;
|
|
136872
|
-
props.zoom = clamp$
|
|
136875
|
+
props.zoom = clamp$5(zoom2, minZoom, maxZoom);
|
|
136873
136876
|
const {
|
|
136874
136877
|
longitude: longitude2,
|
|
136875
136878
|
latitude
|
|
@@ -136877,7 +136880,7 @@ class GlobeState extends MapState {
|
|
|
136877
136880
|
if (longitude2 < -180 || longitude2 > 180) {
|
|
136878
136881
|
props.longitude = mod$1(longitude2 + 180, 360) - 180;
|
|
136879
136882
|
}
|
|
136880
|
-
props.latitude = clamp$
|
|
136883
|
+
props.latitude = clamp$5(latitude, -89, 89);
|
|
136881
136884
|
return props;
|
|
136882
136885
|
}
|
|
136883
136886
|
}
|
|
@@ -144524,7 +144527,7 @@ function getQuantileDomain(data2, valueAccessor) {
|
|
|
144524
144527
|
function getOrdinalDomain(data2, valueAccessor) {
|
|
144525
144528
|
return unique$1(getTruthyValues(data2, valueAccessor));
|
|
144526
144529
|
}
|
|
144527
|
-
function clamp$
|
|
144530
|
+
function clamp$3(value2, min2, max2) {
|
|
144528
144531
|
return Math.max(min2, Math.min(max2, value2));
|
|
144529
144532
|
}
|
|
144530
144533
|
const defaultGetValue = (points2) => points2.length;
|
|
@@ -144585,7 +144588,7 @@ class BinSorter {
|
|
|
144585
144588
|
if (len2 < 2) {
|
|
144586
144589
|
return [0, 0];
|
|
144587
144590
|
}
|
|
144588
|
-
const [lower2, upper] = percentileRange.map((n3) => clamp$
|
|
144591
|
+
const [lower2, upper] = percentileRange.map((n3) => clamp$3(n3, 0, 100));
|
|
144589
144592
|
const lowerIdx = Math.ceil(lower2 / 100 * (len2 - 1));
|
|
144590
144593
|
const upperIdx = Math.floor(upper / 100 * (len2 - 1));
|
|
144591
144594
|
return [lowerIdx, upperIdx];
|
|
@@ -167379,7 +167382,7 @@ new Vector3();
|
|
|
167379
167382
|
new Vector2();
|
|
167380
167383
|
new Vector2();
|
|
167381
167384
|
function fromSNorm(value2, rangeMaximum = 255) {
|
|
167382
|
-
return clamp$
|
|
167385
|
+
return clamp$5(value2, 0, rangeMaximum) / rangeMaximum * 2 - 1;
|
|
167383
167386
|
}
|
|
167384
167387
|
function signNotZero(value2) {
|
|
167385
167388
|
return value2 < 0 ? -1 : 1;
|
|
@@ -206496,7 +206499,7 @@ const esm = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty(
|
|
|
206496
206499
|
asin: asin$5,
|
|
206497
206500
|
assert: assert$c,
|
|
206498
206501
|
atan: atan$3,
|
|
206499
|
-
clamp: clamp$
|
|
206502
|
+
clamp: clamp$5,
|
|
206500
206503
|
clone: clone$5,
|
|
206501
206504
|
config: config$3,
|
|
206502
206505
|
configure,
|
|
@@ -210925,22 +210928,22 @@ async function getDecoder(fileDirectory) {
|
|
|
210925
210928
|
const Decoder = await importFn();
|
|
210926
210929
|
return new Decoder(fileDirectory);
|
|
210927
210930
|
}
|
|
210928
|
-
addDecoder([void 0, 1], () => import("./raw-
|
|
210929
|
-
addDecoder(5, () => import("./lzw-
|
|
210931
|
+
addDecoder([void 0, 1], () => import("./raw-Dcz65jWu.js").then((m2) => m2.default));
|
|
210932
|
+
addDecoder(5, () => import("./lzw-BlNLuocx.js").then((m2) => m2.default));
|
|
210930
210933
|
addDecoder(6, () => {
|
|
210931
210934
|
throw new Error("old style JPEG compression is not supported.");
|
|
210932
210935
|
});
|
|
210933
|
-
addDecoder(7, () => import("./jpeg-
|
|
210934
|
-
addDecoder([8, 32946], () => import("./deflate-
|
|
210935
|
-
addDecoder(32773, () => import("./packbits-
|
|
210936
|
+
addDecoder(7, () => import("./jpeg-4XvdCEqV.js").then((m2) => m2.default));
|
|
210937
|
+
addDecoder([8, 32946], () => import("./deflate-nYfk3Mbe.js").then((m2) => m2.default));
|
|
210938
|
+
addDecoder(32773, () => import("./packbits-D7jhgu7h.js").then((m2) => m2.default));
|
|
210936
210939
|
addDecoder(
|
|
210937
210940
|
34887,
|
|
210938
|
-
() => import("./lerc-
|
|
210941
|
+
() => import("./lerc-J5N91MJw.js").then(async (m2) => {
|
|
210939
210942
|
await m2.zstd.init();
|
|
210940
210943
|
return m2;
|
|
210941
210944
|
}).then((m2) => m2.default)
|
|
210942
210945
|
);
|
|
210943
|
-
addDecoder(50001, () => import("./webimage-
|
|
210946
|
+
addDecoder(50001, () => import("./webimage-CMXekglL.js").then((m2) => m2.default));
|
|
210944
210947
|
function copyNewSize(array2, width2, height2, samplesPerPixel = 1) {
|
|
210945
210948
|
return new (Object.getPrototypeOf(array2)).constructor(width2 * height2 * samplesPerPixel);
|
|
210946
210949
|
}
|
|
@@ -228161,7 +228164,7 @@ const BASE_POINT_SIZE = 5;
|
|
|
228161
228164
|
const LARGE_DATASET_CELL_COUNT = 1e4;
|
|
228162
228165
|
const SMALL_DATASET_CELL_COUNT = 100;
|
|
228163
228166
|
function getInitialPointSize(numCells = LARGE_DATASET_CELL_COUNT) {
|
|
228164
|
-
return BASE_POINT_SIZE / clamp$
|
|
228167
|
+
return BASE_POINT_SIZE / clamp$8(numCells, SMALL_DATASET_CELL_COUNT, LARGE_DATASET_CELL_COUNT);
|
|
228165
228168
|
}
|
|
228166
228169
|
function getPointSizeDevicePixels(devicePixelRatio2, zoom2, xRange, yRange, width2, height2, numCells) {
|
|
228167
228170
|
const pointSize = getInitialPointSize(numCells);
|
|
@@ -228174,7 +228177,7 @@ function getPointSizeDevicePixels(devicePixelRatio2, zoom2, xRange, yRange, widt
|
|
|
228174
228177
|
const diagonalAxisRange = Math.sqrt(xAxisRange ** 2 + yAxisRange ** 2);
|
|
228175
228178
|
const diagonalFraction = pointSize / diagonalAxisRange;
|
|
228176
228179
|
const deviceSize = diagonalFraction * diagonalScreenSize;
|
|
228177
|
-
const pointSizeDevicePixels = clamp$
|
|
228180
|
+
const pointSizeDevicePixels = clamp$8(deviceSize, pointScreenSizeMin, pointScreenSizeMax);
|
|
228178
228181
|
return pointSizeDevicePixels;
|
|
228179
228182
|
}
|
|
228180
228183
|
function getPointOpacity(zoom2, xRange, yRange, width2, height2, numCells, avgFillDensity) {
|
|
@@ -228203,7 +228206,7 @@ function getPointOpacity(zoom2, xRange, yRange, width2, height2, numCells, avgFi
|
|
|
228203
228206
|
rho = Math.min(1, 1 / 10 ** (Math.log10(N2) - 3));
|
|
228204
228207
|
}
|
|
228205
228208
|
const alpha2 = rho * W * H / N2 * (Y02 / Y3) * (X02 / X3);
|
|
228206
|
-
const pointOpacity = clamp$
|
|
228209
|
+
const pointOpacity = clamp$8(alpha2, 1.01 / 255, 1);
|
|
228207
228210
|
return pointOpacity;
|
|
228208
228211
|
}
|
|
228209
228212
|
const CELLS_LAYER_ID$1 = "scatterplot";
|
|
@@ -228819,7 +228822,7 @@ typeof SuppressedError === "function" ? SuppressedError : function(error2, suppr
|
|
|
228819
228822
|
var e3 = new Error(message);
|
|
228820
228823
|
return e3.name = "SuppressedError", e3.error = error2, e3.suppressed = suppressed, e3;
|
|
228821
228824
|
};
|
|
228822
|
-
const FEATURE_AGGREGATION_STRATEGIES$
|
|
228825
|
+
const FEATURE_AGGREGATION_STRATEGIES$2 = ["first", "last", "sum", "mean"];
|
|
228823
228826
|
function ScatterplotOptions(props) {
|
|
228824
228827
|
const { children: children3, observationsLabel, cellRadius, setCellRadius, cellRadiusMode, setCellRadiusMode, cellOpacity, setCellOpacity, cellOpacityMode, setCellOpacityMode, cellSetLabelsVisible, setCellSetLabelsVisible, tooltipsVisible, setTooltipsVisible, cellSetLabelSize, setCellSetLabelSize, cellSetPolygonsVisible, setCellSetPolygonsVisible, cellColorEncoding, setCellColorEncoding, geneExpressionColormap, setGeneExpressionColormap, geneExpressionColormapRange, setGeneExpressionColormapRange, embeddingPointsVisible, setEmbeddingPointsVisible, embeddingContoursVisible, setEmbeddingContoursVisible, embeddingContoursFilled, setEmbeddingContoursFilled, contourPercentiles, setContourPercentiles, defaultContourPercentiles, contourColorEncoding, setContourColorEncoding, featureAggregationStrategy, setFeatureAggregationStrategy } = props;
|
|
228825
228828
|
const scatterplotOptionsId = $bdb11010cef70236$export$f680877a34711e37();
|
|
@@ -228944,7 +228947,7 @@ function ScatterplotOptions(props) {
|
|
|
228944
228947
|
return "Scatterplot sliders for contour percentile thresholds";
|
|
228945
228948
|
}, id: `scatterplot-contour-percentiles-${scatterplotOptionsId}`, valueLabelDisplay: "auto", step: 5e-3, min: 9e-3, max: 0.999 }) })] }), setFeatureAggregationStrategy ? jsxs(TableRow, { children: [jsx$1(TableCell, { className: classes2.labelCell, variant: "head", scope: "row", children: jsx$1("label", { htmlFor: `feature-aggregation-strategy-${scatterplotOptionsId}`, children: "Feature Aggregation Strategy" }) }), jsx$1(TableCell, { className: classes2.inputCell, variant: "body", children: jsx$1(OptionSelect, { className: classes2.select, value: featureAggregationStrategy ?? "first", onChange: handleFeatureAggregationStrategyChange, inputProps: {
|
|
228946
228949
|
id: `feature-aggregation-strategy-${scatterplotOptionsId}`
|
|
228947
|
-
}, children: FEATURE_AGGREGATION_STRATEGIES$
|
|
228950
|
+
}, children: FEATURE_AGGREGATION_STRATEGIES$2.map((opt) => jsx$1("option", { value: opt, children: capitalize$3(opt) }, opt)) }) })] }) : null] });
|
|
228948
228951
|
}
|
|
228949
228952
|
const useStyles$t = makeStyles()((theme) => ({
|
|
228950
228953
|
tooltipAnchor: {
|
|
@@ -233616,7 +233619,7 @@ function ChannelNamesLegend(props) {
|
|
|
233616
233619
|
}) : null });
|
|
233617
233620
|
}
|
|
233618
233621
|
const DEFAULT_CONTOUR_PERCENTILES = [0.09, 0.9, 0.99];
|
|
233619
|
-
const DEFAULT_FEATURE_AGGREGATION_STRATEGY$
|
|
233622
|
+
const DEFAULT_FEATURE_AGGREGATION_STRATEGY$3 = "first";
|
|
233620
233623
|
function EmbeddingScatterplotSubscriber(props) {
|
|
233621
233624
|
const {
|
|
233622
233625
|
uuid: uuid2,
|
|
@@ -233643,7 +233646,7 @@ function EmbeddingScatterplotSubscriber(props) {
|
|
|
233643
233646
|
const { embeddingZoom: initialZoom, embeddingTargetX: initialTargetX, embeddingTargetY: initialTargetY } = useInitialCoordination(COMPONENT_COORDINATION_TYPES[ViewType$1.SCATTERPLOT], coordinationScopes);
|
|
233644
233647
|
const observationsLabel = observationsLabelOverride || obsType;
|
|
233645
233648
|
const sampleSetSelection = sampleSetSelectionFromProps || sampleSetSelectionFromCoordination;
|
|
233646
|
-
const featureAggregationStrategyToUse = featureAggregationStrategy ?? DEFAULT_FEATURE_AGGREGATION_STRATEGY$
|
|
233649
|
+
const featureAggregationStrategyToUse = featureAggregationStrategy ?? DEFAULT_FEATURE_AGGREGATION_STRATEGY$3;
|
|
233647
233650
|
const [width2, height2, deckRef] = useDeckCanvasSize();
|
|
233648
233651
|
const title2 = titleOverride || `Scatterplot (${mapping})`;
|
|
233649
233652
|
const [
|
|
@@ -238315,7 +238318,7 @@ function cbrt(x2) {
|
|
|
238315
238318
|
function ceil$2(x2) {
|
|
238316
238319
|
return finalise(x2 = new this(x2), x2.e + 1, 2);
|
|
238317
238320
|
}
|
|
238318
|
-
function clamp$
|
|
238321
|
+
function clamp$2(x2, min2, max2) {
|
|
238319
238322
|
return new this(x2).clamp(min2, max2);
|
|
238320
238323
|
}
|
|
238321
238324
|
function config$1(obj) {
|
|
@@ -238486,7 +238489,7 @@ function clone$1(obj) {
|
|
|
238486
238489
|
Decimal3.atan2 = atan2$2;
|
|
238487
238490
|
Decimal3.cbrt = cbrt;
|
|
238488
238491
|
Decimal3.ceil = ceil$2;
|
|
238489
|
-
Decimal3.clamp = clamp$
|
|
238492
|
+
Decimal3.clamp = clamp$2;
|
|
238490
238493
|
Decimal3.cos = cos$3;
|
|
238491
238494
|
Decimal3.cosh = cosh;
|
|
238492
238495
|
Decimal3.div = div;
|
|
@@ -252470,6 +252473,16 @@ class RelaxedFetchStore extends FetchStore {
|
|
|
252470
252473
|
throw e3;
|
|
252471
252474
|
}
|
|
252472
252475
|
}
|
|
252476
|
+
async getRange(key2, range2, options = {}) {
|
|
252477
|
+
try {
|
|
252478
|
+
return await super.getRange(key2, range2, options);
|
|
252479
|
+
} catch (e3) {
|
|
252480
|
+
if (e3?.message?.startsWith("Unexpected response status 403") && true) {
|
|
252481
|
+
return void 0;
|
|
252482
|
+
}
|
|
252483
|
+
throw e3;
|
|
252484
|
+
}
|
|
252485
|
+
}
|
|
252473
252486
|
}
|
|
252474
252487
|
function transformEntriesForZipFileStore(entries2) {
|
|
252475
252488
|
const topLevelZarrDirectories = new Set(Object.keys(entries2).map((k) => k.split("/")[0]).filter((firstPathItem) => firstPathItem?.endsWith(".zarr")));
|
|
@@ -253379,7 +253392,8 @@ let Spatial$1 = class Spatial extends AbstractSpatialOrScatterplot {
|
|
|
253379
253392
|
"expressionData",
|
|
253380
253393
|
"cellColorEncoding",
|
|
253381
253394
|
"geneExpressionColormap",
|
|
253382
|
-
"segmentationLayerCallbacks"
|
|
253395
|
+
"segmentationLayerCallbacks",
|
|
253396
|
+
"getExpressionValue"
|
|
253383
253397
|
].some(shallowDiff2)) {
|
|
253384
253398
|
this.onUpdateCellsLayer();
|
|
253385
253399
|
forceUpdate = true;
|
|
@@ -253439,6 +253453,7 @@ const useToggleStyles = makeStyles()(() => ({
|
|
|
253439
253453
|
padding: "0px"
|
|
253440
253454
|
}
|
|
253441
253455
|
}));
|
|
253456
|
+
const FEATURE_AGGREGATION_STRATEGIES$1 = ["first", "last", "sum", "mean"];
|
|
253442
253457
|
const ToggleFixedAxisButton = ({ setSpatialAxisFixed, spatialAxisFixed, use3d }) => {
|
|
253443
253458
|
const toggleAxisId = $bdb11010cef70236$export$f680877a34711e37();
|
|
253444
253459
|
const { classes: classes2 } = useToggleStyles();
|
|
@@ -253448,7 +253463,7 @@ const ToggleFixedAxisButton = ({ setSpatialAxisFixed, spatialAxisFixed, use3d })
|
|
|
253448
253463
|
} } }) })] });
|
|
253449
253464
|
};
|
|
253450
253465
|
function SpatialOptions(props) {
|
|
253451
|
-
const { observationsLabel, cellColorEncoding, setCellColorEncoding, setSpatialAxisFixed, spatialAxisFixed, use3d, tooltipsVisible, setTooltipsVisible, geneExpressionColormap, setGeneExpressionColormap, geneExpressionColormapRange, setGeneExpressionColormapRange, canShowExpressionOptions, canShowColorEncodingOption, canShow3DOptions } = props;
|
|
253466
|
+
const { observationsLabel, cellColorEncoding, setCellColorEncoding, setSpatialAxisFixed, spatialAxisFixed, use3d, tooltipsVisible, setTooltipsVisible, geneExpressionColormap, setGeneExpressionColormap, geneExpressionColormapRange, setGeneExpressionColormapRange, canShowExpressionOptions, canShowColorEncodingOption, canShow3DOptions, featureAggregationStrategy, setFeatureAggregationStrategy } = props;
|
|
253452
253467
|
const spatialOptionsId = $bdb11010cef70236$export$f680877a34711e37();
|
|
253453
253468
|
function handleGeneExpressionColormapChange(event2) {
|
|
253454
253469
|
setGeneExpressionColormap(event2.target.value);
|
|
@@ -253484,7 +253499,7 @@ function SpatialOptions(props) {
|
|
|
253484
253499
|
}, value: geneExpressionColormapRange, onChange: handleColormapRangeChangeDebounced, getAriaLabel: (index2) => {
|
|
253485
253500
|
const labelPrefix = index2 === 0 ? "Low value slider" : "High value slider";
|
|
253486
253501
|
return `${labelPrefix} for spatial gene expression colormap range`;
|
|
253487
|
-
}, id: `gene-expression-colormap-range-${spatialOptionsId}`, valueLabelDisplay: "auto", step: 5e-3, min: 0, max: 1 }) })] })] }) : null] });
|
|
253502
|
+
}, id: `gene-expression-colormap-range-${spatialOptionsId}`, valueLabelDisplay: "auto", step: 5e-3, min: 0, max: 1 }) })] }), setFeatureAggregationStrategy ? jsxs(TableRow, { children: [jsx$1(TableCell, { className: classes2.labelCell, variant: "head", scope: "row", children: jsx$1("label", { htmlFor: `feature-aggregation-strategy-${spatialOptionsId}`, children: "Feature Aggregation Strategy" }) }), jsx$1(TableCell, { className: classes2.inputCell, variant: "body", children: jsx$1(OptionSelect, { className: classes2.select, value: featureAggregationStrategy ?? "first", onChange: (e3) => setFeatureAggregationStrategy(e3.target.value), inputProps: { id: `feature-aggregation-strategy-${spatialOptionsId}` }, children: FEATURE_AGGREGATION_STRATEGIES$1.map((opt) => jsx$1("option", { value: opt, children: capitalize$3(opt) }, opt)) }) })] }) : null] }) : null] });
|
|
253488
253503
|
}
|
|
253489
253504
|
function SpatialTooltipSubscriber$1(props) {
|
|
253490
253505
|
const { parentUuid, obsHighlight, width: width2, height: height2, getObsInfo: getObsInfo2, hoverData, hoverCoord, hoverMode, useHoverInfoForTooltip, getObsIdFromHoverData, featureType, featureLabelsMap } = props;
|
|
@@ -253516,12 +253531,13 @@ function SpatialTooltipSubscriber$1(props) {
|
|
|
253516
253531
|
}
|
|
253517
253532
|
return cellInfo ? jsx$1(Tooltip2D, { x: x2, y: y2, parentUuid, sourceUuid, parentWidth: width2, parentHeight: height2, children: jsx$1(TooltipContent, { info: cellInfo, featureType, featureLabelsMap }) }) : null;
|
|
253518
253533
|
}
|
|
253534
|
+
const DEFAULT_FEATURE_AGGREGATION_STRATEGY$2 = "first";
|
|
253519
253535
|
function SpatialSubscriber$1(props) {
|
|
253520
253536
|
const { uuid: uuid2, coordinationScopes, closeButtonVisible, downloadButtonVisible, removeGridComponent, observationsLabelOverride, subobservationsLabelOverride: subobservationsLabel = "molecule", theme, title: title2 = "Spatial", disable3d, globalDisable3d, useFullResolutionImage = {}, channelNamesVisible = false, helpText = ViewHelpMapping.SPATIAL } = props;
|
|
253521
253537
|
const loaders = useLoaders();
|
|
253522
253538
|
const setComponentHover = useSetComponentHover();
|
|
253523
253539
|
const setComponentViewInfo = useSetComponentViewInfo(uuid2);
|
|
253524
|
-
const [{ dataset, obsType, featureType, featureValueType, spatialZoom: zoom2, spatialTargetX: targetX2, spatialTargetY: targetY2, spatialTargetZ: targetZ, spatialRotationX: rotationX, spatialRotationY: rotationY, spatialRotationZ: rotationZ, spatialRotationOrbit: rotationOrbit, spatialOrbitAxis: orbitAxis, spatialImageLayer: imageLayers, spatialSegmentationLayer: cellsLayer, spatialPointLayer: moleculesLayer, spatialNeighborhoodLayer: neighborhoodsLayer, obsFilter: cellFilter, obsHighlight: cellHighlight, moleculeHighlight, featureSelection: geneSelection, obsSetSelection: cellSetSelection, obsSetColor: cellSetColor, obsColorEncoding: cellColorEncoding, additionalObsSets: additionalCellSets, spatialAxisFixed, featureValueColormap: geneExpressionColormap, featureValueColormapRange: geneExpressionColormapRange, tooltipsVisible, photometricInterpretation: photometricInterpretationFromCoordination }, { setSpatialZoom: setZoom, setSpatialTargetX: setTargetX, setSpatialTargetY: setTargetY, setSpatialTargetZ: setTargetZ, setSpatialRotationX: setRotationX, setSpatialRotationOrbit: setRotationOrbit, setSpatialOrbitAxis: setOrbitAxis, setSpatialImageLayer: setRasterLayers, setSpatialSegmentationLayer: setCellsLayer, setSpatialPointLayer: setMoleculesLayer, setSpatialNeighborhoodLayer: setNeighborhoodsLayer, setObsFilter: setCellFilter, setObsSetSelection: setCellSetSelection, setObsHighlight: setCellHighlight, setObsSetColor: setCellSetColor, setObsColorEncoding: setCellColorEncoding, setAdditionalObsSets: setAdditionalCellSets, setMoleculeHighlight, setSpatialAxisFixed, setFeatureValueColormap: setGeneExpressionColormap, setFeatureValueColormapRange: setGeneExpressionColormapRange, setTooltipsVisible }] = useCoordination(COMPONENT_COORDINATION_TYPES[ViewType$1.SPATIAL], coordinationScopes);
|
|
253540
|
+
const [{ dataset, obsType, featureType, featureValueType, spatialZoom: zoom2, spatialTargetX: targetX2, spatialTargetY: targetY2, spatialTargetZ: targetZ, spatialRotationX: rotationX, spatialRotationY: rotationY, spatialRotationZ: rotationZ, spatialRotationOrbit: rotationOrbit, spatialOrbitAxis: orbitAxis, spatialImageLayer: imageLayers, spatialSegmentationLayer: cellsLayer, spatialPointLayer: moleculesLayer, spatialNeighborhoodLayer: neighborhoodsLayer, obsFilter: cellFilter, obsHighlight: cellHighlight, moleculeHighlight, featureSelection: geneSelection, obsSetSelection: cellSetSelection, obsSetColor: cellSetColor, obsColorEncoding: cellColorEncoding, additionalObsSets: additionalCellSets, spatialAxisFixed, featureValueColormap: geneExpressionColormap, featureValueColormapRange: geneExpressionColormapRange, tooltipsVisible, photometricInterpretation: photometricInterpretationFromCoordination, featureAggregationStrategy }, { setSpatialZoom: setZoom, setSpatialTargetX: setTargetX, setSpatialTargetY: setTargetY, setSpatialTargetZ: setTargetZ, setSpatialRotationX: setRotationX, setSpatialRotationOrbit: setRotationOrbit, setSpatialOrbitAxis: setOrbitAxis, setSpatialImageLayer: setRasterLayers, setSpatialSegmentationLayer: setCellsLayer, setSpatialPointLayer: setMoleculesLayer, setSpatialNeighborhoodLayer: setNeighborhoodsLayer, setObsFilter: setCellFilter, setObsSetSelection: setCellSetSelection, setObsHighlight: setCellHighlight, setObsSetColor: setCellSetColor, setObsColorEncoding: setCellColorEncoding, setAdditionalObsSets: setAdditionalCellSets, setMoleculeHighlight, setSpatialAxisFixed, setFeatureValueColormap: setGeneExpressionColormap, setFeatureValueColormapRange: setGeneExpressionColormapRange, setTooltipsVisible, setFeatureAggregationStrategy }] = useCoordination(COMPONENT_COORDINATION_TYPES[ViewType$1.SPATIAL], coordinationScopes);
|
|
253525
253541
|
const { spatialZoom: initialZoom, spatialTargetX: initialTargetX, spatialTargetY: initialTargetY, spatialTargetZ: initialTargetZ } = useInitialCoordination(COMPONENT_COORDINATION_TYPES[ViewType$1.SPATIAL], coordinationScopes);
|
|
253526
253542
|
const observationsLabel = observationsLabelOverride || obsType;
|
|
253527
253543
|
const [{ imageLayerCallbacks, segmentationLayerCallbacks }] = useAuxiliaryCoordination(COMPONENT_COORDINATION_TYPES.layerController, coordinationScopes);
|
|
@@ -253727,7 +253743,15 @@ function SpatialSubscriber$1(props) {
|
|
|
253727
253743
|
subobservationsLabel,
|
|
253728
253744
|
locationsCount
|
|
253729
253745
|
});
|
|
253730
|
-
const
|
|
253746
|
+
const featureAggregationStrategyToUse = featureAggregationStrategy ?? DEFAULT_FEATURE_AGGREGATION_STRATEGY$2;
|
|
253747
|
+
const aggregatedExpressionData = useMemo$1(() => {
|
|
253748
|
+
if (featureAggregationStrategyToUse != null && expressionData && expressionData.length > 1) {
|
|
253749
|
+
const aggregated = aggregateFeatureArrays(expressionData, featureAggregationStrategyToUse);
|
|
253750
|
+
return [aggregated];
|
|
253751
|
+
}
|
|
253752
|
+
return expressionData;
|
|
253753
|
+
}, [expressionData, featureAggregationStrategyToUse]);
|
|
253754
|
+
const { normData: uint8ExpressionData, extents: expressionExtents } = useUint8FeatureSelection(aggregatedExpressionData);
|
|
253731
253755
|
const shiftedExpressionDataForBitmask = useMemo$1(() => {
|
|
253732
253756
|
if (matrixObsIndex && uint8ExpressionData && obsSegmentationsType === "bitmask") {
|
|
253733
253757
|
const maxId = matrixObsIndex.reduce((max2, curr) => Math.max(max2, Number(curr)));
|
|
@@ -253752,7 +253776,7 @@ function SpatialSubscriber$1(props) {
|
|
|
253752
253776
|
const canShow3DOptions = canLoad3DLayers && !(disable3d?.length === imageLayerLoaders.length) && !globalDisable3d;
|
|
253753
253777
|
const options = useMemo$1(() => {
|
|
253754
253778
|
if (canShow3DOptions || hasExpressionData) {
|
|
253755
|
-
return jsx$1(SpatialOptions, { observationsLabel, cellColorEncoding, setCellColorEncoding, setSpatialAxisFixed, spatialAxisFixed, use3d, tooltipsVisible, setTooltipsVisible, geneExpressionColormap, setGeneExpressionColormap, geneExpressionColormapRange, setGeneExpressionColormapRange, canShowExpressionOptions: hasExpressionData, canShowColorEncodingOption: (hasLocationsData || hasSegmentationsData) && hasExpressionData, canShow3DOptions });
|
|
253779
|
+
return jsx$1(SpatialOptions, { observationsLabel, cellColorEncoding, setCellColorEncoding, setSpatialAxisFixed, spatialAxisFixed, use3d, tooltipsVisible, setTooltipsVisible, geneExpressionColormap, setGeneExpressionColormap, geneExpressionColormapRange, setGeneExpressionColormapRange, canShowExpressionOptions: hasExpressionData, canShowColorEncodingOption: (hasLocationsData || hasSegmentationsData) && hasExpressionData, canShow3DOptions, featureSelection: geneSelection, featureAggregationStrategy, setFeatureAggregationStrategy });
|
|
253756
253780
|
}
|
|
253757
253781
|
return null;
|
|
253758
253782
|
}, [
|
|
@@ -253771,7 +253795,10 @@ function SpatialSubscriber$1(props) {
|
|
|
253771
253795
|
spatialAxisFixed,
|
|
253772
253796
|
use3d,
|
|
253773
253797
|
tooltipsVisible,
|
|
253774
|
-
setTooltipsVisible
|
|
253798
|
+
setTooltipsVisible,
|
|
253799
|
+
geneSelection,
|
|
253800
|
+
featureAggregationStrategy,
|
|
253801
|
+
setFeatureAggregationStrategy
|
|
253775
253802
|
]);
|
|
253776
253803
|
useEffect(() => {
|
|
253777
253804
|
if (!hasSegmentationsData && cellsLayer && !obsSegmentations && !obsSegmentationsIndex && obsCentroids && obsCentroidsIndex) {
|
|
@@ -253834,7 +253861,8 @@ function SpatialSubscriber$1(props) {
|
|
|
253834
253861
|
featureValueColormap: geneExpressionColormap,
|
|
253835
253862
|
featureValueColormapRange: geneExpressionColormapRange,
|
|
253836
253863
|
setFeatureValueColormapRange: setGeneExpressionColormapRange,
|
|
253837
|
-
extent: expressionExtents?.[0]
|
|
253864
|
+
extent: expressionExtents?.[0],
|
|
253865
|
+
featureAggregationStrategy: featureAggregationStrategyToUse
|
|
253838
253866
|
})] });
|
|
253839
253867
|
}
|
|
253840
253868
|
function getInitialSpatialTargets({ width: width2, height: height2, obsPoints, obsSpots, obsSegmentations, obsSegmentationsLocations, segmentationChannelScopesByLayer, images, is3dMode: use3d, isReady }) {
|
|
@@ -255486,12 +255514,12 @@ class ErrorBoundary extends React__default.Component {
|
|
|
255486
255514
|
}
|
|
255487
255515
|
}
|
|
255488
255516
|
const LazySpatialThree = React__default.lazy(async () => {
|
|
255489
|
-
const { SpatialWrapper: SpatialWrapper2 } = await import("./index-
|
|
255517
|
+
const { SpatialWrapper: SpatialWrapper2 } = await import("./index-C2U2CO2P.js").then((n3) => n3.a);
|
|
255490
255518
|
return { default: SpatialWrapper2 };
|
|
255491
255519
|
});
|
|
255492
255520
|
const SpatialThreeAdapter = React__default.forwardRef((props, ref2) => jsx$1("div", { ref: ref2, style: { width: "100%", height: "100%" }, children: jsx$1(ErrorBoundary, { fallback: jsx$1("div", { children: "3D spatial view is not available in this environment." }), children: jsx$1(Suspense, { fallback: jsx$1("div", { children: "Loading..." }), children: jsx$1(LazySpatialThree, { ...props }) }) }) }));
|
|
255493
255521
|
const LazySpatialAccelerated = React__default.lazy(async () => {
|
|
255494
|
-
const { SpatialWrapper: SpatialWrapper2 } = await import("./index-
|
|
255522
|
+
const { SpatialWrapper: SpatialWrapper2 } = await import("./index-DuFOjj6d.js");
|
|
255495
255523
|
return { default: SpatialWrapper2 };
|
|
255496
255524
|
});
|
|
255497
255525
|
const SpatialAcceleratedAdapter = React__default.forwardRef((props, ref2) => jsx$1("div", { ref: ref2, style: { width: "100%", height: "100%" }, children: jsx$1(ErrorBoundary, { fallback: jsx$1("div", { children: "3D spatial view is not available in this environment." }), children: jsx$1(Suspense, { fallback: jsx$1("div", { children: "Loading..." }), children: jsx$1(LazySpatialAccelerated, { ...props }) }) }) }));
|
|
@@ -256219,8 +256247,8 @@ function getAxisSizes(transpose2, longestGeneLabel, longestCellLabel, hideObserv
|
|
|
256219
256247
|
const font2 = `${AXIS_LABEL_TEXT_SIZE}pt ${AXIS_FONT_FAMILY}`;
|
|
256220
256248
|
const geneLabelMaxWidth = hideVariableLabels ? 0 : getTextWidth(longestGeneLabel, font2) + AXIS_PADDING;
|
|
256221
256249
|
const cellLabelMaxWidth = hideObservationLabels ? 0 : getTextWidth(longestCellLabel, font2) + AXIS_PADDING;
|
|
256222
|
-
const axisOffsetLeft = clamp$
|
|
256223
|
-
const axisOffsetTop = clamp$
|
|
256250
|
+
const axisOffsetLeft = clamp$8(transpose2 ? geneLabelMaxWidth : cellLabelMaxWidth, AXIS_MIN_SIZE, AXIS_MAX_SIZE);
|
|
256251
|
+
const axisOffsetTop = clamp$8(transpose2 ? cellLabelMaxWidth : geneLabelMaxWidth, AXIS_MIN_SIZE, AXIS_MAX_SIZE);
|
|
256224
256252
|
return [axisOffsetLeft, axisOffsetTop];
|
|
256225
256253
|
}
|
|
256226
256254
|
function mouseToHeatmapPosition(mouseX, mouseY, { offsetLeft, offsetTop, targetX: targetX2, targetY: targetY2, scaleFactor, matrixWidth, matrixHeight, numRows, numCols }) {
|
|
@@ -256450,8 +256478,8 @@ const Heatmap$1 = forwardRef$1((props, deckRef) => {
|
|
|
256450
256478
|
const scaleFactor = 2 ** viewState.zoom;
|
|
256451
256479
|
const cellHeight = matrixHeight * scaleFactor / height2;
|
|
256452
256480
|
const cellWidth = matrixWidth * scaleFactor / width2;
|
|
256453
|
-
const aggSizeX = clamp$
|
|
256454
|
-
const aggSizeY = clamp$
|
|
256481
|
+
const aggSizeX = clamp$8(2 ** Math.ceil(Math.log2(1 / cellWidth)), MIN_ROW_AGG, MAX_ROW_AGG);
|
|
256482
|
+
const aggSizeY = clamp$8(2 ** Math.ceil(Math.log2(1 / cellHeight)), MIN_ROW_AGG, MAX_ROW_AGG);
|
|
256455
256483
|
const [targetX2, targetY2] = viewState.target;
|
|
256456
256484
|
useEffect(() => {
|
|
256457
256485
|
updateViewInfo({
|
|
@@ -256495,8 +256523,8 @@ const Heatmap$1 = forwardRef$1((props, deckRef) => {
|
|
|
256495
256523
|
const minTargetY = nextZoom === 0 ? 0 : -(matrixBottom - matrixBottom / nextScaleFactor);
|
|
256496
256524
|
const maxTargetY = -1 * minTargetY;
|
|
256497
256525
|
const nextTarget = [
|
|
256498
|
-
clamp$
|
|
256499
|
-
clamp$
|
|
256526
|
+
clamp$8(nextViewState.target[0], minTargetX, maxTargetX),
|
|
256527
|
+
clamp$8(nextViewState.target[1], minTargetY, maxTargetY)
|
|
256500
256528
|
];
|
|
256501
256529
|
setViewState({
|
|
256502
256530
|
zoom: nextZoom,
|
|
@@ -263641,7 +263669,7 @@ const useStyles$o = makeStyles()((theme) => ({
|
|
|
263641
263669
|
}));
|
|
263642
263670
|
const SHIFT_KEYCODE = 16;
|
|
263643
263671
|
function SelectableTable(props) {
|
|
263644
|
-
const { hasColorEncoding, columns: columns2, columnLabels, data: data2, onChange, idKey = "id",
|
|
263672
|
+
const { hasColorEncoding, columns: columns2, columnLabels, data: data2, onChange, idKey = "id", selectedIds, allowMultiple = false, allowUncheck = false, showTableHead = true, showTableInputs = false, testHeight = void 0, testWidth = void 0, width: width2, height: height2 } = props;
|
|
263645
263673
|
const [selectedRows, setSelectedRows] = useState(null);
|
|
263646
263674
|
const [isCheckingMultiple, setIsCheckingMultiple] = useState(false);
|
|
263647
263675
|
useEffect(() => {
|
|
@@ -263685,20 +263713,20 @@ function SelectableTable(props) {
|
|
|
263685
263713
|
})), [data2, idKey]);
|
|
263686
263714
|
const isSelected = useCallback((id2) => Array.isArray(selectedRows) && selectedRows.includes(id2), [selectedRows]);
|
|
263687
263715
|
useEffect(() => {
|
|
263688
|
-
|
|
263689
|
-
|
|
263690
|
-
|
|
263691
|
-
|
|
263692
|
-
|
|
263693
|
-
|
|
263694
|
-
|
|
263695
|
-
|
|
263696
|
-
|
|
263697
|
-
|
|
263698
|
-
setSelectedRows(null);
|
|
263716
|
+
if (selectedIds === void 0)
|
|
263717
|
+
return;
|
|
263718
|
+
setSelectedRows((prev2) => {
|
|
263719
|
+
const prevList = prev2 || [];
|
|
263720
|
+
const nextList = selectedIds || [];
|
|
263721
|
+
const sharedList = prevList.filter((id2) => nextList.includes(id2));
|
|
263722
|
+
const nextUnique = nextList.filter((id2) => !prevList.includes(id2));
|
|
263723
|
+
const merged = [...sharedList, ...nextUnique];
|
|
263724
|
+
if (isEqual$3(merged, prevList)) {
|
|
263725
|
+
return prev2;
|
|
263699
263726
|
}
|
|
263700
|
-
|
|
263701
|
-
|
|
263727
|
+
return merged.length > 0 ? merged : null;
|
|
263728
|
+
});
|
|
263729
|
+
}, [selectedIds]);
|
|
263702
263730
|
useEffect(() => {
|
|
263703
263731
|
if (!onChange || !selectedRows) {
|
|
263704
263732
|
return;
|
|
@@ -263770,8 +263798,7 @@ function FeatureList(props) {
|
|
|
263770
263798
|
const data2 = useMemo$1(() => {
|
|
263771
263799
|
const preSortedData = searchResults.filter((gene) => geneFilter ? geneFilter.includes(gene) : true).map((gene) => ({
|
|
263772
263800
|
key: gene,
|
|
263773
|
-
name: featureLabelsMap?.get(gene) || featureLabelsMap?.get(cleanFeatureId(gene)) || gene
|
|
263774
|
-
value: geneSelection ? geneSelection.includes(gene) : false
|
|
263801
|
+
name: featureLabelsMap?.get(gene) || featureLabelsMap?.get(cleanFeatureId(gene)) || gene
|
|
263775
263802
|
}));
|
|
263776
263803
|
if (preSortedData && featureListSort === "alphabetical" && preSortedData.length > 0) {
|
|
263777
263804
|
return preSortedData.sort((a2, b2) => a2[selectableTableSortKey].localeCompare(b2[selectableTableSortKey]));
|
|
@@ -263782,8 +263809,7 @@ function FeatureList(props) {
|
|
|
263782
263809
|
selectableTableSortKey,
|
|
263783
263810
|
searchResults,
|
|
263784
263811
|
geneFilter,
|
|
263785
|
-
featureLabelsMap
|
|
263786
|
-
geneSelection
|
|
263812
|
+
featureLabelsMap
|
|
263787
263813
|
]);
|
|
263788
263814
|
const handleChange = (event2) => {
|
|
263789
263815
|
setSearchTerm(event2.target.value);
|
|
@@ -263800,7 +263826,7 @@ function FeatureList(props) {
|
|
|
263800
263826
|
[primaryColumnName]
|
|
263801
263827
|
];
|
|
263802
263828
|
}, [showFeatureTable, primaryColumnName, hasFeatureLabels]);
|
|
263803
|
-
return width2 > 0 && height2 > 0 ? jsxs(Fragment, { children: [jsx$1("input", { className: classes2.searchBar, type: "text", placeholder: "Search", value: searchTerm, onChange: handleChange }), jsx$1(SelectableTable, { columns: columns2, columnLabels, data: data2, hasColorEncoding, idKey: "key",
|
|
263829
|
+
return width2 > 0 && height2 > 0 ? jsxs(Fragment, { children: [jsx$1("input", { className: classes2.searchBar, type: "text", placeholder: "Search", value: searchTerm, onChange: handleChange }), jsx$1(SelectableTable, { columns: columns2, columnLabels, data: data2, hasColorEncoding, idKey: "key", selectedIds: geneSelection, onChange, allowMultiple: enableMultiSelect, allowUncheck: enableMultiSelect, showTableHead: columnLabels.length > 1, width: width2, height: height2 - 34 })] }) : null;
|
|
263804
263830
|
}
|
|
263805
263831
|
function FeatureListOptions(props) {
|
|
263806
263832
|
const { children: children3, featureListSort, setFeatureListSort, featureListSortKey, setFeatureListSortKey, showFeatureTable, setShowFeatureTable, hasFeatureLabels, primaryColumnName } = props;
|
|
@@ -265316,7 +265342,7 @@ function PointLayerController(props) {
|
|
|
265316
265342
|
const [coloringTabIndex, setColoringTabIndex] = useState(0);
|
|
265317
265343
|
const { featureIndex } = pointMatrixIndicesData || {};
|
|
265318
265344
|
const hasSelectedFeatures = Array.isArray(featureSelection) && featureSelection.length > 0;
|
|
265319
|
-
return jsxs(Grid$1, { className: lcClasses.layerControllerGrid, children: [jsxs(Paper, { elevation: 4, className: lcClasses.layerControllerRoot, children: [jsxs(Grid$1, { container: true, direction: "row", justifyContent: "space-between", children: [jsx$1(Grid$1, { size: 1, children: jsx$1(Button, { onClick: handleVisibleChange, className: menuClasses.imageLayerVisibleButton, "aria-label": "Toggle layer visibility", children: jsx$1(Visibility, {}) }) }), jsx$1(Grid$1, { size: 1, children: jsx$1(ChannelColorPickerMenu, { theme, color: color2, setColor: setColor2, palette, isStaticColor, isColormap, featureValueColormap, visible }) }), jsx$1(Grid$1, { size: 6, children: jsx$1(Typography, { className: menuClasses.imageLayerName, children: label2 }) }), jsx$1(Grid$1, { size: 2, children: jsx$1(Slider, { value: opacity2, min: 0, max: 1, step: 1e-3, onChange: handleOpacityChange, className: menuClasses.imageLayerOpacitySlider, orientation: "horizontal", "aria-label": `Adjust opacity for layer ${label2}` }) }), jsx$1(Grid$1, { size: 1, children: jsx$1(PointLayerEllipsisMenu, { featureSelection, obsColorEncoding, setObsColorEncoding, featureValueColormapRange, setFeatureValueColormapRange, tooltipsVisible, setTooltipsVisible, tooltipCrosshairsVisible, setTooltipCrosshairsVisible, legendVisible, setLegendVisible, featureFilterMode, setFeatureFilterMode }) }), jsxs(Grid$1, { size: 1, container: true, direction: "row", children: [jsx$1(SvgPoints, { className: classes2.layerTypePointIcon }), null] })] }), loadingDoneFraction < 1 ? jsx$1(Grid$1, { size: 12, container: true, direction: "column", justifyContent: "space-between", className: classes2.pointFeatureControllerGrid, children: jsx$1(LinearProgress, { variant: loadingDoneFraction === 0 ? "indeterminate" : "determinate", value: loadingDoneFraction * 100 }) }) : null, null] }), hasSelectedFeatures ? jsxs(Fragment, { children: [featureSelection.map((featureName) => jsx$1(LayerPerFeatureController, { theme, featureName, featureColor, setFeatureColor, spatialLayerColor, featureIndex, featureValueColormap, featureSelection, setFeatureSelection, obsColorEncoding, loadingDoneFraction, opacity: opacity2, handleOpacityChange }, featureName)), jsx$1(Grid$1, { className: lcClasses.layerControllerGrid, children: jsx$1(Paper, { elevation: 2, className: lcClasses.layerControllerSubRow, children: jsxs(Grid$1, { container: true, direction: "row", justifyContent: "space-between", children: [jsx$1(Grid$1, { size: 1, children: jsx$1(Button, { onClick: () => setFeatureFilterMode(featureFilterMode === "featureSelection" ? null : "featureSelection"), className: menuClasses.imageLayerVisibleButton, "aria-label": "Toggle visibility of unselected points", children: featureFilterMode === "featureSelection" ? jsx$1(VisibilityOffIcon, {}) : jsx$1(VisibilityIcon, {}) }) }), jsx$1(Grid$1, { size: 1, children: jsx$1(ChannelColorPickerMenu, { theme, color: getDefaultColor("dark"), setColor: null, isStaticColor: true, isColormap: false, visible: true }) }), jsx$1(Grid$1, { size: 6, children: jsx$1(Typography, { className: menuClasses.imageLayerName, children: "Unselected" }) }), jsx$1(Grid$1, { size: 2, sx: { paddingRight: "12px", overflow: "visible" }, children: jsx$1(Slider, { value: opacity2, min: 0, max: 1, step: 1e-3, onChange: handleOpacityChange, className: menuClasses.imageLayerOpacitySlider, orientation: "horizontal", "aria-label": "Adjust opacity for unselected layer" }) }), jsx$1(Grid$1, { size: 1, children: jsx$1(SvgPoints, { className: classes2.layerTypePointIcon }) })] }) }) })] }) : null] });
|
|
265345
|
+
return jsxs(Grid$1, { className: lcClasses.layerControllerGrid, children: [jsxs(Paper, { elevation: 4, className: lcClasses.layerControllerRoot, children: [jsxs(Grid$1, { container: true, direction: "row", justifyContent: "space-between", children: [jsx$1(Grid$1, { size: 1, children: jsx$1(Button, { onClick: handleVisibleChange, className: menuClasses.imageLayerVisibleButton, "aria-label": "Toggle layer visibility", children: jsx$1(Visibility, {}) }) }), jsx$1(Grid$1, { size: 1, children: jsx$1(ChannelColorPickerMenu, { theme, color: color2, setColor: setColor2, palette, isStaticColor, isColormap, featureValueColormap, visible }) }), jsx$1(Grid$1, { size: 6, children: jsx$1(Typography, { className: menuClasses.imageLayerName, children: label2 }) }), jsx$1(Grid$1, { size: 2, children: jsx$1(Slider, { value: opacity2, min: 0, max: 1, step: 1e-3, onChange: handleOpacityChange, className: menuClasses.imageLayerOpacitySlider, orientation: "horizontal", "aria-label": `Adjust opacity for layer ${label2}` }) }), jsx$1(Grid$1, { size: 1, children: jsx$1(PointLayerEllipsisMenu, { featureSelection, obsColorEncoding, setObsColorEncoding, featureValueColormapRange, setFeatureValueColormapRange, tooltipsVisible, setTooltipsVisible, tooltipCrosshairsVisible, setTooltipCrosshairsVisible, legendVisible, setLegendVisible, featureFilterMode, setFeatureFilterMode }) }), jsxs(Grid$1, { size: 1, container: true, direction: "row", children: [jsx$1(SvgPoints, { className: classes2.layerTypePointIcon }), null] })] }), loadingDoneFraction < 1 ? jsx$1(Grid$1, { size: 12, container: true, direction: "column", justifyContent: "space-between", className: classes2.pointFeatureControllerGrid, children: jsx$1(LinearProgress, { variant: loadingDoneFraction === 0 ? "indeterminate" : "determinate", value: loadingDoneFraction * 100 }) }) : null, null] }), layerPerFeatureForPoints && hasSelectedFeatures ? jsxs(Fragment, { children: [featureSelection.map((featureName) => jsx$1(LayerPerFeatureController, { theme, featureName, featureColor, setFeatureColor, spatialLayerColor, featureIndex, featureValueColormap, featureSelection, setFeatureSelection, obsColorEncoding, loadingDoneFraction, opacity: opacity2, handleOpacityChange }, featureName)), jsx$1(Grid$1, { className: lcClasses.layerControllerGrid, children: jsx$1(Paper, { elevation: 2, className: lcClasses.layerControllerSubRow, children: jsxs(Grid$1, { container: true, direction: "row", justifyContent: "space-between", children: [jsx$1(Grid$1, { size: 1, children: jsx$1(Button, { onClick: () => setFeatureFilterMode(featureFilterMode === "featureSelection" ? null : "featureSelection"), className: menuClasses.imageLayerVisibleButton, "aria-label": "Toggle visibility of unselected points", children: featureFilterMode === "featureSelection" ? jsx$1(VisibilityOffIcon, {}) : jsx$1(VisibilityIcon, {}) }) }), jsx$1(Grid$1, { size: 1, children: jsx$1(ChannelColorPickerMenu, { theme, color: getDefaultColor("dark"), setColor: null, isStaticColor: true, isColormap: false, visible: true }) }), jsx$1(Grid$1, { size: 6, children: jsx$1(Typography, { className: menuClasses.imageLayerName, children: "Unselected" }) }), jsx$1(Grid$1, { size: 2, sx: { paddingRight: "12px", overflow: "visible" }, children: jsx$1(Slider, { value: opacity2, min: 0, max: 1, step: 1e-3, onChange: handleOpacityChange, className: menuClasses.imageLayerOpacitySlider, orientation: "horizontal", "aria-label": "Adjust opacity for unselected layer" }) }), jsx$1(Grid$1, { size: 1, children: jsx$1(SvgPoints, { className: classes2.layerTypePointIcon }) })] }) }) })] }) : null] });
|
|
265320
265346
|
}
|
|
265321
265347
|
const useStyles$e = makeStyles()(() => ({
|
|
265322
265348
|
layerTypeSegmentationIcon: {
|
|
@@ -270544,7 +270570,7 @@ function HiglassGlobalStyles(props) {
|
|
|
270544
270570
|
}
|
|
270545
270571
|
register({ dataFetcher: ZarrMultivecDataFetcher_default, config: ZarrMultivecDataFetcher_default.config }, { pluginType: "dataFetcher" });
|
|
270546
270572
|
const LazyHiGlassComponent = React__default.lazy(async () => {
|
|
270547
|
-
const { HiGlassComponent } = await import("./higlass-
|
|
270573
|
+
const { HiGlassComponent } = await import("./higlass-DPgS6S1h.js");
|
|
270548
270574
|
return { default: HiGlassComponent };
|
|
270549
270575
|
});
|
|
270550
270576
|
const HG_SIZE = 800;
|
|
@@ -273492,7 +273518,7 @@ function NeuroglancerGlobalStyles(props) {
|
|
|
273492
273518
|
const { classes: classes2 } = props;
|
|
273493
273519
|
return jsxs(Fragment, { children: [jsx$1(GlobalStyles$3, { styles: globalNeuroglancerCss }), jsx$1(ScopedGlobalStyles, { styles: globalNeuroglancerStyles, parentClassName: classes2.neuroglancerWrapper })] });
|
|
273494
273520
|
}
|
|
273495
|
-
const LazyReactNeuroglancer = React__default.lazy(() => import("./ReactNeuroglancer-
|
|
273521
|
+
const LazyReactNeuroglancer = React__default.lazy(() => import("./ReactNeuroglancer-BLfUOvtO.js"));
|
|
273496
273522
|
function createWorker() {
|
|
273497
273523
|
const worker = new WorkerFactory$1();
|
|
273498
273524
|
worker.AsyncComputationWorker = WorkerFactory;
|
|
@@ -274182,17 +274208,40 @@ function diffCameraState(prev2, next4) {
|
|
|
274182
274208
|
const pos = posHard || posSoft;
|
|
274183
274209
|
return { changed: scale2 || pos || rot2, scale: scale2, pos, rot: rot2 };
|
|
274184
274210
|
}
|
|
274211
|
+
const clamp$1 = (value2, min2, max2) => Math.max(min2, Math.min(max2, value2));
|
|
274185
274212
|
function quaternionToEuler([x2, y2, z2, w2]) {
|
|
274186
|
-
const
|
|
274187
|
-
const
|
|
274188
|
-
const
|
|
274189
|
-
const
|
|
274213
|
+
const x22 = x2 + x2;
|
|
274214
|
+
const y22 = y2 + y2;
|
|
274215
|
+
const z22 = z2 + z2;
|
|
274216
|
+
const xx = x2 * x22;
|
|
274217
|
+
const yy = y2 * y22;
|
|
274218
|
+
const zz = z2 * z22;
|
|
274219
|
+
const xz = x2 * z22;
|
|
274220
|
+
const yz = y2 * z22;
|
|
274221
|
+
const wx = w2 * x22;
|
|
274222
|
+
const wy = w2 * y22;
|
|
274223
|
+
const m11 = 1 - (yy + zz);
|
|
274224
|
+
const m13 = xz + wy;
|
|
274225
|
+
const m23 = yz - wx;
|
|
274226
|
+
const m31 = xz - wy;
|
|
274227
|
+
const m33 = 1 - (xx + yy);
|
|
274228
|
+
const pitch = Math.asin(-clamp$1(m23, -1, 1));
|
|
274229
|
+
const yaw = Math.abs(m23) < 0.9999999 ? Math.atan2(m13, m33) : Math.atan2(-m31, m11);
|
|
274190
274230
|
return [pitch, yaw];
|
|
274191
274231
|
}
|
|
274192
274232
|
function eulerToQuaternion(pitch, yaw, roll = 0) {
|
|
274193
|
-
const
|
|
274194
|
-
const
|
|
274195
|
-
|
|
274233
|
+
const c1 = Math.cos(pitch / 2);
|
|
274234
|
+
const c2 = Math.cos(yaw / 2);
|
|
274235
|
+
const c3 = Math.cos(roll / 2);
|
|
274236
|
+
const s1 = Math.sin(pitch / 2);
|
|
274237
|
+
const s2 = Math.sin(yaw / 2);
|
|
274238
|
+
const s3 = Math.sin(roll / 2);
|
|
274239
|
+
return [
|
|
274240
|
+
s1 * c2 * c3 + c1 * s2 * s3,
|
|
274241
|
+
c1 * s2 * c3 - s1 * c2 * s3,
|
|
274242
|
+
c1 * c2 * s3 - s1 * s2 * c3,
|
|
274243
|
+
c1 * c2 * c3 + s1 * s2 * s3
|
|
274244
|
+
];
|
|
274196
274245
|
}
|
|
274197
274246
|
function makeVitNgZoomCalibrator(initialNgProjectionScale, initialDeckZoom = 0) {
|
|
274198
274247
|
const base2 = initialNgProjectionScale / 2 ** -initialDeckZoom;
|
|
@@ -327333,8 +327382,8 @@ function CellSetSizesPlot(props) {
|
|
|
327333
327382
|
value: 0
|
|
327334
327383
|
}
|
|
327335
327384
|
},
|
|
327336
|
-
width: clamp$
|
|
327337
|
-
height: clamp$
|
|
327385
|
+
width: clamp$8(width2 - marginRight, 10, Infinity),
|
|
327386
|
+
height: clamp$8(height2 - marginBottom, 10, Infinity),
|
|
327338
327387
|
config: VEGA_THEMES[theme]
|
|
327339
327388
|
};
|
|
327340
327389
|
const handleSignal = (name2, value2) => {
|
|
@@ -327447,8 +327496,8 @@ function ExpressionHistogram(props) {
|
|
|
327447
327496
|
select: { type: "interval", encodings: ["x"] }
|
|
327448
327497
|
}
|
|
327449
327498
|
],
|
|
327450
|
-
width: clamp$
|
|
327451
|
-
height: clamp$
|
|
327499
|
+
width: clamp$8(width2 - marginRight, 10, Infinity),
|
|
327500
|
+
height: clamp$8(height2 - marginBottom, 10, Infinity),
|
|
327452
327501
|
config: VEGA_THEMES[theme]
|
|
327453
327502
|
};
|
|
327454
327503
|
const handleSignal = (name2, value2) => {
|
|
@@ -327583,8 +327632,8 @@ function DotPlot(props) {
|
|
|
327583
327632
|
const autoMarginForFeature = marginBottom || 30 + Math.sqrt(maxCharactersForFeature / 2) * 30;
|
|
327584
327633
|
const autoMarginForGroup = marginRight || 30 + Math.sqrt(maxCharactersForGroup / 2) * 30;
|
|
327585
327634
|
const autoMarginForSampleSet = marginRight || 30 + Math.sqrt(maxCharactersForSampleSet / 2) * 30;
|
|
327586
|
-
const plotWidth = transpose2 ? clamp$
|
|
327587
|
-
const plotHeight = transpose2 ? clamp$
|
|
327635
|
+
const plotWidth = transpose2 ? clamp$8(width2 - autoMarginForFeature - 180, 10, Infinity) / (obsSetSelection?.length || 1) : clamp$8(width2 - autoMarginForGroup - autoMarginForSampleSet - 200, 10, Infinity);
|
|
327636
|
+
const plotHeight = transpose2 ? clamp$8(height2 - autoMarginForGroup - autoMarginForSampleSet - 50, 10, Infinity) : clamp$8(height2 - autoMarginForFeature - 80, 10, Infinity) / (obsSetSelection?.length || 1);
|
|
327588
327637
|
const groupKeys = data2.map((d) => d.keyGroup);
|
|
327589
327638
|
const featureKeys = data2.map((d) => d.keyFeature);
|
|
327590
327639
|
const groupSecondaryKeys = data2.map((d) => d.keyGroupSecondary);
|
|
@@ -328580,8 +328629,8 @@ function CellSetCompositionBarPlot(props) {
|
|
|
328580
328629
|
}
|
|
328581
328630
|
},
|
|
328582
328631
|
// TODO: for width, also subtract length of longest y-axis set name label.
|
|
328583
|
-
width: clamp$
|
|
328584
|
-
height: clamp$
|
|
328632
|
+
width: clamp$8(width2 - marginRight, 10, Infinity),
|
|
328633
|
+
height: clamp$8(height2 - marginBottom, 10, Infinity),
|
|
328585
328634
|
config: VEGA_THEMES[theme]
|
|
328586
328635
|
};
|
|
328587
328636
|
const handleSignal = (name2, value2) => {
|
|
@@ -328762,8 +328811,8 @@ function FeatureSetEnrichmentBarPlot(props) {
|
|
|
328762
328811
|
}
|
|
328763
328812
|
},
|
|
328764
328813
|
// TODO: for width, also subtract length of longest y-axis set name label.
|
|
328765
|
-
width: clamp$
|
|
328766
|
-
height: clamp$
|
|
328814
|
+
width: clamp$8(width2 - marginRight, 10, Infinity),
|
|
328815
|
+
height: clamp$8(height2 - marginBottom, 10, Infinity),
|
|
328767
328816
|
config: VEGA_THEMES[theme]
|
|
328768
328817
|
};
|
|
328769
328818
|
const handleSignal = (name2, value2) => {
|
|
@@ -329982,7 +330031,9 @@ const fileTypeToExtensions = {
|
|
|
329982
330031
|
// TODO: how to handle h5ad-based AnnData (since needs reference JSON file).
|
|
329983
330032
|
// Perhaps just assume one H5AD+one JSON (or .ref.json) file correspond to each other?
|
|
329984
330033
|
[FileType$1.SPATIALDATA_ZARR]: [".sd.zarr", ".sdata.zarr", ".spatialdata.zarr"],
|
|
329985
|
-
[FileType$1.SPATIALDATA_ZARR_ZIP]: [".sd.zarr.zip", ".sdata.zarr.zip", ".spatialdata.zarr.zip"]
|
|
330034
|
+
[FileType$1.SPATIALDATA_ZARR_ZIP]: [".sd.zarr.zip", ".sdata.zarr.zip", ".spatialdata.zarr.zip"],
|
|
330035
|
+
[FileType$1.GENOMIC_PROFILES_ZARR]: [".multivec.zarr"],
|
|
330036
|
+
[FileType$1.GENOMIC_PROFILES_ZARR_ZIP]: [".multivec.zarr.zip"]
|
|
329986
330037
|
};
|
|
329987
330038
|
const fileTypeToClass = {
|
|
329988
330039
|
// OME-TIFF
|
|
@@ -330008,7 +330059,9 @@ const ZARR_FILETYPES = [
|
|
|
330008
330059
|
FileType$1.IMAGE_OME_ZARR,
|
|
330009
330060
|
FileType$1.IMAGE_OME_ZARR_ZIP,
|
|
330010
330061
|
FileType$1.OBS_SEGMENTATIONS_OME_ZARR,
|
|
330011
|
-
FileType$1.OBS_SEGMENTATIONS_OME_ZARR_ZIP
|
|
330062
|
+
FileType$1.OBS_SEGMENTATIONS_OME_ZARR_ZIP,
|
|
330063
|
+
FileType$1.GENOMIC_PROFILES_ZARR,
|
|
330064
|
+
FileType$1.GENOMIC_PROFILES_ZARR_ZIP
|
|
330012
330065
|
];
|
|
330013
330066
|
function urlToFileType(url) {
|
|
330014
330067
|
const match2 = Object.entries(fileTypeToExtensions).find(
|
|
@@ -330164,6 +330217,102 @@ async function generateConfig(parsedUrls, layoutOption = null) {
|
|
|
330164
330217
|
stores
|
|
330165
330218
|
};
|
|
330166
330219
|
}
|
|
330220
|
+
var fetchJsonp$1 = { exports: {} };
|
|
330221
|
+
var fetchJsonp = fetchJsonp$1.exports;
|
|
330222
|
+
var hasRequiredFetchJsonp;
|
|
330223
|
+
function requireFetchJsonp() {
|
|
330224
|
+
if (hasRequiredFetchJsonp) return fetchJsonp$1.exports;
|
|
330225
|
+
hasRequiredFetchJsonp = 1;
|
|
330226
|
+
(function(module2, exports2) {
|
|
330227
|
+
(function(global2, factory2) {
|
|
330228
|
+
{
|
|
330229
|
+
factory2(exports2, module2);
|
|
330230
|
+
}
|
|
330231
|
+
})(fetchJsonp, function(exports3, module3) {
|
|
330232
|
+
var defaultOptions = {
|
|
330233
|
+
timeout: 5e3,
|
|
330234
|
+
jsonpCallback: "callback"
|
|
330235
|
+
};
|
|
330236
|
+
function generateCallbackFunction() {
|
|
330237
|
+
return "jsonp_" + Date.now() + "_" + Math.ceil(Math.random() * 1e5);
|
|
330238
|
+
}
|
|
330239
|
+
function clearFunction(functionName) {
|
|
330240
|
+
try {
|
|
330241
|
+
delete window[functionName];
|
|
330242
|
+
} catch (e3) {
|
|
330243
|
+
window[functionName] = void 0;
|
|
330244
|
+
}
|
|
330245
|
+
}
|
|
330246
|
+
function removeScript(scriptId) {
|
|
330247
|
+
var script = document.getElementById(scriptId);
|
|
330248
|
+
if (script) {
|
|
330249
|
+
document.getElementsByTagName("head")[0].removeChild(script);
|
|
330250
|
+
}
|
|
330251
|
+
}
|
|
330252
|
+
function fetchJsonp2(_url) {
|
|
330253
|
+
var options = arguments.length <= 1 || arguments[1] === void 0 ? {} : arguments[1];
|
|
330254
|
+
var url = _url;
|
|
330255
|
+
var timeout3 = options.timeout || defaultOptions.timeout;
|
|
330256
|
+
var jsonpCallback = options.jsonpCallback || defaultOptions.jsonpCallback;
|
|
330257
|
+
var timeoutId = void 0;
|
|
330258
|
+
return new Promise(function(resolve2, reject) {
|
|
330259
|
+
var callbackFunction = options.jsonpCallbackFunction || generateCallbackFunction();
|
|
330260
|
+
var scriptId = jsonpCallback + "_" + callbackFunction;
|
|
330261
|
+
window[callbackFunction] = function(response) {
|
|
330262
|
+
resolve2({
|
|
330263
|
+
ok: true,
|
|
330264
|
+
// keep consistent with fetch API
|
|
330265
|
+
json: function json2() {
|
|
330266
|
+
return Promise.resolve(response);
|
|
330267
|
+
}
|
|
330268
|
+
});
|
|
330269
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
330270
|
+
removeScript(scriptId);
|
|
330271
|
+
clearFunction(callbackFunction);
|
|
330272
|
+
};
|
|
330273
|
+
url += url.indexOf("?") === -1 ? "?" : "&";
|
|
330274
|
+
var jsonpScript = document.createElement("script");
|
|
330275
|
+
jsonpScript.setAttribute("src", "" + url + jsonpCallback + "=" + callbackFunction);
|
|
330276
|
+
if (options.charset) {
|
|
330277
|
+
jsonpScript.setAttribute("charset", options.charset);
|
|
330278
|
+
}
|
|
330279
|
+
if (options.nonce) {
|
|
330280
|
+
jsonpScript.setAttribute("nonce", options.nonce);
|
|
330281
|
+
}
|
|
330282
|
+
if (options.referrerPolicy) {
|
|
330283
|
+
jsonpScript.setAttribute("referrerPolicy", options.referrerPolicy);
|
|
330284
|
+
}
|
|
330285
|
+
if (options.crossorigin) {
|
|
330286
|
+
jsonpScript.setAttribute("crossorigin", typeof options.crossorigin === "string" ? options.crossorigin : "anonymous");
|
|
330287
|
+
}
|
|
330288
|
+
var fp = options.fetchPriority;
|
|
330289
|
+
if (fp === "high" || fp === "low" || fp === "auto") {
|
|
330290
|
+
jsonpScript.setAttribute("fetchPriority", fp);
|
|
330291
|
+
}
|
|
330292
|
+
jsonpScript.id = scriptId;
|
|
330293
|
+
document.getElementsByTagName("head")[0].appendChild(jsonpScript);
|
|
330294
|
+
timeoutId = setTimeout(function() {
|
|
330295
|
+
reject(new Error("JSONP request to " + _url + " timed out"));
|
|
330296
|
+
clearFunction(callbackFunction);
|
|
330297
|
+
removeScript(scriptId);
|
|
330298
|
+
window[callbackFunction] = function() {
|
|
330299
|
+
clearFunction(callbackFunction);
|
|
330300
|
+
};
|
|
330301
|
+
}, timeout3);
|
|
330302
|
+
jsonpScript.onerror = function() {
|
|
330303
|
+
reject(new Error("JSONP request to " + _url + " failed"));
|
|
330304
|
+
clearFunction(callbackFunction);
|
|
330305
|
+
removeScript(scriptId);
|
|
330306
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
330307
|
+
};
|
|
330308
|
+
});
|
|
330309
|
+
}
|
|
330310
|
+
module3.exports = fetchJsonp2;
|
|
330311
|
+
});
|
|
330312
|
+
})(fetchJsonp$1, fetchJsonp$1.exports);
|
|
330313
|
+
return fetchJsonp$1.exports;
|
|
330314
|
+
}
|
|
330315
|
+
requireFetchJsonp();
|
|
330167
330316
|
class ObsSpotsCsvLoader extends CsvLoader {
|
|
330168
330317
|
loadFromCache(data2) {
|
|
330169
330318
|
if (this.cachedResult) {
|
|
@@ -331078,11 +331227,21 @@ class AnnDataSource extends ZarrDataSource {
|
|
|
331078
331227
|
categoriesValues = await this.getFlatArrDecompressed(`${prefix2}/${categories}`);
|
|
331079
331228
|
}
|
|
331080
331229
|
} else if (encodingType === "categorical") {
|
|
331081
|
-
const
|
|
331082
|
-
|
|
331230
|
+
const categoriesZattrs = await this.getJson(`${path2}/categories/.zattrs`);
|
|
331231
|
+
const categoriesEncodingType = categoriesZattrs?.["encoding-type"];
|
|
331232
|
+
if (categoriesEncodingType === "nullable-string-array") {
|
|
331233
|
+
categoriesValues = await this.getFlatArrDecompressed(`${path2}/categories/values`);
|
|
331234
|
+
} else if (categoriesEncodingType === "string-array") {
|
|
331083
331235
|
categoriesValues = await this.getFlatArrDecompressed(`${path2}/categories`);
|
|
331236
|
+
} else {
|
|
331237
|
+
const { dtype } = await open$1(storeRoot.resolve(`${path2}/categories`), { kind: "array" });
|
|
331238
|
+
if (dtype === "v2:object" || dtype === "|O") {
|
|
331239
|
+
categoriesValues = await this.getFlatArrDecompressed(`${path2}/categories`);
|
|
331240
|
+
}
|
|
331084
331241
|
}
|
|
331085
331242
|
codesPath = `${path2}/codes`;
|
|
331243
|
+
} else if (encodingType === "nullable-string-array") {
|
|
331244
|
+
return this.getFlatArrDecompressed(`${path2}/values`);
|
|
331086
331245
|
} else if (encodingType === "string-array") {
|
|
331087
331246
|
return this.getFlatArrDecompressed(path2);
|
|
331088
331247
|
} else {
|
|
@@ -332246,16 +332405,25 @@ let FeatureStatsAnndataLoader$1 = class FeatureStatsAnndataLoader extends Abstra
|
|
|
332246
332405
|
return this.dataSource.loadDataFrameIndex(dfPath);
|
|
332247
332406
|
}
|
|
332248
332407
|
async loadDataFrame(dfPath) {
|
|
332249
|
-
|
|
332250
|
-
|
|
332251
|
-
|
|
332252
|
-
|
|
332253
|
-
|
|
332254
|
-
|
|
332255
|
-
|
|
332256
|
-
|
|
332257
|
-
|
|
332258
|
-
|
|
332408
|
+
try {
|
|
332409
|
+
const [featureId2, featureFoldChange, featureSignificance] = await Promise.all([
|
|
332410
|
+
this.loadFeatureNames(dfPath),
|
|
332411
|
+
this.loadFoldChanges(dfPath),
|
|
332412
|
+
this.loadSignificances(dfPath)
|
|
332413
|
+
]);
|
|
332414
|
+
return {
|
|
332415
|
+
featureId: featureId2,
|
|
332416
|
+
featureFoldChange,
|
|
332417
|
+
featureSignificance
|
|
332418
|
+
};
|
|
332419
|
+
} catch (e3) {
|
|
332420
|
+
log$b.warn("Dataframe not found at", dfPath);
|
|
332421
|
+
return {
|
|
332422
|
+
featureId: [],
|
|
332423
|
+
featureFoldChange: [],
|
|
332424
|
+
featureSignificance: []
|
|
332425
|
+
};
|
|
332426
|
+
}
|
|
332259
332427
|
}
|
|
332260
332428
|
/**
|
|
332261
332429
|
*
|
|
@@ -332282,7 +332450,7 @@ let FeatureStatsAnndataLoader$1 = class FeatureStatsAnndataLoader extends Abstra
|
|
|
332282
332450
|
* @returns {Promise<LoaderResult<FeatureStatsData>>}
|
|
332283
332451
|
*/
|
|
332284
332452
|
async loadMulti(volcanoOptions) {
|
|
332285
|
-
const { analysisType: targetAnalysisType = "
|
|
332453
|
+
const { analysisType: targetAnalysisType = "pydeseq2" } = this.options;
|
|
332286
332454
|
const { sampleSetSelection, obsSetSelection } = volcanoOptions || {};
|
|
332287
332455
|
const rawObsSetSelection = obsSetSelection;
|
|
332288
332456
|
const rawSampleSetSelection = sampleSetSelection;
|
|
@@ -333260,7 +333428,7 @@ class SpatialDataObsSpotsLoader extends AbstractTwoStepLoader {
|
|
|
333260
333428
|
const formatVersion = await this.dataSource.getShapesFormatVersion(path2);
|
|
333261
333429
|
if (formatVersion === "0.1") {
|
|
333262
333430
|
locations = await this.dataSource.loadNumericForDims(getCoordsPath(path2), [0, 1]);
|
|
333263
|
-
} else if (formatVersion === "0.2") {
|
|
333431
|
+
} else if (formatVersion === "0.2" || formatVersion === "0.3") {
|
|
333264
333432
|
locations = await this.dataSource.loadCircleShapes(getGeometryPath$1(path2));
|
|
333265
333433
|
}
|
|
333266
333434
|
this.locations = locations;
|
|
@@ -333459,7 +333627,7 @@ class SpatialDataObsPointsLoader extends AbstractTwoStepLoader {
|
|
|
333459
333627
|
}
|
|
333460
333628
|
let locations;
|
|
333461
333629
|
const formatVersion = await this.dataSource.getPointsFormatVersion(path2);
|
|
333462
|
-
if (formatVersion === "0.1") {
|
|
333630
|
+
if (formatVersion === "0.1" || formatVersion === "0.2") {
|
|
333463
333631
|
locations = await this.dataSource.loadPoints(path2);
|
|
333464
333632
|
} else {
|
|
333465
333633
|
throw new UnknownSpatialDataFormatError("Only points format version 0.1 is supported.");
|
|
@@ -333478,7 +333646,7 @@ class SpatialDataObsPointsLoader extends AbstractTwoStepLoader {
|
|
|
333478
333646
|
}
|
|
333479
333647
|
let locationsFeatureIndex;
|
|
333480
333648
|
const formatVersion = await this.dataSource.getPointsFormatVersion(path2);
|
|
333481
|
-
if (formatVersion === "0.1") {
|
|
333649
|
+
if (formatVersion === "0.1" || formatVersion === "0.2") {
|
|
333482
333650
|
locationsFeatureIndex = await this.dataSource.loadPointsFeatureIds(path2);
|
|
333483
333651
|
} else {
|
|
333484
333652
|
throw new UnknownSpatialDataFormatError("Only points format version 0.1 is supported.");
|
|
@@ -333490,7 +333658,7 @@ class SpatialDataObsPointsLoader extends AbstractTwoStepLoader {
|
|
|
333490
333658
|
const { path: path2, featureIndexColumn, mortonCodeColumn } = this.options;
|
|
333491
333659
|
let locations;
|
|
333492
333660
|
const formatVersion = await this.dataSource.getPointsFormatVersion(path2);
|
|
333493
|
-
if (formatVersion === "0.1") {
|
|
333661
|
+
if (formatVersion === "0.1" || formatVersion === "0.2") {
|
|
333494
333662
|
locations = await this.dataSource.loadPointsInRect(path2, bounds2, signal, featureIndexColumn, mortonCodeColumn);
|
|
333495
333663
|
} else {
|
|
333496
333664
|
throw new UnknownSpatialDataFormatError("Only points format version 0.1 is supported.");
|
|
@@ -333522,10 +333690,8 @@ class SpatialDataObsPointsLoader extends AbstractTwoStepLoader {
|
|
|
333522
333690
|
// and for the presence of morton_code_2d and feature_index columns.
|
|
333523
333691
|
this.dataSource.supportsLoadPointsInRect(path2, featureIndexColumnName, mortonCodeColumn)
|
|
333524
333692
|
]);
|
|
333525
|
-
const isSupportedVersion = formatVersion === "0.1";
|
|
333526
|
-
|
|
333527
|
-
const hasBoundingBox2D = typeof boundingBox?.x_max === "number" && typeof boundingBox?.x_min === "number" && typeof boundingBox?.y_max === "number" && typeof boundingBox?.y_min === "number";
|
|
333528
|
-
return isSupportedVersion && hasBoundingBox2D && hasRequiredColumnsAndRowGroupSize;
|
|
333693
|
+
const isSupportedVersion = formatVersion === "0.1" || formatVersion === "0.2";
|
|
333694
|
+
return isSupportedVersion && hasRequiredColumnsAndRowGroupSize;
|
|
333529
333695
|
}
|
|
333530
333696
|
async load() {
|
|
333531
333697
|
const [modelMatrix2, supportsTiling] = await Promise.all([
|
|
@@ -333563,7 +333729,7 @@ class SpatialDataObsPointsLoader extends AbstractTwoStepLoader {
|
|
|
333563
333729
|
featureIds,
|
|
333564
333730
|
obsPointsModelMatrix: modelMatrix2,
|
|
333565
333731
|
// Return 'tiled' if the morton_code_2d column
|
|
333566
|
-
//
|
|
333732
|
+
// is present,
|
|
333567
333733
|
// and the row group size is small enough.
|
|
333568
333734
|
// Otherwise, return 'full'.
|
|
333569
333735
|
obsPointsTilingType: supportsTiling ? "tiled" : "full",
|
|
@@ -343072,6 +343238,7 @@ function sdataMortonQueryRectAux(boundingBox, origRect) {
|
|
|
343072
343238
|
const mortonIntervals = zcoverRectangle(normRect[0][0], normRect[0][1], normRect[1][0], normRect[1][1], 16, null, true);
|
|
343073
343239
|
return mortonIntervals;
|
|
343074
343240
|
}
|
|
343241
|
+
const MORTON_CODE_EXTREME_VALUE_INDICATOR = 0;
|
|
343075
343242
|
async function getParquetModule() {
|
|
343076
343243
|
const module2 = await import(
|
|
343077
343244
|
/* webpackIgnore: true */
|
|
@@ -343150,7 +343317,7 @@ async function _loadParquetSchemaBytes({ queryClient, store }, parquetPath, part
|
|
|
343150
343317
|
if (!tailBytes || tailBytes.length < TAIL_LENGTH) {
|
|
343151
343318
|
throw new Error(`Failed to load parquet footerLength for ${partZeroPath}`);
|
|
343152
343319
|
}
|
|
343153
|
-
const footerLength = new DataView(tailBytes.buffer).getInt32(0, true);
|
|
343320
|
+
const footerLength = new DataView(tailBytes.buffer, tailBytes.byteOffset, tailBytes.byteLength).getInt32(0, true);
|
|
343154
343321
|
const magic = new TextDecoder().decode(tailBytes.slice(4, 8));
|
|
343155
343322
|
if (magic !== "PAR1") {
|
|
343156
343323
|
throw new Error("Invalid Parquet file: missing PAR1 magic number");
|
|
@@ -343197,22 +343364,22 @@ async function _loadParquetMetadataByPart({ queryClient, store }, parquetPath) {
|
|
|
343197
343364
|
} catch (error2) {
|
|
343198
343365
|
if (error2.message.includes("Failed to load parquet footerLength")) {
|
|
343199
343366
|
numParts = partIndex;
|
|
343367
|
+
log$b.info(`Found ${numParts} parts for parquet path ${parquetPath}; An above "Failed to load parquet footerLength" error is expected for the subsequent part.`);
|
|
343200
343368
|
}
|
|
343201
343369
|
}
|
|
343202
343370
|
} while (numParts === void 0);
|
|
343371
|
+
const numRows = allMetadata.map((part) => part.metadata.fileMetadata().numRows());
|
|
343372
|
+
const numRowGroups = allMetadata.map((part) => part.metadata.numRowGroups());
|
|
343373
|
+
const numRowsPerGroup = allMetadata.map((part) => part.metadata.rowGroup(0).numRows());
|
|
343203
343374
|
const metadata2 = {
|
|
343204
|
-
|
|
343205
|
-
|
|
343206
|
-
|
|
343207
|
-
|
|
343208
|
-
|
|
343209
|
-
|
|
343210
|
-
|
|
343211
|
-
|
|
343212
|
-
metadata2.numRowGroups = allMetadata.reduce((sum2, part) => sum2 + part.metadata.numRowGroups(), 0);
|
|
343213
|
-
metadata2.numRowsPerGroup = firstPart.metadata.rowGroup(0).numRows();
|
|
343214
|
-
metadata2.schema = firstPart.schema.schema;
|
|
343215
|
-
}
|
|
343375
|
+
totalNumRows: numRows.reduce((a2, b2) => a2 + b2, 0),
|
|
343376
|
+
totalNumRowGroups: numRowGroups.reduce((a2, b2) => a2 + b2, 0),
|
|
343377
|
+
// Array of count per part (length equal to numParts).
|
|
343378
|
+
numRowsByPart: numRows,
|
|
343379
|
+
numRowGroupsByPart: numRowGroups,
|
|
343380
|
+
numRowsPerGroupByPart: numRowsPerGroup,
|
|
343381
|
+
schema: allMetadata?.[0]?.schema?.schema
|
|
343382
|
+
};
|
|
343216
343383
|
const result = {
|
|
343217
343384
|
...metadata2,
|
|
343218
343385
|
// TODO: extract metadata per part and rowGroup into plain objects that match the hyparquet parquetMetadata() return value?
|
|
@@ -343236,8 +343403,8 @@ async function _loadParquetRowGroupByGroupIndex({ queryClient, store }, parquetP
|
|
|
343236
343403
|
const store2 = ctx.meta?.store;
|
|
343237
343404
|
const { readParquetRowGroup } = await _getParquetModule({ queryClient: queryClient2 });
|
|
343238
343405
|
const allMetadata = await _loadParquetMetadataByPart({ queryClient: queryClient2, store: store2 }, parquetPath);
|
|
343239
|
-
if (rowGroupIndex < 0 || rowGroupIndex >= allMetadata.
|
|
343240
|
-
throw new Error(`Row group index ${rowGroupIndex} is out of bounds for parquet table with ${allMetadata.
|
|
343406
|
+
if (rowGroupIndex < 0 || rowGroupIndex >= allMetadata.totalNumRowGroups) {
|
|
343407
|
+
throw new Error(`Row group index ${rowGroupIndex} is out of bounds for parquet table with ${allMetadata.totalNumRowGroups} row groups.`);
|
|
343241
343408
|
}
|
|
343242
343409
|
let partIndex;
|
|
343243
343410
|
let cumulativeRowGroups = 0;
|
|
@@ -343347,9 +343514,9 @@ async function _bisectRowGroupsRight({ queryClient, store }, parquetPath, column
|
|
|
343347
343514
|
);
|
|
343348
343515
|
const store2 = ctx.meta?.store;
|
|
343349
343516
|
const allMetadata = await _loadParquetMetadataByPart({ queryClient: queryClient2, store: store2 }, parquetPath);
|
|
343350
|
-
const {
|
|
343517
|
+
const { totalNumRowGroups } = allMetadata;
|
|
343351
343518
|
let lo = 0;
|
|
343352
|
-
let hi =
|
|
343519
|
+
let hi = totalNumRowGroups;
|
|
343353
343520
|
while (lo < hi) {
|
|
343354
343521
|
const cachedInRange = await getCachedInRange(queryClient2, parquetPath, columnName, lo, hi);
|
|
343355
343522
|
const betterLo = cachedInRange.slice().reverse().find((c2) => c2.index > lo && targetValue >= c2.max);
|
|
@@ -343752,11 +343919,12 @@ class SpatialDataTableSource extends AnnDataSource {
|
|
|
343752
343919
|
const { queryClient } = this;
|
|
343753
343920
|
const { store } = this.storeRoot;
|
|
343754
343921
|
const allMetadata = await _loadParquetMetadataByPart({ queryClient, store }, parquetPath);
|
|
343755
|
-
const {
|
|
343756
|
-
const numRowsTotal = allMetadata.
|
|
343757
|
-
|
|
343922
|
+
const { numRowsPerGroupByPart } = allMetadata;
|
|
343923
|
+
const numRowsTotal = allMetadata.totalNumRows;
|
|
343924
|
+
const maxNumRowsPerGroup = Math.max(...numRowsPerGroupByPart);
|
|
343925
|
+
if (maxNumRowsPerGroup >= 1e5) {
|
|
343758
343926
|
if (numRowsTotal > 5e6) {
|
|
343759
|
-
throw new Error(`The Parquet table at ${parquetPath} has ${numRowsTotal} total rows, which necessitates tiled loading, but it was not possible because the row group size is too large (${
|
|
343927
|
+
throw new Error(`The Parquet table at ${parquetPath} has ${numRowsTotal} total rows, which necessitates tiled loading, but it was not possible because the row group size is too large (${maxNumRowsPerGroup}). See the Vitessce documentation at Data Troubleshooting -> Points for more details.`);
|
|
343760
343928
|
}
|
|
343761
343929
|
return false;
|
|
343762
343930
|
}
|
|
@@ -343780,7 +343948,7 @@ class SpatialDataTableSource extends AnnDataSource {
|
|
|
343780
343948
|
* @param {string[]|undefined} columns An optional list of column names to load.
|
|
343781
343949
|
* @returns
|
|
343782
343950
|
*/
|
|
343783
|
-
async loadParquetTableInRect(parquetPath, tileBbox,
|
|
343951
|
+
async loadParquetTableInRect(parquetPath, tileBbox, signal, featureIndexColumnName, mortonCodeColumn) {
|
|
343784
343952
|
const { queryClient } = this;
|
|
343785
343953
|
const { store } = this.storeRoot;
|
|
343786
343954
|
const mortonCodeColumnName = mortonCodeColumn ?? "morton_code_2d";
|
|
@@ -343805,15 +343973,46 @@ class SpatialDataTableSource extends AnnDataSource {
|
|
|
343805
343973
|
} else {
|
|
343806
343974
|
tileBboxes = [tileBbox];
|
|
343807
343975
|
}
|
|
343976
|
+
const firstRowGroupTable = await _loadParquetRowGroupByGroupIndex({ queryClient, store }, parquetPath, 0);
|
|
343977
|
+
const xColumnForBoundingBox = firstRowGroupTable.getChild("x");
|
|
343978
|
+
const yColumnForBoundingBox = firstRowGroupTable.getChild("y");
|
|
343979
|
+
const mortonCodeColumnForBoundingBox = firstRowGroupTable.getChild(mortonCodeColumnName);
|
|
343980
|
+
const boundingBoxMaxNumRows = Math.min(4, firstRowGroupTable.numRows);
|
|
343981
|
+
const firstMortonCodes = range$e(boundingBoxMaxNumRows).map((i2) => mortonCodeColumnForBoundingBox.get(i2));
|
|
343982
|
+
const boundingBoxNumRows = firstMortonCodes.filter((code2) => code2 === MORTON_CODE_EXTREME_VALUE_INDICATOR).length;
|
|
343983
|
+
const boundingBoxXValues = range$e(boundingBoxNumRows).map((i2) => xColumnForBoundingBox.get(i2));
|
|
343984
|
+
const boundingBoxYValues = range$e(boundingBoxNumRows).map((i2) => yColumnForBoundingBox.get(i2));
|
|
343985
|
+
const xMin = Math.min(...boundingBoxXValues);
|
|
343986
|
+
const xMax = Math.max(...boundingBoxXValues);
|
|
343987
|
+
const yMin = Math.min(...boundingBoxYValues);
|
|
343988
|
+
const yMax = Math.max(...boundingBoxYValues);
|
|
343989
|
+
const allPointsBbox = {
|
|
343990
|
+
x_min: xMin,
|
|
343991
|
+
x_max: xMax,
|
|
343992
|
+
y_min: yMin,
|
|
343993
|
+
y_max: yMax
|
|
343994
|
+
};
|
|
343808
343995
|
const rowGroupIndicesPerTile = await Promise.all(tileBboxes.map(async (subTileBbox) => _rectToRowGroupIndices({ queryClient, store }, parquetPath, subTileBbox, allPointsBbox, mortonCodeColumnName)));
|
|
343809
343996
|
const uniqueCoveredRowGroupIndices = Array.from(new Set(rowGroupIndicesPerTile.flat())).toSorted((a2, b2) => a2 - b2);
|
|
343810
343997
|
const allMetadata = await _loadParquetMetadataByPart({ queryClient, store }, parquetPath);
|
|
343811
|
-
const {
|
|
343812
|
-
const
|
|
343813
|
-
|
|
343814
|
-
|
|
343815
|
-
|
|
343816
|
-
|
|
343998
|
+
const { numRowsPerGroupByPart, numRowGroupsByPart } = allMetadata;
|
|
343999
|
+
const rowGroupIToNumRows = (rowGroupI) => {
|
|
344000
|
+
let currPartIndex = 0;
|
|
344001
|
+
let prevTotalRowGroupCount = 0;
|
|
344002
|
+
for (let partIndex = 0; partIndex < numRowGroupsByPart.length; partIndex++) {
|
|
344003
|
+
const numRowGroupsInPart = numRowGroupsByPart[partIndex];
|
|
344004
|
+
if (prevTotalRowGroupCount <= rowGroupI && rowGroupI < prevTotalRowGroupCount + numRowGroupsInPart) {
|
|
344005
|
+
currPartIndex = partIndex;
|
|
344006
|
+
break;
|
|
344007
|
+
}
|
|
344008
|
+
prevTotalRowGroupCount += numRowGroupsInPart;
|
|
344009
|
+
}
|
|
344010
|
+
return numRowsPerGroupByPart[currPartIndex];
|
|
344011
|
+
};
|
|
344012
|
+
const totalNumRowsToLoad = uniqueCoveredRowGroupIndices.reduce((acc, rowGroupI) => acc + rowGroupIToNumRows(rowGroupI), 0);
|
|
344013
|
+
const xArr = new Float32Array(totalNumRowsToLoad);
|
|
344014
|
+
const yArr = new Float32Array(totalNumRowsToLoad);
|
|
344015
|
+
const featureIndexArr = new Uint32Array(totalNumRowsToLoad);
|
|
343817
344016
|
const rowGroupTables = await Promise.all(uniqueCoveredRowGroupIndices.map(async (rowGroupIndex) => _loadParquetRowGroupByGroupIndex({ queryClient, store }, parquetPath, rowGroupIndex)));
|
|
343818
344017
|
let rowOffset = 0;
|
|
343819
344018
|
rowGroupTables.forEach((table2) => {
|
|
@@ -343826,7 +344025,7 @@ class SpatialDataTableSource extends AnnDataSource {
|
|
|
343826
344025
|
xArr.set(xColumn.toArray(), rowOffset);
|
|
343827
344026
|
yArr.set(yColumn.toArray(), rowOffset);
|
|
343828
344027
|
featureIndexArr.set(featureIndexColumn.toArray(), rowOffset);
|
|
343829
|
-
rowOffset +=
|
|
344028
|
+
rowOffset += table2.numRows;
|
|
343830
344029
|
});
|
|
343831
344030
|
return {
|
|
343832
344031
|
data: {
|
|
@@ -343834,7 +344033,7 @@ class SpatialDataTableSource extends AnnDataSource {
|
|
|
343834
344033
|
y: yArr,
|
|
343835
344034
|
featureIndices: featureIndexArr
|
|
343836
344035
|
},
|
|
343837
|
-
shape: [3,
|
|
344036
|
+
shape: [3, totalNumRowsToLoad]
|
|
343838
344037
|
};
|
|
343839
344038
|
}
|
|
343840
344039
|
}
|
|
@@ -349710,14 +349909,14 @@ class SpatialDataShapesSource extends SpatialDataTableSource {
|
|
|
349710
349909
|
/**
|
|
349711
349910
|
*
|
|
349712
349911
|
* @param {string} path A path to within shapes.
|
|
349713
|
-
* @returns {Promise<"0.1"|"0.2">} The format version.
|
|
349912
|
+
* @returns {Promise<"0.1"|"0.2"|"0.3">} The format version.
|
|
349714
349913
|
*/
|
|
349715
349914
|
async getShapesFormatVersion(path2) {
|
|
349716
349915
|
const zattrs = await this.loadSpatialDataElementAttrs(path2);
|
|
349717
349916
|
const formatVersion = zattrs.spatialdata_attrs.version;
|
|
349718
349917
|
const geos = zattrs.spatialdata_attrs.geos || {};
|
|
349719
349918
|
const encodingType = zattrs["encoding-type"];
|
|
349720
|
-
if (encodingType !== "ngff:shapes" || !(formatVersion === "0.1" && (geos.name === "POINT" && geos.type === 0) || formatVersion === "0.2")) {
|
|
349919
|
+
if (encodingType !== "ngff:shapes" || !(formatVersion === "0.1" && (geos.name === "POINT" && geos.type === 0) || formatVersion === "0.2" || formatVersion === "0.3")) {
|
|
349721
349920
|
throw new Error(`Unexpected encoding type or version for shapes spatialdata_attrs: ${encodingType} ${formatVersion}`);
|
|
349722
349921
|
}
|
|
349723
349922
|
return formatVersion;
|
|
@@ -349926,7 +350125,7 @@ class SpatialDataPointsSource extends SpatialDataTableSource {
|
|
|
349926
350125
|
const zattrs = await this.loadSpatialDataElementAttrs(path2);
|
|
349927
350126
|
const formatVersion = zattrs.spatialdata_attrs.version;
|
|
349928
350127
|
const encodingType = zattrs["encoding-type"];
|
|
349929
|
-
if (encodingType === "ngff:points" && !(formatVersion === "0.1")) {
|
|
350128
|
+
if (encodingType === "ngff:points" && !(formatVersion === "0.1" || formatVersion === "0.2")) {
|
|
349930
350129
|
throw new Error(`Unexpected version for points spatialdata_attrs: ${formatVersion}`);
|
|
349931
350130
|
}
|
|
349932
350131
|
return formatVersion;
|
|
@@ -350029,16 +350228,11 @@ class SpatialDataPointsSource extends SpatialDataTableSource {
|
|
|
350029
350228
|
const zattrs = await this.loadSpatialDataElementAttrs(elementPath);
|
|
350030
350229
|
const {
|
|
350031
350230
|
// axes,
|
|
350032
|
-
spatialdata_attrs: spatialDataAttrs
|
|
350033
|
-
// The bounding box (extent) of all points.
|
|
350034
|
-
// Required for un-normalization from uints back to floats.
|
|
350035
|
-
// TODO: decide whether these will be stored here or somewhere else.
|
|
350036
|
-
// Reference: https://github.com/vitessce/vitessce-python/pull/476#issuecomment-3362656956
|
|
350037
|
-
bounding_box: allPointsBbox
|
|
350231
|
+
spatialdata_attrs: spatialDataAttrs
|
|
350038
350232
|
} = zattrs;
|
|
350039
350233
|
const { feature_key: featureKey } = spatialDataAttrs;
|
|
350040
350234
|
const featureIndexColumnName = featureIndexColumnNameFromOptions ?? `${featureKey}_codes`;
|
|
350041
|
-
return this.loadParquetTableInRect(parquetPath, tileBbox,
|
|
350235
|
+
return this.loadParquetTableInRect(parquetPath, tileBbox, signal, featureIndexColumnName, mortonCodeColumn);
|
|
350042
350236
|
}
|
|
350043
350237
|
async supportsLoadPointsInRect(elementPath, featureIndexColumnName, mortonCodeColumn) {
|
|
350044
350238
|
const parquetPath = getParquetPath(elementPath);
|
|
@@ -350246,7 +350440,13 @@ class GlbSource {
|
|
|
350246
350440
|
class GlbDataLoader extends AbstractTwoStepLoader {
|
|
350247
350441
|
async load() {
|
|
350248
350442
|
const { url, options } = this;
|
|
350249
|
-
const
|
|
350443
|
+
const [{ GLTFLoader: GLTFLoader2 }, { DRACOLoader }] = await Promise.all([
|
|
350444
|
+
// eslint-disable-next-line import/no-unresolved
|
|
350445
|
+
import("three/addons/loaders/GLTFLoader.js"),
|
|
350446
|
+
// eslint-disable-next-line import/no-unresolved
|
|
350447
|
+
import("three/addons/loaders/DRACOLoader.js")
|
|
350448
|
+
]);
|
|
350449
|
+
const loader2 = new GLTFLoader2();
|
|
350250
350450
|
const dracoLoader = new DRACOLoader();
|
|
350251
350451
|
dracoLoader.setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.5.6/");
|
|
350252
350452
|
loader2.setDRACOLoader(dracoLoader);
|
|
@@ -352812,7 +353012,8 @@ const baseFileTypes = [
|
|
|
352812
353012
|
makeFileType(FileType$1.OBS_LOCATIONS_MOLECULES_JSON, DataType$3.OBS_LOCATIONS, MoleculesJsonAsObsLocationsLoader, JsonSource, z.null()),
|
|
352813
353013
|
makeFileType(FileType$1.OBS_LABELS_MOLECULES_JSON, DataType$3.OBS_LABELS, MoleculesJsonAsObsLabelsLoader, JsonSource, z.null()),
|
|
352814
353014
|
makeFileType(FileType$1.NEIGHBORHOODS_JSON, DataType$3.NEIGHBORHOODS, JsonLoader, JsonSource, z.null()),
|
|
352815
|
-
makeFileType(FileType$1.GENOMIC_PROFILES_ZARR, DataType$3.GENOMIC_PROFILES, GenomicProfilesZarrLoader, ZarrDataSource, z.null())
|
|
353015
|
+
makeFileType(FileType$1.GENOMIC_PROFILES_ZARR, DataType$3.GENOMIC_PROFILES, GenomicProfilesZarrLoader, ZarrDataSource, z.null()),
|
|
353016
|
+
makeFileType(FileType$1.GENOMIC_PROFILES_ZARR_ZIP, DataType$3.GENOMIC_PROFILES, GenomicProfilesZarrLoader, ZarrDataSource, z.null())
|
|
352816
353017
|
];
|
|
352817
353018
|
const baseJointFileTypes = [
|
|
352818
353019
|
new PluginJointFileType(FileType$1.ANNDATA_ZARR, expandAnndataZarr, anndataZarrSchema),
|