Skip to content

Commit

Permalink
feat: nmr-load-save prerelease with filters (#1965)
Browse files Browse the repository at this point in the history
close #1948 #1943 
* fix: filter expno option name
* chore: remove null for brukerFilters
* call re or rr based on the type
  • Loading branch information
jobo322 committed Nov 30, 2022
1 parent f3b3c65 commit f0a9471
Show file tree
Hide file tree
Showing 16 changed files with 80 additions and 44 deletions.
10 changes: 5 additions & 5 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -80,7 +80,7 @@
"ml-stat": "^1.3.3",
"multiplet-analysis": "^2.0.0",
"nmr-correlation": "^2.3.3",
"nmr-load-save": "^0.6.1",
"nmr-load-save": "^0.7.1",
"nmr-processing": "^9.3.1",
"nmredata": "^0.9.1",
"numeral": "^2.0.6",
Expand Down
9 changes: 5 additions & 4 deletions src/component/2d/FooterBanner.tsx
Expand Up @@ -5,7 +5,7 @@ import { useContext, useMemo, Fragment } from 'react';
import { MF } from 'react-mf';

import { get1DDataXY } from '../../data/data1d/Spectrum1D/get1DDataXY';
import { Data2D } from '../../data/types/data2d';
import { Data2DFid, Data2DFt } from '../../data/types/data2d/Data2D';
import { BrushContext } from '../EventsTrackers/BrushTracker';
import { MouseContext } from '../EventsTrackers/MouseTracker';
import { useChartData } from '../context/ChartContext';
Expand Down Expand Up @@ -228,9 +228,10 @@ function FooterBanner({ layout, data1D }) {

const getZValue = () => {
if (trackID === LAYOUT.CENTER_2D) {
const { maxX, maxY, minX, minY, z } = (
data[activeSpectrum.index].data as Data2D
).rr as any;
const { info, data: spectraData } = data[activeSpectrum.index];
const { maxX, maxY, minX, minY, z } = info.isFid
? (spectraData as Data2DFid).re
: ((spectraData as Data2DFt).rr as any);

const xStep = (maxX - minX) / (z[0].length - 1);
const yStep = (maxY - minY) / (z.length - 1);
Expand Down
15 changes: 11 additions & 4 deletions src/component/2d/fid/FidCanvas.tsx
Expand Up @@ -2,6 +2,7 @@ import { matrixZPivotRescale } from 'ml-spectra-processing';
import { useEffect, useRef, useMemo } from 'react';

import { Datum2D } from '../../../data/types/data2d';
import { Data2DFid, Data2DFt } from '../../../data/types/data2d/Data2D';
import { useChartData } from '../../context/ChartContext';
import useSpectrum from '../../hooks/useSpectrum';
import { get2DXScale, get2DYScale } from '../utilities/scale';
Expand Down Expand Up @@ -102,10 +103,16 @@ export function FidCanvas() {
}

function getImageData(spectrum: Datum2D) {
const matrix = matrixZPivotRescale(spectrum.data.rr.z, {
max: 255,
ArrayConstructor: Int16Array,
});
const { isFid } = spectrum.info;
const matrix = matrixZPivotRescale(
isFid
? (spectrum.data as Data2DFid).re.z
: (spectrum.data as Data2DFt).rr.z,
{
max: 255,
ArrayConstructor: Int16Array,
},
);
const WIDTH = matrix[0].length;
const HEIGHT = matrix.length;

Expand Down
6 changes: 5 additions & 1 deletion src/component/loader/DropZone.tsx
Expand Up @@ -9,6 +9,7 @@ import { FaUpload } from 'react-icons/fa';
import { useChartData } from '../context/ChartContext';
import { useDispatch } from '../context/DispatchContext';
import { LoaderProvider } from '../context/LoaderContext';
import { usePreferences } from '../context/PreferencesContext';
import { useAlert } from '../elements/popup/Alert';
import { useCheckToolsVisibility } from '../hooks/useCheckToolsVisibility';
import { SET_LOADING_FLAG, LOAD_DROP_FILES } from '../reducer/types/Types';
Expand Down Expand Up @@ -49,6 +50,7 @@ const containerStyle = css`
function DropZone(props) {
const { width, height } = useChartData();
const dispatch = useDispatch();
const preferences = usePreferences();
const isToolEnabled = useCheckToolsVisibility();
const alert = useAlert();

Expand All @@ -58,7 +60,9 @@ function DropZone(props) {
}
try {
const fileCollection = await fileCollectionFromFileList(files);
const data = await readDropFiles(fileCollection);

const { nmrLoaders: filter } = preferences.current;
const data = await readDropFiles(fileCollection, { filter });
dispatch({ type: LOAD_DROP_FILES, payload: { data } });
} catch (error: any) {
alert.error(error.message);
Expand Down
4 changes: 2 additions & 2 deletions src/component/modal/setting/ImportationFiltersTabContent.tsx
Expand Up @@ -43,8 +43,8 @@ const BRUKER_LIST: ListItem[] = [
fieldType: 'input',
},
{
label: 'Experimental Number',
name: 'bruker.experimentalNumber',
label: 'Experiment Number',
name: 'bruker.experimentNumber',
fieldType: 'input',
},
{
Expand Down
9 changes: 6 additions & 3 deletions src/component/reducer/actions/DomainActions.ts
Expand Up @@ -5,6 +5,7 @@ import { get1DDataXY } from '../../../data/data1d/Spectrum1D/get1DDataXY';
import { isSpectrum2D } from '../../../data/data2d/Spectrum2D';
import { Datum1D } from '../../../data/types/data1d';
import { Datum2D } from '../../../data/types/data2d';
import { Data2DFid, Data2DFt } from '../../../data/types/data2d/Data2D';
import nucleusToString from '../../utility/nucleusToString';
import { State } from '../Reducer';
import { DISPLAYER_MODE } from '../core/Constants';
Expand Down Expand Up @@ -87,7 +88,7 @@ function get2DDomain(state: State) {
const spectrum =
data.find((datum) => datum.id === activeSpectrum?.id) || null;
if (spectrum?.info.isFid) {
const { minX, maxX, minY, maxY } = (spectrum as Datum2D).data.rr;
const { minX, maxX, minY, maxY } = (spectrum.data as Data2DFid).re;
xArray = [minX, maxX];
yArray = [minY, maxY];
} else {
Expand All @@ -100,7 +101,8 @@ function get2DDomain(state: State) {
datum.info.isFt,
) as Array<Datum2D>
).flatMap((datum: Datum2D) => {
return [datum.data.rr.minX, datum.data.rr.maxX];
const { minX, maxX } = (datum.data as Data2DFt).rr;
return [minX, maxX];
});

yArray = (
Expand All @@ -111,7 +113,8 @@ function get2DDomain(state: State) {
d.info.isFt,
) as Array<Datum2D>
).flatMap((datum: Datum2D) => {
return [datum.data.rr.minY, datum.data.rr.maxY];
const { minY, maxY } = (datum.data as Data2DFt).rr;
return [minY, maxY];
});
} catch (error) {
// TODO: handle error
Expand Down
5 changes: 3 additions & 2 deletions src/component/reducer/actions/SpectrumsActions.ts
Expand Up @@ -13,6 +13,7 @@ import {
import { contoursManager } from '../../../data/data2d/Spectrum2D/contours';
import { Datum1D } from '../../../data/types/data1d';
import { Datum2D } from '../../../data/types/data2d';
import { Data2DFid, Data2DFt } from '../../../data/types/data2d/Data2D';
import { options } from '../../toolbar/ToolTypes';
import groupByInfoKey from '../../utility/GroupByInfoKey';
import { getSpectraByNucleus } from '../../utility/getSpectraByNucleus';
Expand Down Expand Up @@ -169,10 +170,10 @@ function addMissingProjectionHandler(draft, action) {
if (activeSpectrum?.id) {
const { index } = activeSpectrum;
const datum2D = state.data[index];
const info = datum2D.info;
const { info, data } = datum2D;
for (let n of nucleus) {
const datum1D = getMissingProjection(
datum2D.data.rr,
info.isFid ? (data as Data2DFid).re : (data as Data2DFt).rr,
n,
info,
draft.usedColors,
Expand Down
8 changes: 6 additions & 2 deletions src/component/reducer/actions/ZonesActions.ts
Expand Up @@ -15,6 +15,7 @@ import {
detectZonesManual,
} from '../../../data/data2d/Spectrum2D';
import { Datum2D } from '../../../data/types/data2d';
import { Data2DFid, Data2DFt } from '../../../data/types/data2d/Data2D';
import {
unlink,
unlinkInAssignmentData,
Expand Down Expand Up @@ -66,8 +67,11 @@ function handleAutoZonesDetection(draft: Draft<State>, detectionOptions) {
}
function handleAutoSpectraZonesDetection(draft: Draft<State>) {
for (const datum of draft.data) {
if (datum.info.dimension === 2) {
const { minX, maxX, minY, maxY } = (datum as Datum2D).data.rr;
const { info, data } = datum;
if (info.dimension === 2) {
const { minX, maxX, minY, maxY } = info.isFid
? (data as Data2DFid).re
: (data as Data2DFt).rr;
const detectionOptions = {
selectedZone: { fromX: minX, toX: maxX, fromY: minY, toY: maxY },
thresholdFactor: 1,
Expand Down
4 changes: 2 additions & 2 deletions src/component/workspaces/Workspace.ts
Expand Up @@ -148,8 +148,8 @@ export interface LoadersPreferences {
onlyReal: boolean;
};
bruker: {
processingNumber: number | null;
experimentalNumber: number | null;
processingNumber?: number | number[];
experimentNumber?: number | number[];

This comment has been minimized.

Copy link
@hamed-musallam

hamed-musallam Dec 1, 2022

Member

@lpatiny

Why do we have an array here !!!! We only accept null or number in the general settings

This comment has been minimized.

Copy link
@lpatiny

lpatiny Dec 1, 2022

Member

We should allow a comma separated list of expno or procno.

The goal is to convert the string from the configuration using something

'1,2,3'.split(/[^\d]+/).filter(item => item).map( item => Number(item))

This comment has been minimized.

Copy link
@hamed-musallam

hamed-musallam Dec 1, 2022

Member

in this case, it is hard to have validation in the input field

This comment has been minimized.

Copy link
@hamed-musallam

hamed-musallam Dec 1, 2022

Member

or let say it we add more complexity for one field

onlyFirstProcessedData: boolean;
};
}
Expand Down
2 changes: 0 additions & 2 deletions src/component/workspaces/workspaceDefaultProperties.ts
Expand Up @@ -80,8 +80,6 @@ export const workspaceDefaultProperties: Required<WorkspaceData> = {
onlyReal: false,
},
bruker: {
processingNumber: null,
experimentalNumber: null,
onlyFirstProcessedData: true,
},
},
Expand Down
5 changes: 3 additions & 2 deletions src/data/data2d/Spectrum2D/contours.ts
Expand Up @@ -162,6 +162,7 @@ function drawContours(
level: number,
datum: Datum2D,
negative = false,
quadrant = 'rr',
): { contours: any; timeout: boolean } {
const zoom = level / 2 + 1;
const {
Expand All @@ -173,13 +174,13 @@ function drawContours(
return getContours(zoom, {
negative,
nbLevels: numberOfNegativeLayer,
data: datum.data.rr,
data: datum.data[quadrant],
});
}

return getContours(zoom, {
nbLevels: numberOfPositiveLayer,
data: datum.data.rr,
data: datum.data[quadrant],
});
}

Expand Down
6 changes: 5 additions & 1 deletion src/data/data2d/Spectrum2D/get2DSpectrumErrorValue.ts
@@ -1,12 +1,16 @@
import { Datum2D } from '../../types/data2d';
import { Data2DFid, Data2DFt } from '../../types/data2d/Data2D';

export interface Zone2DError {
x: number;
y: number;
}

export function get2DSpectrumErrorValue(datum: Datum2D): Zone2DError {
const { minX, maxX, minY, maxY } = datum.data.rr;
const { data, info } = datum;
const { minX, maxX, minY, maxY } = info.isFid
? (data as Data2DFid).re
: (data as Data2DFt).rr;
const x = Math.abs(maxX - minX) / 10000;
const y = Math.abs(maxY - minY) / 10000;
return { x, y };
Expand Down
23 changes: 12 additions & 11 deletions src/data/data2d/Spectrum2D/getSlice.ts
Expand Up @@ -2,6 +2,7 @@ import { zoneToX } from 'ml-spectra-processing';

import { initiateDatum1D } from '../../data1d/Spectrum1D';
import { Datum2D } from '../../types/data2d';
import { Data2DFid, Data2DFt } from '../../types/data2d/Data2D';

/** get 2d projection
* @param {number} x in ppm
Expand All @@ -14,7 +15,10 @@ interface SlicePosition {
}

export function getSlice(spectrum: Datum2D, position: SlicePosition) {
const data = spectrum.data.rr;
const { data: spectraData, info } = spectrum;
const data = info.isFid
? (spectraData as Data2DFid).re
: (spectraData as Data2DFt).rr;
const xStep = (data.maxX - data.minX) / (data.z[0].length - 1);
const yStep = (data.maxY - data.minY) / (data.z.length - 1);
const xIndex = Math.floor((position.x - data.minX) / xStep);
Expand All @@ -24,26 +28,23 @@ export function getSlice(spectrum: Datum2D, position: SlicePosition) {
if (yIndex < 0 || yIndex >= data.z.length) return;

let infoX = {
nucleus: spectrum.info.nucleus[0], // 1H, 13C, 19F, ...
nucleus: info.nucleus[0], // 1H, 13C, 19F, ...
isFid: false,
isComplex: false, // if isComplex is true that mean it contains real/ imaginary x set, if not hid re/im button .
dimension: 1,
};

let dataX = {
x: zoneToX(
{ from: data.minX, to: data.maxX },
spectrum.data.rr.z[0].length,
),
re: new Float64Array(spectrum.data.rr.z[0].length),
x: zoneToX({ from: data.minX, to: data.maxX }, data.z[0].length),
re: new Float64Array(data.z[0].length),
};

for (let i = 0; i < spectrum.data.rr.z[0].length; i++) {
dataX.re[i] += spectrum.data.rr.z[yIndex][i];
for (let i = 0; i < data.z[0].length; i++) {
dataX.re[i] += data.z[yIndex][i];
}

let infoY = {
nucleus: spectrum.info.nucleus[1], // 1H, 13C, 19F, ...
nucleus: info.nucleus[1], // 1H, 13C, 19F, ...
isFid: false,
isComplex: false, // if isComplex is true that mean it contains real/ imaginary x set, if not hid re/im button .
dimension: 1,
Expand All @@ -56,7 +57,7 @@ export function getSlice(spectrum: Datum2D, position: SlicePosition) {

let index = data.z.length - 1;
for (let i = 0; i < data.z.length; i++) {
dataY.re[i] += spectrum.data.rr.z[index--][xIndex];
dataY.re[i] += data.z[index--][xIndex];
}
const horizontal = initiateDatum1D({ info: infoX, data: dataX }, {});
const vertical = initiateDatum1D({ info: infoY, data: dataY }, {});
Expand Down
2 changes: 1 addition & 1 deletion src/data/data2d/Spectrum2D/initiateDatum2D.ts
Expand Up @@ -55,7 +55,7 @@ export function initiateDatum2D(options: any, usedColors = {}): Datum2D {
function getData(datum, options) {
if (datum.info.isFid) {
const { re = defaultMinMax, im = defaultMinMax } = options.data;
return { rr: re, ii: im };
return { re, im };
}
return { rr: defaultMinMax, ...options.data };
}
Expand Down
14 changes: 13 additions & 1 deletion src/data/types/data2d/Data2D.ts
Expand Up @@ -8,4 +8,16 @@ export interface MinMaxContent {
maxZ: number;
}

export type Data2D = Record<'rr' | 'ii' | 'ri' | 'ir', MinMaxContent>;
export type Data2D = Data2DFid | Data2DFt;

export interface Data2DFid {
re: MinMaxContent;
im?: MinMaxContent;
}

export interface Data2DFt {
rr: MinMaxContent;
ri?: MinMaxContent;
ir?: MinMaxContent;
ii?: MinMaxContent;
}

0 comments on commit f0a9471

Please sign in to comment.