nmr-processing 8.0.0 → 8.3.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/lib/apodization/apodization.d.ts +22 -0
- package/lib/apodization/apodization.js +18 -0
- package/lib/apodization/apodization.js.map +1 -0
- package/lib/apodization/applyWindow.d.ts +28 -0
- package/lib/apodization/applyWindow.js +20 -0
- package/lib/apodization/applyWindow.js.map +1 -0
- package/lib/apodization/compose.d.ts +23 -0
- package/lib/apodization/compose.js +25 -0
- package/lib/apodization/compose.js.map +1 -0
- package/lib/apodization/getFunction.d.ts +2 -0
- package/lib/apodization/getFunction.js +18 -0
- package/lib/apodization/getFunction.js.map +1 -0
- package/lib/apodization/shapes/WindowFunctions.d.ts +12 -0
- package/lib/apodization/shapes/WindowFunctions.js +3 -0
- package/lib/apodization/shapes/WindowFunctions.js.map +1 -0
- package/lib/apodization/shapes/exponential.d.ts +11 -0
- package/lib/apodization/shapes/exponential.js +10 -0
- package/lib/apodization/shapes/exponential.js.map +1 -0
- package/lib/apodization/shapes/lorentzToGauss.d.ts +26 -0
- package/lib/apodization/shapes/lorentzToGauss.js +15 -0
- package/lib/apodization/shapes/lorentzToGauss.js.map +1 -0
- package/lib/apodization/utils/getData.d.ts +4 -0
- package/lib/apodization/utils/getData.js +21 -0
- package/lib/apodization/utils/getData.js.map +1 -0
- package/lib/assignment/utils/buildAssignments.d.ts +2 -2
- package/lib/assignment/utils/exploreTreeRec.js +1 -1
- package/lib/assignment/utils/exploreTreeRec.js.map +1 -1
- package/lib/assignment/utils/getAssignment/checkIDs.d.ts +1 -1
- package/lib/assignment/utils/getAssignment/checkIDs.js.map +1 -1
- package/lib/databases/DatabaseNMREntry.d.ts +2 -0
- package/lib/index.d.ts +5 -1
- package/lib/index.js +5 -1
- package/lib/index.js.map +1 -1
- package/lib/peaks/NMRPeak1D.d.ts +0 -1
- package/lib/peaks/peaksToRanges.d.ts +16 -0
- package/lib/peaks/peaksToRanges.js +3 -2
- package/lib/peaks/peaksToRanges.js.map +1 -1
- package/lib/peaks/solventSuppression.d.ts +6 -0
- package/lib/peaks/solventSuppression.js +158 -0
- package/lib/peaks/solventSuppression.js.map +1 -0
- package/lib/peaks/util/jAnalyzer.d.ts +1 -1
- package/lib/peaks/util/jAnalyzer.js +26 -31
- package/lib/peaks/util/jAnalyzer.js.map +1 -1
- package/lib/peaks/util/peakOptimizer.js +12 -16
- package/lib/peaks/util/peakOptimizer.js.map +1 -1
- package/lib/prediction/predictAllSpectra.js +7 -9
- package/lib/prediction/predictAllSpectra.js.map +1 -1
- package/lib/prediction/predictCarbon.js +1 -1
- package/lib/prediction/predictCarbon.js.map +1 -1
- package/lib/prediction/utils/queryByHOSE.js +1 -1
- package/lib/prediction/utils/queryByHOSE.js.map +1 -1
- package/lib/ranges/markSolventSignal.d.ts +3 -0
- package/lib/ranges/markSolventSignal.js +107 -0
- package/lib/ranges/markSolventSignal.js.map +1 -0
- package/lib/ranges/rangesToACS.js +8 -4
- package/lib/ranges/rangesToACS.js.map +1 -1
- package/lib/ranges/rangesToXY.js +27 -3
- package/lib/ranges/rangesToXY.js.map +1 -1
- package/lib/signals/addDummySignals.d.ts +2 -0
- package/lib/signals/addDummySignals.js +56 -0
- package/lib/signals/addDummySignals.js.map +1 -0
- package/lib/signals/hackSignalsToXY.js +2 -48
- package/lib/signals/hackSignalsToXY.js.map +1 -1
- package/lib/signals/simulation/getPauliMatrix.js.map +1 -1
- package/lib/signals/simulation/simulate1D.d.ts +1 -39
- package/lib/signals/simulation/simulate1D.js +13 -240
- package/lib/signals/simulation/simulate1D.js.map +1 -1
- package/lib/signals/simulation/simulateXYPeaks.d.ts +47 -0
- package/lib/signals/simulation/simulateXYPeaks.js +246 -0
- package/lib/signals/simulation/simulateXYPeaks.js.map +1 -0
- package/lib/signals/simulation/splitSpinSystem.js +11 -13
- package/lib/signals/simulation/splitSpinSystem.js.map +1 -1
- package/lib/utilities/getFrequency.d.ts +1 -1
- package/lib/utilities/getFrequency.js +4 -4
- package/lib/utilities/getFrequency.js.map +1 -1
- package/lib/utilities/rangeFromSignal.d.ts +9 -5
- package/lib/utilities/rangeFromSignal.js +7 -7
- package/lib/utilities/rangeFromSignal.js.map +1 -1
- package/lib/utilities/resurrectRange.js +4 -7
- package/lib/utilities/resurrectRange.js.map +1 -1
- package/lib/xyz/util/formatZone.d.ts +3 -0
- package/lib/xyz/util/formatZone.js +38 -0
- package/lib/xyz/util/formatZone.js.map +1 -0
- package/lib/xyz/xyzAutoZonesPicking.d.ts +1 -2
- package/lib/xyz/xyzAutoZonesPicking.js +2 -34
- package/lib/xyz/xyzAutoZonesPicking.js.map +1 -1
- package/lib/xyz/xyzJResAnalyzer.d.ts +6 -1
- package/lib/xyz/xyzJResAnalyzer.js +9 -8
- package/lib/xyz/xyzJResAnalyzer.js.map +1 -1
- package/lib-esm/apodization/apodization.js +14 -0
- package/lib-esm/apodization/apodization.js.map +1 -0
- package/lib-esm/apodization/applyWindow.js +16 -0
- package/lib-esm/apodization/applyWindow.js.map +1 -0
- package/lib-esm/apodization/compose.js +21 -0
- package/lib-esm/apodization/compose.js.map +1 -0
- package/lib-esm/apodization/getFunction.js +14 -0
- package/lib-esm/apodization/getFunction.js.map +1 -0
- package/lib-esm/apodization/shapes/WindowFunctions.js +2 -0
- package/lib-esm/apodization/shapes/WindowFunctions.js.map +1 -0
- package/lib-esm/apodization/shapes/exponential.js +6 -0
- package/lib-esm/apodization/shapes/exponential.js.map +1 -0
- package/lib-esm/apodization/shapes/lorentzToGauss.js +11 -0
- package/lib-esm/apodization/shapes/lorentzToGauss.js.map +1 -0
- package/lib-esm/apodization/utils/getData.js +17 -0
- package/lib-esm/apodization/utils/getData.js.map +1 -0
- package/lib-esm/assignment/utils/buildAssignments.js +3 -3
- package/lib-esm/assignment/utils/exploreTreeRec.js +1 -1
- package/lib-esm/assignment/utils/exploreTreeRec.js.map +1 -1
- package/lib-esm/assignment/utils/getAssignment/buildAssignments.js +3 -3
- package/lib-esm/assignment/utils/getAssignment/checkIDs.js.map +1 -1
- package/lib-esm/index.js +5 -1
- package/lib-esm/index.js.map +1 -1
- package/lib-esm/peaks/peaksToRanges.js +2 -2
- package/lib-esm/peaks/peaksToRanges.js.map +1 -1
- package/lib-esm/peaks/solventSuppression.js +154 -0
- package/lib-esm/peaks/solventSuppression.js.map +1 -0
- package/lib-esm/peaks/util/jAnalyzer.js +26 -31
- package/lib-esm/peaks/util/jAnalyzer.js.map +1 -1
- package/lib-esm/peaks/util/peakOptimizer.js +12 -16
- package/lib-esm/peaks/util/peakOptimizer.js.map +1 -1
- package/lib-esm/prediction/predictAllSpectra.js +7 -9
- package/lib-esm/prediction/predictAllSpectra.js.map +1 -1
- package/lib-esm/prediction/predictCarbon.js +1 -1
- package/lib-esm/prediction/predictCarbon.js.map +1 -1
- package/lib-esm/prediction/utils/queryByHOSE.js +1 -1
- package/lib-esm/prediction/utils/queryByHOSE.js.map +1 -1
- package/lib-esm/ranges/markSolventSignal.js +100 -0
- package/lib-esm/ranges/markSolventSignal.js.map +1 -0
- package/lib-esm/ranges/rangesToACS.js +8 -4
- package/lib-esm/ranges/rangesToACS.js.map +1 -1
- package/lib-esm/ranges/rangesToXY.js +27 -3
- package/lib-esm/ranges/rangesToXY.js.map +1 -1
- package/lib-esm/signals/addDummySignals.js +52 -0
- package/lib-esm/signals/addDummySignals.js.map +1 -0
- package/lib-esm/signals/hackSignalsToXY.js +2 -48
- package/lib-esm/signals/hackSignalsToXY.js.map +1 -1
- package/lib-esm/signals/simulation/getPauliMatrix.js.map +1 -1
- package/lib-esm/signals/simulation/simulate1D.js +14 -238
- package/lib-esm/signals/simulation/simulate1D.js.map +1 -1
- package/lib-esm/signals/simulation/simulateXYPeaks.js +239 -0
- package/lib-esm/signals/simulation/simulateXYPeaks.js.map +1 -0
- package/lib-esm/signals/simulation/splitSpinSystem.js +11 -13
- package/lib-esm/signals/simulation/splitSpinSystem.js.map +1 -1
- package/lib-esm/utilities/getFrequency.js +1 -1
- package/lib-esm/utilities/getFrequency.js.map +1 -1
- package/lib-esm/utilities/rangeFromSignal.js +7 -7
- package/lib-esm/utilities/rangeFromSignal.js.map +1 -1
- package/lib-esm/utilities/resurrectRange.js +4 -7
- package/lib-esm/utilities/resurrectRange.js.map +1 -1
- package/lib-esm/xyz/util/formatZone.js +34 -0
- package/lib-esm/xyz/util/formatZone.js.map +1 -0
- package/lib-esm/xyz/xyzAutoZonesPicking.js +1 -33
- package/lib-esm/xyz/xyzAutoZonesPicking.js.map +1 -1
- package/lib-esm/xyz/xyzJResAnalyzer.js +9 -8
- package/lib-esm/xyz/xyzJResAnalyzer.js.map +1 -1
- package/package.json +16 -14
- package/src/apodization/apodization.ts +34 -0
- package/src/apodization/applyWindow.ts +51 -0
- package/src/apodization/compose.ts +47 -0
- package/src/apodization/getFunction.ts +15 -0
- package/src/apodization/shapes/WindowFunctions.ts +14 -0
- package/src/apodization/shapes/exponential.ts +16 -0
- package/src/apodization/shapes/lorentzToGauss.ts +41 -0
- package/src/apodization/utils/getData.ts +15 -0
- package/src/assignment/utils/buildAssignments.ts +4 -4
- package/src/assignment/utils/exploreTreeRec.ts +1 -1
- package/src/assignment/utils/getAssignment/buildAssignments.ts +3 -3
- package/src/assignment/utils/getAssignment/checkIDs.ts +1 -1
- package/src/databases/DatabaseNMREntry.ts +3 -0
- package/src/index.ts +7 -1
- package/src/peaks/NMRPeak1D.ts +0 -1
- package/src/peaks/peaksToRanges.ts +2 -2
- package/src/peaks/solventSuppression.ts +214 -0
- package/src/peaks/util/jAnalyzer.ts +27 -31
- package/src/peaks/util/peakOptimizer.ts +11 -15
- package/src/prediction/predictAllSpectra.ts +6 -8
- package/src/prediction/predictCarbon.ts +1 -1
- package/src/prediction/utils/queryByHOSE.ts +1 -1
- package/src/ranges/markSolventSignal.ts +121 -0
- package/src/ranges/rangesToACS.ts +9 -10
- package/src/ranges/rangesToXY.ts +33 -4
- package/src/signals/addDummySignals.ts +77 -0
- package/src/signals/hackSignalsToXY.ts +2 -72
- package/src/signals/simulation/getPauliMatrix.ts +1 -1
- package/src/signals/simulation/simulate1D.ts +14 -319
- package/src/signals/simulation/simulateXYPeaks.ts +332 -0
- package/src/signals/simulation/splitSpinSystem.ts +10 -12
- package/src/utilities/getFrequency.ts +1 -1
- package/src/utilities/rangeFromSignal.ts +19 -11
- package/src/utilities/resurrectRange.ts +4 -7
- package/src/xyz/util/formatZone.ts +36 -0
- package/src/xyz/xyzAutoZonesPicking.ts +1 -35
- package/src/xyz/xyzJResAnalyzer.ts +14 -7
- package/lib/constants/gyromagneticRatio.d.ts +0 -6
- package/lib/constants/gyromagneticRatio.js +0 -26
- package/lib/constants/gyromagneticRatio.js.map +0 -1
- package/lib-esm/constants/gyromagneticRatio.js +0 -23
- package/lib-esm/constants/gyromagneticRatio.js.map +0 -1
- package/src/constants/gyromagneticRatio.ts +0 -49
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import { SparseMatrix } from 'ml-sparse-matrix';
|
|
4
|
-
import { SpectrumGenerator } from 'spectrum-generator';
|
|
5
|
-
import getPauliMatrix from './getPauliMatrix';
|
|
6
|
-
const smallValue = 1e-2;
|
|
1
|
+
import { generateSpectrum } from 'spectrum-generator';
|
|
2
|
+
import { simulateXYPeaks } from './simulateXYPeaks';
|
|
7
3
|
/**
|
|
8
4
|
* This function simulates a one dimensional nmr spectrum. This function returns an array containing the relative intensities of the spectrum in the specified simulation window (from-to).
|
|
9
5
|
*/
|
|
@@ -12,241 +8,21 @@ export default function simulate1D(
|
|
|
12
8
|
* The SpinSystem object to be simulated
|
|
13
9
|
*/
|
|
14
10
|
spinSystem, options = {}) {
|
|
15
|
-
let { lineWidth = 1,
|
|
11
|
+
let { lineWidth = 1, frequency: frequencyMHz = 400, from = 0, to = 10, nbPoints = 1024, shape = {
|
|
16
12
|
kind: 'gaussian',
|
|
17
13
|
}, } = options;
|
|
18
14
|
let peakWidth = lineWidth / frequencyMHz;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
15
|
+
const xyPeaks = simulateXYPeaks(spinSystem, options);
|
|
16
|
+
return generateSpectrum(xyPeaks, {
|
|
17
|
+
generator: {
|
|
18
|
+
from,
|
|
19
|
+
to,
|
|
20
|
+
nbPoints,
|
|
21
|
+
},
|
|
22
|
+
peakOptions: {
|
|
23
|
+
shape,
|
|
24
|
+
width: peakWidth,
|
|
25
|
+
},
|
|
25
26
|
});
|
|
26
|
-
const chemicalShifts = spinSystem.chemicalShifts.slice();
|
|
27
|
-
for (let i = 0; i < chemicalShifts.length; i++) {
|
|
28
|
-
chemicalShifts[i] = chemicalShifts[i] * frequencyMHz;
|
|
29
|
-
}
|
|
30
|
-
const multiplicity = spinSystem.multiplicity;
|
|
31
|
-
for (const cluster of spinSystem.clusters) {
|
|
32
|
-
let clusterFake = cluster.map((cluster) => cluster < 0 ? -cluster - 1 : cluster);
|
|
33
|
-
let weight = 1;
|
|
34
|
-
let sumI = 0;
|
|
35
|
-
let frequencies = [];
|
|
36
|
-
let intensities = [];
|
|
37
|
-
if (cluster.length > maxClusterSize) {
|
|
38
|
-
// This is a single spin, but the cluster exceeds the maxClusterSize criteria
|
|
39
|
-
// we use the simple multiplicity algorithm
|
|
40
|
-
// Add the central peak. It will be split with every single J coupling.
|
|
41
|
-
let index = 0;
|
|
42
|
-
while (cluster[index++] < 0)
|
|
43
|
-
;
|
|
44
|
-
index = cluster[index - 1];
|
|
45
|
-
frequencies.push(-chemicalShifts[index]);
|
|
46
|
-
for (let i = 0; i < cluster.length; i++) {
|
|
47
|
-
if (cluster[i] < 0) {
|
|
48
|
-
let jc = spinSystem.couplingConstants.get(index, clusterFake[i]) / 2;
|
|
49
|
-
let currentSize = frequencies.length;
|
|
50
|
-
for (let j = 0; j < currentSize; j++) {
|
|
51
|
-
frequencies.push(frequencies[j] + jc);
|
|
52
|
-
frequencies[j] -= jc;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
frequencies.sort((a, b) => a - b);
|
|
57
|
-
sumI = frequencies.length;
|
|
58
|
-
weight = 1;
|
|
59
|
-
for (let i = 0; i < sumI; i++) {
|
|
60
|
-
intensities.push(1);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
const hamiltonian = getHamiltonian(chemicalShifts, spinSystem.couplingConstants, multiplicity, spinSystem.connectivity, clusterFake);
|
|
65
|
-
const hamSize = hamiltonian.rows;
|
|
66
|
-
// TODO: add support for sparse matrix in matrix types.
|
|
67
|
-
// @ts-expect-error sparse matrix not supported
|
|
68
|
-
const evd = new EVD(hamiltonian);
|
|
69
|
-
const V = evd.eigenvectorMatrix;
|
|
70
|
-
const diagB = evd.realEigenvalues;
|
|
71
|
-
const assignmentMatrix = new SparseMatrix(hamSize, hamSize);
|
|
72
|
-
const multLen = cluster.length;
|
|
73
|
-
weight = 0;
|
|
74
|
-
for (let n = 0; n < multLen; n++) {
|
|
75
|
-
const L = getPauliMatrix(multiplicity[clusterFake[n]]);
|
|
76
|
-
let temp = 1;
|
|
77
|
-
for (let j = 0; j < n; j++) {
|
|
78
|
-
temp *= multiplicity[clusterFake[j]];
|
|
79
|
-
}
|
|
80
|
-
const A = SparseMatrix.eye(temp);
|
|
81
|
-
temp = 1;
|
|
82
|
-
for (let j = n + 1; j < multLen; j++) {
|
|
83
|
-
temp *= multiplicity[clusterFake[j]];
|
|
84
|
-
}
|
|
85
|
-
const B = SparseMatrix.eye(temp);
|
|
86
|
-
const tempMat = A.kroneckerProduct(L.m).kroneckerProduct(B);
|
|
87
|
-
if (cluster[n] >= 0) {
|
|
88
|
-
assignmentMatrix.add(tempMat.mul(cluster[n] + 1));
|
|
89
|
-
weight++;
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
assignmentMatrix.add(tempMat.mul(cluster[n]));
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
let rhoip = Matrix.zeros(hamSize, hamSize);
|
|
96
|
-
assignmentMatrix.forEachNonZero((i, j, v) => {
|
|
97
|
-
if (v > 0) {
|
|
98
|
-
for (let k = 0; k < V.columns; k++) {
|
|
99
|
-
let element = V.get(j, k);
|
|
100
|
-
if (element !== 0) {
|
|
101
|
-
rhoip.set(i, k, rhoip.get(i, k) + element);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return v;
|
|
106
|
-
});
|
|
107
|
-
let rhoip2 = rhoip.clone();
|
|
108
|
-
assignmentMatrix.forEachNonZero((i, j, v) => {
|
|
109
|
-
if (v < 0) {
|
|
110
|
-
for (let k = 0; k < V.columns; k++) {
|
|
111
|
-
let element = V.get(j, k);
|
|
112
|
-
if (element !== 0) {
|
|
113
|
-
rhoip2.set(i, k, rhoip2.get(i, k) + element);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return v;
|
|
118
|
-
});
|
|
119
|
-
const tV = V.transpose();
|
|
120
|
-
rhoip = tV.mmul(rhoip);
|
|
121
|
-
const sparseRhoip = new SparseMatrix(rhoip.to2DArray(), {
|
|
122
|
-
threshold: smallValue,
|
|
123
|
-
});
|
|
124
|
-
triuTimesAbs(sparseRhoip, smallValue);
|
|
125
|
-
rhoip2 = tV.mmul(rhoip2);
|
|
126
|
-
const sparseRhoip2 = new SparseMatrix(rhoip2.to2DArray(), {
|
|
127
|
-
threshold: smallValue,
|
|
128
|
-
});
|
|
129
|
-
sparseRhoip2.forEachNonZero((i, j, v) => {
|
|
130
|
-
return v;
|
|
131
|
-
});
|
|
132
|
-
triuTimesAbs(sparseRhoip2, smallValue);
|
|
133
|
-
sparseRhoip2.forEachNonZero((i, j, v) => {
|
|
134
|
-
let val = rhoip.get(i, j);
|
|
135
|
-
val = Math.min(Math.abs(val), Math.abs(v));
|
|
136
|
-
val *= val;
|
|
137
|
-
sumI += val;
|
|
138
|
-
let valFreq = diagB[i] - diagB[j];
|
|
139
|
-
let insertIn = binarySearch(frequencies, valFreq, (a, b) => a - b);
|
|
140
|
-
if (insertIn < 0) {
|
|
141
|
-
frequencies.splice(-1 - insertIn, 0, valFreq);
|
|
142
|
-
intensities.splice(-1 - insertIn, 0, val);
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
intensities[insertIn] += val;
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
const numFreq = frequencies.length;
|
|
150
|
-
if (numFreq > 0) {
|
|
151
|
-
weight /= sumI;
|
|
152
|
-
const diff = lineWidth / 64;
|
|
153
|
-
let valFreq = frequencies[0];
|
|
154
|
-
let inte = intensities[0];
|
|
155
|
-
let count = 1;
|
|
156
|
-
for (let i = 1; i < numFreq; i++) {
|
|
157
|
-
if (Math.abs(frequencies[i] - valFreq / count) < diff) {
|
|
158
|
-
inte += intensities[i];
|
|
159
|
-
valFreq += frequencies[i];
|
|
160
|
-
count++;
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
spectrumGenerator.addPeak({
|
|
164
|
-
x: -valFreq / count / frequencyMHz,
|
|
165
|
-
y: inte * weight,
|
|
166
|
-
});
|
|
167
|
-
valFreq = frequencies[i];
|
|
168
|
-
inte = intensities[i];
|
|
169
|
-
count = 1;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
spectrumGenerator.addPeak({
|
|
173
|
-
x: -valFreq / count / frequencyMHz,
|
|
174
|
-
y: inte * weight,
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
return spectrumGenerator.getSpectrum();
|
|
179
|
-
}
|
|
180
|
-
function triuTimesAbs(A, val) {
|
|
181
|
-
A.forEachNonZero((i, j, v) => {
|
|
182
|
-
if (i > j)
|
|
183
|
-
return 0;
|
|
184
|
-
if (Math.abs(v) <= val)
|
|
185
|
-
return 0;
|
|
186
|
-
return v;
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* Create a hamiltonian matrix for the given spinsystem
|
|
191
|
-
* @param {Array} chemicalShifts - An array containing the chemical shift in Hz
|
|
192
|
-
* @param {Array} couplingConstants - An array containing the coupling constants in Hz
|
|
193
|
-
* @param {Array} multiplicity - An array specifiying the multiplicities of each scalar coupling
|
|
194
|
-
* @param {Array} conMatrix - A one step connectivity matrix for the given spin system
|
|
195
|
-
* @param {Array} cluster - An binary array specifiying the spins to be considered for this hamiltonial
|
|
196
|
-
* @return {object}
|
|
197
|
-
*/
|
|
198
|
-
function getHamiltonian(chemicalShifts, couplingConstants, multiplicity, conMatrix, cluster) {
|
|
199
|
-
let hamSize = 1;
|
|
200
|
-
for (const element of cluster) {
|
|
201
|
-
hamSize *= multiplicity[element];
|
|
202
|
-
}
|
|
203
|
-
const clusterHam = new SparseMatrix(hamSize, hamSize);
|
|
204
|
-
for (let pos = 0; pos < cluster.length; pos++) {
|
|
205
|
-
let n = cluster[pos];
|
|
206
|
-
const L = getPauliMatrix(multiplicity[n]);
|
|
207
|
-
let A1, B1;
|
|
208
|
-
let temp = 1;
|
|
209
|
-
for (let i = 0; i < pos; i++) {
|
|
210
|
-
temp *= multiplicity[cluster[i]];
|
|
211
|
-
}
|
|
212
|
-
A1 = SparseMatrix.eye(temp);
|
|
213
|
-
temp = 1;
|
|
214
|
-
for (let i = pos + 1; i < cluster.length; i++) {
|
|
215
|
-
temp *= multiplicity[cluster[i]];
|
|
216
|
-
}
|
|
217
|
-
B1 = SparseMatrix.eye(temp);
|
|
218
|
-
const alpha = chemicalShifts[n];
|
|
219
|
-
const kronProd = A1.kroneckerProduct(L.z).kroneckerProduct(B1);
|
|
220
|
-
clusterHam.add(kronProd.mul(alpha));
|
|
221
|
-
for (let pos2 = 0; pos2 < cluster.length; pos2++) {
|
|
222
|
-
const k = cluster[pos2];
|
|
223
|
-
if (conMatrix.get(n, k) === 1) {
|
|
224
|
-
const S = getPauliMatrix(multiplicity[k]);
|
|
225
|
-
let A2, B2;
|
|
226
|
-
let temp = 1;
|
|
227
|
-
for (let i = 0; i < pos2; i++) {
|
|
228
|
-
temp *= multiplicity[cluster[i]];
|
|
229
|
-
}
|
|
230
|
-
A2 = SparseMatrix.eye(temp);
|
|
231
|
-
temp = 1;
|
|
232
|
-
for (let i = pos2 + 1; i < cluster.length; i++) {
|
|
233
|
-
temp *= multiplicity[cluster[i]];
|
|
234
|
-
}
|
|
235
|
-
B2 = SparseMatrix.eye(temp);
|
|
236
|
-
const kron1 = A1.kroneckerProduct(L.x)
|
|
237
|
-
.kroneckerProduct(B1)
|
|
238
|
-
.mmul(A2.kroneckerProduct(S.x).kroneckerProduct(B2));
|
|
239
|
-
kron1.add(A1.kroneckerProduct(L.y)
|
|
240
|
-
.kroneckerProduct(B1)
|
|
241
|
-
.mul(-1)
|
|
242
|
-
.mmul(A2.kroneckerProduct(S.y).kroneckerProduct(B2)));
|
|
243
|
-
kron1.add(A1.kroneckerProduct(L.z)
|
|
244
|
-
.kroneckerProduct(B1)
|
|
245
|
-
.mmul(A2.kroneckerProduct(S.z).kroneckerProduct(B2)));
|
|
246
|
-
clusterHam.add(kron1.mul(couplingConstants.get(n, k) / 2));
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
return clusterHam;
|
|
251
27
|
}
|
|
252
28
|
//# sourceMappingURL=simulate1D.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simulate1D.js","sourceRoot":"","sources":["../../../src/signals/simulation/simulate1D.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"simulate1D.js","sourceRoot":"","sources":["../../../src/signals/simulation/simulate1D.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAKtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;GAEG;AAEH,MAAM,CAAC,OAAO,UAAU,UAAU;AAChC;;GAEG;AACH,UAAsB,EACtB,UAA6B,EAAE;IAE/B,IAAI,EACF,SAAS,GAAG,CAAC,EACb,SAAS,EAAE,YAAY,GAAG,GAAG,EAC7B,IAAI,GAAG,CAAC,EACR,EAAE,GAAG,EAAE,EACP,QAAQ,GAAG,IAAI,EACf,KAAK,GAAG;QACN,IAAI,EAAE,UAAU;KACjB,GACF,GAAG,OAAO,CAAC;IAEZ,IAAI,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;IAEzC,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAErD,OAAO,gBAAgB,CAAC,OAAO,EAAE;QAC/B,SAAS,EAAE;YACT,IAAI;YACJ,EAAE;YACF,QAAQ;SACT;QACD,WAAW,EAAE;YACX,KAAK;YACL,KAAK,EAAE,SAAS;SACjB;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import binarySearch from 'binary-search';
|
|
2
|
+
import { Matrix, EVD } from 'ml-matrix';
|
|
3
|
+
import { SparseMatrix } from 'ml-sparse-matrix';
|
|
4
|
+
import getPauliMatrix from './getPauliMatrix';
|
|
5
|
+
const smallValue = 1e-2;
|
|
6
|
+
export function simulateXYPeaks(
|
|
7
|
+
/**
|
|
8
|
+
* The SpinSystem object to be simulated
|
|
9
|
+
*/
|
|
10
|
+
spinSystem, options = {}) {
|
|
11
|
+
let { lineWidth = 1, maxClusterSize = 8, frequency: frequencyMHz = 400, } = options;
|
|
12
|
+
const chemicalShifts = spinSystem.chemicalShifts.slice();
|
|
13
|
+
for (let i = 0; i < chemicalShifts.length; i++) {
|
|
14
|
+
chemicalShifts[i] = chemicalShifts[i] * frequencyMHz;
|
|
15
|
+
}
|
|
16
|
+
const multiplicity = spinSystem.multiplicity;
|
|
17
|
+
const xyPeaks = [];
|
|
18
|
+
for (const cluster of spinSystem.clusters) {
|
|
19
|
+
let clusterFake = cluster.map((cluster) => cluster < 0 ? -cluster - 1 : cluster);
|
|
20
|
+
let weight = 1;
|
|
21
|
+
let sumI = 0;
|
|
22
|
+
let frequencies = [];
|
|
23
|
+
let intensities = [];
|
|
24
|
+
if (cluster.length > maxClusterSize) {
|
|
25
|
+
// This is a single spin, but the cluster exceeds the maxClusterSize criteria
|
|
26
|
+
// we use the simple multiplicity algorithm
|
|
27
|
+
// Add the central peak. It will be split with every single J coupling.
|
|
28
|
+
let index = 0;
|
|
29
|
+
while (cluster[index++] < 0)
|
|
30
|
+
;
|
|
31
|
+
index = cluster[index - 1];
|
|
32
|
+
frequencies.push(-chemicalShifts[index]);
|
|
33
|
+
for (let i = 0; i < cluster.length; i++) {
|
|
34
|
+
if (cluster[i] < 0) {
|
|
35
|
+
let jc = spinSystem.couplingConstants.get(index, clusterFake[i]) / 2;
|
|
36
|
+
let currentSize = frequencies.length;
|
|
37
|
+
for (let j = 0; j < currentSize; j++) {
|
|
38
|
+
frequencies.push(frequencies[j] + jc);
|
|
39
|
+
frequencies[j] -= jc;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
frequencies.sort((a, b) => a - b);
|
|
44
|
+
sumI = frequencies.length;
|
|
45
|
+
weight = 1;
|
|
46
|
+
for (let i = 0; i < sumI; i++) {
|
|
47
|
+
intensities.push(1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const hamiltonian = getHamiltonian(chemicalShifts, spinSystem.couplingConstants, multiplicity, spinSystem.connectivity, clusterFake);
|
|
52
|
+
const hamSize = hamiltonian.rows;
|
|
53
|
+
// TODO: add support for sparse matrix in matrix types.
|
|
54
|
+
// @ts-expect-error sparse matrix not supported
|
|
55
|
+
const evd = new EVD(hamiltonian);
|
|
56
|
+
const V = evd.eigenvectorMatrix;
|
|
57
|
+
const diagB = evd.realEigenvalues;
|
|
58
|
+
const assignmentMatrix = new SparseMatrix(hamSize, hamSize);
|
|
59
|
+
const multLen = cluster.length;
|
|
60
|
+
weight = 0;
|
|
61
|
+
for (let n = 0; n < multLen; n++) {
|
|
62
|
+
const L = getPauliMatrix(multiplicity[clusterFake[n]]);
|
|
63
|
+
let temp = 1;
|
|
64
|
+
for (let j = 0; j < n; j++) {
|
|
65
|
+
temp *= multiplicity[clusterFake[j]];
|
|
66
|
+
}
|
|
67
|
+
const A = SparseMatrix.eye(temp);
|
|
68
|
+
temp = 1;
|
|
69
|
+
for (let j = n + 1; j < multLen; j++) {
|
|
70
|
+
temp *= multiplicity[clusterFake[j]];
|
|
71
|
+
}
|
|
72
|
+
const B = SparseMatrix.eye(temp);
|
|
73
|
+
const tempMat = A.kroneckerProduct(L.m).kroneckerProduct(B);
|
|
74
|
+
if (cluster[n] >= 0) {
|
|
75
|
+
assignmentMatrix.add(tempMat.mul(cluster[n] + 1));
|
|
76
|
+
weight++;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
assignmentMatrix.add(tempMat.mul(cluster[n]));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
let rhoip = Matrix.zeros(hamSize, hamSize);
|
|
83
|
+
assignmentMatrix.forEachNonZero((i, j, v) => {
|
|
84
|
+
if (v > 0) {
|
|
85
|
+
for (let k = 0; k < V.columns; k++) {
|
|
86
|
+
let element = V.get(j, k);
|
|
87
|
+
if (element !== 0) {
|
|
88
|
+
rhoip.set(i, k, rhoip.get(i, k) + element);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return v;
|
|
93
|
+
});
|
|
94
|
+
let rhoip2 = rhoip.clone();
|
|
95
|
+
assignmentMatrix.forEachNonZero((i, j, v) => {
|
|
96
|
+
if (v < 0) {
|
|
97
|
+
for (let k = 0; k < V.columns; k++) {
|
|
98
|
+
let element = V.get(j, k);
|
|
99
|
+
if (element !== 0) {
|
|
100
|
+
rhoip2.set(i, k, rhoip2.get(i, k) + element);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return v;
|
|
105
|
+
});
|
|
106
|
+
const tV = V.transpose();
|
|
107
|
+
rhoip = tV.mmul(rhoip);
|
|
108
|
+
const sparseRhoip = new SparseMatrix(rhoip.to2DArray(), {
|
|
109
|
+
threshold: smallValue,
|
|
110
|
+
});
|
|
111
|
+
triuTimesAbs(sparseRhoip, smallValue);
|
|
112
|
+
rhoip2 = tV.mmul(rhoip2);
|
|
113
|
+
const sparseRhoip2 = new SparseMatrix(rhoip2.to2DArray(), {
|
|
114
|
+
threshold: smallValue,
|
|
115
|
+
});
|
|
116
|
+
sparseRhoip2.forEachNonZero((i, j, v) => {
|
|
117
|
+
return v;
|
|
118
|
+
});
|
|
119
|
+
triuTimesAbs(sparseRhoip2, smallValue);
|
|
120
|
+
sparseRhoip2.forEachNonZero((i, j, v) => {
|
|
121
|
+
let val = rhoip.get(i, j);
|
|
122
|
+
val = Math.min(Math.abs(val), Math.abs(v));
|
|
123
|
+
val *= val;
|
|
124
|
+
sumI += val;
|
|
125
|
+
let valFreq = diagB[i] - diagB[j];
|
|
126
|
+
let insertIn = binarySearch(frequencies, valFreq, (a, b) => a - b);
|
|
127
|
+
if (insertIn < 0) {
|
|
128
|
+
frequencies.splice(-1 - insertIn, 0, valFreq);
|
|
129
|
+
intensities.splice(-1 - insertIn, 0, val);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
intensities[insertIn] += val;
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
const numFreq = frequencies.length;
|
|
137
|
+
if (numFreq > 0) {
|
|
138
|
+
weight /= sumI;
|
|
139
|
+
const diff = lineWidth / 64;
|
|
140
|
+
let valFreq = frequencies[0];
|
|
141
|
+
let inte = intensities[0];
|
|
142
|
+
let count = 1;
|
|
143
|
+
for (let i = 1; i < numFreq; i++) {
|
|
144
|
+
if (Math.abs(frequencies[i] - valFreq / count) < diff) {
|
|
145
|
+
inte += intensities[i];
|
|
146
|
+
valFreq += frequencies[i];
|
|
147
|
+
count++;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
xyPeaks.push({
|
|
151
|
+
x: -valFreq / count / frequencyMHz,
|
|
152
|
+
y: inte * weight,
|
|
153
|
+
});
|
|
154
|
+
valFreq = frequencies[i];
|
|
155
|
+
inte = intensities[i];
|
|
156
|
+
count = 1;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
xyPeaks.push({
|
|
160
|
+
x: -valFreq / count / frequencyMHz,
|
|
161
|
+
y: inte * weight,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return xyPeaks;
|
|
166
|
+
}
|
|
167
|
+
function triuTimesAbs(A, val) {
|
|
168
|
+
A.forEachNonZero((i, j, v) => {
|
|
169
|
+
if (i > j)
|
|
170
|
+
return 0;
|
|
171
|
+
if (Math.abs(v) <= val)
|
|
172
|
+
return 0;
|
|
173
|
+
return v;
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Create a hamiltonian matrix for the given spinsystem
|
|
178
|
+
* @param {Array} chemicalShifts - An array containing the chemical shift in Hz
|
|
179
|
+
* @param {Array} couplingConstants - An array containing the coupling constants in Hz
|
|
180
|
+
* @param {Array} multiplicity - An array specifiying the multiplicities of each scalar coupling
|
|
181
|
+
* @param {Array} conMatrix - A one step connectivity matrix for the given spin system
|
|
182
|
+
* @param {Array} cluster - An binary array specifiying the spins to be considered for this hamiltonial
|
|
183
|
+
* @return {object}
|
|
184
|
+
*/
|
|
185
|
+
function getHamiltonian(chemicalShifts, couplingConstants, multiplicity, conMatrix, cluster) {
|
|
186
|
+
let hamSize = 1;
|
|
187
|
+
for (const element of cluster) {
|
|
188
|
+
hamSize *= multiplicity[element];
|
|
189
|
+
}
|
|
190
|
+
const clusterHam = new SparseMatrix(hamSize, hamSize);
|
|
191
|
+
for (let pos = 0; pos < cluster.length; pos++) {
|
|
192
|
+
let n = cluster[pos];
|
|
193
|
+
const L = getPauliMatrix(multiplicity[n]);
|
|
194
|
+
let A1, B1;
|
|
195
|
+
let temp = 1;
|
|
196
|
+
for (let i = 0; i < pos; i++) {
|
|
197
|
+
temp *= multiplicity[cluster[i]];
|
|
198
|
+
}
|
|
199
|
+
A1 = SparseMatrix.eye(temp);
|
|
200
|
+
temp = 1;
|
|
201
|
+
for (let i = pos + 1; i < cluster.length; i++) {
|
|
202
|
+
temp *= multiplicity[cluster[i]];
|
|
203
|
+
}
|
|
204
|
+
B1 = SparseMatrix.eye(temp);
|
|
205
|
+
const alpha = chemicalShifts[n];
|
|
206
|
+
const kronProd = A1.kroneckerProduct(L.z).kroneckerProduct(B1);
|
|
207
|
+
clusterHam.add(kronProd.mul(alpha));
|
|
208
|
+
for (let pos2 = 0; pos2 < cluster.length; pos2++) {
|
|
209
|
+
const k = cluster[pos2];
|
|
210
|
+
if (conMatrix.get(n, k) === 1) {
|
|
211
|
+
const S = getPauliMatrix(multiplicity[k]);
|
|
212
|
+
let A2, B2;
|
|
213
|
+
let temp = 1;
|
|
214
|
+
for (let i = 0; i < pos2; i++) {
|
|
215
|
+
temp *= multiplicity[cluster[i]];
|
|
216
|
+
}
|
|
217
|
+
A2 = SparseMatrix.eye(temp);
|
|
218
|
+
temp = 1;
|
|
219
|
+
for (let i = pos2 + 1; i < cluster.length; i++) {
|
|
220
|
+
temp *= multiplicity[cluster[i]];
|
|
221
|
+
}
|
|
222
|
+
B2 = SparseMatrix.eye(temp);
|
|
223
|
+
const kron1 = A1.kroneckerProduct(L.x)
|
|
224
|
+
.kroneckerProduct(B1)
|
|
225
|
+
.mmul(A2.kroneckerProduct(S.x).kroneckerProduct(B2));
|
|
226
|
+
kron1.add(A1.kroneckerProduct(L.y)
|
|
227
|
+
.kroneckerProduct(B1)
|
|
228
|
+
.mul(-1)
|
|
229
|
+
.mmul(A2.kroneckerProduct(S.y).kroneckerProduct(B2)));
|
|
230
|
+
kron1.add(A1.kroneckerProduct(L.z)
|
|
231
|
+
.kroneckerProduct(B1)
|
|
232
|
+
.mmul(A2.kroneckerProduct(S.z).kroneckerProduct(B2)));
|
|
233
|
+
clusterHam.add(kron1.mul(couplingConstants.get(n, k) / 2));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return clusterHam;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=simulateXYPeaks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulateXYPeaks.js","sourceRoot":"","sources":["../../../src/signals/simulation/simulateXYPeaks.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIhD,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAE9C,MAAM,UAAU,GAAG,IAAI,CAAC;AAwCxB,MAAM,UAAU,eAAe;AAC7B;;GAEG;AACH,UAAsB,EACtB,UAA6B,EAAE;IAE/B,IAAI,EACF,SAAS,GAAG,CAAC,EACb,cAAc,GAAG,CAAC,EAClB,SAAS,EAAE,YAAY,GAAG,GAAG,GAC9B,GAAG,OAAO,CAAC;IAEZ,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC9C,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;KACtD;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,CAAC;IAE7C,MAAM,OAAO,GAAG,EAAE,CAAC;IACnB,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE;QACzC,IAAI,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACxC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CACrC,CAAC;QAEF,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,WAAW,GAAa,EAAE,CAAC;QAC/B,IAAI,WAAW,GAAa,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,GAAG,cAAc,EAAE;YACnC,6EAA6E;YAC7E,2CAA2C;YAC3C,uEAAuE;YACvE,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC;gBAAC,CAAC;YAC7B,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC3B,WAAW,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;YACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACvC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;oBAClB,IAAI,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACrE,IAAI,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC;oBACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;wBACpC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;wBACtC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBACtB;iBACF;aACF;YAED,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAClC,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC;YAC1B,MAAM,GAAG,CAAC,CAAC;YAEX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;gBAC7B,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACrB;SACF;aAAM;YACL,MAAM,WAAW,GAAG,cAAc,CAChC,cAAc,EACd,UAAU,CAAC,iBAAiB,EAC5B,YAAY,EACZ,UAAU,CAAC,YAAY,EACvB,WAAW,CACZ,CAAC;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC;YACjC,uDAAuD;YACvD,+CAA+C;YAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,GAAG,CAAC,iBAAiB,CAAC;YAChC,MAAM,KAAK,GAAG,GAAG,CAAC,eAAe,CAAC;YAClC,MAAM,gBAAgB,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;YAC/B,MAAM,GAAG,CAAC,CAAC;YACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;gBAChC,MAAM,CAAC,GAAG,cAAc,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEvD,IAAI,IAAI,GAAG,CAAC,CAAC;gBACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC1B,IAAI,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;iBACtC;gBACD,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAEjC,IAAI,GAAG,CAAC,CAAC;gBACT,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;oBACpC,IAAI,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;iBACtC;gBACD,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,OAAO,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;gBAC5D,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;oBACnB,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAClD,MAAM,EAAE,CAAC;iBACV;qBAAM;oBACL,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC/C;aACF;YAED,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC3C,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1C,IAAI,CAAC,GAAG,CAAC,EAAE;oBACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;wBAClC,IAAI,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;wBAC1B,IAAI,OAAO,KAAK,CAAC,EAAE;4BACjB,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;yBAC5C;qBACF;iBACF;gBACD,OAAO,CAAC,CAAC;YACX,CAAC,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC3B,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,EAAE;gBAClE,IAAI,CAAC,GAAG,CAAC,EAAE;oBACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;wBAClC,IAAI,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;wBAC1B,IAAI,OAAO,KAAK,CAAC,EAAE;4BACjB,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;yBAC9C;qBACF;iBACF;gBACD,OAAO,CAAC,CAAC;YACX,CAAC,CAAC,CAAC;YACH,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;YAEzB,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,MAAM,WAAW,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE;gBACtD,SAAS,EAAE,UAAU;aACtB,CAAC,CAAC;YACH,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YAEtC,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzB,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE;gBACxD,SAAS,EAAE,UAAU;aACtB,CAAC,CAAC;YACH,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;gBACtC,OAAO,CAAC,CAAC;YACX,CAAC,CAAC,CAAC;YACH,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YACvC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;gBACtC,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1B,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3C,GAAG,IAAI,GAAG,CAAC;gBAEX,IAAI,IAAI,GAAG,CAAC;gBACZ,IAAI,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI,QAAQ,GAAG,YAAY,CACzB,WAAW,EACX,OAAO,EACP,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAChC,CAAC;gBACF,IAAI,QAAQ,GAAG,CAAC,EAAE;oBAChB,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC9C,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;iBAC3C;qBAAM;oBACL,WAAW,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;iBAC9B;YACH,CAAC,CAAC,CAAC;SACJ;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;QAEnC,IAAI,OAAO,GAAG,CAAC,EAAE;YACf,MAAM,IAAI,IAAI,CAAC;YACf,MAAM,IAAI,GAAG,SAAS,GAAG,EAAE,CAAC;YAC5B,IAAI,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;gBAChC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC,GAAG,IAAI,EAAE;oBACrD,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;oBACvB,OAAO,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;oBAC1B,KAAK,EAAE,CAAC;iBACT;qBAAM;oBACL,OAAO,CAAC,IAAI,CAAC;wBACX,CAAC,EAAE,CAAC,OAAO,GAAG,KAAK,GAAG,YAAY;wBAClC,CAAC,EAAE,IAAI,GAAG,MAAM;qBACjB,CAAC,CAAC;oBACH,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;oBACzB,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;oBACtB,KAAK,GAAG,CAAC,CAAC;iBACX;aACF;YAED,OAAO,CAAC,IAAI,CAAC;gBACX,CAAC,EAAE,CAAC,OAAO,GAAG,KAAK,GAAG,YAAY;gBAClC,CAAC,EAAE,IAAI,GAAG,MAAM;aACjB,CAAC,CAAC;SACJ;KACF;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,CAAe,EAAE,GAAW;IAChD,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;QACpB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG;YAAE,OAAO,CAAC,CAAC;QACjC,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AACD;;;;;;;;GAQG;AACH,SAAS,cAAc,CACrB,cAAwB,EACxB,iBAAkC,EAClC,YAAsB,EACtB,SAA0B,EAC1B,OAAiB;IAEjB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE;QAC7B,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;KAClC;IAED,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEtD,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QAC7C,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAErB,MAAM,CAAC,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1C,IAAI,EAAE,EAAE,EAAE,CAAC;QACX,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YAC5B,IAAI,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;SAClC;QACD,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE5B,IAAI,GAAG,CAAC,CAAC;QACT,KAAK,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC7C,IAAI,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;SAClC;QACD,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE5B,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAC/D,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACpC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;YAChD,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE;gBAC7B,MAAM,CAAC,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE1C,IAAI,EAAE,EAAE,EAAE,CAAC;gBACX,IAAI,IAAI,GAAG,CAAC,CAAC;gBACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;oBAC7B,IAAI,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;iBAClC;gBACD,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAE5B,IAAI,GAAG,CAAC,CAAC;gBACT,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAC9C,IAAI,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;iBAClC;gBACD,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAE5B,MAAM,KAAK,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;qBACnC,gBAAgB,CAAC,EAAE,CAAC;qBACpB,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvD,KAAK,CAAC,GAAG,CACP,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;qBACrB,gBAAgB,CAAC,EAAE,CAAC;qBACpB,GAAG,CAAC,CAAC,CAAC,CAAC;qBACP,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CACvD,CAAC;gBACF,KAAK,CAAC,GAAG,CACP,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;qBACrB,gBAAgB,CAAC,EAAE,CAAC;qBACpB,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CACvD,CAAC;gBAEF,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aAC5D;SACF;KACF;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -52,20 +52,18 @@ function splitCluster(cluster, clusterList, options) {
|
|
|
52
52
|
if (count <= maxClusterSize) {
|
|
53
53
|
clusterList.push(members);
|
|
54
54
|
}
|
|
55
|
+
else if (child.index < 0) {
|
|
56
|
+
splitCluster(child, clusterList, {
|
|
57
|
+
maxClusterSize,
|
|
58
|
+
force: true,
|
|
59
|
+
nSpins,
|
|
60
|
+
connectivity,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
55
63
|
else {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
force: true,
|
|
60
|
-
nSpins,
|
|
61
|
-
connectivity,
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
// We have to threat this spin alone and use the resurrection algorithm instead of the simulation
|
|
66
|
-
members[child.index] = 2;
|
|
67
|
-
clusterList.push(members);
|
|
68
|
-
}
|
|
64
|
+
// We have to threat this spin alone and use the resurrection algorithm instead of the simulation
|
|
65
|
+
members[child.index] = 2;
|
|
66
|
+
clusterList.push(members);
|
|
69
67
|
}
|
|
70
68
|
}
|
|
71
69
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"splitSpinSystem.js","sourceRoot":"","sources":["../../../src/signals/simulation/splitSpinSystem.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"splitSpinSystem.js","sourceRoot":"","sources":["../../../src/signals/simulation/splitSpinSystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFrequency.js","sourceRoot":"","sources":["../../src/utilities/getFrequency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAU,MAAM,
|
|
1
|
+
{"version":3,"file":"getFrequency.js","sourceRoot":"","sources":["../../src/utilities/getFrequency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAU,MAAM,oBAAoB,CAAC;AAgB/D;;GAEG;AACH,MAAM,UAAU,YAAY;AAC1B;;GAEG;AACH,OAAgB,EAChB,mBAAwC;IAExC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC;IAE/D,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAEpC,OAAO,CACL,CAAC,SAAS,GAAG,iBAAiB,CAAC,OAAiB,CAAC,CAAC;QAClD,iBAAiB,CAAC,UAAoB,CAAC,CACxC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAAG,OAAkB;IAC3C,IAAI,MAAM,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;QACvB,IAAI,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,EAAE;YAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAChB;KACF;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;QACvB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;KAC3D;AACH,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { couplingValues } from '../constants/couplingValues';
|
|
2
|
-
export function rangeFromSignal(signal, options
|
|
2
|
+
export function rangeFromSignal(signal, options) {
|
|
3
3
|
const { nucleus = '1h', frequency = 400 } = options;
|
|
4
4
|
const { tolerance = getTolerance(nucleus) / frequency } = options;
|
|
5
|
-
let halfWidth =
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
let halfWidth = 0;
|
|
6
|
+
for (const js of signal.js || []) {
|
|
7
|
+
const { coupling, multiplicity = 'd' } = js;
|
|
8
|
+
halfWidth += (couplingValues[multiplicity] * coupling) / frequency;
|
|
9
|
+
}
|
|
10
|
+
halfWidth = tolerance + halfWidth / 2;
|
|
11
11
|
return {
|
|
12
12
|
from: signal.delta - halfWidth,
|
|
13
13
|
to: signal.delta + halfWidth,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rangeFromSignal.js","sourceRoot":"","sources":["../../src/utilities/rangeFromSignal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"rangeFromSignal.js","sourceRoot":"","sources":["../../src/utilities/rangeFromSignal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAoB7D,MAAM,UAAU,eAAe,CAC7B,MAAmB,EACnB,OAA+B;IAE/B,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,SAAS,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IACpD,MAAM,EAAE,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,SAAS,EAAE,GAAG,OAAO,CAAC;IAElE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;QAChC,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;QAC5C,SAAS,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC,GAAG,SAAS,CAAC;KACpE;IAED,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;IACtC,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,SAAS;QAC9B,EAAE,EAAE,MAAM,CAAC,KAAK,GAAG,SAAS;KAC7B,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,QAAQ,OAAO,CAAC,iBAAiB,EAAE,EAAE;QACnC,KAAK,IAAI;YACP,OAAO,GAAG,CAAC;QACb,KAAK,KAAK;YACR,OAAO,CAAC,CAAC;QACX;YACE,OAAO,CAAC,CAAC;KACZ;AACH,CAAC"}
|