/ concept-collection / ephys_compression_tests
Sign in
concept-collection / ephys_compression_tests
ephys_compression_tests / web-ui / src / hooks / useTimeseriesData.ts
89 lines · 2.3 KBCodeBlameHistory
552a4baadd web-uiJeremy Magland 1import { useEffect, useState } from "react";
2import { Dataset } from "../types";
4const getDtypeSize = (dtype: string): number => {
5 switch (dtype) {
6 case "uint8":
7 return 1;
8 case "uint16":
9 return 2;
10 case "uint32":
11 return 4;
12 case "int16":
13 return 2;
14 case "int32":
15 return 4;
16 default:
17 throw new Error(`Unsupported dtype: ${dtype}`);
18 }
19};
21const createTypedArray = (buffer: ArrayBuffer, dtype: string): number[] => {
22 switch (dtype) {
23 case "uint8":
24 return Array.from(new Uint8Array(buffer));
25 case "uint16":
26 return Array.from(new Uint16Array(buffer));
27 case "uint32":
28 return Array.from(new Uint32Array(buffer));
29 case "int16":
30 return Array.from(new Int16Array(buffer));
31 case "int32":
32 return Array.from(new Int32Array(buffer));
33 default:
34 throw new Error(`Unsupported dtype: ${dtype}`);
35 }
36};
38export const useTimeseriesData = (dataset: Dataset) => {
39 const [data, setData] = useState<number[] | null>(null);
40 const [error, setError] = useState<string | null>(null);
42 useEffect(() => {
43 const fetchData = async () => {
44 if (!dataset.data_url_raw) {
45 setError("No raw data URL available");
46 return;
47 }
49 const metaJsonUrl = dataset.data_url_json;
50 if (!metaJsonUrl) {
51 setError("No JSON metadata URL available");
52 return;
53 }
55 try {
56 const metaResponse = await fetch(metaJsonUrl);
57 if (!metaResponse.ok) {
58 throw new Error(`HTTP error! status: ${metaResponse.status}`);
59 }
61 const metaJson = await metaResponse.json();
63 const dtype = metaJson.dtype;
64 const bytesPerElement = getDtypeSize(dtype);
66 const numBytes = bytesPerElement * 1000;
68 const response = await fetch(dataset.data_url_raw, {
69 headers: {
70 Range: `bytes=0-${numBytes - 1}`, // First 1000 elements
71 },
72 });
74 if (!response.ok) {
75 throw new Error(`HTTP error! status: ${response.status}`);
76 }
78 const buffer = await response.arrayBuffer();
79 const data = createTypedArray(buffer, dtype);
80 setData(data);
81 } catch (err) {
82 setError(err instanceof Error ? err.message : "Failed to fetch data");
83 }
84 };
85 fetchData();
86 }, [dataset]);
88 return { data, error };
89};
moveopenescclose