Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/components/plots/AnalysisWG.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ type Operation = keyof typeof ShaderMap;
const AnalysisWG = ({ setTexture, }: { setTexture: React.Dispatch<React.SetStateAction<THREE.Data3DTexture[] | THREE.DataTexture[] | null>> }) => {

// Global state hooks remain the same
const { strides, dataShape, valueScales, isFlat, plotOn, setIsFlat, setStatus, setValueScales } = useGlobalStore(useShallow(state => ({
const { strides, dataShape, valueScales, isFlat, plotOn, setIsFlat, setStatus, setValueScales, variable } = useGlobalStore(useShallow(state => ({
strides: state.strides, dataShape: state.dataShape, valueScales: state.valueScales,
isFlat: state.isFlat, plotOn:state.plotOn, setIsFlat: state.setIsFlat, setStatus: state.setStatus,
setValueScales: state.setValueScales,
setValueScales: state.setValueScales, variable: state.variable
})));

const setPlotType = usePlotStore(state => state.setPlotType);
Expand Down Expand Up @@ -98,7 +98,7 @@ const AnalysisWG = ({ setTexture, }: { setTexture: React.Dispatch<React.SetState
}

// --- 2. Dispatch GPU computation based on the operation ---
const inputArray = analysisMode ? analysisArray : await GetCurrentArray(analysisStore)
const inputArray = analysisMode ? analysisArray : GetCurrentArray(analysisStore, variable, dataShape, strides)
const shapeInfo = { shape: dataShape, strides};
const kernelParams = { kernelDepth, kernelSize };
// [1538316, 1481, 1]
Expand Down Expand Up @@ -204,7 +204,7 @@ const AnalysisWG = ({ setTexture, }: { setTexture: React.Dispatch<React.SetState

const is2D = outputShape.length === 2
async function Analyze(){
const dataArray = analysisMode ? analysisArray : GetCurrentArray(analysisStore)
const dataArray = analysisMode ? analysisArray : GetCurrentArray(analysisStore, variable, dataShape, strides)
const newArray = await CustomShader(dataArray, shapeInfo, kernelParams, axis, customShader?? "") as Float16Array
const {minVal, maxVal} = valueScales
const textureData = new Uint8Array(newArray.length)
Expand Down
7 changes: 6 additions & 1 deletion src/components/plots/AxisLines.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,12 @@ const CubeAxis = ({flipX, flipY, flipDown}: {flipX: boolean, flipY: boolean, fli
const isPC = useMemo(()=>plotType == 'point-cloud',[plotType])
const globalScale = isPC ? dataShape[2]/AXIS_CONSTANTS.PC_GLOBAL_SCALE_DIVISOR : 1

const depthRatio = useMemo(()=>shape.z/shape.x*timeScale,[shape, timeScale]);
const depthRatio = useMemo(() => {
if (isPC && dataShape && dataShape[2]) {
return (dataShape[0] / dataShape[2]) * timeScale;
}
return (shape.z / shape.x) * timeScale;
}, [isPC, dataShape, shape, timeScale]);
Comment thread
lazarusA marked this conversation as resolved.
const shapeRatio = useMemo(()=>shape.y/shape.x, [shape])
const timeRatio = useMemo(()=>Math.max(shape.z/shape.x * 2, 2),[shape]);

Expand Down
9 changes: 5 additions & 4 deletions src/components/plots/FlatMap.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ const FlatMap = ({textures: propTextures, infoSetters} : {textures : THREE.DataT
const {setLoc, setShowInfo, val, coords} = infoSetters;
const {flipY, colormap, dimArrays, dimNames, dimUnits,
isFlat, dataShape, textureArrayDepths, strides, remapTexture, shape,
setPlotDim,updateDimCoords, updateTimeSeries} = useGlobalStore(useShallow(state => ({
setPlotDim,updateDimCoords, updateTimeSeries, variable} = useGlobalStore(useShallow(state => ({
flipY: state.flipY, colormap: state.colormap,
dimArrays: state.dimArrays, strides: state.strides,
dimNames:state.dimNames, dimUnits: state.dimUnits,
Expand All @@ -37,7 +37,8 @@ const FlatMap = ({textures: propTextures, infoSetters} : {textures : THREE.DataT
remapTexture:state.remapTexture, shape: state.shape,
setPlotDim:state.setPlotDim,
updateDimCoords:state.updateDimCoords,
updateTimeSeries: state.updateTimeSeries
updateTimeSeries: state.updateTimeSeries,
variable: state.variable
})))

const {cScale, cOffset, animProg, nanTransparency, nanColor,
Expand Down Expand Up @@ -94,7 +95,7 @@ const FlatMap = ({textures: propTextures, infoSetters} : {textures : THREE.DataT
const infoRef = useRef<boolean>(false)
const lastUV = useRef<THREE.Vector2>(new THREE.Vector2(0,0))
const rotateMap = analysisMode && axis == 2;
const sampleArray = useMemo(()=> analysisMode ? analysisArray : GetCurrentArray(),[analysisMode, analysisArray, textures])
const sampleArray = useMemo(()=> (analysisMode && analysisArray) ? analysisArray : GetCurrentArray(undefined, variable, dataShape, strides),[analysisMode, analysisArray, textures, variable, dataShape, strides])
const analysisDims = useMemo(() => {
if (!analysisMode) return dimSlices;
const fullSlices = [
Expand Down Expand Up @@ -143,7 +144,7 @@ const FlatMap = ({textures: propTextures, infoSetters} : {textures : THREE.DataT
const normal = new THREE.Vector3(0,0,1)
if(uv){
const tsUV = flipY ? new THREE.Vector2(uv.x, 1-uv.y) : uv
const tempTS = GetTimeSeries({data:analysisMode ? analysisArray : GetCurrentArray(), shape:dataShape, stride:strides},{uv:tsUV,normal})
const tempTS = GetTimeSeries({data: ((analysisMode && analysisArray)) ? analysisArray : GetCurrentArray(undefined, variable, dataShape, strides), shape:dataShape, stride:strides},{uv:tsUV,normal})
setPlotDim(0) //I think this 2 is only if there are 3-dims. Need to rework the logic

const coordUV = parseUVCoords({normal:normal,uv:uv})
Expand Down
7 changes: 4 additions & 3 deletions src/components/plots/Sphere.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export const Sphere = ({textures: propTextures} : {textures: THREE.Data3DTexture
analysisArray: state.analysisArray
})))
const {colormap, isFlat, dimArrays, dimNames, dimUnits, valueScales,
dataShape, strides, flipY, textureArrayDepths} = useGlobalStore(useShallow(state=>({
dataShape, strides, flipY, textureArrayDepths, variable} = useGlobalStore(useShallow(state=>({
colormap: state.colormap,
isFlat: state.isFlat,
dimArrays:state.dimArrays,
Expand All @@ -41,7 +41,8 @@ export const Sphere = ({textures: propTextures} : {textures: THREE.Data3DTexture
dataShape: state.dataShape,
strides: state.strides,
flipY: state.flipY,
textureArrayDepths: state.textureArrayDepths
textureArrayDepths: state.textureArrayDepths,
variable: state.variable
})))

const {animate, animProg, cOffset, cScale, valueRange, selectTS, nanColor, nanTransparency, sphereDisplacement, sphereResolution,
Expand Down Expand Up @@ -154,7 +155,7 @@ export const Sphere = ({textures: propTextures} : {textures: THREE.Data3DTexture
const uv = XYZtoRemap(point, latBounds, lonBounds);
const normal = new THREE.Vector3(0,0,1)
const tsUV = flipY ? new THREE.Vector2(uv.x, 1-uv.y) : uv
const tempTS = GetTimeSeries({data:analysisMode ? analysisArray : GetCurrentArray(), shape:dataShape, stride:strides},{uv:tsUV,normal})
const tempTS = GetTimeSeries({data: (analysisMode && analysisArray) ? analysisArray : GetCurrentArray(undefined, variable, dataShape, strides), shape:dataShape, stride:strides},{uv:tsUV,normal})
setPlotDim(0) //I think this 2 is only if there are 3-dims. Need to rework the logic

const coordUV = parseUVCoords({normal:normal,uv:uv})
Expand Down
7 changes: 4 additions & 3 deletions src/components/plots/UVCube.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -78,14 +78,15 @@ export const UVCube = ( {scale} : {scale?:THREE.Vector3} )=>{
analysisArray: state.analysisArray
})))

const {shape, dataShape, strides, dimArrays,dimNames,dimUnits} = useGlobalStore(
const {shape, dataShape, strides, dimArrays,dimNames,dimUnits, variable} = useGlobalStore(
useShallow(state=>({
shape:state.shape,
dataShape: state.dataShape,
strides: state.strides,
dimArrays:state.dimArrays,
dimNames:state.dimNames,
dimUnits:state.dimUnits
dimUnits:state.dimUnits,
variable: state.variable
})))

const {selectTS, xRange, yRange, zRange,getColorIdx, incrementColorIdx} = usePlotStore(useShallow(state => ({
Expand All @@ -106,7 +107,7 @@ export const UVCube = ( {scale} : {scale?:THREE.Vector3} )=>{
setDimCoords({});
}
lastNormal.current = dimAxis;
const tempTS = GetTimeSeries({data: analysisMode ? analysisArray : GetCurrentArray(), shape: dataShape, stride: strides},{uv,normal})
const tempTS = GetTimeSeries({data: (analysisMode && analysisArray) ? analysisArray : GetCurrentArray(undefined, variable, dataShape, strides), shape: dataShape, stride: strides},{uv,normal})
const plotDim = (normal.toArray()).map((val, idx) => {
if (Math.abs(val) > 0) {
return idx;
Expand Down
10 changes: 5 additions & 5 deletions src/components/textures/TextureMakers.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ interface Array {
shape: number[];
}

function StoreData(array: Array, valueScales?: {maxVal: number, minVal: number}): {minVal: number, maxVal: number}{
function StoreData(array: Array, valueScales?: {maxVal: number, minVal: number}): [{minVal: number, maxVal: number}, Uint8Array]{
const { clampExtremes, setTextureData} = useGlobalStore.getState()
const data = array.data;
const [minVal,maxVal] = valueScales ? [valueScales.minVal, valueScales.maxVal] : ArrayMinMax(data )
Expand All @@ -23,7 +23,7 @@ function StoreData(array: Array, valueScales?: {maxVal: number, minVal: number})
}
};
setTextureData(textureData)
return {minVal, maxVal}
return [{minVal, maxVal}, textureData]
}

export function CreateTexture(shape: number[], data?: Uint8Array) : THREE.DataTexture[] | THREE.Data3DTexture[] | undefined {
Expand Down Expand Up @@ -75,10 +75,10 @@ export function CreateTexture(shape: number[], data?: Uint8Array) : THREE.DataTe
}
}

export function ArrayToTexture(array: Array, valueScales?: {maxVal: number, minVal: number}): [ THREE.Data3DTexture[] | THREE.DataTexture[], {minVal: number, maxVal: number}]{
const scales = StoreData(array, valueScales);
export function ArrayToTexture(array: Array, valueScales?: {maxVal: number, minVal: number}): [ THREE.Data3DTexture[] | THREE.DataTexture[], {minVal: number, maxVal: number}, Uint8Array]{
const [scales, textureData] = StoreData(array, valueScales);
const textures = CreateTexture(array.shape)
return [textures as THREE.Data3DTexture[] | THREE.DataTexture[], scales];
return [textures as THREE.Data3DTexture[] | THREE.DataTexture[], scales, textureData];
}

function chunkArray(
Expand Down
7 changes: 6 additions & 1 deletion src/components/zarr/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,12 @@ export function CompressArray(array: Float16Array, level: number) {
// Infer compressed type
export function DecompressArray(compressed: Uint8Array) {
const decompressed = decompressSync(compressed);
const floatArray = new Float16Array(decompressed.buffer);
const aligned = decompressed.byteOffset % 2 === 0 ? decompressed : decompressed.slice()
const floatArray = new Float16Array(
aligned.buffer,
aligned.byteOffset,
aligned.byteLength / 2,
);
Comment thread
lazarusA marked this conversation as resolved.
return floatArray;
}

Expand Down
3 changes: 2 additions & 1 deletion src/hooks/useDataFetcher.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -79,14 +79,15 @@ export const useDataFetcher = () => {
const activeIndices = result.indices.filter((_, idx) => result.shape[idx] != 1);
useGlobalStore.getState().setActiveIndices(activeIndices);

const [tempTexture, scaling] = ArrayToTexture({
const [tempTexture, scaling, textureData] = ArrayToTexture({
data: result.data,
shape
});

setTextures(tempTexture);
setValueScales(scaling as { maxVal: number; minVal: number });
useGlobalStore.getState().setScalingFactor(result.scalingFactor);
useGlobalStore.setState({ textureData });

const shapeLength = shape.length;

Expand Down
19 changes: 16 additions & 3 deletions src/utils/HelperFuncs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -281,15 +281,28 @@ export function GetTimeSeries(array : arrayInfo, TimeSeriesInfo:TimeSeriesInfo){

function DecompressArray(compressed : Uint8Array){
const decompressed = decompressSync(compressed)
const floatArray = new Float16Array(decompressed.buffer)
const aligned = decompressed.byteOffset % 2 === 0 ? decompressed : decompressed.slice()
const floatArray = new Float16Array(aligned.buffer, aligned.byteOffset, aligned.byteLength / 2)
return floatArray
}

export function GetCurrentArray(overrideStore?:string){
const { variable, is4D, idx4D, initStore, strides, dataShape, setStatus }= useGlobalStore.getState()
export function GetCurrentArray(
overrideStore?: string,
overrideVariable?: string,
overrideDataShape?: number[],
overrideStrides?: number[]
){
const { variable: globalVariable, is4D, idx4D, initStore, strides: globalStrides, dataShape: globalDataShape, setStatus }= useGlobalStore.getState()
const { arraySize, currentChunks, ndSlices } = useZarrStore.getState()
const {cache} = useCacheStore.getState();
const store = overrideStore ? overrideStore : initStore
const variable = overrideVariable ? overrideVariable : globalVariable
const dataShape = overrideDataShape ? overrideDataShape : globalDataShape
const strides = overrideStrides ? overrideStrides : globalStrides
Comment thread
lazarusA marked this conversation as resolved.

if (!dataShape || !strides) {
return new Float16Array(0);
}

const scalarIndices = (ndSlices && ndSlices.length > 0) ? ndSlices.filter(s => typeof s === "number").join("_") : (idx4D ?? "");
const cacheBase = scalarIndices !== "" ? `${store}_${variable}_${scalarIndices}` : `${store}_${variable}`;
Expand Down
Loading