-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathxyExtract.ts
More file actions
60 lines (52 loc) · 1.24 KB
/
xyExtract.ts
File metadata and controls
60 lines (52 loc) · 1.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import type { DataXY, FromTo } from 'cheminfo-types';
import { zonesNormalize } from '../zones/index.ts';
import { xyCheck } from './xyCheck.ts';
export interface XYExtractOptions {
/**
* Ranges to keep; points outside all zones are discarded.
* @default []
*/
zones?: FromTo[];
}
/**
* Extract zones from a XY data.
* @param data - Object that contains property x (an ordered increasing array) and y (an array)
* @param options - options
* @returns - Array of points
*/
export function xyExtract(
data: DataXY,
options: XYExtractOptions = {},
): DataXY {
xyCheck(data);
const { x, y } = data;
let { zones } = options;
zones = zonesNormalize(zones);
if (
x === undefined ||
y === undefined ||
!Array.isArray(zones) ||
zones.length === 0
) {
return data;
}
const newX: number[] = [];
const newY: number[] = [];
let currentZone = zones[0];
let position = 0;
loop: for (let i = 0; i < x.length; i++) {
while (currentZone.to < x[i]) {
position++;
currentZone = zones[position];
if (!currentZone) {
i = x.length;
break loop;
}
}
if (x[i] >= currentZone.from) {
newX.push(x[i]);
newY.push(y[i]);
}
}
return { x: newX, y: newY };
}