nmr-processing 7.1.0 → 7.2.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.
Files changed (117) hide show
  1. package/lib/assignment/get13CAssignments.d.ts +3 -3
  2. package/lib/assignment/get13CAssignments.js.map +1 -1
  3. package/lib/assignment/get1HAssignments.d.ts +3 -3
  4. package/lib/assignment/get1HAssignments.js.map +1 -1
  5. package/lib/assignment/getAssignments.d.ts +81 -0
  6. package/lib/assignment/getAssignments.js +44 -0
  7. package/lib/assignment/getAssignments.js.map +1 -0
  8. package/lib/assignment/utils/buildAssignments.d.ts +4 -4
  9. package/lib/assignment/utils/buildAssignments.js.map +1 -1
  10. package/lib/assignment/utils/createMapPossibleAssignments.d.ts +2 -2
  11. package/lib/assignment/utils/exploreTreeRec.d.ts +3 -3
  12. package/lib/assignment/utils/exploreTreeRec.js.map +1 -1
  13. package/lib/assignment/utils/getAssignment/buildAssignments.d.ts +72 -0
  14. package/lib/assignment/utils/getAssignment/buildAssignments.js +205 -0
  15. package/lib/assignment/utils/getAssignment/buildAssignments.js.map +1 -0
  16. package/lib/assignment/utils/getAssignment/checkIDs.d.ts +23 -0
  17. package/lib/assignment/utils/getAssignment/checkIDs.js +57 -0
  18. package/lib/assignment/utils/getAssignment/checkIDs.js.map +1 -0
  19. package/lib/assignment/utils/getAssignment/createMapPossibleAssignment.d.ts +15 -0
  20. package/lib/assignment/utils/getAssignment/createMapPossibleAssignment.js +55 -0
  21. package/lib/assignment/utils/getAssignment/createMapPossibleAssignment.js.map +1 -0
  22. package/lib/assignment/utils/getAssignment/exploreTree.d.ts +22 -0
  23. package/lib/assignment/utils/getAssignment/exploreTree.js +93 -0
  24. package/lib/assignment/utils/getAssignment/exploreTree.js.map +1 -0
  25. package/lib/assignment/utils/getAssignment/formatData.d.ts +14 -0
  26. package/lib/assignment/utils/getAssignment/formatData.js +20 -0
  27. package/lib/assignment/utils/getAssignment/formatData.js.map +1 -0
  28. package/lib/assignment/utils/getAssignment/getIntegrationOfAttachedProtons.d.ts +3 -0
  29. package/lib/assignment/utils/getAssignment/getIntegrationOfAttachedProtons.js +14 -0
  30. package/lib/assignment/utils/getAssignment/getIntegrationOfAttachedProtons.js.map +1 -0
  31. package/lib/assignment/utils/getAssignment/getTargetsAndCorrelations.d.ts +18 -0
  32. package/lib/assignment/utils/getAssignment/getTargetsAndCorrelations.js +37 -0
  33. package/lib/assignment/utils/getAssignment/getTargetsAndCorrelations.js.map +1 -0
  34. package/lib/assignment/utils/getAssignment/getWorkFlow.d.ts +19 -0
  35. package/lib/assignment/utils/getAssignment/getWorkFlow.js +52 -0
  36. package/lib/assignment/utils/getAssignment/getWorkFlow.js.map +1 -0
  37. package/lib/assignment/utils/getAssignment/groupCarbonTargetByIntegrationZone.d.ts +7 -0
  38. package/lib/assignment/utils/getAssignment/groupCarbonTargetByIntegrationZone.js +43 -0
  39. package/lib/assignment/utils/getAssignment/groupCarbonTargetByIntegrationZone.js.map +1 -0
  40. package/lib/assignment/utils/getAssignment/isSpectraData1D.d.ts +2 -0
  41. package/lib/assignment/utils/getAssignment/isSpectraData1D.js +8 -0
  42. package/lib/assignment/utils/getAssignment/isSpectraData1D.js.map +1 -0
  43. package/lib/assignment/utils/getAssignment/partialScore.d.ts +13 -0
  44. package/lib/assignment/utils/getAssignment/partialScore.js +221 -0
  45. package/lib/assignment/utils/getAssignment/partialScore.js.map +1 -0
  46. package/lib/assignment/utils/getAssignment/searchIndices.d.ts +6 -0
  47. package/lib/assignment/utils/getAssignment/searchIndices.js +21 -0
  48. package/lib/assignment/utils/getAssignment/searchIndices.js.map +1 -0
  49. package/lib/assignment/utils/partialScore.d.ts +2 -2
  50. package/lib/index.d.ts +1 -0
  51. package/lib/index.js +1 -0
  52. package/lib/index.js.map +1 -1
  53. package/lib/peaks/peaksToRanges.js +1 -0
  54. package/lib/peaks/peaksToRanges.js.map +1 -1
  55. package/lib/prediction/utils/predict2D.d.ts +0 -2
  56. package/lib/prediction/utils/predict2D.js.map +1 -1
  57. package/lib-esm/assignment/get13CAssignments.js.map +1 -1
  58. package/lib-esm/assignment/get1HAssignments.js.map +1 -1
  59. package/lib-esm/assignment/getAssignments.js +37 -0
  60. package/lib-esm/assignment/getAssignments.js.map +1 -0
  61. package/lib-esm/assignment/utils/buildAssignments.js.map +1 -1
  62. package/lib-esm/assignment/utils/exploreTreeRec.js.map +1 -1
  63. package/lib-esm/assignment/utils/getAssignment/buildAssignments.js +198 -0
  64. package/lib-esm/assignment/utils/getAssignment/buildAssignments.js.map +1 -0
  65. package/lib-esm/assignment/utils/getAssignment/checkIDs.js +48 -0
  66. package/lib-esm/assignment/utils/getAssignment/checkIDs.js.map +1 -0
  67. package/lib-esm/assignment/utils/getAssignment/createMapPossibleAssignment.js +51 -0
  68. package/lib-esm/assignment/utils/getAssignment/createMapPossibleAssignment.js.map +1 -0
  69. package/lib-esm/assignment/utils/getAssignment/exploreTree.js +89 -0
  70. package/lib-esm/assignment/utils/getAssignment/exploreTree.js.map +1 -0
  71. package/lib-esm/assignment/utils/getAssignment/formatData.js +16 -0
  72. package/lib-esm/assignment/utils/getAssignment/formatData.js.map +1 -0
  73. package/lib-esm/assignment/utils/getAssignment/getIntegrationOfAttachedProtons.js +10 -0
  74. package/lib-esm/assignment/utils/getAssignment/getIntegrationOfAttachedProtons.js.map +1 -0
  75. package/lib-esm/assignment/utils/getAssignment/getTargetsAndCorrelations.js +33 -0
  76. package/lib-esm/assignment/utils/getAssignment/getTargetsAndCorrelations.js.map +1 -0
  77. package/lib-esm/assignment/utils/getAssignment/getWorkFlow.js +50 -0
  78. package/lib-esm/assignment/utils/getAssignment/getWorkFlow.js.map +1 -0
  79. package/lib-esm/assignment/utils/getAssignment/groupCarbonTargetByIntegrationZone.js +41 -0
  80. package/lib-esm/assignment/utils/getAssignment/groupCarbonTargetByIntegrationZone.js.map +1 -0
  81. package/lib-esm/assignment/utils/getAssignment/isSpectraData1D.js +4 -0
  82. package/lib-esm/assignment/utils/getAssignment/isSpectraData1D.js.map +1 -0
  83. package/lib-esm/assignment/utils/getAssignment/partialScore.js +214 -0
  84. package/lib-esm/assignment/utils/getAssignment/partialScore.js.map +1 -0
  85. package/lib-esm/assignment/utils/getAssignment/searchIndices.js +17 -0
  86. package/lib-esm/assignment/utils/getAssignment/searchIndices.js.map +1 -0
  87. package/lib-esm/index.js +1 -0
  88. package/lib-esm/index.js.map +1 -1
  89. package/lib-esm/peaks/peaksToRanges.js +1 -0
  90. package/lib-esm/peaks/peaksToRanges.js.map +1 -1
  91. package/lib-esm/prediction/utils/predict2D.js.map +1 -1
  92. package/package.json +2 -1
  93. package/src/assignment/get13CAssignments.ts +2 -2
  94. package/src/assignment/get1HAssignments.ts +2 -2
  95. package/src/assignment/getAssignments.ts +149 -0
  96. package/src/assignment/utils/buildAssignments.ts +4 -4
  97. package/src/assignment/utils/createMapPossibleAssignments.ts +2 -2
  98. package/src/assignment/utils/exploreTreeRec.ts +5 -5
  99. package/src/assignment/utils/getAssignment/buildAssignments.ts +339 -0
  100. package/src/assignment/utils/getAssignment/checkIDs.ts +76 -0
  101. package/src/assignment/utils/getAssignment/createMapPossibleAssignment.ts +85 -0
  102. package/src/assignment/utils/getAssignment/data/correlations.js +713 -0
  103. package/src/assignment/utils/getAssignment/data/predictions.js +34 -0
  104. package/src/assignment/utils/getAssignment/exploreTree.ts +171 -0
  105. package/src/assignment/utils/getAssignment/formatData.ts +35 -0
  106. package/src/assignment/utils/getAssignment/getIntegrationOfAttachedProtons.ts +16 -0
  107. package/src/assignment/utils/getAssignment/getTargetsAndCorrelations.ts +63 -0
  108. package/src/assignment/utils/getAssignment/getWorkFlow.ts +72 -0
  109. package/src/assignment/utils/getAssignment/groupCarbonTargetByIntegrationZone.ts +55 -0
  110. package/src/assignment/utils/getAssignment/isSpectraData1D.ts +7 -0
  111. package/src/assignment/utils/getAssignment/partialScore.ts +308 -0
  112. package/src/assignment/utils/getAssignment/searchIndices.ts +19 -0
  113. package/src/assignment/utils/partialScore.ts +2 -2
  114. package/src/index.ts +1 -0
  115. package/src/ml-tree-set.d.ts +1 -1
  116. package/src/peaks/peaksToRanges.ts +1 -0
  117. package/src/prediction/utils/predict2D.ts +0 -2
@@ -0,0 +1,308 @@
1
+ import { getCorrelationDelta } from 'nmr-correlation';
2
+
3
+ import {
4
+ AtomTypes,
5
+ InfoByAtomType,
6
+ Partial,
7
+ PredictionsByAtomType,
8
+ RestrictionByCS,
9
+ } from './buildAssignments';
10
+ import {
11
+ CorrelationWithIntegration,
12
+ TargetsByAtomType,
13
+ } from './getTargetsAndCorrelations';
14
+ import groupCarbonTargetByIntegrationZone from './groupCarbonTargetByIntegrationZone';
15
+
16
+ export interface PartialScoreOptions {
17
+ diaIDPeerPossibleAssignment: { [key: string]: string[] };
18
+ restrictionByCS: RestrictionByCS;
19
+ infoByAtomTypes: InfoByAtomType;
20
+ correlations: CorrelationWithIntegration[];
21
+ predictions: PredictionsByAtomType;
22
+ targets: TargetsByAtomType;
23
+ }
24
+
25
+ interface ObjectStringArray {
26
+ [key: string]: string[];
27
+ }
28
+
29
+ interface ObjectObjectStringArray {
30
+ [key: string]: ObjectStringArray;
31
+ }
32
+
33
+ export function partialScore(partial: Partial, props: PartialScoreOptions) {
34
+ const {
35
+ diaIDPeerPossibleAssignment,
36
+ infoByAtomTypes,
37
+ restrictionByCS,
38
+ predictions,
39
+ targets,
40
+ correlations,
41
+ } = props;
42
+
43
+ const { tolerance: toleranceCS, useChemicalShiftScore } = restrictionByCS;
44
+ let totalStarts = 0;
45
+ let totalPartial = 0;
46
+ let partialInverse: ObjectObjectStringArray = {};
47
+ let activeDomainOnPrediction: { [key: string]: number[] } = {};
48
+ const atomTypes = Object.keys(partial) as AtomTypes[];
49
+ for (const atomType of atomTypes) {
50
+ let countStars = 0;
51
+ const { nbAllowedUnAssigned } = infoByAtomTypes[atomType];
52
+ const currentPartialInverse: ObjectStringArray = {};
53
+ const partialAssignment = partial[atomType] || [];
54
+ partialInverse[atomType] = currentPartialInverse;
55
+ activeDomainOnPrediction[atomType] = [];
56
+ totalPartial += partialAssignment.length;
57
+ for (let i = 0; i < partialAssignment.length; i++) {
58
+ const targetID = partialAssignment[i];
59
+ if (targetID && targetID !== '*') {
60
+ activeDomainOnPrediction[atomType].push(i);
61
+ if (!currentPartialInverse[targetID]) {
62
+ currentPartialInverse[targetID] = [];
63
+ }
64
+ currentPartialInverse[targetID].push(
65
+ diaIDPeerPossibleAssignment[atomType][i],
66
+ );
67
+ }
68
+ if (targetID === '*') countStars++;
69
+ }
70
+
71
+ if (countStars > nbAllowedUnAssigned) return 0;
72
+ totalStarts += countStars;
73
+ }
74
+
75
+ const activeDomainOnTarget: ObjectStringArray = {};
76
+ for (const atomType in partialInverse) {
77
+ activeDomainOnTarget[atomType] = Object.keys(partialInverse[atomType]);
78
+ }
79
+
80
+ const valuesActiveDomainOnTarget = Object.values(activeDomainOnTarget);
81
+ if (
82
+ valuesActiveDomainOnTarget.reduce(
83
+ (sum, e) => (e.length === 0 ? sum + 1 : sum),
84
+ 0,
85
+ ) === valuesActiveDomainOnTarget.length
86
+ ) {
87
+ return 0;
88
+ }
89
+
90
+ const getPredictionByDiaID = getPrediction.bind({}, predictions);
91
+ // check the integration
92
+ const targetByIntegral: {
93
+ atomType: string;
94
+ targetIDs: string[];
95
+ integration: number;
96
+ }[] = [];
97
+
98
+ for (const atomType in partial) {
99
+ if (atomType === 'C' && activeDomainOnTarget[atomType].length > 0) {
100
+ targetByIntegral.push(
101
+ ...groupCarbonTargetByIntegrationZone(
102
+ activeDomainOnTarget[atomType],
103
+ targets[atomType],
104
+ correlations,
105
+ ),
106
+ );
107
+ } else {
108
+ for (let targetID of activeDomainOnTarget[atomType]) {
109
+ targetByIntegral.push({
110
+ atomType,
111
+ targetIDs: [targetID],
112
+ integration: targets.H[targetID].integration,
113
+ });
114
+ }
115
+ }
116
+ }
117
+ for (const group of targetByIntegral) {
118
+ const { integration, atomType } = group;
119
+
120
+ if (integration === undefined || isNaN(integration)) continue;
121
+
122
+ let total = 0;
123
+ for (let targetID of group.targetIDs) {
124
+ let targetToSource = partialInverse[atomType][targetID];
125
+ for (const diaID of targetToSource) {
126
+ const { prediction, atomType: atomOfPrediction } =
127
+ getPredictionByDiaID(diaID);
128
+ if (atomType === atomOfPrediction) total += prediction.allHydrogens;
129
+ }
130
+ }
131
+ if (total - integration >= 0.5) {
132
+ return 0;
133
+ }
134
+ }
135
+
136
+ //chemical shift score
137
+ let count = 1;
138
+ let chemicalShiftScore = 1;
139
+ if (useChemicalShiftScore) {
140
+ chemicalShiftScore = 0;
141
+ count = 0;
142
+ for (const atomType of Object.keys(partial) as AtomTypes[]) {
143
+ const partialPeerAtomType = partial[atomType];
144
+ const targetsPeerAtomType = targets[atomType];
145
+ for (let index = 0; index < partialPeerAtomType.length; index++) {
146
+ const targetID = partialPeerAtomType[index];
147
+ if (targetID && targetID !== '*') {
148
+ count++;
149
+ let diaID = diaIDPeerPossibleAssignment[atomType][index];
150
+ let source = predictions[atomType][diaID];
151
+ let target = targetsPeerAtomType[targetID];
152
+ let error = toleranceCS[atomType];
153
+ // if (source.error) {
154
+ // error = Math.max(source.error, toleranceCS);
155
+ // }
156
+ if (typeof source.delta === 'undefined') {
157
+ // Chemical shift is not a restriction
158
+ chemicalShiftScore += 1;
159
+ } else {
160
+ const targetDelta = getCorrelationDelta(target);
161
+
162
+ if (targetDelta === undefined) {
163
+ throw new Error('correlation has not delta');
164
+ }
165
+
166
+ let diff = Math.abs(source.delta - targetDelta);
167
+ if (diff < error) {
168
+ //@TODO: check for a better discriminant
169
+ chemicalShiftScore += 1;
170
+ } else {
171
+ diff = Math.abs(diff - error);
172
+ chemicalShiftScore += (-0.25 / error) * diff + 1;
173
+ }
174
+ }
175
+ }
176
+ }
177
+ }
178
+ if (count > 0) {
179
+ chemicalShiftScore /= count;
180
+ }
181
+ }
182
+
183
+ let scoreOn2D = 0;
184
+
185
+ if (howManyActived(activeDomainOnTarget) > 1) {
186
+ let andConstrains: { [key: string]: number } = {};
187
+ let activeDomain: Array<{ index: number; atomType: AtomTypes }> = [];
188
+
189
+ for (const atomType of Object.keys(
190
+ activeDomainOnPrediction,
191
+ ) as AtomTypes[]) {
192
+ activeDomain = activeDomain.concat(
193
+ activeDomainOnPrediction[atomType].map((e) => ({ index: e, atomType })),
194
+ );
195
+ }
196
+
197
+ for (let i = 0; i < activeDomain.length; i++) {
198
+ const { atomType: atomTypeI, index: indexI } = activeDomain[i];
199
+ const predictionI =
200
+ predictions[atomTypeI][diaIDPeerPossibleAssignment[atomTypeI][indexI]];
201
+ for (let j = i + 1; j < activeDomain.length; j++) {
202
+ const { atomType: atomTypeJ, index: indexJ } = activeDomain[j];
203
+ const predictionJ =
204
+ predictions[atomTypeJ][
205
+ diaIDPeerPossibleAssignment[atomTypeJ][indexJ]
206
+ ];
207
+ let pathLength = predictionI.pathLength[predictionJ.diaIDIndex];
208
+ let isPossible = pathLength < 5;
209
+
210
+ let partialI = partial[atomTypeI][indexI];
211
+ let partialJ = partial[atomTypeJ][indexJ];
212
+
213
+ if (!partialI || !partialJ) continue;
214
+
215
+ let keyOnTargertMap =
216
+ partialI > partialJ
217
+ ? `${partialJ} ${partialI}`
218
+ : `${partialI} ${partialJ}`;
219
+
220
+ let areLinked = checkLinking(
221
+ {
222
+ from: {
223
+ targetID: partialI,
224
+ atomType: atomTypeI,
225
+ },
226
+ to: {
227
+ targetID: partialJ,
228
+ atomType: atomTypeJ,
229
+ },
230
+ },
231
+ targets,
232
+ );
233
+
234
+ let partialScore2D = isPossible
235
+ ? areLinked
236
+ ? 1
237
+ : 0
238
+ : !areLinked
239
+ ? 1
240
+ : 0;
241
+
242
+ andConstrains[keyOnTargertMap] = andConstrains[keyOnTargertMap]
243
+ ? Math.max(andConstrains[keyOnTargertMap], partialScore2D)
244
+ : partialScore2D;
245
+ }
246
+ }
247
+
248
+ let sumAnd = 0;
249
+ for (let key in andConstrains) {
250
+ sumAnd += andConstrains[key];
251
+ }
252
+
253
+ scoreOn2D =
254
+ sumAnd / ((activeDomain.length * (activeDomain.length - 1)) / 2);
255
+ }
256
+ const penaltyByStarts = totalStarts / totalPartial;
257
+ if (chemicalShiftScore === 0) return scoreOn2D - penaltyByStarts;
258
+
259
+ if (scoreOn2D === 0) return chemicalShiftScore - penaltyByStarts;
260
+ return (chemicalShiftScore + scoreOn2D) / 2 - penaltyByStarts;
261
+ }
262
+
263
+ interface CheckLinkingFromTo {
264
+ from: {
265
+ targetID: string;
266
+ atomType: AtomTypes;
267
+ };
268
+ to: {
269
+ targetID: string;
270
+ atomType: AtomTypes;
271
+ };
272
+ }
273
+
274
+ function checkLinking(
275
+ partials: CheckLinkingFromTo,
276
+ correlations: TargetsByAtomType,
277
+ ) {
278
+ const { from, to } = partials;
279
+ if (from.targetID === to.targetID) return true;
280
+ let correlationI = correlations[from.atomType][from.targetID];
281
+ let correlationJ = correlations[to.atomType][to.targetID];
282
+ for (const linkJ of correlationJ.link) {
283
+ for (const link of correlationI.link) {
284
+ if (link.signal.id === linkJ.signal.id) return true;
285
+ }
286
+ }
287
+ return false;
288
+ }
289
+
290
+ function getPrediction(predictions: PredictionsByAtomType, diaID: string) {
291
+ const atomTypes = Object.keys(predictions) as AtomTypes[];
292
+ for (const atomType of atomTypes) {
293
+ const predictionByAtomType = predictions[atomType];
294
+ if (!predictionByAtomType) throw new Error(`prediction by ${atomType}`);
295
+ if (predictionByAtomType[diaID]) {
296
+ return { atomType, prediction: predictionByAtomType[diaID] };
297
+ }
298
+ }
299
+ throw new Error(`There is not prediction for ${diaID}`);
300
+ }
301
+
302
+ function howManyActived(actived: ObjectStringArray) {
303
+ let sum = 0;
304
+ for (const atom in actived) {
305
+ sum += actived[atom].length;
306
+ }
307
+ return sum;
308
+ }
@@ -0,0 +1,19 @@
1
+ import { SpectraData } from '../../getAssignments';
2
+
3
+ import { isSpectraData1D } from './isSpectraData1D';
4
+
5
+ export function searchIndices(signalId: string, spectra: SpectraData[]) {
6
+ for (let spectrumIndex = 0; spectrumIndex < spectra.length; spectrumIndex++) {
7
+ const spectrum = spectra[spectrumIndex];
8
+ const data = isSpectraData1D(spectrum) ? spectrum.ranges : spectrum.zones;
9
+ for (let elementIndex = 0; elementIndex < data.length; elementIndex++) {
10
+ const signals = data[elementIndex].signals || [];
11
+ for (let signalIndex = 0; signalIndex < signals.length; signalIndex++) {
12
+ if (signalId === signals[signalIndex].id) {
13
+ return { spectrumIndex, signalIndex, elementIndex };
14
+ }
15
+ }
16
+ }
17
+ }
18
+ throw new Error(`There is not a signal with ${signalId} ID`);
19
+ }
@@ -2,11 +2,11 @@ import { Targets } from '../get1HAssignments';
2
2
 
3
3
  import type {
4
4
  Predictions1Dassignments,
5
- RestrictionByCS,
5
+ RestrictionByCS1D,
6
6
  } from './buildAssignments';
7
7
 
8
8
  interface PartialScoreOptions {
9
- restrictionByCS: RestrictionByCS;
9
+ restrictionByCS: RestrictionByCS1D;
10
10
  /**
11
11
  * number of allowed unassignment signals
12
12
  * @default 0
package/src/index.ts CHANGED
@@ -14,6 +14,7 @@ export * from './prediction/predictAllSpectra';
14
14
 
15
15
  export * from './assignment/get1HAssignments';
16
16
  export * from './assignment/get13CAssignments';
17
+ export * from './assignment/getAssignments';
17
18
 
18
19
  export * from './ranges/rangesToACS';
19
20
  export * from './ranges/rangesToXY';
@@ -3,7 +3,7 @@ declare module 'ml-tree-set' {
3
3
  type Elements = any;
4
4
  export default class TreeSet {
5
5
  public length: number;
6
- public elements: Array<Elements>;
6
+ public elements: Array<w>;
7
7
 
8
8
  public constructor(comparator: Comparator);
9
9
 
@@ -242,6 +242,7 @@ export function peaksToRanges(
242
242
  delta: signal.delta,
243
243
  kind: signal.kind || 'signal',
244
244
  multiplicity: signal.multiplicity,
245
+ integration: signal.integralData.value,
245
246
  };
246
247
  if (keepPeaks) {
247
248
  signalResult.peaks = signal.peaks.map((peak) => {
@@ -94,8 +94,6 @@ export interface PredictOptions {
94
94
 
95
95
  export interface Predictions {
96
96
  [key: string]: Prediction1D | undefined;
97
- H?: Prediction1D;
98
- C?: Prediction1D;
99
97
  }
100
98
 
101
99
  type GroupDiastereotopicAtomIDsWithAtomInfo = GroupDiastereotopicAtomIDs & {