nmr-processing 3.3.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/CHANGELOG.md +38 -0
- package/lib/assignment/get13CAssignments.d.ts +35 -0
- package/lib/assignment/get13CAssignments.js +54 -0
- package/lib/assignment/get13CAssignments.js.map +1 -0
- package/lib/assignment/get1HAssignments.d.ts +42 -0
- package/lib/assignment/get1HAssignments.js +55 -0
- package/lib/assignment/get1HAssignments.js.map +1 -0
- package/lib/assignment/utils/buildAssignments.d.ts +33 -0
- package/lib/assignment/utils/buildAssignments.js +93 -0
- package/lib/assignment/utils/buildAssignments.js.map +1 -0
- package/lib/assignment/utils/createMapPossibleAssignments.d.ts +15 -0
- package/lib/assignment/utils/createMapPossibleAssignments.js +51 -0
- package/lib/assignment/utils/createMapPossibleAssignments.js.map +1 -0
- package/lib/assignment/utils/exploreTreeRec.d.ts +22 -0
- package/lib/assignment/utils/exploreTreeRec.js +77 -0
- package/lib/assignment/utils/exploreTreeRec.js.map +1 -0
- package/lib/assignment/utils/generateID.d.ts +1 -0
- package/lib/assignment/utils/generateID.js +13 -0
- package/lib/assignment/utils/generateID.js.map +1 -0
- package/lib/assignment/utils/partialScore.d.ts +16 -0
- package/lib/assignment/utils/partialScore.js +91 -0
- package/lib/assignment/utils/partialScore.js.map +1 -0
- package/lib/index.d.ts +2 -5
- package/lib/index.js +2 -5
- package/lib/index.js.map +1 -1
- package/lib/peaks/peaksFilterImpurities.js +1 -1
- package/lib/peaks/peaksFilterImpurities.js.map +1 -1
- package/lib/peaks/peaksToRanges.js +11 -17
- package/lib/peaks/peaksToRanges.js.map +1 -1
- package/lib/peaks/util/determineRealTop.js +3 -2
- package/lib/peaks/util/determineRealTop.js.map +1 -1
- package/lib/peaks/util/jAnalyzer.js +33 -35
- package/lib/peaks/util/jAnalyzer.js.map +1 -1
- package/lib/ranges/rangesToXY.d.ts +2 -2
- package/lib/ranges/rangesToXY.js +10 -2
- package/lib/ranges/rangesToXY.js.map +1 -1
- package/lib/signals/signals2DToZ.d.ts +2 -2
- package/lib/signals/signalsToXY.d.ts +2 -2
- package/lib/signals/simulation/simulate1D.d.ts +4 -3
- package/lib/signals/simulation/simulate1D.js.map +1 -1
- package/lib/types/NMRPeak1D.d.ts +2 -9
- package/lib/types/NMRRange.d.ts +1 -0
- package/lib/types/NMRSignal1D.d.ts +3 -2
- package/lib/types/NMRSignal2D.d.ts +1 -0
- package/lib/types/NMRZone.d.ts +4 -3
- package/lib/xy/xyAutoPeaksPicking.d.ts +4 -60
- package/lib/xy/xyAutoPeaksPicking.js +3 -3
- package/lib/xy/xyAutoPeaksPicking.js.map +1 -1
- package/lib-esm/assignment/get13CAssignments.js +47 -0
- package/lib-esm/assignment/get13CAssignments.js.map +1 -0
- package/lib-esm/assignment/get1HAssignments.js +48 -0
- package/lib-esm/assignment/get1HAssignments.js.map +1 -0
- package/lib-esm/assignment/utils/buildAssignments.js +86 -0
- package/lib-esm/assignment/utils/buildAssignments.js.map +1 -0
- package/lib-esm/assignment/utils/createMapPossibleAssignments.js +47 -0
- package/lib-esm/assignment/utils/createMapPossibleAssignments.js.map +1 -0
- package/lib-esm/assignment/utils/exploreTreeRec.js +73 -0
- package/lib-esm/assignment/utils/exploreTreeRec.js.map +1 -0
- package/lib-esm/assignment/utils/generateID.js +10 -0
- package/lib-esm/assignment/utils/generateID.js.map +1 -0
- package/lib-esm/assignment/utils/partialScore.js +87 -0
- package/lib-esm/assignment/utils/partialScore.js.map +1 -0
- package/lib-esm/index.js +2 -5
- package/lib-esm/index.js.map +1 -1
- package/lib-esm/peaks/peaksFilterImpurities.js +1 -1
- package/lib-esm/peaks/peaksFilterImpurities.js.map +1 -1
- package/lib-esm/peaks/peaksToRanges.js +11 -17
- package/lib-esm/peaks/peaksToRanges.js.map +1 -1
- package/lib-esm/peaks/util/determineRealTop.js +4 -3
- package/lib-esm/peaks/util/determineRealTop.js.map +1 -1
- package/lib-esm/peaks/util/jAnalyzer.js +33 -35
- package/lib-esm/peaks/util/jAnalyzer.js.map +1 -1
- package/lib-esm/ranges/rangesToXY.js +10 -2
- package/lib-esm/ranges/rangesToXY.js.map +1 -1
- package/lib-esm/signals/simulation/simulate1D.js.map +1 -1
- package/lib-esm/xy/xyAutoPeaksPicking.js +3 -3
- package/lib-esm/xy/xyAutoPeaksPicking.js.map +1 -1
- package/package.json +4 -4
- package/src/assignment/get13CAssignments.ts +100 -0
- package/src/assignment/get1HAssignments.ts +116 -0
- package/src/assignment/utils/buildAssignments.ts +155 -0
- package/src/assignment/utils/createMapPossibleAssignments.ts +76 -0
- package/src/assignment/utils/exploreTreeRec.ts +138 -0
- package/src/assignment/utils/generateID.ts +11 -0
- package/src/assignment/utils/partialScore.ts +128 -0
- package/src/index.ts +3 -6
- package/src/peaks/peaksFilterImpurities.ts +1 -1
- package/src/peaks/peaksToRanges.ts +12 -19
- package/src/peaks/util/determineRealTop.ts +4 -6
- package/src/peaks/util/jAnalyzer.ts +34 -36
- package/src/ranges/rangesToXY.ts +14 -7
- package/src/signals/signals2DToZ.ts +2 -2
- package/src/signals/signalsToXY.ts +2 -2
- package/src/signals/simulation/simulate1D.ts +4 -3
- package/src/types/NMRPeak1D.ts +3 -9
- package/src/types/NMRRange.ts +1 -0
- package/src/types/NMRSignal1D.ts +3 -3
- package/src/types/NMRSignal2D.ts +2 -0
- package/src/types/NMRZone.ts +4 -3
- package/src/types/ml-spectra-processing/index.d.ts +8 -8
- package/src/types/ml-tree-set/index.d.ts +18 -0
- package/src/types/openchemlib-utils/index..d.ts +2 -2
- package/src/xy/xyAutoPeaksPicking.ts +19 -58
- package/src/types/ml-gsd/index.d.ts +0 -164
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { MakeMandatory } from '../../types/MakeMandatory';
|
|
2
|
+
import type { Targets } from '../get1HAssignments';
|
|
3
|
+
|
|
4
|
+
import type { RestrictionByCS, Predictions1Dassignments } from './buildAssignments';
|
|
5
|
+
|
|
6
|
+
type RestrictionByCSMandatory = MakeMandatory<
|
|
7
|
+
RestrictionByCS,
|
|
8
|
+
'chemicalShiftRestriction' | 'tolerance' | 'useChemicalShiftScore'
|
|
9
|
+
>;
|
|
10
|
+
|
|
11
|
+
interface CreateMapPossibleAssignments {
|
|
12
|
+
predictions: Predictions1Dassignments;
|
|
13
|
+
restrictionByCS: RestrictionByCSMandatory;
|
|
14
|
+
targets: Targets;
|
|
15
|
+
useIntegrationRestriction: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface PossibleAssignmentMap {
|
|
19
|
+
[key: string]: string[];
|
|
20
|
+
}
|
|
21
|
+
export function createMapPossibleAssignments(
|
|
22
|
+
props: CreateMapPossibleAssignments,
|
|
23
|
+
) {
|
|
24
|
+
const { restrictionByCS, predictions, targets, useIntegrationRestriction } =
|
|
25
|
+
props;
|
|
26
|
+
|
|
27
|
+
const { tolerance: toleranceCS, chemicalShiftRestriction } = restrictionByCS;
|
|
28
|
+
|
|
29
|
+
let errorAbs = Math.abs(toleranceCS);
|
|
30
|
+
const expandMap: PossibleAssignmentMap = {};
|
|
31
|
+
for (const diaID in predictions) {
|
|
32
|
+
let prediction = predictions[diaID];
|
|
33
|
+
if (prediction.error) prediction.error = Math.abs(prediction.error);
|
|
34
|
+
expandMap[diaID] = [];
|
|
35
|
+
|
|
36
|
+
if (targets) {
|
|
37
|
+
for (const targetID in targets) {
|
|
38
|
+
let target = targets[targetID];
|
|
39
|
+
const { nbAtoms } = prediction;
|
|
40
|
+
const { integration } = target;
|
|
41
|
+
|
|
42
|
+
const couldBeAssigned = useIntegrationRestriction
|
|
43
|
+
? integration > 0
|
|
44
|
+
? nbAtoms - integration < 1
|
|
45
|
+
: true
|
|
46
|
+
: true;
|
|
47
|
+
|
|
48
|
+
if (couldBeAssigned) {
|
|
49
|
+
if (
|
|
50
|
+
!chemicalShiftRestriction ||
|
|
51
|
+
typeof prediction.delta === 'undefined'
|
|
52
|
+
) {
|
|
53
|
+
// Chemical shift is not a restriction
|
|
54
|
+
expandMap[diaID].push(targetID);
|
|
55
|
+
} else {
|
|
56
|
+
let error = errorAbs;
|
|
57
|
+
if (prediction.error) {
|
|
58
|
+
error = Math.max(error, prediction.error);
|
|
59
|
+
}
|
|
60
|
+
const delta =
|
|
61
|
+
target.signals && target.signals.length > 0
|
|
62
|
+
? target.signals[0].delta
|
|
63
|
+
: (target.to + target.from) / 2;
|
|
64
|
+
|
|
65
|
+
let distAfterLimit = Math.abs(prediction.delta - delta - errorAbs);
|
|
66
|
+
if (distAfterLimit < 4 * errorAbs) {
|
|
67
|
+
expandMap[diaID].push(targetID);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
expandMap[diaID].push('*');
|
|
74
|
+
}
|
|
75
|
+
return expandMap;
|
|
76
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import type { Targets } from '../get1HAssignments';
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
RestrictionByCS,
|
|
5
|
+
StoreAssignments1D,
|
|
6
|
+
Predictions1Dassignments,
|
|
7
|
+
} from './buildAssignments';
|
|
8
|
+
import type { PossibleAssignmentMap } from './createMapPossibleAssignments';
|
|
9
|
+
import { partialScore } from './partialScore';
|
|
10
|
+
|
|
11
|
+
export interface ExploreTreeRecProps {
|
|
12
|
+
nSources: number;
|
|
13
|
+
restrictionByCS: RestrictionByCS;
|
|
14
|
+
timeout: number;
|
|
15
|
+
timeStart: number;
|
|
16
|
+
maxSolutions: number;
|
|
17
|
+
targets: Targets;
|
|
18
|
+
useIntegrationRestriction: boolean;
|
|
19
|
+
predictions: Predictions1Dassignments;
|
|
20
|
+
lowerBoundScore: number;
|
|
21
|
+
nbAllowedUnAssigned: number;
|
|
22
|
+
possibleAssignmentMap: PossibleAssignmentMap;
|
|
23
|
+
diaIDPeerPossibleAssignment: string[];
|
|
24
|
+
}
|
|
25
|
+
export function exploreTreeRec(
|
|
26
|
+
props: ExploreTreeRecProps,
|
|
27
|
+
currentIndex: number,
|
|
28
|
+
partial: Array<string | null>,
|
|
29
|
+
store: StoreAssignments1D,
|
|
30
|
+
) {
|
|
31
|
+
const {
|
|
32
|
+
nSources,
|
|
33
|
+
restrictionByCS,
|
|
34
|
+
timeout,
|
|
35
|
+
timeStart,
|
|
36
|
+
maxSolutions,
|
|
37
|
+
targets,
|
|
38
|
+
predictions,
|
|
39
|
+
lowerBoundScore,
|
|
40
|
+
nbAllowedUnAssigned,
|
|
41
|
+
possibleAssignmentMap,
|
|
42
|
+
useIntegrationRestriction,
|
|
43
|
+
diaIDPeerPossibleAssignment,
|
|
44
|
+
} = props;
|
|
45
|
+
|
|
46
|
+
const currentDate = new Date();
|
|
47
|
+
if (currentDate.getTime() - timeStart > timeout) {
|
|
48
|
+
new Error('timeout expired');
|
|
49
|
+
return store;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const diaID = diaIDPeerPossibleAssignment[currentIndex];
|
|
53
|
+
const possibleAssignments = possibleAssignmentMap[diaID];
|
|
54
|
+
for (let targetID of possibleAssignments) {
|
|
55
|
+
partial[currentIndex] = targetID;
|
|
56
|
+
let score = partialScore(partial, {
|
|
57
|
+
useIntegrationRestriction,
|
|
58
|
+
diaIDPeerPossibleAssignment,
|
|
59
|
+
nbAllowedUnAssigned,
|
|
60
|
+
restrictionByCS,
|
|
61
|
+
predictions,
|
|
62
|
+
targets,
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
if (score === 0) {
|
|
66
|
+
if (targetID === '*') {
|
|
67
|
+
partial[currentIndex] = null;
|
|
68
|
+
}
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (currentIndex === nSources - 1 && score >= lowerBoundScore) {
|
|
73
|
+
addSolution(store, { predictions, partial, score, maxSolutions });
|
|
74
|
+
} else if (currentIndex < nSources - 1) {
|
|
75
|
+
exploreTreeRec(
|
|
76
|
+
{
|
|
77
|
+
nSources,
|
|
78
|
+
restrictionByCS,
|
|
79
|
+
timeout,
|
|
80
|
+
timeStart,
|
|
81
|
+
maxSolutions,
|
|
82
|
+
targets,
|
|
83
|
+
predictions,
|
|
84
|
+
lowerBoundScore,
|
|
85
|
+
nbAllowedUnAssigned,
|
|
86
|
+
possibleAssignmentMap,
|
|
87
|
+
useIntegrationRestriction,
|
|
88
|
+
diaIDPeerPossibleAssignment,
|
|
89
|
+
},
|
|
90
|
+
currentIndex + 1,
|
|
91
|
+
JSON.parse(JSON.stringify(partial)),
|
|
92
|
+
store,
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface SolutionAssignment {
|
|
99
|
+
assignment: string[];
|
|
100
|
+
score: number;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
interface AddSolutionProps {
|
|
104
|
+
score: number;
|
|
105
|
+
maxSolutions: number;
|
|
106
|
+
partial: Array<string | null>;
|
|
107
|
+
predictions: Predictions1Dassignments;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function addSolution(store: StoreAssignments1D, props: AddSolutionProps) {
|
|
111
|
+
let { score, maxSolutions, partial, predictions } = props;
|
|
112
|
+
score /= doubleAssignmentPenalty(partial, predictions);
|
|
113
|
+
store.nSolutions++;
|
|
114
|
+
let solution: SolutionAssignment = {
|
|
115
|
+
assignment: JSON.parse(JSON.stringify(partial)),
|
|
116
|
+
score: score,
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
if (store.nSolutions >= maxSolutions) {
|
|
120
|
+
if (solution.score > store.solutions.last().score) {
|
|
121
|
+
store.solutions.pollLast();
|
|
122
|
+
store.solutions.add(solution);
|
|
123
|
+
}
|
|
124
|
+
} else {
|
|
125
|
+
store.solutions.add(solution);
|
|
126
|
+
store.nSolutions++;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function doubleAssignmentPenalty(
|
|
131
|
+
partial: Array<string | null>,
|
|
132
|
+
predictions: Predictions1Dassignments,
|
|
133
|
+
) {
|
|
134
|
+
const nbSources = Object.keys(predictions).length;
|
|
135
|
+
let assignments = new Set(partial);
|
|
136
|
+
let nbDoubleAssignment = nbSources - assignments.size;
|
|
137
|
+
return nbDoubleAssignment > 0 ? 2 * nbDoubleAssignment : 1;
|
|
138
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const BASE62 = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
2
|
+
|
|
3
|
+
const LENGTH = 8;
|
|
4
|
+
|
|
5
|
+
export default function generateID() {
|
|
6
|
+
let id = '';
|
|
7
|
+
for (let i = 0; i < LENGTH; i++) {
|
|
8
|
+
id += BASE62.charAt(Math.floor(Math.random() * 62));
|
|
9
|
+
}
|
|
10
|
+
return id;
|
|
11
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Targets } from '../get1HAssignments';
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
Predictions1Dassignments,
|
|
5
|
+
RestrictionByCS,
|
|
6
|
+
} from './buildAssignments';
|
|
7
|
+
|
|
8
|
+
interface PartialScoreOptions {
|
|
9
|
+
restrictionByCS: RestrictionByCS;
|
|
10
|
+
/**
|
|
11
|
+
* number of allowed unassignment signals
|
|
12
|
+
* @default 0
|
|
13
|
+
*/
|
|
14
|
+
useIntegrationRestriction: boolean;
|
|
15
|
+
nbAllowedUnAssigned: number;
|
|
16
|
+
diaIDPeerPossibleAssignment: string[];
|
|
17
|
+
predictions: Predictions1Dassignments;
|
|
18
|
+
targets: Targets;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function partialScore(
|
|
22
|
+
partial: Array<string | null>,
|
|
23
|
+
options: PartialScoreOptions,
|
|
24
|
+
) {
|
|
25
|
+
const {
|
|
26
|
+
useIntegrationRestriction,
|
|
27
|
+
diaIDPeerPossibleAssignment,
|
|
28
|
+
nbAllowedUnAssigned,
|
|
29
|
+
restrictionByCS,
|
|
30
|
+
predictions,
|
|
31
|
+
targets,
|
|
32
|
+
} = options;
|
|
33
|
+
const { useChemicalShiftScore } = restrictionByCS;
|
|
34
|
+
let countStars = 0;
|
|
35
|
+
let totalPartial = partial.length;
|
|
36
|
+
let partialInverse: {
|
|
37
|
+
[key: string]: string[];
|
|
38
|
+
} = {};
|
|
39
|
+
let activeDomainOnPrediction: number[] = [];
|
|
40
|
+
|
|
41
|
+
for (let i = 0; i < partial.length; i++) {
|
|
42
|
+
const targetID = partial[i];
|
|
43
|
+
if (targetID && targetID !== '*') {
|
|
44
|
+
activeDomainOnPrediction.push(i);
|
|
45
|
+
if (!partialInverse[targetID]) {
|
|
46
|
+
partialInverse[targetID] = [];
|
|
47
|
+
}
|
|
48
|
+
partialInverse[targetID].push(diaIDPeerPossibleAssignment[i]);
|
|
49
|
+
}
|
|
50
|
+
if (targetID === '*') countStars++;
|
|
51
|
+
}
|
|
52
|
+
if (countStars > nbAllowedUnAssigned) return 0;
|
|
53
|
+
|
|
54
|
+
const activeDomainOnTarget = Object.keys(partialInverse);
|
|
55
|
+
|
|
56
|
+
if (activeDomainOnTarget.length === 0) {
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (useIntegrationRestriction) {
|
|
61
|
+
for (let targetID of activeDomainOnTarget) {
|
|
62
|
+
let targetToSource = partialInverse[targetID];
|
|
63
|
+
let total = 0;
|
|
64
|
+
for (const diaID of targetToSource) {
|
|
65
|
+
const prediction = predictions[diaID];
|
|
66
|
+
total += prediction.allHydrogens;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const { integration } = targets[targetID];
|
|
70
|
+
if (total - integration >= 0.5) {
|
|
71
|
+
return 0;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
//chemical shift score
|
|
77
|
+
let chemicalShiftScore = useChemicalShiftScore
|
|
78
|
+
? chemicalShiftScoring(partial, options)
|
|
79
|
+
: 1;
|
|
80
|
+
|
|
81
|
+
const penaltyByStarts = countStars / totalPartial;
|
|
82
|
+
|
|
83
|
+
return chemicalShiftScore - penaltyByStarts;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function chemicalShiftScoring(
|
|
87
|
+
partial: Array<string | null>,
|
|
88
|
+
options: PartialScoreOptions,
|
|
89
|
+
) {
|
|
90
|
+
const { tolerance } = options.restrictionByCS;
|
|
91
|
+
const { diaIDPeerPossibleAssignment, predictions, targets } = options;
|
|
92
|
+
|
|
93
|
+
let chemicalShiftScore = 0;
|
|
94
|
+
let count = 0;
|
|
95
|
+
for (let index = 0; index < partial.length; index++) {
|
|
96
|
+
const targetID = partial[index];
|
|
97
|
+
if (targetID && targetID !== '*') {
|
|
98
|
+
count++;
|
|
99
|
+
let diaID = diaIDPeerPossibleAssignment[index];
|
|
100
|
+
let source = predictions[diaID];
|
|
101
|
+
let target = targets[targetID];
|
|
102
|
+
let error = tolerance;
|
|
103
|
+
if (source.error) {
|
|
104
|
+
error = Math.max(source.error, tolerance);
|
|
105
|
+
}
|
|
106
|
+
if (typeof source.delta === 'undefined') {
|
|
107
|
+
// Chemical shift is not a restriction
|
|
108
|
+
chemicalShiftScore += 1;
|
|
109
|
+
} else {
|
|
110
|
+
const delta =
|
|
111
|
+
target.signals && target.signals.length > 0
|
|
112
|
+
? target.signals[0].delta
|
|
113
|
+
: (target.to + target.from) / 2;
|
|
114
|
+
let diff = Math.abs(source.delta - delta);
|
|
115
|
+
if (diff < error) {
|
|
116
|
+
chemicalShiftScore += 1;
|
|
117
|
+
} else {
|
|
118
|
+
diff = Math.abs(diff - error);
|
|
119
|
+
chemicalShiftScore += (-0.25 / error) * diff + 1;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (count > 0) {
|
|
125
|
+
chemicalShiftScore /= count;
|
|
126
|
+
}
|
|
127
|
+
return chemicalShiftScore;
|
|
128
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @typedef {Object} DataXY
|
|
3
|
-
* @property {Array<Number>} x Array of x values
|
|
4
|
-
* @property {Array<Number>} y Array of y values
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
1
|
export * from './constants/gyromagneticRatio';
|
|
8
2
|
export * from './constants/impurities';
|
|
9
3
|
export * from './constants/couplingPatterns';
|
|
@@ -17,6 +11,9 @@ export * from './prediction/predictHSQC';
|
|
|
17
11
|
export * from './prediction/predictHMBC';
|
|
18
12
|
export * from './prediction/predictAll';
|
|
19
13
|
|
|
14
|
+
export * from './assignment/get1HAssignments';
|
|
15
|
+
export * from './assignment/get13CAssignments';
|
|
16
|
+
|
|
20
17
|
export * from './ranges/rangesToACS';
|
|
21
18
|
export * from './ranges/rangesToXY';
|
|
22
19
|
|
|
@@ -66,7 +66,7 @@ function checkImpurity(
|
|
|
66
66
|
while (i--) {
|
|
67
67
|
j = peakList.length;
|
|
68
68
|
while (j--) {
|
|
69
|
-
tolerance = error + peakList[j].
|
|
69
|
+
tolerance = error + peakList[j].width;
|
|
70
70
|
difference = Math.abs(impurity[i].shift - peakList[j].x);
|
|
71
71
|
if (difference < tolerance) {
|
|
72
72
|
// && (impurity[i].multiplicity === '' || (impurity[i].multiplicity.indexOf(peakList[j].multiplicity)) { // some impurities has multiplicities like 'bs' but at presents it is unsupported
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { DataXY } from 'cheminfo-types';
|
|
2
|
-
import type { GSDPeak } from 'ml-gsd';
|
|
3
2
|
import { xyIntegration } from 'ml-spectra-processing';
|
|
4
3
|
|
|
5
4
|
import type { MakeMandatory } from '../types/MakeMandatory';
|
|
@@ -92,22 +91,20 @@ const assignSignal = (
|
|
|
92
91
|
delta: NaN,
|
|
93
92
|
nbPeaks: 1,
|
|
94
93
|
kind: 'signal',
|
|
95
|
-
startX: peak.x - peak.
|
|
96
|
-
stopX: peak.x + peak.
|
|
94
|
+
startX: peak.x - peak.width,
|
|
95
|
+
stopX: peak.x + peak.width,
|
|
97
96
|
observe: frequency,
|
|
98
97
|
nucleus,
|
|
99
98
|
integralData: {
|
|
100
|
-
from: peak.x - peak.
|
|
101
|
-
to: peak.x + peak.
|
|
99
|
+
from: peak.x - peak.width * 3,
|
|
100
|
+
to: peak.x + peak.width * 3,
|
|
102
101
|
value: 0,
|
|
103
102
|
},
|
|
104
103
|
peaks: [
|
|
105
104
|
{
|
|
106
105
|
x: peak.x,
|
|
107
106
|
intensity: peak.y,
|
|
108
|
-
|
|
109
|
-
width: peak.shape.width,
|
|
110
|
-
},
|
|
107
|
+
width: peak.width,
|
|
111
108
|
},
|
|
112
109
|
],
|
|
113
110
|
};
|
|
@@ -178,9 +175,7 @@ export function peaksToRanges(
|
|
|
178
175
|
peaksO.push({
|
|
179
176
|
x: peakR.x,
|
|
180
177
|
y: peakR.intensity,
|
|
181
|
-
|
|
182
|
-
width: peakR.shape.width,
|
|
183
|
-
},
|
|
178
|
+
width: peakR.width,
|
|
184
179
|
});
|
|
185
180
|
signal.mask.splice(j, 1);
|
|
186
181
|
signal.mask2.splice(j, 1);
|
|
@@ -251,7 +246,7 @@ export function peaksToRanges(
|
|
|
251
246
|
...peak,
|
|
252
247
|
};
|
|
253
248
|
delete newResult.intensity;
|
|
254
|
-
return newResult as
|
|
249
|
+
return newResult as NMRPeak1D;
|
|
255
250
|
});
|
|
256
251
|
}
|
|
257
252
|
if (signal.nmrJs) {
|
|
@@ -307,24 +302,22 @@ function detectSignals(
|
|
|
307
302
|
if (peak.kind) signal1D.kind = peak.kind;
|
|
308
303
|
signals.push(signal1D);
|
|
309
304
|
} else {
|
|
310
|
-
let tmp = peak.x + peak.
|
|
305
|
+
let tmp = peak.x + peak.width;
|
|
311
306
|
signal1D.stopX = Math.max(signal1D.stopX, tmp);
|
|
312
307
|
signal1D.startX = Math.min(signal1D.startX, tmp);
|
|
313
308
|
signal1D.nbPeaks++;
|
|
314
309
|
signal1D.peaks.push({
|
|
315
310
|
x: peak.x,
|
|
316
311
|
intensity: peak.y,
|
|
317
|
-
|
|
318
|
-
width: peak.shape.width,
|
|
319
|
-
},
|
|
312
|
+
width: peak.width,
|
|
320
313
|
});
|
|
321
314
|
signal1D.integralData.from = Math.min(
|
|
322
315
|
signal1D.integralData.from,
|
|
323
|
-
peak.x - peak.
|
|
316
|
+
peak.x - peak.width * 3,
|
|
324
317
|
);
|
|
325
318
|
signal1D.integralData.to = Math.max(
|
|
326
319
|
signal1D.integralData.to,
|
|
327
|
-
peak.x + peak.
|
|
320
|
+
peak.x + peak.width * 3,
|
|
328
321
|
);
|
|
329
322
|
if (peak.kind) signal1D.kind = peak.kind;
|
|
330
323
|
}
|
|
@@ -372,5 +365,5 @@ function detectSignals(
|
|
|
372
365
|
* @private
|
|
373
366
|
*/
|
|
374
367
|
function computeArea(peak: Peak1DIntern) {
|
|
375
|
-
return Math.abs(peak.intensity * peak.
|
|
368
|
+
return Math.abs(peak.intensity * peak.width * 1.57); // todo add an option with this value: 1.772453851
|
|
376
369
|
}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import LM from 'ml-levenberg-marquardt';
|
|
2
|
-
import {
|
|
2
|
+
import { Gaussian2D } from 'ml-peak-shape-generator';
|
|
3
3
|
|
|
4
4
|
import type { MPFPeak } from '../../types/MPFPeak';
|
|
5
5
|
|
|
6
|
-
const { fct: gaussian2DFct } = gaussian2D;
|
|
7
|
-
|
|
8
6
|
const direction8X = [-1, -1, -1, 0, 0, 1, 1, 1];
|
|
9
7
|
const direction8Y = [-1, 0, 1, -1, 1, -1, 0, 1];
|
|
10
8
|
const direction16X = [-2, -2, -2, -2, -2, -1, -1, 0, 0, 1, 1, 2, 2, 2, 2, 2];
|
|
@@ -142,6 +140,7 @@ function fitGaussian(
|
|
|
142
140
|
}
|
|
143
141
|
|
|
144
142
|
function paramGaussian2D(intervalX: number, intervalY: number, nCols: number) {
|
|
143
|
+
const gaussian2D = new Gaussian2D();
|
|
145
144
|
return (p: number[]) => {
|
|
146
145
|
return (t: number) => {
|
|
147
146
|
let nL = p.length / 5;
|
|
@@ -149,13 +148,12 @@ function paramGaussian2D(intervalX: number, intervalY: number, nCols: number) {
|
|
|
149
148
|
let xIndex = t % nCols;
|
|
150
149
|
let yIndex = (t - xIndex) / nCols;
|
|
151
150
|
for (let i = 0; i < nL; i++) {
|
|
151
|
+
gaussian2D.fwhm = {x: p[i + 3 * nL], y: p[i + 4 * nL]};
|
|
152
152
|
result +=
|
|
153
153
|
p[i + 2 * nL] *
|
|
154
|
-
|
|
154
|
+
gaussian2D.fct(
|
|
155
155
|
(xIndex - p[i]) * intervalX,
|
|
156
156
|
(yIndex - p[i + nL]) * intervalY,
|
|
157
|
-
p[i + 3 * nL],
|
|
158
|
-
p[i + 4 * nL],
|
|
159
157
|
);
|
|
160
158
|
}
|
|
161
159
|
return result;
|