From 584d84e5ad360bdd7790b51354ea739b0e5bd1c8 Mon Sep 17 00:00:00 2001 From: Paullo9 Date: Sat, 31 Oct 2026 14:42:04 +0100 Subject: [PATCH 1/7] feat: the proposer and the unlisted-line check take the sum/escape peaks as explained With the sum/escape model on, the unlisted-line check proposed on the bare spectrum and named the modelled pile-up and escape peaks as elements. SumEscapeResult.componentCounts (the fitted c S(A) + f E(A)) is now carried by the quantification and handed to ElementProposer.propose(explained:), which adds it to every fit as a fixed offset. nil (the default, and the model off) runs the proposer as before. Planted pools (tools/edx-sim proposer_sim, model on): 100 counts/px no longer names Ar, Ag, Pd; 300 counts/px no longer names Rh, Ar, In, Sn, Pd, Ag, Cd, Ru, Bi, K; a planted Fe escape with the free escape columns off no longer names La, Ce, Cr, Cs. A planted K K-alpha between two sum peaks is still named first. Model off: unchanged. Done: sum/escape peaks are explained counts for the proposer and the check. Next: docs rows for parity.md and open-items.md item 8. Co-Authored-By: Claude Opus 5.5 --- Sources/SpectroEDX/Fit/SumEscapeFit.swift | 14 +- .../SpectroEDX/Proposer/ElementProposer.swift | 22 ++- .../Quant/PooledQuantification.swift | 11 +- .../SpectroEDX/Quant/UnlistedLineCheck.swift | 5 +- .../SumEscapeExplainedTests.swift | 143 ++++++++++++++++++ 5 files changed, 185 insertions(+), 10 deletions(-) create mode 100644 Tests/SpectroEDXTests/SumEscapeExplainedTests.swift diff --git a/Sources/SpectroEDX/Fit/SumEscapeFit.swift b/Sources/SpectroEDX/Fit/SumEscapeFit.swift index c02f6e0..87adc58 100644 --- a/Sources/SpectroEDX/Fit/SumEscapeFit.swift +++ b/Sources/SpectroEDX/Fit/SumEscapeFit.swift @@ -111,6 +111,12 @@ public nonisolated struct SumEscapeResult: Sendable { public var escapeFraction: Double? public var escapeFractionSigma: Double? public var escapePeaks: [EscapeComponent] + /// The fitted sum and escape peaks together, counts per channel of `fit.channels` (c S(A) + f E(A) at the reported areas): what + /// the model explains beyond the line and continuum columns. The element proposer takes it as a fixed part of its model, so a + /// peak this model covers is not proposed as an element. All zeros when the model is off. It is the exact sum term at the + /// reported areas; `fit.model` holds its linearisation at the previous iterate, which differs by c times the squared area step + /// (nothing at convergence; the warnings say when the alternation did not converge). + public var componentCounts: [Double] public var iterations: Int public var converged: Bool /// The parameters of the model as run, one sentence each. @@ -136,7 +142,8 @@ public nonisolated enum EDSSumEscapeFit { if model.isOff { return SumEscapeResult(fit: baseline, baseline: baseline, sumCoefficient: nil, sumCoefficientSigma: nil, sumCoefficientAtBound: false, sumPeaks: [], escapeFraction: nil, escapeFractionSigma: nil, - escapePeaks: [], iterations: 0, converged: true, + escapePeaks: [], componentCounts: [Double](repeating: 0, count: baseline.channels.count), + iterations: 0, converged: true, parameters: ["sum and escape model: off (the default fit)"], validation: validation) } @@ -285,6 +292,9 @@ public nonisolated enum EDSSumEscapeFit { } var escComponents: [EscapeComponent] = [] for gi in 0.. Double? { @@ -331,7 +341,7 @@ public nonisolated enum EDSSumEscapeFit { return SumEscapeResult(fit: fit, baseline: baseline, sumCoefficient: model.sumPeaks ? c : nil, sumCoefficientSigma: cSigma, sumCoefficientAtBound: cAtBound, sumPeaks: sumComponents, escapeFraction: model.commonEscapeFraction ? f : nil, escapeFractionSigma: fSigma, - escapePeaks: escComponents, iterations: iterations, converged: converged, + escapePeaks: escComponents, componentCounts: componentCounts, iterations: iterations, converged: converged, parameters: params, validation: validation) } } diff --git a/Sources/SpectroEDX/Proposer/ElementProposer.swift b/Sources/SpectroEDX/Proposer/ElementProposer.swift index 38b29a4..7cd72b0 100644 --- a/Sources/SpectroEDX/Proposer/ElementProposer.swift +++ b/Sources/SpectroEDX/Proposer/ElementProposer.swift @@ -236,12 +236,15 @@ public nonisolated struct ElementProposer: Sendable { /// strong line's shape error dragged the continuum beside it (data over model 3.1 in 1 to 2.5 keV beside a planted Al 6 eV narrower than the /// model) and the hump it left became an element (Os M). The pass's `result` is returned in counts (its model and residual unscaled). private static func fitPass(groups: [FitLineGroup], data: [Double], settings s: FitSettings, axis: EnergyAxis, - channels: Range, dropped: [String], relative: Double, widths: [Int], weighted: Bool = true) throws -> Pass { + channels: Range, dropped: [String], relative: Double, widths: [Int], weighted: Bool = true, + explained: [Double]? = nil) throws -> Pass { let model = EDSLineModel(groups: groups, resolutionMnKaEV: s.resolutionMnKaEV, beamEnergy: s.beamEnergy, escapePeaks: s.escapePeaks, droppedLines: dropped, lineTail: s.lineTail) try EDSFit.validate(s.referenceShapes, axis: axis, model: model) var design = LinearDesign.build(model: model, axis: axis, channels: channels, background: s.background, shapes: s.referenceShapes, counts: data) + // Counts the caller's model already explains (the sum and escape peaks of a sum/escape fit): a fixed part of the model. + if let explained { for (k, ch) in channels.enumerated() { design.offset[k] += explained[ch] } } let y = channels.map { data[$0] } var prefix = [Double](repeating: 0, count: y.count + 1) for i in y.indices { prefix[i + 1] = prefix[i] + y[i] } @@ -273,13 +276,14 @@ public nonisolated struct ElementProposer: Sendable { /// `fitPass` for every job, concurrently; the results are in job order. private static func fitPasses(jobs: [[FitLineGroup]], data: [Double], settings s: FitSettings, axis: EnergyAxis, - channels: Range, dropped: [String], relative: Double, widths: [Int]) -> [Result] { + channels: Range, dropped: [String], relative: Double, widths: [Int], + explained: [Double]?) -> [Result] { var out = [Result?](repeating: nil, count: jobs.count) out.withUnsafeMutableBufferPointer { buf in let box = ResultBox(buffer: buf) DispatchQueue.concurrentPerform(iterations: jobs.count) { i in box.buffer[i] = Result { try fitPass(groups: jobs[i], data: data, settings: s, axis: axis, channels: channels, - dropped: dropped, relative: relative, widths: widths) } + dropped: dropped, relative: relative, widths: widths, explained: explained) } } } return out.map { $0! } @@ -319,11 +323,16 @@ public nonisolated struct ElementProposer: Sendable { /// its own `ProposerError.cancelled`; nothing partial is returned. /// - progress: monotone in 0...1, ends at 1. The number of fits is not known in advance, so it is fits done over fits done plus the /// fits the current step still has planned, clamped never to fall. + /// - explained: counts per channel of `axis` that the caller's model already explains beyond line and continuum columns (the sum + /// and escape peaks of `EDSSumEscapeFit`, `SumEscapeResult.componentCounts`). They are a fixed part of every fit here, so a peak + /// they cover leaves no residual and is never proposed as an element. nil (the default) runs the proposer as before, bit for bit. public func propose(counts: [Double], axis: EnergyAxis, settings: FitSettings, holeCounts: [Double]? = nil, + explained: [Double]? = nil, cancelled: @Sendable () -> Bool = SpectroCancellation.task, progress: (@Sendable (Double) -> Void)? = nil) throws -> ProposalResult { - guard counts.count == axis.size, holeCounts.map({ $0.count == axis.size }) ?? true else { throw ProposerError.lengthMismatch } + guard counts.count == axis.size, holeCounts.map({ $0.count == axis.size }) ?? true, + explained.map({ $0.count == axis.size }) ?? true else { throw ProposerError.lengthMismatch } var s = settings s.method = .leastSquares let channels = axis.fitChannels(from: s.fitFrom, to: s.fitTo) @@ -379,7 +388,8 @@ public nonisolated struct ElementProposer: Sendable { func runAll(_ jobs: [[FitLineGroup]], on data: [Double]) throws -> [Result] { if cancelled() { throw ProposerError.cancelled } fitsPlanned = max(fitsPlanned, jobs.count) - let out = Self.fitPasses(jobs: jobs, data: data, settings: s, axis: axis, channels: channels, dropped: dropped, relative: t.relativeModelTerm, widths: widths) + let out = Self.fitPasses(jobs: jobs, data: data, settings: s, axis: axis, channels: channels, dropped: dropped, relative: t.relativeModelTerm, widths: widths, + explained: explained) fitsDone += jobs.count; tick() return out } @@ -600,7 +610,7 @@ public nonisolated struct ElementProposer: Sendable { // shape is off, and the statistic's weights spare that misfit). σ₀ and L_D are that fit's own null variance. Pruned, rejected and withheld // candidates keep the numbers of the fit that decided them (they are not in the final model). let report = try Self.fitPass(groups: model, data: counts, settings: s, axis: axis, channels: channels, dropped: dropped, - relative: t.relativeModelTerm, widths: widths, weighted: false) + relative: t.relativeModelTerm, widths: widths, weighted: false, explained: explained) fitsDone += 1 // Candidates: the found elements from the final fit, then the pruned, then the rest that were tested. let finalParents = parents(report) diff --git a/Sources/SpectroEDX/Quant/PooledQuantification.swift b/Sources/SpectroEDX/Quant/PooledQuantification.swift index 789f613..5ce10b8 100644 --- a/Sources/SpectroEDX/Quant/PooledQuantification.swift +++ b/Sources/SpectroEDX/Quant/PooledQuantification.swift @@ -162,6 +162,9 @@ public nonisolated struct PooledQuantification: Sendable { public var footerLines: [String] /// The settings the reported fit ran with (axis, width, range, continuum, estimator): the unlisted-line check proposes on them. package var fitSettings: FitSettings + /// The sum and escape peaks the reported fit modelled (`SumEscapeResult.componentCounts` on the full axis, 0 outside the fitted + /// channels); nil when the sum/escape model is off. The unlisted-line check hands it to the proposer as explained counts. + package var sumEscapeCounts: [Double]? = nil /// The fitted range as run and where its upper end came from (WP3c; the footer's "fit range" line). package var fitRange: FitRangeChoice /// WP3c: what one extra fit to the axis end does to each quantified net, when the axis runs past the default range; @@ -268,11 +271,15 @@ public nonisolated enum PooledQuantifier { try SpectroCancellation.check(cancelled) progress?(0.85) var sumEscapeLines: [String] = [] + var sumEscapeCounts: [Double]? do { if let model = input.sumEscape, !model.isOff { let r = try EDSSumEscapeFit.run(counts: counts, axis: axis, settings: fitSettings, model: model, escapeRatioWarning: policy.fit.escapeRatioWarning) fit = r.fit; sumEscapeLines = r.parameters + var full = [Double](repeating: 0, count: axis.size) + for (k, ch) in r.fit.channels.enumerated() where k < r.componentCounts.count { full[ch] = r.componentCounts[k] } + sumEscapeCounts = full } else { fit = try EDSFit.run(counts: counts, axis: axis, settings: fitSettings, escapeRatioWarning: policy.fit.escapeRatioWarning) } @@ -405,12 +412,14 @@ public nonisolated enum PooledQuantifier { try SpectroCancellation.check(cancelled) progress?(1) - return PooledQuantification( + var result = PooledQuantification( method: method, rows: rows, referenceElement: referenceIndex.map { rows[$0].element }, fit: fit, fileAxis: input.axis, usedAxis: axis, axisLocked: locked, refinement: refinement, plotModel: plotModel, plotBackground: plotBackground, kSet: kSet, abundanceRefusal: abundanceRefusal, absorption: absorption, warnings: warnings, qualityLabel: qualityLabel, quality: quality, footerLines: footer, fitSettings: fitSettings, fitRange: fitRange) + result.sumEscapeCounts = sumEscapeCounts + return result } /// What every shown sigma covers (WP3b F3 wording): the fit's counting statistics, not the choice of model. diff --git a/Sources/SpectroEDX/Quant/UnlistedLineCheck.swift b/Sources/SpectroEDX/Quant/UnlistedLineCheck.swift index 31bf367..39e03ca 100644 --- a/Sources/SpectroEDX/Quant/UnlistedLineCheck.swift +++ b/Sources/SpectroEDX/Quant/UnlistedLineCheck.swift @@ -171,7 +171,10 @@ public nonisolated enum UnlistedLineChecker { proposer: ElementProposer = ElementProposer(), cancelled: @Sendable () -> Bool = SpectroCancellation.task, progress: (@Sendable (Double) -> Void)? = nil) throws -> ProposalResult { - try proposer.propose(counts: counts, axis: q.usedAxis, settings: proposerSettings(q), cancelled: cancelled, progress: progress) + // The sum and escape peaks the reported fit modelled are explained counts for the proposer: a peak they cover is not an + // unlisted element (nil when the sum/escape model is off: the proposer runs as it always ran). + try proposer.propose(counts: counts, axis: q.usedAxis, settings: proposerSettings(q), explained: q.sumEscapeCounts, + cancelled: cancelled, progress: progress) } /// "Al_Ka" -> "Al K\u{03B1}", "Lu_Ma" -> "Lu M\u{03B1}", "Cu_Lb1" -> "Cu L\u{03B2}1". diff --git a/Tests/SpectroEDXTests/SumEscapeExplainedTests.swift b/Tests/SpectroEDXTests/SumEscapeExplainedTests.swift new file mode 100644 index 0000000..fd7609c --- /dev/null +++ b/Tests/SpectroEDXTests/SumEscapeExplainedTests.swift @@ -0,0 +1,143 @@ +// +// SumEscapeExplainedTests.swift +// Role: the sum/escape model's peaks are explained counts for the element proposer and the unlisted-line check. Before, a Quantify fit +// with `SumEscapeModel` on modelled the pile-up and escape peaks, but the check proposed on the bare spectrum and named +// them as elements (measured on the tools/edx-sim pool below: Ar, Ag, Pd at 100 counts/px; Rh, Ar, In, Sn, Pd, Ag, Cd, Ru, +// Bi, K at 300 counts/px; La, Ce, Cr, Cs at the planted Fe escape with the free escape columns off). Planted truth only; the +// model is `validation: "none"` and eXSpy has no sum or escape model to compare with. +// + +import Foundation +import Testing +import SpectroTestSupport +import SpectroCore +import SpectroEDX + +struct SumEscapeExplainedTests { + + private struct SimPools: Decodable { + struct Region: Decodable { let label: String; let expected: [Double]; let components: [String: Double] } + let offset: Double, scale: Double, size: Int + let regions: [Region] + var axis: EnergyAxis { EnergyAxis(offset: offset, scale: scale, size: size) } + } + + /// tools/edx-sim/proposer_sim.py: region 1 is the Al matrix at 100 counts/px (Al+Al sum 1845 counts), region 2 the beta'' + /// pixel at 300 counts/px (six sum peaks, 454 to 8553 counts). + private static let sim: SimPools = { + let url = EDXFixtures.dir.appendingPathComponent("eds-proposer-sim.json") + return try! JSONDecoder().decode(SimPools.self, from: Data(contentsOf: url)) + }() + + private static func input(counts: [Double], axis: EnergyAxis, elements: [String], sumEscape: SumEscapeModel?, + policy: QuantificationPolicy = .default) -> PooledQuantificationInput { + var m = QuantificationMethod() + m.elements = elements.map { .init(symbol: $0, role: .quantify, isManual: false) } + m.beamEnergyKeV = 200 + m.absorptionCorrection = false + m.lockEnergyAxis = true + let meta = SpectrumImageMetadata(fileName: "planted", filePath: "", scanWidth: 1, scanHeight: 1, channelCount: axis.size, + energyOffsetEV: axis.offset * 1000, energyDispersionEV: axis.scale * 1000) + return PooledQuantificationInput(counts: counts.map { UInt64(max($0, 0).rounded()) }, axis: axis, method: m, metadata: meta, + regionName: "planted", pixelCount: 1, policy: policy, sumEscape: sumEscape) + } + + private static func check(_ input: PooledQuantificationInput) throws -> (UnlistedLineCheck, PooledQuantification) { + let q = try PooledQuantifier.run(input, tables: QuantificationTables.bundled()) + let proposal = try UnlistedLineChecker.propose(counts: input.counts.map { Double($0) }, quantification: q) + return (UnlistedLineChecker.check(proposal: proposal, input: input, quantification: q), q) + } + + private static func simCounts(_ region: Int, plant: [String: Double] = [:]) -> [Double] { + var expected = sim.regions[region].expected + if !plant.isEmpty { + let axis = sim.axis + let symbols = Array(Set(plant.keys.map { String($0.split(separator: "_")[0]) })) + let model = EDSLineModel.build(elements: symbols, axis: axis, beamEnergy: 200, resolutionMnKaEV: 130, escapePeaks: false) + let energies = (0.. 0.5 * Self.sim.regions[region].components.filter { $0.key.hasPrefix("sum_") }.values.reduce(0, +)) + #expect(on.candidates.isEmpty, "the modelled sum peaks are explained: \(on.summary)") + } + + /// A real line between two sum peaks is still found with the model on: K K-alpha (3.314 keV, between Al+Si 3.226 and Si+Si 3.479), + /// the strongest candidate. (The elements its peak was tested against, In and Cd among them, are named beside it as the check + /// always names every tested candidate at or above L_D; that is the check's rule, not pile-up.) + @Test func aRealLineBesideTheSumPeaksIsStillNamed() throws { + let counts = Self.simCounts(2, plant: ["K_Ka": 3000]) + let (on, _) = try Self.check(Self.input(counts: counts, axis: Self.sim.axis, elements: Self.listed, sumEscape: .both)) + #expect(on.elementNames.first == "K", "\(on.summary)") + } + + /// Red before: a common escape fraction with the free escape columns off left the Fe K-alpha escape (4.66 keV) to the proposer, + /// which named it La (L-alpha 4.651 keV), with Ce, Cr and Cs beside it. + @Test func theCommonEscapeIsExplained() throws { + let axis = EnergyAxis(offset: 0, scale: 0.01, size: 2000) + let energies = (0.. Double in + let x = max(e, 0.05) + return e >= 0.2 ? 2.0 * max(200 - e, 0) / x * exp(-pow(0.3 / x, 3)) / 40 : 0 + } + let model = EDSLineModel.build(elements: ["Al", "Fe"], axis: axis, beamEnergy: 200, resolutionMnKaEV: 130, escapePeaks: true) + for g in model.groups where g.id == "Al_Ka" || g.id == "Fe_Ka" { + let col = EDSLineModel.column(of: g.lines, energies: energies, scale: axis.scale) + for i in mu.indices { mu[i] += 300_000 * col[i] } + if !g.escapes.isEmpty { + let ec = EDSLineModel.column(of: g.escapes, energies: energies, scale: axis.scale) + for i in mu.indices { mu[i] += 0.01 * 300_000 * ec[i] } + } + } + var rng = Xoshiro256StarStar(seed: 3) + let counts = mu.map { rng.poisson($0) } + var policy = QuantificationPolicy.default + policy.fit.escapePeaks = false + let (on, q) = try Self.check(Self.input(counts: counts, axis: axis, elements: ["Al", "Fe"], + sumEscape: SumEscapeModel(commonEscapeFraction: true), policy: policy)) + #expect(q.sumEscapeCounts != nil) + #expect(on.candidates.isEmpty, "the modelled Fe escape is explained: \(on.summary)") + } + + /// The proposer itself: the sum/escape fit's components as `explained` remove the sum peaks from what it can propose; nil runs it + /// as before (the same result as no argument). + @Test func theProposerTakesTheComponentsAsExplained() throws { + let axis = Self.sim.axis + let counts = Self.simCounts(2) + let st = FitSettings.standard(elements: Self.listed, axis: axis, resolutionMnKaEV: 130, beamEnergy: 200) + let r = try EDSSumEscapeFit.run(counts: counts, axis: axis, settings: st, model: .both) + #expect(r.componentCounts.count == r.fit.channels.count) + var explained = [Double](repeating: 0, count: axis.size) + for (k, ch) in r.fit.channels.enumerated() { explained[ch] = r.componentCounts[k] } + let bare = try ElementProposer().propose(counts: counts, axis: axis, settings: st) + let none = try ElementProposer().propose(counts: counts, axis: axis, settings: st, explained: nil) + #expect(bare.candidates == none.candidates) + #expect(bare.candidates.contains { $0.aboveDetectionLimit }) + let shared = try ElementProposer().propose(counts: counts, axis: axis, settings: st, explained: explained) + #expect(!shared.candidates.contains { $0.aboveDetectionLimit }, "\(shared.candidates.map(\.group))") + #expect(throws: ProposerError.lengthMismatch) { + _ = try ElementProposer().propose(counts: counts, axis: axis, settings: st, explained: [1, 2]) + } + let off = try EDSSumEscapeFit.run(counts: counts, axis: axis, settings: st, model: SumEscapeModel()) + #expect(off.componentCounts.allSatisfy { $0 == 0 } && off.componentCounts.count == off.fit.channels.count) + } +} From bce80a3fbdaca8091b042ffcf4dfd0f058838779 Mon Sep 17 00:00:00 2001 From: Paullo9 Date: Sat, 31 Oct 2026 18:20:04 +0100 Subject: [PATCH 2/7] feat!: the pooled fit models sum peaks when the strongest line's self pair is significant The pooled quantification fitted one Gaussian per line and no sum (pile-up) peaks, exSpy's model. On the public synthetic AlMgSi demo (planted truth: the simulation recipe of sim_edx.py v2.0, not a measurement) that fit read noise-free Si K-alpha 15-18 % low on the Al-rich map and fixture pools and 57 % low on the highest-rate pool, held a planted Cu K-alpha at 0 at high rate, and had a reduced chi2 of 2.1-31 on the Poisson counts. The Al+Al sum peak (2.97 keV) and its neighbours pull the continuum segment above the Al K edge, and Si K-alpha with it. FitPolicy.sumPeaks (SumPeakRule, default .whenSignificant) now tests the strongest line's self pair alone with EDSSumEscapeFit; when its pile-up coefficient is 3 sigma above 0 (sigma scaled by sqrt(max(chi2_red, 1)) of that fit) the sum peaks of the four strongest lines are fitted and kept, otherwise the result is the old fit bit for bit. The self pair is the test because the cross pairs absorbed an unlisted Cu K-alpha (Ni K-alpha + O K-alpha) on a synthetic spectrum with no pile-up. The footer names the decision with its number, and names the alpha lines within one FWHM of the self pair (Ar K-alpha, Ag L-alpha under Al+Al): a real line there is read as pile-up. .off (FitPolicy.exspyEquivalent) is the old fit; a caller passing sumEscape keeps full control. The unlisted-line and fit-range refits repeat the reported decision; the proposer axis refinement runs without sum peaks. Noise-free Si K-alpha against planted: -0.0 to -4.0 % on five pools, -7.9 % at the highest rate; Cu K-alpha 92-97 % of planted at high rate (0-42 % before); reduced chi2 on the Poisson counts 0.70-1.08. The absorption-truth Si pin moves from -0.203 to -0.067 (+- 0.051), and the old pin stays on the .off fit. The Al K-alpha tail stays a detector calibration: measured once with TailEstimate on a high-count spectrum and typed, it brings Mg K-alpha from -22 to -32 % to within 5 % (matrix map -15 %). New fixture edx-demo-pools.json from tools/edx-sim/demo_pools.py. The golden scenarios pin the explicit off model; their numbers are unchanged, only the two new nil fields are added. Results stay validation none. Reviewed (numerics, two independent reviews): sigma scaling, the coincident-line caveat, the axis refinement cost and the wording fixed. BREAKING CHANGE: PooledQuantifier.run fits sum peaks by default when the data support them, so nets, at% and wt% change on spectra with pile-up. Migration: pass a policy with fit.sumPeaks = .off (or FitPolicy.exspyEquivalent), or sumEscape: SumEscapeModel(), to keep the old numbers. A stored QuantificationPolicy without the new field decodes as .off and its footer names the non-default policy. Done: sum peaks on by default in the pooled fit, with planted-truth tests on the demo pools. Next: the parity and open-items rows once the open PRs on those files land, a check of the default on real data with published values, and the sum-peak question for the auto ID possible candidates. Co-Authored-By: Claude Opus 5.5 --- Sources/SpectroEDX/Quant/FitRange.swift | 1 + .../Quant/PooledQuantification.swift | 97 ++++++- .../Quant/ProposalAxisRefinement.swift | 4 +- .../Quant/QuantificationPolicy.swift | 90 +++++- .../SpectroEDX/Quant/UnlistedLineCheck.swift | 1 + .../Quantifying-an-EDX-spectrum.md | 17 ++ .../spectro-golden/demo-edx-tiny-dm4.txt | 4 + .../spectro-golden/eds-realistic-l-sim.txt | 6 + .../spectro-golden/eds-unlisted-sim.txt | 4 + .../spectro-golden/eds-weakline-sim.txt | 4 + Tests/SpectroEDXTests/DemoEDXPoolTests.swift | 266 ++++++++++++++++++ .../Fixtures/edx-demo-pools.json | 1 + .../SpectroscopyAbsorptionTruthTests.swift | 23 +- .../SumEscapeExplainedTests.swift | 8 +- Tests/SpectroEDXTests/SumEscapeFitTests.swift | 3 + .../SpectroGoldenTests.swift | 7 +- tools/edx-sim/demo_pools.py | 75 +++++ 17 files changed, 592 insertions(+), 19 deletions(-) create mode 100644 Tests/SpectroEDXTests/DemoEDXPoolTests.swift create mode 100644 Tests/SpectroEDXTests/Fixtures/edx-demo-pools.json create mode 100644 tools/edx-sim/demo_pools.py diff --git a/Sources/SpectroEDX/Quant/FitRange.swift b/Sources/SpectroEDX/Quant/FitRange.swift index edf8b3f..55f878c 100644 --- a/Sources/SpectroEDX/Quant/FitRange.swift +++ b/Sources/SpectroEDX/Quant/FitRange.swift @@ -169,6 +169,7 @@ public nonisolated enum FitRangeSensitivityCheck { var refit = input refit.method.fitToKeV = to refit.refinement = q.refinement + refit.sumEscape = PooledQuantifier.sameSumEscape(as: q) // the reported fit's sum-peak decision, not a new one let after: PooledQuantification do { after = try PooledQuantifier.run(refit, tables: nil, cancelled: cancelled, progress: progress.map { p in { @Sendable f in p(f * 0.95) } }) } catch let c as SpectroCancelled { throw c } diff --git a/Sources/SpectroEDX/Quant/PooledQuantification.swift b/Sources/SpectroEDX/Quant/PooledQuantification.swift index 5ce10b8..d274288 100644 --- a/Sources/SpectroEDX/Quant/PooledQuantification.swift +++ b/Sources/SpectroEDX/Quant/PooledQuantification.swift @@ -14,6 +14,10 @@ // is then computed WITHOUT the correction and the result says so; it never pretends. // // DEVIATIONS (named): +// * Sum peaks (`FitPolicy.sumPeaks`, default `.whenSignificant`): exSpy fits one Gaussian per line and no sum peaks. The fit +// tests the strongest line's self pair and, when its pile-up coefficient is 3 sigma above 0, keeps the sum peaks of the four +// strongest lines (`EDSSumEscapeFit`, unvalidated); otherwise it is the exSpy-equivalent fit bit for bit. `.off` always is. +// The axis refinement runs without them. The footer names the decision with its number. // * Absorption is iterated to 1e-7 % (eXSpy stops at 0.5 %): the sigma terms are finite differences of // the composition, and a loop that stops at 0.5 % would put steps into them. // * The absorption "model spread" is |at%(geometric-mean transmission) - at%(weighted-mean transmission)|. The @@ -86,8 +90,9 @@ public nonisolated struct PooledQuantificationInput: Sendable { /// The choices the library made about the fit and the step to composition (`QuantificationPolicy.default` is what it has always /// done). A non-default policy is named in the result's footer. It is not part of `method`, whose hash it leaves alone. public var policy: QuantificationPolicy - /// The optional sum-peak and common-escape-fraction components of the fit (0.10.0; nil, the default, runs the fit as it always ran). - /// Unvalidated (no Python reference); named in the footer when on. + /// The sum-peak and common-escape-fraction components of the fit, chosen by the caller (0.10.0). nil, the default, leaves the + /// choice to `policy.fit.sumPeaks` (sum peaks kept when the data support them); a model runs as given, and `SumEscapeModel()` + /// (both off) is the default fit as it ran before sum peaks were the default. Unvalidated (no Python reference); named in the footer. public var sumEscape: SumEscapeModel? = nil public init(counts: [UInt64], axis: EnergyAxis, method: QuantificationMethod, metadata: SpectrumImageMetadata, @@ -177,6 +182,9 @@ public nonisolated struct PooledQuantification: Sendable { /// A2: a caveat on the at% rows ("assumes the listed elements only; unlisted: Cu (net 139 411) ..."), set by the unlisted-line /// check; "unlisted-line check running" while it runs; nil when the check found nothing. Never blanks a number. public var abundanceCaveat: String? = nil + /// The sum-peak (and escape) model the reported fit ran with; nil for the fit without sum peaks (one Gaussian per line). + /// Set by the caller's `PooledQuantificationInput.sumEscape`, or by `FitPolicy.sumPeaks` when the caller passes none. + public var appliedSumEscape: SumEscapeModel? = nil public var hasAbundance: Bool { abundanceRefusal == nil } /// "\u{03C7}\u{00B2}\u{1D63} 54.8 (Pearson)" or "reduced deviance 1.02": shown beside the at% always (R7). @@ -271,23 +279,85 @@ public nonisolated enum PooledQuantifier { try SpectroCancellation.check(cancelled) progress?(0.85) var sumEscapeLines: [String] = [] - var sumEscapeCounts: [Double]? + var applied: SumEscapeModel? + var keptSumEscape: SumEscapeResult? do { - if let model = input.sumEscape, !model.isOff { - let r = try EDSSumEscapeFit.run(counts: counts, axis: axis, settings: fitSettings, model: model, + if let model = input.sumEscape { + // The caller chose the model: it runs as asked (an `isOff` model is the default fit). + if !model.isOff { + let r = try EDSSumEscapeFit.run(counts: counts, axis: axis, settings: fitSettings, model: model, escapeRatioWarning: policy.fit.escapeRatioWarning) - fit = r.fit; sumEscapeLines = r.parameters - var full = [Double](repeating: 0, count: axis.size) - for (k, ch) in r.fit.channels.enumerated() where k < r.componentCounts.count { full[ch] = r.componentCounts[k] } - sumEscapeCounts = full + fit = r.fit; sumEscapeLines = r.parameters; applied = model; keptSumEscape = r + } else { + fit = try EDSFit.run(counts: counts, axis: axis, settings: fitSettings, escapeRatioWarning: policy.fit.escapeRatioWarning) + } } else { - fit = try EDSFit.run(counts: counts, axis: axis, settings: fitSettings, escapeRatioWarning: policy.fit.escapeRatioWarning) + switch policy.fit.sumPeaks { + case .off: + fit = try EDSFit.run(counts: counts, axis: axis, settings: fitSettings, escapeRatioWarning: policy.fit.escapeRatioWarning) + case .always: + let model = SumEscapeModel(sumPeaks: true) + let r = try EDSSumEscapeFit.run(counts: counts, axis: axis, settings: fitSettings, model: model, + escapeRatioWarning: policy.fit.escapeRatioWarning) + fit = r.fit; applied = model; sumEscapeLines = r.parameters; keptSumEscape = r + case .whenSignificant: + // The test: the self pair of the strongest line alone (Al K-alpha + Al K-alpha in an Al alloy), the largest sum + // peak and the one least likely to sit on an unlisted line. The full model's cross pairs can absorb the misfit of an + // unlisted line at E_i + E_j (Ni K-alpha + O K-alpha on Cu K-alpha, measured on a synthetic spectrum with no pile-up), + // so they are not the test. + let probe = try EDSSumEscapeFit.run(counts: counts, axis: axis, settings: fitSettings, + model: SumEscapeModel(sumPeaks: true, parentCount: 1), + escapeRatioWarning: policy.fit.escapeRatioWarning) + let misfit = method.estimator == .poissonMaximumLikelihood ? probe.fit.reducedDeviance : probe.fit.pearsonReducedChiSquared + let z = SumPeakRule.significance(probe, misfit: misfit) + let pair = probe.sumPeaks.first?.label ?? "no self pair in the fitted range" + var kept = false + if probe.converged && z >= policy.fit.sumPeakSignificance { + let model = SumEscapeModel(sumPeaks: true) + let r = try EDSSumEscapeFit.run(counts: counts, axis: axis, settings: fitSettings, model: model, + escapeRatioWarning: policy.fit.escapeRatioWarning) + if r.converged { + fit = r.fit; applied = model; kept = true; keptSumEscape = r + sumEscapeLines = [String(format: "sum peaks kept: %@ alone is c / \u{03C3}_c = %.1f \u{2265} %g above 0 (\u{03C3}_c scaled by \u{221A}max(misfit, 1))", + pair, z, policy.fit.sumPeakSignificance)] + r.parameters + // A real line under the self pair is read as pile-up and never named by the unlisted-line check: say which. + if let e = probe.sumPeaks.first?.energyKeV { + let near = SumPeakRule.coincidentLines(energy: e, resolutionMnKaEV: fitSettings.resolutionMnKaEV, listed: active) + if !near.isEmpty { + let names = near.prefix(4).map { String(format: "%@ %.3f keV", $0.id, $0.energy) }.joined(separator: ", ") + let caveat = String(format: "the %@ sum peak (%.3f keV) lies within one FWHM of %@: a real line there is read as pile-up; list the element to test it", + pair, e, names) + sumEscapeLines.insert(caveat, at: 1) + warnings.append(caveat) + } + } + } else { + fit = probe.baseline + sumEscapeLines = ["sum peaks tested, not kept: the full sum-peak model did not converge; the default fit (one Gaussian per line, no sum peaks)"] + } + } else { + fit = probe.baseline + } + if !kept && sumEscapeLines.isEmpty { + // Not supported by the data: the default fit (the baseline of the same settings, bit for bit). + sumEscapeLines = [String(format: "sum peaks tested, not kept: %@ alone is c / \u{03C3}_c = %@ (needs %g)%@; the default fit (one Gaussian per line, no sum peaks)", + pair, z.isFinite ? String(format: "%.1f", z) : "n/a", policy.fit.sumPeakSignificance, + probe.converged ? "" : ", the alternation did not converge")] + } + } } } catch { let why = (error as? LocalizedError)?.errorDescription ?? "\(error)" throw QuantificationRefusal("The fit could not run: \(why).") } + // The sum and escape peaks the kept model explains, on the full axis (0 outside the fitted channels). + var sumEscapeCounts: [Double]? + if let r = keptSumEscape { + var full = [Double](repeating: 0, count: axis.size) + for (k, ch) in r.fit.channels.enumerated() where k < r.componentCounts.count { full[ch] = r.componentCounts[k] } + sumEscapeCounts = full + } // The fit appends the weak-line bias note to every continuum fit; it is a statement about a weak line beside Al K-alpha // (measured at Mg K-alpha on synthetic data), so it is kept only when that situation is in this result. warnings += fit.warnings.filter { $0 != ContinuumForm.weakLineBiasNote } @@ -419,9 +489,16 @@ public nonisolated enum PooledQuantifier { absorption: absorption, warnings: warnings, qualityLabel: qualityLabel, quality: quality, footerLines: footer, fitSettings: fitSettings, fitRange: fitRange) result.sumEscapeCounts = sumEscapeCounts + result.appliedSumEscape = applied return result } + /// The model a refit of the same quantification must run with so that it repeats this result's sum-peak decision instead of + /// taking it again on other data (the unlisted-line and fit-range checks): the applied model, or an off model (the default fit). + package static func sameSumEscape(as q: PooledQuantification) -> SumEscapeModel { + q.appliedSumEscape ?? SumEscapeModel() + } + /// What every shown sigma covers (WP3b F3 wording): the fit's counting statistics, not the choice of model. /// R7 (wp3e item 2): "\u{03C7}\u{00B2}\u{1D63} 54.8 (Pearson)" / "reduced deviance 1.02". Three significant figures at most; no /// threshold: the expectation of 1 is a property of the statistic, not a measured cliff. diff --git a/Sources/SpectroEDX/Quant/ProposalAxisRefinement.swift b/Sources/SpectroEDX/Quant/ProposalAxisRefinement.swift index ba76f12..1657b4b 100644 --- a/Sources/SpectroEDX/Quant/ProposalAxisRefinement.swift +++ b/Sources/SpectroEDX/Quant/ProposalAxisRefinement.swift @@ -73,7 +73,9 @@ extension ElementProposer { m.elements = (listed + anchors.filter { !listed.contains($0) }).map { QuantificationMethod.ElementState(symbol: $0, role: .quantify, isManual: false) } m.beamEnergyKeV = beamEnergy let input = PooledQuantificationInput(counts: spectrum, axis: fileAxis, method: m, metadata: metadata, regionName: regionName, pixelCount: 1, - resolutionMnKaEV: resolutionMnKaEV) + resolutionMnKaEV: resolutionMnKaEV, + sumEscape: SumEscapeModel()) // only the refinement is read: no sum-peak fits + // (the refinement itself runs without them) let fit: PooledQuantification do { fit = try PooledQuantifier.run(input, tables: tables, cancelled: cancelled) } catch let c as SpectroCancelled { throw c } diff --git a/Sources/SpectroEDX/Quant/QuantificationPolicy.swift b/Sources/SpectroEDX/Quant/QuantificationPolicy.swift index 45678b6..37477d2 100644 --- a/Sources/SpectroEDX/Quant/QuantificationPolicy.swift +++ b/Sources/SpectroEDX/Quant/QuantificationPolicy.swift @@ -67,19 +67,57 @@ public nonisolated struct FitPolicy: Sendable, Equatable, Codable { public var escapeRatioWarning: Double /// The energy-axis refinement on the pooled spectrum: which of offset, gain and width, the cap, the tolerance and the width bounds. public var axisRefinement: AxisRefinementSettings + /// Sum (pile-up) peaks of the four strongest alpha lines in the pooled fit (`EDSSumEscapeFit`), when the caller passes no + /// `PooledQuantificationInput.sumEscape`. Default `.whenSignificant`: kept when the strongest line's self pair is + /// `sumPeakSignificance` sigma above 0. `.off` is the fit before sum peaks were the default (one Gaussian per line, no sum peaks, + /// exSpy's model): its numbers are bit for bit the old ones; as a non-default policy it adds the footer line + /// `policy (non-default): fit.sumPeaks = off`. + public var sumPeaks: SumPeakRule + /// The c / sigma_c a pile-up coefficient needs under `.whenSignificant`, sigma_c scaled by the square root of the self-pair fit's + /// reduced chi2 (or deviance) when that is above 1. Default 3: a stated choice, not a measured false-keep rate (c is clipped at 0, + /// and the rate holds only for a model that fits; a real line under the self pair is read as pile-up whatever the level). + public var sumPeakSignificance: Double public init(fitFromKeV: Double = 0.2, defaultUpperLimitKeV: Double = 20, continuumOrders: [Int] = [9, 5], continuumEdges: [Double] = [FitPolicy.alKEdgeKeV], continuumNonNegative: Bool = true, continuumEfficiency: DetectorLayers? = nil, escapePeaks: Bool = true, maximumPolynomialOrder: Int = 8, irls: IRLSSettings = IRLSSettings(), escapeRatioWarning: Double = 0.05, axisRefinement: AxisRefinementSettings = AxisRefinementSettings(), - lineTail: LineTail? = nil) { + lineTail: LineTail? = nil, sumPeaks: SumPeakRule = .whenSignificant, sumPeakSignificance: Double = 3) { self.fitFromKeV = fitFromKeV; self.defaultUpperLimitKeV = defaultUpperLimitKeV self.continuumOrders = continuumOrders; self.continuumEdges = continuumEdges self.continuumNonNegative = continuumNonNegative; self.continuumEfficiency = continuumEfficiency self.escapePeaks = escapePeaks; self.maximumPolynomialOrder = maximumPolynomialOrder self.irls = irls; self.escapeRatioWarning = escapeRatioWarning; self.axisRefinement = axisRefinement - self.lineTail = lineTail + self.lineTail = lineTail; self.sumPeaks = sumPeaks; self.sumPeakSignificance = sumPeakSignificance + } + + /// The fit before sum peaks were the default (one Gaussian per line, no sum peaks): exSpy's line model. + public static let exspyEquivalent = FitPolicy(sumPeaks: .off) + + private enum CodingKeys: String, CodingKey { + case fitFromKeV, defaultUpperLimitKeV, continuumOrders, continuumEdges, continuumNonNegative, continuumEfficiency, escapePeaks, + lineTail, maximumPolynomialOrder, irls, escapeRatioWarning, axisRefinement, sumPeaks, sumPeakSignificance + } + + /// A policy stored before sum peaks were the default has no `sumPeaks`: it reads `.off`, the fit it was stored with (and gets the + /// non-default footer line). Every other field is required, as before. + public init(from decoder: any Decoder) throws { + let c = try decoder.container(keyedBy: CodingKeys.self) + self.init(fitFromKeV: try c.decode(Double.self, forKey: .fitFromKeV), + defaultUpperLimitKeV: try c.decode(Double.self, forKey: .defaultUpperLimitKeV), + continuumOrders: try c.decode([Int].self, forKey: .continuumOrders), + continuumEdges: try c.decode([Double].self, forKey: .continuumEdges), + continuumNonNegative: try c.decode(Bool.self, forKey: .continuumNonNegative), + continuumEfficiency: try c.decodeIfPresent(DetectorLayers.self, forKey: .continuumEfficiency), + escapePeaks: try c.decode(Bool.self, forKey: .escapePeaks), + maximumPolynomialOrder: try c.decode(Int.self, forKey: .maximumPolynomialOrder), + irls: try c.decode(IRLSSettings.self, forKey: .irls), + escapeRatioWarning: try c.decode(Double.self, forKey: .escapeRatioWarning), + axisRefinement: try c.decode(AxisRefinementSettings.self, forKey: .axisRefinement), + lineTail: try c.decodeIfPresent(LineTail.self, forKey: .lineTail), + sumPeaks: try c.decodeIfPresent(SumPeakRule.self, forKey: .sumPeaks) ?? .off, + sumPeakSignificance: try c.decodeIfPresent(Double.self, forKey: .sumPeakSignificance) ?? 3) } /// The Al K absorption edge, keV (X-ray Data Booklet, Table 1-1): the default continuum split. @@ -98,6 +136,7 @@ public nonisolated struct FitPolicy: Sendable, Equatable, Codable { if !zip(continuumEdges, continuumEdges.dropFirst()).allSatisfy({ $0 < $1 }) { return "The continuum edges must ascend." } if maximumPolynomialOrder < 0 { return "The largest polynomial order must be 0 or more." } if !(escapeRatioWarning.isFinite && escapeRatioWarning > 0) { return "The escape-ratio warning level must be positive." } + if !(sumPeakSignificance.isFinite && sumPeakSignificance >= 0) { return "The sum-peak significance level must be a number of 0 or more." } if irls.maxIterations < 1 || !(irls.tolerance > 0) || !(irls.muFloor > 0) { return "The Poisson iteration needs a cap of 1 or more, a positive tolerance and a positive floor." } if axisRefinement.maxIterations < 1 || !(axisRefinement.tolerance > 0) || !(axisRefinement.minimumResolutionEV < axisRefinement.maximumResolutionEV) { @@ -148,6 +187,53 @@ public nonisolated struct AbundancePolicy: Sendable, Equatable, Codable { } } +/// Whether the pooled fit models sum (pile-up) peaks (`FitPolicy.sumPeaks`). +/// +/// Why it is the default: on the public synthetic AlMgSi demo (planted truth: the simulation recipe of `sim_edx.py` v2.0, not a +/// measurement) the fit without sum peaks read noise-free Si K-alpha 15-18 % low on the Al-rich map and fixture pools (57 % on +/// the highest-rate pool, 8 % on the precipitate pool) and held a planted Cu K-alpha at 0 at high rate, because the Al+Al sum peak +/// (2.97 keV) and its neighbours pull the continuum above the Al K edge. With sum peaks the same pools read Si within 4 % (8 % at the +/// highest rate) and recover the Cu (`DemoEDXPoolTests`). On the Poisson counts of every demo pool the self pair passes the test +/// (`DemoEDXPoolTests.reducedChiSquareOnThePoissonCounts` pins it); on the one noise-free spectrum without pile-up tested +/// (`eds-unlisted-sim.json`) the default keeps the fit without sum peaks bit for bit. +/// What it cannot tell apart: a real line under the self pair (Ar K-alpha 2.957 or Ag L-alpha 2.984 keV under Al+Al 2.973 keV) is +/// read as pile-up; the footer and the warnings name the alpha lines within one FWHM of it when the sum peaks are kept. +/// The Al K-alpha tail is NOT part of this rule: fitted together with the sum peaks on the demo's Poisson pools (256 to 2 897 +/// pixels) it read 0 to a third of the planted fraction and left Mg K-alpha up to 25 % low on the map pools, so it is a detector +/// calibration (`FitPolicy.lineTail`, measured once with `TailEstimate` on a high-count spectrum). +public nonisolated enum SumPeakRule: String, Sendable, Codable, CaseIterable { + /// No sum peaks: one Gaussian per line, the fit as it ran before (exSpy's line model). + case off + /// Test the sum peak of the strongest line with itself (Al K-alpha + Al K-alpha in an Al alloy) alone; when its pile-up coefficient + /// is `FitPolicy.sumPeakSignificance` sigma above 0 (`significance(_:misfit:)`), fit and keep the sum peaks of the four strongest lines; otherwise the default + /// fit, bit for bit. Either way the footer says which, with the number. The self pair is the test because the cross pairs can + /// absorb an unlisted line at E_i + E_j: on a synthetic spectrum with no pile-up and Cu, Ga and Ge left out of the list, the + /// four-parent model kept c at 48 sigma (Ni K-alpha + O K-alpha on Cu K-alpha) while the Si self pair read 0. + case whenSignificant + /// Fit and keep the sum peaks whatever the data say. + case always + + /// c / (sigma_c sqrt(max(misfit, 1))) of a sum-peak fit: NaN when no pair lies in the fitted range (nothing was tested) or there + /// is no sigma, 0 when c is held at 0. sigma_c is counting statistics (Var(data) = model); `misfit` (the fit's reduced chi2 or + /// deviance) scales it, so a misfit near E_i + E_j does not pass as pile-up on a fit that is far from chi2_red = 1. + package static func significance(_ r: SumEscapeResult, misfit: Double) -> Double { + guard let c = r.sumCoefficient, !r.sumPeaks.isEmpty else { return .nan } + if r.sumCoefficientAtBound || c == 0 { return 0 } + guard let s = r.sumCoefficientSigma, s > 0, s.isFinite else { return .nan } + let scale = misfit.isFinite ? max(misfit, 1).squareRoot() : 1 + return c / (s * scale) + } + + /// The alpha lines of elements not in `listed` that lie within one FWHM of `energy`: a real line there is read as the sum peak. + package static func coincidentLines(energy: Double, resolutionMnKaEV: Double, listed: [String]) -> [XRayLine] { + let w = XRayLines.fwhm(resolutionMnKaEV: resolutionMnKaEV, atEnergy: energy) ?? 0.13 + return XRayLines.all.filter { + ["Ka", "La", "Ma"].contains($0.name) && !XRayLines.notRealLines.contains($0.element) && !listed.contains($0.element) + && abs($0.energy - energy) <= w + }.sorted { abs($0.energy - energy) < abs($1.energy - energy) } + } +} + /// Fewer than two lines above Cliff-Lorimer's intensity floor. public nonisolated enum SingleLineRule: String, Sendable, Codable { /// Refuse the at% (a 100 % for one element is a property of dose and the floor, not of the specimen). diff --git a/Sources/SpectroEDX/Quant/UnlistedLineCheck.swift b/Sources/SpectroEDX/Quant/UnlistedLineCheck.swift index 39e03ca..1c5b413 100644 --- a/Sources/SpectroEDX/Quant/UnlistedLineCheck.swift +++ b/Sources/SpectroEDX/Quant/UnlistedLineCheck.swift @@ -279,6 +279,7 @@ public nonisolated enum UnlistedLineChecker { refit.method.elements.removeAll { e in elements.contains { $0.element == e.symbol } } refit.method.elements += elements.map { .init(symbol: $0.element, role: .fitOnly, isManual: false) } refit.refinement = q.refinement + refit.sumEscape = PooledQuantifier.sameSumEscape(as: q) // the reported fit's sum-peak decision, not a new one let after: PooledQuantification do { after = try PooledQuantifier.run(refit, tables: nil, cancelled: cancelled, progress: progress.map { p in { @Sendable f in p(f * 0.95) } }) } catch let c as SpectroCancelled { throw c } diff --git a/Sources/SpectroEDX/SpectroEDX.docc/Quantifying-an-EDX-spectrum.md b/Sources/SpectroEDX/SpectroEDX.docc/Quantifying-an-EDX-spectrum.md index bcc719f..ef8f615 100644 --- a/Sources/SpectroEDX/SpectroEDX.docc/Quantifying-an-EDX-spectrum.md +++ b/Sources/SpectroEDX/SpectroEDX.docc/Quantifying-an-EDX-spectrum.md @@ -90,6 +90,23 @@ func report(_ result: PooledQuantification) { - ``PooledQuantification/Row/net`` is the fitted area of the element's alpha line, in counts; `atBound` marks an upper limit. - ``PooledQuantification/Row/atomicPercent`` and ``PooledQuantification/Row/atomicSigma`` are present only when at% was computed. - ``PooledQuantification/absorption`` says whether the absorption correction applied or was refused, and why. +- ``PooledQuantification/appliedSumEscape`` is the sum-peak model the fit kept, or nil for the fit without sum peaks. + +## Sum peaks and the line tail + +By default (``FitPolicy/sumPeaks`` `.whenSignificant`) the pooled fit tests the sum (pile-up) peak of the strongest line with +itself, and when it lies 3 sigma or more above 0 it models the sum peaks of the four strongest lines (``EDSSumEscapeFit``). The +footer says which, with the number. exSpy fits one Gaussian per line and no sum peaks; ``FitPolicy/exspyEquivalent`` (or +``SumPeakRule/off``) gives that fit: its numbers are bit for bit the old ones, and the footer names the non-default policy. On +the synthetic AlMgSi demo (planted truth: a simulation recipe, not a measurement) the fit without sum peaks read noise-free +Si K-alpha 8-57 % low, depending on the pool and its count rate, and held a stray Cu K-alpha at 0; with them Si reads within 4 % +(8 % at the highest count rate) and the Cu is recovered. A real line under the self pair (Ar K-alpha or Ag L-alpha under +Al+Al) is read as pile-up: when the sum peaks are kept, the footer and the warnings name the lines within one FWHM of it. + +The low-energy tail of a strong line (``LineTail``) is a property of the detector, not of the sample, and is not on by default: +fitted together with the sum peaks on the demo's Poisson pools (256 to 2 897 pixels) it read 0 to a third of the planted fraction +and left Mg K-alpha beside Al K-alpha up to 25 % low. Measure it once with ``TailEstimate`` on a high-count spectrum of the same +detector and set it as ``FitPolicy/lineTail``. ## What is and is not validated diff --git a/Tests/SpectroCoreTests/Fixtures/spectro-golden/demo-edx-tiny-dm4.txt b/Tests/SpectroCoreTests/Fixtures/spectro-golden/demo-edx-tiny-dm4.txt index ecd19ef..04321d1 100644 --- a/Tests/SpectroCoreTests/Fixtures/spectro-golden/demo-edx-tiny-dm4.txt +++ b/Tests/SpectroCoreTests/Fixtures/spectro-golden/demo-edx-tiny-dm4.txt @@ -663,6 +663,7 @@ whole.quantification.fitSettings.escapePeaks = true whole.quantification.fitSettings.referenceShapes.shapes: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 whole.quantification.fitSettings.method = .leastSquares whole.quantification.fitSettings.lineTail = nil +whole.quantification.sumEscapeCounts = nil whole.quantification.fitRange.fromKeV = 3fc999999999999a 0.20000000000000001 whole.quantification.fitRange.toKeV = 40239d932f3bac54 9.8077635536521157 whole.quantification.fitRange.source = .defaultReach @@ -674,6 +675,7 @@ whole.quantification.rangeSensitivity = nil whole.quantification.unlistedCheck = nil whole.quantification.unlistedCheckPending = false whole.quantification.abundanceCaveat = nil +whole.quantification.appliedSumEscape = nil whole.csv-fnv = 37c2c8963acfc357 whole.rangeSensitivity = nil whole.unlistedProposal.candidates: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 @@ -901,6 +903,7 @@ region-locked-axis.quantification.fitSettings.escapePeaks = true region-locked-axis.quantification.fitSettings.referenceShapes.shapes: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 region-locked-axis.quantification.fitSettings.method = .leastSquares region-locked-axis.quantification.fitSettings.lineTail = nil +region-locked-axis.quantification.sumEscapeCounts = nil region-locked-axis.quantification.fitRange.fromKeV = 3fc999999999999a 0.20000000000000001 region-locked-axis.quantification.fitRange.toKeV = 402380c28065dbf0 9.7514839290942916 region-locked-axis.quantification.fitRange.source = .defaultReach @@ -912,5 +915,6 @@ region-locked-axis.quantification.rangeSensitivity = nil region-locked-axis.quantification.unlistedCheck = nil region-locked-axis.quantification.unlistedCheckPending = false region-locked-axis.quantification.abundanceCaveat = nil +region-locked-axis.quantification.appliedSumEscape = nil region-locked-axis.csv-fnv = 90f4608d5329d926 region-locked-axis.rangeSensitivity = nil diff --git a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-realistic-l-sim.txt b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-realistic-l-sim.txt index 27852dc..98d6349 100644 --- a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-realistic-l-sim.txt +++ b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-realistic-l-sim.txt @@ -318,6 +318,7 @@ seed0.seven.quantification.fitSettings.escapePeaks = true seed0.seven.quantification.fitSettings.referenceShapes.shapes: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 seed0.seven.quantification.fitSettings.method = .leastSquares seed0.seven.quantification.fitSettings.lineTail = nil +seed0.seven.quantification.sumEscapeCounts = nil seed0.seven.quantification.fitRange.fromKeV = 3fc999999999999a 0.20000000000000001 seed0.seven.quantification.fitRange.toKeV = 4034000000000000 20 seed0.seven.quantification.fitRange.source = .defaultLimit @@ -329,6 +330,7 @@ seed0.seven.quantification.rangeSensitivity = nil seed0.seven.quantification.unlistedCheck = nil seed0.seven.quantification.unlistedCheckPending = false seed0.seven.quantification.abundanceCaveat = nil +seed0.seven.quantification.appliedSumEscape = nil seed0.seven.csv-fnv = 176c2eb938b3c80a seed0.seven.rangeSensitivity.alternativeToKeV = 4053fdf036df3a38 79.967786520000004 seed0.seven.rangeSensitivity.moves: array 7 @@ -686,6 +688,7 @@ seed0.seven-60keV.quantification.fitSettings.escapePeaks = true seed0.seven-60keV.quantification.fitSettings.referenceShapes.shapes: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 seed0.seven-60keV.quantification.fitSettings.method = .leastSquares seed0.seven-60keV.quantification.fitSettings.lineTail = nil +seed0.seven-60keV.quantification.sumEscapeCounts = nil seed0.seven-60keV.quantification.fitRange.fromKeV = 3fc999999999999a 0.20000000000000001 seed0.seven-60keV.quantification.fitRange.toKeV = 404e000000000000 60 seed0.seven-60keV.quantification.fitRange.source = .typed @@ -697,6 +700,7 @@ seed0.seven-60keV.quantification.rangeSensitivity = nil seed0.seven-60keV.quantification.unlistedCheck = nil seed0.seven-60keV.quantification.unlistedCheckPending = false seed0.seven-60keV.quantification.abundanceCaveat = nil +seed0.seven-60keV.quantification.appliedSumEscape = nil seed0.seven-60keV.csv-fnv = b4f647ee0ab928a3 seed0.seven-60keV.rangeSensitivity = nil seed0.four.quantification.method.version = 1 @@ -981,6 +985,7 @@ seed0.four.quantification.fitSettings.escapePeaks = true seed0.four.quantification.fitSettings.referenceShapes.shapes: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 seed0.four.quantification.fitSettings.method = .leastSquares seed0.four.quantification.fitSettings.lineTail = nil +seed0.four.quantification.sumEscapeCounts = nil seed0.four.quantification.fitRange.fromKeV = 3fc999999999999a 0.20000000000000001 seed0.four.quantification.fitRange.toKeV = 4034000000000000 20 seed0.four.quantification.fitRange.source = .defaultLimit @@ -992,6 +997,7 @@ seed0.four.quantification.rangeSensitivity = nil seed0.four.quantification.unlistedCheck = nil seed0.four.quantification.unlistedCheckPending = false seed0.four.quantification.abundanceCaveat = nil +seed0.four.quantification.appliedSumEscape = nil seed0.four.csv-fnv = 527d12db2afd525d seed0.four.rangeSensitivity.alternativeToKeV = 4053fdf036df3a38 79.967786520000004 seed0.four.rangeSensitivity.moves: array 4 diff --git a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-unlisted-sim.txt b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-unlisted-sim.txt index ccece0f..dc716bd 100644 --- a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-unlisted-sim.txt +++ b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-unlisted-sim.txt @@ -292,6 +292,7 @@ seed0.four.quantification.fitSettings.escapePeaks = true seed0.four.quantification.fitSettings.referenceShapes.shapes: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 seed0.four.quantification.fitSettings.method = .leastSquares seed0.four.quantification.fitSettings.lineTail = nil +seed0.four.quantification.sumEscapeCounts = nil seed0.four.quantification.fitRange.fromKeV = 3fc999999999999a 0.20000000000000001 seed0.four.quantification.fitRange.toKeV = 4034000000000000 20 seed0.four.quantification.fitRange.source = .defaultLimit @@ -303,6 +304,7 @@ seed0.four.quantification.rangeSensitivity = nil seed0.four.quantification.unlistedCheck = nil seed0.four.quantification.unlistedCheckPending = false seed0.four.quantification.abundanceCaveat = nil +seed0.four.quantification.appliedSumEscape = nil seed0.four.csv-fnv = 39e1a8432149c423 seed0.four.rangeSensitivity.alternativeToKeV = 4053fdc30de1dcc8 79.965030165261055 seed0.four.rangeSensitivity.moves: array 4 @@ -1524,6 +1526,7 @@ seed0.seven.quantification.fitSettings.escapePeaks = true seed0.seven.quantification.fitSettings.referenceShapes.shapes: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 seed0.seven.quantification.fitSettings.method = .leastSquares seed0.seven.quantification.fitSettings.lineTail = nil +seed0.seven.quantification.sumEscapeCounts = nil seed0.seven.quantification.fitRange.fromKeV = 3fc999999999999a 0.20000000000000001 seed0.seven.quantification.fitRange.toKeV = 4034000000000000 20 seed0.seven.quantification.fitRange.source = .defaultLimit @@ -1535,6 +1538,7 @@ seed0.seven.quantification.rangeSensitivity = nil seed0.seven.quantification.unlistedCheck = nil seed0.seven.quantification.unlistedCheckPending = false seed0.seven.quantification.abundanceCaveat = nil +seed0.seven.quantification.appliedSumEscape = nil seed0.seven.csv-fnv = 5312e03b97452089 seed0.seven.rangeSensitivity.alternativeToKeV = 4053fdffd20951d7 79.968739041424996 seed0.seven.rangeSensitivity.moves: array 4 diff --git a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-weakline-sim.txt b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-weakline-sim.txt index fe62c64..7b2d858 100644 --- a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-weakline-sim.txt +++ b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-weakline-sim.txt @@ -212,6 +212,7 @@ level0.quantification.fitSettings.escapePeaks = true level0.quantification.fitSettings.referenceShapes.shapes: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 level0.quantification.fitSettings.method = .leastSquares level0.quantification.fitSettings.lineTail = nil +level0.quantification.sumEscapeCounts = nil level0.quantification.fitRange.fromKeV = 3fc999999999999a 0.20000000000000001 level0.quantification.fitRange.toKeV = 40340160bc0314bd 20.005382300140571 level0.quantification.fitRange.source = .defaultReach @@ -223,6 +224,7 @@ level0.quantification.rangeSensitivity = nil level0.quantification.unlistedCheck = nil level0.quantification.unlistedCheckPending = false level0.quantification.abundanceCaveat = nil +level0.quantification.appliedSumEscape = nil level0.csv-fnv = 7bdff3fd070201e7 level0.rangeSensitivity = nil level4.quantification.method.version = 1 @@ -438,6 +440,7 @@ level4.quantification.fitSettings.escapePeaks = true level4.quantification.fitSettings.referenceShapes.shapes: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 level4.quantification.fitSettings.method = .leastSquares level4.quantification.fitSettings.lineTail = nil +level4.quantification.sumEscapeCounts = nil level4.quantification.fitRange.fromKeV = 3fc999999999999a 0.20000000000000001 level4.quantification.fitRange.toKeV = 403404cb90bd12c4 20.018731161270594 level4.quantification.fitRange.source = .defaultReach @@ -449,5 +452,6 @@ level4.quantification.rangeSensitivity = nil level4.quantification.unlistedCheck = nil level4.quantification.unlistedCheckPending = false level4.quantification.abundanceCaveat = nil +level4.quantification.appliedSumEscape = nil level4.csv-fnv = a32acb6ac2acfd15 level4.rangeSensitivity = nil diff --git a/Tests/SpectroEDXTests/DemoEDXPoolTests.swift b/Tests/SpectroEDXTests/DemoEDXPoolTests.swift new file mode 100644 index 0000000..6ed4aa0 --- /dev/null +++ b/Tests/SpectroEDXTests/DemoEDXPoolTests.swift @@ -0,0 +1,266 @@ +import Foundation +import Testing +import SpectroTestSupport +import SpectroCore +import SpectroEDX + +/// The pooled quantification against PLANTED TRUTH ON SYNTHETIC DATA: five pools of the public AlMgSi demo set (mac4DSTEM `demo-edx`, +/// `tools/demo-edx/sim_edx.py` v2.0; `tools/edx-sim/demo_pools.py` wrote `edx-demo-pools.json`) and the kit's own +/// `eds-absorption-truth.json` pool. The truth is the simulation recipe, not a measurement, so every number here stays +/// `validation: "none"`. +/// +/// The generator plants what a real detector does and exSpy's line model leaves out: sum (pile-up) peaks whose parents lose the +/// photons, a 1.5 % Al K-alpha tail (0.12 keV), Si escape, Si internal fluorescence and stray Cu K. Each pool is fitted on the +/// generator's noise-free expected spectrum x100 (the fit's bias without noise) and, where said, on its Poisson counts. Setup as the +/// apps run it: true axis locked, the generator's true k typed (weight convention, relative to the first quantified element), the +/// truth geometry and thickness, absorption on. Cu and O are Fit only: the demo's Cu is a stray grid line (the test's choice). +/// +/// Si planted counts include the Si internal-fluorescence peak at the same energy (the kit's convention, `SpectroscopyAbsorptionTruthTests`). +/// +/// What the bounds are: MEASURED regression bounds on fixed inputs, not derived limits. The fit with the default sum peaks reads +/// noise-free Si K-alpha -0.0 to -4.0 % on the pools at up to 300 counts/px and -7.9 % on L5 (the highest rate, where the +/// generator's pile-up takes 11 % of the Al K-alpha photons); the bound is 5 % (10 % on L5). The fit without sum peaks read -8 to +/// -57 % on the same pools: the Al+Al sum peak (2.97 keV) pulls the continuum segment above the Al K edge and Si K-alpha with it. +struct DemoEDXPoolTests { + static let tables = try! QuantificationTables(directory: EDXFixtures.repoRoot.appendingPathComponent("Sources/SpectroEDX/Resources/Spectroscopy")) + + private struct Axis: Decodable { let offset: Double; let scale: Double } + private struct DemoPool: Decodable { + let name: String; let npix: Int + let thicknessNm: Double + let truthAt: [String: Double] + let axisTrue: Axis + let counts: [Int]; let expected: [Double]; let planted: [String: Double] + enum CodingKeys: String, CodingKey { + case name, npix, counts, expected, planted + case thicknessNm = "thickness_nm", truthAt = "truth_at", axisTrue = "axis_true" + } + } + private struct DemoDoc: Decodable { + let trueK: [String: Double]; let mass: [String: Double]; let pools: [DemoPool] + enum CodingKeys: String, CodingKey { case pools; case trueK = "true_k_counts_per_atom_nm2"; case mass = "atomic_mass" } + } + private static let demo = try! JSONDecoder().decode(DemoDoc.self, from: Data(contentsOf: EDXFixtures.url("edx-demo-pools.json"))) + + /// One pool in the form the tests use. + struct Case { + let name: String + let axis: EnergyAxis + let npix: Int + let thicknessNm: Double + let quantified: [String] + let trueK: [String: Double] + let expected: [Double] + let counts: [Int]? + /// Planted Mg K-alpha, Si K-alpha (+ internal fluorescence) and Cu K-alpha (stray + sample), counts; nil when not planted or not known. + let mg: Double, si: Double, cu: Double? + } + + static let cases: [Case] = { + var out: [Case] = demo.pools.map { p in + Case(name: p.name, axis: EnergyAxis(offset: p.axisTrue.offset, scale: p.axisTrue.scale, size: p.expected.count), npix: p.npix, + thicknessNm: p.thicknessNm, quantified: p.truthAt["Al"] == nil ? ["Mg", "Si"] : ["Al", "Mg", "Si"], trueK: demo.trueK, + expected: p.expected, counts: p.counts, mg: p.planted["Mg_Ka"]!, si: p.planted["Si_Ka"]! + p.planted["Si_Ka_internal"]!, + cu: p.planted["Cu_Ka"]! + p.planted["Cu_Ka_stray"]!) + } + let fx = EDXFixtures.jsonObject("eds-absorption-truth.json") + let e = fx["expected"] as! [Double] + let with = fx["areas_with_absorption"] as! [String: Double] + out.append(Case(name: "absorption-truth", axis: EnergyAxis(offset: fx["offset"] as! Double, scale: fx["scale"] as! Double, size: e.count), + npix: fx["npix"] as! Int, thicknessNm: fx["thickness_nm"] as! Double, quantified: ["Al", "Mg", "Si"], + trueK: fx["true_k_counts_per_atom_nm2"] as! [String: Double], expected: e, counts: nil, + mg: with["Mg_Ka"]!, si: with["Si_Ka"]! + (fx["area_si_ka_internal"] as! Double), cu: nil)) + return out + }() + + static func named(_ prefix: String) -> Case { cases.first { $0.name.hasPrefix(prefix) }! } + + static func input(_ c: Case, noiseFree: Bool, policy: QuantificationPolicy = .default) -> PooledQuantificationInput { + let counts = noiseFree ? c.expected.map { UInt64(($0 * 100).rounded()) } : c.counts!.map { UInt64($0) } + var m = QuantificationMethod() + var roles: [(String, QuantificationMethod.ElementRole)] = c.quantified.map { ($0, .quantify) } + if !c.quantified.contains("Al") { roles.append(("Al", .fitOnly)) } + roles += [("Cu", .fitOnly), ("O", .fitOnly)] + m.elements = roles.map { .init(symbol: $0.0, role: $0.1, isManual: false) } + m.beamEnergyKeV = 200 + m.lockEnergyAxis = true + m.kFactorSource = .typed + m.kSource = "demo generator true k (Gp x s x eps), weight convention"; m.kDate = "2026-10-31"; m.kReference = c.quantified[0] + let mass = demo.mass + let w = c.quantified.map { mass[$0]! / c.trueK[$0]! } + m.typedK = zip(c.quantified, w).map { .init(element: $0.0, k: $0.1 / w[0], relativeSigma: 0) } + m.thickness = .init(nanometres: c.thicknessNm, sigmaNanometres: 0) + m.absorptionCorrection = true + var meta = SpectrumImageMetadata(fileName: c.name, filePath: c.name, scanWidth: 1, scanHeight: 1, channelCount: counts.count, + energyOffsetEV: c.axis.offset * 1000, energyDispersionEV: c.axis.scale * 1000) + meta.origin = .veloxEMD + meta.alphaTiltDegrees = -16.87; meta.betaTiltDegrees = 0 + meta.detectors = zip([45.0, 135, 225, 315], [0.4, 0.2, 0.1, 0.3]).enumerated().map { i, a in + SpectrumDetectorSegment(name: "SuperXG1\(i + 1)", azimuthDegrees: a.0, elevationDegrees: 22, solidAngle: a.1) + } + return PooledQuantificationInput(counts: counts, axis: c.axis, method: m, metadata: meta, regionName: c.name, pixelCount: c.npix, + resolutionMnKaEV: 130, policy: policy) + } + + static var withoutSumPeaks: QuantificationPolicy { QuantificationPolicy(fit: .exspyEquivalent) } + + static func net(_ q: PooledQuantification, _ group: String) -> Double { q.fit.groupIDs.firstIndex(of: group).map { q.fit.values[$0] } ?? .nan } + static func say(_ s: String) { FileHandle.standardError.write(Data(("DEMO " + s + "\n").utf8)) } + + /// Red before sum peaks were the default: Si K-alpha read 8-57 % low noise-free. Now within 5 % (10 % at L5's rate), and the + /// footer names the decision with its number. + @Test(arguments: cases.map(\.name)) + func defaultFitRecoversSiKAlphaNoiseFree(_ name: String) throws { + let c = Self.named(name) + let q = try PooledQuantifier.run(Self.input(c, noiseFree: true), tables: Self.tables) + let off = try PooledQuantifier.run(Self.input(c, noiseFree: true, policy: Self.withoutSumPeaks), tables: Self.tables) + let si = Self.net(q, "Si_Ka") / 100 / c.si - 1, siOff = Self.net(off, "Si_Ka") / 100 / c.si - 1 + Self.say(String(format: "%@ Si %+.4f (without sum peaks %+.4f) | %@", name, si, siOff, q.footerLines.first { $0.hasPrefix("sum peaks") } ?? "-")) + #expect(abs(si) <= (name.hasPrefix("L5") ? 0.10 : 0.05), "\(name): Si K-alpha \(si)") + #expect(q.appliedSumEscape == SumEscapeModel(sumPeaks: true)) + #expect(q.footerLines.contains { $0.hasPrefix("sum peaks kept") }) + #expect(off.appliedSumEscape == nil) + #expect(off.footerLines.contains("policy (non-default): fit.sumPeaks = off")) + #expect(abs(si) < abs(siOff) || abs(siOff) < 0.01, "\(name): the default is not closer than the fit without sum peaks") + #expect(q.quality < off.quality, "\(name): the fit with sum peaks fits worse") + } + + /// Cu K-alpha at high rate: the fit without sum peaks held it at 0 (L6) or read 40 % of it (L5, L7), noise-free; the default + /// reads 92-97 %. At the map pools' low rate both fits read it within 5 %. + @Test func cuKAlphaIsRecoveredAtHighRate() throws { + for c in Self.cases where c.cu != nil { + let q = try PooledQuantifier.run(Self.input(c, noiseFree: true), tables: Self.tables) + let off = try PooledQuantifier.run(Self.input(c, noiseFree: true, policy: Self.withoutSumPeaks), tables: Self.tables) + let cu = Self.net(q, "Cu_Ka") / 100 / c.cu!, cuOff = Self.net(off, "Cu_Ka") / 100 / c.cu! + Self.say(String(format: "%@ Cu read %.3f of planted (without sum peaks %.3f)", c.name, cu, cuOff)) + if c.name.hasPrefix("L") { + #expect(cu >= 0.85, "\(c.name): Cu \(cu)") + #expect(cuOff <= 0.45, "\(c.name): without sum peaks Cu \(cuOff)") + } else { + #expect(abs(cu - 1) <= 0.05 && abs(cuOff - 1) <= 0.05, "\(c.name): Cu \(cu), without sum peaks \(cuOff)") + } + } + // On the Poisson counts of L6 (300 counts/px): 123 counts of stray Cu above the window background. + let l6 = Self.named("L6") + let q = try PooledQuantifier.run(Self.input(l6, noiseFree: false), tables: Self.tables) + let off = try PooledQuantifier.run(Self.input(l6, noiseFree: false, policy: Self.withoutSumPeaks), tables: Self.tables) + #expect(Self.net(q, "Cu_Ka") / l6.cu! >= 0.85) + #expect(Self.net(off, "Cu_Ka") / l6.cu! <= 0.05) + } + + /// The Poisson counts of every demo pool: the fit without sum peaks has a reduced chi2 of 2.1-31; with them 0.7-1.1. + @Test func reducedChiSquareOnThePoissonCounts() throws { + for c in Self.cases where c.counts != nil { + let q = try PooledQuantifier.run(Self.input(c, noiseFree: false), tables: Self.tables) + let off = try PooledQuantifier.run(Self.input(c, noiseFree: false, policy: Self.withoutSumPeaks), tables: Self.tables) + Self.say(String(format: "%@ chi2_red %.3f (without sum peaks %.3f) | %@", c.name, q.quality, off.quality, + q.footerLines.first { $0.hasPrefix("sum peaks") } ?? "-")) + #expect(q.appliedSumEscape == SumEscapeModel(sumPeaks: true), "\(c.name): the self pair did not pass on the Poisson counts") + #expect(q.quality <= 1.2, "\(c.name): \(q.quality)") + #expect(off.quality >= 2, "\(c.name): \(off.quality)") + } + } + + /// The Al K-alpha tail is a detector calibration, not part of the default. Measured once on a high-count spectrum of the same + /// detector (the absorption-truth pool, 1e4 px) with `TailEstimate`, then typed into `FitPolicy.lineTail`, it takes the noise-free + /// Mg K-alpha bias next to Al K-alpha (-22 % on L5, -32 % on recipe A, -45 % on the matrix map) to within 5 % on L5 and recipe A, + /// and to -15 % on the matrix map (which + /// pools seven recipes and thicknesses; not explained). Without it the default fit leaves Mg where it was (the tail is not a sum peak). + @Test func aCalibratedTailTakesTheMgBiasOut() throws { + let fx = Self.named("absorption-truth") + var s = FitSettings.standard(elements: ["Al", "Mg", "Si", "Cu", "O"], axis: fx.axis, resolutionMnKaEV: 130, beamEnergy: 200) + s.method = .leastSquares + let tail = try TailEstimate.measure(counts: fx.expected.map { $0.rounded() }, axis: fx.axis, settings: s, elements: ["Al", "Mg", "Si", "Cu", "O"]).tail + Self.say(String(format: "tail measured on the absorption-truth pool: f %.4f, slope %.3f keV (planted 0.015, 0.12)", tail.fraction, tail.slopeKeV)) + #expect(tail.fraction > 0.005 && tail.fraction < 0.02) + var calibrated = QuantificationPolicy.default + calibrated.fit.lineTail = tail + for (name, bound) in [("L5", 0.05), ("L6", 0.05), ("L7", 0.05), ("M_A", 0.05), ("M_matrix", 0.16)] { + let c = Self.named(name) + let q = try PooledQuantifier.run(Self.input(c, noiseFree: true, policy: calibrated), tables: Self.tables) + let plain = try PooledQuantifier.run(Self.input(c, noiseFree: true), tables: Self.tables) + let off = try PooledQuantifier.run(Self.input(c, noiseFree: true, policy: Self.withoutSumPeaks), tables: Self.tables) + let mg = Self.net(q, "Mg_Ka") / 100 / c.mg - 1, mgPlain = Self.net(plain, "Mg_Ka") / 100 / c.mg - 1 + let mgOff = Self.net(off, "Mg_Ka") / 100 / c.mg - 1 + Self.say(String(format: "%@ Mg with the calibrated tail %+.4f, default %+.4f, without sum peaks %+.4f", name, mg, mgPlain, mgOff)) + #expect(abs(mg) <= bound, "\(name): Mg \(mg)") + #expect(abs(mgPlain - mgOff) <= 0.03, "\(name): sum peaks moved Mg from \(mgOff) to \(mgPlain)") + } + } + + /// The unlisted-line check on the Poisson counts of the Al-rich pools: without sum peaks the Al+Al sum (2.973 keV) is left in + /// the residual (Ar K-alpha 2.957 keV, Ag L-alpha 2.984 keV); with the default it is a modelled sum peak, explained to the proposer, + /// and neither Ar nor Ag is named. + @Test(arguments: ["L5", "M_A", "M_matrix"]) + func theAlAlSumIsNotNamedAsArOrAg(_ name: String) throws { + let c = Self.named(name) + let input = Self.input(c, noiseFree: false) + let q = try PooledQuantifier.run(input, tables: Self.tables) + let proposal = try UnlistedLineChecker.propose(counts: input.counts.map { Double($0) }, quantification: q) + let check = UnlistedLineChecker.check(proposal: proposal, input: input, quantification: q) + Self.say("\(name) unlisted check, default: \(check.summary)") + #expect(!check.names.contains("Ar") && !check.names.contains("Ag"), "\(name): \(check.summary)") + // The other side of the same coin: a real Ar or Ag line there would be read as pile-up, and the result says so. + #expect(q.warnings.contains { $0.contains("Ar_Ka") && $0.contains("read as pile-up") }, "\(name): \(q.warnings)") + #expect(q.footerLines.contains { $0.contains("Ar_Ka") }, "\(name): \(q.footerLines)") + } + + /// `.off` is the fit as it ran before, bit for bit: the same as a caller's explicit `SumEscapeModel()` (both off). + @Test func theSwitchGivesTheFitWithoutSumPeaksBitForBit() throws { + let c = Self.named("L6") + let off = try PooledQuantifier.run(Self.input(c, noiseFree: false, policy: Self.withoutSumPeaks), tables: Self.tables) + var explicit = Self.input(c, noiseFree: false) + explicit.sumEscape = SumEscapeModel() + let e = try PooledQuantifier.run(explicit, tables: Self.tables) + #expect(off.fit.values == e.fit.values) + #expect(off.fit.model == e.fit.model) + #expect(off.rows == e.rows) + #expect(FitPolicy.exspyEquivalent.sumPeaks == .off) + #expect(FitPolicy.default.sumPeaks == .whenSignificant) + } + + /// A policy stored before `sumPeaks` existed reads `.off` (the fit it was stored with); the new fields round-trip. + @Test func aStoredPolicyWithoutTheFieldReadsOff() throws { + var o = try #require(try JSONSerialization.jsonObject(with: Data(QuantificationPolicy.default.canonicalJSON.utf8)) as? [String: Any]) + var fit = try #require(o["fit"] as? [String: Any]) + #expect(fit["sumPeaks"] as? String == "whenSignificant") + fit.removeValue(forKey: "sumPeaks"); fit.removeValue(forKey: "sumPeakSignificance") + o["fit"] = fit + let old = try JSONDecoder().decode(QuantificationPolicy.self, from: JSONSerialization.data(withJSONObject: o)) + #expect(old.fit.sumPeaks == .off) + #expect(old.fit.sumPeakSignificance == 3) + var p = QuantificationPolicy.default + p.fit.sumPeaks = .always; p.fit.sumPeakSignificance = 5 + #expect(try JSONDecoder().decode(QuantificationPolicy.self, from: Data(p.canonicalJSON.utf8)) == p) + p.fit.sumPeakSignificance = -1 + #expect(p.problem != nil) + } + + /// No pile-up planted (`eds-unlisted-sim.json`, noise-free, the one such spectrum tested): the default keeps the fit without sum + /// peaks bit for bit, and says so. With Cu, Ga + /// and Ge left out of the list the four-parent model would keep c at 48 sigma (Ni K-alpha + O K-alpha lies on Cu K-alpha); the + /// self-pair test (Si + Si) reads 0, so nothing is kept. + @Test(arguments: [false, true]) + func noPileUpKeepsTheDefaultFit(incompleteList: Bool) throws { + let o = EDXFixtures.jsonObject("eds-unlisted-sim.json") + let e = o["expected"] as! [Double] + let axis = EnergyAxis(offset: o["offset"] as! Double, scale: o["scale"] as! Double, size: e.count) + var m = QuantificationMethod() + let listed = incompleteList ? ["O", "Si", "Ti", "Ni"] : ["O", "Si", "Ti", "Ni", "Ge", "Cu", "Ga"] + m.elements = listed.map { .init(symbol: $0, role: .quantify, isManual: false) } + m.beamEnergyKeV = 200 + m.absorptionCorrection = false + m.lockEnergyAxis = true + let meta = SpectrumImageMetadata(fileName: "eds-unlisted-sim.json", filePath: "", scanWidth: 1, scanHeight: 1, channelCount: e.count, + energyOffsetEV: axis.offset * 1000, energyDispersionEV: axis.scale * 1000) + var input = PooledQuantificationInput(counts: e.map { UInt64($0.rounded()) }, axis: axis, method: m, metadata: meta, + regionName: "synthetic", pixelCount: 1) + let q = try PooledQuantifier.run(input, tables: Self.tables) + input.policy = Self.withoutSumPeaks + let off = try PooledQuantifier.run(input, tables: Self.tables) + #expect(q.appliedSumEscape == nil) + #expect(q.fit.values == off.fit.values) + #expect(q.rows == off.rows) + #expect(q.footerLines.contains { $0.hasPrefix("sum peaks tested, not kept: Si_Ka + Si_Ka alone") }, "\(q.footerLines)") + } +} diff --git a/Tests/SpectroEDXTests/Fixtures/edx-demo-pools.json b/Tests/SpectroEDXTests/Fixtures/edx-demo-pools.json new file mode 100644 index 0000000..c89df08 --- /dev/null +++ b/Tests/SpectroEDXTests/Fixtures/edx-demo-pools.json @@ -0,0 +1 @@ +{"atomic_mass":{"Al":26.9815,"Mg":24.305,"Si":28.0855},"generator":"mac4DSTEM demo-edx, tools/demo-edx/sim_edx.py v2.0 (seed 42, ladder seed 52); truth is the simulation recipe","pools":[{"axis_true":{"offset":-0.478,"scale":0.005},"counts":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,2,1,3,0,4,0,3,4,0,0,4,2,2,3,2,3,3,2,4,6,1,5,6,3,5,4,3,6,1,7,4,2,4,5,9,4,13,9,11,8,4,6,5,7,7,12,9,8,4,12,5,17,18,11,18,13,7,8,10,8,8,15,12,11,11,8,5,11,9,7,8,9,9,7,8,6,10,3,6,6,8,10,8,5,7,11,8,15,5,7,5,13,7,7,3,7,4,8,10,5,6,8,9,3,4,4,5,5,7,3,8,4,7,3,5,8,10,12,10,11,7,9,7,5,6,5,10,8,13,5,5,6,5,8,5,2,5,8,7,9,9,6,7,6,2,8,6,6,4,4,6,11,2,8,3,6,9,4,11,9,8,6,10,6,7,1,7,5,5,12,8,8,6,5,5,6,7,6,6,5,7,6,6,2,4,1,8,7,3,7,6,7,5,11,8,9,9,9,9,13,16,10,14,17,10,7,9,9,10,12,7,9,8,15,12,10,17,5,12,11,8,5,6,6,7,14,7,10,20,21,30,39,55,51,82,136,153,202,275,372,449,524,617,726,784,920,976,1063,1089,1057,1051,1052,1018,901,772,704,638,539,467,340,266,181,148,117,84,75,52,42,33,25,24,11,12,8,5,6,7,3,6,6,5,2,5,3,6,5,6,6,3,6,3,11,10,8,7,11,10,6,19,17,8,9,7,10,13,10,13,4,6,4,6,5,3,5,4,3,7,5,5,1,2,4,3,2,6,3,4,3,6,3,6,4,5,5,2,2,2,3,3,4,5,2,3,7,2,3,4,1,2,1,1,2,5,4,3,5,3,2,2,1,3,3,2,5,1,3,3,1,2,5,5,1,4,2,3,0,1,3,6,2,2,4,3,3,2,3,1,2,2,5,5,6,4,4,1,2,2,4,5,7,2,1,2,3,5,2,0,2,1,1,4,1,2,1,1,0,0,1,3,7,2,6,2,3,3,2,0,1,2,0,6,4,2,2,0,3,1,4,3,3,3,2,2,2,3,3,5,3,2,3,2,2,6,5,5,9,1,6,4,2,4,7,4,4,4,2,1,2,2,2,1,4,1,2,4,1,0,3,1,3,4,6,0,5,5,3,5,4,1,3,4,2,4,1,2,3,3,3,2,1,3,3,2,4,1,3,3,2,0,3,4,6,4,3,3,2,0,3,3,3,3,6,6,5,5,4,7,9,9,14,20,27,24,33,30,28,39,37,55,63,69,61,87,109,99,78,99,81,91,97,87,70,74,67,55,66,55,40,35,21,25,24,18,10,10,6,4,6,3,7,3,5,2,2,2,3,3,1,0,3,8,4,1,2,3,3,3,0,3,1,4,2,2,2,3,2,3,3,3,4,4,5,4,7,1,4,2,2,4,2,3,1,3,0,4,0,0,3,0,4,2,1,4,1,2,0,3,4,3,2,1,5,2,0,1,1,0,1,4,1,4,2,1,1,2,2,1,3,2,3,3,3,2,2,2,1,1,2,2,0,1,4,3,3,1,3,3,5,3,3,0,2,2,2,1,5,2,3,2,4,3,0,2,0,1,2,1,3,2,1,3,0,0,0,2,3,0,1,2,1,2,1,0,3,1,3,3,2,4,1,2,3,3,1,1,3,2,4,3,0,2,0,3,1,0,2,1,4,2,4,2,3,2,1,1,0,2,2,0,1,1,2,1,5,1,0,3,1,1,3,3,1,0,0,2,1,1,3,1,2,3,0,1,0,2,2,0,3,0,1,5,4,1,1,0,3,3,0,2,1,3,3,1,4,1,3,1,1,3,2,2,7,3,2,5,2,2,4,2,2,2,3,2,3,0,2,0,2,5,1,2,3,1,1,2,1,3,4,1,3,1,0,1,2,4,3,0,2,2,2,2,1,1,2,1,2,1,1,1,2,4,2,5,3,0,3,0,3,5,0,1,3,2,2,1,2,2,1,1,2,1,3,1,3,1,0,0,1,0,1,2,1,1,4,1,1,2,0,0,1,0,1,2,2,1,3,2,0,1,3,3,1,3,5,0,2,1,2,2,1,2,3,0,1,2,0,1,0,3,1,1,3,1,3,2,1,2,1,1,1,2,1,2,2,3,5,2,2,0,1,1,4,3,0,1,3,2,3,2,1,1,2,1,1,0,2,2,2,3,1,0,1,2,0,0,2,4,0,1,0,1,2,3,0,2,2,0,1,1,1,0,0,1,2,1,4,2,2,1,1,1,0,2,2,0,4,0,2,0,1,3,1,1,1,2,2,2,2,2,1,0,2,0,1,2,1,3,3,0,1,0,1,1,1,2,0,1,2,4,2,0,2,1,2,0,2,2,0,0,2,1,2,3,1,2,1,3,0,1,0,2,0,1,0,1,2,0,1,1,1,1,0,4,2,2,0,2,1,0,1,1,1,0,2,0,1,0,2,0,1,1,1,2,3,0,2,1,0,2,1,0,1,0,2,1,3,1,1,1,1,2,0,0,0,4,0,1,2,0,1,2,1,1,1,0,0,1,0,1,0,3,1,1,2,0,1,3,3,0,1,2,2,1,1,3,2,1,1,0,1,1,2,1,2,3,1,1,2,1,2,2,1,2,2,0,1,0,2,0,1,0,1,2,2,2,3,0,1,2,0,0,1,2,1,0,1,0,2,4,1,1,2,3,0,2,1,3,1,0,1,0,1,1,0,1,0,0,2,1,0,0,0,0,2,2,3,2,1,2,0,0,1,0,2,2,2,0,1,1,0,0,1,0,1,2,1,0,3,1,1,3,1,2,0,0,1,2,1,0,0,0,0,2,1,2,3,1,1,1,1,2,1,2,1,2,0,3,1,1,2,3,0,2,0,2,0,3,0,2,2,2,1,2,1,1,0,1,1,0,1,2,3,1,2,2,1,1,1,0,1,1,3,0,0,0,2,0,3,0,2,1,1,5,0,0,0,1,1,0,0,2,3,1,0,1,0,1,2,3,0,0,1,0,0,0,1,2,2,1,1,1,0,0,1,3,0,1,1,0,0,0,1,2,0,0,1,3,1,0,2,0,3,3,0,1,1,0,1,0,1,0,1,1,2,1,1,1,0,1,2,1,2,1,3,2,3,0,1,1,0,2,0,2,2,1,2,2,1,0,1,0,1,1,3,2,0,1,0,1,0,1,1,1,0,1,1,1,2,0,1,0,0,1,0,2,1,4,0,2,1,0,1,0,1,0,1,1,1,2,2,0,1,3,1,1,0,0,0,1,2,2,0,0,1,2,3,1,2,2,1,0,1,1,1,0,2,4,1,4,0,2,1,0,0,2,0,3,1,0,1,1,2,2,0,1,0,0,0,3,2,2,1,0,3,1,0,0,0,1,1,0,0,2,1,0,2,0,0,1,0,1,1,0,0,0,0,1,0,2,0,0,1,2,1,2,3,0,1,1,0,2,1,0,1,2,0,2,3,0,0,1,0,1,1,1,1,1,1,3,1,0,1,0,1,1,0,0,0,1,1,0,0,1,1,4,1,3,2,0,0,2,0,1,2,1,1,1,3,1,1,0,2,0,3,2,3,2,2,2,1,1,2,3,3,0,3,5,0,3,1,0,2,1,0,0,3,0,1,2,0,1,1,2,0,0,1,0,0,0,1,0,0,2,1,2,0,1,0,1,0,0,1,0,1,2,0,0,1,1,2,1,1,0,0,0,2,1,1,4,0,0,0,0,1,0,1,0,1,2,0,1,0,2,1,2,0,1,1,0,3,0,1,1,1,0,0,1,0,0,2,0,0,0,2,0,0,1,1,1,0,0,0,3,1,1,1,2,1,0,0,1,1,0,1,1,1,0,0,2,0,1,1,1,1,3,0,1,1,0,0,0,2,3,1,1,0,0,1,2,1,0,3,0,0,0,1,0,2,0,2,2,3,0,2,0,0,1,2,2,0,1,2,0,0,0,2,1,0,1,1,2,0,0,0,1,1,2,1,0,3,2,1,0,1,2,0,0,0,1,2,3,1,0,0,1,1,1,0,1,1,1,2,0,0,2,0,1,1,1,0,0,2,0,1,0,0,1,0,1,2,2,0,0,1,0,2,0,0,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,2,0,0,0,1,0,1,2,1,0,1,0,0,0,0,0,1,0,0,0,0,2,0,0,0,1,0,0,0,2,1,1,1,2,1,1,0,1,0,2,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,3,0,0,0,1,1,0,0,4,2,0,0,0,2,2,0,0,2,2,1,1,1,0,0,0,0,1,0,0,0,0,1,0,2,0,0,1,0,0,1,2,0,0,1,1,1,1,1,0,0,0,1,0,0,1,1,0,1,0,1,0,1,1,0,0,1,1,1,2,0,2,0,1,2,1,1,2,0,0,1,0,0,1,2,1,2,1,2,1,0,1,0,0,2,1,0,0,0,0,2,0,1,1,0,0,1,0,0,0,0,1,0,0,1,2,0,1,2,1,2,0,1,0,1,0,0,0,0,0,0,1,0,0,4,1,0,0,2,5,0,1,1,1,1,1,0,1,2,1,2,1,0,0,1,0,1,0,1,0,1,0,0,1,0,0,1,0,2,1,0,0,0,1,3,3,1,0,0,1,2,0,0,1,0,0,2,0,0,2,3,1,1,1,1,0,1,0,0,1,0,1,2,0,2,2,2,2,2,1,0,1,0,2,0,1,2,1,0,0,2,0,1,1,1,0,2,0,0,0,1,0,1,1,2,0,1,0,0,0,1,0,0,0,0,3,1,2,0,1,0,0,0,0,2,0,0,1,1,1,0,1,0,1,1,2,2,2,1,1,0,1,4,1,0,0,0,0,0,3,1,1,1,4,0,0,0,2,2,0,0,0,0,1,1,1,0,0,1,1,2,0,0,0,0,0,1,0,0,0,0,1,1,1,0,2,0,0,3,0,0,0,2,0,0,0,0,0,1,1,0,1,1,0,0,0,1,1,0,0,0,0,1,0,1,0,3,1,1,1,0,0,0,1,1,2,1,0,0,0,3,1,1,0,1,1,0,1,2,1,1,0,3,0,1,0,0,1,1,2,0,0,3,0,1,1,0,0,2,1,2,1,1,1,1,0,1,0,1,1,0,1,0,3,0,3,0,0,1,0,1,1,2,1,0,0,1,4,1,0,2,0,2,0,0,0,0,0,0,0,0,1,1,0,1,1,1,2,1,0,2,1,0,1,0,0,0,0,0,0,0,0,1,1,0,0,2,0,1,0,0,1,0,0,0,0,4,0,1,0,0,2,1,1,0,0,2,1,0,1,2,0,1,0,1,1,0,0,0,2,2,3,0,1,0,1,0,0,0,0,0,1,1,1,2,1,0,2,0,1,0,1,0,3,1,1,1,1,1,1,0,0,2,0,0,1,1,3,0,0,0,0,1,3,0,2,0,0,0,0,2,1,1,1,1,1,2,1,0,0,1,0,1,2,0,2,0,0,0,0,0,1,0,0,0,2,0,0,0,1,1,1,0,0,0,0,1,1,0,1,0,0,0,0,0,0,3,0,0,2,1,1,0,1,0,1,0,0,1,0,1,0,0,0,2,0,0,0,1,0,1,2,0,0,0,0,0,0,0,2,1,1,1,0,1,0,1,1,1,0,0,0,1,0,1,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0,1,2,0,0,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,0,2,1,0,0,0,0,0,0,1,0,0,1,0,0,2,2,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,3,0,0,1,1,1,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,1,1,0,0,0,0,0,1,0,1,2,1,1,0,0,0,0,0,0,2,3,0,2,1,0,0,1,0,0,1,2,1,2,0,0,1,1,0,0,2,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,2,0,1,0,0,0,0,1,1,0,1,0,0,2,2,1,1,0,2,0,0,2,0,2,0,1,0,0,1,0,0,0,0,1,1,0,1,1,0,1,0,1,2,0,1,2,1,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,1,1,1,0,0,1,1,2,2,0,0,0,1,1,0,0,1,1,0,1,2,0,0,0,0,1,0,0,0,0,1,1,2,0,1,0,0,1,0,0,0,0,2,1,1,0,0,0,0,0,0,0,2,0,0,0,0,1,1,1,2,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,1,0,0,1,0,0,2,1,1,0,1,2,0,0,1,0,1,0,2,0,0,1,0,0,1,0,0,1,0,2,0,0,2,1,0,0,1,1,0,0,2,0,1,0,1,1,0,1,0,1,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,3,1,0,1,0,1,0,0,2,1,0,1,0,1,0,0,1,0,0,2,1,0,1,1,0,1,0,0,1,0,2,0,1,0,2,0,0,1,0,0,0,0,0,1,1,1,0,0,0,0,3,0,2,0,1,0,0,0,0,0,1,2,0,0,1,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,2,0,0,0,0,0,1,0,0,1,0,1,2,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,1,2,0,0,0,0,1,2,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,2,0,0,1,0,0,0,0,1,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,2,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,1,3,1,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,1,1,1,0,0,1,1,0,0,0,0,1,0,1,0,0,0,2,0,0,0,1,1,0,2,2,0,0,1,1,0,1,0,0,0,1,0,1,0,0,0,1,1,1,0,0,0,3,3,0,0,0,1,1,2,1,0,0,0,0,1,0,0,0,0,0,1,0,1,1,0,0,0,1,2,0,1,0,0,1,0,0,0,0,1,2,0,0,1,0,0,2,0,0,1,1,0,0,0,0,1,0,0,1,0,0,1,0,1,0,1,0,0,0,0,2,0,0,0,0,0,1,0,1,2,0,0,1,1,0,0,1,0,1,1,0,1,1,1,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,1,1,0,1,1,1,0,1,1,0,2,0,0,0,0,0,1,0,0,2,0,0,1,1,1,0,0,0,0,0,2,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,1,1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,1,2,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,1,0,0,0,0,1,0,2,0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,2,0,0,0,1,2,1,0,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,2,0,1,0,0,3,0,0,0,1,0,1,1,1,1,0,0,0,0,1,0,0,0,1,2,0,0,0,2,0,0,0,1,0,2,0,0,2,1,0,0,2,0,1,1,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,3,0,1,2,1,0,0,1,0,0,0,0,0,1,2,0,0,2,0,1,1,0,0,0,2,1,0,0,0,0,0,2,1,2,0,1,0,1,1,0,1,2,0,0,1,0,0,2,0,0,2,0,0,0,0,0,2,0,0,0,1,0,1,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,1,0,2,1,0,0,1,1,2,0,1,0,0,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,1,1,0,0,2,1,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0],"expected":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0002,0.0004,0.0007,0.0014,0.0026,0.0046,0.0079,0.0129,0.0201,0.0302,0.0437,0.0615,0.084,0.1119,0.1458,0.1861,0.2333,0.2875,0.3492,0.4184,0.495,0.5792,0.6706,0.7691,0.8747,0.9866,1.1045,1.2284,1.3575,1.4911,1.6294,1.7715,1.9167,2.0647,2.2154,2.3677,2.5213,2.6759,2.8315,2.9869,3.142,3.2963,3.4502,3.6027,3.7534,3.9021,4.0491,4.1938,4.3359,4.4751,4.6113,4.7451,4.8756,5.0028,5.1266,5.2468,5.3641,5.478,5.5882,5.6949,5.7982,5.8985,5.9963,6.0921,6.1875,6.2848,6.3883,6.5044,6.6418,6.8124,7.031,7.314,7.6773,8.1333,8.686,9.327,10.0328,10.764,11.4675,12.0833,12.5529,12.8288,12.8837,12.7129,12.275,11.7536,11.1351,10.4806,9.8445,9.2689,8.7799,8.3882,8.0916,7.8791,7.7352,7.6437,7.5893,7.5597,7.5457,7.5408,7.5406,7.5425,7.545,7.5475,7.5492,7.5502,7.5501,7.5492,7.5473,7.5446,7.541,7.5366,7.5315,7.5256,7.519,7.5117,7.5037,7.4952,7.486,7.4762,7.4659,7.4552,7.4439,7.4322,7.42,7.4074,7.3944,7.381,7.3673,7.3532,7.3388,7.3242,7.3092,7.294,7.2786,7.2629,7.2471,7.231,7.2148,7.1983,7.1818,7.1651,7.1484,7.1315,7.1145,7.0975,7.0804,7.0632,7.0461,7.0289,7.0117,6.9945,6.9773,6.9602,6.9431,6.926,6.9091,6.8922,6.8754,6.8587,6.8421,6.8256,6.8093,6.7931,6.7771,6.7613,6.7457,6.7303,6.7151,6.7001,6.6854,6.6709,6.6567,6.6428,6.6291,6.6158,6.6029,6.5905,6.5785,6.567,6.5558,6.545,6.5347,6.5248,6.5153,6.5064,6.4979,6.49,6.4826,6.4758,6.4696,6.4639,6.459,6.4547,6.4511,6.4482,6.4462,6.4449,6.4444,6.4448,6.4462,6.4486,6.4522,6.4572,6.4638,6.4727,6.4844,6.5001,6.5215,6.5508,6.591,6.646,6.7206,6.8202,6.9508,7.1182,7.3275,7.5816,7.881,8.2224,8.5977,8.9946,9.3961,9.7824,10.1319,10.4237,10.64,10.7681,10.8019,10.7428,10.5997,10.3874,10.1253,9.8348,9.5371,9.2513,8.9928,8.7726,8.5962,8.4617,8.3794,8.3403,8.3404,8.3762,8.4459,8.5516,8.7013,8.9129,9.2202,9.6809,10.3894,11.4932,13.2159,15.8834,19.9555,26.0565,35.0024,47.8147,65.7124,90.0723,122.3469,163.9351,216.0068,279.2907,353.848,438.8619,532.4811,631.7579,732.7122,830.5393,919.9581,995.669,1052.8706,1087.7646,1097.9771,1082.8299,1043.4196,982.4915,904.127,813.2955,715.3371,615.4506,518.2551,427.4709,345.7463,274.6286,214.6563,165.5384,126.3789,95.769,72.0267,54.5773,41.722,32.2691,25.313,20.1564,16.2865,13.3385,11.0618,9.2867,7.8986,6.8178,5.9865,5.3604,4.9046,4.5907,4.3966,4.3054,4.3059,4.3914,4.5591,4.8087,5.1408,5.5556,6.0504,6.6187,7.2486,7.922,8.6159,9.3006,9.9432,10.51,10.969,11.2929,11.4616,11.4644,11.3009,10.9816,10.526,9.9613,9.3195,8.6345,7.9391,7.2624,6.6286,6.0549,5.5523,5.1251,4.7724,4.4892,4.2674,4.0976,3.9699,3.8746,3.8032,3.7479,3.7024,3.6649,3.6322,3.6017,3.5726,3.5446,3.5176,3.4919,3.4679,3.4457,3.4257,3.4077,3.3919,3.378,3.3658,3.3552,3.3459,3.3376,3.3302,3.3233,3.3169,3.3109,3.305,3.2994,3.2939,3.2884,3.283,3.2776,3.2722,3.2668,3.2615,3.2561,3.2508,3.2455,3.2401,3.2348,3.2295,3.2242,3.2189,3.2135,3.2082,3.2029,3.1977,3.1924,3.1871,3.1818,3.1765,3.1713,3.1659,3.1606,3.1553,3.1499,3.1446,3.1393,3.134,3.1288,3.1235,3.1182,3.113,3.1077,3.1025,3.0972,3.092,3.0868,3.0816,3.0764,3.0712,3.0661,3.0609,3.0557,3.0506,3.0454,3.0403,3.0352,3.0301,3.025,3.0199,3.0148,3.0097,3.0047,2.9996,2.9945,2.9895,2.9845,2.9795,2.9744,2.9694,2.9645,2.9595,2.9545,2.9496,2.9446,2.9397,2.9348,2.9298,2.9249,2.92,2.9152,2.9103,2.9054,2.9006,2.8957,2.8909,2.8861,2.8813,2.8765,2.8717,2.8669,2.8622,2.8574,2.8527,2.848,2.8432,2.8385,2.8339,2.8292,2.8245,2.8199,2.8153,2.8107,2.8061,2.8015,2.797,2.7925,2.7879,2.7834,2.7789,2.7745,2.77,2.7655,2.761,2.7565,2.752,2.7475,2.743,2.7385,2.734,2.7295,2.725,2.7205,2.716,2.7115,2.707,2.7026,2.6982,2.6938,2.6895,2.6852,2.681,2.6769,2.673,2.6692,2.6658,2.6628,2.6603,2.6586,2.6578,2.6582,2.6603,2.6642,2.6705,2.6795,2.6917,2.7075,2.7271,2.7507,2.7783,2.8098,2.8448,2.8826,2.9222,2.9626,3.0024,3.04,3.074,3.1028,3.1251,3.1397,3.1457,3.1428,3.1309,3.1103,3.0819,3.0466,3.0059,2.9613,2.9145,2.8672,2.8209,2.7774,2.7383,2.7054,2.6807,2.6668,2.667,2.686,2.7303,2.8087,2.9332,3.1197,3.3888,3.7664,4.2847,4.9819,5.903,7.0982,8.6223,10.5324,12.8844,15.7296,19.1095,23.0508,27.5598,32.617,38.1731,44.1457,50.4186,56.8437,63.2443,69.4233,75.1717,80.2806,84.5531,87.8174,89.9379,90.8243,90.4385,88.7969,85.9695,82.0746,77.271,71.7468,65.7078,59.3642,52.9193,46.5589,40.4432,34.7015,29.4298,24.6903,20.5141,16.9045,13.8423,11.2914,9.2037,7.5246,6.1971,5.1651,4.3763,3.7835,3.3457,3.0284,2.8032,2.6475,2.5437,2.4786,2.4423,2.4278,2.4302,2.4463,2.4739,2.5113,2.5576,2.6116,2.6725,2.739,2.8098,2.8832,2.9571,3.0295,3.098,3.1601,3.2136,3.2564,3.2868,3.3033,3.3052,3.2923,3.2651,3.2244,3.1717,3.1089,3.0383,2.962,2.8826,2.8022,2.723,2.6466,2.5747,2.5082,2.4479,2.3941,2.3469,2.3062,2.2714,2.2422,2.218,2.1979,2.1816,2.1682,2.1574,2.1485,2.1412,2.1351,2.1299,2.1254,2.1214,2.1178,2.1145,2.1113,2.1084,2.1055,2.1027,2.1,2.0973,2.0946,2.092,2.0894,2.0868,2.0843,2.0817,2.0791,2.0765,2.0739,2.0712,2.0685,2.0658,2.0631,2.0603,2.0575,2.0546,2.0517,2.0488,2.0459,2.043,2.04,2.0371,2.0342,2.0313,2.0284,2.0256,2.0227,2.0199,2.0171,2.0144,2.0116,2.0089,2.0062,2.0035,2.0009,1.9983,1.9956,1.993,1.9904,1.9878,1.9852,1.9827,1.9801,1.9775,1.975,1.9724,1.9699,1.9673,1.9648,1.9623,1.9598,1.9573,1.9548,1.9523,1.9498,1.9473,1.9448,1.9423,1.9399,1.9374,1.9349,1.9325,1.93,1.9276,1.9251,1.9227,1.9203,1.9179,1.9155,1.913,1.9106,1.9082,1.9059,1.9035,1.9011,1.8987,1.8963,1.894,1.8916,1.8893,1.8869,1.8846,1.8822,1.8799,1.8776,1.8752,1.8729,1.8706,1.8683,1.866,1.8637,1.8614,1.8591,1.8568,1.8546,1.8523,1.85,1.8478,1.8455,1.8433,1.841,1.8388,1.8365,1.8343,1.8321,1.8299,1.8277,1.8254,1.8232,1.821,1.8188,1.8166,1.8145,1.8123,1.8101,1.8079,1.8058,1.8036,1.8014,1.7993,1.7971,1.795,1.7929,1.7907,1.7886,1.7865,1.7844,1.7822,1.7801,1.778,1.7759,1.7738,1.7717,1.7696,1.7676,1.7655,1.7634,1.7613,1.7593,1.7572,1.7552,1.7531,1.7511,1.749,1.747,1.7449,1.7429,1.7409,1.7389,1.7368,1.7348,1.7328,1.7308,1.7288,1.7268,1.7248,1.7228,1.7209,1.7189,1.7169,1.7149,1.713,1.711,1.7091,1.7071,1.7052,1.7032,1.7013,1.6993,1.6974,1.6955,1.6935,1.6916,1.6897,1.6878,1.6859,1.684,1.6821,1.6802,1.6783,1.6764,1.6745,1.6726,1.6708,1.6689,1.667,1.6652,1.6633,1.6614,1.6596,1.6577,1.6559,1.6541,1.6522,1.6504,1.6485,1.6467,1.6449,1.6431,1.6413,1.6395,1.6376,1.6358,1.634,1.6322,1.6305,1.6287,1.6269,1.6251,1.6233,1.6215,1.6198,1.618,1.6162,1.6145,1.6127,1.611,1.6092,1.6075,1.6057,1.604,1.6023,1.6005,1.5988,1.5971,1.5954,1.5936,1.5919,1.5902,1.5885,1.5868,1.5851,1.5834,1.5817,1.58,1.5783,1.5766,1.575,1.5733,1.5716,1.5699,1.5683,1.5666,1.565,1.5633,1.5616,1.56,1.5584,1.5567,1.5551,1.5534,1.5518,1.5502,1.5485,1.5469,1.5453,1.5437,1.5421,1.5404,1.5388,1.5372,1.5356,1.534,1.5324,1.5308,1.5293,1.5277,1.5261,1.5245,1.5229,1.5214,1.5198,1.5182,1.5166,1.5151,1.5135,1.512,1.5104,1.5089,1.5073,1.5058,1.5042,1.5027,1.5012,1.4996,1.4981,1.4966,1.4951,1.4935,1.492,1.4905,1.489,1.4875,1.486,1.4845,1.483,1.4815,1.48,1.4785,1.477,1.4755,1.474,1.4725,1.4711,1.4696,1.4681,1.4667,1.4652,1.4637,1.4623,1.4608,1.4594,1.4579,1.4564,1.455,1.4536,1.4521,1.4507,1.4492,1.4478,1.4464,1.4449,1.4435,1.4421,1.4407,1.4393,1.4378,1.4364,1.435,1.4336,1.4322,1.4308,1.4294,1.428,1.4266,1.4252,1.4238,1.4225,1.4211,1.4197,1.4183,1.4169,1.4156,1.4142,1.4128,1.4115,1.4101,1.4087,1.4074,1.406,1.4047,1.4033,1.402,1.4006,1.3993,1.3979,1.3966,1.3952,1.3939,1.3926,1.3913,1.3899,1.3886,1.3873,1.386,1.3846,1.3833,1.382,1.3807,1.3794,1.3781,1.3768,1.3755,1.3742,1.3729,1.3716,1.3703,1.369,1.3677,1.3664,1.3652,1.3639,1.3626,1.3613,1.3601,1.3588,1.3575,1.3562,1.355,1.3537,1.3525,1.3512,1.3499,1.3487,1.3474,1.3462,1.3449,1.3437,1.3425,1.3412,1.34,1.3387,1.3375,1.3363,1.3351,1.3338,1.3326,1.3314,1.3302,1.3289,1.3277,1.3265,1.3253,1.3241,1.3229,1.3217,1.3205,1.3193,1.3181,1.3169,1.3157,1.3145,1.3133,1.3121,1.3109,1.3097,1.3085,1.3074,1.3062,1.305,1.3038,1.3027,1.3015,1.3003,1.2991,1.298,1.2968,1.2957,1.2945,1.2933,1.2922,1.291,1.2899,1.2887,1.2876,1.2864,1.2853,1.2841,1.283,1.2819,1.2807,1.2796,1.2785,1.2773,1.2762,1.2751,1.274,1.2728,1.2717,1.2706,1.2695,1.2684,1.2672,1.2661,1.265,1.2639,1.2628,1.2617,1.2606,1.2595,1.2584,1.2573,1.2562,1.2551,1.254,1.2529,1.2519,1.2508,1.2497,1.2486,1.2475,1.2464,1.2454,1.2443,1.2432,1.2421,1.2411,1.24,1.2389,1.2379,1.2368,1.2357,1.2347,1.2336,1.2326,1.2315,1.2305,1.2294,1.2284,1.2273,1.2263,1.2252,1.2242,1.2231,1.2221,1.2211,1.22,1.219,1.218,1.2169,1.2159,1.2149,1.2139,1.2128,1.2118,1.2108,1.2098,1.2088,1.2077,1.2067,1.2057,1.2047,1.2037,1.2027,1.2017,1.2007,1.1997,1.1987,1.1977,1.1967,1.1957,1.1947,1.1937,1.1927,1.1917,1.1907,1.1897,1.1887,1.1878,1.1868,1.1858,1.1848,1.1839,1.1829,1.1819,1.181,1.18,1.179,1.1781,1.1772,1.1762,1.1753,1.1744,1.1734,1.1725,1.1717,1.1708,1.1699,1.169,1.1682,1.1673,1.1665,1.1657,1.1649,1.1641,1.1632,1.1624,1.1616,1.1608,1.16,1.1592,1.1584,1.1576,1.1567,1.1559,1.155,1.1541,1.1532,1.1523,1.1513,1.1504,1.1494,1.1484,1.1474,1.1463,1.1453,1.1442,1.1432,1.1421,1.1411,1.14,1.139,1.138,1.1369,1.1359,1.1349,1.1339,1.1329,1.1319,1.1309,1.13,1.129,1.1281,1.1272,1.1262,1.1253,1.1244,1.1235,1.1226,1.1217,1.1208,1.1199,1.119,1.1181,1.1173,1.1164,1.1155,1.1146,1.1138,1.1129,1.112,1.1112,1.1103,1.1094,1.1086,1.1077,1.1068,1.106,1.1051,1.1043,1.1034,1.1026,1.1017,1.1009,1.1,1.0992,1.0983,1.0975,1.0966,1.0958,1.0949,1.0941,1.0933,1.0924,1.0916,1.0907,1.0899,1.0891,1.0882,1.0874,1.0866,1.0857,1.0849,1.0841,1.0833,1.0824,1.0816,1.0808,1.08,1.0792,1.0783,1.0775,1.0767,1.0759,1.0751,1.0743,1.0735,1.0726,1.0718,1.071,1.0702,1.0694,1.0686,1.0678,1.067,1.0662,1.0654,1.0646,1.0638,1.063,1.0622,1.0614,1.0606,1.0598,1.059,1.0583,1.0575,1.0567,1.0559,1.0551,1.0543,1.0535,1.0528,1.052,1.0512,1.0504,1.0496,1.0489,1.0481,1.0473,1.0465,1.0458,1.045,1.0442,1.0435,1.0427,1.0419,1.0412,1.0404,1.0396,1.0389,1.0381,1.0374,1.0366,1.0358,1.0351,1.0343,1.0336,1.0328,1.0321,1.0313,1.0306,1.0298,1.0291,1.0284,1.0276,1.0269,1.0261,1.0254,1.0247,1.0239,1.0232,1.0225,1.0218,1.021,1.0203,1.0196,1.0189,1.0182,1.0174,1.0167,1.016,1.0153,1.0146,1.0139,1.0131,1.0124,1.0117,1.011,1.0103,1.0095,1.0088,1.0081,1.0074,1.0066,1.0059,1.0052,1.0045,1.0037,1.003,1.0023,1.0015,1.0008,1.0001,0.9994,0.9987,0.9979,0.9972,0.9965,0.9958,0.9951,0.9944,0.9937,0.993,0.9923,0.9916,0.9909,0.9902,0.9895,0.9888,0.9881,0.9874,0.9867,0.986,0.9853,0.9846,0.9839,0.9832,0.9826,0.9819,0.9812,0.9805,0.9798,0.9791,0.9785,0.9778,0.9771,0.9764,0.9758,0.9751,0.9744,0.9737,0.9731,0.9724,0.9717,0.971,0.9704,0.9697,0.969,0.9684,0.9677,0.967,0.9664,0.9657,0.9651,0.9644,0.9637,0.9631,0.9624,0.9618,0.9611,0.9604,0.9598,0.9591,0.9585,0.9578,0.9572,0.9565,0.9559,0.9552,0.9546,0.9539,0.9533,0.9526,0.952,0.9513,0.9507,0.9501,0.9494,0.9488,0.9481,0.9475,0.9469,0.9462,0.9456,0.9449,0.9443,0.9437,0.943,0.9424,0.9418,0.9411,0.9405,0.9399,0.9393,0.9386,0.938,0.9374,0.9368,0.9361,0.9355,0.9349,0.9343,0.9336,0.933,0.9324,0.9318,0.9312,0.9306,0.93,0.9294,0.9288,0.9282,0.9277,0.9272,0.9267,0.9262,0.9258,0.9255,0.9252,0.9251,0.9251,0.9253,0.9257,0.9264,0.9274,0.9288,0.9307,0.9332,0.9364,0.9404,0.9454,0.9515,0.9589,0.9678,0.9784,0.9908,1.0053,1.0221,1.0412,1.0631,1.0877,1.1151,1.1456,1.1791,1.2156,1.255,1.2971,1.3418,1.3888,1.4376,1.4879,1.539,1.5904,1.6415,1.6916,1.7399,1.7857,1.8283,1.867,1.901,1.9299,1.9531,1.9701,1.9807,1.9845,1.9817,1.9721,1.9559,1.9335,1.9053,1.8717,1.8333,1.7907,1.7447,1.696,1.6452,1.5932,1.5407,1.4882,1.4365,1.386,1.3373,1.2906,1.2465,1.205,1.1665,1.1309,1.0983,1.0687,1.042,1.0182,0.997,0.9784,0.962,0.9478,0.9355,0.925,0.916,0.9083,0.9018,0.8963,0.8917,0.8879,0.8846,0.8819,0.8796,0.8777,0.8761,0.8747,0.8735,0.8724,0.8715,0.8706,0.8699,0.8691,0.8685,0.8678,0.8672,0.8666,0.8661,0.8655,0.8649,0.8644,0.8638,0.8633,0.8628,0.8622,0.8617,0.8611,0.8606,0.8601,0.8596,0.859,0.8585,0.858,0.8574,0.8569,0.8564,0.8558,0.8553,0.8548,0.8543,0.8537,0.8532,0.8527,0.8522,0.8517,0.8511,0.8506,0.8501,0.8496,0.8491,0.8485,0.848,0.8475,0.847,0.8465,0.846,0.8454,0.8449,0.8444,0.8439,0.8434,0.8429,0.8424,0.8419,0.8413,0.8408,0.8403,0.8398,0.8393,0.8388,0.8383,0.8378,0.8373,0.8368,0.8363,0.8358,0.8353,0.8348,0.8343,0.8338,0.8333,0.8328,0.8323,0.8319,0.8314,0.8309,0.8305,0.8301,0.8297,0.8293,0.8289,0.8286,0.8283,0.8281,0.8279,0.8278,0.8278,0.8279,0.8281,0.8284,0.8289,0.8295,0.8304,0.8314,0.8327,0.8342,0.836,0.8382,0.8406,0.8433,0.8464,0.8499,0.8537,0.8578,0.8623,0.867,0.8721,0.8774,0.8829,0.8885,0.8942,0.9,0.9057,0.9113,0.9167,0.9219,0.9266,0.931,0.9348,0.938,0.9406,0.9425,0.9437,0.9441,0.9438,0.9427,0.9408,0.9382,0.9348,0.9308,0.9263,0.9212,0.9156,0.9096,0.9034,0.8969,0.8902,0.8835,0.8768,0.8702,0.8637,0.8574,0.8513,0.8455,0.84,0.8348,0.83,0.8255,0.8214,0.8176,0.8141,0.8109,0.8081,0.8055,0.8032,0.8011,0.7993,0.7976,0.7962,0.7948,0.7937,0.7926,0.7916,0.7908,0.79,0.7892,0.7886,0.7879,0.7873,0.7868,0.7862,0.7857,0.7852,0.7847,0.7842,0.7838,0.7833,0.7829,0.7824,0.7819,0.7815,0.781,0.7806,0.7802,0.7797,0.7793,0.7788,0.7784,0.778,0.7775,0.7771,0.7766,0.7762,0.7758,0.7753,0.7749,0.7745,0.774,0.7736,0.7731,0.7727,0.7723,0.7718,0.7714,0.771,0.7706,0.7701,0.7697,0.7693,0.7688,0.7684,0.768,0.7675,0.7671,0.7667,0.7663,0.7658,0.7654,0.765,0.7646,0.7641,0.7637,0.7633,0.7629,0.7624,0.762,0.7616,0.7612,0.7608,0.7603,0.7599,0.7595,0.7591,0.7587,0.7582,0.7578,0.7574,0.757,0.7566,0.7562,0.7557,0.7553,0.7549,0.7545,0.7541,0.7537,0.7532,0.7528,0.7524,0.752,0.7516,0.7512,0.7508,0.7504,0.75,0.7495,0.7491,0.7487,0.7483,0.7479,0.7475,0.7471,0.7467,0.7463,0.7459,0.7455,0.7451,0.7447,0.7443,0.7439,0.7435,0.7431,0.7427,0.7422,0.7418,0.7414,0.741,0.7406,0.7402,0.7398,0.7394,0.739,0.7386,0.7383,0.7379,0.7375,0.7371,0.7367,0.7363,0.7359,0.7355,0.7351,0.7347,0.7343,0.7339,0.7335,0.7331,0.7327,0.7323,0.7319,0.7315,0.7312,0.7308,0.7304,0.73,0.7296,0.7292,0.7288,0.7284,0.728,0.7277,0.7273,0.7269,0.7265,0.7261,0.7257,0.7253,0.725,0.7246,0.7242,0.7238,0.7234,0.723,0.7227,0.7223,0.7219,0.7215,0.7211,0.7208,0.7204,0.72,0.7196,0.7192,0.7189,0.7185,0.7181,0.7177,0.7174,0.717,0.7166,0.7162,0.7159,0.7155,0.7151,0.7147,0.7144,0.714,0.7136,0.7132,0.7129,0.7125,0.7121,0.7117,0.7114,0.711,0.7106,0.7103,0.7099,0.7095,0.7092,0.7088,0.7084,0.7081,0.7077,0.7073,0.707,0.7066,0.7062,0.7059,0.7055,0.7051,0.7048,0.7044,0.704,0.7037,0.7033,0.7029,0.7026,0.7022,0.7019,0.7015,0.7011,0.7008,0.7004,0.7001,0.6997,0.6993,0.699,0.6986,0.6983,0.6979,0.6975,0.6972,0.6968,0.6965,0.6961,0.6958,0.6954,0.6951,0.6947,0.6943,0.694,0.6936,0.6933,0.6929,0.6926,0.6922,0.6919,0.6915,0.6912,0.6908,0.6905,0.6901,0.6898,0.6894,0.6891,0.6887,0.6884,0.688,0.6877,0.6873,0.687,0.6866,0.6863,0.6859,0.6856,0.6853,0.6849,0.6846,0.6842,0.6839,0.6835,0.6832,0.6828,0.6825,0.6822,0.6818,0.6815,0.6811,0.6808,0.6804,0.6801,0.6798,0.6794,0.6791,0.6787,0.6784,0.6781,0.6777,0.6774,0.6771,0.6767,0.6764,0.676,0.6757,0.6754,0.675,0.6747,0.6744,0.674,0.6737,0.6734,0.673,0.6727,0.6724,0.672,0.6717,0.6714,0.671,0.6707,0.6704,0.67,0.6697,0.6694,0.669,0.6687,0.6684,0.6681,0.6677,0.6674,0.6671,0.6667,0.6664,0.6661,0.6658,0.6654,0.6651,0.6648,0.6644,0.6641,0.6638,0.6635,0.6631,0.6628,0.6625,0.6622,0.6619,0.6615,0.6612,0.6609,0.6606,0.6602,0.6599,0.6596,0.6593,0.659,0.6586,0.6583,0.658,0.6577,0.6574,0.657,0.6567,0.6564,0.6561,0.6558,0.6554,0.6551,0.6548,0.6545,0.6542,0.6539,0.6535,0.6532,0.6529,0.6526,0.6523,0.652,0.6516,0.6513,0.651,0.6507,0.6504,0.6501,0.6498,0.6495,0.6491,0.6488,0.6485,0.6482,0.6479,0.6476,0.6473,0.647,0.6467,0.6463,0.646,0.6457,0.6454,0.6451,0.6448,0.6445,0.6442,0.6439,0.6436,0.6433,0.643,0.6427,0.6424,0.642,0.6417,0.6414,0.6411,0.6408,0.6405,0.6402,0.6399,0.6396,0.6393,0.639,0.6387,0.6384,0.6381,0.6378,0.6375,0.6372,0.6369,0.6366,0.6363,0.636,0.6357,0.6354,0.6351,0.6348,0.6345,0.6342,0.6339,0.6336,0.6333,0.633,0.6327,0.6324,0.6321,0.6318,0.6315,0.6312,0.6309,0.6306,0.6303,0.63,0.6297,0.6294,0.6292,0.6289,0.6286,0.6283,0.628,0.6277,0.6274,0.6271,0.6268,0.6265,0.6262,0.6259,0.6256,0.6254,0.6251,0.6248,0.6245,0.6242,0.6239,0.6236,0.6233,0.623,0.6227,0.6225,0.6222,0.6219,0.6216,0.6213,0.621,0.6207,0.6204,0.6202,0.6199,0.6196,0.6193,0.619,0.6187,0.6184,0.6182,0.6179,0.6176,0.6173,0.617,0.6167,0.6165,0.6162,0.6159,0.6156,0.6153,0.615,0.6148,0.6145,0.6142,0.6139,0.6136,0.6134,0.6131,0.6128,0.6125,0.6122,0.612,0.6117,0.6114,0.6111,0.6108,0.6106,0.6103,0.61,0.6097,0.6095,0.6092,0.6089,0.6086,0.6084,0.6081,0.6078,0.6075,0.6073,0.607,0.6067,0.6064,0.6062,0.6059,0.6056,0.6053,0.6051,0.6048,0.6045,0.6042,0.604,0.6037,0.6034,0.6031,0.6029,0.6026,0.6023,0.6021,0.6018,0.6015,0.6013,0.601,0.6007,0.6004,0.6002,0.5999,0.5996,0.5994,0.5991,0.5988,0.5986,0.5983,0.598,0.5978,0.5975,0.5972,0.597,0.5967,0.5964,0.5962,0.5959,0.5956,0.5954,0.5951,0.5948,0.5946,0.5943,0.594,0.5938,0.5935,0.5932,0.593,0.5927,0.5925,0.5922,0.5919,0.5917,0.5914,0.5911,0.5909,0.5906,0.5904,0.5901,0.5898,0.5896,0.5893,0.5891,0.5888,0.5885,0.5883,0.588,0.5878,0.5875,0.5872,0.587,0.5867,0.5865,0.5862,0.586,0.5857,0.5854,0.5852,0.5849,0.5847,0.5844,0.5842,0.5839,0.5836,0.5834,0.5831,0.5829,0.5826,0.5824,0.5821,0.5819,0.5816,0.5814,0.5811,0.5809,0.5806,0.5803,0.5801,0.5798,0.5796,0.5793,0.5791,0.5788,0.5786,0.5783,0.5781,0.5778,0.5776,0.5773,0.5771,0.5768,0.5766,0.5763,0.5761,0.5758,0.5756,0.5753,0.5751,0.5748,0.5746,0.5743,0.5741,0.5738,0.5736,0.5733,0.5731,0.5728,0.5726,0.5724,0.5721,0.5719,0.5716,0.5714,0.5711,0.5709,0.5706,0.5704,0.5701,0.5699,0.5697,0.5694,0.5692,0.5689,0.5687,0.5684,0.5682,0.568,0.5677,0.5675,0.5672,0.567,0.5667,0.5665,0.5663,0.566,0.5658,0.5655,0.5653,0.565,0.5648,0.5646,0.5643,0.5641,0.5638,0.5636,0.5634,0.5631,0.5629,0.5627,0.5624,0.5622,0.5619,0.5617,0.5615,0.5612,0.561,0.5607,0.5605,0.5603,0.56,0.5598,0.5596,0.5593,0.5591,0.5589,0.5586,0.5584,0.5581,0.5579,0.5577,0.5574,0.5572,0.557,0.5567,0.5565,0.5563,0.556,0.5558,0.5556,0.5553,0.5551,0.5549,0.5546,0.5544,0.5542,0.5539,0.5537,0.5535,0.5532,0.553,0.5528,0.5526,0.5523,0.5521,0.5519,0.5516,0.5514,0.5512,0.5509,0.5507,0.5505,0.5502,0.55,0.5498,0.5496,0.5493,0.5491,0.5489,0.5486,0.5484,0.5482,0.548,0.5477,0.5475,0.5473,0.5471,0.5468,0.5466,0.5464,0.5461,0.5459,0.5457,0.5455,0.5452,0.545,0.5448,0.5446,0.5443,0.5441,0.5439,0.5437,0.5434,0.5432,0.543,0.5428,0.5426,0.5423,0.5421,0.5419,0.5417,0.5414,0.5412,0.541,0.5408,0.5405,0.5403,0.5401,0.5399,0.5397,0.5394,0.5392,0.539,0.5388,0.5386,0.5383,0.5381,0.5379,0.5377,0.5375,0.5372,0.537,0.5368,0.5366,0.5364,0.5361,0.5359,0.5357,0.5355,0.5353,0.535,0.5348,0.5346,0.5344,0.5342,0.534,0.5337,0.5335,0.5333,0.5331,0.5329,0.5327,0.5324,0.5322,0.532,0.5318,0.5316,0.5314,0.5311,0.5309,0.5307,0.5305,0.5303,0.5301,0.5299,0.5296,0.5294,0.5292,0.529,0.5288,0.5286,0.5284,0.5281,0.5279,0.5277,0.5275,0.5273,0.5271,0.5269,0.5267,0.5264,0.5262,0.526,0.5258,0.5256,0.5254,0.5252,0.525,0.5248,0.5245,0.5243,0.5241,0.5239,0.5237,0.5235,0.5233,0.5231,0.5229,0.5227,0.5224,0.5222,0.522,0.5218,0.5216,0.5214,0.5212,0.521,0.5208,0.5206,0.5204,0.5202,0.5199,0.5197,0.5195,0.5193,0.5191,0.5189,0.5187,0.5185,0.5183,0.5181,0.5179,0.5177,0.5175,0.5173,0.5171,0.5168,0.5166,0.5164,0.5162,0.516,0.5158,0.5156,0.5154,0.5152,0.515,0.5148,0.5146,0.5144,0.5142,0.514,0.5138,0.5136,0.5134,0.5132,0.513,0.5128,0.5126,0.5124,0.5122,0.512,0.5118,0.5116,0.5114,0.5111,0.5109,0.5107,0.5105,0.5103,0.5101,0.5099,0.5097,0.5095,0.5093,0.5091,0.5089,0.5087,0.5085,0.5083,0.5081,0.5079,0.5077,0.5075,0.5073,0.5071,0.5069,0.5067,0.5065,0.5063,0.5061,0.506,0.5058,0.5056,0.5054,0.5052,0.505,0.5048,0.5046,0.5044,0.5042,0.504,0.5038,0.5036,0.5034,0.5032,0.503,0.5028,0.5026,0.5024,0.5022,0.502,0.5018,0.5016,0.5014,0.5012,0.501,0.5008,0.5006,0.5004,0.5003,0.5001,0.4999,0.4997,0.4995,0.4993,0.4991,0.4989,0.4987,0.4985,0.4983,0.4981,0.4979,0.4977,0.4975,0.4973,0.4972,0.497,0.4968,0.4966,0.4964,0.4962,0.496,0.4958,0.4956,0.4954,0.4952,0.495,0.4948,0.4947,0.4945,0.4943,0.4941,0.4939,0.4937,0.4935,0.4933,0.4931,0.4929,0.4928,0.4926,0.4924,0.4922,0.492,0.4918,0.4916,0.4914,0.4912,0.491,0.4909,0.4907,0.4905,0.4903,0.4901,0.4899,0.4897,0.4895,0.4893,0.4892,0.489,0.4888,0.4886,0.4884,0.4882,0.488,0.4878,0.4877,0.4875,0.4873,0.4871,0.4869,0.4867,0.4865,0.4863,0.4862,0.486,0.4858,0.4856,0.4854,0.4852,0.485,0.4849,0.4847,0.4845,0.4843,0.4841,0.4839,0.4837,0.4836,0.4834,0.4832,0.483,0.4828,0.4826,0.4825,0.4823,0.4821,0.4819,0.4817,0.4815,0.4814,0.4812,0.481,0.4808,0.4806,0.4804,0.4803,0.4801,0.4799,0.4797,0.4795,0.4793,0.4792,0.479,0.4788,0.4786,0.4784,0.4782,0.4781,0.4779,0.4777,0.4775,0.4773,0.4772,0.477,0.4768,0.4766,0.4764,0.4762,0.4761,0.4759,0.4757,0.4755,0.4753,0.4752,0.475,0.4748,0.4746,0.4744,0.4743,0.4741,0.4739,0.4737,0.4735,0.4734,0.4732,0.473,0.4728,0.4726,0.4725,0.4723,0.4721,0.4719,0.4718,0.4716,0.4714,0.4712,0.471,0.4709,0.4707,0.4705,0.4703,0.4701,0.47,0.4698,0.4696,0.4694,0.4693,0.4691,0.4689,0.4687,0.4686,0.4684,0.4682,0.468,0.4678,0.4677,0.4675,0.4673,0.4671,0.467,0.4668,0.4666,0.4664,0.4663,0.4661,0.4659,0.4657,0.4656,0.4654,0.4652,0.465,0.4648,0.4647,0.4645,0.4643,0.4641,0.464,0.4638,0.4636,0.4634,0.4633,0.4631,0.4629,0.4628,0.4626,0.4624,0.4622,0.4621,0.4619,0.4617,0.4615,0.4614,0.4612,0.461,0.4608,0.4607,0.4605,0.4603,0.4601,0.46,0.4598,0.4596,0.4595,0.4593,0.4591,0.4589,0.4588,0.4586,0.4584,0.4582,0.4581,0.4579,0.4577,0.4576,0.4574,0.4572,0.457,0.4569,0.4567,0.4565,0.4564,0.4562,0.456,0.4558,0.4557,0.4555,0.4553,0.4552,0.455,0.4548,0.4546,0.4545,0.4543,0.4541,0.454,0.4538,0.4536,0.4534,0.4533,0.4531,0.4529,0.4528,0.4526,0.4524,0.4523,0.4521,0.4519,0.4517,0.4516,0.4514,0.4512,0.4511,0.4509,0.4507,0.4506,0.4504,0.4502,0.4501,0.4499,0.4497,0.4495,0.4494,0.4492,0.449,0.4489,0.4487,0.4485,0.4484,0.4482,0.448,0.4479,0.4477,0.4475,0.4474,0.4472,0.447,0.4469,0.4467,0.4465,0.4464,0.4462,0.446,0.4459,0.4457,0.4455,0.4454,0.4452,0.445,0.4449,0.4447,0.4445,0.4444,0.4442,0.444,0.4439,0.4437,0.4435,0.4434,0.4432,0.443,0.4429,0.4427,0.4425,0.4424,0.4422,0.442,0.4419,0.4417,0.4415,0.4414,0.4412,0.441,0.4409,0.4407,0.4405,0.4404,0.4402,0.44,0.4399,0.4397,0.4395,0.4394,0.4392,0.439,0.4389,0.4387,0.4386,0.4384,0.4382,0.4381,0.4379,0.4377,0.4376,0.4374,0.4372,0.4371,0.4369,0.4367,0.4366,0.4364,0.4363,0.4361,0.4359,0.4358,0.4356,0.4354,0.4353,0.4351,0.4349,0.4348,0.4346,0.4345,0.4343,0.4341,0.434,0.4338,0.4336,0.4335,0.4333,0.4331,0.433,0.4328,0.4327,0.4325,0.4323,0.4322,0.432,0.4318,0.4317,0.4315,0.4314,0.4312,0.431,0.4309,0.4307,0.4305,0.4304,0.4302,0.4301,0.4299,0.4297,0.4296,0.4294,0.4293,0.4291,0.4289,0.4288,0.4286,0.4284,0.4283,0.4281,0.428,0.4278,0.4276,0.4275,0.4273,0.4272,0.427,0.4268,0.4267,0.4265,0.4264,0.4262,0.426,0.4259,0.4257,0.4256,0.4254,0.4252,0.4251,0.4249,0.4247,0.4246,0.4244,0.4243,0.4241,0.4239,0.4238,0.4236,0.4235,0.4233,0.4231,0.423,0.4228,0.4227,0.4225,0.4223,0.4222,0.422,0.4219,0.4217,0.4216,0.4214,0.4212,0.4211,0.4209,0.4208,0.4206,0.4204,0.4203,0.4201,0.42,0.4198,0.4196,0.4195,0.4193,0.4192,0.419,0.4188,0.4187,0.4185,0.4184,0.4182,0.4181,0.4179,0.4177,0.4176,0.4174,0.4173,0.4171,0.4169,0.4168,0.4166,0.4165,0.4163,0.4162,0.416,0.4158,0.4157,0.4155,0.4154,0.4152,0.4151,0.4149,0.4147,0.4146,0.4144,0.4143,0.4141,0.4139,0.4138,0.4136,0.4135,0.4133,0.4132,0.413,0.4128,0.4127,0.4125,0.4124,0.4122,0.4121,0.4119,0.4117,0.4116,0.4114,0.4113,0.4111,0.411,0.4108,0.4107,0.4105,0.4103,0.4102,0.41,0.4099,0.4097,0.4096,0.4094,0.4092,0.4091,0.4089,0.4088,0.4086,0.4085,0.4083,0.4081,0.408,0.4078,0.4077,0.4075,0.4074,0.4072,0.4071,0.4069,0.4067,0.4066,0.4064,0.4063,0.4061,0.406,0.4058,0.4057,0.4055,0.4053,0.4052,0.405,0.4049,0.4047,0.4046,0.4044,0.4043,0.4041,0.4039,0.4038,0.4036,0.4035,0.4033,0.4032,0.403,0.4029,0.4027,0.4026,0.4024,0.4022,0.4021,0.4019,0.4018,0.4016,0.4015,0.4013,0.4012,0.401,0.4008,0.4007,0.4005,0.4004,0.4002,0.4001,0.3999,0.3998,0.3996,0.3995,0.3993,0.3992,0.399,0.3988,0.3987,0.3985,0.3984,0.3982,0.3981,0.3979,0.3978,0.3976,0.3975,0.3973,0.3972,0.397,0.3968,0.3967,0.3965,0.3964,0.3962,0.3961,0.3959,0.3958,0.3956,0.3955,0.3953,0.3952,0.395,0.3948,0.3947,0.3945,0.3944,0.3942,0.3941,0.3939,0.3938,0.3936,0.3935,0.3933,0.3932,0.393,0.3929,0.3927,0.3925,0.3924,0.3922,0.3921,0.3919,0.3918,0.3916,0.3915,0.3913,0.3912,0.391,0.3909,0.3907,0.3906,0.3904,0.3903,0.3901,0.39,0.3898,0.3896,0.3895,0.3893,0.3892,0.389,0.3889,0.3887,0.3886,0.3884,0.3883,0.3881,0.388,0.3878,0.3877,0.3875,0.3874,0.3872,0.3871,0.3869,0.3868,0.3866,0.3865,0.3863,0.3862,0.386,0.3858,0.3857,0.3855,0.3854,0.3852,0.3851,0.3849,0.3848,0.3846,0.3845,0.3843,0.3842,0.384,0.3839,0.3837,0.3836,0.3834,0.3833,0.3831,0.383,0.3828,0.3827,0.3825,0.3824,0.3822,0.3821,0.3819,0.3818,0.3816,0.3815,0.3813,0.3812,0.381,0.3809,0.3807,0.3806,0.3804,0.3802,0.3801,0.3799,0.3798,0.3796,0.3795,0.3793,0.3792,0.379,0.3789,0.3787,0.3786,0.3784,0.3783,0.3781,0.378,0.3778,0.3777,0.3775,0.3774,0.3772,0.3771,0.3769,0.3768,0.3766,0.3765,0.3763,0.3762,0.376,0.3759,0.3757,0.3756,0.3754,0.3753,0.3751,0.375,0.3748,0.3747,0.3745,0.3744,0.3742,0.3741,0.3739,0.3738,0.3736,0.3735,0.3733,0.3732,0.373,0.3729,0.3727,0.3726,0.3724,0.3723,0.3721,0.372,0.3718,0.3717,0.3715,0.3714,0.3712,0.3711,0.3709,0.3708,0.3706,0.3705,0.3703,0.3702,0.37,0.3699,0.3697,0.3696,0.3695,0.3693,0.3692,0.369,0.3689,0.3687,0.3686,0.3684,0.3683,0.3681,0.368,0.3678,0.3677,0.3675,0.3674,0.3672,0.3671,0.3669,0.3668,0.3666,0.3665,0.3663,0.3662,0.366,0.3659,0.3657,0.3656,0.3654,0.3653,0.3651,0.365,0.3648,0.3647,0.3645,0.3644,0.3642,0.3641,0.3639,0.3638,0.3637,0.3635,0.3634,0.3632,0.3631,0.3629,0.3628,0.3626,0.3625,0.3623,0.3622,0.362,0.3619,0.3617,0.3616,0.3614,0.3613,0.3611,0.361,0.3608,0.3607,0.3605,0.3604,0.3602,0.3601,0.3599,0.3598,0.3597,0.3595,0.3594,0.3592,0.3591,0.3589,0.3588,0.3586,0.3585,0.3583,0.3582,0.358,0.3579,0.3577,0.3576,0.3574,0.3573,0.3571,0.357,0.3569,0.3567,0.3566,0.3564,0.3563,0.3561,0.356,0.3558,0.3557,0.3555,0.3554,0.3552,0.3551,0.3549,0.3548,0.3546,0.3545,0.3544,0.3542,0.3541,0.3539,0.3538,0.3536,0.3535,0.3533,0.3532,0.353,0.3529,0.3527,0.3526,0.3524,0.3523,0.3521,0.352,0.3519,0.3517,0.3516,0.3514,0.3513,0.3511,0.351,0.3508,0.3507,0.3505,0.3504,0.3502,0.3501,0.35,0.3498,0.3497,0.3495,0.3494,0.3492,0.3491,0.3489,0.3488,0.3486,0.3485,0.3483,0.3482,0.3481,0.3479,0.3478,0.3476,0.3475,0.3473,0.3472,0.347,0.3469,0.3467,0.3466,0.3464,0.3463,0.3462,0.346,0.3459,0.3457,0.3456,0.3454,0.3453,0.3451,0.345,0.3448,0.3447,0.3446,0.3444,0.3443,0.3441,0.344,0.3438,0.3437,0.3435,0.3434,0.3432,0.3431,0.343,0.3428,0.3427,0.3425,0.3424,0.3422,0.3421,0.3419,0.3418,0.3416,0.3415,0.3414,0.3412,0.3411,0.3409,0.3408,0.3406,0.3405,0.3403,0.3402,0.3401,0.3399,0.3398,0.3396,0.3395,0.3393,0.3392,0.339,0.3389,0.3388,0.3386,0.3385,0.3383,0.3382,0.338,0.3379,0.3377,0.3376,0.3375,0.3373,0.3372,0.337,0.3369,0.3367,0.3366,0.3364,0.3363,0.3362,0.336,0.3359,0.3357,0.3356,0.3354,0.3353,0.3351,0.335,0.3349,0.3347,0.3346,0.3344,0.3343,0.3341,0.334,0.3339,0.3337,0.3336,0.3334,0.3333,0.3331,0.333,0.3328,0.3327,0.3326,0.3324,0.3323,0.3321,0.332,0.3318,0.3317,0.3316,0.3314,0.3313,0.3311,0.331,0.3308,0.3307,0.3305,0.3304,0.3303,0.3301,0.33,0.3298,0.3297,0.3295,0.3294,0.3293,0.3291,0.329,0.3288,0.3287,0.3285,0.3284,0.3283,0.3281,0.328,0.3278,0.3277,0.3275,0.3274,0.3273,0.3271,0.327,0.3268,0.3267,0.3265,0.3264,0.3263,0.3261,0.326,0.3258,0.3257,0.3255,0.3254,0.3253,0.3251,0.325,0.3248,0.3247,0.3246,0.3244,0.3243,0.3241,0.324,0.3238,0.3237,0.3236,0.3234,0.3233,0.3231,0.323,0.3228,0.3227,0.3226,0.3224,0.3223,0.3221,0.322,0.3219,0.3217,0.3216,0.3214,0.3213,0.3211,0.321,0.3209,0.3207,0.3206,0.3204,0.3203,0.3202,0.32,0.3199,0.3197,0.3196,0.3194,0.3193,0.3192,0.319,0.3189,0.3187,0.3186,0.3185,0.3183,0.3182,0.318,0.3179,0.3178,0.3176,0.3175,0.3173,0.3172,0.317,0.3169,0.3168,0.3166,0.3165,0.3163,0.3162,0.3161,0.3159,0.3158,0.3156,0.3155,0.3154,0.3152,0.3151,0.3149,0.3148,0.3147,0.3145,0.3144,0.3142,0.3141,0.314,0.3138,0.3137,0.3135,0.3134,0.3133,0.3131,0.313,0.3128,0.3127,0.3126,0.3124,0.3123,0.3121,0.312,0.3119,0.3117,0.3116,0.3114,0.3113,0.3112,0.311,0.3109,0.3107,0.3106,0.3105],"name":"L5_A","npix":256,"planted":{"Al_Ka":17737.71,"Al_Ka_tail":270.1174,"Cu_Ka":0.0,"Cu_Ka_stray":34.5788,"Mg_Ka":58.3917,"O_Ka":70.9318,"Si_Ka":115.2303,"Si_Ka_internal":21.12},"source":"ladder","thickness_nm":80.0,"truth_at":{"Al":98.8,"Mg":0.6,"Si":0.6}},{"axis_true":{"offset":-0.478,"scale":0.005},"counts":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,2,2,0,4,2,3,3,5,5,2,7,6,5,7,2,11,10,11,4,12,8,9,5,15,11,8,12,14,15,7,8,19,22,20,17,20,23,18,16,16,28,20,28,29,24,26,26,29,21,30,28,19,25,26,31,30,37,45,50,40,50,54,57,49,59,42,60,54,44,40,37,42,32,38,27,21,31,26,46,35,45,30,22,20,20,28,24,29,25,21,42,22,24,35,33,36,36,30,30,38,28,40,28,26,28,28,19,32,35,29,24,26,23,24,31,27,30,26,29,31,31,34,43,20,21,24,35,27,25,23,37,28,21,25,26,33,31,26,20,28,29,26,37,28,23,26,22,28,28,24,29,29,24,23,25,28,26,32,36,27,27,37,25,21,30,28,23,26,20,13,32,21,22,22,23,22,27,22,22,16,25,22,18,21,24,18,19,27,23,16,17,25,34,44,29,39,53,75,63,90,101,156,133,196,219,213,251,260,261,314,300,302,266,227,231,203,183,169,129,83,110,67,64,51,41,42,26,29,29,28,26,27,22,21,28,24,33,30,49,58,59,87,120,151,225,270,324,425,474,554,625,672,808,868,931,944,935,960,939,903,855,729,682,537,489,397,331,261,223,195,173,134,89,84,79,49,41,45,21,24,25,32,29,22,13,32,31,31,26,41,56,66,77,109,135,163,178,218,272,314,395,457,482,496,596,596,571,624,574,624,553,522,476,412,323,304,243,228,170,170,153,124,99,78,83,78,63,72,62,53,50,41,31,46,36,31,25,30,27,18,17,24,19,13,9,13,18,13,12,20,13,5,18,9,31,9,10,16,10,14,18,10,16,9,14,11,15,9,15,16,14,15,10,10,14,11,6,17,14,13,10,8,16,12,10,14,10,10,13,10,9,11,10,8,15,10,13,13,8,13,13,12,10,14,13,12,15,12,15,17,12,8,9,19,13,11,12,16,14,9,11,13,13,7,7,9,11,10,11,10,11,7,19,19,9,7,11,14,7,15,11,11,10,10,18,12,19,20,18,25,26,19,17,18,26,32,28,29,26,31,31,35,35,38,29,28,27,30,28,12,23,21,21,16,16,20,14,16,12,11,11,10,8,11,12,23,17,25,27,30,25,36,51,62,70,67,77,92,107,108,149,148,139,162,142,177,192,191,184,187,161,162,161,147,135,103,101,76,66,63,55,39,32,37,23,27,12,17,22,14,18,22,18,31,25,36,60,59,80,92,131,131,149,205,222,207,239,334,361,384,376,405,400,419,411,451,428,418,398,345,338,291,256,258,210,186,169,163,117,113,88,62,59,42,48,36,24,30,20,28,23,21,25,38,34,36,52,67,87,92,117,135,159,176,210,267,272,301,284,340,399,374,418,406,357,367,423,402,398,332,302,317,273,239,218,156,165,144,107,104,64,58,58,42,30,26,26,22,16,14,20,20,14,19,16,18,24,28,23,33,54,51,59,57,82,78,83,91,99,98,98,115,122,152,130,124,126,123,114,116,124,96,103,88,82,77,60,54,43,48,28,32,26,23,16,11,25,15,20,7,12,6,4,11,9,10,8,10,9,9,6,7,2,6,11,3,6,12,6,9,9,7,4,7,10,8,5,9,11,4,4,8,14,7,7,5,15,7,7,6,6,7,8,9,7,7,10,2,4,4,8,10,5,7,10,6,8,10,8,7,9,11,11,8,12,8,3,8,6,7,4,6,6,10,1,8,7,9,9,7,5,7,8,6,6,5,7,7,5,2,8,9,4,7,5,10,7,9,5,11,8,10,4,14,4,11,4,6,6,9,9,11,6,4,7,15,4,9,2,4,6,5,6,5,7,1,10,6,6,6,8,9,5,7,10,2,5,14,10,10,4,4,7,4,9,5,7,7,8,8,12,14,2,3,7,8,8,4,8,9,6,8,5,5,5,10,5,4,5,8,6,7,2,11,6,7,6,7,6,4,6,9,6,7,8,4,7,9,8,6,8,11,9,13,10,4,7,10,6,5,11,13,5,5,10,6,4,3,4,6,8,10,6,5,3,6,9,4,4,6,5,9,10,6,2,9,7,6,9,11,7,5,5,4,6,4,5,5,2,5,7,8,4,5,6,5,3,7,4,6,6,4,3,8,3,5,8,8,12,6,6,7,4,11,1,4,6,2,7,3,5,9,6,8,6,4,6,2,2,3,9,4,2,5,7,5,6,10,4,10,6,5,4,6,6,5,4,4,7,6,5,5,3,8,0,8,3,8,6,6,4,5,2,8,5,4,4,6,4,6,6,8,2,4,5,8,1,2,8,1,4,9,6,6,5,5,7,7,8,8,9,3,7,10,5,5,8,6,5,3,11,6,3,3,4,1,3,8,7,5,15,1,3,9,4,3,12,4,5,8,7,3,7,2,4,5,5,2,4,4,7,5,3,7,3,6,7,6,6,5,5,7,4,4,4,3,2,4,3,8,2,6,5,3,3,3,7,5,5,9,2,4,3,8,9,4,10,5,7,5,2,2,5,3,2,6,2,3,4,4,8,8,3,0,1,9,8,5,4,6,4,7,2,7,2,5,2,2,8,5,2,8,4,2,3,5,1,5,3,5,2,10,2,5,5,11,5,3,8,7,4,6,5,4,5,4,3,7,5,4,5,2,4,3,3,6,2,6,7,5,1,8,2,3,3,4,5,4,4,5,5,4,2,10,9,5,5,4,5,7,4,3,3,2,6,4,5,4,6,5,2,1,5,4,1,7,9,4,6,3,6,3,3,2,4,4,5,4,6,4,1,7,3,3,4,6,5,2,6,6,3,4,4,4,4,3,4,4,2,6,5,5,5,6,2,9,2,5,6,3,4,9,1,6,3,4,5,8,5,7,6,5,5,11,5,5,8,3,5,6,2,3,6,5,8,6,4,8,4,6,6,6,5,2,4,6,3,4,6,4,4,6,5,4,2,4,6,2,2,1,4,4,2,4,2,4,4,5,4,6,4,2,3,5,2,2,12,3,7,3,7,4,4,5,8,5,4,6,6,2,6,3,8,5,4,3,4,0,5,4,11,5,8,6,5,3,5,7,7,5,3,7,4,9,4,10,7,6,6,6,0,6,3,6,3,2,0,2,2,6,4,3,6,7,5,4,4,6,4,3,4,3,3,6,2,5,7,4,7,3,9,4,2,4,4,3,2,4,4,2,7,6,2,3,2,6,6,3,4,3,3,3,4,0,4,11,4,2,4,7,9,3,2,3,3,2,3,5,6,5,6,1,5,7,5,5,10,5,7,4,4,5,3,4,4,3,2,2,6,6,3,3,4,3,6,3,5,3,5,5,3,7,3,2,4,4,2,8,6,2,2,2,3,5,7,5,5,9,3,5,4,2,6,1,1,2,5,2,3,10,4,1,7,7,4,3,0,7,5,3,1,5,4,2,8,5,3,4,5,7,3,3,1,4,4,1,9,2,3,4,4,4,5,1,7,3,5,2,4,2,3,3,5,5,6,6,3,6,6,4,7,6,5,5,4,4,2,7,3,8,3,7,5,8,4,5,5,2,9,7,3,5,12,9,6,7,5,4,11,6,7,11,5,6,5,7,7,3,6,6,12,5,8,5,6,6,3,8,6,5,8,2,2,4,3,4,6,5,1,1,5,3,3,4,4,2,6,2,2,4,8,3,1,3,1,4,0,2,5,4,1,2,2,8,4,2,4,3,4,1,5,2,3,5,2,6,2,4,1,6,6,7,7,2,4,4,1,2,2,5,3,4,1,4,2,6,4,4,3,1,3,2,1,1,5,9,2,6,4,0,6,3,4,1,3,2,3,3,0,3,2,0,2,3,2,3,1,4,4,0,4,2,6,1,5,2,4,3,4,2,2,5,2,1,3,5,3,5,2,5,4,2,3,5,3,2,3,3,4,4,4,1,3,2,4,2,5,1,4,7,0,5,4,4,4,5,4,6,3,4,5,3,3,4,7,3,7,3,4,3,5,2,2,4,2,2,4,2,2,3,2,2,1,4,1,2,0,0,3,4,4,3,4,0,3,5,0,1,3,4,4,1,1,1,3,3,1,2,1,3,3,5,2,5,3,1,3,4,5,1,2,0,3,3,1,4,3,3,4,3,4,6,5,6,4,3,3,0,2,2,2,5,4,1,2,4,1,2,6,2,1,1,4,3,4,1,3,4,2,2,6,4,3,4,6,1,4,1,7,3,1,1,2,3,3,2,1,2,1,5,3,2,5,4,5,3,2,2,2,4,4,2,1,1,2,4,0,1,3,4,5,0,2,2,4,2,3,2,6,3,2,2,2,1,3,5,2,2,3,3,9,3,5,8,1,4,4,2,2,3,3,3,3,4,4,5,1,2,3,3,1,2,1,3,6,2,4,3,4,0,0,2,2,7,4,4,4,2,2,1,7,9,4,1,0,3,3,5,1,1,2,5,0,3,2,0,4,9,4,4,4,3,1,3,5,2,2,1,3,5,5,3,1,4,6,3,5,4,4,1,2,6,2,5,1,4,4,0,3,6,1,4,3,4,2,2,2,2,2,3,5,3,3,2,0,5,2,1,2,2,2,4,1,1,5,1,1,4,4,0,3,0,5,4,3,0,2,1,3,3,3,2,2,3,1,2,4,6,2,4,0,1,2,1,3,2,5,0,1,3,3,3,2,5,4,5,5,1,2,4,2,5,3,2,2,5,4,2,4,2,4,2,3,5,2,2,4,1,2,3,6,2,6,2,4,2,8,1,2,0,2,4,4,4,3,1,1,2,0,3,3,2,1,1,2,2,2,1,3,4,0,3,1,3,3,4,1,3,2,4,3,2,2,6,1,2,3,1,3,1,2,2,3,2,2,3,2,2,2,2,3,4,3,3,3,3,2,3,2,5,2,2,2,3,0,0,3,3,1,1,2,1,6,2,1,6,4,0,5,2,3,0,3,3,2,1,3,4,3,3,3,2,4,1,1,2,2,5,2,1,1,3,4,1,6,4,1,3,5,0,1,5,1,1,1,3,1,2,2,2,2,0,3,3,2,1,0,3,5,2,3,1,2,3,1,0,5,2,3,3,3,3,0,2,0,3,1,3,1,4,3,5,3,1,3,1,3,2,4,2,5,2,2,5,4,3,2,0,1,2,2,3,3,2,2,5,3,5,1,4,3,1,2,8,0,4,3,1,3,1,2,1,3,4,4,0,1,0,2,1,5,2,2,2,5,2,1,2,7,3,4,1,1,2,4,2,4,5,3,1,0,4,1,0,0,4,3,0,2,2,2,2,3,0,4,3,0,2,4,3,2,2,3,1,1,3,1,4,1,1,1,1,1,2,2,2,1,3,1,2,2,2,3,0,0,3,3,0,3,3,4,5,1,2,2,7,0,2,2,1,3,4,0,1,2,4,4,4,4,2,0,6,2,2,3,3,2,2,3,0,3,4,3,0,2,4,2,1,3,1,2,7,3,1,0,3,3,0,5,3,1,1,0,2,3,1,1,2,1,6,2,3,2,1,3,1,3,0,5,0,2,4,2,3,2,0,7,4,5,0,1,2,2,5,4,5,1,0,1,3,6,1,1,0,1,1,1,4,5,1,4,0,3,3,0,0,5,1,5,3,2,2,0,4,2,1,1,4,2,2,4,0,2,3,1,0,3,1,2,3,0,2,2,3,1,2,2,3,5,1,1,1,2,5,1,3,3,0,2,2,5,1,2,1,3,1,2,1,2,1,5,3,2,1,2,3,0,2,0,3,4,5,0,4,3,4,0,3,2,1,2,1,1,1,2,3,3,0,5,2,1,2,1,2,3,3,1,2,4,2,1,4,2,0,2,5,3,4,1,2,1,1,1,2,1,2,2,2,3,1,3,4,2,0,0,1,2,5,1,0,0,2,3,3,2,0,5,2,0,1,3,1,4,2,0,3,1,3,0,3,3,1,1,2,3,3,1,3,3,3,2,0,5,2,1,1,2,0,2,2,3,4,1,3,4,0,0,3,0,3,4,4,2,3,0,2,1,5,2,4,2,3,0,2,1,0,3,2,5,3,0,2,4,1,2,3,4,4,4,6,1,1,1,2,5,1,3,3,3,2,2,0,2,4,2,0,1,7,1,3,1,1,0,2,3,1,3,0,2,4,3,1,2,2,1,4,5,5,3,2,4,1,1,0,4,2,0,3,4,4,1,2,1,3,3,2,1,2,3,0,2,5,2,2,2,0,2,1,1,2,1,4,0,1,3,0,0,3,2,1,2,3,1,1,2,4,4,3,1,1,1,0,0,1,1,1,5,2,1,2,3,1,4,3,1,1,0,2,2,4,3,1,0,2,3,2,3,0,3,3,2,2,1,4,1,2,5,1,3,1,1,3,0,1,2,3,4,1,1,1,2,3,0,2,1,3,3,1,3,1,4,0,2,0,1,2,2,1,1,0,2,3,1,2,0,3,1,1,1,5,4,3,1,0,3,2,3,2,3,3,2,1,2,0,1,2,3,3,2,2,1,2,2,1,0,2,3,2,2,2,1,2,4,5,2,4,2,1,1,1,2,3,2,2,1,1,3,5,2,3,6,2,2,2,4,4,0,1,3,2,1,3,1,2,0,2,1,5,1,1,3,1,4,3,1,1,1,1,1,0,2,0,5,3,3,3,2,1,2,1,4,1,3,2,2,1,2,3,0,2,1,2,1,5,3,2,2,0,3,1,1,4,2,0,5,4,2,1,1,3,1,0,5,1,2,2,1,2,0,5,2,4,2,2,2,1,2,2,2,1,4,3,2,1,2,2,1,1,4,1,2,2,2,4,1,2,0,1,3,2,1,3,0,3,0,2,2,1,2,0,4,1,2,5,3,0,2,4,1,2,2,1,3,0,0,3,6,1,1,1,2,2,1,2,1,3,2,1,4,4,3,3,1,0,4,2,1,1,0,2,2,2,1,2,4,0,1,0,0,2,1,1,1,0,2,0,1,2,2,1,2,0,5,2,3,2,3,1,3,3,2,0,2,1,1,2,0,0,3,0,2,3,1,3,1,3,1,2,0,3,2,1,1,1,2,2,2,1,0,3,3,4,2,0,2,1,1,2,3,2,1,1,2,1,1,2,3,1,2,3,0,1,2,0,3,1,3,2,1,0,1,2,0,5,1,2,2,1,1,5,4,1,2,1,3,1,0,1,0,1,0,1,3,0,3,3,3,2,3,2,2,1,0,3,1,1,2,0,0,3,0,2,3,0,3,3,1,1,1,3,1,2,0,1,2,4,1,1,5,1,1,1,1,1,4,1,2,1,3,3,2,4,1,3,2,1,1,0,0,1,3,2,3,2,4,2,2,1,2,1,0,3,0,5,3,3,1,3,1,1,0,2,0,2,2,3,2,2,3,1,0,0,0,4,3,0,2,2,0,1,2,1,2,0,1,0,3,2,1,4,3,1,1,1,0,3,2,2,2,3,3,0,0,2,3,2,1,1,2,2,3,5,3,3,1,0,0,1,0,1,3,1,2,1,2,0,1,0,1,3,1,1,3,1,2,4,1,3,1,0,2,1,2,1,1,0,3,1,2,2,1,1,0,1,2,0,1,0,3,3,0,0,2,3,5,4,3,1,3,2,0,1,2,3,2,3,4,0,0,2,0,0,1,2,1,0,2,3,2,0,1,2,2,1,4,1,3,0,1,2,1,1,2,0,4,0,2,0,1,2,3,3,2,1,3,5,0,1,1,2,3,2,2,0,3,1,3,4,1,1,3,0,2,1,2,0,4,3,0,0,0,4,2,0,3,4,0,2,1,2,0,2,2,1,4,3,2,0,1,1,1,4,2,1,3,1,4,0,1,7,1,2,2,2,3,3,1,2,2,2,3,1,6,3,4,0,0,0,4,2,1,2,1,1,5,0,2,1,1,2,1,0,3,1,0,0,2,0,0,2,1,2,1,3,0,0,0,3,4,1,1,4,1,0,2,1,3,5,0,3,0,1,0,1,0,1,1,3,3,0,2,2,1,1,0,1,0,0,0,0,0,2,2,2,0,1,3,2,0,2,2,3,1,0,2,3,2,1,1,2,2,1,1,1,1,0,2,2,0,1,4,4,2,4,2,2,3,2,1,2,4,0,1,0,3,3,1,0,3,2,2,1,1,0,1,2,1,3,2,2,0,1,3,4,3,3,3,1,2,5,1,0,2,1,1,2,2,2,4,1,1,1,3,1,3,2,2,2,1,2,3,1,1,1,2,2,0,2,1,0,1,1,5,3,2,3,3,2,2,1,1,2,1,0,1,3,0,2,0,2,0,1,0,1,0,2,0,1,2,2,2,2,4,2,1,0,1,0,2,2,1,0,1,1,1,0,1,1,2,2,2,1,0,4,0,0,1,0,1,2,1,1,0,1,3,1,2,1,1,1,1,0,2,3,1,1,1,1,0,1,2,2,2,3,1,3,1,0,0,1,2,0,2,2,1,2,0,2,2,3,1,3,2,3,2,1,1,2,1,2,1,1,0,3,0,3,1,3,2,2,2,0,1,1,1,1,2,1,0,2,2,1,1,3,4,2,3,2,1,3,4,1,2,1,2,1,1,2,0,0,0,0,1,1,2,2,1,1,1,1,1,1,2,2,0,2,0,2,0,0,1,1,1,1,4,2,2,1,1,1,2,2,4,1,2,3,2,1,1,0,1,3,0,1,1,1,0,0,0,1,2,3,1,0,1,0,1,4,3,2,3,1,0,1,0,0,0,0,1,1,2,2,0,1,3,1,1,3,2,3,1,0,0,2,1,1,0,0,0,2,1,1,0,4,0,3,1,0,0,1,2,1,2,2,2,4,1,1,2,0,1,2,2,1,1,0,2,0,3,1,0,0,2,1,1,0,1,1,1,1,6,1,2,2,0,1,1,2,2,0,1,3,0,1,2,1,1,1,2,2,2,1,2,0,1,0,1,1,2,1,1,1,2,1,2,3,1,2,1,1,2,2,2,3,1,1,4,3,0],"expected":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0002,0.0005,0.001,0.0022,0.0046,0.009,0.0164,0.0283,0.045,0.0704,0.1059,0.1536,0.2159,0.2948,0.3932,0.5121,0.6542,0.8204,1.0116,1.2299,1.4745,1.7461,2.0454,2.3706,2.7219,3.0993,3.5,3.9233,4.3697,4.8355,5.319,5.8211,6.3384,6.8685,7.4102,7.9641,8.5258,9.0937,9.6672,10.2464,10.8272,11.4083,11.9888,12.5698,13.1473,13.7202,14.2875,14.8504,15.4068,15.9548,16.4939,17.0232,17.5452,18.0564,18.5563,19.0446,19.5209,19.9874,20.4418,20.8835,21.3127,21.7297,22.1364,22.5344,22.9255,23.3153,23.7133,24.135,24.6056,25.1583,25.8384,26.7021,27.8125,29.2307,31.0037,33.1469,35.6282,38.3575,41.1837,43.904,46.2878,48.1117,49.1935,49.4287,48.7983,47.1139,45.1413,42.7966,40.3134,37.9004,35.7185,33.868,32.3895,31.2746,30.4811,29.9502,29.6192,29.4301,29.3356,29.3001,29.2988,29.3152,29.3391,29.3651,29.3902,29.4123,29.4307,29.445,29.4553,29.4616,29.464,29.4627,29.4581,29.4502,29.439,29.4245,29.407,29.3864,29.3631,29.337,29.3082,29.2771,29.2437,29.2081,29.1702,29.1301,29.0881,29.0441,28.9982,28.9506,28.9012,28.8503,28.798,28.7442,28.689,28.6324,28.5746,28.5156,28.4555,28.3943,28.332,28.2688,28.2047,28.1398,28.0741,28.0076,27.9404,27.8726,27.8041,27.735,27.6654,27.5954,27.5248,27.4539,27.3826,27.311,27.2391,27.1669,27.0944,27.0218,26.949,26.8761,26.803,26.7299,26.6567,26.5835,26.5103,26.4372,26.3642,26.2912,26.2183,26.1456,26.0731,26.0007,25.9286,25.8567,25.7851,25.7137,25.6438,25.5747,25.506,25.4376,25.3696,25.3019,25.2347,25.1679,25.1015,25.0357,24.9704,24.9056,24.8414,24.7778,24.7148,24.6525,24.5909,24.5301,24.4701,24.4112,24.3535,24.2977,24.2449,24.1971,24.1579,24.1341,24.1372,24.1867,24.3144,24.5703,25.0304,25.806,27.0538,28.9854,31.8739,36.0543,41.9146,49.8729,60.3401,73.6656,90.0708,109.5768,131.9373,156.5906,182.6431,208.897,233.9268,256.1998,274.2299,286.7425,292.8258,292.0432,284.4871,270.7656,251.9232,229.3103,204.4248,178.7492,153.6103,130.0769,108.9046,90.3628,73.9157,61.3406,51.3705,43.6611,37.834,33.5219,30.3945,28.1796,26.6684,25.7165,25.2444,25.2393,25.7622,26.9609,29.0879,32.5247,37.8061,45.6448,56.9364,72.7528,94.3104,122.8944,159.7437,205.8948,261.9941,328.0968,403.4801,486.505,574.5615,664.1259,750.9457,830.3484,897.6488,948.6062,979.8727,989.3653,976.5058,942.2877,889.1597,820.7482,741.4547,655.9942,568.9403,484.3347,405.4078,334.4284,272.6844,220.572,177.763,143.4111,116.0587,93.8284,77.4449,64.9215,55.1625,47.4487,41.2516,36.2073,32.0768,28.7173,26.0563,24.074,22.796,22.2959,22.7029,24.2154,27.1149,31.777,38.6763,48.3801,61.5274,78.7893,100.8094,128.1256,161.0771,199.7064,243.6664,292.15,343.8557,397.0052,449.4121,498.6191,542.0805,577.3784,602.4466,615.7749,616.5647,604.8156,581.328,547.6233,505.7915,458.2879,407.7058,356.5535,307.0627,261.0449,219.8075,184.1294,154.2909,130.1435,111.2064,96.7739,86.0204,78.094,72.1897,67.6042,63.6393,59.7448,56.127,52.5515,48.815,44.9452,41.0196,37.1411,33.417,29.9428,26.7926,24.0145,21.6293,19.6343,18.0068,16.7111,15.7033,14.9366,14.3654,13.9478,13.6476,13.4346,13.2851,13.1799,13.105,13.0504,13.0091,12.9762,12.9486,12.9242,12.9016,12.8802,12.8593,12.8389,12.8186,12.7984,12.7783,12.7582,12.7382,12.7181,12.6981,12.6781,12.6581,12.6381,12.6182,12.5982,12.5783,12.5583,12.5384,12.5186,12.4987,12.4789,12.4591,12.4393,12.4195,12.3997,12.38,12.3603,12.3406,12.3209,12.3013,12.2816,12.262,12.2424,12.2229,12.2034,12.1838,12.1644,12.1449,12.1255,12.1061,12.0867,12.0674,12.048,12.0287,12.0095,11.9902,11.971,11.9519,11.9328,11.9137,11.8946,11.8755,11.8565,11.8376,11.8186,11.7997,11.7808,11.7619,11.7431,11.7243,11.7056,11.6869,11.6682,11.6496,11.631,11.6125,11.5942,11.5761,11.5584,11.5411,11.5248,11.5098,11.497,11.4874,11.4827,11.4852,11.4981,11.5259,11.5744,11.6511,11.7657,11.9296,12.1568,12.463,12.8655,13.3825,14.0318,14.8297,15.7889,16.9168,18.2134,19.6696,21.2656,22.9702,24.741,26.5253,28.262,29.8855,31.3288,32.5285,33.4291,33.9872,34.1752,33.9829,33.419,32.5098,31.2976,29.8371,28.1912,26.4269,24.6104,22.8033,21.0596,19.4232,17.9276,16.595,15.4382,14.4619,13.6655,13.0455,12.5986,12.3248,12.2302,12.3298,12.6499,13.2305,14.1266,15.4095,17.1661,19.4979,22.5176,26.344,31.095,36.8781,43.7794,51.8514,61.1004,71.4744,82.854,95.0463,107.7841,120.7308,133.4924,145.6348,156.7075,166.2707,173.9236,179.3326,182.2551,182.5574,180.225,175.3635,168.1909,159.021,148.2411,136.2844,123.6019,110.6344,97.7885,85.4176,73.8085,63.1762,53.6631,45.3453,38.242,32.3288,27.5517,23.842,21.1302,19.359,18.4935,18.5307,19.5049,21.492,24.6103,29.0181,34.9086,42.5007,52.0259,63.7115,77.7604,94.328,113.4973,135.2548,159.4679,185.8681,214.0407,243.4239,273.3186,302.9111,331.3055,357.5668,380.7713,400.0599,414.6908,424.087,427.8738,425.9037,418.2661,405.2799,387.472,365.5417,340.3151,312.694,283.603,253.9397,224.531,196.0988,169.2364,144.3964,121.8886,101.8886,84.4527,69.5381,57.0269,46.7496,38.509,32.1013,27.3342,24.042,22.0971,21.4175,21.9716,23.7797,26.9115,31.4821,37.6429,45.5709,55.4531,67.4695,81.7718,98.462,117.5688,139.0268,162.6577,188.1566,215.0866,242.8807,270.8553,298.2324,324.1735,347.8193,368.3367,384.9668,397.0711,404.1723,405.9857,402.4373,393.6699,380.0324,362.0577,340.4275,315.9295,289.4105,261.7277,233.7041,206.09,179.5332,154.5585,131.5589,110.7945,92.4018,76.4076,62.7479,51.2896,41.8512,34.2235,28.1868,23.5265,20.0437,17.5639,15.9417,15.0635,14.8473,15.2415,16.2214,17.7853,19.9488,22.7396,26.1903,30.3317,35.1855,40.7574,47.0301,53.9579,61.462,69.4281,77.7063,86.1134,94.4378,102.4475,109.9,116.5543,122.1834,126.587,129.6034,131.1194,131.0772,129.4779,126.3816,121.9038,116.2078,109.4951,101.9935,93.9443,85.5894,77.16,68.8661,60.8889,53.3756,46.437,40.1473,34.5465,29.6438,25.4228,21.8467,18.8641,16.4145,14.4326,12.8524,11.6104,10.6479,9.9121,9.3568,8.9429,8.638,8.4157,8.2548,8.1392,8.0562,7.9965,7.9531,7.9209,7.8964,7.8771,7.8612,7.8475,7.8353,7.824,7.8133,7.8029,7.7928,7.7828,7.7729,7.7631,7.7533,7.7435,7.7338,7.7241,7.7145,7.7048,7.6952,7.6856,7.6761,7.6665,7.657,7.6475,7.638,7.6285,7.6191,7.6096,7.6002,7.5909,7.5815,7.5722,7.5629,7.5536,7.5443,7.535,7.5258,7.5166,7.5074,7.4982,7.4891,7.48,7.4708,7.4618,7.4527,7.4436,7.4346,7.4256,7.4166,7.4076,7.3987,7.3897,7.3808,7.3719,7.3631,7.3542,7.3454,7.3365,7.3277,7.319,7.3102,7.3015,7.2927,7.284,7.2754,7.2667,7.258,7.2494,7.2408,7.2322,7.2237,7.2151,7.2066,7.198,7.1895,7.1811,7.1726,7.1642,7.1557,7.1473,7.1389,7.1306,7.1222,7.1139,7.1056,7.0973,7.089,7.0807,7.0725,7.0642,7.056,7.0478,7.0397,7.0315,7.0234,7.0152,7.0071,6.999,6.991,6.9829,6.9749,6.9668,6.9588,6.9508,6.9429,6.9349,6.927,6.9191,6.9111,6.9033,6.8954,6.8875,6.8797,6.8719,6.8641,6.8563,6.8485,6.8407,6.833,6.8253,6.8176,6.8099,6.8022,6.7945,6.7869,6.7793,6.7716,6.764,6.7565,6.7489,6.7413,6.7338,6.7263,6.7188,6.7113,6.7038,6.6964,6.6889,6.6815,6.6741,6.6667,6.6593,6.6519,6.6446,6.6372,6.6299,6.6226,6.6153,6.608,6.6008,6.5935,6.5863,6.5791,6.5719,6.5647,6.5575,6.5504,6.5432,6.5361,6.529,6.5219,6.5148,6.5077,6.5006,6.4936,6.4866,6.4795,6.4725,6.4656,6.4586,6.4516,6.4447,6.4377,6.4308,6.4239,6.417,6.4101,6.4033,6.3964,6.3896,6.3828,6.376,6.3692,6.3624,6.3556,6.3489,6.3421,6.3354,6.3287,6.322,6.3153,6.3086,6.3019,6.2953,6.2887,6.282,6.2754,6.2688,6.2622,6.2557,6.2491,6.2426,6.236,6.2295,6.223,6.2165,6.21,6.2035,6.1971,6.1906,6.1842,6.1778,6.1714,6.165,6.1586,6.1522,6.1459,6.1395,6.1332,6.1269,6.1206,6.1143,6.108,6.1017,6.0955,6.0892,6.083,6.0767,6.0705,6.0643,6.0581,6.052,6.0458,6.0396,6.0335,6.0274,6.0213,6.0151,6.009,6.003,5.9969,5.9908,5.9848,5.9787,5.9727,5.9667,5.9607,5.9547,5.9487,5.9428,5.9368,5.9308,5.9249,5.919,5.9131,5.9072,5.9013,5.8954,5.8895,5.8837,5.8778,5.872,5.8662,5.8603,5.8545,5.8487,5.843,5.8372,5.8314,5.8257,5.8199,5.8142,5.8085,5.8028,5.7971,5.7914,5.7857,5.78,5.7744,5.7687,5.7631,5.7575,5.7519,5.7463,5.7407,5.7351,5.7295,5.724,5.7184,5.7129,5.7073,5.7018,5.6963,5.6908,5.6853,5.6798,5.6743,5.6689,5.6634,5.658,5.6525,5.6471,5.6417,5.6363,5.6309,5.6255,5.6201,5.6148,5.6094,5.6041,5.5987,5.5934,5.5881,5.5828,5.5775,5.5722,5.5669,5.5617,5.5564,5.5511,5.5459,5.5407,5.5355,5.5302,5.525,5.5198,5.5147,5.5095,5.5043,5.4992,5.494,5.4889,5.4837,5.4786,5.4735,5.4684,5.4633,5.4582,5.4531,5.4481,5.443,5.438,5.4329,5.4279,5.4229,5.4178,5.4128,5.4078,5.4028,5.3979,5.3929,5.3879,5.383,5.378,5.3731,5.3682,5.3632,5.3583,5.3534,5.3485,5.3437,5.3388,5.3339,5.329,5.3242,5.3193,5.3145,5.3097,5.3049,5.3001,5.2953,5.2905,5.2857,5.2809,5.2761,5.2714,5.2666,5.2619,5.2571,5.2524,5.2477,5.243,5.2383,5.2336,5.2289,5.2242,5.2195,5.2148,5.2102,5.2055,5.2009,5.1963,5.1916,5.187,5.1824,5.1778,5.1732,5.1686,5.164,5.1595,5.1549,5.1503,5.1458,5.1413,5.1367,5.1322,5.1277,5.1232,5.1187,5.1142,5.1097,5.1052,5.1007,5.0963,5.0918,5.0874,5.0829,5.0785,5.074,5.0696,5.0652,5.0608,5.0564,5.052,5.0476,5.0432,5.0389,5.0345,5.0302,5.0258,5.0215,5.0171,5.0128,5.0085,5.0042,4.9999,4.9956,4.9913,4.987,4.9827,4.9784,4.9742,4.9699,4.9657,4.9614,4.9572,4.9529,4.9487,4.9445,4.9403,4.9361,4.9319,4.9277,4.9235,4.9193,4.9152,4.911,4.9069,4.9027,4.8986,4.8944,4.8903,4.8862,4.8821,4.8779,4.8738,4.8697,4.8657,4.8616,4.8575,4.8534,4.8494,4.8453,4.8412,4.8372,4.8332,4.8291,4.8251,4.8211,4.8171,4.8131,4.8091,4.8051,4.8011,4.7971,4.7931,4.7892,4.7852,4.7813,4.7773,4.7734,4.7694,4.7655,4.7616,4.7577,4.7538,4.7499,4.7461,4.7422,4.7384,4.7346,4.7308,4.727,4.7233,4.7196,4.7159,4.7122,4.7086,4.705,4.7015,4.698,4.6945,4.6911,4.6877,4.6843,4.681,4.6777,4.6744,4.6711,4.6678,4.6645,4.6612,4.6579,4.6546,4.6512,4.6478,4.6443,4.6408,4.6372,4.6335,4.6298,4.626,4.6221,4.6182,4.6142,4.6102,4.6062,4.6021,4.598,4.5938,4.5897,4.5855,4.5814,4.5773,4.5732,4.5691,4.5651,4.5611,4.5571,4.5532,4.5493,4.5454,4.5416,4.5378,4.5341,4.5303,4.5266,4.523,4.5193,4.5157,4.5121,4.5085,4.5049,4.5014,4.4978,4.4943,4.4908,4.4872,4.4837,4.4802,4.4767,4.4732,4.4697,4.4663,4.4628,4.4593,4.4559,4.4524,4.449,4.4455,4.4421,4.4386,4.4352,4.4318,4.4284,4.425,4.4215,4.4181,4.4147,4.4114,4.408,4.4046,4.4012,4.3978,4.3945,4.3911,4.3877,4.3844,4.381,4.3777,4.3743,4.371,4.3677,4.3643,4.361,4.3577,4.3544,4.3511,4.3478,4.3445,4.3412,4.3379,4.3346,4.3313,4.3281,4.3248,4.3215,4.3183,4.315,4.3118,4.3085,4.3053,4.3021,4.2988,4.2956,4.2924,4.2892,4.2859,4.2827,4.2795,4.2763,4.2731,4.2699,4.2668,4.2636,4.2604,4.2572,4.2541,4.2509,4.2477,4.2446,4.2414,4.2383,4.2352,4.232,4.2289,4.2258,4.2226,4.2195,4.2164,4.2133,4.2102,4.2071,4.204,4.2009,4.1978,4.1947,4.1916,4.1886,4.1855,4.1824,4.1794,4.1763,4.1733,4.1702,4.1672,4.1641,4.1611,4.1581,4.155,4.152,4.149,4.146,4.143,4.14,4.137,4.1341,4.1311,4.1281,4.1252,4.1222,4.1193,4.1163,4.1134,4.1105,4.1076,4.1046,4.1017,4.0988,4.0959,4.093,4.0902,4.0873,4.0844,4.0815,4.0786,4.0757,4.0728,4.07,4.0671,4.0642,4.0613,4.0584,4.0555,4.0526,4.0497,4.0467,4.0438,4.0409,4.038,4.0351,4.0322,4.0293,4.0264,4.0235,4.0206,4.0177,4.0148,4.012,4.0091,4.0062,4.0034,4.0005,3.9977,3.9948,3.992,3.9892,3.9864,3.9836,3.9808,3.978,3.9752,3.9724,3.9696,3.9668,3.964,3.9613,3.9585,3.9557,3.953,3.9502,3.9475,3.9447,3.942,3.9393,3.9365,3.9338,3.9311,3.9284,3.9256,3.9229,3.9202,3.9175,3.9148,3.9121,3.9094,3.9067,3.904,3.9013,3.8987,3.896,3.8933,3.8906,3.888,3.8853,3.8826,3.88,3.8773,3.8747,3.872,3.8694,3.8667,3.8641,3.8615,3.8588,3.8562,3.8536,3.851,3.8483,3.8457,3.8431,3.8405,3.8379,3.8353,3.8327,3.8301,3.8275,3.8249,3.8223,3.8198,3.8172,3.8146,3.812,3.8095,3.8069,3.8044,3.8018,3.7992,3.7967,3.7941,3.7916,3.7891,3.7865,3.784,3.7815,3.7789,3.7764,3.7739,3.7714,3.7688,3.7663,3.7638,3.7613,3.7588,3.7563,3.7538,3.7514,3.7489,3.7464,3.744,3.7415,3.7391,3.7367,3.7344,3.7321,3.7298,3.7277,3.7256,3.7237,3.722,3.7205,3.7194,3.7186,3.7183,3.7186,3.7197,3.7217,3.725,3.7296,3.736,3.7444,3.7553,3.7691,3.7863,3.8075,3.8331,3.864,3.9007,3.9439,3.9944,4.0527,4.1197,4.1958,4.2816,4.3776,4.4841,4.6011,4.7286,4.8663,5.0137,5.1701,5.3343,5.5051,5.6808,5.8597,6.0396,6.2184,6.3935,6.5624,6.7226,6.8715,7.0067,7.1258,7.2267,7.3075,7.3669,7.4036,7.4169,7.4065,7.3726,7.3158,7.2371,7.1378,7.0197,6.8848,6.7354,6.5739,6.4029,6.2248,6.0424,5.858,5.6739,5.4923,5.3152,5.1441,4.9804,4.8254,4.6799,4.5445,4.4195,4.305,4.2011,4.1074,4.0236,3.9492,3.8835,3.826,3.7759,3.7326,3.6953,3.6634,3.6363,3.6132,3.5938,3.5774,3.5636,3.5519,3.5422,3.5339,3.5269,3.5208,3.5157,3.5112,3.5072,3.5036,3.5004,3.4974,3.4946,3.492,3.4895,3.487,3.4847,3.4824,3.4801,3.4779,3.4757,3.4735,3.4713,3.4692,3.467,3.4649,3.4627,3.4606,3.4584,3.4563,3.4542,3.452,3.4499,3.4478,3.4457,3.4436,3.4414,3.4393,3.4372,3.4351,3.433,3.4309,3.4288,3.4267,3.4246,3.4225,3.4204,3.4183,3.4162,3.4142,3.4121,3.41,3.4079,3.4058,3.4038,3.4017,3.3996,3.3976,3.3955,3.3934,3.3914,3.3893,3.3873,3.3852,3.3832,3.3811,3.3791,3.377,3.375,3.373,3.3709,3.3689,3.3669,3.3649,3.3628,3.3608,3.3588,3.3568,3.3548,3.3528,3.3509,3.3489,3.347,3.345,3.3431,3.3413,3.3395,3.3377,3.336,3.3344,3.3329,3.3315,3.3302,3.3292,3.3283,3.3277,3.3274,3.3275,3.3279,3.3288,3.3302,3.3322,3.3349,3.3384,3.3426,3.3478,3.3539,3.361,3.3693,3.3787,3.3893,3.4011,3.4141,3.4283,3.4437,3.4602,3.4776,3.4959,3.5149,3.5345,3.5543,3.5743,3.5941,3.6135,3.6322,3.6499,3.6663,3.6812,3.6944,3.7055,3.7143,3.7208,3.7247,3.7259,3.7245,3.7203,3.7135,3.704,3.6921,3.6779,3.6617,3.6435,3.6237,3.6026,3.5804,3.5574,3.5339,3.5102,3.4865,3.463,3.4401,3.4177,3.3962,3.3756,3.3561,3.3378,3.3206,3.3046,3.2898,3.2763,3.2638,3.2526,3.2423,3.2331,3.2248,3.2173,3.2106,3.2046,3.1992,3.1943,3.1899,3.186,3.1824,3.1791,3.1761,3.1733,3.1707,3.1683,3.166,3.1638,3.1616,3.1596,3.1576,3.1556,3.1537,3.1519,3.15,3.1482,3.1463,3.1445,3.1427,3.1409,3.1391,3.1374,3.1356,3.1338,3.132,3.1303,3.1285,3.1267,3.125,3.1232,3.1214,3.1197,3.1179,3.1162,3.1144,3.1127,3.1109,3.1092,3.1075,3.1057,3.104,3.1022,3.1005,3.0988,3.097,3.0953,3.0936,3.0918,3.0901,3.0884,3.0867,3.085,3.0832,3.0815,3.0798,3.0781,3.0764,3.0747,3.073,3.0713,3.0696,3.0679,3.0662,3.0645,3.0628,3.0611,3.0594,3.0577,3.056,3.0543,3.0526,3.051,3.0493,3.0476,3.0459,3.0442,3.0426,3.0409,3.0392,3.0375,3.0359,3.0342,3.0326,3.0309,3.0292,3.0276,3.0259,3.0243,3.0226,3.0209,3.0193,3.0176,3.016,3.0144,3.0127,3.0111,3.0094,3.0078,3.0062,3.0045,3.0029,3.0013,2.9996,2.998,2.9964,2.9947,2.9931,2.9915,2.9899,2.9883,2.9866,2.985,2.9834,2.9818,2.9802,2.9786,2.977,2.9754,2.9738,2.9722,2.9706,2.969,2.9674,2.9658,2.9642,2.9626,2.961,2.9594,2.9578,2.9562,2.9546,2.9531,2.9515,2.9499,2.9483,2.9468,2.9452,2.9436,2.942,2.9405,2.9389,2.9373,2.9358,2.9342,2.9326,2.9311,2.9295,2.928,2.9264,2.9248,2.9233,2.9217,2.9202,2.9186,2.9171,2.9156,2.914,2.9125,2.9109,2.9094,2.9079,2.9063,2.9048,2.9033,2.9017,2.9002,2.8987,2.8971,2.8956,2.8941,2.8926,2.891,2.8895,2.888,2.8865,2.885,2.8835,2.882,2.8804,2.8789,2.8774,2.8759,2.8744,2.8729,2.8714,2.8699,2.8684,2.8669,2.8654,2.8639,2.8624,2.861,2.8595,2.858,2.8565,2.855,2.8535,2.852,2.8506,2.8491,2.8476,2.8461,2.8447,2.8432,2.8417,2.8402,2.8388,2.8373,2.8358,2.8344,2.8329,2.8314,2.83,2.8285,2.8271,2.8256,2.8242,2.8227,2.8213,2.8198,2.8184,2.8169,2.8155,2.814,2.8126,2.8111,2.8097,2.8082,2.8068,2.8054,2.8039,2.8025,2.8011,2.7996,2.7982,2.7968,2.7954,2.7939,2.7925,2.7911,2.7897,2.7882,2.7868,2.7854,2.784,2.7826,2.7812,2.7798,2.7783,2.7769,2.7755,2.7741,2.7727,2.7713,2.7699,2.7685,2.7671,2.7657,2.7643,2.7629,2.7615,2.7601,2.7587,2.7573,2.756,2.7546,2.7532,2.7518,2.7504,2.749,2.7476,2.7463,2.7449,2.7435,2.7421,2.7408,2.7394,2.738,2.7366,2.7353,2.7339,2.7325,2.7312,2.7298,2.7284,2.7271,2.7257,2.7244,2.723,2.7217,2.7203,2.7189,2.7176,2.7162,2.7149,2.7135,2.7122,2.7108,2.7095,2.7082,2.7068,2.7055,2.7041,2.7028,2.7015,2.7001,2.6988,2.6974,2.6961,2.6948,2.6935,2.6921,2.6908,2.6895,2.6881,2.6868,2.6855,2.6842,2.6829,2.6815,2.6802,2.6789,2.6776,2.6763,2.675,2.6736,2.6723,2.671,2.6697,2.6684,2.6671,2.6658,2.6645,2.6632,2.6619,2.6606,2.6593,2.658,2.6567,2.6554,2.6541,2.6528,2.6515,2.6502,2.649,2.6477,2.6464,2.6451,2.6438,2.6425,2.6412,2.64,2.6387,2.6374,2.6361,2.6348,2.6336,2.6323,2.631,2.6298,2.6285,2.6272,2.6259,2.6247,2.6234,2.6221,2.6209,2.6196,2.6184,2.6171,2.6158,2.6146,2.6133,2.6121,2.6108,2.6096,2.6083,2.6071,2.6058,2.6046,2.6033,2.6021,2.6008,2.5996,2.5983,2.5971,2.5959,2.5946,2.5934,2.5921,2.5909,2.5897,2.5884,2.5872,2.586,2.5847,2.5835,2.5823,2.581,2.5798,2.5786,2.5774,2.5761,2.5749,2.5737,2.5725,2.5713,2.57,2.5688,2.5676,2.5664,2.5652,2.564,2.5628,2.5616,2.5603,2.5591,2.5579,2.5567,2.5555,2.5543,2.5531,2.5519,2.5507,2.5495,2.5483,2.5471,2.5459,2.5447,2.5435,2.5423,2.5411,2.54,2.5388,2.5376,2.5364,2.5352,2.534,2.5328,2.5316,2.5305,2.5293,2.5281,2.5269,2.5257,2.5246,2.5234,2.5222,2.521,2.5199,2.5187,2.5175,2.5163,2.5152,2.514,2.5128,2.5117,2.5105,2.5093,2.5082,2.507,2.5059,2.5047,2.5035,2.5024,2.5012,2.5001,2.4989,2.4978,2.4966,2.4955,2.4943,2.4931,2.492,2.4909,2.4897,2.4886,2.4874,2.4863,2.4851,2.484,2.4828,2.4817,2.4806,2.4794,2.4783,2.4771,2.476,2.4749,2.4737,2.4726,2.4715,2.4703,2.4692,2.4681,2.467,2.4658,2.4647,2.4636,2.4625,2.4613,2.4602,2.4591,2.458,2.4569,2.4557,2.4546,2.4535,2.4524,2.4513,2.4502,2.4491,2.4479,2.4468,2.4457,2.4446,2.4435,2.4424,2.4413,2.4402,2.4391,2.438,2.4369,2.4358,2.4347,2.4336,2.4325,2.4314,2.4303,2.4292,2.4281,2.427,2.4259,2.4248,2.4237,2.4226,2.4215,2.4205,2.4194,2.4183,2.4172,2.4161,2.415,2.4139,2.4129,2.4118,2.4107,2.4096,2.4085,2.4075,2.4064,2.4053,2.4042,2.4032,2.4021,2.401,2.3999,2.3989,2.3978,2.3967,2.3957,2.3946,2.3935,2.3925,2.3914,2.3903,2.3893,2.3882,2.3872,2.3861,2.385,2.384,2.3829,2.3819,2.3808,2.3798,2.3787,2.3777,2.3766,2.3756,2.3745,2.3735,2.3724,2.3714,2.3703,2.3693,2.3682,2.3672,2.3661,2.3651,2.3641,2.363,2.362,2.3609,2.3599,2.3589,2.3578,2.3568,2.3558,2.3547,2.3537,2.3527,2.3516,2.3506,2.3496,2.3485,2.3475,2.3465,2.3455,2.3444,2.3434,2.3424,2.3414,2.3403,2.3393,2.3383,2.3373,2.3363,2.3352,2.3342,2.3332,2.3322,2.3312,2.3302,2.3291,2.3281,2.3271,2.3261,2.3251,2.3241,2.3231,2.3221,2.3211,2.3201,2.3191,2.3181,2.3171,2.316,2.315,2.314,2.313,2.312,2.311,2.3101,2.3091,2.3081,2.3071,2.3061,2.3051,2.3041,2.3031,2.3021,2.3011,2.3001,2.2991,2.2981,2.2972,2.2962,2.2952,2.2942,2.2932,2.2922,2.2912,2.2903,2.2893,2.2883,2.2873,2.2863,2.2854,2.2844,2.2834,2.2824,2.2815,2.2805,2.2795,2.2785,2.2776,2.2766,2.2756,2.2747,2.2737,2.2727,2.2718,2.2708,2.2698,2.2689,2.2679,2.2669,2.266,2.265,2.264,2.2631,2.2621,2.2612,2.2602,2.2592,2.2583,2.2573,2.2564,2.2554,2.2545,2.2535,2.2526,2.2516,2.2507,2.2497,2.2488,2.2478,2.2469,2.2459,2.245,2.244,2.2431,2.2421,2.2412,2.2402,2.2393,2.2384,2.2374,2.2365,2.2355,2.2346,2.2337,2.2327,2.2318,2.2309,2.2299,2.229,2.2281,2.2271,2.2262,2.2253,2.2243,2.2234,2.2225,2.2215,2.2206,2.2197,2.2188,2.2178,2.2169,2.216,2.2151,2.2141,2.2132,2.2123,2.2114,2.2104,2.2095,2.2086,2.2077,2.2068,2.2059,2.2049,2.204,2.2031,2.2022,2.2013,2.2004,2.1995,2.1985,2.1976,2.1967,2.1958,2.1949,2.194,2.1931,2.1922,2.1913,2.1904,2.1895,2.1886,2.1877,2.1868,2.1859,2.185,2.1841,2.1832,2.1823,2.1814,2.1805,2.1796,2.1787,2.1778,2.1769,2.176,2.1751,2.1742,2.1733,2.1724,2.1715,2.1706,2.1697,2.1688,2.168,2.1671,2.1662,2.1653,2.1644,2.1635,2.1626,2.1618,2.1609,2.16,2.1591,2.1582,2.1573,2.1565,2.1556,2.1547,2.1538,2.1529,2.1521,2.1512,2.1503,2.1494,2.1486,2.1477,2.1468,2.1459,2.1451,2.1442,2.1433,2.1425,2.1416,2.1407,2.1399,2.139,2.1381,2.1373,2.1364,2.1355,2.1347,2.1338,2.1329,2.1321,2.1312,2.1303,2.1295,2.1286,2.1278,2.1269,2.126,2.1252,2.1243,2.1235,2.1226,2.1218,2.1209,2.12,2.1192,2.1183,2.1175,2.1166,2.1158,2.1149,2.1141,2.1132,2.1124,2.1115,2.1107,2.1098,2.109,2.1081,2.1073,2.1065,2.1056,2.1048,2.1039,2.1031,2.1022,2.1014,2.1006,2.0997,2.0989,2.098,2.0972,2.0964,2.0955,2.0947,2.0939,2.093,2.0922,2.0913,2.0905,2.0897,2.0888,2.088,2.0872,2.0864,2.0855,2.0847,2.0839,2.083,2.0822,2.0814,2.0805,2.0797,2.0789,2.0781,2.0772,2.0764,2.0756,2.0748,2.0739,2.0731,2.0723,2.0715,2.0707,2.0698,2.069,2.0682,2.0674,2.0666,2.0658,2.0649,2.0641,2.0633,2.0625,2.0617,2.0609,2.06,2.0592,2.0584,2.0576,2.0568,2.056,2.0552,2.0544,2.0536,2.0527,2.0519,2.0511,2.0503,2.0495,2.0487,2.0479,2.0471,2.0463,2.0455,2.0447,2.0439,2.0431,2.0423,2.0415,2.0407,2.0399,2.0391,2.0383,2.0375,2.0367,2.0359,2.0351,2.0343,2.0335,2.0327,2.0319,2.0311,2.0303,2.0295,2.0287,2.0279,2.0271,2.0263,2.0256,2.0248,2.024,2.0232,2.0224,2.0216,2.0208,2.02,2.0192,2.0185,2.0177,2.0169,2.0161,2.0153,2.0145,2.0137,2.013,2.0122,2.0114,2.0106,2.0098,2.009,2.0083,2.0075,2.0067,2.0059,2.0051,2.0044,2.0036,2.0028,2.002,2.0013,2.0005,1.9997,1.9989,1.9982,1.9974,1.9966,1.9958,1.9951,1.9943,1.9935,1.9928,1.992,1.9912,1.9904,1.9897,1.9889,1.9881,1.9874,1.9866,1.9858,1.9851,1.9843,1.9835,1.9828,1.982,1.9812,1.9805,1.9797,1.9789,1.9782,1.9774,1.9767,1.9759,1.9751,1.9744,1.9736,1.9729,1.9721,1.9713,1.9706,1.9698,1.9691,1.9683,1.9676,1.9668,1.966,1.9653,1.9645,1.9638,1.963,1.9623,1.9615,1.9608,1.96,1.9593,1.9585,1.9578,1.957,1.9563,1.9555,1.9548,1.954,1.9533,1.9525,1.9518,1.951,1.9503,1.9495,1.9488,1.948,1.9473,1.9465,1.9458,1.9451,1.9443,1.9436,1.9428,1.9421,1.9413,1.9406,1.9399,1.9391,1.9384,1.9376,1.9369,1.9362,1.9354,1.9347,1.9339,1.9332,1.9325,1.9317,1.931,1.9303,1.9295,1.9288,1.9281,1.9273,1.9266,1.9259,1.9251,1.9244,1.9237,1.9229,1.9222,1.9215,1.9207,1.92,1.9193,1.9185,1.9178,1.9171,1.9164,1.9156,1.9149,1.9142,1.9135,1.9127,1.912,1.9113,1.9105,1.9098,1.9091,1.9084,1.9076,1.9069,1.9062,1.9055,1.9048,1.904,1.9033,1.9026,1.9019,1.9012,1.9004,1.8997,1.899,1.8983,1.8976,1.8968,1.8961,1.8954,1.8947,1.894,1.8932,1.8925,1.8918,1.8911,1.8904,1.8897,1.889,1.8882,1.8875,1.8868,1.8861,1.8854,1.8847,1.884,1.8833,1.8825,1.8818,1.8811,1.8804,1.8797,1.879,1.8783,1.8776,1.8769,1.8762,1.8754,1.8747,1.874,1.8733,1.8726,1.8719,1.8712,1.8705,1.8698,1.8691,1.8684,1.8677,1.867,1.8663,1.8656,1.8649,1.8642,1.8635,1.8628,1.8621,1.8614,1.8607,1.86,1.8593,1.8586,1.8579,1.8572,1.8565,1.8558,1.8551,1.8544,1.8537,1.853,1.8523,1.8516,1.8509,1.8502,1.8495,1.8488,1.8481,1.8474,1.8467,1.846,1.8453,1.8446,1.8439,1.8432,1.8425,1.8418,1.8412,1.8405,1.8398,1.8391,1.8384,1.8377,1.837,1.8363,1.8356,1.8349,1.8342,1.8336,1.8329,1.8322,1.8315,1.8308,1.8301,1.8294,1.8287,1.8281,1.8274,1.8267,1.826,1.8253,1.8246,1.8239,1.8233,1.8226,1.8219,1.8212,1.8205,1.8198,1.8192,1.8185,1.8178,1.8171,1.8164,1.8157,1.8151,1.8144,1.8137,1.813,1.8123,1.8117,1.811,1.8103,1.8096,1.8089,1.8083,1.8076,1.8069,1.8062,1.8055,1.8049,1.8042,1.8035,1.8028,1.8022,1.8015,1.8008,1.8001,1.7995,1.7988,1.7981,1.7974,1.7968,1.7961,1.7954,1.7947,1.7941,1.7934,1.7927,1.7921,1.7914,1.7907,1.79,1.7894,1.7887,1.788,1.7874,1.7867,1.786,1.7853,1.7847,1.784,1.7833,1.7827,1.782,1.7813,1.7807,1.78,1.7793,1.7787,1.778,1.7773,1.7767,1.776,1.7753,1.7747,1.774,1.7733,1.7727,1.772,1.7713,1.7707,1.77,1.7693,1.7687,1.768,1.7673,1.7667,1.766,1.7654,1.7647,1.764,1.7634,1.7627,1.762,1.7614,1.7607,1.7601,1.7594,1.7587,1.7581,1.7574,1.7568,1.7561,1.7554,1.7548,1.7541,1.7535,1.7528,1.7521,1.7515,1.7508,1.7502,1.7495,1.7489,1.7482,1.7475,1.7469,1.7462,1.7456,1.7449,1.7443,1.7436,1.743,1.7423,1.7416,1.741,1.7403,1.7397,1.739,1.7384,1.7377,1.7371,1.7364,1.7358,1.7351,1.7345,1.7338,1.7332,1.7325,1.7318,1.7312,1.7305,1.7299,1.7292,1.7286,1.7279,1.7273,1.7266,1.726,1.7253,1.7247,1.724,1.7234,1.7227,1.7221,1.7214,1.7208,1.7202,1.7195,1.7189,1.7182,1.7176,1.7169,1.7163,1.7156,1.715,1.7143,1.7137,1.713,1.7124,1.7117,1.7111,1.7105,1.7098,1.7092,1.7085,1.7079,1.7072,1.7066,1.7059,1.7053,1.7047,1.704,1.7034,1.7027,1.7021,1.7014,1.7008,1.7002,1.6995,1.6989,1.6982,1.6976,1.6969,1.6963,1.6957,1.695,1.6944,1.6937,1.6931,1.6925,1.6918,1.6912,1.6905,1.6899,1.6893,1.6886,1.688,1.6873,1.6867,1.6861,1.6854,1.6848,1.6841,1.6835,1.6829,1.6822,1.6816,1.681,1.6803,1.6797,1.679,1.6784,1.6778,1.6771,1.6765,1.6759,1.6752,1.6746,1.674,1.6733,1.6727,1.6721,1.6714,1.6708,1.6702,1.6695,1.6689,1.6682,1.6676,1.667,1.6663,1.6657,1.6651,1.6644,1.6638,1.6632,1.6625,1.6619,1.6613,1.6607,1.66,1.6594,1.6588,1.6581,1.6575,1.6569,1.6562,1.6556,1.655,1.6543,1.6537,1.6531,1.6524,1.6518,1.6512,1.6506,1.6499,1.6493,1.6487,1.648,1.6474,1.6468,1.6462,1.6455,1.6449,1.6443,1.6436,1.643,1.6424,1.6418,1.6411,1.6405,1.6399,1.6392,1.6386,1.638,1.6374,1.6367,1.6361,1.6355,1.6349,1.6342,1.6336,1.633,1.6324,1.6317,1.6311,1.6305,1.6299,1.6292,1.6286,1.628,1.6274,1.6267,1.6261,1.6255,1.6249,1.6242,1.6236,1.623,1.6224,1.6217,1.6211,1.6205,1.6199,1.6192,1.6186,1.618,1.6174,1.6168,1.6161,1.6155,1.6149,1.6143,1.6136,1.613,1.6124,1.6118,1.6112,1.6105,1.6099,1.6093,1.6087,1.6081,1.6074,1.6068,1.6062,1.6056,1.6049,1.6043,1.6037,1.6031,1.6025,1.6019,1.6012,1.6006,1.6,1.5994,1.5988,1.5981,1.5975,1.5969,1.5963,1.5957,1.595,1.5944,1.5938,1.5932,1.5926,1.592,1.5913,1.5907,1.5901,1.5895,1.5889,1.5883,1.5876,1.587,1.5864,1.5858,1.5852,1.5846,1.5839,1.5833,1.5827,1.5821,1.5815,1.5809,1.5802,1.5796,1.579,1.5784,1.5778,1.5772,1.5766,1.5759,1.5753,1.5747,1.5741,1.5735,1.5729,1.5723,1.5716,1.571,1.5704,1.5698,1.5692,1.5686,1.568,1.5673,1.5667,1.5661,1.5655,1.5649,1.5643,1.5637,1.5631,1.5624,1.5618,1.5612,1.5606,1.56,1.5594,1.5588,1.5582,1.5576,1.5569,1.5563,1.5557,1.5551,1.5545,1.5539,1.5533,1.5527,1.5521,1.5514,1.5508,1.5502,1.5496,1.549,1.5484,1.5478,1.5472,1.5466,1.546,1.5453,1.5447,1.5441,1.5435,1.5429,1.5423,1.5417,1.5411,1.5405,1.5399,1.5393,1.5387,1.538,1.5374,1.5368,1.5362,1.5356,1.535,1.5344,1.5338,1.5332,1.5326,1.532,1.5314,1.5308,1.5301,1.5295,1.5289,1.5283,1.5277,1.5271,1.5265,1.5259,1.5253,1.5247,1.5241,1.5235,1.5229,1.5223,1.5217,1.5211,1.5205,1.5198,1.5192,1.5186,1.518,1.5174,1.5168,1.5162,1.5156,1.515,1.5144,1.5138,1.5132,1.5126,1.512,1.5114,1.5108,1.5102,1.5096,1.509,1.5084,1.5078,1.5072,1.5066,1.506,1.5054,1.5047,1.5041,1.5035,1.5029,1.5023,1.5017,1.5011,1.5005,1.4999,1.4993,1.4987,1.4981,1.4975,1.4969,1.4963,1.4957,1.4951,1.4945,1.4939,1.4933,1.4927,1.4921,1.4915,1.4909,1.4903,1.4897,1.4891,1.4885,1.4879,1.4873,1.4867,1.4861,1.4855,1.4849,1.4843,1.4837,1.4831,1.4825,1.4819,1.4813,1.4807,1.4801,1.4795,1.4789,1.4783,1.4777,1.4771,1.4765,1.4759,1.4753,1.4747,1.4741,1.4735,1.4729,1.4723,1.4717,1.4711,1.4705,1.4699,1.4693,1.4687,1.4682,1.4676,1.467,1.4664,1.4658,1.4652,1.4646,1.464,1.4634,1.4628,1.4622,1.4616,1.461,1.4604,1.4598,1.4592,1.4586,1.458,1.4574,1.4568,1.4562,1.4556,1.455,1.4544,1.4538,1.4532,1.4527,1.4521,1.4515,1.4509,1.4503,1.4497,1.4491,1.4485,1.4479,1.4473,1.4467,1.4461,1.4455,1.4449,1.4443,1.4437,1.4431,1.4425,1.442,1.4414,1.4408,1.4402,1.4396,1.439,1.4384,1.4378,1.4372,1.4366,1.436,1.4354,1.4348,1.4342,1.4337,1.4331,1.4325,1.4319,1.4313,1.4307,1.4301,1.4295,1.4289,1.4283,1.4277,1.4271,1.4266,1.426,1.4254,1.4248,1.4242,1.4236,1.423,1.4224,1.4218,1.4212,1.4206,1.4201,1.4195,1.4189,1.4183,1.4177,1.4171,1.4165,1.4159,1.4153,1.4147,1.4142,1.4136,1.413,1.4124,1.4118,1.4112,1.4106,1.41,1.4094,1.4089,1.4083,1.4077,1.4071,1.4065,1.4059,1.4053,1.4047,1.4042,1.4036,1.403,1.4024,1.4018,1.4012,1.4006,1.4,1.3995,1.3989,1.3983,1.3977,1.3971,1.3965,1.3959,1.3953,1.3948,1.3942,1.3936,1.393,1.3924,1.3918,1.3912,1.3907,1.3901,1.3895,1.3889,1.3883,1.3877,1.3871,1.3866,1.386,1.3854,1.3848,1.3842,1.3836,1.383,1.3825,1.3819,1.3813,1.3807,1.3801,1.3795,1.379,1.3784,1.3778,1.3772,1.3766,1.376,1.3755,1.3749,1.3743,1.3737,1.3731,1.3725,1.372,1.3714,1.3708,1.3702,1.3696,1.369,1.3685,1.3679,1.3673,1.3667,1.3661,1.3655,1.365,1.3644,1.3638,1.3632,1.3626,1.3621,1.3615,1.3609,1.3603,1.3597,1.3592,1.3586,1.358,1.3574,1.3568,1.3562,1.3557,1.3551,1.3545,1.3539,1.3533,1.3528,1.3522,1.3516,1.351,1.3504,1.3499,1.3493,1.3487,1.3481,1.3475,1.347,1.3464,1.3458,1.3452,1.3447,1.3441,1.3435,1.3429,1.3423,1.3418,1.3412,1.3406,1.34,1.3394,1.3389,1.3383,1.3377,1.3371,1.3366,1.336,1.3354,1.3348,1.3343,1.3337,1.3331,1.3325,1.3319,1.3314,1.3308,1.3302,1.3296,1.3291,1.3285,1.3279,1.3273,1.3268,1.3262,1.3256,1.325,1.3245,1.3239,1.3233,1.3227,1.3222,1.3216,1.321,1.3204,1.3199,1.3193,1.3187,1.3181,1.3176,1.317,1.3164,1.3158,1.3153,1.3147,1.3141,1.3135,1.313,1.3124,1.3118,1.3112,1.3107,1.3101,1.3095,1.309,1.3084,1.3078,1.3072,1.3067,1.3061,1.3055,1.3049,1.3044,1.3038,1.3032,1.3027,1.3021,1.3015,1.3009,1.3004,1.2998,1.2992,1.2987,1.2981,1.2975,1.2969,1.2964,1.2958,1.2952,1.2947,1.2941,1.2935,1.293,1.2924,1.2918,1.2912,1.2907,1.2901,1.2895,1.289,1.2884,1.2878,1.2873,1.2867,1.2861,1.2856,1.285,1.2844,1.2838,1.2833,1.2827,1.2821,1.2816,1.281,1.2804,1.2799,1.2793,1.2787,1.2782,1.2776,1.277,1.2765,1.2759,1.2753,1.2748,1.2742,1.2736,1.2731,1.2725,1.2719,1.2714,1.2708,1.2702,1.2697,1.2691,1.2685,1.268,1.2674,1.2668,1.2663,1.2657,1.2652,1.2646,1.264,1.2635,1.2629,1.2623,1.2618,1.2612,1.2606,1.2601,1.2595,1.2589,1.2584,1.2578,1.2573,1.2567,1.2561,1.2556,1.255,1.2544,1.2539,1.2533,1.2528,1.2522,1.2516,1.2511,1.2505,1.2499,1.2494,1.2488],"name":"L6_precip_endon_0","npix":256,"planted":{"Al_Ka":15732.697,"Al_Ka_tail":239.5842,"Cu_Ka":0.0,"Cu_Ka_stray":121.1536,"Mg_Ka":4158.5316,"O_Ka":271.6062,"Si_Ka":10196.6579,"Si_Ka_internal":152.5416},"source":"ladder","thickness_nm":104.0,"truth_at":{"Al":49.4,"Mg":23.0272727273,"Si":27.5727272727}},{"axis_true":{"offset":-0.478,"scale":0.005},"counts":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,2,1,0,3,2,2,0,3,0,1,2,2,2,4,4,5,4,1,3,5,8,4,3,4,6,7,5,8,9,7,7,10,7,5,5,15,5,7,12,9,6,8,11,9,14,10,8,17,14,17,13,19,10,23,16,17,12,19,26,18,26,22,19,22,21,19,16,11,18,14,15,15,11,11,13,9,11,10,16,13,18,14,20,11,17,14,10,9,13,17,12,15,13,20,11,17,15,17,19,16,21,14,22,18,24,13,17,11,14,16,15,12,15,14,15,10,16,11,16,12,15,13,13,15,14,8,17,19,16,14,14,9,12,12,20,11,15,12,11,19,20,18,17,18,12,11,9,17,7,11,23,17,26,8,13,14,14,11,8,9,9,11,11,27,16,14,15,11,12,17,15,13,15,10,12,13,10,11,17,15,15,11,19,14,15,15,11,20,31,26,55,68,69,100,132,177,216,276,344,388,475,535,556,623,651,709,659,663,640,602,521,427,372,331,309,202,175,128,107,76,57,29,42,23,19,18,13,15,6,10,7,7,11,14,6,11,7,7,8,11,12,6,4,4,9,7,5,6,7,8,9,7,13,8,7,8,8,3,11,8,12,12,6,12,13,11,8,12,9,4,3,13,10,7,3,10,9,7,6,18,14,18,19,35,48,56,92,121,208,210,323,390,485,576,690,794,981,1046,1223,1364,1462,1421,1525,1525,1482,1436,1370,1255,1081,980,880,736,631,483,386,313,265,207,176,138,117,106,82,70,72,51,62,52,46,41,33,19,21,22,25,13,18,17,14,8,7,7,5,5,10,6,4,5,5,3,2,10,11,6,10,6,6,7,4,11,5,4,6,7,7,6,8,8,7,4,5,10,7,9,8,7,7,2,2,3,5,8,3,3,4,5,8,5,7,5,7,6,10,4,10,8,4,5,5,9,5,7,7,3,5,9,6,8,10,11,11,7,4,6,6,5,5,11,7,6,3,4,5,6,9,5,4,4,9,8,3,6,5,6,7,10,4,5,12,8,6,7,8,10,10,10,10,11,10,12,14,13,16,17,14,17,18,17,15,12,23,14,12,12,9,9,15,10,12,15,6,6,3,7,5,4,7,8,1,10,6,2,6,3,9,7,9,6,8,7,4,9,2,3,10,3,3,7,2,6,8,5,4,7,5,6,3,3,3,3,5,5,6,9,6,11,3,1,6,8,6,12,5,3,3,7,6,3,8,12,9,4,7,10,9,9,9,9,14,24,19,19,22,28,35,40,47,39,47,49,39,46,56,61,53,48,50,44,43,49,45,33,36,25,25,16,15,14,16,15,13,11,11,7,8,8,7,8,7,1,1,4,6,7,4,7,1,5,5,3,10,6,5,3,6,5,8,7,4,5,6,4,4,6,6,8,10,4,2,9,7,2,3,2,4,6,3,8,7,4,5,5,5,8,5,6,5,6,6,8,8,11,16,10,24,19,16,17,29,28,28,24,31,44,37,57,53,69,57,53,60,74,49,59,66,49,50,55,39,48,46,35,42,21,37,13,18,17,19,8,4,9,6,3,3,4,3,7,3,7,5,6,4,2,7,7,1,3,4,4,7,4,7,11,6,1,3,2,5,2,8,6,5,4,4,3,3,2,4,4,4,1,5,9,3,4,1,5,3,4,0,3,6,9,4,2,2,7,7,2,4,5,3,0,5,9,5,4,4,3,7,4,4,2,4,5,5,4,5,7,1,2,6,3,2,6,3,2,3,1,6,4,7,4,3,3,6,5,4,3,4,5,5,1,5,3,5,4,5,9,5,10,3,6,9,4,2,6,4,2,6,2,5,5,4,1,3,5,1,2,1,8,4,7,3,4,6,4,4,4,2,4,8,8,4,0,4,3,0,5,4,1,5,5,6,3,5,6,2,3,6,4,4,4,5,2,5,7,4,5,4,7,4,2,7,3,5,1,4,3,8,5,5,4,5,2,4,0,2,2,1,5,3,4,4,2,4,6,4,8,8,2,4,8,5,1,4,5,3,4,4,2,2,2,7,5,2,5,2,1,2,2,6,5,2,1,4,3,6,6,7,1,4,7,4,2,3,6,3,4,4,2,9,4,4,1,2,1,1,3,6,4,1,3,5,0,2,2,6,4,1,1,5,7,0,7,1,5,4,3,3,2,3,7,1,1,4,3,6,4,3,2,3,3,4,3,3,8,3,2,2,5,1,4,4,3,3,1,3,1,1,3,4,7,1,2,4,3,2,4,3,2,0,3,2,1,3,2,2,2,3,2,4,7,2,3,1,2,2,3,2,1,1,5,3,6,3,3,1,2,1,5,3,2,4,2,7,4,3,2,2,2,2,6,4,4,1,3,2,6,5,1,3,2,4,3,4,3,3,0,4,3,6,7,3,5,3,2,6,5,2,3,4,3,4,1,4,7,2,2,5,4,1,1,3,2,4,3,3,3,3,3,6,3,6,5,6,2,6,4,4,2,1,3,2,5,0,3,2,3,0,2,2,2,0,6,2,4,1,2,2,0,1,4,1,3,2,3,4,1,2,4,1,5,2,3,5,4,2,2,1,4,4,2,3,3,3,3,2,2,3,6,4,3,4,5,0,3,3,3,1,5,3,6,2,0,4,1,1,0,1,6,4,3,4,3,2,1,3,1,4,2,1,3,0,0,3,5,1,1,1,3,2,3,0,5,5,1,1,5,2,1,3,5,2,1,1,2,3,4,6,7,5,1,1,0,2,0,1,4,3,4,2,1,1,0,5,5,2,0,3,6,2,3,1,6,4,2,7,3,2,3,10,4,1,2,0,0,1,2,4,1,1,2,3,2,1,3,4,5,3,1,1,4,5,7,4,2,1,4,2,2,5,2,4,4,2,1,4,3,1,5,2,2,3,0,2,2,1,3,4,4,2,3,2,5,3,1,3,2,2,1,1,0,3,1,6,2,2,5,0,2,1,5,2,1,1,1,3,3,4,1,2,1,1,3,1,3,4,4,4,0,1,2,3,2,3,1,2,1,1,3,0,0,1,1,2,4,2,3,6,1,2,3,2,3,2,4,4,1,1,1,1,1,3,1,2,2,2,2,4,4,1,2,0,3,2,1,3,1,4,3,1,5,2,4,3,4,3,3,5,3,3,4,0,0,3,1,3,3,0,3,1,2,4,0,3,5,3,0,2,0,1,4,1,4,6,1,2,2,1,5,5,5,1,4,3,3,4,4,2,2,2,3,3,3,1,1,3,6,1,1,4,1,3,4,5,2,2,2,2,5,2,2,1,2,6,0,2,2,1,2,1,4,3,3,2,2,0,0,1,2,1,1,1,1,2,1,1,4,1,2,3,5,2,2,2,2,3,1,3,3,3,4,2,3,3,1,2,1,2,1,4,2,1,1,4,2,1,2,0,7,0,2,0,0,2,3,2,3,5,3,3,1,3,2,0,3,2,3,2,4,1,1,3,2,1,2,4,0,2,1,2,1,4,5,3,2,1,1,2,1,3,3,5,1,2,4,0,2,1,3,6,3,2,3,2,4,3,3,3,1,5,1,3,3,6,2,3,2,3,1,2,0,1,4,4,4,5,0,4,1,3,1,0,3,2,7,5,1,2,0,2,2,1,0,1,3,0,1,3,1,3,3,1,2,0,4,1,5,3,0,3,2,1,3,2,1,0,1,0,1,3,1,0,3,3,4,1,1,1,1,2,1,5,3,2,3,5,1,2,2,4,8,1,1,3,1,1,1,1,2,0,4,0,4,0,1,0,3,2,3,2,0,5,0,2,3,2,2,1,3,2,1,1,3,3,3,0,1,0,1,0,1,2,0,1,0,4,3,2,3,1,1,1,4,1,2,1,3,2,2,4,2,3,1,0,1,2,2,4,4,2,1,1,0,3,3,3,2,3,1,1,4,2,5,4,1,1,2,2,1,3,1,0,2,2,2,1,2,2,7,4,3,1,2,4,2,4,3,2,3,4,4,0,1,0,3,5,0,3,0,3,5,3,1,2,3,2,1,2,3,3,1,0,1,2,3,0,1,1,2,3,1,1,1,0,1,2,0,2,1,1,1,3,1,2,0,1,1,2,3,1,0,1,2,1,1,1,3,3,3,0,4,2,3,5,0,0,2,5,2,1,4,1,2,4,0,6,1,2,0,1,2,2,2,2,3,1,0,4,2,4,3,1,3,0,0,2,1,1,0,1,2,1,0,0,1,0,1,2,2,1,2,1,3,2,1,1,1,1,3,1,1,1,3,0,0,2,0,1,1,2,3,2,1,2,1,2,4,1,3,1,1,2,0,2,0,1,1,1,3,2,1,3,0,2,0,3,3,3,1,2,0,1,2,2,1,1,1,3,2,1,0,1,3,1,1,3,1,1,1,3,2,2,3,1,0,4,1,3,1,1,0,2,2,3,4,2,3,3,3,5,3,0,1,6,1,1,2,1,0,2,1,2,1,1,2,1,4,1,4,1,0,1,2,2,2,1,1,0,2,3,2,2,1,2,3,1,1,0,0,1,3,2,2,2,2,3,2,2,0,2,2,0,4,3,2,2,1,0,4,3,2,2,2,4,3,2,0,0,3,0,2,3,2,1,2,2,3,1,0,0,1,0,1,1,2,1,3,0,1,1,2,1,1,2,1,0,2,0,0,1,2,2,0,1,0,2,3,2,2,1,1,0,2,2,4,2,5,0,2,3,0,1,0,0,0,1,1,1,2,2,1,0,2,3,1,1,2,1,0,2,1,1,3,1,4,1,0,1,0,1,3,2,4,2,1,2,2,0,0,0,1,3,1,2,1,1,1,1,1,2,0,1,1,2,5,2,2,2,4,1,3,2,0,2,3,3,0,1,1,0,3,1,0,1,0,0,1,5,0,1,2,1,2,3,2,2,3,1,2,3,4,2,0,2,2,0,0,1,3,1,0,2,4,1,1,3,1,1,2,4,1,2,2,3,3,3,1,2,0,0,1,3,1,1,2,1,1,1,1,0,1,3,2,1,0,1,0,1,2,4,2,0,6,1,3,0,2,1,1,3,0,1,1,0,0,2,1,4,0,1,1,1,1,1,2,2,0,2,0,2,0,3,0,1,4,0,3,2,0,0,2,0,1,1,2,1,0,2,1,4,3,0,0,0,0,1,1,1,3,0,4,3,0,2,3,0,0,0,2,0,0,3,3,2,3,2,2,0,0,2,0,1,1,0,1,3,0,4,2,1,1,2,2,1,1,1,1,1,1,0,0,1,3,2,1,1,1,2,1,1,2,2,3,2,1,4,1,0,4,2,1,0,1,3,1,4,0,1,2,2,1,1,1,2,3,4,1,2,2,0,2,1,1,1,1,2,2,1,3,0,1,1,0,0,3,1,2,1,1,2,4,0,3,0,1,1,1,2,3,2,2,4,0,1,1,1,3,0,2,1,3,0,2,2,2,1,1,2,0,1,0,0,3,1,1,1,0,1,0,2,2,0,2,2,2,0,0,3,3,1,3,0,2,1,2,2,1,0,1,0,4,2,1,3,0,1,1,1,2,4,2,1,2,0,1,2,2,1,1,1,2,1,2,2,0,1,0,3,1,1,2,1,1,2,1,3,3,1,2,1,1,0,1,1,1,0,1,2,2,3,3,0,2,3,1,1,1,1,1,0,2,0,0,2,2,3,0,0,0,4,0,1,0,2,1,1,2,2,3,0,3,0,1,2,3,1,0,0,1,2,0,2,0,3,2,1,2,1,1,1,0,0,2,1,1,2,2,1,1,2,0,1,2,0,1,2,1,0,0,1,1,0,0,0,0,0,0,2,2,2,0,0,1,0,2,0,3,2,1,0,1,4,1,0,1,0,1,3,3,2,1,1,3,1,0,2,1,1,1,0,0,1,1,3,0,1,2,2,2,2,2,1,2,1,1,2,0,1,3,0,4,1,3,1,0,0,0,1,1,0,1,0,2,2,0,1,3,1,0,1,1,2,1,0,1,1,5,1,0,0,2,2,2,2,0,1,2,0,0,0,2,1,2,3,1,0,0,0,1,1,0,1,3,4,1,2,1,2,0,1,0,0,1,4,1,1,0,1,3,0,1,1,1,0,0,0,2,1,1,2,1,2,3,0,2,1,3,4,2,0,0,0,4,3,2,1,1,0,1,0,4,1,2,0,3,0,2,0,0,1,3,0,0,2,1,2,1,3,1,3,1,0,0,2,0,1,1,1,0,0,1,2,4,1,1,1,1,0,1,3,2,2,1,1,0,0,2,1,2,0,1,1,1,1,0,0,1,1,2,0,0,1,3,0,3,2,2,2,0,0,1,0,2,0,1,0,2,1,0,2,1,2,0,2,2,3,0,1,2,3,1,1,0,1,1,0,1,3,1,1,1,1,0,1,1,2,2,2,1,0,2,1,2,2,5,0,0,1,4,2,1,2,0,1,2,1,2,3,0,0,1,0,1,0,1,2,0,3,0,0,2,2,0,3,0,2,1,0,2,1,0,1,1,1,0,1,2,1,1,1,1,1,3,0,1,1,2,0,0,0,1,1,1,1,0,0,0,1,1,0,2,2,0,2,3,0,0,1,0,0,1,2,2,0,2,0,0,1,0,0,0,0,2,3,0,1,1,1,2,4,0,2,3,0,2,1,1,2,2,3,1,2,0,1,0,0,3,2,0,2,1,2,0,0,3,0,2,0,1,0,1,2,0,3,1,1,2,1,0,0,1,0,2,1,4,3,1,1,1,1,0,1,0,1,1,0,0,0,0,0,1,1,2,1,0,1,0,1,0,0,0,1,1,0,3,2,2,1,0,1,1,2,0,0,2,0,1,1,3,2,4,2,0,2,2,0,1,1,0,3,3,3,0,1,1,0,4,1,0,2,1,1,1,1,1,0,4,1,0,0,3,0,0,2,1,1,2,0,1,0,1,0,0,0,1,2,0,2,1,2,1,0,1,0,1,1,1,1,3,1,0,1,3,1,0,3,1,1,1,1,0,1,0,1,1,1,0,2,2,2,0,1,3,3,1,0,0,1,3,1,2,0,1,1,0,1,1,1,0,0,0,1,2,0,0,0,2,1,0,2,3,1,0,1,2,0,0,0,1,1,3,0,0,3,3,0,2,2,0,2,0,1,0,1,0,0,0,0,0,3,1,0,1,0,0,0,2,0,1,1,1,0,0,2,3,1,3,0,1,0,1,3,0,0,0,0,0,1,1,2,1,0,1,0,1,1,2,0,0,0,1,0,4,1,1,2,0,2,1,1,1,3,1,1,3,3,0,0,0,0,1,0,1,1,1,0,1,1,1,1,2,1,1,3,0,1,4,0,1,2,1,1,4,0,1,0,2,2,0,4,1,2,2,2,3,2,1,0,3,1,1,0,0,3,0,3,4,3,0,0,0,0,1,2,1,2,1,1,0,0,0,0,1,1,0,1,0,3,0,1,1,0,2,0,0,0,1,0,0,1,0,2,1,4,4,0,2,1,1,0,0,1,1,2,0,0,0,0,0,4,0,0,3,1,2,1,3,1,4,2,3,0,3,0,2,0,0,1,1,0,2,1,2,2,1,2,1,2,0,1,1,0,0,1,3,0,0,3,2,2,0,1,0,0,3,1,2,3,1,1,0,0,1,3,0,0,0,0,2,0,0,1,0,3,0,1,1,1,0,1,0,1,0,1,2,0,2,0,0,0,0,0,1,0,1,1,0,1,2,0,0,0,1,1,0,0,0,1,1,2,0,0,2,1,0,1,1,2,0,0,0,2,0,2,2,2,1,1,2,2,2,1,1,1,1,2,1,0,1,1,2,0,3,1,1,0,2,1,1,0,2,0,2,0,0,2,0,1,0,0,0,2,0,1,0,1,0,1,0,1,0,0,0,1,1,0,0,0,0,1,0,0,1,0,2,0,1,2,0,4,0,0,2,3,0,3,4,0,0,2,1,1,0,1,0,2,1,0,1,1,2,2,0,0,0,0,2,1,0,0,1,1,0,0,1,1,1,3,1,0,0,0,0,2,1,0,2,3,1,2,0,0,1,3,1,1,0,0,3,3,1,0,0,2,0,1,2,2,0,1,1,1,1,0,2,2,0,1,1,0,0,1,0,0,2,3,0,0,1,0,2,0,0,2,0,1,2,0,0,1,3,2,0,1,1,0,0,1,2,2,1,1,0,3,1,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,2,1,1,1,0,0,0,1,1,1,0,0,1,2,2,2,0,0,0,1,1,2,2,2,0,0,0,0,3,3,3,0,1,2,1,0,0,1,2,0,0,0,2,1,0,1,0,0,0,2,0,1,2,0,2,0,1,3,0,1,3,1,1,2,1,2,1,0,1,0,0,2,0,0,0,0,0,0,3,1,1,0,2,1,2,0,1,2,1,1,2,0,0,0,0,1,0,3,0,2,2,0,0,1,1,1,1,0,1,1,0,0,0,2,2,2,1,3,0,0,2,0,1,5,2,2,2,1,0,2,1,0,1,1,0,1,2,1,2,1,2,1,0,0,0,0,2,1,0,2,1,2,0,0,1,0,1,3,3,2,3,3,2,2,0,0,3,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,1,0,2,0,0,1,2,1,0,1,1,1,2,0,0,3,3,0,0,1,0,1,0,2,0,2,1,1,1,1,1,0,0,1,1,0,2,1,0,1,1,1,2,0,0,0,0,1,2,1,2,0,2,0,2,0,2,1,0,0,2,0,0,1,2,0,1,0,1,3,1,1,2,0,0,1,0,1,0,1,2,1,1,3,1,0,0,0,0,0,1,1,1,0,1,0,0,1,0,1,0,0,2,2,0,1,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,0,1,0,0,0,3,0,0,0,0,0,2,4,0,0,0,2,1,1,0,1,1,1,0,0,0,1,1,0,0,0,0],"expected":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0001,0.0003,0.0006,0.0013,0.0026,0.0049,0.0084,0.0129,0.0203,0.0305,0.0443,0.0623,0.0853,0.114,0.1488,0.1908,0.2401,0.2973,0.3631,0.4375,0.5207,0.6135,0.7151,0.8259,0.9463,1.0754,1.2131,1.36,1.5148,1.6771,1.8477,2.0254,2.2094,2.3995,2.5963,2.7981,3.0044,3.2152,3.4307,3.6495,3.871,4.095,4.3223,4.5512,4.7812,5.012,5.2443,5.4772,5.7098,5.9419,6.1731,6.4047,6.635,6.8636,7.0903,7.3149,7.5386,7.7599,7.9785,8.1944,8.4074,8.6188,8.8289,9.0383,9.2491,9.4653,9.6937,9.9453,10.2343,10.58,11.0068,11.542,12.2121,13.0376,14.0251,15.1603,16.4039,17.69,18.9304,20.0247,20.8758,21.4043,21.5645,21.3448,20.5828,19.7811,18.8173,17.7931,16.7993,15.9055,15.1554,14.5666,14.1354,13.8434,13.665,13.5733,13.5425,13.5522,13.5869,13.6355,13.6911,13.7493,13.8075,13.8648,13.9199,13.9726,14.0227,14.0701,14.1149,14.1572,14.197,14.2346,14.27,14.3032,14.334,14.3627,14.3892,14.4136,14.436,14.4564,14.4749,14.4918,14.5069,14.5202,14.5318,14.5417,14.55,14.5567,14.5619,14.5656,14.568,14.569,14.5687,14.5671,14.5643,14.5602,14.5549,14.5485,14.5409,14.5323,14.5226,14.512,14.5005,14.488,14.4745,14.4602,14.4451,14.4291,14.4123,14.3948,14.3766,14.3576,14.338,14.3177,14.2968,14.2753,14.2532,14.2305,14.2073,14.1836,14.1593,14.1346,14.1094,14.0837,14.0577,14.0313,14.0046,13.9774,13.9499,13.922,13.8938,13.8653,13.8364,13.8073,13.7779,13.7483,13.7184,13.6894,13.6609,13.6321,13.6031,13.5738,13.5442,13.5144,13.4844,13.4542,13.4238,13.3933,13.3625,13.3316,13.3005,13.2692,13.2379,13.2064,13.1749,13.1436,13.1127,13.083,13.0556,13.0334,13.0211,13.028,13.0706,13.1778,13.3981,13.8107,14.5402,15.7763,17.7966,20.992,25.8904,33.1729,43.6755,58.3655,78.2862,104.4614,137.7611,178.735,227.4319,283.2319,344.7251,409.672,475.072,537.3535,592.6767,637.3183,668.0845,682.6911,680.0463,660.3878,625.2507,577.2706,519.8581,456.7993,391.8477,328.3676,269.0727,215.8846,169.5597,129.2713,98.2212,73.8552,55.2664,41.4527,31.4342,24.3222,19.3685,15.9727,13.6744,12.1335,11.1068,10.4249,9.9723,9.6711,9.4697,9.3336,9.2451,9.1882,9.1488,9.1206,9.0992,9.0819,9.0671,9.0536,9.041,9.0287,9.0165,9.0045,8.9924,8.9803,8.9681,8.9558,8.9435,8.9311,8.9186,8.907,8.8972,8.8872,8.8772,8.867,8.8568,8.8464,8.8359,8.8254,8.8147,8.804,8.7933,8.7826,8.7721,8.7621,8.7534,8.747,8.7455,8.753,8.7774,8.8324,8.9417,9.144,9.5023,10.1161,11.1389,12.7996,15.4305,19.4992,25.6427,34.7009,47.7402,66.0628,91.1887,124.8018,168.6509,224.4019,293.4424,376.6499,474.1457,585.0644,707.376,837.8009,971.8492,1104.0085,1228.0777,1337.628,1426.5476,1489.6059,1522.9671,1524.5818,1494.4041,1434.3991,1348.3424,1241.439,1119.8146,989.9487,858.121,729.9356,609.9684,501.5633,406.7768,326.4535,260.4003,207.6207,166.5723,135.4137,112.2197,95.1492,82.5619,72.8071,64.5985,58.1219,52.631,47.5211,42.6317,37.9173,33.4038,29.1529,25.234,21.7072,18.6121,15.9642,13.7556,11.9588,10.5325,9.4272,8.5905,7.9714,7.5233,7.2058,6.9853,6.8359,6.7358,6.6693,6.6254,6.5962,6.5764,6.5623,6.5518,6.5433,6.536,6.5294,6.523,6.5169,6.5109,6.5048,6.4988,6.4927,6.4866,6.4805,6.4743,6.4682,6.4619,6.4557,6.4494,6.4431,6.4368,6.4306,6.4246,6.4186,6.4125,6.4064,6.4003,6.3942,6.388,6.3818,6.3756,6.3693,6.363,6.3567,6.3504,6.344,6.3376,6.3312,6.3248,6.3183,6.3119,6.3054,6.2988,6.2923,6.2857,6.2792,6.2726,6.2659,6.2593,6.2526,6.246,6.2394,6.2328,6.2262,6.2195,6.2129,6.2062,6.1995,6.1928,6.186,6.1793,6.1725,6.1657,6.159,6.1522,6.1454,6.1385,6.1317,6.1249,6.1181,6.1113,6.1046,6.0981,6.0917,6.0857,6.0802,6.0757,6.0726,6.0715,6.0736,6.0801,6.093,6.1149,6.149,6.1995,6.2715,6.3708,6.5044,6.6797,6.9048,7.1872,7.5341,7.9509,8.441,9.0042,9.6366,10.3297,11.07,11.8389,12.6136,13.3677,14.0727,14.6994,15.2204,15.6116,15.8542,15.9362,15.8531,15.6088,15.2146,14.6889,14.0554,13.3414,12.5759,11.7876,11.003,10.2456,9.5339,8.882,8.2988,7.7887,7.3518,6.9853,6.6838,6.4403,6.2471,6.0963,5.9803,5.8922,5.8261,5.7767,5.7398,5.7122,5.6912,5.6748,5.6617,5.6507,5.6412,5.6326,5.6247,5.6171,5.6097,5.6025,5.5954,5.5884,5.5813,5.5743,5.5674,5.5604,5.5534,5.5465,5.5395,5.5326,5.5257,5.5188,5.5118,5.5049,5.498,5.4912,5.4843,5.4774,5.4706,5.4639,5.4572,5.4506,5.4443,5.4384,5.4331,5.4288,5.4261,5.4257,5.4289,5.4376,5.4543,5.4827,5.5275,5.5955,5.6952,5.838,6.0377,6.3116,6.6802,7.1674,7.8,8.6072,9.6192,10.8659,12.3745,14.1672,16.2583,18.6514,21.3366,24.2881,27.4627,30.7995,34.2202,37.6318,40.9299,44.0038,46.7425,49.0413,50.8079,51.9695,52.4766,52.3073,51.4686,49.996,47.9505,45.4152,42.489,39.2806,35.9015,32.4602,29.056,25.7754,22.6884,19.8475,17.2874,15.026,13.0663,11.3994,10.0067,8.8633,7.9404,7.2078,6.6355,6.1954,5.8621,5.6132,5.4298,5.2963,5.2001,5.1312,5.0821,5.0469,5.0215,5.0027,4.9885,4.9772,4.9679,4.9598,4.9525,4.9457,4.9391,4.9328,4.9266,4.9205,4.9144,4.9084,4.9023,4.8963,4.8903,4.8843,4.8784,4.8724,4.8665,4.8606,4.8548,4.8491,4.8436,4.8383,4.8335,4.8293,4.8262,4.8246,4.8255,4.8298,4.8394,4.8565,4.8843,4.9272,4.9909,5.0829,5.2129,5.3929,5.638,5.9659,6.3979,6.9579,7.6729,8.5718,9.6846,11.041,12.6683,14.5898,16.8218,19.3714,22.2338,25.3903,28.8065,32.4314,36.1973,40.0211,43.8071,47.4497,50.8388,53.8648,56.4244,58.4267,59.7981,60.487,60.4672,59.7393,58.3305,56.2934,53.7022,50.6486,47.2362,43.5747,39.7743,35.9399,32.1672,28.5384,25.1207,21.9644,19.1032,16.5553,14.3249,12.4045,10.7775,9.4204,8.3057,7.4037,6.6844,6.119,5.6807,5.3454,5.0923,4.9035,4.7642,4.6625,4.5887,4.5355,4.4972,4.4694,4.4491,4.4339,4.4221,4.4127,4.4049,4.3981,4.3919,4.3861,4.3807,4.3753,4.3701,4.365,4.3599,4.3548,4.3497,4.3447,4.3396,4.3346,4.3296,4.3246,4.3196,4.3146,4.3097,4.3047,4.2998,4.2948,4.2899,4.285,4.28,4.2751,4.2703,4.2654,4.2605,4.2557,4.2508,4.246,4.2411,4.2363,4.2315,4.2267,4.2219,4.2171,4.2123,4.2075,4.2028,4.198,4.1933,4.1885,4.1838,4.1791,4.1744,4.1697,4.165,4.1603,4.1556,4.151,4.1463,4.1416,4.137,4.1324,4.1277,4.1231,4.1185,4.1139,4.1093,4.1047,4.1002,4.0956,4.091,4.0865,4.0819,4.0774,4.0729,4.0684,4.0639,4.0594,4.0549,4.0504,4.0459,4.0414,4.037,4.0325,4.0281,4.0237,4.0192,4.0148,4.0104,4.006,4.0016,3.9972,3.9928,3.9885,3.9841,3.9797,3.9754,3.9711,3.9667,3.9624,3.9581,3.9538,3.9495,3.9452,3.9409,3.9366,3.9324,3.9281,3.9239,3.9196,3.9154,3.9111,3.9069,3.9027,3.8985,3.8943,3.8901,3.8859,3.8818,3.8776,3.8734,3.8693,3.8651,3.861,3.8569,3.8528,3.8486,3.8445,3.8404,3.8363,3.8323,3.8282,3.8241,3.8201,3.816,3.8119,3.8079,3.8039,3.7999,3.7958,3.7918,3.7878,3.7838,3.7798,3.7759,3.7719,3.7679,3.764,3.76,3.7561,3.7521,3.7482,3.7443,3.7403,3.7364,3.7325,3.7286,3.7248,3.7209,3.717,3.7131,3.7093,3.7054,3.7016,3.6977,3.6939,3.6901,3.6863,3.6824,3.6786,3.6748,3.671,3.6673,3.6635,3.6597,3.656,3.6522,3.6484,3.6447,3.641,3.6372,3.6335,3.6298,3.6261,3.6224,3.6187,3.615,3.6113,3.6076,3.604,3.6003,3.5966,3.593,3.5893,3.5857,3.5821,3.5785,3.5748,3.5712,3.5676,3.564,3.5604,3.5568,3.5533,3.5497,3.5461,3.5426,3.539,3.5355,3.5319,3.5284,3.5248,3.5213,3.5178,3.5143,3.5108,3.5073,3.5038,3.5003,3.4968,3.4934,3.4899,3.4864,3.483,3.4795,3.4761,3.4727,3.4692,3.4658,3.4624,3.459,3.4556,3.4522,3.4488,3.4454,3.442,3.4386,3.4352,3.4319,3.4285,3.4252,3.4218,3.4185,3.4151,3.4118,3.4085,3.4052,3.4019,3.3986,3.3953,3.392,3.3887,3.3854,3.3821,3.3788,3.3756,3.3723,3.3691,3.3658,3.3626,3.3593,3.3561,3.3529,3.3496,3.3464,3.3432,3.34,3.3368,3.3336,3.3304,3.3272,3.3241,3.3209,3.3177,3.3146,3.3114,3.3083,3.3051,3.302,3.2988,3.2957,3.2926,3.2895,3.2864,3.2833,3.2802,3.2771,3.274,3.2709,3.2678,3.2647,3.2617,3.2586,3.2555,3.2525,3.2494,3.2464,3.2433,3.2403,3.2373,3.2343,3.2312,3.2282,3.2252,3.2222,3.2192,3.2162,3.2132,3.2103,3.2073,3.2043,3.2013,3.1984,3.1954,3.1925,3.1895,3.1866,3.1836,3.1807,3.1778,3.1749,3.1719,3.169,3.1661,3.1632,3.1603,3.1574,3.1545,3.1516,3.1488,3.1459,3.143,3.1402,3.1373,3.1344,3.1316,3.1287,3.1259,3.1231,3.1202,3.1174,3.1146,3.1118,3.1089,3.1061,3.1033,3.1005,3.0977,3.095,3.0922,3.0894,3.0866,3.0838,3.0811,3.0783,3.0756,3.0728,3.07,3.0673,3.0646,3.0618,3.0591,3.0564,3.0536,3.0509,3.0482,3.0455,3.0428,3.0401,3.0374,3.0347,3.032,3.0293,3.0267,3.024,3.0213,3.0187,3.016,3.0133,3.0107,3.008,3.0054,3.0028,3.0001,2.9975,2.9949,2.9922,2.9896,2.987,2.9844,2.9818,2.9792,2.9766,2.974,2.9714,2.9688,2.9663,2.9637,2.9611,2.9585,2.956,2.9534,2.9509,2.9483,2.9458,2.9432,2.9407,2.9381,2.9356,2.9331,2.9306,2.928,2.9255,2.923,2.9205,2.918,2.9155,2.913,2.9105,2.908,2.9056,2.9031,2.9006,2.8981,2.8957,2.8932,2.8908,2.8883,2.8858,2.8834,2.881,2.8785,2.8761,2.8736,2.8712,2.8688,2.8664,2.864,2.8615,2.8591,2.8567,2.8543,2.8519,2.8495,2.8471,2.8448,2.8424,2.84,2.8376,2.8352,2.8329,2.8305,2.8281,2.8258,2.8234,2.8211,2.8187,2.8164,2.8141,2.8117,2.8094,2.8071,2.8047,2.8024,2.8001,2.7978,2.7955,2.7932,2.7908,2.7885,2.7863,2.784,2.7817,2.7794,2.7771,2.7748,2.7725,2.7703,2.768,2.7657,2.7635,2.7612,2.759,2.7567,2.7545,2.7522,2.75,2.7477,2.7455,2.7433,2.741,2.7388,2.7366,2.7344,2.7322,2.73,2.7278,2.7256,2.7234,2.7212,2.719,2.7168,2.7146,2.7125,2.7103,2.7081,2.706,2.7039,2.7017,2.6996,2.6975,2.6954,2.6933,2.6913,2.6892,2.6872,2.6851,2.6831,2.6811,2.6791,2.6771,2.6751,2.6731,2.6711,2.6692,2.6672,2.6652,2.6632,2.6612,2.6592,2.6572,2.6551,2.6531,2.651,2.6489,2.6468,2.6447,2.6425,2.6404,2.6382,2.636,2.6338,2.6316,2.6294,2.6272,2.625,2.6228,2.6207,2.6185,2.6163,2.6142,2.612,2.6099,2.6077,2.6056,2.6035,2.6014,2.5994,2.5973,2.5952,2.5932,2.5912,2.5891,2.5871,2.5851,2.5831,2.5811,2.5791,2.5771,2.5751,2.5731,2.5711,2.5691,2.5672,2.5652,2.5632,2.5613,2.5593,2.5573,2.5554,2.5534,2.5515,2.5495,2.5476,2.5457,2.5437,2.5418,2.5399,2.5379,2.536,2.5341,2.5321,2.5302,2.5283,2.5264,2.5245,2.5226,2.5207,2.5188,2.5169,2.515,2.5131,2.5112,2.5093,2.5074,2.5055,2.5036,2.5018,2.4999,2.498,2.4961,2.4943,2.4924,2.4905,2.4887,2.4868,2.485,2.4831,2.4813,2.4794,2.4776,2.4757,2.4739,2.4721,2.4702,2.4684,2.4666,2.4647,2.4629,2.4611,2.4593,2.4575,2.4556,2.4538,2.452,2.4502,2.4484,2.4466,2.4448,2.443,2.4412,2.4394,2.4376,2.4358,2.4341,2.4323,2.4305,2.4287,2.4269,2.4252,2.4234,2.4216,2.4199,2.4181,2.4163,2.4146,2.4128,2.4111,2.4093,2.4076,2.4058,2.4041,2.4023,2.4006,2.3989,2.3971,2.3954,2.3937,2.392,2.3902,2.3885,2.3868,2.3851,2.3834,2.3816,2.3799,2.3782,2.3765,2.3748,2.3731,2.3714,2.3697,2.3681,2.3664,2.3647,2.363,2.3613,2.3597,2.358,2.3563,2.3547,2.353,2.3514,2.3497,2.348,2.3464,2.3447,2.3431,2.3414,2.3398,2.3382,2.3365,2.3349,2.3332,2.3316,2.3299,2.3283,2.3267,2.325,2.3234,2.3217,2.3201,2.3184,2.3168,2.3152,2.3135,2.3119,2.3103,2.3086,2.307,2.3054,2.3038,2.3021,2.3005,2.2989,2.2973,2.2957,2.2941,2.2925,2.2909,2.2893,2.2877,2.2861,2.2845,2.2829,2.2813,2.2798,2.2782,2.2766,2.275,2.2735,2.2719,2.2703,2.2688,2.2672,2.2656,2.2641,2.2625,2.261,2.2594,2.2579,2.2563,2.2548,2.2532,2.2517,2.2502,2.2486,2.2471,2.2456,2.244,2.2425,2.241,2.2394,2.2379,2.2364,2.2349,2.2334,2.2318,2.2303,2.2288,2.2273,2.2258,2.2243,2.2228,2.2213,2.2198,2.2183,2.2168,2.2153,2.2138,2.2123,2.2108,2.2093,2.2078,2.2064,2.2049,2.2034,2.2019,2.2004,2.199,2.1975,2.196,2.1946,2.1931,2.1916,2.1902,2.1887,2.1872,2.1858,2.1843,2.1829,2.1814,2.18,2.1785,2.1771,2.1756,2.1742,2.1727,2.1713,2.1699,2.1684,2.167,2.1656,2.1641,2.1627,2.1613,2.1598,2.1584,2.157,2.1556,2.1542,2.1528,2.1514,2.1499,2.1485,2.1472,2.1458,2.1444,2.143,2.1417,2.1404,2.1391,2.1379,2.1367,2.1356,2.1346,2.1336,2.1329,2.1323,2.1319,2.1318,2.1321,2.1327,2.1339,2.1357,2.1381,2.1415,2.1458,2.1512,2.1579,2.1662,2.1761,2.188,2.2019,2.2181,2.2368,2.2581,2.2822,2.3093,2.3394,2.3726,2.4088,2.448,2.4899,2.5345,2.5813,2.63,2.6801,2.7312,2.7825,2.8336,2.8835,2.9317,2.9774,3.0198,3.0582,3.092,3.1205,3.1432,3.1597,3.1697,3.1729,3.1692,3.1588,3.1417,3.1183,3.0889,3.0542,3.0145,2.9707,2.9234,2.8733,2.8212,2.7678,2.7138,2.66,2.6069,2.555,2.5049,2.457,2.4115,2.3688,2.329,2.2923,2.2585,2.2279,2.2002,2.1753,2.1531,2.1335,2.1163,2.1012,2.088,2.0766,2.0668,2.0583,2.051,2.0448,2.0394,2.0348,2.0308,2.0274,2.0244,2.0217,2.0194,2.0173,2.0153,2.0136,2.0119,2.0104,2.0089,2.0075,2.0061,2.0048,2.0035,2.0022,2.0009,1.9997,1.9984,1.9972,1.9959,1.9947,1.9935,1.9922,1.991,1.9898,1.9886,1.9873,1.9861,1.9849,1.9837,1.9825,1.9813,1.9801,1.9789,1.9776,1.9764,1.9752,1.974,1.9728,1.9716,1.9704,1.9692,1.968,1.9668,1.9657,1.9645,1.9633,1.9621,1.9609,1.9597,1.9585,1.9573,1.9562,1.955,1.9538,1.9526,1.9514,1.9503,1.9491,1.9479,1.9468,1.9456,1.9444,1.9432,1.9421,1.9409,1.9398,1.9386,1.9374,1.9363,1.9351,1.934,1.9328,1.9317,1.9305,1.9294,1.9282,1.9271,1.9259,1.9248,1.9237,1.9226,1.9214,1.9203,1.9193,1.9182,1.9171,1.9161,1.9151,1.9141,1.9132,1.9124,1.9116,1.9108,1.9102,1.9096,1.9092,1.9089,1.9088,1.9088,1.909,1.9095,1.9101,1.9111,1.9123,1.9138,1.9157,1.9178,1.9203,1.9232,1.9264,1.93,1.9339,1.9381,1.9426,1.9473,1.9523,1.9574,1.9626,1.9678,1.973,1.9781,1.9829,1.9875,1.9917,1.9955,1.9988,2.0014,2.0035,2.0048,2.0054,2.0052,2.0043,2.0025,2.0,1.9967,1.9928,1.9881,1.9829,1.9771,1.9709,1.9642,1.9573,1.9501,1.9428,1.9354,1.928,1.9207,1.9136,1.9066,1.8998,1.8934,1.8872,1.8814,1.8759,1.8707,1.866,1.8615,1.8574,1.8536,1.8501,1.847,1.844,1.8414,1.8389,1.8367,1.8346,1.8327,1.8309,1.8292,1.8277,1.8262,1.8248,1.8235,1.8223,1.821,1.8199,1.8187,1.8176,1.8165,1.8154,1.8143,1.8133,1.8122,1.8112,1.8102,1.8091,1.8081,1.8071,1.8061,1.805,1.804,1.803,1.802,1.801,1.8,1.799,1.7979,1.7969,1.7959,1.7949,1.7939,1.7929,1.7919,1.7909,1.7899,1.7889,1.7879,1.7869,1.7859,1.7849,1.7839,1.783,1.782,1.781,1.78,1.779,1.778,1.777,1.776,1.7751,1.7741,1.7731,1.7721,1.7711,1.7701,1.7692,1.7682,1.7672,1.7662,1.7653,1.7643,1.7633,1.7624,1.7614,1.7604,1.7594,1.7585,1.7575,1.7565,1.7556,1.7546,1.7537,1.7527,1.7517,1.7508,1.7498,1.7489,1.7479,1.747,1.746,1.745,1.7441,1.7431,1.7422,1.7412,1.7403,1.7393,1.7384,1.7375,1.7365,1.7356,1.7346,1.7337,1.7327,1.7318,1.7309,1.7299,1.729,1.7281,1.7271,1.7262,1.7253,1.7243,1.7234,1.7225,1.7215,1.7206,1.7197,1.7188,1.7178,1.7169,1.716,1.7151,1.7141,1.7132,1.7123,1.7114,1.7105,1.7095,1.7086,1.7077,1.7068,1.7059,1.705,1.7041,1.7032,1.7022,1.7013,1.7004,1.6995,1.6986,1.6977,1.6968,1.6959,1.695,1.6941,1.6932,1.6923,1.6914,1.6905,1.6896,1.6887,1.6878,1.6869,1.686,1.6851,1.6842,1.6834,1.6825,1.6816,1.6807,1.6798,1.6789,1.678,1.6771,1.6763,1.6754,1.6745,1.6736,1.6727,1.6719,1.671,1.6701,1.6692,1.6683,1.6675,1.6666,1.6657,1.6649,1.664,1.6631,1.6622,1.6614,1.6605,1.6596,1.6588,1.6579,1.657,1.6562,1.6553,1.6545,1.6536,1.6527,1.6519,1.651,1.6502,1.6493,1.6484,1.6476,1.6467,1.6459,1.645,1.6442,1.6433,1.6425,1.6416,1.6408,1.6399,1.6391,1.6382,1.6374,1.6365,1.6357,1.6349,1.634,1.6332,1.6323,1.6315,1.6307,1.6298,1.629,1.6281,1.6273,1.6265,1.6256,1.6248,1.624,1.6231,1.6223,1.6215,1.6207,1.6198,1.619,1.6182,1.6173,1.6165,1.6157,1.6149,1.614,1.6132,1.6124,1.6116,1.6108,1.6099,1.6091,1.6083,1.6075,1.6067,1.6059,1.605,1.6042,1.6034,1.6026,1.6018,1.601,1.6002,1.5994,1.5986,1.5978,1.5969,1.5961,1.5953,1.5945,1.5937,1.5929,1.5921,1.5913,1.5905,1.5897,1.5889,1.5881,1.5873,1.5865,1.5857,1.5849,1.5841,1.5833,1.5826,1.5818,1.581,1.5802,1.5794,1.5786,1.5778,1.577,1.5762,1.5755,1.5747,1.5739,1.5731,1.5723,1.5715,1.5707,1.57,1.5692,1.5684,1.5676,1.5669,1.5661,1.5653,1.5645,1.5637,1.563,1.5622,1.5614,1.5607,1.5599,1.5591,1.5583,1.5576,1.5568,1.556,1.5553,1.5545,1.5537,1.553,1.5522,1.5514,1.5507,1.5499,1.5491,1.5484,1.5476,1.5469,1.5461,1.5453,1.5446,1.5438,1.5431,1.5423,1.5416,1.5408,1.5401,1.5393,1.5386,1.5378,1.5371,1.5363,1.5356,1.5348,1.5341,1.5333,1.5326,1.5318,1.5311,1.5303,1.5296,1.5288,1.5281,1.5274,1.5266,1.5259,1.5251,1.5244,1.5237,1.5229,1.5222,1.5214,1.5207,1.52,1.5192,1.5185,1.5178,1.517,1.5163,1.5156,1.5148,1.5141,1.5134,1.5127,1.5119,1.5112,1.5105,1.5098,1.509,1.5083,1.5076,1.5069,1.5061,1.5054,1.5047,1.504,1.5032,1.5025,1.5018,1.5011,1.5004,1.4997,1.4989,1.4982,1.4975,1.4968,1.4961,1.4954,1.4947,1.4939,1.4932,1.4925,1.4918,1.4911,1.4904,1.4897,1.489,1.4883,1.4876,1.4869,1.4862,1.4855,1.4847,1.484,1.4833,1.4826,1.4819,1.4812,1.4805,1.4798,1.4791,1.4784,1.4777,1.4771,1.4764,1.4757,1.475,1.4743,1.4736,1.4729,1.4722,1.4715,1.4708,1.4701,1.4694,1.4687,1.468,1.4674,1.4667,1.466,1.4653,1.4646,1.4639,1.4632,1.4626,1.4619,1.4612,1.4605,1.4598,1.4592,1.4585,1.4578,1.4571,1.4564,1.4558,1.4551,1.4544,1.4537,1.453,1.4524,1.4517,1.451,1.4504,1.4497,1.449,1.4483,1.4477,1.447,1.4463,1.4457,1.445,1.4443,1.4436,1.443,1.4423,1.4417,1.441,1.4403,1.4397,1.439,1.4383,1.4377,1.437,1.4363,1.4357,1.435,1.4344,1.4337,1.433,1.4324,1.4317,1.4311,1.4304,1.4298,1.4291,1.4285,1.4278,1.4271,1.4265,1.4258,1.4252,1.4245,1.4239,1.4232,1.4226,1.4219,1.4213,1.4206,1.42,1.4193,1.4187,1.4181,1.4174,1.4168,1.4161,1.4155,1.4148,1.4142,1.4136,1.4129,1.4123,1.4116,1.411,1.4104,1.4097,1.4091,1.4084,1.4078,1.4072,1.4065,1.4059,1.4053,1.4046,1.404,1.4034,1.4027,1.4021,1.4015,1.4008,1.4002,1.3996,1.3989,1.3983,1.3977,1.3971,1.3964,1.3958,1.3952,1.3946,1.3939,1.3933,1.3927,1.3921,1.3914,1.3908,1.3902,1.3896,1.3889,1.3883,1.3877,1.3871,1.3865,1.3858,1.3852,1.3846,1.384,1.3834,1.3828,1.3821,1.3815,1.3809,1.3803,1.3797,1.3791,1.3785,1.3779,1.3772,1.3766,1.376,1.3754,1.3748,1.3742,1.3736,1.373,1.3724,1.3718,1.3712,1.3705,1.3699,1.3693,1.3687,1.3681,1.3675,1.3669,1.3663,1.3657,1.3651,1.3645,1.3639,1.3633,1.3627,1.3621,1.3615,1.3609,1.3603,1.3597,1.3591,1.3585,1.3579,1.3573,1.3567,1.3562,1.3556,1.355,1.3544,1.3538,1.3532,1.3526,1.352,1.3514,1.3508,1.3502,1.3497,1.3491,1.3485,1.3479,1.3473,1.3467,1.3461,1.3455,1.345,1.3444,1.3438,1.3432,1.3426,1.342,1.3415,1.3409,1.3403,1.3397,1.3391,1.3386,1.338,1.3374,1.3368,1.3362,1.3357,1.3351,1.3345,1.3339,1.3334,1.3328,1.3322,1.3316,1.3311,1.3305,1.3299,1.3293,1.3288,1.3282,1.3276,1.3271,1.3265,1.3259,1.3253,1.3248,1.3242,1.3236,1.3231,1.3225,1.3219,1.3214,1.3208,1.3202,1.3197,1.3191,1.3185,1.318,1.3174,1.3169,1.3163,1.3157,1.3152,1.3146,1.314,1.3135,1.3129,1.3124,1.3118,1.3113,1.3107,1.3101,1.3096,1.309,1.3085,1.3079,1.3074,1.3068,1.3062,1.3057,1.3051,1.3046,1.304,1.3035,1.3029,1.3024,1.3018,1.3013,1.3007,1.3002,1.2996,1.2991,1.2985,1.298,1.2974,1.2969,1.2963,1.2958,1.2952,1.2947,1.2942,1.2936,1.2931,1.2925,1.292,1.2914,1.2909,1.2904,1.2898,1.2893,1.2887,1.2882,1.2877,1.2871,1.2866,1.286,1.2855,1.285,1.2844,1.2839,1.2833,1.2828,1.2823,1.2817,1.2812,1.2807,1.2801,1.2796,1.2791,1.2785,1.278,1.2775,1.2769,1.2764,1.2759,1.2753,1.2748,1.2743,1.2738,1.2732,1.2727,1.2722,1.2716,1.2711,1.2706,1.2701,1.2695,1.269,1.2685,1.268,1.2674,1.2669,1.2664,1.2659,1.2653,1.2648,1.2643,1.2638,1.2632,1.2627,1.2622,1.2617,1.2612,1.2606,1.2601,1.2596,1.2591,1.2586,1.258,1.2575,1.257,1.2565,1.256,1.2555,1.2549,1.2544,1.2539,1.2534,1.2529,1.2524,1.2519,1.2513,1.2508,1.2503,1.2498,1.2493,1.2488,1.2483,1.2478,1.2473,1.2468,1.2462,1.2457,1.2452,1.2447,1.2442,1.2437,1.2432,1.2427,1.2422,1.2417,1.2412,1.2407,1.2402,1.2397,1.2392,1.2386,1.2381,1.2376,1.2371,1.2366,1.2361,1.2356,1.2351,1.2346,1.2341,1.2336,1.2331,1.2326,1.2321,1.2316,1.2311,1.2306,1.2301,1.2296,1.2291,1.2286,1.2282,1.2277,1.2272,1.2267,1.2262,1.2257,1.2252,1.2247,1.2242,1.2237,1.2232,1.2227,1.2222,1.2217,1.2212,1.2207,1.2203,1.2198,1.2193,1.2188,1.2183,1.2178,1.2173,1.2168,1.2163,1.2159,1.2154,1.2149,1.2144,1.2139,1.2134,1.2129,1.2125,1.212,1.2115,1.211,1.2105,1.21,1.2095,1.2091,1.2086,1.2081,1.2076,1.2071,1.2067,1.2062,1.2057,1.2052,1.2047,1.2043,1.2038,1.2033,1.2028,1.2023,1.2019,1.2014,1.2009,1.2004,1.1999,1.1995,1.199,1.1985,1.198,1.1976,1.1971,1.1966,1.1961,1.1957,1.1952,1.1947,1.1943,1.1938,1.1933,1.1928,1.1924,1.1919,1.1914,1.1909,1.1905,1.19,1.1895,1.1891,1.1886,1.1881,1.1877,1.1872,1.1867,1.1863,1.1858,1.1853,1.1849,1.1844,1.1839,1.1835,1.183,1.1825,1.1821,1.1816,1.1811,1.1807,1.1802,1.1797,1.1793,1.1788,1.1784,1.1779,1.1774,1.177,1.1765,1.176,1.1756,1.1751,1.1747,1.1742,1.1737,1.1733,1.1728,1.1724,1.1719,1.1714,1.171,1.1705,1.1701,1.1696,1.1692,1.1687,1.1683,1.1678,1.1673,1.1669,1.1664,1.166,1.1655,1.1651,1.1646,1.1642,1.1637,1.1633,1.1628,1.1623,1.1619,1.1614,1.161,1.1605,1.1601,1.1596,1.1592,1.1587,1.1583,1.1578,1.1574,1.1569,1.1565,1.156,1.1556,1.1551,1.1547,1.1542,1.1538,1.1534,1.1529,1.1525,1.152,1.1516,1.1511,1.1507,1.1502,1.1498,1.1493,1.1489,1.1485,1.148,1.1476,1.1471,1.1467,1.1462,1.1458,1.1454,1.1449,1.1445,1.144,1.1436,1.1431,1.1427,1.1423,1.1418,1.1414,1.1409,1.1405,1.1401,1.1396,1.1392,1.1388,1.1383,1.1379,1.1374,1.137,1.1366,1.1361,1.1357,1.1353,1.1348,1.1344,1.134,1.1335,1.1331,1.1326,1.1322,1.1318,1.1313,1.1309,1.1305,1.13,1.1296,1.1292,1.1287,1.1283,1.1279,1.1274,1.127,1.1266,1.1262,1.1257,1.1253,1.1249,1.1244,1.124,1.1236,1.1231,1.1227,1.1223,1.1219,1.1214,1.121,1.1206,1.1201,1.1197,1.1193,1.1189,1.1184,1.118,1.1176,1.1172,1.1167,1.1163,1.1159,1.1155,1.115,1.1146,1.1142,1.1138,1.1133,1.1129,1.1125,1.1121,1.1116,1.1112,1.1108,1.1104,1.1099,1.1095,1.1091,1.1087,1.1083,1.1078,1.1074,1.107,1.1066,1.1062,1.1057,1.1053,1.1049,1.1045,1.1041,1.1036,1.1032,1.1028,1.1024,1.102,1.1016,1.1011,1.1007,1.1003,1.0999,1.0995,1.099,1.0986,1.0982,1.0978,1.0974,1.097,1.0966,1.0961,1.0957,1.0953,1.0949,1.0945,1.0941,1.0937,1.0932,1.0928,1.0924,1.092,1.0916,1.0912,1.0908,1.0903,1.0899,1.0895,1.0891,1.0887,1.0883,1.0879,1.0875,1.0871,1.0866,1.0862,1.0858,1.0854,1.085,1.0846,1.0842,1.0838,1.0834,1.083,1.0826,1.0821,1.0817,1.0813,1.0809,1.0805,1.0801,1.0797,1.0793,1.0789,1.0785,1.0781,1.0777,1.0773,1.0769,1.0765,1.076,1.0756,1.0752,1.0748,1.0744,1.074,1.0736,1.0732,1.0728,1.0724,1.072,1.0716,1.0712,1.0708,1.0704,1.07,1.0696,1.0692,1.0688,1.0684,1.068,1.0676,1.0672,1.0668,1.0664,1.066,1.0656,1.0652,1.0648,1.0644,1.064,1.0636,1.0632,1.0628,1.0624,1.062,1.0616,1.0612,1.0608,1.0604,1.06,1.0596,1.0592,1.0588,1.0584,1.058,1.0576,1.0572,1.0568,1.0564,1.056,1.0556,1.0552,1.0548,1.0544,1.054,1.0536,1.0532,1.0528,1.0525,1.0521,1.0517,1.0513,1.0509,1.0505,1.0501,1.0497,1.0493,1.0489,1.0485,1.0481,1.0477,1.0473,1.0469,1.0465,1.0462,1.0458,1.0454,1.045,1.0446,1.0442,1.0438,1.0434,1.043,1.0426,1.0422,1.0419,1.0415,1.0411,1.0407,1.0403,1.0399,1.0395,1.0391,1.0387,1.0383,1.038,1.0376,1.0372,1.0368,1.0364,1.036,1.0356,1.0352,1.0348,1.0345,1.0341,1.0337,1.0333,1.0329,1.0325,1.0321,1.0317,1.0314,1.031,1.0306,1.0302,1.0298,1.0294,1.029,1.0287,1.0283,1.0279,1.0275,1.0271,1.0267,1.0264,1.026,1.0256,1.0252,1.0248,1.0244,1.024,1.0237,1.0233,1.0229,1.0225,1.0221,1.0217,1.0214,1.021,1.0206,1.0202,1.0198,1.0194,1.0191,1.0187,1.0183,1.0179,1.0175,1.0172,1.0168,1.0164,1.016,1.0156,1.0153,1.0149,1.0145,1.0141,1.0137,1.0134,1.013,1.0126,1.0122,1.0118,1.0115,1.0111,1.0107,1.0103,1.0099,1.0096,1.0092,1.0088,1.0084,1.008,1.0077,1.0073,1.0069,1.0065,1.0062,1.0058,1.0054,1.005,1.0046,1.0043,1.0039,1.0035,1.0031,1.0028,1.0024,1.002,1.0016,1.0013,1.0009,1.0005,1.0001,0.9997,0.9994,0.999,0.9986,0.9982,0.9979,0.9975,0.9971,0.9967,0.9964,0.996,0.9956,0.9953,0.9949,0.9945,0.9941,0.9938,0.9934,0.993,0.9926,0.9923,0.9919,0.9915,0.9911,0.9908,0.9904,0.99,0.9896,0.9893,0.9889,0.9885,0.9882,0.9878,0.9874,0.987,0.9867,0.9863,0.9859,0.9856,0.9852,0.9848,0.9844,0.9841,0.9837,0.9833,0.983,0.9826,0.9822,0.9818,0.9815,0.9811,0.9807,0.9804,0.98,0.9796,0.9793,0.9789,0.9785,0.9781,0.9778,0.9774,0.977,0.9767,0.9763,0.9759,0.9756,0.9752,0.9748,0.9745,0.9741,0.9737,0.9734,0.973,0.9726,0.9723,0.9719,0.9715,0.9712,0.9708,0.9704,0.97,0.9697,0.9693,0.9689,0.9686,0.9682,0.9678,0.9675,0.9671,0.9667,0.9664,0.966,0.9656,0.9653,0.9649,0.9646,0.9642,0.9638,0.9635,0.9631,0.9627,0.9624,0.962,0.9616,0.9613,0.9609,0.9605,0.9602,0.9598,0.9594,0.9591,0.9587,0.9583,0.958,0.9576,0.9573,0.9569,0.9565,0.9562,0.9558,0.9554,0.9551,0.9547,0.9543,0.954,0.9536,0.9533,0.9529,0.9525,0.9522,0.9518,0.9514,0.9511,0.9507,0.9504,0.95,0.9496,0.9493,0.9489,0.9485,0.9482,0.9478,0.9475,0.9471,0.9467,0.9464,0.946,0.9456,0.9453,0.9449,0.9446,0.9442,0.9438,0.9435,0.9431,0.9428,0.9424,0.942,0.9417,0.9413,0.941,0.9406,0.9402,0.9399,0.9395,0.9392,0.9388,0.9384,0.9381,0.9377,0.9374,0.937,0.9366,0.9363,0.9359,0.9356,0.9352,0.9348,0.9345,0.9341,0.9338,0.9334,0.9331,0.9327,0.9323,0.932,0.9316,0.9313,0.9309,0.9305,0.9302,0.9298,0.9295,0.9291,0.9288,0.9284,0.928,0.9277,0.9273,0.927,0.9266,0.9263,0.9259,0.9255,0.9252,0.9248,0.9245,0.9241,0.9238,0.9234,0.923,0.9227,0.9223,0.922,0.9216,0.9213,0.9209,0.9205,0.9202,0.9198,0.9195,0.9191,0.9188,0.9184,0.9181,0.9177,0.9173,0.917,0.9166,0.9163,0.9159,0.9156,0.9152,0.9149,0.9145,0.9141,0.9138,0.9134,0.9131,0.9127,0.9124,0.912,0.9117,0.9113,0.911,0.9106,0.9102,0.9099,0.9095,0.9092,0.9088,0.9085,0.9081,0.9078,0.9074,0.9071,0.9067,0.9064,0.906,0.9056,0.9053,0.9049,0.9046,0.9042,0.9039,0.9035,0.9032,0.9028,0.9025,0.9021,0.9018,0.9014,0.9011,0.9007,0.9004,0.9,0.8996,0.8993,0.8989,0.8986,0.8982,0.8979,0.8975,0.8972,0.8968,0.8965,0.8961,0.8958,0.8954,0.8951,0.8947,0.8944,0.894,0.8937,0.8933,0.893,0.8926,0.8923,0.8919,0.8916,0.8912,0.8909,0.8905,0.8902,0.8898,0.8895,0.8891,0.8888,0.8884,0.8881,0.8877,0.8874,0.887,0.8867,0.8863,0.886,0.8856,0.8853,0.8849,0.8846,0.8842,0.8839,0.8835,0.8832,0.8828,0.8825,0.8821,0.8818,0.8814,0.8811,0.8807,0.8804,0.88,0.8797,0.8793,0.879,0.8786,0.8783,0.8779,0.8776,0.8772,0.8769,0.8765,0.8762,0.8758,0.8755,0.8751,0.8748,0.8744,0.8741,0.8737,0.8734,0.873,0.8727,0.8723,0.872,0.8717,0.8713,0.871,0.8706,0.8703,0.8699,0.8696,0.8692,0.8689,0.8685,0.8682,0.8678,0.8675,0.8671,0.8668,0.8664,0.8661,0.8657,0.8654,0.8651,0.8647,0.8644,0.864,0.8637,0.8633,0.863,0.8626,0.8623,0.8619,0.8616,0.8612,0.8609,0.8605,0.8602,0.8599,0.8595,0.8592,0.8588,0.8585,0.8581,0.8578,0.8574,0.8571,0.8567,0.8564,0.8561,0.8557,0.8554,0.855,0.8547,0.8543,0.854,0.8536,0.8533,0.8529,0.8526,0.8523,0.8519,0.8516,0.8512,0.8509,0.8505,0.8502,0.8498,0.8495,0.8492,0.8488,0.8485,0.8481,0.8478,0.8474,0.8471,0.8467,0.8464,0.8461,0.8457,0.8454,0.845,0.8447,0.8443,0.844,0.8437,0.8433,0.843,0.8426,0.8423,0.8419,0.8416,0.8413,0.8409,0.8406,0.8402,0.8399,0.8395,0.8392,0.8388,0.8385,0.8382,0.8378,0.8375,0.8371,0.8368,0.8365,0.8361,0.8358,0.8354,0.8351,0.8347,0.8344,0.8341,0.8337,0.8334,0.833,0.8327,0.8323,0.832,0.8317,0.8313,0.831,0.8306,0.8303,0.83,0.8296,0.8293,0.8289,0.8286,0.8282,0.8279,0.8276,0.8272,0.8269,0.8265,0.8262,0.8259,0.8255,0.8252,0.8248,0.8245,0.8242,0.8238,0.8235,0.8231,0.8228,0.8224,0.8221,0.8218,0.8214,0.8211,0.8207,0.8204,0.8201,0.8197,0.8194,0.819,0.8187,0.8184,0.818,0.8177,0.8173,0.817,0.8167,0.8163,0.816,0.8156,0.8153,0.815,0.8146,0.8143,0.814,0.8136,0.8133,0.8129,0.8126,0.8123,0.8119,0.8116,0.8112,0.8109,0.8106,0.8102,0.8099,0.8095,0.8092,0.8089,0.8085,0.8082,0.8079,0.8075,0.8072,0.8068,0.8065,0.8062,0.8058,0.8055,0.8051,0.8048,0.8045,0.8041,0.8038,0.8035,0.8031,0.8028,0.8024,0.8021,0.8018,0.8014,0.8011,0.8008,0.8004,0.8001,0.7997,0.7994,0.7991,0.7987,0.7984,0.7981,0.7977,0.7974,0.7971,0.7967,0.7964,0.796,0.7957,0.7954,0.795,0.7947,0.7944,0.794,0.7937,0.7934,0.793,0.7927,0.7923,0.792,0.7917,0.7913,0.791,0.7907,0.7903,0.79,0.7897,0.7893,0.789,0.7887,0.7883,0.788,0.7876,0.7873,0.787,0.7866,0.7863,0.786,0.7856,0.7853,0.785,0.7846,0.7843,0.784,0.7836,0.7833,0.783,0.7826,0.7823,0.782,0.7816,0.7813,0.781,0.7806,0.7803,0.7799,0.7796,0.7793,0.7789,0.7786,0.7783,0.7779,0.7776,0.7773,0.7769,0.7766,0.7763,0.7759,0.7756,0.7753,0.7749,0.7746,0.7743,0.7739,0.7736,0.7733,0.7729,0.7726,0.7723,0.7719,0.7716,0.7713,0.7709,0.7706,0.7703,0.7699,0.7696,0.7693,0.769,0.7686,0.7683,0.768,0.7676,0.7673,0.767,0.7666,0.7663,0.766,0.7656,0.7653,0.765,0.7646,0.7643,0.764,0.7636,0.7633,0.763,0.7626,0.7623,0.762,0.7617,0.7613,0.761,0.7607,0.7603,0.76,0.7597,0.7593,0.759,0.7587,0.7583,0.758,0.7577,0.7574,0.757,0.7567,0.7564,0.756,0.7557,0.7554,0.755,0.7547,0.7544,0.7541,0.7537,0.7534,0.7531,0.7527,0.7524,0.7521,0.7517,0.7514,0.7511,0.7508,0.7504,0.7501,0.7498,0.7494,0.7491,0.7488,0.7485,0.7481,0.7478,0.7475,0.7471,0.7468,0.7465,0.7462,0.7458,0.7455,0.7452,0.7448,0.7445,0.7442,0.7439,0.7435,0.7432,0.7429,0.7425,0.7422,0.7419,0.7416,0.7412,0.7409,0.7406,0.7402,0.7399,0.7396,0.7393,0.7389,0.7386,0.7383,0.738,0.7376,0.7373,0.737,0.7367,0.7363,0.736,0.7357,0.7353,0.735,0.7347,0.7344,0.734,0.7337,0.7334,0.7331,0.7327,0.7324,0.7321,0.7318,0.7314,0.7311,0.7308,0.7305,0.7301,0.7298,0.7295,0.7292,0.7288,0.7285,0.7282,0.7279,0.7275,0.7272,0.7269,0.7266,0.7262,0.7259,0.7256,0.7253,0.7249,0.7246,0.7243,0.724,0.7236,0.7233,0.723,0.7227,0.7223,0.722,0.7217,0.7214,0.721,0.7207,0.7204,0.7201,0.7197,0.7194],"name":"L7_beta_pure","npix":256,"planted":{"Al_Ka":0.0,"Al_Ka_tail":0.0,"Cu_Ka":0.0,"Cu_Ka_stray":35.0249,"Mg_Ka":10378.1908,"O_Ka":118.1401,"Si_Ka":26052.439,"Si_Ka_internal":41.978},"source":"ladder","thickness_nm":240.0,"truth_at":{"Mg":45.4545454545,"Si":54.5454545455}},{"axis_true":{"offset":-0.478,"scale":0.005},"counts":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,3,0,1,0,0,1,2,3,7,2,3,1,4,2,3,2,4,5,4,6,6,8,4,4,4,12,5,3,7,5,6,6,8,13,4,7,10,6,10,7,8,10,14,13,7,10,16,10,6,7,8,11,15,4,12,23,11,19,16,14,13,8,20,11,22,13,12,17,18,16,19,12,16,13,11,10,5,12,20,19,6,10,10,11,18,14,8,11,12,6,18,10,12,15,8,11,9,12,13,11,9,13,13,19,10,14,12,12,10,2,9,13,9,11,16,5,8,8,9,10,9,5,11,16,15,4,10,9,7,13,13,4,7,11,7,11,7,8,9,11,12,8,13,8,12,9,10,10,6,5,2,16,8,7,11,14,10,8,10,12,12,9,7,10,7,10,5,6,10,15,6,7,5,12,8,9,11,11,10,15,6,6,7,8,9,11,9,11,10,12,13,3,4,13,14,12,4,10,18,8,16,7,12,10,16,16,13,20,17,11,19,16,19,14,12,17,12,14,14,12,9,12,14,9,20,10,12,9,10,16,24,28,18,20,33,43,60,87,98,148,200,312,358,423,596,740,859,1046,1272,1294,1463,1555,1708,1782,1916,1812,1729,1562,1471,1345,1198,1003,893,698,626,469,357,269,242,162,113,87,70,57,45,37,24,18,26,12,10,11,11,8,9,5,3,2,5,5,5,8,7,5,11,8,14,13,11,10,18,15,13,14,19,13,16,16,13,8,12,10,7,13,8,9,10,8,7,3,13,5,3,4,4,6,8,6,3,8,4,3,3,8,4,5,3,5,2,6,7,6,7,0,7,6,3,7,5,7,4,2,6,2,9,3,3,8,5,4,6,7,5,3,4,4,5,3,8,4,4,5,2,2,7,3,6,2,5,6,1,10,5,3,4,4,5,7,5,7,5,2,4,0,6,2,4,4,8,4,7,3,8,2,1,8,5,4,4,5,6,6,2,7,5,6,6,1,8,7,3,2,3,4,4,5,6,1,5,3,5,3,4,2,3,2,6,4,3,6,2,7,2,3,5,6,5,2,4,4,7,0,4,1,2,7,5,4,4,5,6,4,4,7,7,7,5,8,1,3,3,6,2,5,3,3,3,7,2,6,4,4,1,1,2,4,5,3,2,1,3,2,4,7,3,4,2,6,7,5,7,4,5,6,4,1,4,2,7,1,2,10,3,5,10,6,2,2,5,6,9,7,3,3,3,6,3,5,7,4,4,4,5,13,4,6,13,18,18,16,18,22,35,30,34,32,32,33,48,55,38,48,38,32,53,50,37,45,31,27,34,14,31,19,14,15,12,11,11,6,9,5,6,5,5,2,6,4,3,3,2,6,5,6,4,5,6,4,3,3,3,5,2,3,2,2,1,4,3,1,3,3,1,0,5,4,3,1,3,2,1,4,2,2,7,4,4,5,6,5,1,2,4,3,6,1,3,4,2,4,2,5,5,1,2,2,5,1,2,5,3,3,5,3,3,2,2,4,5,5,4,3,3,2,2,1,5,6,0,4,1,2,0,2,5,3,5,3,2,4,3,3,2,5,0,1,3,1,3,5,0,3,3,2,4,2,0,3,3,4,4,3,2,2,3,3,1,3,1,4,2,1,2,3,7,6,0,5,3,2,5,6,2,2,5,1,2,3,3,4,3,0,3,1,3,3,4,3,8,4,2,2,1,6,3,6,3,1,3,2,1,2,1,4,1,4,2,0,5,0,5,3,5,5,3,3,4,3,3,1,4,1,3,2,2,4,4,2,4,3,2,7,1,1,0,4,4,2,0,2,2,0,2,5,2,4,1,1,4,3,2,3,3,2,3,4,2,2,3,3,5,0,1,1,5,2,3,0,2,4,5,3,1,2,1,3,3,4,6,2,1,3,1,3,3,2,3,1,0,2,0,2,6,1,2,2,3,3,0,4,1,4,3,2,1,4,1,1,4,3,4,1,6,2,2,2,1,2,2,2,2,0,3,0,0,3,3,0,1,3,2,4,4,2,0,3,2,1,4,5,3,1,0,1,2,3,3,3,3,3,3,3,0,1,1,2,1,1,0,4,1,2,3,2,4,1,3,2,2,1,1,1,3,2,4,2,1,1,2,2,1,2,2,4,2,5,1,3,3,0,2,3,2,1,3,3,0,1,1,1,1,1,2,2,1,3,2,2,6,1,3,2,0,3,5,3,3,2,2,0,4,3,2,2,1,2,3,2,1,1,0,2,2,0,1,2,2,1,1,3,1,5,1,1,3,0,1,0,2,2,2,3,2,1,1,2,3,1,3,2,1,2,3,2,4,1,3,3,3,2,1,1,1,3,1,1,3,0,3,3,1,2,1,2,1,2,2,2,1,3,1,3,3,4,3,2,0,3,5,1,2,2,1,1,2,2,6,2,2,2,1,1,1,4,1,2,5,2,3,0,4,0,2,1,3,3,2,4,1,3,0,1,4,2,1,2,1,1,1,2,2,1,2,1,1,1,0,3,1,4,0,2,2,1,0,1,1,1,1,3,1,1,1,1,1,0,1,2,4,1,1,3,3,2,3,2,1,2,1,5,3,1,2,2,4,1,1,2,0,2,5,4,0,2,5,0,1,2,1,0,3,2,1,0,1,2,2,0,4,0,0,0,2,1,5,1,4,5,1,2,4,3,2,0,1,2,1,1,0,0,1,1,1,2,1,1,1,2,3,2,1,3,3,2,1,1,4,0,0,3,2,3,1,1,1,2,2,1,3,1,1,0,1,0,3,0,3,0,3,1,1,2,2,1,0,0,0,3,1,1,3,3,2,3,1,1,1,1,3,1,1,2,1,1,3,0,2,3,5,3,1,2,2,0,0,0,1,1,1,2,3,0,2,1,0,1,3,0,2,1,0,0,1,2,1,0,1,2,1,2,4,3,2,3,1,2,2,0,1,1,1,0,1,3,2,3,3,1,2,1,2,2,0,2,1,0,1,2,1,0,2,3,2,0,2,2,0,2,1,0,2,1,1,2,1,1,4,1,2,2,0,0,1,0,4,2,0,2,1,2,2,3,1,3,2,1,2,1,0,0,2,3,2,2,0,2,2,2,1,1,2,2,3,1,0,2,3,1,0,0,2,2,2,1,1,1,2,3,1,2,0,0,4,4,0,1,3,0,2,2,0,1,2,1,2,0,1,0,0,2,0,2,2,1,1,1,6,3,2,0,1,2,3,1,3,1,1,2,1,0,1,1,0,4,2,1,0,0,1,3,2,0,2,2,1,1,1,0,4,2,1,1,1,3,1,1,1,1,1,2,0,1,0,1,1,3,2,2,2,1,0,0,2,1,2,0,3,1,0,0,1,0,1,1,1,2,1,0,1,0,0,1,1,0,0,1,1,0,2,0,3,1,0,4,4,2,0,2,1,1,0,1,0,1,1,2,1,3,2,0,3,0,1,1,1,1,0,2,1,2,1,1,1,1,1,1,1,1,0,2,1,2,0,1,0,1,2,3,1,2,2,0,0,0,1,0,1,2,2,1,1,2,2,4,1,1,4,1,1,3,1,0,3,3,2,1,4,1,7,0,2,2,1,1,3,3,3,4,3,3,1,3,3,6,2,3,7,0,3,2,2,10,1,4,5,0,1,3,2,0,1,1,3,3,4,3,1,0,1,1,2,2,3,1,2,1,2,1,1,1,0,0,0,1,1,2,1,2,0,2,0,0,4,0,5,1,2,2,0,0,0,0,0,3,2,0,1,0,2,0,2,1,2,0,0,0,1,1,0,1,1,0,2,4,0,1,1,0,3,1,2,2,3,1,1,0,2,0,1,0,3,1,1,0,1,1,1,3,0,1,0,0,4,1,3,3,2,0,1,1,1,1,1,0,1,0,0,0,3,3,2,0,0,3,1,0,0,2,0,2,1,0,2,1,1,2,1,2,2,3,1,0,0,0,1,1,2,2,0,0,2,1,0,1,1,1,0,1,1,2,1,1,2,2,1,2,0,2,1,2,1,1,2,1,0,0,0,1,2,1,2,3,1,2,0,0,1,2,2,1,2,1,2,2,2,0,2,1,0,5,0,1,0,1,1,0,0,1,5,2,2,1,0,0,0,2,1,2,1,2,1,2,0,0,1,2,1,0,2,0,4,1,0,0,1,0,1,3,1,0,0,1,1,1,3,1,0,0,2,1,2,0,0,0,2,1,2,2,3,1,0,0,0,3,1,0,2,1,2,0,1,1,0,2,3,0,0,1,2,2,0,1,1,0,0,2,1,1,0,2,0,0,3,1,2,1,1,2,2,1,0,0,2,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,3,1,2,0,2,1,0,1,2,1,1,1,2,0,0,0,0,0,0,2,2,0,0,1,1,1,0,0,1,0,1,0,3,1,1,2,2,2,1,0,0,1,0,1,0,0,0,1,1,0,0,1,0,0,0,0,1,0,1,1,0,2,0,2,1,0,2,1,1,2,0,1,0,3,0,0,0,0,1,0,1,3,1,2,2,2,0,1,2,1,0,1,1,1,0,2,1,2,1,2,0,1,1,1,2,2,0,0,1,1,4,3,2,2,0,2,2,0,0,1,1,1,1,0,1,0,3,0,0,1,2,1,0,1,3,1,1,0,0,1,0,0,2,1,0,1,0,1,1,0,1,0,1,0,1,2,0,0,1,1,0,1,0,1,2,0,0,0,0,3,0,1,1,1,0,1,0,0,4,0,0,2,3,2,0,2,0,1,1,0,0,1,0,1,1,1,1,1,0,2,1,0,0,0,1,1,0,0,1,1,0,1,1,2,2,0,0,1,1,0,0,0,2,0,0,2,1,1,2,2,1,1,1,2,0,2,0,0,3,1,1,0,0,4,0,1,1,2,1,0,0,1,2,3,0,2,0,0,2,2,1,1,0,2,1,2,1,0,0,0,0,0,2,0,2,0,2,3,1,0,0,1,1,1,0,2,1,2,1,1,1,1,1,2,1,1,2,0,1,2,0,1,1,2,0,0,1,2,1,1,0,0,0,0,2,3,0,4,1,2,2,1,4,0,1,2,0,0,0,0,2,0,2,0,0,1,0,0,0,1,0,2,0,0,2,1,3,0,2,1,1,0,0,0,2,1,1,0,1,1,0,2,2,1,1,0,0,0,2,0,2,1,0,1,1,0,2,0,0,2,1,1,1,1,0,1,0,0,1,0,0,0,0,2,1,1,0,1,0,1,1,3,1,2,0,1,1,1,2,1,4,0,1,2,1,3,3,1,1,1,1,2,0,0,1,1,1,2,0,0,1,0,1,0,1,1,2,1,2,2,2,2,1,3,3,2,2,2,1,1,0,1,1,0,0,1,3,0,1,0,2,1,1,0,1,0,0,1,1,1,1,1,1,2,1,1,0,0,0,0,1,0,2,1,3,0,0,1,1,0,0,0,0,0,3,0,2,1,0,1,2,0,2,1,0,2,0,2,0,3,2,0,1,0,0,0,1,0,0,0,1,2,1,0,3,0,0,2,0,1,0,1,0,0,0,0,1,3,0,1,1,2,1,2,0,1,1,0,3,0,0,0,0,0,2,1,1,1,0,1,1,2,0,1,4,0,1,0,1,1,0,2,0,1,1,2,3,0,1,2,1,1,1,0,1,1,0,2,1,1,2,2,3,1,1,0,2,0,2,1,1,0,1,0,1,0,2,0,0,1,2,1,1,0,1,1,1,2,0,0,0,2,1,1,2,2,1,0,0,1,0,0,1,0,0,0,2,1,2,0,0,1,1,1,4,1,1,0,0,0,0,1,2,0,1,1,1,2,1,1,0,2,0,0,0,2,0,0,0,1,1,0,1,0,1,2,0,0,1,3,1,1,0,1,0,0,0,1,1,2,1,1,1,1,1,1,0,1,1,0,0,0,3,0,0,4,0,2,2,2,0,1,1,0,0,1,0,3,1,0,2,1,2,0,0,0,1,0,0,1,1,2,0,0,1,0,0,3,1,0,0,4,2,0,1,1,0,0,2,1,1,0,0,0,0,0,1,1,2,1,2,1,1,0,0,0,2,0,1,0,0,1,0,0,2,0,0,1,2,0,0,0,2,3,0,0,1,0,2,0,0,0,0,1,0,1,0,0,2,2,1,0,0,2,1,0,1,0,1,0,0,0,1,1,0,0,0,0,0,3,0,0,1,1,0,0,0,2,0,1,0,1,0,2,1,0,1,2,1,0,0,0,0,1,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,1,0,3,1,1,0,3,1,1,0,0,1,0,0,2,0,0,1,0,1,1,4,1,0,1,0,0,3,0,0,0,1,1,0,0,0,4,0,2,2,0,1,0,1,1,2,1,0,4,0,0,0,0,0,3,1,1,0,1,4,0,2,0,2,0,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,1,2,1,1,5,1,0,0,0,0,0,0,2,0,1,1,2,0,0,0,0,0,0,1,1,0,0,0,0,0,2,2,0,1,1,2,1,1,1,2,1,2,0,0,0,1,1,1,0,1,1,1,0,1,2,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,0,1,0,5,0,1,0,0,0,1,0,0,0,0,0,1,1,2,0,0,1,0,0,1,3,0,0,1,2,2,2,0,2,1,1,1,0,0,2,1,2,3,2,0,0,0,0,0,1,1,0,2,0,0,0,1,2,1,0,2,0,1,2,3,0,1,3,1,0,1,0,0,1,1,1,1,1,1,1,0,1,3,0,0,0,0,1,0,1,0,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,3,0,0,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,2,1,1,0,1,1,0,0,1,0,1,1,0,0,1,0,1,0,0,1,1,0,1,2,2,0,2,0,1,0,0,2,2,0,1,0,1,0,0,1,0,0,0,1,1,1,0,2,0,2,0,0,1,1,1,2,0,1,0,0,0,3,1,0,1,1,0,1,1,0,1,1,1,2,1,2,1,0,1,1,1,0,0,1,0,0,0,2,1,4,0,0,1,1,0,1,1,2,0,3,0,0,2,0,0,1,0,0,1,0,1,1,1,1,0,0,0,2,1,1,1,1,1,1,1,0,0,0,1,0,1,1,3,1,0,1,0,1,2,0,1,0,2,0,1,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,1,0,0,1,0,1,1,0,1,0,2,0,0,0,0,1,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,1,0,1,0,0,1,2,0,0,0,1,1,1,0,0,2,0,1,0,0,0,1,2,0,0,0,1,0,1,1,1,1,0,1,1,2,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,3,0,1,0,1,0,1,1,1,1,0,0,1,0,2,0,0,0,0,0,0,1,2,0,0,1,1,0,0,1,2,0,0,0,2,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0,2,1,0,1,2,0,0,1,0,0,2,1,1,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,1,2,1,1,0,0,0,2,0,0,0,1,0,2,0,0,1,1,3,0,0,2,0,1,0,0,0,0,1,0,1,0,0,0,1,1,0,1,1,1,2,3,0,0,1,0,0,0,0,2,0,0,0,1,0,1,1,2,0,0,1,0,1,0,0,0,0,1,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,0,0,0,1,1,1,0,0,1,1,3,0,1,0,0,0,1,0,1,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,1,0,2,0,0,1,0,0,0,1,0,1,0,0,1,0,1,0,1,1,0,0,0,2,1,1,1,1,0,1,0,0,3,0,1,1,0,0,0,0,1,1,0,1,1,0,0,0,1,1,0,3,2,1,0,0,0,2,1,1,0,0,0,0,0,1,2,0,0,2,2,0,0,0,0,2,0,0,0,1,0,0,1,0,1,4,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,2,1,0,0,0,0,1,1,0,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,0,1,1,1,0,2,1,0,0,0,3,0,2,0,0,0,0,2,1,1,0,0,0,1,1,0,0,1,0,0,0,0,1,0,0,0,1,1,1,0,0,1,0,0,0,0,0,1,1,1,1,2,2,0,0,0,0,0,1,0,0,0,1,3,0,1,0,1,0,0,0,1,1,0,1,0,1,0,0,2,1,0,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,2,1,0,0,1,0,1,0,0,1,0,1,1,1,0,3,1,1,0,0,0,0,0,1,0,1,1,0,1,0,1,0,0,2,0,0,0,0,0,0,2,1,0,1,0,1,2,0,0,0,0,1,0,0,0,1,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,1,0,0,1,1,1,2,1,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,1,3,0,0,1,1,2,1,0,1,0,0,0,0,0,2,0,0,0,1,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,2,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,0,1,0,1,0,3,0,0,2,1,0,0,1,1,0,0],"expected":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0004,0.0006,0.0011,0.0021,0.004,0.0072,0.0122,0.0199,0.0311,0.0467,0.0676,0.0949,0.1295,0.1725,0.2244,0.2863,0.3585,0.4414,0.5358,0.6413,0.7581,0.8863,1.0253,1.1749,1.335,1.5045,1.6828,1.8701,2.0648,2.2661,2.4742,2.6876,2.9054,3.127,3.3524,3.5799,3.8089,4.0391,4.2702,4.501,4.7307,4.959,5.1863,5.4111,5.633,5.8515,6.0672,6.2793,6.4871,6.6905,6.8892,7.0839,7.2736,7.4582,7.6375,7.8116,7.981,8.1451,8.3039,8.4573,8.6056,8.7493,8.8893,9.0263,9.1625,9.3016,9.4496,9.6161,9.814,10.0606,10.3777,10.7894,11.3193,11.9853,12.7933,13.7311,14.7643,15.8347,16.8646,17.7656,18.4518,18.8534,18.9303,18.6759,18.035,17.2653,16.3531,15.3879,14.4498,13.6007,12.879,12.3003,11.8614,11.546,11.3317,11.1943,11.1115,11.0654,11.0421,11.0322,11.0294,11.0297,11.031,11.0322,11.0325,11.0316,11.0295,11.026,11.0212,11.0152,11.008,10.9997,10.9904,10.98,10.9686,10.9563,10.943,10.9289,10.914,10.8982,10.8818,10.8647,10.8469,10.8285,10.8094,10.7898,10.7697,10.749,10.7279,10.7063,10.6843,10.662,10.6393,10.6162,10.5929,10.5692,10.5453,10.5211,10.4968,10.4722,10.4475,10.4226,10.3976,10.3725,10.3473,10.3221,10.2968,10.2714,10.2461,10.2208,10.1955,10.1703,10.1451,10.12,10.0951,10.0702,10.0455,10.021,9.9966,9.9724,9.9485,9.9248,9.9013,9.8781,9.8552,9.8327,9.8104,9.7885,9.767,9.7458,9.7251,9.7048,9.685,9.6657,9.6468,9.6285,9.6107,9.5939,9.5777,9.5622,9.5473,9.5331,9.5196,9.5069,9.4949,9.4837,9.4733,9.4638,9.4552,9.4476,9.4409,9.4352,9.4306,9.4271,9.4248,9.4237,9.4238,9.4253,9.4281,9.4324,9.4383,9.4458,9.4553,9.4671,9.4816,9.4997,9.5226,9.5521,9.591,9.6429,9.7128,9.8072,9.9339,10.102,10.3212,10.6014,10.9505,11.3739,11.8721,12.4395,13.0631,13.7222,14.3891,15.0306,15.6112,16.0964,16.4568,16.6711,16.7296,16.6345,16.4003,16.0518,15.6209,15.1431,14.6535,14.1837,13.7591,13.3981,13.1099,12.8927,12.7603,12.6993,12.7032,12.7661,12.8853,13.0637,13.3148,13.6682,14.1793,14.9438,16.1172,17.9435,20.7916,25.2001,31.9279,42.0064,56.783,77.9444,107.5041,147.7357,201.0376,269.7203,355.7153,460.2261,583.3536,723.7482,878.3522,1042.2967,1209.0074,1370.5482,1518.195,1643.1933,1737.6101,1795.1689,1811.9446,1786.8128,1721.5807,1620.7785,1491.1456,1340.8898,1178.8337,1013.5709,852.7397,702.4978,567.2347,449.5221,350.2654,268.9978,204.25,153.7429,114.7686,86.1259,65.1144,49.7725,38.5885,30.3942,24.3267,19.7701,16.2993,13.6266,11.5583,9.9614,8.7414,7.828,7.1671,6.7161,6.4424,6.322,6.3392,6.4854,6.7576,7.1565,7.684,8.3407,9.123,10.0209,11.0156,12.079,13.1744,14.2551,15.2693,16.164,16.8886,17.3999,17.6662,17.6707,17.4128,16.9088,16.1896,15.2982,14.285,13.2033,12.1049,11.036,10.0342,9.1273,8.3323,7.6563,7.0978,6.6489,6.2972,6.0277,5.8251,5.674,5.5611,5.4743,5.4038,5.3463,5.2965,5.2507,5.2074,5.1658,5.1259,5.088,5.0526,5.02,4.9904,4.964,4.9406,4.9201,4.9021,4.8864,4.8725,4.8602,4.849,4.8388,4.8292,4.8202,4.8114,4.803,4.7946,4.7864,4.7783,4.7702,4.7621,4.7541,4.7461,4.7381,4.7301,4.7221,4.7141,4.7061,4.6981,4.6902,4.6822,4.6743,4.6664,4.6585,4.6506,4.6427,4.6348,4.6269,4.6191,4.6112,4.6032,4.5953,4.5874,4.5795,4.5716,4.5637,4.5558,4.5479,4.5401,4.5323,4.5245,4.5167,4.5089,4.5011,4.4934,4.4856,4.4779,4.4702,4.4625,4.4548,4.4472,4.4395,4.4319,4.4243,4.4167,4.4091,4.4015,4.394,4.3864,4.3789,4.3714,4.3639,4.3564,4.3489,4.3415,4.334,4.3266,4.3192,4.3118,4.3044,4.2971,4.2897,4.2824,4.2751,4.2678,4.2606,4.2533,4.2461,4.2388,4.2316,4.2245,4.2173,4.2101,4.203,4.1959,4.1888,4.1817,4.1746,4.1676,4.1605,4.1535,4.1465,4.1395,4.1325,4.1256,4.1186,4.1117,4.1048,4.098,4.0911,4.0843,4.0774,4.0706,4.0639,4.0571,4.0504,4.0437,4.037,4.0303,4.0236,4.0169,4.0103,4.0037,3.997,3.9904,3.9838,3.9772,3.9706,3.9641,3.9575,3.9509,3.9444,3.9379,3.9314,3.9249,3.9185,3.912,3.9056,3.8992,3.8929,3.8866,3.8804,3.8742,3.8682,3.8623,3.8566,3.8511,3.846,3.8414,3.8373,3.834,3.8315,3.8301,3.83,3.8313,3.8343,3.839,3.8455,3.8539,3.8641,3.8758,3.8889,3.9028,3.917,3.931,3.944,3.9554,3.9644,3.9705,3.9731,3.9718,3.9664,3.957,3.9436,3.9266,3.9066,3.8841,3.8599,3.8346,3.8091,3.7841,3.7604,3.7387,3.7198,3.7046,3.6944,3.6906,3.6954,3.7116,3.7434,3.7962,3.8772,3.9957,4.1636,4.3954,4.7086,5.1236,5.6632,6.3525,7.2171,8.2828,9.5726,11.1056,12.8939,14.9402,17.2359,19.7583,22.4701,25.3186,28.2361,31.1426,33.9483,36.5583,38.8774,40.8164,42.297,43.2575,43.6569,43.478,42.7281,41.439,39.6646,37.4771,34.9619,32.2127,29.3251,26.3913,23.496,20.712,18.098,15.6977,13.5394,11.6372,9.9927,8.597,7.4338,6.4812,5.7144,5.1074,4.6349,4.2729,4.0,3.7977,3.6501,3.5444,3.4703,3.4199,3.387,3.3673,3.3575,3.3555,3.3597,3.3692,3.3831,3.4011,3.4227,3.4475,3.4748,3.5041,3.5346,3.5653,3.5954,3.6236,3.649,3.6704,3.6869,3.6977,3.7021,3.6999,3.6909,3.6753,3.6536,3.6263,3.5945,3.559,3.521,3.4815,3.4416,3.4022,3.3642,3.3281,3.2946,3.2639,3.2363,3.2117,3.19,3.1711,3.1547,3.1406,3.1285,3.1181,3.109,3.1011,3.0941,3.0878,3.0821,3.0768,3.0719,3.0672,3.0627,3.0583,3.054,3.0497,3.0456,3.0414,3.0374,3.0333,3.0293,3.0253,3.0213,3.0173,3.0133,3.0093,3.0054,3.0014,2.9974,2.9935,2.9895,2.9855,2.9815,2.9775,2.9734,2.9694,2.9654,2.9613,2.9573,2.9533,2.9492,2.9452,2.9412,2.9372,2.9332,2.9292,2.9253,2.9213,2.9174,2.9135,2.9097,2.9058,2.9019,2.8981,2.8943,2.8905,2.8867,2.8829,2.8792,2.8754,2.8716,2.8679,2.8642,2.8605,2.8568,2.8531,2.8494,2.8457,2.842,2.8383,2.8347,2.831,2.8274,2.8238,2.8201,2.8165,2.8129,2.8093,2.8057,2.8022,2.7986,2.795,2.7915,2.7879,2.7844,2.7808,2.7773,2.7738,2.7703,2.7668,2.7633,2.7598,2.7563,2.7529,2.7494,2.746,2.7425,2.7391,2.7357,2.7323,2.7288,2.7254,2.722,2.7187,2.7153,2.7119,2.7085,2.7052,2.7018,2.6985,2.6952,2.6918,2.6885,2.6852,2.6819,2.6786,2.6753,2.672,2.6687,2.6655,2.6622,2.659,2.6557,2.6525,2.6493,2.646,2.6428,2.6396,2.6364,2.6332,2.63,2.6268,2.6237,2.6205,2.6173,2.6142,2.6111,2.6079,2.6048,2.6017,2.5985,2.5954,2.5923,2.5892,2.5861,2.5831,2.58,2.5769,2.5739,2.5708,2.5677,2.5647,2.5617,2.5586,2.5556,2.5526,2.5496,2.5466,2.5436,2.5406,2.5376,2.5346,2.5317,2.5287,2.5258,2.5228,2.5199,2.5169,2.514,2.5111,2.5081,2.5052,2.5023,2.4994,2.4965,2.4936,2.4908,2.4879,2.485,2.4822,2.4793,2.4765,2.4736,2.4708,2.4679,2.4651,2.4623,2.4595,2.4567,2.4539,2.4511,2.4483,2.4455,2.4427,2.4399,2.4372,2.4344,2.4317,2.4289,2.4262,2.4234,2.4207,2.418,2.4153,2.4125,2.4098,2.4071,2.4044,2.4017,2.3991,2.3964,2.3937,2.391,2.3884,2.3857,2.3831,2.3804,2.3778,2.3751,2.3725,2.3699,2.3673,2.3646,2.362,2.3594,2.3568,2.3542,2.3516,2.3491,2.3465,2.3439,2.3414,2.3388,2.3362,2.3337,2.3311,2.3286,2.3261,2.3235,2.321,2.3185,2.316,2.3135,2.311,2.3085,2.306,2.3035,2.301,2.2985,2.296,2.2936,2.2911,2.2887,2.2862,2.2838,2.2813,2.2789,2.2764,2.274,2.2716,2.2692,2.2667,2.2643,2.2619,2.2595,2.2571,2.2547,2.2524,2.25,2.2476,2.2452,2.2429,2.2405,2.2381,2.2358,2.2334,2.2311,2.2288,2.2264,2.2241,2.2218,2.2194,2.2171,2.2148,2.2125,2.2102,2.2079,2.2056,2.2033,2.201,2.1988,2.1965,2.1942,2.192,2.1897,2.1874,2.1852,2.1829,2.1807,2.1784,2.1762,2.174,2.1718,2.1695,2.1673,2.1651,2.1629,2.1607,2.1585,2.1563,2.1541,2.1519,2.1497,2.1475,2.1454,2.1432,2.141,2.1389,2.1367,2.1345,2.1324,2.1302,2.1281,2.126,2.1238,2.1217,2.1196,2.1174,2.1153,2.1132,2.1111,2.109,2.1069,2.1048,2.1027,2.1006,2.0985,2.0964,2.0943,2.0923,2.0902,2.0881,2.0861,2.084,2.082,2.0799,2.0779,2.0758,2.0738,2.0717,2.0697,2.0677,2.0656,2.0636,2.0616,2.0596,2.0576,2.0556,2.0536,2.0516,2.0496,2.0476,2.0456,2.0436,2.0416,2.0396,2.0377,2.0357,2.0337,2.0318,2.0298,2.0279,2.0259,2.024,2.022,2.0201,2.0181,2.0162,2.0143,2.0123,2.0104,2.0085,2.0066,2.0047,2.0027,2.0008,1.9989,1.997,1.9951,1.9932,1.9914,1.9895,1.9876,1.9857,1.9838,1.982,1.9801,1.9782,1.9764,1.9745,1.9726,1.9708,1.9689,1.9671,1.9653,1.9634,1.9616,1.9597,1.9579,1.9561,1.9543,1.9524,1.9506,1.9488,1.947,1.9452,1.9434,1.9416,1.9398,1.938,1.9362,1.9344,1.9326,1.9309,1.9291,1.9273,1.9255,1.9238,1.922,1.9202,1.9185,1.9167,1.915,1.9132,1.9115,1.9097,1.908,1.9062,1.9045,1.9028,1.901,1.8993,1.8976,1.8959,1.8941,1.8924,1.8907,1.889,1.8873,1.8856,1.8839,1.8822,1.8805,1.8788,1.8771,1.8754,1.8737,1.8721,1.8704,1.8687,1.867,1.8654,1.8637,1.862,1.8604,1.8587,1.8571,1.8554,1.8538,1.8521,1.8505,1.8488,1.8472,1.8456,1.8439,1.8423,1.8407,1.8391,1.8374,1.8358,1.8342,1.8326,1.831,1.8294,1.8278,1.8262,1.8246,1.823,1.8214,1.8198,1.8182,1.8166,1.815,1.8134,1.8119,1.8103,1.8087,1.8071,1.8056,1.804,1.8024,1.8009,1.7993,1.7978,1.7962,1.7947,1.7931,1.7916,1.79,1.7885,1.7869,1.7854,1.7839,1.7823,1.7808,1.7793,1.7778,1.7763,1.7747,1.7732,1.7717,1.7702,1.7687,1.7672,1.7657,1.7642,1.7627,1.7612,1.7597,1.7582,1.7567,1.7552,1.7537,1.7523,1.7508,1.7493,1.7478,1.7464,1.7449,1.7434,1.742,1.7405,1.739,1.7376,1.7361,1.7347,1.7332,1.7318,1.7303,1.7289,1.7274,1.726,1.7246,1.7231,1.7217,1.7203,1.7188,1.7174,1.716,1.7146,1.7132,1.7118,1.7104,1.709,1.7076,1.7062,1.7048,1.7034,1.702,1.7007,1.6993,1.698,1.6967,1.6953,1.694,1.6927,1.6915,1.6902,1.689,1.6878,1.6865,1.6854,1.6842,1.683,1.6819,1.6807,1.6796,1.6784,1.6773,1.6761,1.675,1.6738,1.6726,1.6714,1.6702,1.6689,1.6676,1.6663,1.665,1.6636,1.6622,1.6608,1.6593,1.6578,1.6563,1.6548,1.6533,1.6518,1.6502,1.6487,1.6472,1.6456,1.6441,1.6426,1.6411,1.6396,1.6382,1.6367,1.6353,1.6339,1.6325,1.6311,1.6297,1.6284,1.627,1.6257,1.6244,1.6231,1.6218,1.6205,1.6192,1.6179,1.6166,1.6153,1.6141,1.6128,1.6115,1.6103,1.609,1.6077,1.6065,1.6052,1.604,1.6027,1.6015,1.6002,1.599,1.5978,1.5965,1.5953,1.594,1.5928,1.5916,1.5903,1.5891,1.5879,1.5867,1.5854,1.5842,1.583,1.5818,1.5806,1.5793,1.5781,1.5769,1.5757,1.5745,1.5733,1.5721,1.5709,1.5697,1.5685,1.5673,1.5661,1.5649,1.5637,1.5625,1.5613,1.5601,1.559,1.5578,1.5566,1.5554,1.5542,1.5531,1.5519,1.5507,1.5495,1.5484,1.5472,1.546,1.5449,1.5437,1.5426,1.5414,1.5402,1.5391,1.5379,1.5368,1.5356,1.5345,1.5333,1.5322,1.531,1.5299,1.5287,1.5276,1.5265,1.5253,1.5242,1.5231,1.5219,1.5208,1.5197,1.5185,1.5174,1.5163,1.5152,1.5141,1.5129,1.5118,1.5107,1.5096,1.5085,1.5074,1.5063,1.5051,1.504,1.5029,1.5018,1.5007,1.4996,1.4985,1.4974,1.4963,1.4953,1.4942,1.4931,1.492,1.4909,1.4898,1.4887,1.4877,1.4866,1.4855,1.4845,1.4834,1.4823,1.4813,1.4802,1.4792,1.4781,1.4771,1.476,1.475,1.4739,1.4729,1.4718,1.4708,1.4698,1.4687,1.4677,1.4667,1.4656,1.4646,1.4635,1.4625,1.4615,1.4604,1.4594,1.4583,1.4573,1.4562,1.4552,1.4541,1.4531,1.452,1.451,1.4499,1.4489,1.4478,1.4468,1.4457,1.4447,1.4437,1.4426,1.4416,1.4405,1.4395,1.4385,1.4374,1.4364,1.4354,1.4344,1.4334,1.4323,1.4313,1.4303,1.4293,1.4283,1.4273,1.4263,1.4253,1.4243,1.4233,1.4223,1.4213,1.4203,1.4193,1.4183,1.4173,1.4164,1.4154,1.4144,1.4134,1.4124,1.4114,1.4105,1.4095,1.4085,1.4075,1.4066,1.4056,1.4046,1.4036,1.4027,1.4017,1.4007,1.3998,1.3988,1.3979,1.3969,1.3959,1.395,1.394,1.3931,1.3921,1.3912,1.3902,1.3893,1.3883,1.3874,1.3864,1.3855,1.3845,1.3836,1.3826,1.3817,1.3808,1.3798,1.3789,1.3779,1.377,1.3761,1.3751,1.3742,1.3733,1.3723,1.3714,1.3705,1.3696,1.3686,1.3677,1.3668,1.3659,1.365,1.364,1.3631,1.3622,1.3613,1.3604,1.3595,1.3586,1.3576,1.3567,1.3558,1.3549,1.354,1.3531,1.3522,1.3513,1.3504,1.3495,1.3486,1.3477,1.3468,1.346,1.3451,1.3442,1.3433,1.3425,1.3416,1.3408,1.34,1.3393,1.3386,1.338,1.3374,1.3369,1.3366,1.3365,1.3366,1.3369,1.3376,1.3387,1.3403,1.3426,1.3456,1.3496,1.3546,1.3609,1.3687,1.3783,1.3899,1.4038,1.4202,1.4396,1.4622,1.4882,1.5181,1.5521,1.5903,1.6331,1.6805,1.7325,1.7893,1.8505,1.9161,1.9856,2.0586,2.1345,2.2126,2.2921,2.3721,2.4515,2.5293,2.6044,2.6756,2.7418,2.8019,2.8549,2.8998,2.9359,2.9624,2.9788,2.9849,2.9805,2.9657,2.9407,2.906,2.8622,2.81,2.7504,2.6844,2.613,2.5373,2.4586,2.3779,2.2963,2.2149,2.1346,2.0563,1.9806,1.9083,1.8397,1.7754,1.7155,1.6603,1.6098,1.5639,1.5225,1.4856,1.4528,1.4238,1.3985,1.3765,1.3575,1.3411,1.3272,1.3153,1.3053,1.2969,1.2898,1.2838,1.2789,1.2747,1.2712,1.2683,1.2658,1.2637,1.2619,1.2603,1.2589,1.2577,1.2565,1.2555,1.2545,1.2536,1.2527,1.2518,1.251,1.2501,1.2493,1.2485,1.2478,1.247,1.2462,1.2454,1.2446,1.2439,1.2431,1.2423,1.2416,1.2408,1.24,1.2393,1.2385,1.2377,1.237,1.2362,1.2354,1.2347,1.2339,1.2332,1.2324,1.2317,1.2309,1.2301,1.2294,1.2286,1.2279,1.2271,1.2264,1.2256,1.2249,1.2241,1.2234,1.2227,1.2219,1.2212,1.2204,1.2197,1.2189,1.2182,1.2175,1.2167,1.216,1.2152,1.2145,1.2138,1.213,1.2123,1.2116,1.2108,1.2101,1.2094,1.2087,1.2079,1.2072,1.2065,1.2058,1.2051,1.2043,1.2036,1.2029,1.2022,1.2016,1.2009,1.2002,1.1996,1.199,1.1984,1.1978,1.1973,1.1969,1.1965,1.1962,1.196,1.1959,1.1959,1.1961,1.1964,1.197,1.1978,1.1989,1.2002,1.2019,1.204,1.2064,1.2093,1.2126,1.2164,1.2208,1.2256,1.231,1.237,1.2434,1.2504,1.2579,1.2657,1.274,1.2826,1.2914,1.3004,1.3094,1.3184,1.3271,1.3356,1.3436,1.351,1.3578,1.3638,1.3689,1.3729,1.376,1.3778,1.3786,1.3781,1.3764,1.3735,1.3695,1.3644,1.3582,1.3512,1.3433,1.3347,1.3255,1.3158,1.3057,1.2955,1.2851,1.2748,1.2645,1.2545,1.2447,1.2354,1.2264,1.2179,1.2099,1.2025,1.1955,1.1891,1.1833,1.1779,1.1731,1.1687,1.1647,1.1612,1.158,1.1552,1.1527,1.1505,1.1485,1.1467,1.1451,1.1437,1.1424,1.1412,1.1401,1.1391,1.1382,1.1373,1.1364,1.1357,1.1349,1.1342,1.1335,1.1328,1.1321,1.1314,1.1307,1.1301,1.1294,1.1288,1.1281,1.1275,1.1268,1.1262,1.1256,1.1249,1.1243,1.1236,1.123,1.1224,1.1217,1.1211,1.1205,1.1199,1.1192,1.1186,1.118,1.1173,1.1167,1.1161,1.1155,1.1148,1.1142,1.1136,1.113,1.1123,1.1117,1.1111,1.1105,1.1098,1.1092,1.1086,1.108,1.1074,1.1068,1.1061,1.1055,1.1049,1.1043,1.1037,1.1031,1.1025,1.1018,1.1012,1.1006,1.1,1.0994,1.0988,1.0982,1.0976,1.097,1.0964,1.0958,1.0952,1.0946,1.094,1.0934,1.0927,1.0921,1.0915,1.0909,1.0903,1.0897,1.0891,1.0886,1.088,1.0874,1.0868,1.0862,1.0856,1.085,1.0844,1.0838,1.0832,1.0826,1.082,1.0814,1.0808,1.0802,1.0797,1.0791,1.0785,1.0779,1.0773,1.0767,1.0761,1.0756,1.075,1.0744,1.0738,1.0732,1.0726,1.0721,1.0715,1.0709,1.0703,1.0697,1.0692,1.0686,1.068,1.0674,1.0669,1.0663,1.0657,1.0651,1.0646,1.064,1.0634,1.0629,1.0623,1.0617,1.0611,1.0606,1.06,1.0594,1.0589,1.0583,1.0577,1.0572,1.0566,1.056,1.0555,1.0549,1.0544,1.0538,1.0532,1.0527,1.0521,1.0515,1.051,1.0504,1.0499,1.0493,1.0488,1.0482,1.0476,1.0471,1.0465,1.046,1.0454,1.0449,1.0443,1.0438,1.0432,1.0427,1.0421,1.0416,1.041,1.0405,1.0399,1.0394,1.0388,1.0383,1.0377,1.0372,1.0366,1.0361,1.0356,1.035,1.0345,1.0339,1.0334,1.0328,1.0323,1.0318,1.0312,1.0307,1.0301,1.0296,1.0291,1.0285,1.028,1.0275,1.0269,1.0264,1.0259,1.0253,1.0248,1.0243,1.0237,1.0232,1.0227,1.0221,1.0216,1.0211,1.0205,1.02,1.0195,1.019,1.0184,1.0179,1.0174,1.0169,1.0163,1.0158,1.0153,1.0148,1.0142,1.0137,1.0132,1.0127,1.0121,1.0116,1.0111,1.0106,1.0101,1.0095,1.009,1.0085,1.008,1.0075,1.007,1.0065,1.0059,1.0054,1.0049,1.0044,1.0039,1.0034,1.0029,1.0023,1.0018,1.0013,1.0008,1.0003,0.9998,0.9993,0.9988,0.9983,0.9978,0.9973,0.9968,0.9962,0.9957,0.9952,0.9947,0.9942,0.9937,0.9932,0.9927,0.9922,0.9917,0.9912,0.9907,0.9902,0.9897,0.9892,0.9887,0.9882,0.9877,0.9872,0.9867,0.9862,0.9857,0.9852,0.9848,0.9843,0.9838,0.9833,0.9828,0.9823,0.9818,0.9813,0.9808,0.9803,0.9798,0.9793,0.9789,0.9784,0.9779,0.9774,0.9769,0.9764,0.9759,0.9754,0.975,0.9745,0.974,0.9735,0.973,0.9725,0.9721,0.9716,0.9711,0.9706,0.9701,0.9697,0.9692,0.9687,0.9682,0.9677,0.9673,0.9668,0.9663,0.9658,0.9653,0.9649,0.9644,0.9639,0.9634,0.963,0.9625,0.962,0.9616,0.9611,0.9606,0.9601,0.9597,0.9592,0.9587,0.9583,0.9578,0.9573,0.9569,0.9564,0.9559,0.9554,0.955,0.9545,0.954,0.9536,0.9531,0.9527,0.9522,0.9517,0.9513,0.9508,0.9503,0.9499,0.9494,0.949,0.9485,0.948,0.9476,0.9471,0.9467,0.9462,0.9457,0.9453,0.9448,0.9444,0.9439,0.9435,0.943,0.9425,0.9421,0.9416,0.9412,0.9407,0.9403,0.9398,0.9394,0.9389,0.9385,0.938,0.9376,0.9371,0.9367,0.9362,0.9358,0.9353,0.9349,0.9344,0.934,0.9335,0.9331,0.9326,0.9322,0.9317,0.9313,0.9308,0.9304,0.93,0.9295,0.9291,0.9286,0.9282,0.9277,0.9273,0.9269,0.9264,0.926,0.9255,0.9251,0.9247,0.9242,0.9238,0.9233,0.9229,0.9225,0.922,0.9216,0.9212,0.9207,0.9203,0.9199,0.9194,0.919,0.9186,0.9181,0.9177,0.9173,0.9168,0.9164,0.916,0.9155,0.9151,0.9147,0.9142,0.9138,0.9134,0.913,0.9125,0.9121,0.9117,0.9112,0.9108,0.9104,0.91,0.9095,0.9091,0.9087,0.9083,0.9078,0.9074,0.907,0.9066,0.9061,0.9057,0.9053,0.9049,0.9045,0.904,0.9036,0.9032,0.9028,0.9024,0.9019,0.9015,0.9011,0.9007,0.9003,0.8998,0.8994,0.899,0.8986,0.8982,0.8978,0.8973,0.8969,0.8965,0.8961,0.8957,0.8953,0.8949,0.8945,0.894,0.8936,0.8932,0.8928,0.8924,0.892,0.8916,0.8912,0.8908,0.8903,0.8899,0.8895,0.8891,0.8887,0.8883,0.8879,0.8875,0.8871,0.8867,0.8863,0.8859,0.8855,0.8851,0.8847,0.8843,0.8838,0.8834,0.883,0.8826,0.8822,0.8818,0.8814,0.881,0.8806,0.8802,0.8798,0.8794,0.879,0.8786,0.8782,0.8778,0.8774,0.877,0.8766,0.8762,0.8759,0.8755,0.8751,0.8747,0.8743,0.8739,0.8735,0.8731,0.8727,0.8723,0.8719,0.8715,0.8711,0.8707,0.8703,0.8699,0.8695,0.8692,0.8688,0.8684,0.868,0.8676,0.8672,0.8668,0.8664,0.866,0.8657,0.8653,0.8649,0.8645,0.8641,0.8637,0.8633,0.8629,0.8626,0.8622,0.8618,0.8614,0.861,0.8606,0.8603,0.8599,0.8595,0.8591,0.8587,0.8583,0.858,0.8576,0.8572,0.8568,0.8564,0.8561,0.8557,0.8553,0.8549,0.8545,0.8542,0.8538,0.8534,0.853,0.8527,0.8523,0.8519,0.8515,0.8511,0.8508,0.8504,0.85,0.8496,0.8493,0.8489,0.8485,0.8481,0.8478,0.8474,0.847,0.8467,0.8463,0.8459,0.8455,0.8452,0.8448,0.8444,0.8441,0.8437,0.8433,0.8429,0.8426,0.8422,0.8418,0.8415,0.8411,0.8407,0.8404,0.84,0.8396,0.8393,0.8389,0.8385,0.8382,0.8378,0.8374,0.8371,0.8367,0.8364,0.836,0.8356,0.8353,0.8349,0.8345,0.8342,0.8338,0.8335,0.8331,0.8327,0.8324,0.832,0.8316,0.8313,0.8309,0.8306,0.8302,0.8299,0.8295,0.8291,0.8288,0.8284,0.8281,0.8277,0.8273,0.827,0.8266,0.8263,0.8259,0.8256,0.8252,0.8249,0.8245,0.8242,0.8238,0.8234,0.8231,0.8227,0.8224,0.822,0.8217,0.8213,0.821,0.8206,0.8203,0.8199,0.8196,0.8192,0.8189,0.8185,0.8182,0.8178,0.8175,0.8171,0.8168,0.8164,0.8161,0.8157,0.8154,0.815,0.8147,0.8143,0.814,0.8137,0.8133,0.813,0.8126,0.8123,0.8119,0.8116,0.8112,0.8109,0.8106,0.8102,0.8099,0.8095,0.8092,0.8088,0.8085,0.8082,0.8078,0.8075,0.8071,0.8068,0.8065,0.8061,0.8058,0.8054,0.8051,0.8048,0.8044,0.8041,0.8037,0.8034,0.8031,0.8027,0.8024,0.8021,0.8017,0.8014,0.801,0.8007,0.8004,0.8,0.7997,0.7994,0.799,0.7987,0.7984,0.798,0.7977,0.7974,0.797,0.7967,0.7964,0.796,0.7957,0.7954,0.795,0.7947,0.7944,0.794,0.7937,0.7934,0.7931,0.7927,0.7924,0.7921,0.7917,0.7914,0.7911,0.7907,0.7904,0.7901,0.7898,0.7894,0.7891,0.7888,0.7885,0.7881,0.7878,0.7875,0.7872,0.7868,0.7865,0.7862,0.7859,0.7855,0.7852,0.7849,0.7846,0.7842,0.7839,0.7836,0.7833,0.7829,0.7826,0.7823,0.782,0.7817,0.7813,0.781,0.7807,0.7804,0.78,0.7797,0.7794,0.7791,0.7788,0.7784,0.7781,0.7778,0.7775,0.7772,0.7769,0.7765,0.7762,0.7759,0.7756,0.7753,0.775,0.7746,0.7743,0.774,0.7737,0.7734,0.7731,0.7727,0.7724,0.7721,0.7718,0.7715,0.7712,0.7709,0.7705,0.7702,0.7699,0.7696,0.7693,0.769,0.7687,0.7684,0.768,0.7677,0.7674,0.7671,0.7668,0.7665,0.7662,0.7659,0.7656,0.7652,0.7649,0.7646,0.7643,0.764,0.7637,0.7634,0.7631,0.7628,0.7625,0.7622,0.7619,0.7615,0.7612,0.7609,0.7606,0.7603,0.76,0.7597,0.7594,0.7591,0.7588,0.7585,0.7582,0.7579,0.7576,0.7573,0.757,0.7567,0.7564,0.7561,0.7558,0.7554,0.7551,0.7548,0.7545,0.7542,0.7539,0.7536,0.7533,0.753,0.7527,0.7524,0.7521,0.7518,0.7515,0.7512,0.7509,0.7506,0.7503,0.75,0.7497,0.7494,0.7491,0.7488,0.7485,0.7482,0.7479,0.7476,0.7473,0.7471,0.7468,0.7465,0.7462,0.7459,0.7456,0.7453,0.745,0.7447,0.7444,0.7441,0.7438,0.7435,0.7432,0.7429,0.7426,0.7423,0.742,0.7417,0.7414,0.7411,0.7409,0.7406,0.7403,0.74,0.7397,0.7394,0.7391,0.7388,0.7385,0.7382,0.7379,0.7376,0.7374,0.7371,0.7368,0.7365,0.7362,0.7359,0.7356,0.7353,0.735,0.7347,0.7345,0.7342,0.7339,0.7336,0.7333,0.733,0.7327,0.7324,0.7322,0.7319,0.7316,0.7313,0.731,0.7307,0.7304,0.7301,0.7299,0.7296,0.7293,0.729,0.7287,0.7284,0.7282,0.7279,0.7276,0.7273,0.727,0.7267,0.7264,0.7262,0.7259,0.7256,0.7253,0.725,0.7247,0.7245,0.7242,0.7239,0.7236,0.7233,0.7231,0.7228,0.7225,0.7222,0.7219,0.7216,0.7214,0.7211,0.7208,0.7205,0.7202,0.72,0.7197,0.7194,0.7191,0.7189,0.7186,0.7183,0.718,0.7177,0.7175,0.7172,0.7169,0.7166,0.7163,0.7161,0.7158,0.7155,0.7152,0.715,0.7147,0.7144,0.7141,0.7139,0.7136,0.7133,0.713,0.7128,0.7125,0.7122,0.7119,0.7117,0.7114,0.7111,0.7108,0.7106,0.7103,0.71,0.7097,0.7095,0.7092,0.7089,0.7086,0.7084,0.7081,0.7078,0.7076,0.7073,0.707,0.7067,0.7065,0.7062,0.7059,0.7057,0.7054,0.7051,0.7048,0.7046,0.7043,0.704,0.7038,0.7035,0.7032,0.7029,0.7027,0.7024,0.7021,0.7019,0.7016,0.7013,0.7011,0.7008,0.7005,0.7003,0.7,0.6997,0.6995,0.6992,0.6989,0.6987,0.6984,0.6981,0.6979,0.6976,0.6973,0.6971,0.6968,0.6965,0.6963,0.696,0.6957,0.6955,0.6952,0.6949,0.6947,0.6944,0.6941,0.6939,0.6936,0.6933,0.6931,0.6928,0.6925,0.6923,0.692,0.6918,0.6915,0.6912,0.691,0.6907,0.6904,0.6902,0.6899,0.6897,0.6894,0.6891,0.6889,0.6886,0.6883,0.6881,0.6878,0.6876,0.6873,0.687,0.6868,0.6865,0.6863,0.686,0.6857,0.6855,0.6852,0.685,0.6847,0.6844,0.6842,0.6839,0.6837,0.6834,0.6831,0.6829,0.6826,0.6824,0.6821,0.6818,0.6816,0.6813,0.6811,0.6808,0.6806,0.6803,0.68,0.6798,0.6795,0.6793,0.679,0.6788,0.6785,0.6782,0.678,0.6777,0.6775,0.6772,0.677,0.6767,0.6764,0.6762,0.6759,0.6757,0.6754,0.6752,0.6749,0.6747,0.6744,0.6741,0.6739,0.6736,0.6734,0.6731,0.6729,0.6726,0.6724,0.6721,0.6719,0.6716,0.6714,0.6711,0.6708,0.6706,0.6703,0.6701,0.6698,0.6696,0.6693,0.6691,0.6688,0.6686,0.6683,0.6681,0.6678,0.6676,0.6673,0.6671,0.6668,0.6666,0.6663,0.6661,0.6658,0.6656,0.6653,0.6651,0.6648,0.6646,0.6643,0.6641,0.6638,0.6636,0.6633,0.6631,0.6628,0.6626,0.6623,0.6621,0.6618,0.6616,0.6613,0.6611,0.6608,0.6606,0.6603,0.6601,0.6598,0.6596,0.6593,0.6591,0.6588,0.6586,0.6583,0.6581,0.6578,0.6576,0.6574,0.6571,0.6569,0.6566,0.6564,0.6561,0.6559,0.6556,0.6554,0.6551,0.6549,0.6546,0.6544,0.6541,0.6539,0.6537,0.6534,0.6532,0.6529,0.6527,0.6524,0.6522,0.6519,0.6517,0.6515,0.6512,0.651,0.6507,0.6505,0.6502,0.65,0.6497,0.6495,0.6493,0.649,0.6488,0.6485,0.6483,0.648,0.6478,0.6476,0.6473,0.6471,0.6468,0.6466,0.6463,0.6461,0.6459,0.6456,0.6454,0.6451,0.6449,0.6446,0.6444,0.6442,0.6439,0.6437,0.6434,0.6432,0.643,0.6427,0.6425,0.6422,0.642,0.6417,0.6415,0.6413,0.641,0.6408,0.6405,0.6403,0.6401,0.6398,0.6396,0.6393,0.6391,0.6389,0.6386,0.6384,0.6381,0.6379,0.6377,0.6374,0.6372,0.6369,0.6367,0.6365,0.6362,0.636,0.6358,0.6355,0.6353,0.635,0.6348,0.6346,0.6343,0.6341,0.6338,0.6336,0.6334,0.6331,0.6329,0.6327,0.6324,0.6322,0.6319,0.6317,0.6315,0.6312,0.631,0.6308,0.6305,0.6303,0.6301,0.6298,0.6296,0.6293,0.6291,0.6289,0.6286,0.6284,0.6282,0.6279,0.6277,0.6275,0.6272,0.627,0.6267,0.6265,0.6263,0.626,0.6258,0.6256,0.6253,0.6251,0.6249,0.6246,0.6244,0.6242,0.6239,0.6237,0.6235,0.6232,0.623,0.6228,0.6225,0.6223,0.622,0.6218,0.6216,0.6213,0.6211,0.6209,0.6206,0.6204,0.6202,0.6199,0.6197,0.6195,0.6192,0.619,0.6188,0.6185,0.6183,0.6181,0.6178,0.6176,0.6174,0.6171,0.6169,0.6167,0.6165,0.6162,0.616,0.6158,0.6155,0.6153,0.6151,0.6148,0.6146,0.6144,0.6141,0.6139,0.6137,0.6134,0.6132,0.613,0.6127,0.6125,0.6123,0.612,0.6118,0.6116,0.6114,0.6111,0.6109,0.6107,0.6104,0.6102,0.61,0.6097,0.6095,0.6093,0.609,0.6088,0.6086,0.6084,0.6081,0.6079,0.6077,0.6074,0.6072,0.607,0.6067,0.6065,0.6063,0.6061,0.6058,0.6056,0.6054,0.6051,0.6049,0.6047,0.6045,0.6042,0.604,0.6038,0.6035,0.6033,0.6031,0.6029,0.6026,0.6024,0.6022,0.6019,0.6017,0.6015,0.6013,0.601,0.6008,0.6006,0.6003,0.6001,0.5999,0.5997,0.5994,0.5992,0.599,0.5987,0.5985,0.5983,0.5981,0.5978,0.5976,0.5974,0.5972,0.5969,0.5967,0.5965,0.5962,0.596,0.5958,0.5956,0.5953,0.5951,0.5949,0.5947,0.5944,0.5942,0.594,0.5938,0.5935,0.5933,0.5931,0.5928,0.5926,0.5924,0.5922,0.5919,0.5917,0.5915,0.5913,0.591,0.5908,0.5906,0.5904,0.5901,0.5899,0.5897,0.5895,0.5892,0.589,0.5888,0.5886,0.5883,0.5881,0.5879,0.5877,0.5874,0.5872,0.587,0.5868,0.5865,0.5863,0.5861,0.5859,0.5856,0.5854,0.5852,0.585,0.5847,0.5845,0.5843,0.5841,0.5838,0.5836,0.5834,0.5832,0.5829,0.5827,0.5825,0.5823,0.582,0.5818,0.5816,0.5814,0.5812,0.5809,0.5807,0.5805,0.5803,0.58,0.5798,0.5796,0.5794,0.5791,0.5789,0.5787,0.5785,0.5783,0.578,0.5778,0.5776,0.5774,0.5771,0.5769,0.5767,0.5765,0.5762,0.576,0.5758,0.5756,0.5754,0.5751,0.5749,0.5747,0.5745,0.5742,0.574,0.5738,0.5736,0.5734,0.5731,0.5729,0.5727,0.5725,0.5722,0.572,0.5718,0.5716,0.5714,0.5711,0.5709,0.5707,0.5705,0.5702,0.57,0.5698,0.5696,0.5694,0.5691,0.5689,0.5687,0.5685,0.5683,0.568,0.5678,0.5676,0.5674,0.5672,0.5669,0.5667,0.5665,0.5663,0.566,0.5658,0.5656,0.5654,0.5652,0.5649,0.5647,0.5645,0.5643,0.5641,0.5638,0.5636,0.5634,0.5632,0.563,0.5627,0.5625,0.5623,0.5621,0.5619,0.5616,0.5614,0.5612,0.561,0.5608,0.5605,0.5603,0.5601,0.5599,0.5597,0.5594,0.5592,0.559,0.5588,0.5586,0.5583,0.5581,0.5579,0.5577,0.5575,0.5573,0.557,0.5568,0.5566,0.5564,0.5562,0.5559,0.5557,0.5555,0.5553,0.5551,0.5548,0.5546,0.5544,0.5542,0.554,0.5537,0.5535,0.5533,0.5531,0.5529,0.5527,0.5524,0.5522,0.552,0.5518,0.5516,0.5513,0.5511,0.5509,0.5507,0.5505,0.5503,0.55,0.5498,0.5496,0.5494,0.5492,0.5489,0.5487,0.5485,0.5483,0.5481,0.5479,0.5476,0.5474,0.5472,0.547,0.5468,0.5466,0.5463,0.5461,0.5459,0.5457,0.5455,0.5453,0.545,0.5448,0.5446,0.5444,0.5442,0.5439,0.5437,0.5435,0.5433,0.5431,0.5429,0.5426,0.5424,0.5422,0.542,0.5418,0.5416,0.5413,0.5411,0.5409,0.5407,0.5405,0.5403,0.54,0.5398,0.5396,0.5394,0.5392,0.539,0.5387,0.5385,0.5383,0.5381,0.5379,0.5377,0.5375,0.5372,0.537,0.5368,0.5366,0.5364,0.5362,0.5359,0.5357,0.5355,0.5353,0.5351,0.5349,0.5346,0.5344,0.5342,0.534,0.5338,0.5336,0.5334,0.5331,0.5329,0.5327,0.5325,0.5323,0.5321,0.5318,0.5316,0.5314,0.5312,0.531,0.5308,0.5306,0.5303,0.5301,0.5299,0.5297,0.5295,0.5293,0.5291,0.5288,0.5286,0.5284,0.5282,0.528,0.5278,0.5276,0.5273,0.5271,0.5269,0.5267,0.5265,0.5263,0.5261,0.5258,0.5256,0.5254,0.5252,0.525,0.5248,0.5246,0.5243,0.5241,0.5239,0.5237,0.5235,0.5233,0.5231,0.5228,0.5226,0.5224,0.5222,0.522,0.5218,0.5216,0.5213,0.5211,0.5209,0.5207,0.5205,0.5203,0.5201,0.5198,0.5196,0.5194,0.5192,0.519,0.5188,0.5186,0.5184,0.5181,0.5179,0.5177,0.5175,0.5173,0.5171,0.5169,0.5167,0.5164,0.5162,0.516,0.5158,0.5156,0.5154,0.5152,0.5149,0.5147,0.5145,0.5143,0.5141,0.5139,0.5137,0.5135,0.5132,0.513,0.5128,0.5126,0.5124,0.5122,0.512,0.5118,0.5115,0.5113,0.5111,0.5109,0.5107,0.5105,0.5103,0.5101,0.5099,0.5096,0.5094,0.5092,0.509,0.5088,0.5086,0.5084,0.5082,0.5079,0.5077,0.5075,0.5073,0.5071,0.5069,0.5067,0.5065,0.5063,0.506,0.5058,0.5056,0.5054,0.5052,0.505,0.5048,0.5046,0.5044,0.5041,0.5039,0.5037,0.5035,0.5033,0.5031,0.5029,0.5027,0.5025,0.5022,0.502,0.5018,0.5016,0.5014,0.5012,0.501,0.5008,0.5006,0.5003,0.5001,0.4999,0.4997,0.4995,0.4993,0.4991,0.4989,0.4987,0.4985,0.4982,0.498,0.4978,0.4976,0.4974,0.4972,0.497,0.4968,0.4966,0.4964,0.4961,0.4959,0.4957,0.4955,0.4953,0.4951,0.4949,0.4947,0.4945,0.4943,0.494,0.4938,0.4936,0.4934,0.4932,0.493,0.4928,0.4926,0.4924,0.4922,0.492,0.4917,0.4915,0.4913,0.4911,0.4909,0.4907,0.4905,0.4903,0.4901,0.4899,0.4897,0.4894,0.4892,0.489,0.4888,0.4886,0.4884,0.4882,0.488,0.4878,0.4876,0.4874,0.4871,0.4869,0.4867,0.4865,0.4863,0.4861,0.4859,0.4857,0.4855,0.4853,0.4851,0.4849,0.4846,0.4844,0.4842,0.484,0.4838,0.4836,0.4834,0.4832,0.483,0.4828,0.4826,0.4824,0.4822,0.4819,0.4817,0.4815,0.4813,0.4811,0.4809,0.4807,0.4805,0.4803,0.4801,0.4799,0.4797,0.4795,0.4793,0.479,0.4788,0.4786,0.4784,0.4782,0.478,0.4778,0.4776,0.4774,0.4772,0.477,0.4768,0.4766,0.4764,0.4761,0.4759,0.4757,0.4755,0.4753,0.4751,0.4749,0.4747,0.4745,0.4743,0.4741,0.4739,0.4737,0.4735,0.4733,0.473,0.4728,0.4726,0.4724,0.4722,0.472,0.4718,0.4716,0.4714,0.4712,0.471,0.4708,0.4706,0.4704,0.4702,0.47,0.4698,0.4695,0.4693,0.4691,0.4689,0.4687,0.4685,0.4683,0.4681,0.4679,0.4677,0.4675,0.4673,0.4671,0.4669,0.4667,0.4665,0.4663,0.4661,0.4659,0.4656,0.4654,0.4652,0.465,0.4648,0.4646,0.4644,0.4642,0.464,0.4638,0.4636,0.4634,0.4632,0.463,0.4628,0.4626,0.4624,0.4622,0.462,0.4618,0.4616,0.4614,0.4611,0.4609,0.4607,0.4605,0.4603,0.4601,0.4599,0.4597,0.4595,0.4593,0.4591,0.4589,0.4587,0.4585,0.4583,0.4581,0.4579,0.4577,0.4575,0.4573,0.4571,0.4569,0.4567,0.4565,0.4563,0.4561,0.4559,0.4557,0.4554,0.4552,0.455,0.4548,0.4546,0.4544,0.4542,0.454,0.4538,0.4536,0.4534,0.4532,0.453,0.4528,0.4526,0.4524,0.4522,0.452,0.4518,0.4516,0.4514,0.4512,0.451,0.4508,0.4506,0.4504,0.4502,0.45,0.4498,0.4496,0.4494,0.4492,0.449,0.4488,0.4486,0.4484],"name":"M_A","npix":1217,"planted":{"Al_Ka":29292.5838,"Al_Ka_tail":446.08,"Cu_Ka":0.0,"Cu_Ka_stray":53.7099,"Mg_Ka":96.4991,"O_Ka":104.2268,"Si_Ka":192.0564,"Si_Ka_internal":23.1027},"source":"map","thickness_nm":74.585081,"truth_at":{"Al":98.8,"Mg":0.6,"Si":0.6}},{"axis_true":{"offset":-0.478,"scale":0.005},"counts":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,4,0,2,3,1,4,5,6,10,6,10,4,7,7,5,10,10,7,11,10,13,18,14,14,11,22,15,11,15,15,14,9,20,22,11,22,18,22,24,15,24,19,23,22,15,24,36,28,22,23,23,24,33,28,31,39,36,40,50,46,39,36,54,36,44,30,26,33,31,38,39,28,39,31,29,25,24,24,31,38,22,30,23,29,38,27,29,34,35,19,34,26,28,31,21,24,25,24,31,26,28,29,25,31,27,33,28,27,30,21,25,22,33,25,30,24,30,29,21,25,28,24,30,39,35,23,26,26,21,26,23,20,19,25,21,21,28,26,25,25,29,22,26,23,21,29,18,19,20,19,13,32,26,21,26,29,30,24,23,30,36,19,20,19,28,26,19,20,23,32,23,24,25,32,27,34,35,37,38,43,32,27,32,32,24,21,24,33,31,32,33,17,20,34,30,32,18,30,36,28,44,34,45,36,42,43,39,50,44,42,43,45,35,39,35,44,34,29,31,38,22,34,33,25,34,39,38,26,47,40,45,53,49,53,93,111,155,188,269,372,490,713,922,1110,1499,1832,2226,2681,3161,3412,3855,4088,4408,4608,4679,4521,4369,4025,3808,3488,3017,2541,2234,1816,1497,1174,909,700,552,396,295,206,179,150,110,91,75,48,53,40,23,28,19,19,18,12,9,10,12,21,14,19,19,18,26,23,32,31,23,32,35,43,45,40,42,37,41,40,34,31,34,24,21,29,29,25,31,17,18,14,29,13,7,11,15,9,17,14,11,17,7,12,16,18,10,15,11,17,10,13,16,16,15,6,15,7,10,14,15,16,13,11,19,9,17,15,8,14,8,9,14,11,12,13,8,10,6,16,12,12,13,15,6,12,19,11,13,5,16,13,7,19,12,7,12,15,12,18,10,11,10,9,13,5,12,9,15,14,19,13,18,10,15,6,7,18,10,10,10,9,12,12,5,12,10,13,13,11,15,12,10,4,10,14,14,10,12,4,14,6,11,11,15,5,9,8,12,5,9,9,6,17,7,5,13,16,7,7,10,11,13,8,15,8,5,11,11,13,12,7,11,9,8,15,17,11,16,17,6,8,8,10,8,9,10,6,8,12,10,10,11,7,5,6,9,11,9,11,11,3,11,6,11,9,10,11,7,10,13,15,13,8,14,10,14,5,9,7,14,11,9,14,7,8,13,10,4,2,12,9,15,8,5,8,12,10,9,15,11,7,10,18,23,30,14,25,28,45,47,43,46,70,67,80,81,91,82,118,157,144,117,145,134,100,125,130,89,106,90,82,70,64,61,50,42,31,31,26,20,19,18,13,14,15,14,8,8,10,7,5,8,13,6,9,8,12,13,9,9,9,6,9,6,8,7,8,9,10,12,5,10,7,8,4,12,6,7,9,9,10,4,16,6,9,11,12,15,10,9,6,5,6,7,17,8,5,8,11,6,16,10,9,9,8,9,7,11,6,13,8,9,12,12,5,8,6,3,10,7,9,4,7,7,9,6,3,10,9,6,8,4,5,5,9,8,7,11,9,6,8,4,6,7,8,6,5,12,7,5,9,5,7,6,7,10,7,5,5,13,8,6,4,6,5,8,9,2,7,5,8,6,6,4,6,11,8,3,6,11,5,13,12,10,7,12,2,4,7,4,9,8,4,5,4,6,7,8,6,16,6,7,5,3,13,4,9,6,6,4,6,4,10,9,10,3,8,8,5,9,4,8,5,5,7,7,5,4,12,7,5,8,4,4,7,4,11,7,5,6,7,10,10,5,7,4,4,8,2,2,6,7,3,13,8,7,9,5,5,7,5,8,7,6,6,8,11,5,7,6,5,7,5,6,5,8,7,6,6,7,6,9,6,8,3,5,5,4,6,11,5,4,6,4,7,8,5,9,3,8,2,3,7,11,7,7,6,7,5,3,9,3,9,9,3,4,8,5,5,9,6,7,7,8,8,4,4,6,3,6,3,4,2,6,5,2,6,9,5,7,4,5,6,6,5,3,5,3,6,11,8,7,7,7,5,6,8,9,7,8,5,8,10,4,5,5,4,3,3,3,9,6,5,7,5,8,4,9,10,7,4,4,6,9,6,15,3,6,2,4,6,3,5,6,5,3,11,3,5,9,4,7,6,5,2,5,6,6,3,5,5,3,2,4,4,3,7,7,7,8,7,7,8,3,6,9,7,10,4,5,1,10,9,6,6,5,6,6,6,4,5,3,7,10,5,3,8,4,3,5,7,5,8,4,6,6,8,3,0,5,6,2,8,5,2,3,7,4,3,4,6,8,8,7,3,6,4,4,4,5,2,4,5,3,3,4,5,3,3,6,7,7,4,3,4,4,4,4,7,6,6,7,6,7,7,5,7,2,6,6,10,6,5,4,3,4,3,11,7,3,5,5,4,4,8,7,4,9,7,3,2,5,6,5,7,8,5,4,7,2,10,1,8,6,3,3,7,3,3,7,5,4,3,7,6,3,4,1,8,2,6,0,7,5,4,1,1,5,3,5,6,7,2,3,4,4,2,6,4,8,2,4,8,7,5,4,4,2,5,2,7,10,1,2,4,7,3,3,7,2,2,9,4,2,6,8,2,5,4,4,5,6,6,5,4,6,8,4,2,6,2,3,1,7,1,8,3,6,8,5,4,5,5,6,3,4,10,3,7,1,4,2,2,3,3,4,3,2,4,6,3,5,3,7,5,4,5,5,8,5,8,4,4,6,7,3,4,6,3,6,4,5,4,3,5,6,2,5,3,3,3,4,5,4,4,0,5,1,5,5,2,5,5,4,4,7,4,3,6,6,4,3,5,2,1,5,3,5,5,7,4,3,3,2,3,3,3,5,2,2,3,4,2,3,4,3,5,11,2,4,3,3,3,2,5,3,1,1,2,4,5,8,8,3,6,4,4,3,4,2,4,4,1,2,6,6,6,5,4,6,5,2,6,3,3,4,0,3,6,4,1,4,5,5,5,5,6,3,4,3,0,7,3,2,2,2,2,8,2,3,4,3,4,1,5,4,3,0,4,8,4,4,5,3,5,3,3,5,3,1,1,6,6,5,6,3,4,3,4,3,6,4,6,7,2,3,5,4,2,0,1,3,6,2,2,9,2,5,3,2,5,1,3,6,6,3,1,4,3,4,3,2,1,4,5,3,5,8,3,5,4,2,5,6,5,3,4,8,7,4,0,4,5,6,3,4,4,5,6,2,4,2,2,1,7,4,6,4,0,1,7,6,1,6,3,4,4,3,1,5,2,3,3,4,5,3,1,5,6,1,3,3,4,2,1,3,3,5,5,4,3,2,1,3,6,6,3,7,4,2,4,3,2,5,3,2,3,2,4,5,5,1,3,4,1,0,1,3,1,2,2,7,1,2,7,7,8,6,5,1,5,2,3,3,3,1,3,1,7,4,5,4,3,2,4,4,4,2,6,2,3,5,4,1,5,6,3,3,1,3,3,4,4,3,4,2,3,5,4,4,3,3,1,2,2,7,1,2,5,3,6,4,4,5,8,4,6,6,5,3,6,6,5,9,7,6,6,8,4,10,4,7,6,5,3,3,7,7,5,8,12,6,7,11,10,6,7,9,8,5,6,2,15,4,10,9,1,1,3,3,3,6,5,5,6,8,7,3,4,4,3,2,3,4,4,5,1,2,3,2,3,1,1,1,4,3,3,2,4,2,6,1,4,5,3,7,3,7,5,2,4,0,3,1,4,6,0,5,2,4,3,5,5,6,4,4,0,5,4,0,2,3,2,4,5,1,3,5,2,3,1,4,4,4,1,5,3,3,1,3,2,7,5,1,2,2,3,1,6,2,1,3,2,7,4,5,5,3,1,2,2,2,1,4,3,2,4,0,2,5,4,5,2,1,5,5,4,3,4,1,5,2,2,2,3,3,4,3,3,4,5,1,3,0,3,2,5,3,4,0,4,6,6,2,1,4,4,6,3,4,3,3,6,2,4,4,4,4,2,2,5,3,1,4,3,0,1,0,4,4,3,3,6,2,4,1,3,3,5,6,1,8,2,2,5,2,2,3,4,5,7,2,4,4,4,2,3,0,3,7,4,4,3,0,2,0,2,4,2,3,3,4,5,2,0,2,4,6,0,5,1,5,2,1,1,2,4,3,5,4,1,2,2,4,4,3,2,1,1,2,4,4,5,1,1,5,3,3,5,4,4,2,1,2,3,2,0,6,5,2,1,1,1,2,4,4,1,1,4,3,2,1,1,5,2,3,6,3,2,0,2,1,3,7,1,3,3,3,3,2,4,1,0,4,3,2,1,3,1,1,1,3,3,2,1,1,2,1,3,5,3,4,1,6,2,0,1,5,2,6,1,3,3,2,4,0,4,3,4,2,1,3,4,2,3,1,1,2,1,1,2,4,2,1,5,3,3,3,0,2,4,2,2,3,1,1,7,1,3,2,4,0,2,0,2,1,2,3,4,1,4,4,3,3,3,5,3,1,2,2,4,2,4,3,1,2,2,2,2,5,5,1,4,3,2,2,5,3,1,1,3,2,2,2,4,1,5,1,4,2,2,4,3,3,3,3,4,3,3,5,4,4,3,2,4,3,2,1,2,3,1,4,4,3,1,5,1,0,3,5,1,2,1,4,3,3,0,0,1,2,2,3,3,3,2,1,3,3,1,3,0,2,1,2,2,0,1,1,2,1,2,0,2,3,0,1,1,1,5,2,1,1,3,3,2,0,4,6,1,1,3,4,4,2,5,1,4,4,4,1,2,1,2,1,3,4,2,3,2,1,2,2,0,2,5,1,0,5,1,3,2,1,3,3,0,0,3,3,2,1,1,5,1,1,4,4,1,3,3,2,3,2,5,0,5,1,0,5,1,2,2,0,4,1,3,2,2,2,0,2,4,2,5,1,4,0,2,4,2,3,1,0,2,2,2,2,2,0,1,4,1,3,3,2,0,3,7,2,1,0,1,2,4,4,2,1,3,3,2,2,3,2,2,2,1,3,2,1,3,2,4,3,3,2,2,2,5,2,4,1,3,0,4,2,7,0,5,1,4,3,2,5,1,1,4,1,1,1,1,3,3,3,0,1,5,2,2,2,1,0,5,1,3,3,3,3,1,2,1,2,1,0,0,4,2,1,3,3,1,3,3,6,1,5,2,0,0,2,3,3,3,2,3,3,2,2,1,1,5,3,3,1,1,0,2,1,2,2,1,3,3,2,4,5,2,1,1,1,3,1,6,3,3,1,4,2,1,2,3,5,3,1,4,2,4,5,3,5,1,2,3,1,0,2,1,1,2,2,2,2,0,2,1,1,4,2,1,6,5,2,4,3,5,4,2,5,2,2,2,1,3,3,0,2,1,5,0,3,0,2,4,2,1,3,0,1,1,2,3,3,2,2,3,1,3,1,1,2,1,1,0,3,2,5,5,0,1,1,2,2,4,0,2,3,1,3,2,2,2,2,1,4,2,2,5,0,3,1,4,3,2,1,1,1,3,2,0,1,1,2,2,2,2,4,3,1,3,1,3,0,2,0,5,0,3,3,7,3,2,3,2,3,4,1,2,1,0,3,0,1,1,0,0,6,2,4,2,1,3,3,4,2,2,6,1,1,1,1,1,1,4,1,3,1,3,3,0,2,2,2,2,1,2,2,2,2,3,2,3,4,2,4,3,1,2,3,0,2,1,1,1,3,0,1,2,5,2,2,2,7,2,1,1,2,1,2,3,2,2,0,4,4,2,2,6,2,2,2,4,0,2,3,1,2,1,3,3,6,1,2,1,3,1,4,4,4,2,0,2,0,2,2,0,2,2,1,4,1,4,1,4,2,1,2,4,1,1,1,3,3,1,1,0,3,3,1,1,2,4,1,2,1,2,1,2,0,3,3,4,4,3,3,4,1,2,0,2,3,0,1,2,5,4,1,6,1,3,2,3,2,1,5,1,1,2,1,4,1,0,5,4,2,0,0,1,1,0,0,3,3,2,1,4,3,0,1,3,3,0,2,6,3,0,2,2,1,3,4,4,3,0,0,1,1,1,3,1,3,2,2,2,3,2,1,1,4,3,2,1,2,4,3,2,2,1,0,1,3,0,1,1,4,3,2,1,3,2,3,1,1,2,0,1,0,4,2,1,3,2,1,1,0,4,2,1,2,3,3,0,1,0,3,3,0,0,1,2,2,4,2,1,2,4,2,1,1,3,1,1,2,3,3,4,1,1,2,4,2,0,3,0,1,1,2,3,2,1,1,2,2,1,3,3,0,2,1,0,1,2,1,4,2,1,0,3,1,2,3,0,2,0,0,3,1,1,1,0,3,1,7,2,1,1,2,0,3,1,0,0,1,3,1,1,2,5,0,3,2,1,4,0,3,3,6,2,0,4,0,0,1,1,0,4,5,3,2,2,5,1,2,3,2,2,0,1,1,1,2,1,2,4,1,1,5,2,1,0,0,3,2,2,3,8,4,1,2,1,0,3,0,2,1,2,1,4,1,0,0,1,0,1,2,2,2,1,2,0,0,4,2,0,2,2,3,3,3,1,3,2,5,0,3,1,3,2,2,2,2,5,3,0,4,5,2,1,2,0,2,1,1,3,1,1,0,2,1,3,1,2,2,1,1,6,0,4,6,2,2,1,1,2,0,0,2,1,1,2,0,0,3,1,2,1,3,2,2,3,2,2,4,1,3,1,1,1,1,4,2,1,2,5,3,1,0,3,0,0,3,2,0,3,0,0,1,2,4,1,0,3,2,1,3,4,2,1,3,1,2,2,1,2,1,3,1,2,1,2,3,0,1,5,1,2,1,1,2,1,1,0,2,0,1,1,1,1,4,0,3,1,1,2,0,4,1,1,2,1,2,3,1,2,1,0,1,0,1,2,3,2,2,1,1,4,1,0,2,3,2,3,0,0,0,2,2,2,1,2,1,2,3,3,2,1,1,1,1,2,2,1,1,1,1,2,2,3,0,1,0,4,3,1,1,1,2,4,1,2,1,1,2,4,3,2,0,1,0,2,0,1,1,0,0,1,4,3,1,0,3,1,2,2,0,2,2,1,2,0,1,1,1,1,4,3,3,2,2,1,2,3,1,2,3,2,5,2,3,2,3,1,2,1,0,2,1,1,2,2,2,2,5,1,2,1,3,0,3,2,5,1,3,1,2,3,1,1,2,0,3,2,1,3,1,2,1,1,1,1,4,2,2,1,2,2,1,2,1,0,0,2,1,1,2,4,1,1,4,0,2,2,0,1,2,3,2,1,0,0,0,0,0,1,1,2,2,2,1,0,1,1,2,1,3,1,1,2,2,1,3,1,0,2,0,2,1,0,1,0,2,1,1,1,2,1,1,0,2,3,3,1,2,1,1,0,0,1,2,1,1,1,4,2,2,1,0,1,2,1,1,1,2,1,1,1,1,2,2,3,1,4,0,3,0,2,1,1,2,0,2,1,3,1,0,1,2,2,0,0,2,1,1,3,2,1,0,0,0,1,1,2,0,1,4,0,0,2,1,2,3,0,1,0,2,1,2,1,1,1,1,1,3,2,2,1,0,0,0,0,1,1,4,1,0,4,2,0,0,2,2,0,1,1,3,2,1,2,1,0,2,3,2,0,4,1,2,1,2,1,3,2,1,1,3,1,0,2,2,0,2,2,1,3,2,1,0,1,2,0,2,0,0,2,2,2,2,0,1,2,4,1,3,0,0,1,3,0,1,0,1,0,2,0,1,4,1,7,1,0,3,0,2,0,2,0,0,2,1,1,0,0,2,1,2,1,1,1,1,2,3,0,1,3,1,1,2,1,2,0,1,1,4,3,5,1,3,0,0,2,1,4,2,1,1,1,2,1,3,3,1,1,0,1,2,0,1,1,3,1,2,2,0,3,1,0,1,2,2,3,0,1,1,1,4,0,1,1,0,0,1,0,2,0,0,1,0,1,0,3,3,0,1,3,0,4,0,0,1,0,2,0,3,1,1,2,1,0,1,2,0,1,0,0,2,0,1,0,2,2,0,1,1,3,3,1,1,1,0,2,0,1,3,1,1,1,1,3,4,1,1,1,0,3,2,1,1,4,2,1,1,3,2,2,0,4,0,2,2,1,1,0,1,1,0,3,2,1,1,2,2,3,1,2,1,2,0,1,0,1,1,0,2,0,1,7,0,0,1,0,0,0,2,1,3,0,4,3,2,1,2,1,1,0,1,1,2,1,1,2,3,2,2,1,0,2,1,1,1,1,2,1,3,3,1,1,3,0,0,2,2,1,1,0,1,1,1,0,3,3,0,0,0,3,0,2,0,2,1,1,3,1,2,1,0,0,1,3,3,0,1,1,0,3,2,1,1,0,2,4,3,1,2,1,3,0,0,1,0,0,1,2,4,2,2,2,1,2,2,1,1,3,0,2,0,2,3,0,1,3,1,0,0,1,1,2,1,3,0,4,1,0,3,2,2,3,0,1,3,1,0,2,1,2,1,0,1,1,1,0,1,0,3,1,1,0,3,0,3,0,0,2,0,1,3,1,0,4,1,4,0,1,1,0,1,2,1,3,2,0,2,2,2,2,0,2,0,2,0,0,0,0,2,1,0,1,0,2,3,0,2,0,2,1,0,1,2,1,2,4,3,2,0,3,1,3,2,3,1,1,0,1,1,1,4,0,1,2,0,0,1,1,1,4,0,1,0,2,0,0,1,2,1,3,1,0,2,3,3,2,2,1,2,1,1,1,1,2,1,1,0,0,0,1,2,1,1,1,2,1,2,2,2,1,2,3,1,2,3,2,4,2,1,1,0,0,0,3,1,4,1,0,1,2,0,0,2,1,0,5,1,0,0,0,0,1,1,1,2,1,1,2,1,0,2,0,2,1,0,1,1,0,0,1,0,1,1,0,2,1,2,0,2,0,1,1,1,1,4,0,3,0,2,1,2,2,1,0,0,1,1,0,2,1,1,1,2,1,1,1,5,0,1,2,3,0,1,2,2,1,1],"expected":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0003,0.0003,0.0003,0.0003,0.0003,0.0003,0.0003,0.0003,0.0004,0.0004,0.0004,0.0004,0.0004,0.0005,0.0005,0.0006,0.0009,0.0014,0.0027,0.0051,0.0095,0.0171,0.0292,0.0476,0.0743,0.1115,0.1616,0.2271,0.3101,0.4133,0.5382,0.6871,0.8612,1.0613,1.2893,1.5445,1.8273,2.1383,2.4758,2.8394,3.2291,3.6421,4.0774,4.5351,5.0115,5.5049,6.0155,6.5401,7.0762,7.6225,8.179,8.7417,9.3088,9.8798,10.4543,11.0286,11.6014,12.1716,12.7402,13.3036,13.8605,14.4101,14.9535,15.4886,16.0139,16.5288,17.0327,17.5275,18.0104,18.481,18.9391,19.3843,19.8187,20.2402,20.6485,21.0439,21.4266,21.7984,22.1609,22.5161,22.8696,23.2306,23.6143,24.0446,24.5539,25.1861,25.9956,27.0434,28.3885,30.0763,32.1217,34.4937,37.1056,39.8113,42.4149,44.6938,46.4319,47.4535,47.6577,47.0271,45.4066,43.4791,41.1927,38.7728,36.421,34.293,32.4855,31.0378,29.9417,29.1566,28.6255,28.288,28.0879,27.9797,27.929,27.9116,27.9119,27.92,27.9304,27.9404,27.9479,27.9522,27.9532,27.9506,27.9446,27.9354,27.923,27.9077,27.8897,27.8689,27.8454,27.8193,27.7908,27.76,27.7269,27.6917,27.6546,27.6157,27.5749,27.5325,27.4883,27.4427,27.3955,27.3469,27.2971,27.246,27.1938,27.1405,27.0863,27.031,26.9749,26.918,26.8604,26.802,26.743,26.6835,26.6234,26.563,26.5021,26.4409,26.3795,26.3178,26.256,26.1942,26.1325,26.071,26.0101,25.95,25.8911,25.8341,25.7796,25.7284,25.6815,25.6397,25.6039,25.5746,25.552,25.5356,25.5245,25.5169,25.5106,25.5029,25.4908,25.4717,25.4433,25.404,25.3532,25.2912,25.2193,25.1399,25.0559,24.971,24.8896,24.8174,24.76,24.7237,24.717,24.7495,24.8328,24.9792,25.2017,25.5121,25.919,26.4262,27.0299,27.717,28.464,29.2376,29.9963,30.6939,31.2841,31.7255,31.9866,32.0495,31.9122,31.5886,31.1068,30.5048,29.8268,29.118,28.4207,27.7711,27.1978,26.7215,26.3563,26.1112,25.9928,26.0074,26.1627,26.4693,26.9402,27.5892,28.4287,29.4657,30.6972,32.1064,33.6592,35.3028,36.9672,38.5689,40.0183,41.2281,42.1236,42.6511,42.785,42.531,41.9257,41.0314,39.929,38.7084,37.4589,36.2605,35.1781,34.2578,33.5231,32.9681,32.6309,32.4758,32.4863,32.6472,32.9513,33.4068,34.0474,34.949,36.2532,38.2034,41.1968,45.856,53.1218,64.3679,81.5309,107.2415,144.9371,198.9207,274.3284,376.9603,512.9353,688.1468,907.5226,1174.1329,1488.2349,1846.3859,2240.7856,2659.0134,3084.2982,3496.3946,3873.0479,4191.925,4432.789,4579.6284,4622.431,4558.3284,4391.931,4134.7962,3804.1161,3420.829,3007.4416,2585.8752,2175.6151,1792.3685,1447.3319,1147.0646,893.8748,686.5707,521.4035,392.5168,292.9458,219.8502,166.2335,127.0762,98.5231,77.5954,62.0932,50.4463,41.5709,34.7341,29.4414,25.354,22.2306,19.8918,18.1987,17.0425,16.3393,16.0276,16.0667,16.4341,17.1217,18.1308,19.4661,21.1289,23.1101,25.3838,27.9029,30.5957,33.3698,36.1069,38.6758,40.9418,42.7773,44.0728,44.7482,44.7605,44.1087,42.8337,41.0141,38.7584,36.1942,33.4568,30.6771,27.972,25.437,23.1422,21.1305,19.4201,18.0074,16.8721,15.9826,15.3014,14.7895,14.408,14.1231,13.904,13.726,13.5808,13.4555,13.3403,13.2311,13.1263,13.0259,12.9306,12.8416,12.7596,12.6853,12.6189,12.5603,12.5089,12.4641,12.4249,12.3905,12.3599,12.3323,12.3071,12.2835,12.2612,12.2397,12.2189,12.1985,12.1783,12.1583,12.1384,12.1186,12.0988,12.0791,12.0594,12.0397,12.02,12.0004,11.9807,11.9611,11.9415,11.9219,11.9023,11.8828,11.8632,11.8437,11.8242,11.8047,11.7853,11.7658,11.7463,11.7266,11.7069,11.6873,11.6677,11.6481,11.6285,11.609,11.5895,11.57,11.5505,11.5311,11.5118,11.4924,11.4731,11.4538,11.4346,11.4154,11.3962,11.377,11.3579,11.3388,11.3198,11.3008,11.2818,11.2629,11.244,11.2251,11.2063,11.1874,11.1686,11.1499,11.1311,11.1124,11.0938,11.0752,11.0566,11.038,11.0195,11.001,10.9826,10.9642,10.9459,10.9276,10.9093,10.891,10.8728,10.8547,10.8366,10.8185,10.8005,10.7825,10.7645,10.7466,10.7287,10.7108,10.693,10.6753,10.6576,10.6399,10.6222,10.6046,10.587,10.5695,10.552,10.5345,10.5171,10.4997,10.4824,10.4652,10.4479,10.4308,10.4136,10.3966,10.3796,10.3626,10.3457,10.3288,10.3119,10.2951,10.2784,10.2616,10.2449,10.2282,10.2115,10.1949,10.1783,10.1617,10.1451,10.1285,10.112,10.0955,10.079,10.0626,10.0462,10.0299,10.0136,9.9974,9.9812,9.9651,9.9492,9.9333,9.9176,9.9022,9.887,9.8722,9.858,9.8445,9.8319,9.8206,9.8108,9.8031,9.7978,9.7955,9.7967,9.8019,9.8116,9.8262,9.8459,9.8707,9.9004,9.9345,9.9722,10.0122,10.0533,10.0935,10.1311,10.1641,10.1906,10.2089,10.2175,10.2154,10.202,10.1772,10.1415,10.0959,10.0418,9.9808,9.9149,9.8462,9.7769,9.709,9.6446,9.5857,9.5347,9.4941,9.4671,9.458,9.4726,9.5192,9.6089,9.7568,9.983,10.3134,10.781,11.426,12.2972,13.4508,14.9506,16.8657,19.268,22.2284,25.8113,30.0694,35.0363,40.7199,47.0957,54.1012,61.6327,69.5434,77.6461,85.718,93.5101,100.7587,107.1998,112.5851,116.6976,119.3659,120.4764,119.9807,117.8996,114.3214,109.3956,103.3224,96.3397,88.707,80.6898,72.5448,64.5064,56.7769,49.5197,42.8559,36.864,31.5831,27.0177,23.1435,19.9147,17.2708,15.1427,13.4585,12.1474,11.1433,10.3868,9.826,9.4173,9.1249,8.9202,8.7812,8.6909,8.637,8.6107,8.6058,8.6181,8.6448,8.6841,8.7345,8.7947,8.8635,8.9395,9.0209,9.1055,9.1909,9.2744,9.3529,9.4235,9.4832,9.5295,9.56,9.5732,9.568,9.5442,9.5023,9.4435,9.3696,9.2831,9.1866,9.0831,8.9756,8.8669,8.7597,8.6561,8.5581,8.467,8.3837,8.3086,8.2419,8.1832,8.1322,8.0882,8.0504,8.0179,7.9901,7.9661,7.9453,7.9269,7.9106,7.8957,7.8821,7.8694,7.8573,7.8457,7.8345,7.8235,7.8127,7.8021,7.7916,7.7813,7.7709,7.7607,7.7505,7.7403,7.7302,7.7201,7.71,7.6999,7.6899,7.6798,7.6697,7.6595,7.6494,7.6392,7.6289,7.6187,7.6084,7.5981,7.5878,7.5775,7.5672,7.5569,7.5467,7.5364,7.5262,7.516,7.5059,7.4958,7.4858,7.4758,7.4659,7.456,7.4462,7.4363,7.4266,7.4168,7.4071,7.3975,7.3879,7.3782,7.3687,7.3591,7.3496,7.3401,7.3306,7.3212,7.3117,7.3023,7.2929,7.2836,7.2742,7.2649,7.2556,7.2463,7.237,7.2278,7.2186,7.2094,7.2002,7.1911,7.1819,7.1728,7.1637,7.1547,7.1456,7.1366,7.1276,7.1186,7.1096,7.1007,7.0918,7.0829,7.074,7.0651,7.0563,7.0475,7.0387,7.0299,7.0211,7.0124,7.0037,6.995,6.9863,6.9776,6.969,6.9603,6.9517,6.9431,6.9346,6.926,6.9175,6.909,6.9005,6.892,6.8836,6.8751,6.8667,6.8583,6.85,6.8416,6.8333,6.8249,6.8166,6.8084,6.8001,6.7919,6.7836,6.7754,6.7672,6.759,6.7509,6.7428,6.7346,6.7265,6.7185,6.7104,6.7023,6.6943,6.6863,6.6783,6.6703,6.6624,6.6544,6.6465,6.6386,6.6307,6.6228,6.615,6.6071,6.5993,6.5915,6.5837,6.576,6.5682,6.5605,6.5527,6.545,6.5374,6.5297,6.522,6.5144,6.5068,6.4992,6.4916,6.484,6.4765,6.4689,6.4614,6.4539,6.4464,6.4389,6.4315,6.424,6.4166,6.4092,6.4018,6.3944,6.3871,6.3797,6.3724,6.3651,6.3578,6.3505,6.3432,6.336,6.3287,6.3215,6.3143,6.3071,6.2999,6.2928,6.2856,6.2785,6.2714,6.2643,6.2572,6.2501,6.2431,6.236,6.229,6.222,6.215,6.208,6.201,6.1941,6.1871,6.1802,6.1733,6.1664,6.1595,6.1527,6.1458,6.139,6.1322,6.1253,6.1185,6.1118,6.105,6.0982,6.0915,6.0848,6.0781,6.0714,6.0647,6.058,6.0513,6.0447,6.0381,6.0315,6.0249,6.0183,6.0117,6.0051,5.9986,5.992,5.9855,5.979,5.9725,5.966,5.9596,5.9531,5.9467,5.9402,5.9338,5.9274,5.921,5.9146,5.9083,5.9019,5.8956,5.8893,5.8829,5.8766,5.8703,5.8641,5.8578,5.8516,5.8453,5.8391,5.8329,5.8267,5.8205,5.8143,5.8081,5.802,5.7958,5.7897,5.7836,5.7775,5.7714,5.7653,5.7593,5.7532,5.7472,5.7411,5.7351,5.7291,5.7231,5.7171,5.7111,5.7052,5.6992,5.6933,5.6874,5.6815,5.6756,5.6697,5.6638,5.6579,5.6521,5.6462,5.6404,5.6346,5.6287,5.6229,5.6172,5.6114,5.6056,5.5999,5.5941,5.5884,5.5827,5.5769,5.5712,5.5656,5.5599,5.5542,5.5485,5.5429,5.5373,5.5316,5.526,5.5204,5.5148,5.5093,5.5037,5.4981,5.4926,5.487,5.4815,5.476,5.4705,5.465,5.4595,5.454,5.4486,5.4431,5.4377,5.4322,5.4268,5.4214,5.416,5.4106,5.4052,5.3998,5.3945,5.3891,5.3838,5.3784,5.3731,5.3678,5.3625,5.3572,5.3519,5.3466,5.3414,5.3361,5.3309,5.3256,5.3204,5.3152,5.31,5.3048,5.2996,5.2944,5.2893,5.2841,5.279,5.2738,5.2687,5.2636,5.2585,5.2534,5.2483,5.2432,5.2381,5.233,5.228,5.2229,5.2179,5.2129,5.2079,5.2029,5.1979,5.1929,5.1879,5.1829,5.1779,5.173,5.168,5.1631,5.1582,5.1533,5.1484,5.1435,5.1386,5.1337,5.1288,5.1239,5.1191,5.1142,5.1094,5.1046,5.0997,5.0949,5.0901,5.0853,5.0805,5.0758,5.071,5.0662,5.0615,5.0567,5.052,5.0473,5.0425,5.0378,5.0331,5.0284,5.0237,5.0191,5.0144,5.0097,5.0051,5.0004,4.9958,4.9912,4.9865,4.9819,4.9773,4.9727,4.9681,4.9635,4.959,4.9544,4.9499,4.9453,4.9408,4.9362,4.9317,4.9272,4.9227,4.9182,4.9137,4.9092,4.9047,4.9002,4.8958,4.8913,4.8869,4.8824,4.878,4.8736,4.8692,4.8648,4.8604,4.856,4.8516,4.8472,4.8428,4.8385,4.8341,4.8298,4.8254,4.8211,4.8168,4.8124,4.8081,4.8038,4.7995,4.7952,4.7909,4.7867,4.7824,4.7781,4.7739,4.7696,4.7654,4.7612,4.7569,4.7527,4.7485,4.7443,4.7401,4.7359,4.7317,4.7276,4.7234,4.7192,4.7151,4.7109,4.7068,4.7026,4.6985,4.6944,4.6903,4.6862,4.6821,4.678,4.6739,4.6698,4.6657,4.6617,4.6576,4.6536,4.6495,4.6455,4.6415,4.6374,4.6334,4.6294,4.6254,4.6214,4.6174,4.6134,4.6094,4.6055,4.6015,4.5975,4.5936,4.5896,4.5857,4.5818,4.5778,4.5739,4.57,4.5661,4.5622,4.5583,4.5544,4.5505,4.5466,4.5428,4.5389,4.535,4.5312,4.5273,4.5235,4.5197,4.5158,4.512,4.5082,4.5044,4.5006,4.4968,4.493,4.4892,4.4854,4.4817,4.4779,4.4742,4.4704,4.4666,4.4629,4.4592,4.4554,4.4517,4.448,4.4443,4.4406,4.4369,4.4332,4.4295,4.4258,4.4221,4.4185,4.4148,4.4111,4.4075,4.4039,4.4002,4.3966,4.393,4.3894,4.3858,4.3822,4.3786,4.3751,4.3715,4.368,4.3645,4.3611,4.3576,4.3542,4.3508,4.3475,4.3441,4.3409,4.3376,4.3344,4.3312,4.3281,4.325,4.322,4.3189,4.3159,4.313,4.31,4.307,4.3041,4.3011,4.2981,4.295,4.292,4.2888,4.2856,4.2824,4.2791,4.2757,4.2723,4.2687,4.2652,4.2615,4.2578,4.254,4.2502,4.2464,4.2425,4.2386,4.2347,4.2308,4.227,4.2231,4.2192,4.2154,4.2116,4.2079,4.2042,4.2005,4.1968,4.1932,4.1897,4.1862,4.1827,4.1792,4.1758,4.1724,4.169,4.1656,4.1623,4.1589,4.1556,4.1523,4.1491,4.1458,4.1425,4.1393,4.136,4.1328,4.1295,4.1263,4.1231,4.1199,4.1167,4.1135,4.1103,4.1071,4.1039,4.1007,4.0975,4.0943,4.0912,4.088,4.0849,4.0817,4.0785,4.0754,4.0723,4.0691,4.066,4.0629,4.0597,4.0566,4.0535,4.0504,4.0473,4.0442,4.0411,4.038,4.0349,4.0318,4.0287,4.0257,4.0226,4.0195,4.0165,4.0134,4.0104,4.0073,4.0043,4.0012,3.9982,3.9952,3.9922,3.9891,3.9861,3.9831,3.9801,3.9771,3.9741,3.9711,3.9681,3.9651,3.9621,3.9592,3.9562,3.9532,3.9503,3.9473,3.9443,3.9414,3.9384,3.9355,3.9326,3.9296,3.9267,3.9238,3.9208,3.9179,3.915,3.9121,3.9092,3.9063,3.9034,3.9005,3.8976,3.8947,3.8918,3.889,3.8861,3.8832,3.8804,3.8775,3.8746,3.8718,3.8689,3.8661,3.8632,3.8604,3.8576,3.8548,3.8519,3.8491,3.8463,3.8435,3.8407,3.8379,3.8351,3.8323,3.8295,3.8267,3.8239,3.8212,3.8184,3.8157,3.8129,3.8102,3.8074,3.8047,3.802,3.7993,3.7966,3.7938,3.7912,3.7885,3.7858,3.7831,3.7804,3.7778,3.7751,3.7724,3.7698,3.7671,3.7645,3.7618,3.7591,3.7565,3.7538,3.7511,3.7485,3.7458,3.7431,3.7404,3.7377,3.7351,3.7324,3.7297,3.727,3.7243,3.7216,3.7189,3.7162,3.7135,3.7108,3.7082,3.7055,3.7028,3.7002,3.6975,3.6949,3.6922,3.6896,3.6869,3.6843,3.6817,3.6791,3.6765,3.6739,3.6713,3.6687,3.6661,3.6636,3.661,3.6584,3.6559,3.6533,3.6507,3.6482,3.6457,3.6431,3.6406,3.638,3.6355,3.633,3.6305,3.6279,3.6254,3.6229,3.6204,3.6179,3.6154,3.6129,3.6104,3.6079,3.6054,3.6029,3.6004,3.5979,3.5955,3.593,3.5905,3.5881,3.5856,3.5831,3.5807,3.5782,3.5758,3.5733,3.5709,3.5684,3.566,3.5636,3.5611,3.5587,3.5563,3.5538,3.5514,3.549,3.5466,3.5442,3.5418,3.5394,3.537,3.5346,3.5322,3.5298,3.5274,3.525,3.5226,3.5203,3.5179,3.5155,3.5131,3.5108,3.5084,3.506,3.5037,3.5013,3.499,3.4966,3.4943,3.4919,3.4896,3.4873,3.4849,3.4826,3.4803,3.4779,3.4756,3.4733,3.471,3.4687,3.4664,3.4641,3.4618,3.4595,3.4572,3.4549,3.4527,3.4504,3.4482,3.446,3.4438,3.4417,3.4397,3.4377,3.4359,3.4342,3.4327,3.4315,3.4306,3.4301,3.4301,3.4307,3.4322,3.4347,3.4384,3.4436,3.4506,3.4599,3.4717,3.4865,3.505,3.5276,3.555,3.5879,3.6269,3.6727,3.7263,3.7881,3.859,3.9396,4.0304,4.132,4.2445,4.3682,4.503,4.6485,4.8043,4.9694,5.1429,5.3233,5.5089,5.6978,5.8878,6.0766,6.2615,6.44,6.6092,6.7665,6.9093,7.0352,7.1419,7.2275,7.2904,7.3294,7.3437,7.3331,7.2976,7.238,7.1553,7.0509,6.9267,6.7848,6.6275,6.4575,6.2775,6.0901,5.898,5.7039,5.5101,5.3189,5.1324,4.9523,4.78,4.6169,4.4638,4.3212,4.1897,4.0694,3.9601,3.8616,3.7735,3.6953,3.6264,3.566,3.5135,3.4681,3.4291,3.3957,3.3674,3.3434,3.3232,3.3062,3.2919,3.2799,3.2699,3.2615,3.2544,3.2483,3.2431,3.2387,3.2347,3.2313,3.2281,3.2253,3.2226,3.2202,3.2178,3.2155,3.2133,3.2112,3.2091,3.207,3.205,3.203,3.201,3.199,3.197,3.195,3.193,3.191,3.189,3.1871,3.1851,3.1831,3.1812,3.1792,3.1773,3.1753,3.1734,3.1714,3.1695,3.1675,3.1656,3.1636,3.1617,3.1597,3.1578,3.1559,3.1539,3.152,3.1501,3.1482,3.1462,3.1443,3.1424,3.1405,3.1386,3.1367,3.1348,3.1329,3.131,3.1291,3.1272,3.1253,3.1234,3.1215,3.1196,3.1177,3.1158,3.1139,3.112,3.1102,3.1083,3.1064,3.1045,3.1027,3.1008,3.099,3.0971,3.0953,3.0934,3.0916,3.0898,3.088,3.0862,3.0844,3.0827,3.081,3.0793,3.0777,3.0762,3.0748,3.0734,3.0722,3.0712,3.0703,3.0697,3.0693,3.0692,3.0695,3.0703,3.0715,3.0732,3.0756,3.0787,3.0826,3.0873,3.093,3.0997,3.1075,3.1165,3.1267,3.1381,3.1508,3.1648,3.18,3.1965,3.2141,3.2327,3.2523,3.2726,3.2934,3.3146,3.3359,3.3571,3.3778,3.3977,3.4167,3.4343,3.4502,3.4643,3.4763,3.4859,3.4929,3.4973,3.4988,3.4976,3.4934,3.4864,3.4767,3.4645,3.4497,3.4328,3.4139,3.3933,3.3713,3.3481,3.3242,3.2996,3.2749,3.2501,3.2256,3.2016,3.1783,3.1559,3.1344,3.1141,3.095,3.0771,3.0605,3.0452,3.0311,3.0182,3.0066,2.996,2.9865,2.978,2.9704,2.9635,2.9574,2.952,2.9471,2.9427,2.9388,2.9353,2.932,2.9291,2.9264,2.9239,2.9216,2.9194,2.9173,2.9153,2.9133,2.9115,2.9097,2.9079,2.9061,2.9044,2.9027,2.901,2.8993,2.8977,2.896,2.8944,2.8927,2.8911,2.8894,2.8878,2.8862,2.8845,2.8829,2.8813,2.8797,2.878,2.8764,2.8748,2.8732,2.8716,2.8699,2.8683,2.8667,2.8651,2.8635,2.8619,2.8603,2.8587,2.8571,2.8555,2.8539,2.8523,2.8507,2.8491,2.8475,2.846,2.8444,2.8428,2.8412,2.8396,2.838,2.8365,2.8349,2.8333,2.8317,2.8302,2.8286,2.827,2.8255,2.8239,2.8223,2.8208,2.8192,2.8177,2.8161,2.8145,2.813,2.8114,2.8099,2.8083,2.8068,2.8052,2.8037,2.8022,2.8006,2.7991,2.7975,2.796,2.7945,2.7929,2.7914,2.7899,2.7884,2.7868,2.7853,2.7838,2.7823,2.7807,2.7792,2.7777,2.7762,2.7747,2.7732,2.7717,2.7701,2.7686,2.7671,2.7656,2.7641,2.7626,2.7611,2.7596,2.7581,2.7566,2.7551,2.7537,2.7522,2.7507,2.7492,2.7477,2.7462,2.7447,2.7433,2.7418,2.7403,2.7388,2.7373,2.7359,2.7344,2.7329,2.7315,2.73,2.7285,2.7271,2.7256,2.7241,2.7227,2.7212,2.7198,2.7183,2.7168,2.7154,2.7139,2.7125,2.711,2.7096,2.7082,2.7067,2.7053,2.7038,2.7024,2.7009,2.6995,2.6981,2.6966,2.6952,2.6938,2.6923,2.6909,2.6895,2.6881,2.6866,2.6852,2.6838,2.6824,2.681,2.6795,2.6781,2.6767,2.6753,2.6739,2.6725,2.6711,2.6697,2.6683,2.6669,2.6655,2.6641,2.6627,2.6613,2.6599,2.6585,2.6571,2.6557,2.6543,2.6529,2.6515,2.6501,2.6487,2.6473,2.646,2.6446,2.6432,2.6418,2.6404,2.6391,2.6377,2.6363,2.6349,2.6336,2.6322,2.6308,2.6295,2.6281,2.6267,2.6254,2.624,2.6227,2.6213,2.6199,2.6186,2.6172,2.6159,2.6145,2.6132,2.6118,2.6105,2.6091,2.6078,2.6064,2.6051,2.6037,2.6024,2.6011,2.5997,2.5984,2.5971,2.5957,2.5944,2.5931,2.5917,2.5904,2.5891,2.5877,2.5864,2.5851,2.5838,2.5824,2.5811,2.5798,2.5785,2.5772,2.5759,2.5745,2.5732,2.5719,2.5706,2.5693,2.568,2.5667,2.5654,2.5641,2.5628,2.5615,2.5602,2.5589,2.5576,2.5563,2.555,2.5537,2.5524,2.5511,2.5498,2.5485,2.5473,2.546,2.5447,2.5434,2.5421,2.5408,2.5396,2.5383,2.537,2.5357,2.5344,2.5332,2.5319,2.5306,2.5294,2.5281,2.5268,2.5256,2.5243,2.523,2.5218,2.5205,2.5192,2.518,2.5167,2.5155,2.5142,2.5129,2.5117,2.5104,2.5092,2.5079,2.5067,2.5054,2.5042,2.503,2.5017,2.5005,2.4992,2.498,2.4967,2.4955,2.4943,2.493,2.4918,2.4906,2.4893,2.4881,2.4869,2.4856,2.4844,2.4832,2.482,2.4807,2.4795,2.4783,2.4771,2.4758,2.4746,2.4734,2.4722,2.471,2.4698,2.4685,2.4673,2.4661,2.4649,2.4637,2.4625,2.4613,2.4601,2.4589,2.4577,2.4565,2.4553,2.4541,2.4529,2.4517,2.4505,2.4493,2.4481,2.4469,2.4457,2.4445,2.4433,2.4421,2.4409,2.4398,2.4386,2.4374,2.4362,2.435,2.4338,2.4327,2.4315,2.4303,2.4291,2.4279,2.4268,2.4256,2.4244,2.4233,2.4221,2.4209,2.4197,2.4186,2.4174,2.4162,2.4151,2.4139,2.4128,2.4116,2.4104,2.4093,2.4081,2.407,2.4058,2.4046,2.4035,2.4023,2.4012,2.4,2.3989,2.3977,2.3966,2.3954,2.3943,2.3932,2.392,2.3909,2.3897,2.3886,2.3874,2.3863,2.3852,2.384,2.3829,2.3818,2.3806,2.3795,2.3784,2.3772,2.3761,2.375,2.3739,2.3727,2.3716,2.3705,2.3694,2.3682,2.3671,2.366,2.3649,2.3638,2.3626,2.3615,2.3604,2.3593,2.3582,2.3571,2.356,2.3548,2.3537,2.3526,2.3515,2.3504,2.3493,2.3482,2.3471,2.346,2.3449,2.3438,2.3427,2.3416,2.3405,2.3394,2.3383,2.3372,2.3361,2.335,2.3339,2.3328,2.3317,2.3307,2.3296,2.3285,2.3274,2.3263,2.3252,2.3241,2.3231,2.322,2.3209,2.3198,2.3187,2.3177,2.3166,2.3155,2.3144,2.3134,2.3123,2.3112,2.3101,2.3091,2.308,2.3069,2.3059,2.3048,2.3037,2.3027,2.3016,2.3006,2.2995,2.2984,2.2974,2.2963,2.2953,2.2942,2.2931,2.2921,2.291,2.29,2.2889,2.2879,2.2868,2.2858,2.2847,2.2837,2.2826,2.2816,2.2805,2.2795,2.2784,2.2774,2.2764,2.2753,2.2743,2.2732,2.2722,2.2712,2.2701,2.2691,2.2681,2.267,2.266,2.265,2.2639,2.2629,2.2619,2.2608,2.2598,2.2588,2.2578,2.2567,2.2557,2.2547,2.2537,2.2526,2.2516,2.2506,2.2496,2.2486,2.2475,2.2465,2.2455,2.2445,2.2435,2.2425,2.2415,2.2404,2.2394,2.2384,2.2374,2.2364,2.2354,2.2344,2.2334,2.2324,2.2314,2.2304,2.2294,2.2284,2.2274,2.2264,2.2254,2.2244,2.2234,2.2224,2.2214,2.2204,2.2194,2.2184,2.2174,2.2164,2.2154,2.2145,2.2135,2.2125,2.2115,2.2105,2.2095,2.2085,2.2075,2.2066,2.2056,2.2046,2.2036,2.2026,2.2017,2.2007,2.1997,2.1987,2.1978,2.1968,2.1958,2.1948,2.1939,2.1929,2.1919,2.1909,2.19,2.189,2.188,2.1871,2.1861,2.1851,2.1842,2.1832,2.1823,2.1813,2.1803,2.1794,2.1784,2.1775,2.1765,2.1755,2.1746,2.1736,2.1727,2.1717,2.1708,2.1698,2.1689,2.1679,2.167,2.166,2.1651,2.1641,2.1632,2.1622,2.1613,2.1603,2.1594,2.1584,2.1575,2.1566,2.1556,2.1547,2.1537,2.1528,2.1519,2.1509,2.15,2.149,2.1481,2.1472,2.1462,2.1453,2.1444,2.1435,2.1425,2.1416,2.1407,2.1397,2.1388,2.1379,2.137,2.136,2.1351,2.1342,2.1333,2.1323,2.1314,2.1305,2.1296,2.1287,2.1277,2.1268,2.1259,2.125,2.1241,2.1232,2.1222,2.1213,2.1204,2.1195,2.1186,2.1177,2.1168,2.1159,2.1149,2.114,2.1131,2.1122,2.1113,2.1104,2.1095,2.1086,2.1077,2.1068,2.1059,2.105,2.1041,2.1032,2.1023,2.1014,2.1005,2.0996,2.0987,2.0978,2.0969,2.096,2.0951,2.0943,2.0934,2.0925,2.0916,2.0907,2.0898,2.0889,2.088,2.0871,2.0863,2.0854,2.0845,2.0836,2.0827,2.0818,2.081,2.0801,2.0792,2.0783,2.0774,2.0766,2.0757,2.0748,2.0739,2.073,2.0722,2.0713,2.0704,2.0696,2.0687,2.0678,2.0669,2.0661,2.0652,2.0643,2.0635,2.0626,2.0617,2.0609,2.06,2.0591,2.0583,2.0574,2.0565,2.0557,2.0548,2.054,2.0531,2.0522,2.0514,2.0505,2.0497,2.0488,2.0479,2.0471,2.0462,2.0454,2.0445,2.0437,2.0428,2.042,2.0411,2.0403,2.0394,2.0386,2.0377,2.0369,2.036,2.0352,2.0343,2.0335,2.0326,2.0318,2.031,2.0301,2.0293,2.0284,2.0276,2.0267,2.0259,2.0251,2.0242,2.0234,2.0226,2.0217,2.0209,2.02,2.0192,2.0184,2.0175,2.0167,2.0159,2.015,2.0142,2.0134,2.0126,2.0117,2.0109,2.0101,2.0092,2.0084,2.0076,2.0068,2.0059,2.0051,2.0043,2.0035,2.0026,2.0018,2.001,2.0002,1.9994,1.9985,1.9977,1.9969,1.9961,1.9953,1.9945,1.9936,1.9928,1.992,1.9912,1.9904,1.9896,1.9888,1.9879,1.9871,1.9863,1.9855,1.9847,1.9839,1.9831,1.9823,1.9815,1.9807,1.9799,1.979,1.9782,1.9774,1.9766,1.9758,1.975,1.9742,1.9734,1.9726,1.9718,1.971,1.9702,1.9694,1.9686,1.9678,1.967,1.9662,1.9654,1.9646,1.9639,1.9631,1.9623,1.9615,1.9607,1.9599,1.9591,1.9583,1.9575,1.9567,1.9559,1.9552,1.9544,1.9536,1.9528,1.952,1.9512,1.9504,1.9496,1.9489,1.9481,1.9473,1.9465,1.9457,1.945,1.9442,1.9434,1.9426,1.9418,1.9411,1.9403,1.9395,1.9387,1.9379,1.9372,1.9364,1.9356,1.9348,1.9341,1.9333,1.9325,1.9318,1.931,1.9302,1.9294,1.9287,1.9279,1.9271,1.9264,1.9256,1.9248,1.9241,1.9233,1.9225,1.9218,1.921,1.9202,1.9195,1.9187,1.9179,1.9172,1.9164,1.9157,1.9149,1.9141,1.9134,1.9126,1.9119,1.9111,1.9103,1.9096,1.9088,1.9081,1.9073,1.9066,1.9058,1.9051,1.9043,1.9035,1.9028,1.902,1.9013,1.9005,1.8998,1.899,1.8983,1.8975,1.8968,1.896,1.8953,1.8945,1.8938,1.8931,1.8923,1.8916,1.8908,1.8901,1.8893,1.8886,1.8878,1.8871,1.8864,1.8856,1.8849,1.8841,1.8834,1.8827,1.8819,1.8812,1.8804,1.8797,1.879,1.8782,1.8775,1.8768,1.876,1.8753,1.8746,1.8738,1.8731,1.8723,1.8716,1.8709,1.8702,1.8694,1.8687,1.868,1.8672,1.8665,1.8658,1.865,1.8643,1.8636,1.8629,1.8621,1.8614,1.8607,1.86,1.8592,1.8585,1.8578,1.8571,1.8563,1.8556,1.8549,1.8542,1.8535,1.8527,1.852,1.8513,1.8506,1.8499,1.8491,1.8484,1.8477,1.847,1.8463,1.8455,1.8448,1.8441,1.8434,1.8427,1.842,1.8413,1.8405,1.8398,1.8391,1.8384,1.8377,1.837,1.8363,1.8356,1.8349,1.8341,1.8334,1.8327,1.832,1.8313,1.8306,1.8299,1.8292,1.8285,1.8278,1.8271,1.8264,1.8257,1.825,1.8243,1.8236,1.8229,1.8222,1.8214,1.8207,1.82,1.8193,1.8186,1.8179,1.8172,1.8165,1.8158,1.8151,1.8145,1.8138,1.8131,1.8124,1.8117,1.811,1.8103,1.8096,1.8089,1.8082,1.8075,1.8068,1.8061,1.8054,1.8047,1.804,1.8033,1.8026,1.802,1.8013,1.8006,1.7999,1.7992,1.7985,1.7978,1.7971,1.7964,1.7958,1.7951,1.7944,1.7937,1.793,1.7923,1.7916,1.791,1.7903,1.7896,1.7889,1.7882,1.7875,1.7869,1.7862,1.7855,1.7848,1.7841,1.7835,1.7828,1.7821,1.7814,1.7807,1.7801,1.7794,1.7787,1.778,1.7773,1.7767,1.776,1.7753,1.7746,1.774,1.7733,1.7726,1.7719,1.7713,1.7706,1.7699,1.7692,1.7686,1.7679,1.7672,1.7666,1.7659,1.7652,1.7645,1.7639,1.7632,1.7625,1.7619,1.7612,1.7605,1.7599,1.7592,1.7585,1.7579,1.7572,1.7565,1.7559,1.7552,1.7545,1.7539,1.7532,1.7525,1.7519,1.7512,1.7505,1.7499,1.7492,1.7486,1.7479,1.7472,1.7466,1.7459,1.7452,1.7446,1.7439,1.7433,1.7426,1.7419,1.7413,1.7406,1.74,1.7393,1.7387,1.738,1.7373,1.7367,1.736,1.7354,1.7347,1.7341,1.7334,1.7328,1.7321,1.7314,1.7308,1.7301,1.7295,1.7288,1.7282,1.7275,1.7269,1.7262,1.7256,1.7249,1.7243,1.7236,1.723,1.7223,1.7217,1.721,1.7204,1.7197,1.7191,1.7184,1.7178,1.7171,1.7165,1.7158,1.7152,1.7145,1.7139,1.7133,1.7126,1.712,1.7113,1.7107,1.71,1.7094,1.7087,1.7081,1.7075,1.7068,1.7062,1.7055,1.7049,1.7043,1.7036,1.703,1.7023,1.7017,1.701,1.7004,1.6998,1.6991,1.6985,1.6979,1.6972,1.6966,1.6959,1.6953,1.6947,1.694,1.6934,1.6928,1.6921,1.6915,1.6908,1.6902,1.6896,1.6889,1.6883,1.6877,1.687,1.6864,1.6858,1.6851,1.6845,1.6839,1.6832,1.6826,1.682,1.6813,1.6807,1.6801,1.6795,1.6788,1.6782,1.6776,1.6769,1.6763,1.6757,1.675,1.6744,1.6738,1.6732,1.6725,1.6719,1.6713,1.6706,1.67,1.6694,1.6688,1.6681,1.6675,1.6669,1.6663,1.6656,1.665,1.6644,1.6638,1.6631,1.6625,1.6619,1.6613,1.6606,1.66,1.6594,1.6588,1.6582,1.6575,1.6569,1.6563,1.6557,1.655,1.6544,1.6538,1.6532,1.6526,1.6519,1.6513,1.6507,1.6501,1.6495,1.6488,1.6482,1.6476,1.647,1.6464,1.6458,1.6451,1.6445,1.6439,1.6433,1.6427,1.6421,1.6414,1.6408,1.6402,1.6396,1.639,1.6384,1.6378,1.6371,1.6365,1.6359,1.6353,1.6347,1.6341,1.6335,1.6328,1.6322,1.6316,1.631,1.6304,1.6298,1.6292,1.6286,1.6279,1.6273,1.6267,1.6261,1.6255,1.6249,1.6243,1.6237,1.6231,1.6225,1.6218,1.6212,1.6206,1.62,1.6194,1.6188,1.6182,1.6176,1.617,1.6164,1.6158,1.6152,1.6146,1.6139,1.6133,1.6127,1.6121,1.6115,1.6109,1.6103,1.6097,1.6091,1.6085,1.6079,1.6073,1.6067,1.6061,1.6055,1.6049,1.6043,1.6037,1.6031,1.6025,1.6019,1.6013,1.6007,1.6001,1.5994,1.5988,1.5982,1.5976,1.597,1.5964,1.5958,1.5952,1.5946,1.594,1.5934,1.5928,1.5922,1.5916,1.591,1.5904,1.5898,1.5892,1.5886,1.588,1.5875,1.5869,1.5863,1.5857,1.5851,1.5845,1.5839,1.5833,1.5827,1.5821,1.5815,1.5809,1.5803,1.5797,1.5791,1.5785,1.5779,1.5773,1.5767,1.5761,1.5755,1.5749,1.5743,1.5737,1.5731,1.5726,1.572,1.5714,1.5708,1.5702,1.5696,1.569,1.5684,1.5678,1.5672,1.5666,1.566,1.5654,1.5649,1.5643,1.5637,1.5631,1.5625,1.5619,1.5613,1.5607,1.5601,1.5595,1.5589,1.5584,1.5578,1.5572,1.5566,1.556,1.5554,1.5548,1.5542,1.5536,1.5531,1.5525,1.5519,1.5513,1.5507,1.5501,1.5495,1.5489,1.5484,1.5478,1.5472,1.5466,1.546,1.5454,1.5448,1.5442,1.5437,1.5431,1.5425,1.5419,1.5413,1.5407,1.5401,1.5396,1.539,1.5384,1.5378,1.5372,1.5366,1.5361,1.5355,1.5349,1.5343,1.5337,1.5331,1.5326,1.532,1.5314,1.5308,1.5302,1.5296,1.5291,1.5285,1.5279,1.5273,1.5267,1.5261,1.5256,1.525,1.5244,1.5238,1.5232,1.5227,1.5221,1.5215,1.5209,1.5203,1.5198,1.5192,1.5186,1.518,1.5174,1.5169,1.5163,1.5157,1.5151,1.5145,1.514,1.5134,1.5128,1.5122,1.5116,1.5111,1.5105,1.5099,1.5093,1.5088,1.5082,1.5076,1.507,1.5064,1.5059,1.5053,1.5047,1.5041,1.5036,1.503,1.5024,1.5018,1.5013,1.5007,1.5001,1.4995,1.499,1.4984,1.4978,1.4972,1.4967,1.4961,1.4955,1.4949,1.4944,1.4938,1.4932,1.4926,1.4921,1.4915,1.4909,1.4903,1.4898,1.4892,1.4886,1.488,1.4875,1.4869,1.4863,1.4857,1.4852,1.4846,1.484,1.4835,1.4829,1.4823,1.4817,1.4812,1.4806,1.48,1.4795,1.4789,1.4783,1.4777,1.4772,1.4766,1.476,1.4755,1.4749,1.4743,1.4737,1.4732,1.4726,1.472,1.4715,1.4709,1.4703,1.4697,1.4692,1.4686,1.468,1.4675,1.4669,1.4663,1.4658,1.4652,1.4646,1.4641,1.4635,1.4629,1.4624,1.4618,1.4612,1.4606,1.4601,1.4595,1.4589,1.4584,1.4578,1.4572,1.4567,1.4561,1.4555,1.455,1.4544,1.4538,1.4533,1.4527,1.4521,1.4516,1.451,1.4504,1.4499,1.4493,1.4487,1.4482,1.4476,1.447,1.4465,1.4459,1.4454,1.4448,1.4442,1.4437,1.4431,1.4425,1.442,1.4414,1.4408,1.4403,1.4397,1.4391,1.4386,1.438,1.4374,1.4369,1.4363,1.4358,1.4352,1.4346,1.4341,1.4335,1.4329,1.4324,1.4318,1.4313,1.4307,1.4301,1.4296,1.429,1.4284,1.4279,1.4273,1.4268,1.4262,1.4256,1.4251,1.4245,1.4239,1.4234,1.4228,1.4223,1.4217,1.4211,1.4206,1.42,1.4195,1.4189,1.4183,1.4178,1.4172,1.4167,1.4161,1.4155,1.415,1.4144,1.4139,1.4133,1.4127,1.4122,1.4116,1.4111,1.4105,1.4099,1.4094,1.4088,1.4083,1.4077,1.4071,1.4066,1.406,1.4055,1.4049,1.4043,1.4038,1.4032,1.4027,1.4021,1.4016,1.401,1.4004,1.3999,1.3993,1.3988,1.3982,1.3977,1.3971,1.3965,1.396,1.3954,1.3949,1.3943,1.3938,1.3932,1.3926,1.3921,1.3915,1.391,1.3904,1.3899,1.3893,1.3887,1.3882,1.3876,1.3871,1.3865,1.386,1.3854,1.3849,1.3843,1.3837,1.3832,1.3826,1.3821,1.3815,1.381,1.3804,1.3799,1.3793,1.3788,1.3782,1.3776,1.3771,1.3765,1.376,1.3754,1.3749,1.3743,1.3738,1.3732,1.3727,1.3721,1.3716,1.371,1.3704,1.3699,1.3693,1.3688,1.3682,1.3677,1.3671,1.3666,1.366,1.3655,1.3649,1.3644,1.3638,1.3633,1.3627,1.3622,1.3616,1.3611,1.3605,1.36,1.3594,1.3588,1.3583,1.3577,1.3572,1.3566,1.3561,1.3555,1.355,1.3544,1.3539,1.3533,1.3528,1.3522,1.3517,1.3511,1.3506,1.35,1.3495,1.3489,1.3484,1.3478,1.3473,1.3467,1.3462,1.3456,1.3451,1.3445,1.344,1.3434,1.3429,1.3423,1.3418,1.3412,1.3407,1.3401,1.3396,1.3391,1.3385,1.338,1.3374,1.3369,1.3363,1.3358,1.3352,1.3347,1.3341,1.3336,1.333,1.3325,1.3319,1.3314,1.3308,1.3303,1.3297,1.3292,1.3286,1.3281,1.3275,1.327,1.3265,1.3259,1.3254,1.3248,1.3243,1.3237,1.3232,1.3226,1.3221,1.3215,1.321,1.3204,1.3199,1.3194,1.3188,1.3183,1.3177,1.3172,1.3166,1.3161,1.3155,1.315,1.3144,1.3139,1.3134,1.3128,1.3123,1.3117,1.3112,1.3106,1.3101,1.3095,1.309,1.3085,1.3079,1.3074,1.3068,1.3063,1.3057,1.3052,1.3047,1.3041,1.3036,1.303,1.3025,1.3019,1.3014,1.3009,1.3003,1.2998,1.2992,1.2987,1.2981,1.2976,1.2971,1.2965,1.296,1.2954,1.2949,1.2943,1.2938,1.2933,1.2927,1.2922,1.2916,1.2911,1.2906,1.29,1.2895,1.2889,1.2884,1.2878,1.2873,1.2868,1.2862,1.2857,1.2851,1.2846,1.2841,1.2835,1.283,1.2824,1.2819,1.2814,1.2808,1.2803,1.2797,1.2792,1.2787,1.2781,1.2776,1.277,1.2765,1.276,1.2754,1.2749,1.2743,1.2738,1.2733,1.2727,1.2722,1.2717,1.2711,1.2706,1.27,1.2695,1.269,1.2684,1.2679,1.2673,1.2668,1.2663,1.2657,1.2652,1.2647,1.2641,1.2636,1.263,1.2625,1.262,1.2614,1.2609,1.2604,1.2598,1.2593,1.2588,1.2582,1.2577,1.2571,1.2566,1.2561,1.2555,1.255,1.2545,1.2539,1.2534,1.2529,1.2523,1.2518,1.2512,1.2507,1.2502,1.2496,1.2491,1.2486,1.248,1.2475,1.247,1.2464,1.2459,1.2454,1.2448,1.2443,1.2438,1.2432,1.2427,1.2422,1.2416,1.2411,1.2406,1.24,1.2395,1.239,1.2384,1.2379,1.2374,1.2368,1.2363,1.2358,1.2352,1.2347,1.2342,1.2336,1.2331,1.2326,1.232,1.2315,1.231,1.2304,1.2299,1.2294,1.2288,1.2283,1.2278,1.2272,1.2267,1.2262,1.2257,1.2251,1.2246,1.2241,1.2235,1.223,1.2225,1.2219,1.2214,1.2209,1.2203,1.2198,1.2193,1.2188,1.2182,1.2177,1.2172,1.2166,1.2161,1.2156,1.215,1.2145,1.214,1.2135,1.2129,1.2124,1.2119,1.2113,1.2108,1.2103,1.2098,1.2092,1.2087,1.2082,1.2076,1.2071,1.2066,1.2061,1.2055,1.205,1.2045,1.2039,1.2034,1.2029,1.2024,1.2018,1.2013,1.2008,1.2003,1.1997,1.1992,1.1987,1.1981,1.1976,1.1971,1.1966,1.196,1.1955,1.195,1.1945,1.1939,1.1934,1.1929,1.1924,1.1918,1.1913,1.1908,1.1903,1.1897,1.1892,1.1887,1.1882,1.1876,1.1871,1.1866,1.1861,1.1855,1.185,1.1845,1.184,1.1834,1.1829,1.1824,1.1819,1.1813,1.1808,1.1803,1.1798,1.1793,1.1787,1.1782,1.1777,1.1772,1.1766,1.1761,1.1756,1.1751,1.1745,1.174,1.1735,1.173,1.1725,1.1719,1.1714,1.1709,1.1704,1.1699,1.1693,1.1688,1.1683,1.1678,1.1672,1.1667,1.1662,1.1657,1.1652,1.1646,1.1641,1.1636,1.1631,1.1626,1.162,1.1615,1.161,1.1605,1.16,1.1594,1.1589,1.1584,1.1579,1.1574,1.1568,1.1563,1.1558,1.1553,1.1548,1.1543,1.1537,1.1532,1.1527,1.1522,1.1517,1.1511],"name":"M_matrix","npix":2897,"planted":{"Al_Ka":74726.2304,"Al_Ka_tail":1137.9629,"Cu_Ka":0.0,"Cu_Ka_stray":127.7478,"Mg_Ka":245.9678,"O_Ka":262.3691,"Si_Ka":484.8118,"Si_Ka_internal":59.8995},"source":"map","thickness_nm":80.878071,"truth_at":{"Al":98.8,"Mg":0.6,"Si":0.6}}],"true_k_counts_per_atom_nm2":{"Al":0.006802201645893394,"Mg":0.0036712336182256246,"Si":0.008262366164884884}} diff --git a/Tests/SpectroEDXTests/SpectroscopyAbsorptionTruthTests.swift b/Tests/SpectroEDXTests/SpectroscopyAbsorptionTruthTests.swift index 61d751b..1b5c6a1 100644 --- a/Tests/SpectroEDXTests/SpectroscopyAbsorptionTruthTests.swift +++ b/Tests/SpectroEDXTests/SpectroscopyAbsorptionTruthTests.swift @@ -160,7 +160,7 @@ final class SpectroscopyAbsorptionTruthTests { } } - private static func input(seed: UInt64, absorption: Bool) -> PooledQuantificationInput { + private static func input(seed: UInt64, absorption: Bool, policy: QuantificationPolicy = .default) -> PooledQuantificationInput { let p = pool var rng = SplitMix64(state: seed) let counts = p.expected.map { poisson($0, &rng) } @@ -183,7 +183,7 @@ final class SpectroscopyAbsorptionTruthTests { SpectrumDetectorSegment(name: "SuperXG1\(i + 1)", azimuthDegrees: a.0, elevationDegrees: 22, solidAngle: a.1) } return PooledQuantificationInput(counts: counts, axis: p.axis, method: m, metadata: meta, regionName: "recipe A pool", - pixelCount: p.npix, resolutionMnKaEV: 130) + pixelCount: p.npix, resolutionMnKaEV: 130, policy: policy) } private static let seeds: [UInt64] = [11, 12, 13, 14] @@ -223,7 +223,13 @@ final class SpectroscopyAbsorptionTruthTests { /// sqrt(4) (3 x 56 / 2 / 2116 = 0.040, about 85 counts). The seeds are fixed, so this is a regression pin, not a confidence /// interval and not validation. A known deviation: pinned so that a change either way fails and is looked at. It is the real /// Si gate; the per-seed tolerance above only bounds each draw. - private static let siBiasFraction = -0.203, siBiasBand = 0.040 + /// Those numbers are the fit WITHOUT sum peaks (`SumPeakRule.off`, the default before sum peaks were; the envelope above is + /// kept, it bounds both fits). With the default sum peaks (`SumPeakRule.whenSignificant`, the pile-up coefficient kept on every + /// seed) the nets are 2061 / 1912 / 1917 / 2006, mean 1974, -6.7 %, sd 72 counts, band 3 x 72 / 2 / 2116 = 0.051 (noise-free the + /// same fit reads -4.0 %). The Al+Al sum peak at 2.97 keV had pulled the continuum segment above the Al K edge, and Si K-alpha + /// with it (`DemoEDXPoolTests`). `siBiasFractionWithoutSumPeaks` keeps the old pin on the `.off` fit. + private static let siBiasFraction = -0.067, siBiasBand = 0.051 + private static let siBiasFractionWithoutSumPeaks = -0.203, siBiasBandWithoutSumPeaks = 0.040 /// Per-seed numbers go to stderr: `print` stays in the hosted app's stdout and never reaches the xcodebuild log. /// Also kept as an attachment (read it from the xcresult: `xcresulttool export attachments`, or the test run's attachments folder). @@ -285,6 +291,17 @@ final class SpectroscopyAbsorptionTruthTests { note(String(format: "L2 Si bias against the planted K-alpha peak %.4f (pinned %.3f +- %.3f); against the sample line alone %.4f", siBias, Self.siBiasFraction, Self.siBiasBand, siNet.reduce(0, +) / Double(siNet.count) / p.areasWithAbsorption["Si_Ka"]! - 1)) #expect(abs(siBias - Self.siBiasFraction) <= Self.siBiasBand, "Si bias against the planted K-alpha peak: \(siBias), nets \(siNet)") + // The fit without sum peaks (the exSpy-equivalent line model) keeps its own pin. + var off = QuantificationPolicy.default + off.fit.sumPeaks = .off + var offNet: [Double] = [] + for seed in Self.seeds { + let r = try PooledQuantifier.run(Self.input(seed: seed, absorption: true, policy: off), tables: Self.tables) + offNet.append(try #require(r.rows.first { $0.element == "Si" }).net) + } + let offBias = offNet.reduce(0, +) / Double(offNet.count) / Self.plantedSiKa - 1 + note(String(format: "L2 Si bias without sum peaks %.4f (pinned %.3f +- %.3f)", offBias, Self.siBiasFractionWithoutSumPeaks, Self.siBiasBandWithoutSumPeaks)) + #expect(abs(offBias - Self.siBiasFractionWithoutSumPeaks) <= Self.siBiasBandWithoutSumPeaks, "without sum peaks: \(offBias), nets \(offNet)") // The Si correction is a property of the geometry, not of the draw: the same on every seed (predicted +0.078 at%). let spread = (siGain.max() ?? 0) - (siGain.min() ?? 0) #expect(spread < 0.01, "Si correction by seed: \(siGain)") diff --git a/Tests/SpectroEDXTests/SumEscapeExplainedTests.swift b/Tests/SpectroEDXTests/SumEscapeExplainedTests.swift index fd7609c..f3737b4 100644 --- a/Tests/SpectroEDXTests/SumEscapeExplainedTests.swift +++ b/Tests/SpectroEDXTests/SumEscapeExplainedTests.swift @@ -72,9 +72,15 @@ struct SumEscapeExplainedTests { @Test(arguments: [1, 2]) func simSumPeaksTheModelCoversAreNotNamed(region: Int) throws { let counts = Self.simCounts(region) - let (off, qOff) = try Self.check(Self.input(counts: counts, axis: Self.sim.axis, elements: Self.listed, sumEscape: nil)) + // Off: an explicit model with both terms off (the default runs sum peaks when the data support them, below). + let (off, qOff) = try Self.check(Self.input(counts: counts, axis: Self.sim.axis, elements: Self.listed, sumEscape: SumEscapeModel())) #expect(qOff.sumEscapeCounts == nil) #expect(off.names.contains("Ar"), "premise: without the model the Al+Al sum is named as Ar: \(off.summary)") + // The default (`SumPeakRule.whenSignificant`): the Al+Al self pair is significant, the sum peaks are kept and explained. + let (byDefault, qDefault) = try Self.check(Self.input(counts: counts, axis: Self.sim.axis, elements: Self.listed, sumEscape: nil)) + #expect(qDefault.appliedSumEscape == SumEscapeModel(sumPeaks: true)) + #expect(qDefault.sumEscapeCounts != nil) + #expect(!byDefault.names.contains("Ar") && !byDefault.names.contains("Ag"), "the default explains the Al+Al sum: \(byDefault.summary)") let (on, q) = try Self.check(Self.input(counts: counts, axis: Self.sim.axis, elements: Self.listed, sumEscape: .both)) let sumCounts = try #require(q.sumEscapeCounts) #expect(sumCounts.reduce(0, +) > 0.5 * Self.sim.regions[region].components.filter { $0.key.hasPrefix("sum_") }.values.reduce(0, +)) diff --git a/Tests/SpectroEDXTests/SumEscapeFitTests.swift b/Tests/SpectroEDXTests/SumEscapeFitTests.swift index 3b116b2..e4081b9 100644 --- a/Tests/SpectroEDXTests/SumEscapeFitTests.swift +++ b/Tests/SpectroEDXTests/SumEscapeFitTests.swift @@ -148,11 +148,14 @@ struct SumEscapeFitTests { energyOffsetEV: 0, energyDispersionEV: 10) let tables = QuantificationTables.bundled() var input = PooledQuantificationInput(counts: y, axis: Self.axis, method: m, metadata: meta, regionName: "planted", pixelCount: 1) + input.sumEscape = SumEscapeModel() // both off: the fit without sum peaks, whatever the policy says let plain = try PooledQuantifier.run(input, tables: tables) #expect(!plain.footerLines.contains { $0.hasPrefix("sum peaks") }) + #expect(plain.appliedSumEscape == nil) input.sumEscape = .both let on = try PooledQuantifier.run(input, tables: tables) #expect(on.footerLines.contains { $0.hasPrefix("sum peaks") }) + #expect(on.appliedSumEscape == .both) let truth = Self.areas["Ag_La"]! let ag = try #require(on.rows.first { $0.element == "Ag" }), agPlain = try #require(plain.rows.first { $0.element == "Ag" }) #expect(abs(ag.net - truth) < 0.1 * abs(agPlain.net - truth)) diff --git a/Tests/SpectroKitParityTests/SpectroGoldenTests.swift b/Tests/SpectroKitParityTests/SpectroGoldenTests.swift index 3f0115c..b7cef4e 100644 --- a/Tests/SpectroKitParityTests/SpectroGoldenTests.swift +++ b/Tests/SpectroKitParityTests/SpectroGoldenTests.swift @@ -164,8 +164,9 @@ enum GoldenQ { } static func input(_ method: QuantificationMethod, image: LoadedSpectrumImage) -> PooledQuantificationInput { + // The fit without sum peaks (an explicit off model): the baseline records the exSpy-equivalent line model. PooledQuantificationInput(counts: image.sum(mask: nil), axis: image.energyAxis, method: method, metadata: image.metadata, - regionName: "Whole map", pixelCount: image.metadata.pixelCount) + regionName: "Whole map", pixelCount: image.metadata.pixelCount, sumEscape: SumEscapeModel()) } } @@ -224,7 +225,9 @@ enum SpectroGolden { static func pooledInput(counts: [UInt64], axis: EnergyAxis, method: QuantificationMethod, name: String) -> PooledQuantificationInput { let meta = SpectrumImageMetadata(fileName: name, filePath: "", scanWidth: 1, scanHeight: 1, channelCount: axis.size, energyOffsetEV: axis.offset * 1000, energyDispersionEV: axis.scale * 1000) - return PooledQuantificationInput(counts: counts, axis: axis, method: method, metadata: meta, regionName: "synthetic", pixelCount: 1) + // The fit without sum peaks (an explicit off model): the baseline records the exSpy-equivalent line model. + return PooledQuantificationInput(counts: counts, axis: axis, method: method, metadata: meta, regionName: "synthetic", pixelCount: 1, + sumEscape: SumEscapeModel()) } /// The fit, its CSV, the range-sensitivity statement, the proposer on the fit's own settings and the unlisted-line check. diff --git a/tools/edx-sim/demo_pools.py b/tools/edx-sim/demo_pools.py new file mode 100644 index 0000000..6819cfe --- /dev/null +++ b/tools/edx-sim/demo_pools.py @@ -0,0 +1,75 @@ +"""Pooled spectra of the public synthetic AlMgSi demo set, with their planted truth, for `DemoEDXPoolTests`. + +The demo set is mac4DSTEM's `demo-edx` (generator `tools/demo-edx/sim_edx.py` v2.0, seed 42, ladder seed 52). Its truth is the +simulation recipe, not a measurement. Read-only on the demo folder. + + python -I -B tools/edx-sim/demo_pools.py Tests/SpectroEDXTests/Fixtures/edx-demo-pools.json + +Needs numpy and h5py. Each pool: the Poisson counts summed over its pixels, the generator's noise-free expected spectrum of the +same pixels (`expected`, counts, 4 decimals), and the generator's planted component areas (`planted`, counts). +""" +import json +import sys + +import h5py +import numpy as np + +D = sys.argv[1].rstrip('/') + '/' +OUT = sys.argv[2] +T = json.load(open(D + 'truth_edx.json')) +TA = np.load(D + 'truth_edx_arrays.npz') +L = json.load(open(D + 'truth_edx_ladder.json')) +LA = np.load(D + 'truth_edx_ladder_arrays.npz') +comps = T['component_names'] +kc = T['forward_model']['line_model']['true_k']['counts_per_atom_nm2_per_family_(Gp*s*eps)'] +true_axis = dict(offset=-0.478, scale=0.005) +keys = ['Al_Ka', 'Mg_Ka', 'Si_Ka', 'Si_Ka_internal', 'O_Ka', 'Al_Ka_tail', 'Cu_Ka_stray', 'Cu_Ka'] + + +def metals(af): + m = {k: v for k, v in af.items() if k != 'O'} + s = sum(m.values()) + return {k: round(100 * v / s, 10) for k, v in m.items()} + + +def spectrum(x): + return [round(float(v), 4) for v in x] + + +pools = [] +recipes_af = {k: v['atom_fraction_incl_oxide'] for k, v in T['recipes'].items()} +recipes_af['beta_pure'] = {'Mg': 5 / 11, 'Si': 6 / 11} + +with h5py.File(D + 'AlMgSi_edx_ladder.hspy', 'r') as f: + lad = f['Experiments/__unnamed__/data'][()] # (16, 128, 4096) +for ri in (5, 6, 7): + r = L['regions'][ri] + c0, c1 = r['columns'] + block = lad[:, c0:c1 + 1, :].astype(np.int64) + c = r['components_expected_total_counts'] + pools.append(dict(name='L%d_%s' % (ri, r['recipe']), source='ladder', npix=int(block.shape[0] * block.shape[1]), + thickness_nm=r['thickness_nm'], truth_at=metals(recipes_af[r['recipe']]), axis_true=true_axis, + counts=block.sum(axis=(0, 1)).tolist(), expected=spectrum(LA['expected_spectrum_sum_by_region'][ri]), + planted={k: round(float(c.get(k, 0.0)), 4) for k in keys})) + +with h5py.File(D + 'AlMgSi_4D_EDX_EDS.hspy', 'r') as f: + m = f['Experiments/__unnamed__/data'][()].astype(np.int64) # (48, 64, 4096), the file axis carries a planted error +rm = np.array(T['recipe_map']) +order = T['recipe_names_in_map_order'] +thick = TA['thickness_nm'] +cexp = TA['component_expected_counts'] +for name, idx in (('M_A', [0]), ('M_matrix', [0, 1, 2, 3, 4, 5, 6])): + mask = np.isin(rm, idx) + w = TA['expected_total_counts_per_pixel'][mask] + pools.append(dict(name=name, source='map', npix=int(mask.sum()), + thickness_nm=round(float((thick[mask] * w).sum() / w.sum()), 6), truth_at=metals(recipes_af[order[idx[0]]]), + axis_true=true_axis, counts=m[mask].sum(axis=0).tolist(), + expected=spectrum(sum(TA['expected_spectrum_sum_by_recipe'][i] for i in idx)), + planted={k: round(float(cexp[comps.index(k)][mask].sum()), 4) for k in keys})) + +out = dict(generator='mac4DSTEM demo-edx, tools/demo-edx/sim_edx.py v2.0 (seed 42, ladder seed 52); truth is the simulation recipe', + true_k_counts_per_atom_nm2={k: kc[k + '_K'] for k in ('Al', 'Mg', 'Si')}, + atomic_mass={'Al': 26.9815, 'Mg': 24.305, 'Si': 28.0855}, pools=pools) +with open(OUT, 'w') as fh: + json.dump(out, fh, separators=(',', ':'), sort_keys=True) + fh.write('\n') From c367ad08aaa7f018fadc44298ebcaf1d4617923e Mon Sep 17 00:00:00 2001 From: Paullo9 Date: Sat, 31 Oct 2026 18:35:43 +0100 Subject: [PATCH 3/7] feat: auto ID explains candidates whose peak went to a detected sum peak The identification loop already gave the Al+Al sum peak (2.973 keV) its own column, but the element candidates that lost that peak to it (Ar K-alpha, Ag L-alpha, Pd L-alpha) stayed in the possible tier. Only proposed candidates got the sum-peak question. A candidate that clearly lost its peak to a sum column is now explained (ElementCandidate.explainedBySumPeak, ProposalResult.explainedBySumPeaks). Clearly means outside the ambiguity margin at the peak, no more total gain than the sum, and the sum column at or above its own L_D in the final fit. Explained candidates leave the possible list and the beside-K rule, and a note names them. A real line within the detector resolution of the sum cannot be told apart in one spectrum. It keeps its sum-peak conflict and the two-beam-current remedy. Red-first on the public AlMgSi demo pools (synthetic, planted truth from sim_edx.py v2.0): before, Ar, Ag and Pd were possible on L5, M_A and M_matrix. Now they are explained by Al+Al, and L7 (no Al) has no Al+Al explanation. Done: possible candidates get the sum-peak answer. Next: the golden baselines gain the new field (next commit). Co-Authored-By: Claude Opus 5.5 --- .../SpectroEDX/Proposer/ElementProposer.swift | 42 ++++++++-- .../SpectroEDX/Proposer/ProposalRules.swift | 3 +- .../SpectroEDXTests/DemoEDXAutoIDTests.swift | 80 +++++++++++++++++++ 3 files changed, 118 insertions(+), 7 deletions(-) create mode 100644 Tests/SpectroEDXTests/DemoEDXAutoIDTests.swift diff --git a/Sources/SpectroEDX/Proposer/ElementProposer.swift b/Sources/SpectroEDX/Proposer/ElementProposer.swift index 7cd72b0..10bf2e3 100644 --- a/Sources/SpectroEDX/Proposer/ElementProposer.swift +++ b/Sources/SpectroEDX/Proposer/ElementProposer.swift @@ -18,7 +18,8 @@ // less than 100. // Tiers: an element found from its own peak, unambiguous, needed by the final fit, Si above 0.2 % of the counts and its peak in a band // where the background is healthy (data over model 0.8 to 1.25 off the lines) is proposed; every other found or tested element is a -// candidate with `possibleReason` (or `familyNote` for the confirmation rule) and is never proposed. +// candidate with `possibleReason` (or `familyNote` for the confirmation rule) and is never proposed. A candidate whose peak went to a +// pile-up column that the final fit keeps at or above its L_D is explained (`explainedBySumPeak`), not possible. // // What went (0.11.0): the all-candidate joint fit with its L_C pruning and single-candidate forward step, and the flank-misfit factor that // scaled a candidate's sigma_0 by its neighbour's misfit (x33 for Mg beside Al on a measured Al-alloy map, where Mg's own window fitted to @@ -61,6 +62,12 @@ public nonisolated struct ElementCandidate: Equatable, Sendable { /// Found by an L or M line whose confirmation line (K for L, L for M) lies outside the fitted range or too close to the beam energy: the /// confirmation rule could not run, so the find is possible only (`possibleReason` says so). A consumer lists these as "uncorroborated". public let unconfirmable: Bool + /// The label of the modelled sum peak that took the residual peak this element was tested on ("Al+Al sum"), when that sum + /// column stays in the final fit at or above its own L_D: the peak is pile-up, explained, and the element is not a "possible" + /// find (Ar K-alpha and Ag L-alpha under Al+Al in an Al alloy). nil otherwise. One spectrum cannot separate a real line within the + /// detector resolution of the sum from the sum itself (a planted Ar K-alpha of half the sum's counts is still explained); such a + /// candidate keeps its sum-peak conflict and its two-beam-current remedy, so the question stays visible. + public let explainedBySumPeak: String? /// net >= L_D: the proposer's bar. public var aboveDetectionLimit: Bool { net >= detectionLimit } @@ -75,11 +82,12 @@ public nonisolated struct ElementCandidate: Equatable, Sendable { public init(element: String, group: String, energyKeV: Double, net: Double, sigma: Double, sigmaZero: Double, criticalLevel: Double, detectionLimit: Double, conflicts: [LineConflict], suggestedRole: QuantificationMethod.ElementRole, holeRegionNote: String?, misfit: Double, familyNote: String? = nil, - possibleReason: String? = nil, unconfirmable: Bool = false) { + possibleReason: String? = nil, unconfirmable: Bool = false, explainedBySumPeak: String? = nil) { self.element = element; self.group = group; self.energyKeV = energyKeV; self.net = net; self.sigma = sigma self.sigmaZero = sigmaZero; self.criticalLevel = criticalLevel; self.detectionLimit = detectionLimit self.conflicts = conflicts; self.suggestedRole = suggestedRole; self.holeRegionNote = holeRegionNote; self.misfit = misfit self.familyNote = familyNote; self.possibleReason = possibleReason; self.unconfirmable = unconfirmable + self.explainedBySumPeak = explainedBySumPeak } } @@ -111,7 +119,13 @@ public nonisolated struct ProposalResult: Sendable { public var proposed: [ElementCandidate] { candidates.filter { $0.isProposed && !$0.hasSumPeakQuestion } } /// At or above L_D but sitting on a pile-up energy of the detected parents: "sum peak or this element?", not a finding. public var sumPeakQuestions: [ElementCandidate] { candidates.filter { $0.isProposed && $0.hasSumPeakQuestion } } - public var possible: [ElementCandidate] { candidates.filter { $0.aboveCriticalLevel && !$0.isProposed && $0.familyNote == nil } } + /// Above L_C, not proposed, not withheld and not explained by a modelled sum peak. + public var possible: [ElementCandidate] { + candidates.filter { $0.aboveCriticalLevel && !$0.isProposed && $0.familyNote == nil && $0.explainedBySumPeak == nil } + } + /// Tested on a residual peak that a modelled, detected sum peak explains better (`explainedBySumPeak` names it): the answer to + /// "sum peak or this element?" is the sum peak. Shown as explained pile-up, never as a possible element. + public var explainedBySumPeaks: [ElementCandidate] { candidates.filter { $0.explainedBySumPeak != nil } } /// At or above L_D but withheld by the family-consistency rule (`familyNote` says why). public var withheld: [ElementCandidate] { candidates.filter { $0.familyNote != nil } } /// The uncorroborated tier: found by an L or M line whose confirmation line the fitted range or the beam cannot hold (`unconfirmable`), @@ -304,6 +318,8 @@ public nonisolated struct ElementProposer: Sendable { /// An L or M nomination whose confirmation line lies outside the fitted range or above half the beam: it may join, but stays possible. var unconfirmable: String? var pass: Pass? + /// The sum column (its id, "sum:Al+Al") that took the peak this trial was last tested on; nil when an element took it. + var lostToSum: String? = nil } /// An element the loop added to the model. @@ -556,6 +572,10 @@ public nonisolated struct ElementProposer: Sendable { for e in eligible where e.key != best.key && !e.key.hasPrefix("sum:") { trials[e.key]?.reason = String(format: "The peak at %.3f keV went to %@, which explains it better (gain there %.0f against %.0f).", ep, best.key.hasPrefix("sum:") ? (sumInfo[best.key]?.label ?? best.key) : best.key, best.peakGain, e.peakGain) + // Explained only by a clear loss: outside the ambiguity margin at the peak, and no more total gain than the sum + // (a real line under the sum, Ar K-alpha 16 eV from Al+Al, gains more through its other lines). A tie stays possible. + let clear = best.peakGain - e.peakGain >= t.ambiguityGain && e.gain <= best.gain + trials[e.key]?.lostToSum = best.key.hasPrefix("sum:") && clear ? best.key : nil } model = p.model.groups fit = p @@ -621,9 +641,14 @@ public nonisolated struct ElementProposer: Sendable { c.kind != .sumPeak || (c.requires.compactMap { parentNets[$0] }.min() ?? 0) * sumPeakFraction >= net } } + // The sum columns of the final fit at or above their own L_D: a peak one of them took is explained pile-up. + var detectedSums: [String: String] = [:] + for (gi, g) in report.model.groups.enumerated() where g.element == "sum" { + if let st = stat(report, gi), st.net >= st.ld { detectedSums[g.id] = sumInfo[g.id]?.label ?? g.id } + } var candidates: [ElementCandidate] = [] func append(_ el: String, group: String, stat st: Stat, familyNote: String? = nil, possibleReason: String? = nil, - unconfirmable: Bool = false) throws { + unconfirmable: Bool = false, explainedBySumPeak: String? = nil) throws { let alpha = XRayLines.line(group)?.energy ?? 0 var note: String? if context.gridElements.contains(el) { @@ -643,7 +668,7 @@ public nonisolated struct ElementProposer: Sendable { element: el, group: group, energyKeV: alpha, net: st.net, sigma: st.sigma, sigmaZero: st.sigmaZero, criticalLevel: st.lc, detectionLimit: st.ld, conflicts: conflicts(el, group, alpha, st.net), suggestedRole: context.quantifyByDefault.contains(el) ? .quantify : .fitOnly, holeRegionNote: note, misfit: 1, - familyNote: familyNote, possibleReason: possibleReason, unconfirmable: unconfirmable)) + familyNote: familyNote, possibleReason: possibleReason, unconfirmable: unconfirmable, explainedBySumPeak: explainedBySumPeak)) } /// The numbers of a group whose limit cannot be stated: its area, no limit (never proposed). func unstated(_ p: Pass, _ gi: Int) -> Stat { Stat(net: p.result.values[gi], sigma: 0, sigmaZero: 0, lc: .infinity, ld: .infinity) } @@ -677,7 +702,8 @@ public nonisolated struct ElementProposer: Sendable { let st = tr.stat ?? tr.pass.flatMap { p in p.model.groups.firstIndex { $0.id == tr.group }.map { unstated(p, $0) } } ?? Stat(net: 0, sigma: 0, sigmaZero: 0, lc: .infinity, ld: .infinity) if let c = tr.confirmation { try append(el, group: tr.group, stat: st, familyNote: c) } - else { try append(el, group: tr.group, stat: st, possibleReason: tr.reason ?? "Tested but not added.") } + else { try append(el, group: tr.group, stat: st, possibleReason: tr.reason ?? "Tested but not added.", + explainedBySumPeak: tr.lostToSum.flatMap { detectedSums[$0] }) } } candidates.sort { $0.significance > $1.significance } @@ -703,6 +729,10 @@ public nonisolated struct ElementProposer: Sendable { } notes += candidates.compactMap { c in c.familyNote.map { "Confirmation withheld \(c.element): \($0)" } } } + for label in Set(candidates.compactMap(\.explainedBySumPeak)).sorted() { + let els = candidates.filter { $0.explainedBySumPeak == label }.map(\.element) + notes.append("Explained as pile-up (validation: none): \(els.joined(separator: ", ")) lost the peak they were tested on to the \(label) column, which the final fit keeps at or above its detection limit; they are not possible elements.") + } for b in unhealthy { notes.append(String(format: "Background check: data over model %.2f off the lines in %.1f to %.1f keV (0.80 to 1.25 is healthy); a find there is only possible.", b.ratio, b.lo, b.hi)) } let pChance = 0.5 * erfc((currie.zAlpha + currie.zBeta) / 2.0.squareRoot()) notes.append(String(format: "Look-elsewhere: %d candidates were tested, so about %.2f chance passes of the area bar alone are expected; the gain and confirmation bars stand beside it.", tested, Double(tested) * pChance)) diff --git a/Sources/SpectroEDX/Proposer/ProposalRules.swift b/Sources/SpectroEDX/Proposer/ProposalRules.swift index 5bcef4d..554a055 100644 --- a/Sources/SpectroEDX/Proposer/ProposalRules.swift +++ b/Sources/SpectroEDX/Proposer/ProposalRules.swift @@ -84,7 +84,8 @@ public nonisolated struct ProposalRules: Equatable, Sendable { /// Pure: the same result and rules always give the same picks. `resolutionMnKaEV` sets the FWHM that R1's distance is counted in /// (the room's detector width; the harness uses the app's default, 130 eV). public func apply(_ r: ProposalResult, resolutionMnKaEV: Double = 130) -> RuledProposal { - let proposedAll = r.candidates.filter(\.aboveDetectionLimit) // held and withheld candidates included: a K peak is a K peak + // Held and withheld candidates included: a K peak is a K peak. Not one explained by a sum peak: that peak is pile-up. + let proposedAll = r.candidates.filter { $0.aboveDetectionLimit && $0.explainedBySumPeak == nil } func z(_ element: String) -> Int { XRayLines.lines(of: element).first?.atomicNumber ?? 0 } func family(_ group: String) -> XRayFamily { XRayLines.line(group)?.family ?? .K } func name(_ group: String) -> String { UnlistedLineChecker.displayName(group) } diff --git a/Tests/SpectroEDXTests/DemoEDXAutoIDTests.swift b/Tests/SpectroEDXTests/DemoEDXAutoIDTests.swift new file mode 100644 index 0000000..80c1566 --- /dev/null +++ b/Tests/SpectroEDXTests/DemoEDXAutoIDTests.swift @@ -0,0 +1,80 @@ +import Foundation +import Testing +import SpectroTestSupport +import SpectroCore +import SpectroEDX + +/// Auto ID (`ElementProposer.proposeOnRefinedAxis`, nothing listed) on the Poisson counts of the public AlMgSi demo pools +/// (mac4DSTEM `demo-edx`, `sim_edx.py` v2.0, `edx-demo-pools.json`). The truth is PLANTED ON SYNTHETIC DATA, not a measurement: +/// Al, Mg, Si, O, stray Cu K and sum peaks; no Ar, Ag or Pd. Every result stays `validation: "none"`. +/// +/// Red before: Ar K-alpha (2.957 keV, 15-27 L_D), Ag L-alpha (2.984 keV, 6-11 L_D) and Pd L-alpha (2.838 keV) were listed as +/// "possible" on every Al-rich pool, though the loop had already given their peak (2.97 keV) to the Al+Al sum column. Now they are +/// explained by that sum peak and are not possible. +struct DemoEDXAutoIDTests { + static func autoID(_ name: String) throws -> ProposalResult { + let c = DemoEDXPoolTests.named(name) + let input = DemoEDXPoolTests.input(c, noiseFree: false) + return try ElementProposer().proposeOnRefinedAxis(spectrum: input.counts, axis: c.axis, beamEnergy: 200, listed: [], + metadata: input.metadata, regionName: name, tables: DemoEDXPoolTests.tables).result + } + + @Test(arguments: ["L5", "M_A", "M_matrix"]) + func theAlAlSumExplainsArAndAg(_ name: String) throws { + let p = try Self.autoID(name) + let possible = Set(p.possible.map(\.element)), explained = Set(p.explainedBySumPeaks.map(\.element)) + DemoEDXPoolTests.say("\(name) auto ID: proposed \(p.proposed.map(\.element)), possible \(possible.sorted()), explained \(explained.sorted())") + #expect(p.proposed.contains { $0.element == "Al" }, "\(name)") + #expect(p.sumPeaks.contains { $0.label == "Al+Al sum" && $0.detected }, "\(name): \(p.sumPeaks)") + for el in ["Ar", "Ag"] { + #expect(!possible.contains(el), "\(name): \(el) is still possible") + #expect(!p.proposed.contains { $0.element == el } && !p.sumPeakQuestions.contains { $0.element == el }) + let c = try #require(p.candidates.first { $0.element == el }, "\(name): \(el) was not tested") + #expect(c.explainedBySumPeak == "Al+Al sum", "\(name): \(el) \(c.explainedBySumPeak ?? "nil")") + #expect(c.hasSumPeakQuestion, "\(name): \(el) has no Al+Al conflict") + } + #expect(p.notes.contains { $0.hasPrefix("Explained as pile-up") && $0.contains("Ar") && $0.contains("Al+Al sum") }, "\(name): \(p.notes)") + // Explained is its own tier: never possible, proposed or withheld. + for c in p.explainedBySumPeaks { + #expect(!c.isProposed && c.familyNote == nil && !p.possible.contains(c)) + } + } + + /// The other side: a real Ar line planted under the Al+Al sum of L5 (Ar K-alpha 2.957 keV, 16 eV from the sum, and its K-beta + /// at 3.190 keV, 10 %). One spectrum cannot separate the two: with 1000 Ar counts (about half the sum) the sum column still + /// explains the peak (gain there 105800 against 105591), so Ar is explained, but it keeps the sum-peak question and its + /// two-current remedy; it is never dropped. With 4000 Ar counts it is a sum-peak question of the proposed tier. + @Test(arguments: [1000.0, 4000.0]) + func aRealArLineKeepsTheSumPeakQuestion(_ arCounts: Double) throws { + let c = DemoEDXPoolTests.named("L5") + let input = DemoEDXPoolTests.input(c, noiseFree: false) + var counts = input.counts.map { Double($0) } + for (e, area) in [(2.9577, arCounts), (3.1905, 0.1 * arCounts)] { + let fwhm = (130.0 * 130 + 2.5 * (e * 1000 - 5898.7)).squareRoot() / 1000, s = fwhm / 2.354820045 + for i in counts.indices { + let x = c.axis.energy(ofChannel: i) + counts[i] += area * c.axis.scale / (s * (2 * Double.pi).squareRoot()) * exp(-0.5 * pow((x - e) / s, 2)) + } + } + let r = try ElementProposer().proposeOnRefinedAxis(spectrum: counts.map { UInt64($0.rounded()) }, axis: c.axis, beamEnergy: 200, listed: [], + metadata: input.metadata, regionName: "L5+Ar", tables: DemoEDXPoolTests.tables).result + let ar = try #require(r.candidates.first { $0.element == "Ar" }) + DemoEDXPoolTests.say(String(format: "L5 + %.0f Ar: Ar %.1f L_D, proposed %d, question %d, possible %d, explained %@ | %@", arCounts, ar.significance, + r.proposed.contains(ar) ? 1 : 0, r.sumPeakQuestions.contains(ar) ? 1 : 0, r.possible.contains(ar) ? 1 : 0, + ar.explainedBySumPeak ?? "-", ar.possibleReason ?? "-")) + #expect(ar.hasSumPeakQuestion, "\(arCounts) Ar counts: no sum-peak question") + #expect(ar.conflicts.contains { $0.kind == .sumPeak && $0.remedy.contains("different beam currents") }) + if arCounts >= 4000 { + #expect(ar.explainedBySumPeak == nil && r.sumPeakQuestions.contains(ar), "\(arCounts) Ar counts: \(ar.possibleReason ?? "-")") + } else { + #expect(r.explainedBySumPeaks.contains(ar) || r.sumPeakQuestions.contains(ar) || r.possible.contains(ar)) + } + } + + /// Pure Mg5Si6 (L7): no Al, so no Al+Al column and nothing is explained by it. + @Test func noAlNoAlAlExplanation() throws { + let p = try Self.autoID("L7") + #expect(!p.sumPeaks.contains { $0.label == "Al+Al sum" }) + #expect(!p.explainedBySumPeaks.contains { $0.explainedBySumPeak == "Al+Al sum" }) + } +} From ac42aa313436e594227ad393e0b70fdaccd0036a Mon Sep 17 00:00:00 2001 From: Paullo9 Date: Sat, 31 Oct 2026 18:35:48 +0100 Subject: [PATCH 4/7] test: golden baselines record the new explainedBySumPeak field Reason: ElementCandidate gained explainedBySumPeak, so every dumped candidate gains one line. Only lines are added: no number in eds-realistic-l-sim, eds-unlisted-sim or eds-proposer-sim changed. In eds-proposer-sim (beta'' region, planted sum peaks) nine unplanted candidates are now explained by the Al+Mg, Al+Si and Si+Si sums. Three notes lines name them. Done: baselines match. Next: PR. Co-Authored-By: Claude Opus 5.5 --- .../spectro-golden/eds-proposer-sim.txt | 24 +++++++- .../spectro-golden/eds-realistic-l-sim.txt | 35 +++++++++++ .../spectro-golden/eds-unlisted-sim.txt | 60 +++++++++++++++++++ 3 files changed, 116 insertions(+), 3 deletions(-) diff --git a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-proposer-sim.txt b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-proposer-sim.txt index 5f852d3..8caf34a 100644 --- a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-proposer-sim.txt +++ b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-proposer-sim.txt @@ -26,6 +26,7 @@ region2(beta'' 300 counts/px).proposal.candidates[0].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[0].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[0].possibleReason = "The peak at 3.227 keV went to Al+Si sum, which explains it better (gain there 203739 against 177970)." region2(beta'' 300 counts/px).proposal.candidates[0].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[0].explainedBySumPeak = "Al+Si sum" region2(beta'' 300 counts/px).proposal.candidates[1].element = "Rh" region2(beta'' 300 counts/px).proposal.candidates[1].group = "Rh_La" region2(beta'' 300 counts/px).proposal.candidates[1].energyKeV = 4005930be0ded289 2.6968000000000001 @@ -53,6 +54,7 @@ region2(beta'' 300 counts/px).proposal.candidates[1].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[1].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[1].possibleReason = "The peak at 2.742 keV went to Al+Mg sum, which explains it better (gain there 31777 against 28049)." region2(beta'' 300 counts/px).proposal.candidates[1].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[1].explainedBySumPeak = "Al+Mg sum" region2(beta'' 300 counts/px).proposal.candidates[2].element = "Ar" region2(beta'' 300 counts/px).proposal.candidates[2].group = "Ar_Ka" region2(beta'' 300 counts/px).proposal.candidates[2].energyKeV = 4007a95e9e1b089a 2.9577 @@ -79,6 +81,7 @@ region2(beta'' 300 counts/px).proposal.candidates[2].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[2].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[2].possibleReason = "The peak at 3.227 keV went to Al+Si sum, which explains it better (gain there 203739 against 136297)." region2(beta'' 300 counts/px).proposal.candidates[2].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[2].explainedBySumPeak = "Al+Si sum" region2(beta'' 300 counts/px).proposal.candidates[3].element = "In" region2(beta'' 300 counts/px).proposal.candidates[3].group = "In_La" region2(beta'' 300 counts/px).proposal.candidates[3].energyKeV = 400a4bc6a7ef9db2 3.2869999999999999 @@ -94,6 +97,7 @@ region2(beta'' 300 counts/px).proposal.candidates[3].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[3].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[3].possibleReason = "The peak at 3.487 keV went to Si+Si sum, which explains it better (gain there 23464 against 17540)." region2(beta'' 300 counts/px).proposal.candidates[3].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[3].explainedBySumPeak = "Si+Si sum" region2(beta'' 300 counts/px).proposal.candidates[4].element = "Sn" region2(beta'' 300 counts/px).proposal.candidates[4].group = "Sn_La" region2(beta'' 300 counts/px).proposal.candidates[4].energyKeV = 400b8d4fdf3b645a 3.444 @@ -120,6 +124,7 @@ region2(beta'' 300 counts/px).proposal.candidates[4].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[4].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[4].possibleReason = "The peak at 3.487 keV went to Si+Si sum, which explains it better (gain there 23464 against 14997)." region2(beta'' 300 counts/px).proposal.candidates[4].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[4].explainedBySumPeak = "Si+Si sum" region2(beta'' 300 counts/px).proposal.candidates[5].element = "Pd" region2(beta'' 300 counts/px).proposal.candidates[5].group = "Pd_La" region2(beta'' 300 counts/px).proposal.candidates[5].energyKeV = 4006b573eab367a1 2.8386 @@ -135,6 +140,7 @@ region2(beta'' 300 counts/px).proposal.candidates[5].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[5].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[5].possibleReason = "The peak at 2.742 keV went to Al+Mg sum, which explains it better (gain there 31777 against 4730)." region2(beta'' 300 counts/px).proposal.candidates[5].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[5].explainedBySumPeak = "Al+Mg sum" region2(beta'' 300 counts/px).proposal.candidates[6].element = "Ru" region2(beta'' 300 counts/px).proposal.candidates[6].group = "Ru_La" region2(beta'' 300 counts/px).proposal.candidates[6].energyKeV = 400477ced916872b 2.5585 @@ -161,6 +167,7 @@ region2(beta'' 300 counts/px).proposal.candidates[6].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[6].familyNote = "Ru Kα (19.28 keV) has a residual peak of 0.0 σ, below the 3 σ its Lα (2.56 keV) needs: not Ru." region2(beta'' 300 counts/px).proposal.candidates[6].possibleReason = nil region2(beta'' 300 counts/px).proposal.candidates[6].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[6].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.candidates[7].element = "Cd" region2(beta'' 300 counts/px).proposal.candidates[7].group = "Cd_La" region2(beta'' 300 counts/px).proposal.candidates[7].energyKeV = 40091205bc01a36e 3.1337999999999999 @@ -176,6 +183,7 @@ region2(beta'' 300 counts/px).proposal.candidates[7].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[7].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[7].possibleReason = "The peak at 3.487 keV went to Si+Si sum, which explains it better (gain there 23464 against 4284)." region2(beta'' 300 counts/px).proposal.candidates[7].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[7].explainedBySumPeak = "Si+Si sum" region2(beta'' 300 counts/px).proposal.candidates[8].element = "Bi" region2(beta'' 300 counts/px).proposal.candidates[8].group = "Bi_Ma" region2(beta'' 300 counts/px).proposal.candidates[8].energyKeV = 400360aa64c2f838 2.4222000000000001 @@ -191,6 +199,7 @@ region2(beta'' 300 counts/px).proposal.candidates[8].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[8].familyNote = "Bi Lα (10.84 keV) has a residual peak of 2.4 σ, below the 3 σ its Mβ (2.53 keV) needs: not Bi." region2(beta'' 300 counts/px).proposal.candidates[8].possibleReason = nil region2(beta'' 300 counts/px).proposal.candidates[8].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[8].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.candidates[9].element = "Cl" region2(beta'' 300 counts/px).proposal.candidates[9].group = "Cl_Ka" region2(beta'' 300 counts/px).proposal.candidates[9].energyKeV = 4004faacd9e83e42 2.6223999999999998 @@ -206,6 +215,7 @@ region2(beta'' 300 counts/px).proposal.candidates[9].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[9].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[9].possibleReason = "The peak at 2.742 keV went to Al+Mg sum, which explains it better (gain there 31777 against 1174)." region2(beta'' 300 counts/px).proposal.candidates[9].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[9].explainedBySumPeak = "Al+Mg sum" region2(beta'' 300 counts/px).proposal.candidates[10].element = "K" region2(beta'' 300 counts/px).proposal.candidates[10].group = "K_Ka" region2(beta'' 300 counts/px).proposal.candidates[10].energyKeV = 400a82a9930be0df 3.3138000000000001 @@ -221,6 +231,7 @@ region2(beta'' 300 counts/px).proposal.candidates[10].misfit = 3ff0000000000000 region2(beta'' 300 counts/px).proposal.candidates[10].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[10].possibleReason = "The peak at 3.487 keV went to Si+Si sum, which explains it better (gain there 23464 against 208)." region2(beta'' 300 counts/px).proposal.candidates[10].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[10].explainedBySumPeak = "Si+Si sum" region2(beta'' 300 counts/px).proposal.candidates[11].element = "Pb" region2(beta'' 300 counts/px).proposal.candidates[11].group = "Pb_Ma" region2(beta'' 300 counts/px).proposal.candidates[11].energyKeV = 4002c467381d7dbf 2.3458999999999999 @@ -236,6 +247,7 @@ region2(beta'' 300 counts/px).proposal.candidates[11].misfit = 3ff0000000000000 region2(beta'' 300 counts/px).proposal.candidates[11].familyNote = "Pb Lα (10.55 keV) has a residual peak of 2.4 σ, below the 3 σ its Mβ (2.44 keV) needs: not Pb." region2(beta'' 300 counts/px).proposal.candidates[11].possibleReason = nil region2(beta'' 300 counts/px).proposal.candidates[11].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[11].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.candidates[12].element = "Sb" region2(beta'' 300 counts/px).proposal.candidates[12].group = "Sb_La" region2(beta'' 300 counts/px).proposal.candidates[12].energyKeV = 400cd66cf41f212d 3.6046999999999998 @@ -251,6 +263,7 @@ region2(beta'' 300 counts/px).proposal.candidates[12].misfit = 3ff0000000000000 region2(beta'' 300 counts/px).proposal.candidates[12].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[12].possibleReason = "Adding it improves the fit by 6, below the 100 a new line needs." region2(beta'' 300 counts/px).proposal.candidates[12].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[12].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.candidates[13].element = "Mo" region2(beta'' 300 counts/px).proposal.candidates[13].group = "Mo_La" region2(beta'' 300 counts/px).proposal.candidates[13].energyKeV = 400258793dd97f63 2.2932000000000001 @@ -278,6 +291,7 @@ region2(beta'' 300 counts/px).proposal.candidates[13].misfit = 3ff0000000000000 region2(beta'' 300 counts/px).proposal.candidates[13].familyNote = "Mo Kα (17.48 keV) has a residual peak of 1.4 σ, below the 3 σ its Lβ1 (2.39 keV) needs: not Mo." region2(beta'' 300 counts/px).proposal.candidates[13].possibleReason = nil region2(beta'' 300 counts/px).proposal.candidates[13].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[13].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.candidates[14].element = "Tl" region2(beta'' 300 counts/px).proposal.candidates[14].group = "Tl_Ma" region2(beta'' 300 counts/px).proposal.candidates[14].energyKeV = 40022a9930be0ded 2.2707999999999999 @@ -305,6 +319,7 @@ region2(beta'' 300 counts/px).proposal.candidates[14].misfit = 3ff0000000000000 region2(beta'' 300 counts/px).proposal.candidates[14].familyNote = "Tl Lα (10.27 keV) has a residual peak of 0.0 σ, below the 3 σ its Mγ (2.57 keV) needs: not Tl." region2(beta'' 300 counts/px).proposal.candidates[14].possibleReason = nil region2(beta'' 300 counts/px).proposal.candidates[14].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[14].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.sumPeaks: array 5 region2(beta'' 300 counts/px).proposal.sumPeaks[0].label = "Al+Al sum" region2(beta'' 300 counts/px).proposal.sumPeaks[0].elements: array 2 @@ -363,7 +378,7 @@ region2(beta'' 300 counts/px).proposal.refused[6].element = "N" region2(beta'' 300 counts/px).proposal.refused[6].reason = "Its line at 0.39 keV lies below the proposer's lowest tested line (0.45 keV): under the detector window the continuum is too model-dependent for a net area to be trusted. List it by hand if you know it is there." region2(beta'' 300 counts/px).proposal.currie.alpha = 3fa999999999999a 0.050000000000000003 region2(beta'' 300 counts/px).proposal.currie.beta = 3fa999999999999a 0.050000000000000003 -region2(beta'' 300 counts/px).proposal.notes: array 11 +region2(beta'' 300 counts/px).proposal.notes: array 14 region2(beta'' 300 counts/px).proposal.notes[0] = "Lines below 0.45 keV are not tested (a measured limit of the continuum model, not a property of the method)." region2(beta'' 300 counts/px).proposal.notes[1] = "Identification (validation: none): the residual's peaks at or above 5 σ of its top-hat filter (1.5 × below 1 keV); a candidate joins when Σ(y − μ)²/(μ + (0.01 μ)²) falls by at least 100, 20 % of that at its own lines, with its area at or above Currie L_D (α = β = 0.05, σ₀ from the fit's own variance with it absent) and no line against it; the final fit drops what it does not need (100). Kβ weights from NIST EPQ in this fit." region2(beta'' 300 counts/px).proposal.notes[2] = "Fit: least squares, weighted by 1/(y + (0.01 y)²) to decide, least squares, unweighted for the numbers shown; continuum: Kramers×Bernstein(9,5), split at 1.5596 keV; orders chosen on synthetic data; escape peaks: none (no line above the Si K edge, 1.839 keV); reference shapes: none; 5 residual peaks examined, 31 candidate fits, 33 fits in all." @@ -373,8 +388,11 @@ region2(beta'' 300 counts/px).proposal.notes[5] = "Confirmation withheld Bi: Bi region2(beta'' 300 counts/px).proposal.notes[6] = "Confirmation withheld Pb: Pb Lα (10.55 keV) has a residual peak of 2.4 σ, below the 3 σ its Mβ (2.44 keV) needs: not Pb." region2(beta'' 300 counts/px).proposal.notes[7] = "Confirmation withheld Mo: Mo Kα (17.48 keV) has a residual peak of 1.4 σ, below the 3 σ its Lβ1 (2.39 keV) needs: not Mo." region2(beta'' 300 counts/px).proposal.notes[8] = "Confirmation withheld Tl: Tl Lα (10.27 keV) has a residual peak of 0.0 σ, below the 3 σ its Mγ (2.57 keV) needs: not Tl." -region2(beta'' 300 counts/px).proposal.notes[9] = "Look-elsewhere: 31 candidates were tested, so about 0.02 chance passes of the area bar alone are expected; the gain and confirmation bars stand beside it." -region2(beta'' 300 counts/px).proposal.notes[10] = "a weak line next to Al Kα reads low by ≈ 300 counts per pooled spectrum on synthetic data (cause: the Al Kα incomplete-charge tail, unmodelled until a tail is measured on an Al matrix, `TailEstimate`); unmeasured on real data. Weak-line bias measured on synthetic data: Δ = −295 ± 31 counts at 900 planted Mg Kα (generator A, no tail: continuum–line projection) and −310 ± 23 at 882 (generator S); −402 ± 33 at 3000 (A) and −310 ± 23 at 2899 (S)" +region2(beta'' 300 counts/px).proposal.notes[9] = "Explained as pile-up (validation: none): Rh, Pd, Cl lost the peak they were tested on to the Al+Mg sum column, which the final fit keeps at or above its detection limit; they are not possible elements." +region2(beta'' 300 counts/px).proposal.notes[10] = "Explained as pile-up (validation: none): Ag, Ar lost the peak they were tested on to the Al+Si sum column, which the final fit keeps at or above its detection limit; they are not possible elements." +region2(beta'' 300 counts/px).proposal.notes[11] = "Explained as pile-up (validation: none): In, Sn, Cd, K lost the peak they were tested on to the Si+Si sum column, which the final fit keeps at or above its detection limit; they are not possible elements." +region2(beta'' 300 counts/px).proposal.notes[12] = "Look-elsewhere: 31 candidates were tested, so about 0.02 chance passes of the area bar alone are expected; the gain and confirmation bars stand beside it." +region2(beta'' 300 counts/px).proposal.notes[13] = "a weak line next to Al Kα reads low by ≈ 300 counts per pooled spectrum on synthetic data (cause: the Al Kα incomplete-charge tail, unmodelled until a tail is measured on an Al matrix, `TailEstimate`); unmeasured on real data. Weak-line bias measured on synthetic data: Δ = −295 ± 31 counts at 900 planted Mg Kα (generator A, no tail: continuum–line projection) and −310 ± 23 at 882 (generator S); −402 ± 33 at 3000 (A) and −310 ± 23 at 2899 (S)" region2(beta'' 300 counts/px).proposal.passes = 33 region2(beta'' 300 counts/px).proposal.settled = true region2(beta'' 300 counts/px).proposal.reducedChiSquared = 3ff0dc3303be3c81 1.0537595888343108 diff --git a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-realistic-l-sim.txt b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-realistic-l-sim.txt index 98d6349..b1a542b 100644 --- a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-realistic-l-sim.txt +++ b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-realistic-l-sim.txt @@ -1038,6 +1038,7 @@ seed0.four.unlistedProposal.candidates[0].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[0].familyNote = nil seed0.four.unlistedProposal.candidates[0].possibleReason = nil seed0.four.unlistedProposal.candidates[0].unconfirmable = false +seed0.four.unlistedProposal.candidates[0].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[1].element = "Ga" seed0.four.unlistedProposal.candidates[1].group = "Ga_La" seed0.four.unlistedProposal.candidates[1].energyKeV = 3ff1916872b020c5 1.0980000000000001 @@ -1063,6 +1064,7 @@ seed0.four.unlistedProposal.candidates[1].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[1].familyNote = nil seed0.four.unlistedProposal.candidates[1].possibleReason = nil seed0.four.unlistedProposal.candidates[1].unconfirmable = false +seed0.four.unlistedProposal.candidates[1].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[2].element = "Cu" seed0.four.unlistedProposal.candidates[2].group = "Cu_Ka" seed0.four.unlistedProposal.candidates[2].energyKeV = 402018793dd97f63 8.0478000000000005 @@ -1099,6 +1101,7 @@ seed0.four.unlistedProposal.candidates[2].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[2].familyNote = nil seed0.four.unlistedProposal.candidates[2].possibleReason = nil seed0.four.unlistedProposal.candidates[2].unconfirmable = false +seed0.four.unlistedProposal.candidates[2].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[3].element = "Pr" seed0.four.unlistedProposal.candidates[3].group = "Pr_Ma" seed0.four.unlistedProposal.candidates[3].energyKeV = 3fec985f06f69446 0.89359999999999995 @@ -1114,6 +1117,7 @@ seed0.four.unlistedProposal.candidates[3].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[3].familyNote = "Pr Lα (5.03 keV) has a residual peak of 1.7 σ, below the 3 σ its Mγ (1.13 keV) needs: not Pr." seed0.four.unlistedProposal.candidates[3].possibleReason = nil seed0.four.unlistedProposal.candidates[3].unconfirmable = false +seed0.four.unlistedProposal.candidates[3].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[4].element = "Eu" seed0.four.unlistedProposal.candidates[4].group = "Eu_Ma" seed0.four.unlistedProposal.candidates[4].energyKeV = 3ff195e9e1b089a0 1.0991 @@ -1140,6 +1144,7 @@ seed0.four.unlistedProposal.candidates[4].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[4].familyNote = "Eu Lα (5.85 keV) has a residual peak of 0.5 σ, below the 3 σ its Mα (1.10 keV) needs: not Eu." seed0.four.unlistedProposal.candidates[4].possibleReason = nil seed0.four.unlistedProposal.candidates[4].unconfirmable = false +seed0.four.unlistedProposal.candidates[4].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[5].element = "Sm" seed0.four.unlistedProposal.candidates[5].group = "Sm_Ma" seed0.four.unlistedProposal.candidates[5].energyKeV = 3ff0af4f0d844d01 1.0427999999999999 @@ -1166,6 +1171,7 @@ seed0.four.unlistedProposal.candidates[5].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[5].familyNote = "Sm Lα (5.64 keV) has a residual peak of 1.0 σ, below the 3 σ its Mβ (1.10 keV) needs: not Sm." seed0.four.unlistedProposal.candidates[5].possibleReason = nil seed0.four.unlistedProposal.candidates[5].unconfirmable = false +seed0.four.unlistedProposal.candidates[5].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[6].element = "Rb" seed0.four.unlistedProposal.candidates[6].group = "Rb_La" seed0.four.unlistedProposal.candidates[6].energyKeV = 3ffb1b089a027525 1.6940999999999999 @@ -1193,6 +1199,7 @@ seed0.four.unlistedProposal.candidates[6].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[6].familyNote = nil seed0.four.unlistedProposal.candidates[6].possibleReason = "The peak at 1.748 keV went to Ta, which explains it better (gain there 111 against 77)." seed0.four.unlistedProposal.candidates[6].unconfirmable = false +seed0.four.unlistedProposal.candidates[6].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[7].element = "Nd" seed0.four.unlistedProposal.candidates[7].group = "Nd_Ma" seed0.four.unlistedProposal.candidates[7].energyKeV = 3fee161e4f765fd9 0.94020000000000004 @@ -1208,6 +1215,7 @@ seed0.four.unlistedProposal.candidates[7].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[7].familyNote = "Nd Lα (5.23 keV) has a residual peak of 0.6 σ, below the 3 σ its Mβ (1.00 keV) needs: not Nd." seed0.four.unlistedProposal.candidates[7].possibleReason = nil seed0.four.unlistedProposal.candidates[7].unconfirmable = false +seed0.four.unlistedProposal.candidates[7].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[8].element = "Ce" seed0.four.unlistedProposal.candidates[8].group = "Ce_Ma" seed0.four.unlistedProposal.candidates[8].energyKeV = 3feb0e5604189375 0.84550000000000003 @@ -1223,6 +1231,7 @@ seed0.four.unlistedProposal.candidates[8].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[8].familyNote = "Ce Lα (4.84 keV) has a residual peak of 0.0 σ, below the 3 σ its Mγ (1.08 keV) needs: not Ce." seed0.four.unlistedProposal.candidates[8].possibleReason = nil seed0.four.unlistedProposal.candidates[8].unconfirmable = false +seed0.four.unlistedProposal.candidates[8].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[9].element = "Hf" seed0.four.unlistedProposal.candidates[9].group = "Hf_Ma" seed0.four.unlistedProposal.candidates[9].energyKeV = 3ffa504816f0068e 1.6446000000000001 @@ -1250,6 +1259,7 @@ seed0.four.unlistedProposal.candidates[9].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[9].familyNote = "Hf Lα (7.90 keV) has a residual peak of 0.0 σ, below the 3 σ its Mβ (1.70 keV) needs: not Hf." seed0.four.unlistedProposal.candidates[9].possibleReason = nil seed0.four.unlistedProposal.candidates[9].unconfirmable = false +seed0.four.unlistedProposal.candidates[9].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[10].element = "Ta" seed0.four.unlistedProposal.candidates[10].group = "Ta_Ma" seed0.four.unlistedProposal.candidates[10].energyKeV = 3ffb5c91d14e3bcd 1.7101 @@ -1277,6 +1287,7 @@ seed0.four.unlistedProposal.candidates[10].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[10].familyNote = nil seed0.four.unlistedProposal.candidates[10].possibleReason = nil seed0.four.unlistedProposal.candidates[10].unconfirmable = false +seed0.four.unlistedProposal.candidates[10].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[11].element = "Zr" seed0.four.unlistedProposal.candidates[11].group = "Zr_La" seed0.four.unlistedProposal.candidates[11].energyKeV = 400056a161e4f766 2.0423 @@ -1304,6 +1315,7 @@ seed0.four.unlistedProposal.candidates[11].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[11].familyNote = "Zr Kα (15.78 keV) has a residual peak of 1.3 σ, below the 3 σ its Lα (2.04 keV) needs: not Zr." seed0.four.unlistedProposal.candidates[11].possibleReason = nil seed0.four.unlistedProposal.candidates[11].unconfirmable = false +seed0.four.unlistedProposal.candidates[11].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[12].element = "P" seed0.four.unlistedProposal.candidates[12].group = "P_Ka" seed0.four.unlistedProposal.candidates[12].energyKeV = 40001b3d07c84b5e 2.0133000000000001 @@ -1331,6 +1343,7 @@ seed0.four.unlistedProposal.candidates[12].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[12].familyNote = nil seed0.four.unlistedProposal.candidates[12].possibleReason = "Adding it improves the fit by 4, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[12].unconfirmable = false +seed0.four.unlistedProposal.candidates[12].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[13].element = "Hg" seed0.four.unlistedProposal.candidates[13].group = "Hg_La" seed0.four.unlistedProposal.candidates[13].energyKeV = 4023fa5e353f7cee 9.9890000000000008 @@ -1346,6 +1359,7 @@ seed0.four.unlistedProposal.candidates[13].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[13].familyNote = nil seed0.four.unlistedProposal.candidates[13].possibleReason = "The peak at 9.888 keV went to Ge, which explains it better (gain there 16932230 against 1791941)." seed0.four.unlistedProposal.candidates[13].unconfirmable = false +seed0.four.unlistedProposal.candidates[13].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[14].element = "Gd" seed0.four.unlistedProposal.candidates[14].group = "Gd_Ma" seed0.four.unlistedProposal.candidates[14].energyKeV = 3ff2d3ae685db76b 1.1766799999999999 @@ -1361,6 +1375,7 @@ seed0.four.unlistedProposal.candidates[14].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[14].familyNote = "Gd Lα (6.06 keV) has a residual peak of 0.0 σ, below the 3 σ its Mα (1.18 keV) needs: not Gd." seed0.four.unlistedProposal.candidates[14].possibleReason = nil seed0.four.unlistedProposal.candidates[14].unconfirmable = false +seed0.four.unlistedProposal.candidates[14].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[15].element = "Lu" seed0.four.unlistedProposal.candidates[15].group = "Lu_La" seed0.four.unlistedProposal.candidates[15].energyKeV = 401e9f559b3d07c8 7.6555999999999997 @@ -1376,6 +1391,7 @@ seed0.four.unlistedProposal.candidates[15].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[15].familyNote = nil seed0.four.unlistedProposal.candidates[15].possibleReason = "Its area 277 is below its detection limit 285." seed0.four.unlistedProposal.candidates[15].unconfirmable = false +seed0.four.unlistedProposal.candidates[15].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[16].element = "Ho" seed0.four.unlistedProposal.candidates[16].group = "Ho_La" seed0.four.unlistedProposal.candidates[16].energyKeV = 401ae0f9096bb98c 6.7196999999999996 @@ -1391,6 +1407,7 @@ seed0.four.unlistedProposal.candidates[16].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[16].familyNote = nil seed0.four.unlistedProposal.candidates[16].possibleReason = "Adding it improves the fit by 6, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[16].unconfirmable = false +seed0.four.unlistedProposal.candidates[16].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[17].element = "Zn" seed0.four.unlistedProposal.candidates[17].group = "Zn_Ka" seed0.four.unlistedProposal.candidates[17].energyKeV = 4021471de69ad42c 8.6388999999999996 @@ -1418,6 +1435,7 @@ seed0.four.unlistedProposal.candidates[17].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[17].familyNote = nil seed0.four.unlistedProposal.candidates[17].possibleReason = "Adding it improves the fit by 6, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[17].unconfirmable = false +seed0.four.unlistedProposal.candidates[17].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[18].element = "Tm" seed0.four.unlistedProposal.candidates[18].group = "Tm_La" seed0.four.unlistedProposal.candidates[18].energyKeV = 401cb8a0902de00d 7.1802999999999999 @@ -1433,6 +1451,7 @@ seed0.four.unlistedProposal.candidates[18].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[18].familyNote = nil seed0.four.unlistedProposal.candidates[18].possibleReason = "Adding it improves the fit by 11, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[18].unconfirmable = false +seed0.four.unlistedProposal.candidates[18].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[19].element = "Re" seed0.four.unlistedProposal.candidates[19].group = "Re_La" seed0.four.unlistedProposal.candidates[19].energyKeV = 40214e075f6fd220 8.6524000000000001 @@ -1460,6 +1479,7 @@ seed0.four.unlistedProposal.candidates[19].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[19].familyNote = nil seed0.four.unlistedProposal.candidates[19].possibleReason = "Adding it improves the fit by 3, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[19].unconfirmable = false +seed0.four.unlistedProposal.candidates[19].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[20].element = "Se" seed0.four.unlistedProposal.candidates[20].group = "Se_Ka" seed0.four.unlistedProposal.candidates[20].energyKeV = 402671a9fbe76c8b 11.222 @@ -1475,6 +1495,7 @@ seed0.four.unlistedProposal.candidates[20].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[20].familyNote = nil seed0.four.unlistedProposal.candidates[20].possibleReason = "Adding it improves the fit by -1, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[20].unconfirmable = false +seed0.four.unlistedProposal.candidates[20].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[21].element = "Tb" seed0.four.unlistedProposal.candidates[21].group = "Tb_La" seed0.four.unlistedProposal.candidates[21].energyKeV = 40191758e219652c 6.2728000000000002 @@ -1514,6 +1535,7 @@ seed0.four.unlistedProposal.candidates[21].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[21].familyNote = nil seed0.four.unlistedProposal.candidates[21].possibleReason = "Adding it improves the fit by 2, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[21].unconfirmable = false +seed0.four.unlistedProposal.candidates[21].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[22].element = "Dy" seed0.four.unlistedProposal.candidates[22].group = "Dy_La" seed0.four.unlistedProposal.candidates[22].energyKeV = 4019fb15b573eab3 6.4951999999999996 @@ -1529,6 +1551,7 @@ seed0.four.unlistedProposal.candidates[22].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[22].familyNote = nil seed0.four.unlistedProposal.candidates[22].possibleReason = "Adding it improves the fit by 2, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[22].unconfirmable = false +seed0.four.unlistedProposal.candidates[22].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[23].element = "Ir" seed0.four.unlistedProposal.candidates[23].group = "Ir_La" seed0.four.unlistedProposal.candidates[23].energyKeV = 4022597f62b6ae7d 9.1747999999999994 @@ -1568,6 +1591,7 @@ seed0.four.unlistedProposal.candidates[23].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[23].familyNote = nil seed0.four.unlistedProposal.candidates[23].possibleReason = "Adding it improves the fit by 0, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[23].unconfirmable = false +seed0.four.unlistedProposal.candidates[23].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[24].element = "Au" seed0.four.unlistedProposal.candidates[24].group = "Au_La" seed0.four.unlistedProposal.candidates[24].energyKeV = 40236d0e56041893 9.7129999999999992 @@ -1583,6 +1607,7 @@ seed0.four.unlistedProposal.candidates[24].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[24].familyNote = nil seed0.four.unlistedProposal.candidates[24].possibleReason = "Its area 0 is below its detection limit 277." seed0.four.unlistedProposal.candidates[24].unconfirmable = false +seed0.four.unlistedProposal.candidates[24].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[25].element = "Bi" seed0.four.unlistedProposal.candidates[25].group = "Bi_La" seed0.four.unlistedProposal.candidates[25].energyKeV = 4025ad916872b021 10.839 @@ -1598,6 +1623,7 @@ seed0.four.unlistedProposal.candidates[25].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[25].familyNote = nil seed0.four.unlistedProposal.candidates[25].possibleReason = "Adding it improves the fit by 3, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[25].unconfirmable = false +seed0.four.unlistedProposal.candidates[25].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[26].element = "Er" seed0.four.unlistedProposal.candidates[26].group = "Er_La" seed0.four.unlistedProposal.candidates[26].energyKeV = 401bcb5dcc63f141 6.9485999999999999 @@ -1613,6 +1639,7 @@ seed0.four.unlistedProposal.candidates[26].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[26].familyNote = nil seed0.four.unlistedProposal.candidates[26].possibleReason = "Only -16 % of its gain 704 is at its own lines (20 % needed): it mostly reshapes the background." seed0.four.unlistedProposal.candidates[26].unconfirmable = false +seed0.four.unlistedProposal.candidates[26].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[27].element = "La" seed0.four.unlistedProposal.candidates[27].group = "La_Ma" seed0.four.unlistedProposal.candidates[27].energyKeV = 3fea27525460aa65 0.81730000000000003 @@ -1628,6 +1655,7 @@ seed0.four.unlistedProposal.candidates[27].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[27].familyNote = "La Lα (4.65 keV) has a residual peak of 1.3 σ, below the 3 σ its Mγ (1.02 keV) needs: not La." seed0.four.unlistedProposal.candidates[27].possibleReason = nil seed0.four.unlistedProposal.candidates[27].unconfirmable = false +seed0.four.unlistedProposal.candidates[27].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[28].element = "Na" seed0.four.unlistedProposal.candidates[28].group = "Na_Ka" seed0.four.unlistedProposal.candidates[28].energyKeV = 3ff0a7ef9db22d0e 1.0409999999999999 @@ -1654,6 +1682,7 @@ seed0.four.unlistedProposal.candidates[28].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[28].familyNote = nil seed0.four.unlistedProposal.candidates[28].possibleReason = "Adding it improves the fit by 0, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[28].unconfirmable = false +seed0.four.unlistedProposal.candidates[28].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[29].element = "Os" seed0.four.unlistedProposal.candidates[29].group = "Os_La" seed0.four.unlistedProposal.candidates[29].energyKeV = 4021d25460aa64c3 8.9108000000000001 @@ -1669,6 +1698,7 @@ seed0.four.unlistedProposal.candidates[29].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[29].familyNote = nil seed0.four.unlistedProposal.candidates[29].possibleReason = "Adding it improves the fit by 0, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[29].unconfirmable = false +seed0.four.unlistedProposal.candidates[29].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[30].element = "Pt" seed0.four.unlistedProposal.candidates[30].group = "Pt_La" seed0.four.unlistedProposal.candidates[30].energyKeV = 4022e25aee631f8a 9.4420999999999999 @@ -1684,6 +1714,7 @@ seed0.four.unlistedProposal.candidates[30].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[30].familyNote = nil seed0.four.unlistedProposal.candidates[30].possibleReason = "Adding it improves the fit by 29, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[30].unconfirmable = false +seed0.four.unlistedProposal.candidates[30].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[31].element = "Sr" seed0.four.unlistedProposal.candidates[31].group = "Sr_La" seed0.four.unlistedProposal.candidates[31].energyKeV = 3ffce76c8b439581 1.8065 @@ -1710,6 +1741,7 @@ seed0.four.unlistedProposal.candidates[31].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[31].familyNote = "Sr Kα (14.16 keV) has a residual peak of 0.0 σ, below the 3 σ its Lα (1.81 keV) needs: not Sr." seed0.four.unlistedProposal.candidates[31].possibleReason = nil seed0.four.unlistedProposal.candidates[31].unconfirmable = false +seed0.four.unlistedProposal.candidates[31].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[32].element = "W" seed0.four.unlistedProposal.candidates[32].group = "W_La" seed0.four.unlistedProposal.candidates[32].energyKeV = 4020cb923a29c77a 8.3976000000000006 @@ -1737,6 +1769,7 @@ seed0.four.unlistedProposal.candidates[32].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[32].familyNote = nil seed0.four.unlistedProposal.candidates[32].possibleReason = "Adding it improves the fit by 1, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[32].unconfirmable = false +seed0.four.unlistedProposal.candidates[32].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[33].element = "Y" seed0.four.unlistedProposal.candidates[33].group = "Y_La" seed0.four.unlistedProposal.candidates[33].energyKeV = 3ffec2f837b4a234 1.9226000000000001 @@ -1752,6 +1785,7 @@ seed0.four.unlistedProposal.candidates[33].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[33].familyNote = "Y Kα (14.96 keV) has a residual peak of 0.9 σ, below the 3 σ its Lα (1.92 keV) needs: not Y." seed0.four.unlistedProposal.candidates[33].possibleReason = nil seed0.four.unlistedProposal.candidates[33].unconfirmable = false +seed0.four.unlistedProposal.candidates[33].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[34].element = "Yb" seed0.four.unlistedProposal.candidates[34].group = "Yb_La" seed0.four.unlistedProposal.candidates[34].energyKeV = 401da9c779a6b50b 7.4157999999999999 @@ -1767,6 +1801,7 @@ seed0.four.unlistedProposal.candidates[34].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[34].familyNote = nil seed0.four.unlistedProposal.candidates[34].possibleReason = "Adding it improves the fit by 74, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[34].unconfirmable = false +seed0.four.unlistedProposal.candidates[34].explainedBySumPeak = nil seed0.four.unlistedProposal.sumPeaks: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 seed0.four.unlistedProposal.refused: array 7 seed0.four.unlistedProposal.refused[0].element = "H" diff --git a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-unlisted-sim.txt b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-unlisted-sim.txt index dc716bd..9ad51c9 100644 --- a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-unlisted-sim.txt +++ b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-unlisted-sim.txt @@ -345,6 +345,7 @@ seed0.four.unlistedProposal.candidates[0].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[0].familyNote = nil seed0.four.unlistedProposal.candidates[0].possibleReason = nil seed0.four.unlistedProposal.candidates[0].unconfirmable = false +seed0.four.unlistedProposal.candidates[0].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[1].element = "Ga" seed0.four.unlistedProposal.candidates[1].group = "Ga_La" seed0.four.unlistedProposal.candidates[1].energyKeV = 3ff1916872b020c5 1.0980000000000001 @@ -370,6 +371,7 @@ seed0.four.unlistedProposal.candidates[1].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[1].familyNote = nil seed0.four.unlistedProposal.candidates[1].possibleReason = nil seed0.four.unlistedProposal.candidates[1].unconfirmable = false +seed0.four.unlistedProposal.candidates[1].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[2].element = "Cu" seed0.four.unlistedProposal.candidates[2].group = "Cu_Ka" seed0.four.unlistedProposal.candidates[2].energyKeV = 402018793dd97f63 8.0478000000000005 @@ -406,6 +408,7 @@ seed0.four.unlistedProposal.candidates[2].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[2].familyNote = nil seed0.four.unlistedProposal.candidates[2].possibleReason = nil seed0.four.unlistedProposal.candidates[2].unconfirmable = false +seed0.four.unlistedProposal.candidates[2].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[3].element = "Eu" seed0.four.unlistedProposal.candidates[3].group = "Eu_Ma" seed0.four.unlistedProposal.candidates[3].energyKeV = 3ff195e9e1b089a0 1.0991 @@ -432,6 +435,7 @@ seed0.four.unlistedProposal.candidates[3].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[3].familyNote = "Eu Lα (5.85 keV) has a residual peak of 0.0 σ, below the 3 σ its Mα (1.10 keV) needs: not Eu." seed0.four.unlistedProposal.candidates[3].possibleReason = nil seed0.four.unlistedProposal.candidates[3].unconfirmable = false +seed0.four.unlistedProposal.candidates[3].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[4].element = "Sm" seed0.four.unlistedProposal.candidates[4].group = "Sm_Ma" seed0.four.unlistedProposal.candidates[4].energyKeV = 3ff0af4f0d844d01 1.0427999999999999 @@ -458,6 +462,7 @@ seed0.four.unlistedProposal.candidates[4].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[4].familyNote = "Sm Lα (5.64 keV) has a residual peak of 0.0 σ, below the 3 σ its Mβ (1.10 keV) needs: not Sm." seed0.four.unlistedProposal.candidates[4].possibleReason = nil seed0.four.unlistedProposal.candidates[4].unconfirmable = false +seed0.four.unlistedProposal.candidates[4].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[5].element = "Pr" seed0.four.unlistedProposal.candidates[5].group = "Pr_Ma" seed0.four.unlistedProposal.candidates[5].energyKeV = 3fec985f06f69446 0.89359999999999995 @@ -473,6 +478,7 @@ seed0.four.unlistedProposal.candidates[5].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[5].familyNote = "Pr Lα (5.03 keV) has a residual peak of 0.0 σ, below the 3 σ its Mγ (1.13 keV) needs: not Pr." seed0.four.unlistedProposal.candidates[5].possibleReason = nil seed0.four.unlistedProposal.candidates[5].unconfirmable = false +seed0.four.unlistedProposal.candidates[5].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[6].element = "Na" seed0.four.unlistedProposal.candidates[6].group = "Na_Ka" seed0.four.unlistedProposal.candidates[6].energyKeV = 3ff0a7ef9db22d0e 1.0409999999999999 @@ -499,6 +505,7 @@ seed0.four.unlistedProposal.candidates[6].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[6].familyNote = nil seed0.four.unlistedProposal.candidates[6].possibleReason = "Adding it improves the fit by -18127, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[6].unconfirmable = false +seed0.four.unlistedProposal.candidates[6].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[7].element = "Ce" seed0.four.unlistedProposal.candidates[7].group = "Ce_Ma" seed0.four.unlistedProposal.candidates[7].energyKeV = 3feb0e5604189375 0.84550000000000003 @@ -514,6 +521,7 @@ seed0.four.unlistedProposal.candidates[7].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[7].familyNote = "Ce Lα (4.84 keV) has a residual peak of 0.5 σ, below the 3 σ its Mγ (1.08 keV) needs: not Ce." seed0.four.unlistedProposal.candidates[7].possibleReason = nil seed0.four.unlistedProposal.candidates[7].unconfirmable = false +seed0.four.unlistedProposal.candidates[7].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[8].element = "Rb" seed0.four.unlistedProposal.candidates[8].group = "Rb_La" seed0.four.unlistedProposal.candidates[8].energyKeV = 3ffb1b089a027525 1.6940999999999999 @@ -541,6 +549,7 @@ seed0.four.unlistedProposal.candidates[8].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[8].familyNote = "Rb Kα (13.40 keV) has a residual peak of 0.0 σ, below the 3 σ its Lβ1 (1.75 keV) needs: not Rb." seed0.four.unlistedProposal.candidates[8].possibleReason = nil seed0.four.unlistedProposal.candidates[8].unconfirmable = false +seed0.four.unlistedProposal.candidates[8].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[9].element = "Ta" seed0.four.unlistedProposal.candidates[9].group = "Ta_Ma" seed0.four.unlistedProposal.candidates[9].energyKeV = 3ffb5c91d14e3bcd 1.7101 @@ -568,6 +577,7 @@ seed0.four.unlistedProposal.candidates[9].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[9].familyNote = "Ta Lα (8.15 keV) has a residual peak of 0.0 σ, below the 3 σ its Mβ (1.77 keV) needs: not Ta." seed0.four.unlistedProposal.candidates[9].possibleReason = nil seed0.four.unlistedProposal.candidates[9].unconfirmable = false +seed0.four.unlistedProposal.candidates[9].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[10].element = "Zr" seed0.four.unlistedProposal.candidates[10].group = "Zr_La" seed0.four.unlistedProposal.candidates[10].energyKeV = 400056a161e4f766 2.0423 @@ -595,6 +605,7 @@ seed0.four.unlistedProposal.candidates[10].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[10].familyNote = "Zr Kα (15.78 keV) has a residual peak of 0.0 σ, below the 3 σ its Lα (2.04 keV) needs: not Zr." seed0.four.unlistedProposal.candidates[10].possibleReason = nil seed0.four.unlistedProposal.candidates[10].unconfirmable = false +seed0.four.unlistedProposal.candidates[10].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[11].element = "Gd" seed0.four.unlistedProposal.candidates[11].group = "Gd_Ma" seed0.four.unlistedProposal.candidates[11].energyKeV = 3ff2d3ae685db76b 1.1766799999999999 @@ -610,6 +621,7 @@ seed0.four.unlistedProposal.candidates[11].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[11].familyNote = "Gd Lα (6.06 keV) has a residual peak of 0.5 σ, below the 3 σ its Mα (1.18 keV) needs: not Gd." seed0.four.unlistedProposal.candidates[11].possibleReason = nil seed0.four.unlistedProposal.candidates[11].unconfirmable = false +seed0.four.unlistedProposal.candidates[11].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[12].element = "P" seed0.four.unlistedProposal.candidates[12].group = "P_Ka" seed0.four.unlistedProposal.candidates[12].energyKeV = 40001b3d07c84b5e 2.0133000000000001 @@ -637,6 +649,7 @@ seed0.four.unlistedProposal.candidates[12].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[12].familyNote = nil seed0.four.unlistedProposal.candidates[12].possibleReason = "Adding it improves the fit by 6, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[12].unconfirmable = false +seed0.four.unlistedProposal.candidates[12].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[13].element = "Hg" seed0.four.unlistedProposal.candidates[13].group = "Hg_La" seed0.four.unlistedProposal.candidates[13].energyKeV = 4023fa5e353f7cee 9.9890000000000008 @@ -652,6 +665,7 @@ seed0.four.unlistedProposal.candidates[13].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[13].familyNote = nil seed0.four.unlistedProposal.candidates[13].possibleReason = "The peak at 9.888 keV went to Ge, which explains it better (gain there 16151153 against 1464357)." seed0.four.unlistedProposal.candidates[13].unconfirmable = false +seed0.four.unlistedProposal.candidates[13].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[14].element = "Lu" seed0.four.unlistedProposal.candidates[14].group = "Lu_La" seed0.four.unlistedProposal.candidates[14].energyKeV = 401e9f559b3d07c8 7.6555999999999997 @@ -667,6 +681,7 @@ seed0.four.unlistedProposal.candidates[14].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[14].familyNote = nil seed0.four.unlistedProposal.candidates[14].possibleReason = "Adding it improves the fit by 32, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[14].unconfirmable = false +seed0.four.unlistedProposal.candidates[14].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[15].element = "Hf" seed0.four.unlistedProposal.candidates[15].group = "Hf_La" seed0.four.unlistedProposal.candidates[15].energyKeV = 401f989374bc6a7f 7.899 @@ -682,6 +697,7 @@ seed0.four.unlistedProposal.candidates[15].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[15].familyNote = nil seed0.four.unlistedProposal.candidates[15].possibleReason = "Adding it improves the fit by 25, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[15].unconfirmable = false +seed0.four.unlistedProposal.candidates[15].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[16].element = "Dy" seed0.four.unlistedProposal.candidates[16].group = "Dy_La" seed0.four.unlistedProposal.candidates[16].energyKeV = 4019fb15b573eab3 6.4951999999999996 @@ -697,6 +713,7 @@ seed0.four.unlistedProposal.candidates[16].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[16].familyNote = nil seed0.four.unlistedProposal.candidates[16].possibleReason = "Adding it improves the fit by 3, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[16].unconfirmable = false +seed0.four.unlistedProposal.candidates[16].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[17].element = "Tm" seed0.four.unlistedProposal.candidates[17].group = "Tm_La" seed0.four.unlistedProposal.candidates[17].energyKeV = 401cb8a0902de00d 7.1802999999999999 @@ -712,6 +729,7 @@ seed0.four.unlistedProposal.candidates[17].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[17].familyNote = nil seed0.four.unlistedProposal.candidates[17].possibleReason = "Adding it improves the fit by 2, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[17].unconfirmable = false +seed0.four.unlistedProposal.candidates[17].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[18].element = "Zn" seed0.four.unlistedProposal.candidates[18].group = "Zn_Ka" seed0.four.unlistedProposal.candidates[18].energyKeV = 4021471de69ad42c 8.6388999999999996 @@ -739,6 +757,7 @@ seed0.four.unlistedProposal.candidates[18].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[18].familyNote = nil seed0.four.unlistedProposal.candidates[18].possibleReason = "Adding it improves the fit by 1, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[18].unconfirmable = false +seed0.four.unlistedProposal.candidates[18].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[19].element = "Se" seed0.four.unlistedProposal.candidates[19].group = "Se_Ka" seed0.four.unlistedProposal.candidates[19].energyKeV = 402671a9fbe76c8b 11.222 @@ -754,6 +773,7 @@ seed0.four.unlistedProposal.candidates[19].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[19].familyNote = nil seed0.four.unlistedProposal.candidates[19].possibleReason = "Adding it improves the fit by 5, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[19].unconfirmable = false +seed0.four.unlistedProposal.candidates[19].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[20].element = "Tb" seed0.four.unlistedProposal.candidates[20].group = "Tb_La" seed0.four.unlistedProposal.candidates[20].energyKeV = 40191758e219652c 6.2728000000000002 @@ -781,6 +801,7 @@ seed0.four.unlistedProposal.candidates[20].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[20].familyNote = nil seed0.four.unlistedProposal.candidates[20].possibleReason = "Adding it improves the fit by 0, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[20].unconfirmable = false +seed0.four.unlistedProposal.candidates[20].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[21].element = "Ho" seed0.four.unlistedProposal.candidates[21].group = "Ho_La" seed0.four.unlistedProposal.candidates[21].energyKeV = 401ae0f9096bb98c 6.7196999999999996 @@ -796,6 +817,7 @@ seed0.four.unlistedProposal.candidates[21].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[21].familyNote = nil seed0.four.unlistedProposal.candidates[21].possibleReason = "Adding it improves the fit by 1, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[21].unconfirmable = false +seed0.four.unlistedProposal.candidates[21].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[22].element = "Re" seed0.four.unlistedProposal.candidates[22].group = "Re_La" seed0.four.unlistedProposal.candidates[22].energyKeV = 40214e075f6fd220 8.6524000000000001 @@ -823,6 +845,7 @@ seed0.four.unlistedProposal.candidates[22].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[22].familyNote = nil seed0.four.unlistedProposal.candidates[22].possibleReason = "Adding it improves the fit by 1, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[22].unconfirmable = false +seed0.four.unlistedProposal.candidates[22].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[23].element = "Au" seed0.four.unlistedProposal.candidates[23].group = "Au_La" seed0.four.unlistedProposal.candidates[23].energyKeV = 40236d0e56041893 9.7129999999999992 @@ -838,6 +861,7 @@ seed0.four.unlistedProposal.candidates[23].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[23].familyNote = nil seed0.four.unlistedProposal.candidates[23].possibleReason = "Its area 0 is below its detection limit 281." seed0.four.unlistedProposal.candidates[23].unconfirmable = false +seed0.four.unlistedProposal.candidates[23].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[24].element = "Bi" seed0.four.unlistedProposal.candidates[24].group = "Bi_La" seed0.four.unlistedProposal.candidates[24].energyKeV = 4025ad916872b021 10.839 @@ -853,6 +877,7 @@ seed0.four.unlistedProposal.candidates[24].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[24].familyNote = nil seed0.four.unlistedProposal.candidates[24].possibleReason = "Adding it improves the fit by -0, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[24].unconfirmable = false +seed0.four.unlistedProposal.candidates[24].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[25].element = "Er" seed0.four.unlistedProposal.candidates[25].group = "Er_La" seed0.four.unlistedProposal.candidates[25].energyKeV = 401bcb5dcc63f141 6.9485999999999999 @@ -868,6 +893,7 @@ seed0.four.unlistedProposal.candidates[25].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[25].familyNote = nil seed0.four.unlistedProposal.candidates[25].possibleReason = "Adding it improves the fit by -3024, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[25].unconfirmable = false +seed0.four.unlistedProposal.candidates[25].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[26].element = "Ir" seed0.four.unlistedProposal.candidates[26].group = "Ir_La" seed0.four.unlistedProposal.candidates[26].energyKeV = 4022597f62b6ae7d 9.1747999999999994 @@ -895,6 +921,7 @@ seed0.four.unlistedProposal.candidates[26].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[26].familyNote = nil seed0.four.unlistedProposal.candidates[26].possibleReason = "Adding it improves the fit by 3, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[26].unconfirmable = false +seed0.four.unlistedProposal.candidates[26].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[27].element = "La" seed0.four.unlistedProposal.candidates[27].group = "La_Ma" seed0.four.unlistedProposal.candidates[27].energyKeV = 3fea27525460aa65 0.81730000000000003 @@ -910,6 +937,7 @@ seed0.four.unlistedProposal.candidates[27].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[27].familyNote = "La Lα (4.65 keV) has a residual peak of 1.5 σ, below the 3 σ its Mγ (1.02 keV) needs: not La." seed0.four.unlistedProposal.candidates[27].possibleReason = nil seed0.four.unlistedProposal.candidates[27].unconfirmable = false +seed0.four.unlistedProposal.candidates[27].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[28].element = "Nd" seed0.four.unlistedProposal.candidates[28].group = "Nd_Ma" seed0.four.unlistedProposal.candidates[28].energyKeV = 3fee161e4f765fd9 0.94020000000000004 @@ -925,6 +953,7 @@ seed0.four.unlistedProposal.candidates[28].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[28].familyNote = "Nd Lα (5.23 keV) has a residual peak of 0.0 σ, below the 3 σ its Mβ (1.00 keV) needs: not Nd." seed0.four.unlistedProposal.candidates[28].possibleReason = nil seed0.four.unlistedProposal.candidates[28].unconfirmable = false +seed0.four.unlistedProposal.candidates[28].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[29].element = "Os" seed0.four.unlistedProposal.candidates[29].group = "Os_La" seed0.four.unlistedProposal.candidates[29].energyKeV = 4021d25460aa64c3 8.9108000000000001 @@ -940,6 +969,7 @@ seed0.four.unlistedProposal.candidates[29].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[29].familyNote = nil seed0.four.unlistedProposal.candidates[29].possibleReason = "Adding it improves the fit by -0, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[29].unconfirmable = false +seed0.four.unlistedProposal.candidates[29].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[30].element = "Pt" seed0.four.unlistedProposal.candidates[30].group = "Pt_La" seed0.four.unlistedProposal.candidates[30].energyKeV = 4022e25aee631f8a 9.4420999999999999 @@ -955,6 +985,7 @@ seed0.four.unlistedProposal.candidates[30].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[30].familyNote = nil seed0.four.unlistedProposal.candidates[30].possibleReason = "Adding it improves the fit by 32, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[30].unconfirmable = false +seed0.four.unlistedProposal.candidates[30].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[31].element = "Sr" seed0.four.unlistedProposal.candidates[31].group = "Sr_La" seed0.four.unlistedProposal.candidates[31].energyKeV = 3ffce76c8b439581 1.8065 @@ -981,6 +1012,7 @@ seed0.four.unlistedProposal.candidates[31].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[31].familyNote = "Sr Kα (14.16 keV) has a residual peak of 0.8 σ, below the 3 σ its Lα (1.81 keV) needs: not Sr." seed0.four.unlistedProposal.candidates[31].possibleReason = nil seed0.four.unlistedProposal.candidates[31].unconfirmable = false +seed0.four.unlistedProposal.candidates[31].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[32].element = "W" seed0.four.unlistedProposal.candidates[32].group = "W_La" seed0.four.unlistedProposal.candidates[32].energyKeV = 4020cb923a29c77a 8.3976000000000006 @@ -1008,6 +1040,7 @@ seed0.four.unlistedProposal.candidates[32].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[32].familyNote = nil seed0.four.unlistedProposal.candidates[32].possibleReason = "Adding it improves the fit by 1, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[32].unconfirmable = false +seed0.four.unlistedProposal.candidates[32].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[33].element = "Y" seed0.four.unlistedProposal.candidates[33].group = "Y_La" seed0.four.unlistedProposal.candidates[33].energyKeV = 3ffec2f837b4a234 1.9226000000000001 @@ -1023,6 +1056,7 @@ seed0.four.unlistedProposal.candidates[33].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[33].familyNote = "Y Kα (14.96 keV) has a residual peak of 0.4 σ, below the 3 σ its Lα (1.92 keV) needs: not Y." seed0.four.unlistedProposal.candidates[33].possibleReason = nil seed0.four.unlistedProposal.candidates[33].unconfirmable = false +seed0.four.unlistedProposal.candidates[33].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[34].element = "Yb" seed0.four.unlistedProposal.candidates[34].group = "Yb_La" seed0.four.unlistedProposal.candidates[34].energyKeV = 401da9c779a6b50b 7.4157999999999999 @@ -1038,6 +1072,7 @@ seed0.four.unlistedProposal.candidates[34].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[34].familyNote = nil seed0.four.unlistedProposal.candidates[34].possibleReason = "Adding it improves the fit by 18, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[34].unconfirmable = false +seed0.four.unlistedProposal.candidates[34].explainedBySumPeak = nil seed0.four.unlistedProposal.sumPeaks: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 seed0.four.unlistedProposal.refused: array 7 seed0.four.unlistedProposal.refused[0].element = "H" @@ -1591,6 +1626,7 @@ seed0.seven.unlistedProposal.candidates[0].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[0].familyNote = "Rb Kα (13.40 keV) has a residual peak of 0.0 σ, below the 3 σ its Lβ1 (1.75 keV) needs: not Rb." seed0.seven.unlistedProposal.candidates[0].possibleReason = nil seed0.seven.unlistedProposal.candidates[0].unconfirmable = false +seed0.seven.unlistedProposal.candidates[0].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[1].element = "Pt" seed0.seven.unlistedProposal.candidates[1].group = "Pt_Ma" seed0.seven.unlistedProposal.candidates[1].energyKeV = 4000676c8b439581 2.0505 @@ -1618,6 +1654,7 @@ seed0.seven.unlistedProposal.candidates[1].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[1].familyNote = "Pt Lα (9.44 keV) has a residual peak of -0.0 σ, below the 3 σ its Mα (2.05 keV) needs: not Pt." seed0.seven.unlistedProposal.candidates[1].possibleReason = nil seed0.seven.unlistedProposal.candidates[1].unconfirmable = false +seed0.seven.unlistedProposal.candidates[1].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[2].element = "Au" seed0.seven.unlistedProposal.candidates[2].group = "Au_Ma" seed0.seven.unlistedProposal.candidates[2].energyKeV = 4000fbb2fec56d5d 2.1229 @@ -1645,6 +1682,7 @@ seed0.seven.unlistedProposal.candidates[2].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[2].familyNote = "Au Lα (9.71 keV) has a residual peak of 0.0 σ, below the 3 σ its Mα (2.12 keV) needs: not Au." seed0.seven.unlistedProposal.candidates[2].possibleReason = nil seed0.seven.unlistedProposal.candidates[2].unconfirmable = false +seed0.seven.unlistedProposal.candidates[2].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[3].element = "Zr" seed0.seven.unlistedProposal.candidates[3].group = "Zr_La" seed0.seven.unlistedProposal.candidates[3].energyKeV = 400056a161e4f766 2.0423 @@ -1672,6 +1710,7 @@ seed0.seven.unlistedProposal.candidates[3].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[3].familyNote = "Zr Kα (15.78 keV) has a residual peak of 0.0 σ, below the 3 σ its Lα (2.04 keV) needs: not Zr." seed0.seven.unlistedProposal.candidates[3].possibleReason = nil seed0.seven.unlistedProposal.candidates[3].unconfirmable = false +seed0.seven.unlistedProposal.candidates[3].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[4].element = "Nb" seed0.seven.unlistedProposal.candidates[4].group = "Nb_La" seed0.seven.unlistedProposal.candidates[4].energyKeV = 400153c36113404f 2.1659000000000002 @@ -1710,6 +1749,7 @@ seed0.seven.unlistedProposal.candidates[4].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[4].familyNote = "Nb Kα (16.62 keV) has a residual peak of 0.0 σ, below the 3 σ its Lα (2.17 keV) needs: not Nb." seed0.seven.unlistedProposal.candidates[4].possibleReason = nil seed0.seven.unlistedProposal.candidates[4].unconfirmable = false +seed0.seven.unlistedProposal.candidates[4].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[5].element = "Ta" seed0.seven.unlistedProposal.candidates[5].group = "Ta_Ma" seed0.seven.unlistedProposal.candidates[5].energyKeV = 3ffb5c91d14e3bcd 1.7101 @@ -1737,6 +1777,7 @@ seed0.seven.unlistedProposal.candidates[5].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[5].familyNote = nil seed0.seven.unlistedProposal.candidates[5].possibleReason = nil seed0.seven.unlistedProposal.candidates[5].unconfirmable = false +seed0.seven.unlistedProposal.candidates[5].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[6].element = "Er" seed0.seven.unlistedProposal.candidates[6].group = "Er_La" seed0.seven.unlistedProposal.candidates[6].energyKeV = 401bcb5dcc63f141 6.9485999999999999 @@ -1752,6 +1793,7 @@ seed0.seven.unlistedProposal.candidates[6].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[6].familyNote = nil seed0.seven.unlistedProposal.candidates[6].possibleReason = "Adding it improves the fit by 6, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[6].unconfirmable = false +seed0.seven.unlistedProposal.candidates[6].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[7].element = "Hf" seed0.seven.unlistedProposal.candidates[7].group = "Hf_La" seed0.seven.unlistedProposal.candidates[7].energyKeV = 401f989374bc6a7f 7.899 @@ -1767,6 +1809,7 @@ seed0.seven.unlistedProposal.candidates[7].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[7].familyNote = nil seed0.seven.unlistedProposal.candidates[7].possibleReason = "Adding it improves the fit by 15, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[7].unconfirmable = false +seed0.seven.unlistedProposal.candidates[7].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[8].element = "Lu" seed0.seven.unlistedProposal.candidates[8].group = "Lu_La" seed0.seven.unlistedProposal.candidates[8].energyKeV = 401e9f559b3d07c8 7.6555999999999997 @@ -1782,6 +1825,7 @@ seed0.seven.unlistedProposal.candidates[8].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[8].familyNote = nil seed0.seven.unlistedProposal.candidates[8].possibleReason = "Adding it improves the fit by 68, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[8].unconfirmable = false +seed0.seven.unlistedProposal.candidates[8].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[9].element = "Hg" seed0.seven.unlistedProposal.candidates[9].group = "Hg_La" seed0.seven.unlistedProposal.candidates[9].energyKeV = 4023fa5e353f7cee 9.9890000000000008 @@ -1797,6 +1841,7 @@ seed0.seven.unlistedProposal.candidates[9].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[9].familyNote = nil seed0.seven.unlistedProposal.candidates[9].possibleReason = "Adding it improves the fit by 7, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[9].unconfirmable = false +seed0.seven.unlistedProposal.candidates[9].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[10].element = "Zn" seed0.seven.unlistedProposal.candidates[10].group = "Zn_Ka" seed0.seven.unlistedProposal.candidates[10].energyKeV = 4021471de69ad42c 8.6388999999999996 @@ -1824,6 +1869,7 @@ seed0.seven.unlistedProposal.candidates[10].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[10].familyNote = nil seed0.seven.unlistedProposal.candidates[10].possibleReason = "Adding it improves the fit by 2, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[10].unconfirmable = false +seed0.seven.unlistedProposal.candidates[10].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[11].element = "Tm" seed0.seven.unlistedProposal.candidates[11].group = "Tm_La" seed0.seven.unlistedProposal.candidates[11].energyKeV = 401cb8a0902de00d 7.1802999999999999 @@ -1839,6 +1885,7 @@ seed0.seven.unlistedProposal.candidates[11].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[11].familyNote = nil seed0.seven.unlistedProposal.candidates[11].possibleReason = "Adding it improves the fit by 2, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[11].unconfirmable = false +seed0.seven.unlistedProposal.candidates[11].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[12].element = "Dy" seed0.seven.unlistedProposal.candidates[12].group = "Dy_La" seed0.seven.unlistedProposal.candidates[12].energyKeV = 4019fb15b573eab3 6.4951999999999996 @@ -1854,6 +1901,7 @@ seed0.seven.unlistedProposal.candidates[12].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[12].familyNote = nil seed0.seven.unlistedProposal.candidates[12].possibleReason = "Adding it improves the fit by 2, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[12].unconfirmable = false +seed0.seven.unlistedProposal.candidates[12].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[13].element = "Se" seed0.seven.unlistedProposal.candidates[13].group = "Se_Ka" seed0.seven.unlistedProposal.candidates[13].energyKeV = 402671a9fbe76c8b 11.222 @@ -1869,6 +1917,7 @@ seed0.seven.unlistedProposal.candidates[13].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[13].familyNote = nil seed0.seven.unlistedProposal.candidates[13].possibleReason = "Adding it improves the fit by 7, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[13].unconfirmable = false +seed0.seven.unlistedProposal.candidates[13].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[14].element = "Re" seed0.seven.unlistedProposal.candidates[14].group = "Re_La" seed0.seven.unlistedProposal.candidates[14].energyKeV = 40214e075f6fd220 8.6524000000000001 @@ -1896,6 +1945,7 @@ seed0.seven.unlistedProposal.candidates[14].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[14].familyNote = nil seed0.seven.unlistedProposal.candidates[14].possibleReason = "Adding it improves the fit by 1, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[14].unconfirmable = false +seed0.seven.unlistedProposal.candidates[14].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[15].element = "Ho" seed0.seven.unlistedProposal.candidates[15].group = "Ho_La" seed0.seven.unlistedProposal.candidates[15].energyKeV = 401ae0f9096bb98c 6.7196999999999996 @@ -1911,6 +1961,7 @@ seed0.seven.unlistedProposal.candidates[15].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[15].familyNote = nil seed0.seven.unlistedProposal.candidates[15].possibleReason = "Adding it improves the fit by 6, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[15].unconfirmable = false +seed0.seven.unlistedProposal.candidates[15].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[16].element = "Tb" seed0.seven.unlistedProposal.candidates[16].group = "Tb_La" seed0.seven.unlistedProposal.candidates[16].energyKeV = 40191758e219652c 6.2728000000000002 @@ -1950,6 +2001,7 @@ seed0.seven.unlistedProposal.candidates[16].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[16].familyNote = nil seed0.seven.unlistedProposal.candidates[16].possibleReason = "Adding it improves the fit by -0, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[16].unconfirmable = false +seed0.seven.unlistedProposal.candidates[16].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[17].element = "Bi" seed0.seven.unlistedProposal.candidates[17].group = "Bi_La" seed0.seven.unlistedProposal.candidates[17].energyKeV = 4025ad916872b021 10.839 @@ -1965,6 +2017,7 @@ seed0.seven.unlistedProposal.candidates[17].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[17].familyNote = nil seed0.seven.unlistedProposal.candidates[17].possibleReason = "Adding it improves the fit by 5, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[17].unconfirmable = false +seed0.seven.unlistedProposal.candidates[17].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[18].element = "Ir" seed0.seven.unlistedProposal.candidates[18].group = "Ir_Ma" seed0.seven.unlistedProposal.candidates[18].energyKeV = 3fffadab9f559b3d 1.9799 @@ -1992,6 +2045,7 @@ seed0.seven.unlistedProposal.candidates[18].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[18].familyNote = "Ir Lα (9.17 keV) has a residual peak of 0.0 σ, below the 3 σ its Mβ (2.05 keV) needs: not Ir." seed0.seven.unlistedProposal.candidates[18].possibleReason = nil seed0.seven.unlistedProposal.candidates[18].unconfirmable = false +seed0.seven.unlistedProposal.candidates[18].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[19].element = "Os" seed0.seven.unlistedProposal.candidates[19].group = "Os_Ma" seed0.seven.unlistedProposal.candidates[19].energyKeV = 3ffe9eecbfb15b57 1.9137999999999999 @@ -2018,6 +2072,7 @@ seed0.seven.unlistedProposal.candidates[19].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[19].familyNote = "Os Lα (8.91 keV) has a residual peak of 0.0 σ, below the 3 σ its Mβ (1.98 keV) needs: not Os." seed0.seven.unlistedProposal.candidates[19].possibleReason = nil seed0.seven.unlistedProposal.candidates[19].unconfirmable = false +seed0.seven.unlistedProposal.candidates[19].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[20].element = "P" seed0.seven.unlistedProposal.candidates[20].group = "P_Ka" seed0.seven.unlistedProposal.candidates[20].energyKeV = 40001b3d07c84b5e 2.0133000000000001 @@ -2045,6 +2100,7 @@ seed0.seven.unlistedProposal.candidates[20].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[20].familyNote = nil seed0.seven.unlistedProposal.candidates[20].possibleReason = "Adding it improves the fit by 2, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[20].unconfirmable = false +seed0.seven.unlistedProposal.candidates[20].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[21].element = "Sr" seed0.seven.unlistedProposal.candidates[21].group = "Sr_La" seed0.seven.unlistedProposal.candidates[21].energyKeV = 3ffce76c8b439581 1.8065 @@ -2071,6 +2127,7 @@ seed0.seven.unlistedProposal.candidates[21].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[21].familyNote = "Sr Kα (14.16 keV) has a residual peak of 0.8 σ, below the 3 σ its Lα (1.81 keV) needs: not Sr." seed0.seven.unlistedProposal.candidates[21].possibleReason = nil seed0.seven.unlistedProposal.candidates[21].unconfirmable = false +seed0.seven.unlistedProposal.candidates[21].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[22].element = "W" seed0.seven.unlistedProposal.candidates[22].group = "W_La" seed0.seven.unlistedProposal.candidates[22].energyKeV = 4020cb923a29c77a 8.3976000000000006 @@ -2098,6 +2155,7 @@ seed0.seven.unlistedProposal.candidates[22].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[22].familyNote = nil seed0.seven.unlistedProposal.candidates[22].possibleReason = "Adding it improves the fit by 1, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[22].unconfirmable = false +seed0.seven.unlistedProposal.candidates[22].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[23].element = "Y" seed0.seven.unlistedProposal.candidates[23].group = "Y_La" seed0.seven.unlistedProposal.candidates[23].energyKeV = 3ffec2f837b4a234 1.9226000000000001 @@ -2113,6 +2171,7 @@ seed0.seven.unlistedProposal.candidates[23].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[23].familyNote = "Y Kα (14.96 keV) has a residual peak of 0.3 σ, below the 3 σ its Lβ1 (2.00 keV) needs: not Y." seed0.seven.unlistedProposal.candidates[23].possibleReason = nil seed0.seven.unlistedProposal.candidates[23].unconfirmable = false +seed0.seven.unlistedProposal.candidates[23].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[24].element = "Yb" seed0.seven.unlistedProposal.candidates[24].group = "Yb_La" seed0.seven.unlistedProposal.candidates[24].energyKeV = 401da9c779a6b50b 7.4157999999999999 @@ -2128,6 +2187,7 @@ seed0.seven.unlistedProposal.candidates[24].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[24].familyNote = nil seed0.seven.unlistedProposal.candidates[24].possibleReason = "Adding it improves the fit by 61, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[24].unconfirmable = false +seed0.seven.unlistedProposal.candidates[24].explainedBySumPeak = nil seed0.seven.unlistedProposal.sumPeaks: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 seed0.seven.unlistedProposal.refused: array 7 seed0.seven.unlistedProposal.refused[0].element = "H" From 226cd4738fd8f8495e29db9df8fb36d5f6185fdd Mon Sep 17 00:00:00 2001 From: Paullo9 Date: Sun, 1 Nov 2026 14:37:27 +0100 Subject: [PATCH 5/7] test: re-record the spectro goldens after merging the broadened edge default, no number moves Recorded from the merged code with SPECTRO_GOLDEN_DIR. Against main the only changes are this branch's own: the explainedBySumPeak field on proposal candidates and the three pile-up notes in the eds-proposer-sim region2 proposal. No numeric line moves. Co-Authored-By: Claude Opus 5.5 --- .../spectro-golden/eds-proposer-sim.txt | 32 ++++++++-- .../spectro-golden/eds-realistic-l-sim.txt | 35 +++++++++++ .../spectro-golden/eds-unlisted-sim.txt | 60 +++++++++++++++++++ 3 files changed, 123 insertions(+), 4 deletions(-) diff --git a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-proposer-sim.txt b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-proposer-sim.txt index 9ee24ca..3721aee 100644 --- a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-proposer-sim.txt +++ b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-proposer-sim.txt @@ -27,6 +27,7 @@ region2(beta'' 300 counts/px).proposal.candidates[0].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[0].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[0].possibleReason = "The peak at 2.737 keV went to Al+Mg sum, which explains it better (gain there 33387 against 29635)." region2(beta'' 300 counts/px).proposal.candidates[0].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[0].explainedBySumPeak = "Al+Mg sum" region2(beta'' 300 counts/px).proposal.candidates[1].element = "Ar" region2(beta'' 300 counts/px).proposal.candidates[1].group = "Ar_Ka" region2(beta'' 300 counts/px).proposal.candidates[1].energyKeV = 4007a95e9e1b089a 2.9577 @@ -53,6 +54,7 @@ region2(beta'' 300 counts/px).proposal.candidates[1].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[1].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[1].possibleReason = "The peak at 3.227 keV went to Al+Si sum, which explains it better (gain there 212982 against 140417)." region2(beta'' 300 counts/px).proposal.candidates[1].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[1].explainedBySumPeak = "Al+Si sum" region2(beta'' 300 counts/px).proposal.candidates[2].element = "In" region2(beta'' 300 counts/px).proposal.candidates[2].group = "In_La" region2(beta'' 300 counts/px).proposal.candidates[2].energyKeV = 400a4bc6a7ef9db2 3.2869999999999999 @@ -68,6 +70,7 @@ region2(beta'' 300 counts/px).proposal.candidates[2].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[2].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[2].possibleReason = "The peak at 3.477 keV went to Si+Si sum, which explains it better (gain there 24509 against 18445)." region2(beta'' 300 counts/px).proposal.candidates[2].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[2].explainedBySumPeak = "Si+Si sum" region2(beta'' 300 counts/px).proposal.candidates[3].element = "Sn" region2(beta'' 300 counts/px).proposal.candidates[3].group = "Sn_La" region2(beta'' 300 counts/px).proposal.candidates[3].energyKeV = 400b8d4fdf3b645a 3.444 @@ -94,6 +97,7 @@ region2(beta'' 300 counts/px).proposal.candidates[3].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[3].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[3].possibleReason = "The peak at 3.477 keV went to Si+Si sum, which explains it better (gain there 24509 against 16177)." region2(beta'' 300 counts/px).proposal.candidates[3].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[3].explainedBySumPeak = "Si+Si sum" region2(beta'' 300 counts/px).proposal.candidates[4].element = "Pd" region2(beta'' 300 counts/px).proposal.candidates[4].group = "Pd_La" region2(beta'' 300 counts/px).proposal.candidates[4].energyKeV = 4006b573eab367a1 2.8386 @@ -109,6 +113,7 @@ region2(beta'' 300 counts/px).proposal.candidates[4].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[4].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[4].possibleReason = "The peak at 2.737 keV went to Al+Mg sum, which explains it better (gain there 33387 against 5175)." region2(beta'' 300 counts/px).proposal.candidates[4].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[4].explainedBySumPeak = "Al+Mg sum" region2(beta'' 300 counts/px).proposal.candidates[5].element = "Ag" region2(beta'' 300 counts/px).proposal.candidates[5].group = "Ag_La" region2(beta'' 300 counts/px).proposal.candidates[5].energyKeV = 4007e00d1b71758e 2.9843999999999999 @@ -147,6 +152,7 @@ region2(beta'' 300 counts/px).proposal.candidates[5].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[5].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[5].possibleReason = "The peak at 3.477 keV went to Si+Si sum, which explains it better (gain there 24509 against 4106)." region2(beta'' 300 counts/px).proposal.candidates[5].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[5].explainedBySumPeak = "Si+Si sum" region2(beta'' 300 counts/px).proposal.candidates[6].element = "Cd" region2(beta'' 300 counts/px).proposal.candidates[6].group = "Cd_La" region2(beta'' 300 counts/px).proposal.candidates[6].energyKeV = 40091205bc01a36e 3.1337999999999999 @@ -162,6 +168,7 @@ region2(beta'' 300 counts/px).proposal.candidates[6].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[6].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[6].possibleReason = "The peak at 3.477 keV went to Si+Si sum, which explains it better (gain there 24509 against 4481)." region2(beta'' 300 counts/px).proposal.candidates[6].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[6].explainedBySumPeak = "Si+Si sum" region2(beta'' 300 counts/px).proposal.candidates[7].element = "Ru" region2(beta'' 300 counts/px).proposal.candidates[7].group = "Ru_La" region2(beta'' 300 counts/px).proposal.candidates[7].energyKeV = 400477ced916872b 2.5585 @@ -188,6 +195,7 @@ region2(beta'' 300 counts/px).proposal.candidates[7].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[7].familyNote = "Ru Kα (19.28 keV) has a residual peak of 1.7 σ, below the 3 σ its Lα (2.56 keV) needs: not Ru." region2(beta'' 300 counts/px).proposal.candidates[7].possibleReason = nil region2(beta'' 300 counts/px).proposal.candidates[7].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[7].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.candidates[8].element = "Bi" region2(beta'' 300 counts/px).proposal.candidates[8].group = "Bi_Ma" region2(beta'' 300 counts/px).proposal.candidates[8].energyKeV = 400360aa64c2f838 2.4222000000000001 @@ -203,6 +211,7 @@ region2(beta'' 300 counts/px).proposal.candidates[8].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[8].familyNote = "Bi Lα (10.84 keV) has a residual peak of 2.4 σ, below the 3 σ its Mβ (2.53 keV) needs: not Bi." region2(beta'' 300 counts/px).proposal.candidates[8].possibleReason = nil region2(beta'' 300 counts/px).proposal.candidates[8].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[8].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.candidates[9].element = "Cu" region2(beta'' 300 counts/px).proposal.candidates[9].group = "Cu_Ka" region2(beta'' 300 counts/px).proposal.candidates[9].energyKeV = 402018793dd97f63 8.0478000000000005 @@ -227,6 +236,7 @@ region2(beta'' 300 counts/px).proposal.candidates[9].misfit = 3ff0000000000000 1 region2(beta'' 300 counts/px).proposal.candidates[9].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[9].possibleReason = nil region2(beta'' 300 counts/px).proposal.candidates[9].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[9].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.candidates[10].element = "Cl" region2(beta'' 300 counts/px).proposal.candidates[10].group = "Cl_Ka" region2(beta'' 300 counts/px).proposal.candidates[10].energyKeV = 4004faacd9e83e42 2.6223999999999998 @@ -242,6 +252,7 @@ region2(beta'' 300 counts/px).proposal.candidates[10].misfit = 3ff0000000000000 region2(beta'' 300 counts/px).proposal.candidates[10].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[10].possibleReason = "The peak at 2.737 keV went to Al+Mg sum, which explains it better (gain there 33387 against 1009)." region2(beta'' 300 counts/px).proposal.candidates[10].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[10].explainedBySumPeak = "Al+Mg sum" region2(beta'' 300 counts/px).proposal.candidates[11].element = "K" region2(beta'' 300 counts/px).proposal.candidates[11].group = "K_Ka" region2(beta'' 300 counts/px).proposal.candidates[11].energyKeV = 400a82a9930be0df 3.3138000000000001 @@ -257,6 +268,7 @@ region2(beta'' 300 counts/px).proposal.candidates[11].misfit = 3ff0000000000000 region2(beta'' 300 counts/px).proposal.candidates[11].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[11].possibleReason = "The peak at 3.477 keV went to Si+Si sum, which explains it better (gain there 24509 against 337)." region2(beta'' 300 counts/px).proposal.candidates[11].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[11].explainedBySumPeak = "Si+Si sum" region2(beta'' 300 counts/px).proposal.candidates[12].element = "Ta" region2(beta'' 300 counts/px).proposal.candidates[12].group = "Ta_La" region2(beta'' 300 counts/px).proposal.candidates[12].energyKeV = 40204ac083126e98 8.1460000000000008 @@ -272,6 +284,7 @@ region2(beta'' 300 counts/px).proposal.candidates[12].misfit = 3ff0000000000000 region2(beta'' 300 counts/px).proposal.candidates[12].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[12].possibleReason = "Adding it improves the fit by 13, below the 100 a new line needs." region2(beta'' 300 counts/px).proposal.candidates[12].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[12].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.candidates[13].element = "Tm" region2(beta'' 300 counts/px).proposal.candidates[13].group = "Tm_La" region2(beta'' 300 counts/px).proposal.candidates[13].energyKeV = 401cb8a0902de00d 7.1802999999999999 @@ -287,6 +300,7 @@ region2(beta'' 300 counts/px).proposal.candidates[13].misfit = 3ff0000000000000 region2(beta'' 300 counts/px).proposal.candidates[13].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[13].possibleReason = "Adding it improves the fit by 13, below the 100 a new line needs." region2(beta'' 300 counts/px).proposal.candidates[13].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[13].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.candidates[14].element = "Hf" region2(beta'' 300 counts/px).proposal.candidates[14].group = "Hf_La" region2(beta'' 300 counts/px).proposal.candidates[14].energyKeV = 401f989374bc6a7f 7.899 @@ -302,6 +316,7 @@ region2(beta'' 300 counts/px).proposal.candidates[14].misfit = 3ff0000000000000 region2(beta'' 300 counts/px).proposal.candidates[14].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[14].possibleReason = "Adding it improves the fit by 4, below the 100 a new line needs." region2(beta'' 300 counts/px).proposal.candidates[14].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[14].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.candidates[15].element = "Pb" region2(beta'' 300 counts/px).proposal.candidates[15].group = "Pb_Ma" region2(beta'' 300 counts/px).proposal.candidates[15].energyKeV = 4002c467381d7dbf 2.3458999999999999 @@ -317,6 +332,7 @@ region2(beta'' 300 counts/px).proposal.candidates[15].misfit = 3ff0000000000000 region2(beta'' 300 counts/px).proposal.candidates[15].familyNote = "Pb Lα (10.55 keV) has a residual peak of 2.2 σ, below the 3 σ its Mβ (2.44 keV) needs: not Pb." region2(beta'' 300 counts/px).proposal.candidates[15].possibleReason = nil region2(beta'' 300 counts/px).proposal.candidates[15].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[15].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.candidates[16].element = "Sb" region2(beta'' 300 counts/px).proposal.candidates[16].group = "Sb_La" region2(beta'' 300 counts/px).proposal.candidates[16].energyKeV = 400cd66cf41f212d 3.6046999999999998 @@ -332,6 +348,7 @@ region2(beta'' 300 counts/px).proposal.candidates[16].misfit = 3ff0000000000000 region2(beta'' 300 counts/px).proposal.candidates[16].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[16].possibleReason = "Adding it improves the fit by 7, below the 100 a new line needs." region2(beta'' 300 counts/px).proposal.candidates[16].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[16].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.candidates[17].element = "Er" region2(beta'' 300 counts/px).proposal.candidates[17].group = "Er_La" region2(beta'' 300 counts/px).proposal.candidates[17].energyKeV = 401bcb5dcc63f141 6.9485999999999999 @@ -347,6 +364,7 @@ region2(beta'' 300 counts/px).proposal.candidates[17].misfit = 3ff0000000000000 region2(beta'' 300 counts/px).proposal.candidates[17].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[17].possibleReason = "Adding it improves the fit by 2, below the 100 a new line needs." region2(beta'' 300 counts/px).proposal.candidates[17].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[17].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.candidates[18].element = "Ho" region2(beta'' 300 counts/px).proposal.candidates[18].group = "Ho_La" region2(beta'' 300 counts/px).proposal.candidates[18].energyKeV = 401ae0f9096bb98c 6.7196999999999996 @@ -362,6 +380,7 @@ region2(beta'' 300 counts/px).proposal.candidates[18].misfit = 3ff0000000000000 region2(beta'' 300 counts/px).proposal.candidates[18].familyNote = nil region2(beta'' 300 counts/px).proposal.candidates[18].possibleReason = "Adding it improves the fit by 1, below the 100 a new line needs." region2(beta'' 300 counts/px).proposal.candidates[18].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[18].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.candidates[19].element = "Mo" region2(beta'' 300 counts/px).proposal.candidates[19].group = "Mo_La" region2(beta'' 300 counts/px).proposal.candidates[19].energyKeV = 400258793dd97f63 2.2932000000000001 @@ -389,6 +408,7 @@ region2(beta'' 300 counts/px).proposal.candidates[19].misfit = 3ff0000000000000 region2(beta'' 300 counts/px).proposal.candidates[19].familyNote = "Mo Kα (17.48 keV) has a residual peak of 1.4 σ, below the 3 σ its Lβ1 (2.39 keV) needs: not Mo." region2(beta'' 300 counts/px).proposal.candidates[19].possibleReason = nil region2(beta'' 300 counts/px).proposal.candidates[19].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[19].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.candidates[20].element = "Tl" region2(beta'' 300 counts/px).proposal.candidates[20].group = "Tl_Ma" region2(beta'' 300 counts/px).proposal.candidates[20].energyKeV = 40022a9930be0ded 2.2707999999999999 @@ -416,6 +436,7 @@ region2(beta'' 300 counts/px).proposal.candidates[20].misfit = 3ff0000000000000 region2(beta'' 300 counts/px).proposal.candidates[20].familyNote = "Tl Lα (10.27 keV) has a residual peak of 1.7 σ, below the 3 σ its Mγ (2.57 keV) needs: not Tl." region2(beta'' 300 counts/px).proposal.candidates[20].possibleReason = nil region2(beta'' 300 counts/px).proposal.candidates[20].unconfirmable = false +region2(beta'' 300 counts/px).proposal.candidates[20].explainedBySumPeak = nil region2(beta'' 300 counts/px).proposal.sumPeaks: array 5 region2(beta'' 300 counts/px).proposal.sumPeaks[0].label = "Al+Al sum" region2(beta'' 300 counts/px).proposal.sumPeaks[0].elements: array 2 @@ -474,7 +495,7 @@ region2(beta'' 300 counts/px).proposal.refused[6].element = "N" region2(beta'' 300 counts/px).proposal.refused[6].reason = "Its line at 0.39 keV lies below the proposer's lowest tested line (0.45 keV): under the detector window the continuum is too model-dependent for a net area to be trusted. List it by hand if you know it is there." region2(beta'' 300 counts/px).proposal.currie.alpha = 3fa999999999999a 0.050000000000000003 region2(beta'' 300 counts/px).proposal.currie.beta = 3fa999999999999a 0.050000000000000003 -region2(beta'' 300 counts/px).proposal.notes: array 12 +region2(beta'' 300 counts/px).proposal.notes: array 15 region2(beta'' 300 counts/px).proposal.notes[0] = "Lines below 0.45 keV are not tested (a measured limit of the continuum model, not a property of the method)." region2(beta'' 300 counts/px).proposal.notes[1] = "Identification (validation: none): the residual's peaks at or above 5 σ of its top-hat filter (1.5 × below 1 keV); a candidate joins when Σ(y − μ)²/(μ + (0.01 μ)²) falls by at least 100, 20 % of that at its own lines, with its area at or above Currie L_D (α = β = 0.05, σ₀ from the fit's own variance with it absent) and no line against it; the final fit drops what it does not need (100). Kβ weights from NIST EPQ in this fit." region2(beta'' 300 counts/px).proposal.notes[2] = "Fit: least squares, weighted by 1/(y + (0.01 y)²) to decide, least squares, unweighted for the numbers shown; continuum: Kramers×Bernstein(9,5), split at 1.5596 keV (step broadened by the detector resolution); orders chosen on synthetic data; escape peaks: fitted for 1 line group above the Si K edge (1.839 keV); reference shapes: none; 6 residual peaks examined, 38 candidate fits, 41 fits in all." @@ -484,9 +505,12 @@ region2(beta'' 300 counts/px).proposal.notes[5] = "Confirmation withheld Bi: Bi region2(beta'' 300 counts/px).proposal.notes[6] = "Confirmation withheld Pb: Pb Lα (10.55 keV) has a residual peak of 2.2 σ, below the 3 σ its Mβ (2.44 keV) needs: not Pb." region2(beta'' 300 counts/px).proposal.notes[7] = "Confirmation withheld Mo: Mo Kα (17.48 keV) has a residual peak of 1.4 σ, below the 3 σ its Lβ1 (2.39 keV) needs: not Mo." region2(beta'' 300 counts/px).proposal.notes[8] = "Confirmation withheld Tl: Tl Lα (10.27 keV) has a residual peak of 1.7 σ, below the 3 σ its Mγ (2.57 keV) needs: not Tl." -region2(beta'' 300 counts/px).proposal.notes[9] = "Look-elsewhere: 38 candidates were tested, so about 0.02 chance passes of the area bar alone are expected; the gain and confirmation bars stand beside it." -region2(beta'' 300 counts/px).proposal.notes[10] = "Cu_Ka: Si-escape/parent ratio 22.5 % exceeds 5 %: an unmodelled line near the escape energy is likely (the 5 % flag is a sanity bound; the SDD Si escape is about 1 % at Cu Kα)" -region2(beta'' 300 counts/px).proposal.notes[11] = "a weak line next to Al Kα reads low by ≈ 300 counts per pooled spectrum on synthetic data (cause: the Al Kα incomplete-charge tail, unmodelled until a tail is measured on an Al matrix, `TailEstimate`); unmeasured on real data. Weak-line bias measured on synthetic data: Δ = −270 ± 31 counts at 900 planted Mg Kα (generator A, no tail: continuum–line projection) and −272 ± 23 at 882 (generator S); −325 ± 38 at 3000 (A) and −226 ± 22 at 2899 (S)" +region2(beta'' 300 counts/px).proposal.notes[9] = "Explained as pile-up (validation: none): Rh, Pd, Cl lost the peak they were tested on to the Al+Mg sum column, which the final fit keeps at or above its detection limit; they are not possible elements." +region2(beta'' 300 counts/px).proposal.notes[10] = "Explained as pile-up (validation: none): Ar lost the peak they were tested on to the Al+Si sum column, which the final fit keeps at or above its detection limit; they are not possible elements." +region2(beta'' 300 counts/px).proposal.notes[11] = "Explained as pile-up (validation: none): In, Sn, Ag, Cd, K lost the peak they were tested on to the Si+Si sum column, which the final fit keeps at or above its detection limit; they are not possible elements." +region2(beta'' 300 counts/px).proposal.notes[12] = "Look-elsewhere: 38 candidates were tested, so about 0.02 chance passes of the area bar alone are expected; the gain and confirmation bars stand beside it." +region2(beta'' 300 counts/px).proposal.notes[13] = "Cu_Ka: Si-escape/parent ratio 22.5 % exceeds 5 %: an unmodelled line near the escape energy is likely (the 5 % flag is a sanity bound; the SDD Si escape is about 1 % at Cu Kα)" +region2(beta'' 300 counts/px).proposal.notes[14] = "a weak line next to Al Kα reads low by ≈ 300 counts per pooled spectrum on synthetic data (cause: the Al Kα incomplete-charge tail, unmodelled until a tail is measured on an Al matrix, `TailEstimate`); unmeasured on real data. Weak-line bias measured on synthetic data: Δ = −270 ± 31 counts at 900 planted Mg Kα (generator A, no tail: continuum–line projection) and −272 ± 23 at 882 (generator S); −325 ± 38 at 3000 (A) and −226 ± 22 at 2899 (S)" region2(beta'' 300 counts/px).proposal.passes = 41 region2(beta'' 300 counts/px).proposal.settled = true region2(beta'' 300 counts/px).proposal.reducedChiSquared = 3ff099f33b7c33b4 1.0375854800833908 diff --git a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-realistic-l-sim.txt b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-realistic-l-sim.txt index 55d1077..c11c447 100644 --- a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-realistic-l-sim.txt +++ b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-realistic-l-sim.txt @@ -1044,6 +1044,7 @@ seed0.four.unlistedProposal.candidates[0].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[0].familyNote = nil seed0.four.unlistedProposal.candidates[0].possibleReason = nil seed0.four.unlistedProposal.candidates[0].unconfirmable = false +seed0.four.unlistedProposal.candidates[0].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[1].element = "Ga" seed0.four.unlistedProposal.candidates[1].group = "Ga_La" seed0.four.unlistedProposal.candidates[1].energyKeV = 3ff1916872b020c5 1.0980000000000001 @@ -1069,6 +1070,7 @@ seed0.four.unlistedProposal.candidates[1].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[1].familyNote = nil seed0.four.unlistedProposal.candidates[1].possibleReason = nil seed0.four.unlistedProposal.candidates[1].unconfirmable = false +seed0.four.unlistedProposal.candidates[1].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[2].element = "Cu" seed0.four.unlistedProposal.candidates[2].group = "Cu_Ka" seed0.four.unlistedProposal.candidates[2].energyKeV = 402018793dd97f63 8.0478000000000005 @@ -1105,6 +1107,7 @@ seed0.four.unlistedProposal.candidates[2].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[2].familyNote = nil seed0.four.unlistedProposal.candidates[2].possibleReason = nil seed0.four.unlistedProposal.candidates[2].unconfirmable = false +seed0.four.unlistedProposal.candidates[2].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[3].element = "Pr" seed0.four.unlistedProposal.candidates[3].group = "Pr_Ma" seed0.four.unlistedProposal.candidates[3].energyKeV = 3fec985f06f69446 0.89359999999999995 @@ -1120,6 +1123,7 @@ seed0.four.unlistedProposal.candidates[3].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[3].familyNote = "Pr Lα (5.03 keV) has a residual peak of 1.7 σ, below the 3 σ its Mγ (1.13 keV) needs: not Pr." seed0.four.unlistedProposal.candidates[3].possibleReason = nil seed0.four.unlistedProposal.candidates[3].unconfirmable = false +seed0.four.unlistedProposal.candidates[3].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[4].element = "Eu" seed0.four.unlistedProposal.candidates[4].group = "Eu_Ma" seed0.four.unlistedProposal.candidates[4].energyKeV = 3ff195e9e1b089a0 1.0991 @@ -1135,6 +1139,7 @@ seed0.four.unlistedProposal.candidates[4].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[4].familyNote = "Eu Lα (5.85 keV) has a residual peak of 0.5 σ, below the 3 σ its Mα (1.10 keV) needs: not Eu." seed0.four.unlistedProposal.candidates[4].possibleReason = nil seed0.four.unlistedProposal.candidates[4].unconfirmable = false +seed0.four.unlistedProposal.candidates[4].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[5].element = "Sm" seed0.four.unlistedProposal.candidates[5].group = "Sm_Ma" seed0.four.unlistedProposal.candidates[5].energyKeV = 3ff0af4f0d844d01 1.0427999999999999 @@ -1161,6 +1166,7 @@ seed0.four.unlistedProposal.candidates[5].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[5].familyNote = "Sm Lα (5.64 keV) has a residual peak of 1.0 σ, below the 3 σ its Mβ (1.10 keV) needs: not Sm." seed0.four.unlistedProposal.candidates[5].possibleReason = nil seed0.four.unlistedProposal.candidates[5].unconfirmable = false +seed0.four.unlistedProposal.candidates[5].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[6].element = "Rb" seed0.four.unlistedProposal.candidates[6].group = "Rb_La" seed0.four.unlistedProposal.candidates[6].energyKeV = 3ffb1b089a027525 1.6940999999999999 @@ -1188,6 +1194,7 @@ seed0.four.unlistedProposal.candidates[6].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[6].familyNote = nil seed0.four.unlistedProposal.candidates[6].possibleReason = "The peak at 1.748 keV went to Ta, which explains it better (gain there 117 against 79)." seed0.four.unlistedProposal.candidates[6].unconfirmable = false +seed0.four.unlistedProposal.candidates[6].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[7].element = "Nd" seed0.four.unlistedProposal.candidates[7].group = "Nd_Ma" seed0.four.unlistedProposal.candidates[7].energyKeV = 3fee161e4f765fd9 0.94020000000000004 @@ -1203,6 +1210,7 @@ seed0.four.unlistedProposal.candidates[7].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[7].familyNote = "Nd Lα (5.23 keV) has a residual peak of 0.6 σ, below the 3 σ its Mβ (1.00 keV) needs: not Nd." seed0.four.unlistedProposal.candidates[7].possibleReason = nil seed0.four.unlistedProposal.candidates[7].unconfirmable = false +seed0.four.unlistedProposal.candidates[7].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[8].element = "Ce" seed0.four.unlistedProposal.candidates[8].group = "Ce_Ma" seed0.four.unlistedProposal.candidates[8].energyKeV = 3feb0e5604189375 0.84550000000000003 @@ -1218,6 +1226,7 @@ seed0.four.unlistedProposal.candidates[8].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[8].familyNote = "Ce Lα (4.84 keV) has a residual peak of 0.0 σ, below the 3 σ its Mγ (1.08 keV) needs: not Ce." seed0.four.unlistedProposal.candidates[8].possibleReason = nil seed0.four.unlistedProposal.candidates[8].unconfirmable = false +seed0.four.unlistedProposal.candidates[8].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[9].element = "Hf" seed0.four.unlistedProposal.candidates[9].group = "Hf_Ma" seed0.four.unlistedProposal.candidates[9].energyKeV = 3ffa504816f0068e 1.6446000000000001 @@ -1245,6 +1254,7 @@ seed0.four.unlistedProposal.candidates[9].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[9].familyNote = "Hf Lα (7.90 keV) has a residual peak of 0.0 σ, below the 3 σ its Mβ (1.70 keV) needs: not Hf." seed0.four.unlistedProposal.candidates[9].possibleReason = nil seed0.four.unlistedProposal.candidates[9].unconfirmable = false +seed0.four.unlistedProposal.candidates[9].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[10].element = "Zr" seed0.four.unlistedProposal.candidates[10].group = "Zr_La" seed0.four.unlistedProposal.candidates[10].energyKeV = 400056a161e4f766 2.0423 @@ -1272,6 +1282,7 @@ seed0.four.unlistedProposal.candidates[10].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[10].familyNote = "Zr Kα (15.78 keV) has a residual peak of 1.3 σ, below the 3 σ its Lα (2.04 keV) needs: not Zr." seed0.four.unlistedProposal.candidates[10].possibleReason = nil seed0.four.unlistedProposal.candidates[10].unconfirmable = false +seed0.four.unlistedProposal.candidates[10].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[11].element = "Ta" seed0.four.unlistedProposal.candidates[11].group = "Ta_Ma" seed0.four.unlistedProposal.candidates[11].energyKeV = 3ffb5c91d14e3bcd 1.7101 @@ -1299,6 +1310,7 @@ seed0.four.unlistedProposal.candidates[11].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[11].familyNote = nil seed0.four.unlistedProposal.candidates[11].possibleReason = nil seed0.four.unlistedProposal.candidates[11].unconfirmable = false +seed0.four.unlistedProposal.candidates[11].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[12].element = "P" seed0.four.unlistedProposal.candidates[12].group = "P_Ka" seed0.four.unlistedProposal.candidates[12].energyKeV = 40001b3d07c84b5e 2.0133000000000001 @@ -1326,6 +1338,7 @@ seed0.four.unlistedProposal.candidates[12].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[12].familyNote = nil seed0.four.unlistedProposal.candidates[12].possibleReason = "Adding it improves the fit by 8, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[12].unconfirmable = false +seed0.four.unlistedProposal.candidates[12].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[13].element = "Hg" seed0.four.unlistedProposal.candidates[13].group = "Hg_La" seed0.four.unlistedProposal.candidates[13].energyKeV = 4023fa5e353f7cee 9.9890000000000008 @@ -1341,6 +1354,7 @@ seed0.four.unlistedProposal.candidates[13].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[13].familyNote = nil seed0.four.unlistedProposal.candidates[13].possibleReason = "The peak at 9.888 keV went to Ge, which explains it better (gain there 16900529 against 1753845)." seed0.four.unlistedProposal.candidates[13].unconfirmable = false +seed0.four.unlistedProposal.candidates[13].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[14].element = "Gd" seed0.four.unlistedProposal.candidates[14].group = "Gd_Ma" seed0.four.unlistedProposal.candidates[14].energyKeV = 3ff2d3ae685db76b 1.1766799999999999 @@ -1356,6 +1370,7 @@ seed0.four.unlistedProposal.candidates[14].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[14].familyNote = "Gd Lα (6.06 keV) has a residual peak of 0.0 σ, below the 3 σ its Mα (1.18 keV) needs: not Gd." seed0.four.unlistedProposal.candidates[14].possibleReason = nil seed0.four.unlistedProposal.candidates[14].unconfirmable = false +seed0.four.unlistedProposal.candidates[14].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[15].element = "Lu" seed0.four.unlistedProposal.candidates[15].group = "Lu_La" seed0.four.unlistedProposal.candidates[15].energyKeV = 401e9f559b3d07c8 7.6555999999999997 @@ -1371,6 +1386,7 @@ seed0.four.unlistedProposal.candidates[15].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[15].familyNote = nil seed0.four.unlistedProposal.candidates[15].possibleReason = "Adding it improves the fit by 73, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[15].unconfirmable = false +seed0.four.unlistedProposal.candidates[15].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[16].element = "Ho" seed0.four.unlistedProposal.candidates[16].group = "Ho_La" seed0.four.unlistedProposal.candidates[16].energyKeV = 401ae0f9096bb98c 6.7196999999999996 @@ -1386,6 +1402,7 @@ seed0.four.unlistedProposal.candidates[16].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[16].familyNote = nil seed0.four.unlistedProposal.candidates[16].possibleReason = "Adding it improves the fit by 7, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[16].unconfirmable = false +seed0.four.unlistedProposal.candidates[16].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[17].element = "Zn" seed0.four.unlistedProposal.candidates[17].group = "Zn_Ka" seed0.four.unlistedProposal.candidates[17].energyKeV = 4021471de69ad42c 8.6388999999999996 @@ -1413,6 +1430,7 @@ seed0.four.unlistedProposal.candidates[17].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[17].familyNote = nil seed0.four.unlistedProposal.candidates[17].possibleReason = "Adding it improves the fit by 12, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[17].unconfirmable = false +seed0.four.unlistedProposal.candidates[17].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[18].element = "Re" seed0.four.unlistedProposal.candidates[18].group = "Re_La" seed0.four.unlistedProposal.candidates[18].energyKeV = 40214e075f6fd220 8.6524000000000001 @@ -1440,6 +1458,7 @@ seed0.four.unlistedProposal.candidates[18].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[18].familyNote = nil seed0.four.unlistedProposal.candidates[18].possibleReason = "Adding it improves the fit by 6, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[18].unconfirmable = false +seed0.four.unlistedProposal.candidates[18].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[19].element = "Tm" seed0.four.unlistedProposal.candidates[19].group = "Tm_La" seed0.four.unlistedProposal.candidates[19].energyKeV = 401cb8a0902de00d 7.1802999999999999 @@ -1455,6 +1474,7 @@ seed0.four.unlistedProposal.candidates[19].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[19].familyNote = nil seed0.four.unlistedProposal.candidates[19].possibleReason = "Adding it improves the fit by 7, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[19].unconfirmable = false +seed0.four.unlistedProposal.candidates[19].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[20].element = "Se" seed0.four.unlistedProposal.candidates[20].group = "Se_Ka" seed0.four.unlistedProposal.candidates[20].energyKeV = 402671a9fbe76c8b 11.222 @@ -1470,6 +1490,7 @@ seed0.four.unlistedProposal.candidates[20].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[20].familyNote = nil seed0.four.unlistedProposal.candidates[20].possibleReason = "Adding it improves the fit by 2, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[20].unconfirmable = false +seed0.four.unlistedProposal.candidates[20].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[21].element = "Tb" seed0.four.unlistedProposal.candidates[21].group = "Tb_La" seed0.four.unlistedProposal.candidates[21].energyKeV = 40191758e219652c 6.2728000000000002 @@ -1509,6 +1530,7 @@ seed0.four.unlistedProposal.candidates[21].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[21].familyNote = nil seed0.four.unlistedProposal.candidates[21].possibleReason = "Adding it improves the fit by 4, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[21].unconfirmable = false +seed0.four.unlistedProposal.candidates[21].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[22].element = "Ir" seed0.four.unlistedProposal.candidates[22].group = "Ir_La" seed0.four.unlistedProposal.candidates[22].energyKeV = 4022597f62b6ae7d 9.1747999999999994 @@ -1548,6 +1570,7 @@ seed0.four.unlistedProposal.candidates[22].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[22].familyNote = nil seed0.four.unlistedProposal.candidates[22].possibleReason = "Adding it improves the fit by 2, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[22].unconfirmable = false +seed0.four.unlistedProposal.candidates[22].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[23].element = "Dy" seed0.four.unlistedProposal.candidates[23].group = "Dy_La" seed0.four.unlistedProposal.candidates[23].energyKeV = 4019fb15b573eab3 6.4951999999999996 @@ -1563,6 +1586,7 @@ seed0.four.unlistedProposal.candidates[23].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[23].familyNote = nil seed0.four.unlistedProposal.candidates[23].possibleReason = "Adding it improves the fit by 0, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[23].unconfirmable = false +seed0.four.unlistedProposal.candidates[23].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[24].element = "Au" seed0.four.unlistedProposal.candidates[24].group = "Au_La" seed0.four.unlistedProposal.candidates[24].energyKeV = 40236d0e56041893 9.7129999999999992 @@ -1578,6 +1602,7 @@ seed0.four.unlistedProposal.candidates[24].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[24].familyNote = nil seed0.four.unlistedProposal.candidates[24].possibleReason = "Its area 0 is below its detection limit 278." seed0.four.unlistedProposal.candidates[24].unconfirmable = false +seed0.four.unlistedProposal.candidates[24].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[25].element = "Bi" seed0.four.unlistedProposal.candidates[25].group = "Bi_La" seed0.four.unlistedProposal.candidates[25].energyKeV = 4025ad916872b021 10.839 @@ -1593,6 +1618,7 @@ seed0.four.unlistedProposal.candidates[25].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[25].familyNote = nil seed0.four.unlistedProposal.candidates[25].possibleReason = "Adding it improves the fit by 16, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[25].unconfirmable = false +seed0.four.unlistedProposal.candidates[25].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[26].element = "Er" seed0.four.unlistedProposal.candidates[26].group = "Er_La" seed0.four.unlistedProposal.candidates[26].energyKeV = 401bcb5dcc63f141 6.9485999999999999 @@ -1608,6 +1634,7 @@ seed0.four.unlistedProposal.candidates[26].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[26].familyNote = nil seed0.four.unlistedProposal.candidates[26].possibleReason = "Only -45 % of its gain 589 is at its own lines (20 % needed): it mostly reshapes the background." seed0.four.unlistedProposal.candidates[26].unconfirmable = false +seed0.four.unlistedProposal.candidates[26].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[27].element = "La" seed0.four.unlistedProposal.candidates[27].group = "La_Ma" seed0.four.unlistedProposal.candidates[27].energyKeV = 3fea27525460aa65 0.81730000000000003 @@ -1623,6 +1650,7 @@ seed0.four.unlistedProposal.candidates[27].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[27].familyNote = "La Lα (4.65 keV) has a residual peak of 1.2 σ, below the 3 σ its Mγ (1.02 keV) needs: not La." seed0.four.unlistedProposal.candidates[27].possibleReason = nil seed0.four.unlistedProposal.candidates[27].unconfirmable = false +seed0.four.unlistedProposal.candidates[27].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[28].element = "Na" seed0.four.unlistedProposal.candidates[28].group = "Na_Ka" seed0.four.unlistedProposal.candidates[28].energyKeV = 3ff0a7ef9db22d0e 1.0409999999999999 @@ -1649,6 +1677,7 @@ seed0.four.unlistedProposal.candidates[28].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[28].familyNote = nil seed0.four.unlistedProposal.candidates[28].possibleReason = "Adding it improves the fit by 0, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[28].unconfirmable = false +seed0.four.unlistedProposal.candidates[28].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[29].element = "Os" seed0.four.unlistedProposal.candidates[29].group = "Os_La" seed0.four.unlistedProposal.candidates[29].energyKeV = 4021d25460aa64c3 8.9108000000000001 @@ -1664,6 +1693,7 @@ seed0.four.unlistedProposal.candidates[29].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[29].familyNote = nil seed0.four.unlistedProposal.candidates[29].possibleReason = "Adding it improves the fit by 2, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[29].unconfirmable = false +seed0.four.unlistedProposal.candidates[29].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[30].element = "Pt" seed0.four.unlistedProposal.candidates[30].group = "Pt_La" seed0.four.unlistedProposal.candidates[30].energyKeV = 4022e25aee631f8a 9.4420999999999999 @@ -1679,6 +1709,7 @@ seed0.four.unlistedProposal.candidates[30].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[30].familyNote = nil seed0.four.unlistedProposal.candidates[30].possibleReason = "Adding it improves the fit by 61, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[30].unconfirmable = false +seed0.four.unlistedProposal.candidates[30].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[31].element = "Sr" seed0.four.unlistedProposal.candidates[31].group = "Sr_La" seed0.four.unlistedProposal.candidates[31].energyKeV = 3ffce76c8b439581 1.8065 @@ -1705,6 +1736,7 @@ seed0.four.unlistedProposal.candidates[31].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[31].familyNote = "Sr Kα (14.16 keV) has a residual peak of 0.0 σ, below the 3 σ its Lα (1.81 keV) needs: not Sr." seed0.four.unlistedProposal.candidates[31].possibleReason = nil seed0.four.unlistedProposal.candidates[31].unconfirmable = false +seed0.four.unlistedProposal.candidates[31].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[32].element = "W" seed0.four.unlistedProposal.candidates[32].group = "W_La" seed0.four.unlistedProposal.candidates[32].energyKeV = 4020cb923a29c77a 8.3976000000000006 @@ -1732,6 +1764,7 @@ seed0.four.unlistedProposal.candidates[32].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[32].familyNote = nil seed0.four.unlistedProposal.candidates[32].possibleReason = "Adding it improves the fit by 3, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[32].unconfirmable = false +seed0.four.unlistedProposal.candidates[32].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[33].element = "Y" seed0.four.unlistedProposal.candidates[33].group = "Y_La" seed0.four.unlistedProposal.candidates[33].energyKeV = 3ffec2f837b4a234 1.9226000000000001 @@ -1747,6 +1780,7 @@ seed0.four.unlistedProposal.candidates[33].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[33].familyNote = "Y Kα (14.96 keV) has a residual peak of 0.9 σ, below the 3 σ its Lα (1.92 keV) needs: not Y." seed0.four.unlistedProposal.candidates[33].possibleReason = nil seed0.four.unlistedProposal.candidates[33].unconfirmable = false +seed0.four.unlistedProposal.candidates[33].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[34].element = "Yb" seed0.four.unlistedProposal.candidates[34].group = "Yb_La" seed0.four.unlistedProposal.candidates[34].energyKeV = 401da9c779a6b50b 7.4157999999999999 @@ -1762,6 +1796,7 @@ seed0.four.unlistedProposal.candidates[34].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[34].familyNote = nil seed0.four.unlistedProposal.candidates[34].possibleReason = "Adding it improves the fit by 18, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[34].unconfirmable = false +seed0.four.unlistedProposal.candidates[34].explainedBySumPeak = nil seed0.four.unlistedProposal.sumPeaks: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 seed0.four.unlistedProposal.refused: array 7 seed0.four.unlistedProposal.refused[0].element = "H" diff --git a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-unlisted-sim.txt b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-unlisted-sim.txt index bbbb8b8..acdb14f 100644 --- a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-unlisted-sim.txt +++ b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-unlisted-sim.txt @@ -347,6 +347,7 @@ seed0.four.unlistedProposal.candidates[0].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[0].familyNote = nil seed0.four.unlistedProposal.candidates[0].possibleReason = nil seed0.four.unlistedProposal.candidates[0].unconfirmable = false +seed0.four.unlistedProposal.candidates[0].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[1].element = "Ga" seed0.four.unlistedProposal.candidates[1].group = "Ga_La" seed0.four.unlistedProposal.candidates[1].energyKeV = 3ff1916872b020c5 1.0980000000000001 @@ -372,6 +373,7 @@ seed0.four.unlistedProposal.candidates[1].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[1].familyNote = nil seed0.four.unlistedProposal.candidates[1].possibleReason = nil seed0.four.unlistedProposal.candidates[1].unconfirmable = false +seed0.four.unlistedProposal.candidates[1].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[2].element = "Cu" seed0.four.unlistedProposal.candidates[2].group = "Cu_Ka" seed0.four.unlistedProposal.candidates[2].energyKeV = 402018793dd97f63 8.0478000000000005 @@ -408,6 +410,7 @@ seed0.four.unlistedProposal.candidates[2].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[2].familyNote = nil seed0.four.unlistedProposal.candidates[2].possibleReason = nil seed0.four.unlistedProposal.candidates[2].unconfirmable = false +seed0.four.unlistedProposal.candidates[2].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[3].element = "Eu" seed0.four.unlistedProposal.candidates[3].group = "Eu_Ma" seed0.four.unlistedProposal.candidates[3].energyKeV = 3ff195e9e1b089a0 1.0991 @@ -423,6 +426,7 @@ seed0.four.unlistedProposal.candidates[3].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[3].familyNote = "Eu Lα (5.85 keV) has a residual peak of 0.0 σ, below the 3 σ its Mα (1.10 keV) needs: not Eu." seed0.four.unlistedProposal.candidates[3].possibleReason = nil seed0.four.unlistedProposal.candidates[3].unconfirmable = false +seed0.four.unlistedProposal.candidates[3].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[4].element = "Sm" seed0.four.unlistedProposal.candidates[4].group = "Sm_Ma" seed0.four.unlistedProposal.candidates[4].energyKeV = 3ff0af4f0d844d01 1.0427999999999999 @@ -438,6 +442,7 @@ seed0.four.unlistedProposal.candidates[4].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[4].familyNote = "Sm Lα (5.64 keV) has a residual peak of 0.0 σ, below the 3 σ its Mβ (1.10 keV) needs: not Sm." seed0.four.unlistedProposal.candidates[4].possibleReason = nil seed0.four.unlistedProposal.candidates[4].unconfirmable = false +seed0.four.unlistedProposal.candidates[4].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[5].element = "Pr" seed0.four.unlistedProposal.candidates[5].group = "Pr_Ma" seed0.four.unlistedProposal.candidates[5].energyKeV = 3fec985f06f69446 0.89359999999999995 @@ -453,6 +458,7 @@ seed0.four.unlistedProposal.candidates[5].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[5].familyNote = "Pr Lα (5.03 keV) has a residual peak of 0.0 σ, below the 3 σ its Mγ (1.13 keV) needs: not Pr." seed0.four.unlistedProposal.candidates[5].possibleReason = nil seed0.four.unlistedProposal.candidates[5].unconfirmable = false +seed0.four.unlistedProposal.candidates[5].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[6].element = "Na" seed0.four.unlistedProposal.candidates[6].group = "Na_Ka" seed0.four.unlistedProposal.candidates[6].energyKeV = 3ff0a7ef9db22d0e 1.0409999999999999 @@ -479,6 +485,7 @@ seed0.four.unlistedProposal.candidates[6].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[6].familyNote = nil seed0.four.unlistedProposal.candidates[6].possibleReason = "Adding it improves the fit by -13411, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[6].unconfirmable = false +seed0.four.unlistedProposal.candidates[6].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[7].element = "Ce" seed0.four.unlistedProposal.candidates[7].group = "Ce_Ma" seed0.four.unlistedProposal.candidates[7].energyKeV = 3feb0e5604189375 0.84550000000000003 @@ -494,6 +501,7 @@ seed0.four.unlistedProposal.candidates[7].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[7].familyNote = "Ce Lα (4.84 keV) has a residual peak of 0.5 σ, below the 3 σ its Mγ (1.08 keV) needs: not Ce." seed0.four.unlistedProposal.candidates[7].possibleReason = nil seed0.four.unlistedProposal.candidates[7].unconfirmable = false +seed0.four.unlistedProposal.candidates[7].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[8].element = "Rb" seed0.four.unlistedProposal.candidates[8].group = "Rb_La" seed0.four.unlistedProposal.candidates[8].energyKeV = 3ffb1b089a027525 1.6940999999999999 @@ -521,6 +529,7 @@ seed0.four.unlistedProposal.candidates[8].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[8].familyNote = "Rb Kα (13.40 keV) has a residual peak of 0.0 σ, below the 3 σ its Lβ1 (1.75 keV) needs: not Rb." seed0.four.unlistedProposal.candidates[8].possibleReason = nil seed0.four.unlistedProposal.candidates[8].unconfirmable = false +seed0.four.unlistedProposal.candidates[8].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[9].element = "Ta" seed0.four.unlistedProposal.candidates[9].group = "Ta_Ma" seed0.four.unlistedProposal.candidates[9].energyKeV = 3ffb5c91d14e3bcd 1.7101 @@ -548,6 +557,7 @@ seed0.four.unlistedProposal.candidates[9].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[9].familyNote = "Ta Lα (8.15 keV) has a residual peak of 0.0 σ, below the 3 σ its Mβ (1.77 keV) needs: not Ta." seed0.four.unlistedProposal.candidates[9].possibleReason = nil seed0.four.unlistedProposal.candidates[9].unconfirmable = false +seed0.four.unlistedProposal.candidates[9].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[10].element = "Zr" seed0.four.unlistedProposal.candidates[10].group = "Zr_La" seed0.four.unlistedProposal.candidates[10].energyKeV = 400056a161e4f766 2.0423 @@ -575,6 +585,7 @@ seed0.four.unlistedProposal.candidates[10].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[10].familyNote = "Zr Kα (15.78 keV) has a residual peak of 0.0 σ, below the 3 σ its Lα (2.04 keV) needs: not Zr." seed0.four.unlistedProposal.candidates[10].possibleReason = nil seed0.four.unlistedProposal.candidates[10].unconfirmable = false +seed0.four.unlistedProposal.candidates[10].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[11].element = "P" seed0.four.unlistedProposal.candidates[11].group = "P_Ka" seed0.four.unlistedProposal.candidates[11].energyKeV = 40001b3d07c84b5e 2.0133000000000001 @@ -602,6 +613,7 @@ seed0.four.unlistedProposal.candidates[11].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[11].familyNote = nil seed0.four.unlistedProposal.candidates[11].possibleReason = "Adding it improves the fit by 11, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[11].unconfirmable = false +seed0.four.unlistedProposal.candidates[11].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[12].element = "Gd" seed0.four.unlistedProposal.candidates[12].group = "Gd_Ma" seed0.four.unlistedProposal.candidates[12].energyKeV = 3ff2d3ae685db76b 1.1766799999999999 @@ -617,6 +629,7 @@ seed0.four.unlistedProposal.candidates[12].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[12].familyNote = "Gd Lα (6.06 keV) has a residual peak of 0.5 σ, below the 3 σ its Mα (1.18 keV) needs: not Gd." seed0.four.unlistedProposal.candidates[12].possibleReason = nil seed0.four.unlistedProposal.candidates[12].unconfirmable = false +seed0.four.unlistedProposal.candidates[12].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[13].element = "Hg" seed0.four.unlistedProposal.candidates[13].group = "Hg_La" seed0.four.unlistedProposal.candidates[13].energyKeV = 4023fa5e353f7cee 9.9890000000000008 @@ -632,6 +645,7 @@ seed0.four.unlistedProposal.candidates[13].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[13].familyNote = nil seed0.four.unlistedProposal.candidates[13].possibleReason = "The peak at 9.888 keV went to Ge, which explains it better (gain there 16113088 against 1417710)." seed0.four.unlistedProposal.candidates[13].unconfirmable = false +seed0.four.unlistedProposal.candidates[13].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[14].element = "Lu" seed0.four.unlistedProposal.candidates[14].group = "Lu_La" seed0.four.unlistedProposal.candidates[14].energyKeV = 401e9f559b3d07c8 7.6555999999999997 @@ -647,6 +661,7 @@ seed0.four.unlistedProposal.candidates[14].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[14].familyNote = nil seed0.four.unlistedProposal.candidates[14].possibleReason = "Adding it improves the fit by 22, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[14].unconfirmable = false +seed0.four.unlistedProposal.candidates[14].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[15].element = "Hf" seed0.four.unlistedProposal.candidates[15].group = "Hf_La" seed0.four.unlistedProposal.candidates[15].energyKeV = 401f989374bc6a7f 7.899 @@ -662,6 +677,7 @@ seed0.four.unlistedProposal.candidates[15].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[15].familyNote = nil seed0.four.unlistedProposal.candidates[15].possibleReason = "Adding it improves the fit by 23, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[15].unconfirmable = false +seed0.four.unlistedProposal.candidates[15].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[16].element = "Dy" seed0.four.unlistedProposal.candidates[16].group = "Dy_La" seed0.four.unlistedProposal.candidates[16].energyKeV = 4019fb15b573eab3 6.4951999999999996 @@ -677,6 +693,7 @@ seed0.four.unlistedProposal.candidates[16].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[16].familyNote = nil seed0.four.unlistedProposal.candidates[16].possibleReason = "Adding it improves the fit by 3, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[16].unconfirmable = false +seed0.four.unlistedProposal.candidates[16].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[17].element = "Tm" seed0.four.unlistedProposal.candidates[17].group = "Tm_La" seed0.four.unlistedProposal.candidates[17].energyKeV = 401cb8a0902de00d 7.1802999999999999 @@ -692,6 +709,7 @@ seed0.four.unlistedProposal.candidates[17].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[17].familyNote = nil seed0.four.unlistedProposal.candidates[17].possibleReason = "Adding it improves the fit by 2, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[17].unconfirmable = false +seed0.four.unlistedProposal.candidates[17].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[18].element = "Zn" seed0.four.unlistedProposal.candidates[18].group = "Zn_Ka" seed0.four.unlistedProposal.candidates[18].energyKeV = 4021471de69ad42c 8.6388999999999996 @@ -719,6 +737,7 @@ seed0.four.unlistedProposal.candidates[18].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[18].familyNote = nil seed0.four.unlistedProposal.candidates[18].possibleReason = "Adding it improves the fit by 2, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[18].unconfirmable = false +seed0.four.unlistedProposal.candidates[18].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[19].element = "Se" seed0.four.unlistedProposal.candidates[19].group = "Se_Ka" seed0.four.unlistedProposal.candidates[19].energyKeV = 402671a9fbe76c8b 11.222 @@ -734,6 +753,7 @@ seed0.four.unlistedProposal.candidates[19].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[19].familyNote = nil seed0.four.unlistedProposal.candidates[19].possibleReason = "Adding it improves the fit by 6, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[19].unconfirmable = false +seed0.four.unlistedProposal.candidates[19].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[20].element = "Ho" seed0.four.unlistedProposal.candidates[20].group = "Ho_La" seed0.four.unlistedProposal.candidates[20].energyKeV = 401ae0f9096bb98c 6.7196999999999996 @@ -749,6 +769,7 @@ seed0.four.unlistedProposal.candidates[20].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[20].familyNote = nil seed0.four.unlistedProposal.candidates[20].possibleReason = "Adding it improves the fit by 0, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[20].unconfirmable = false +seed0.four.unlistedProposal.candidates[20].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[21].element = "Tb" seed0.four.unlistedProposal.candidates[21].group = "Tb_La" seed0.four.unlistedProposal.candidates[21].energyKeV = 40191758e219652c 6.2728000000000002 @@ -776,6 +797,7 @@ seed0.four.unlistedProposal.candidates[21].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[21].familyNote = nil seed0.four.unlistedProposal.candidates[21].possibleReason = "Adding it improves the fit by 0, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[21].unconfirmable = false +seed0.four.unlistedProposal.candidates[21].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[22].element = "Re" seed0.four.unlistedProposal.candidates[22].group = "Re_La" seed0.four.unlistedProposal.candidates[22].energyKeV = 40214e075f6fd220 8.6524000000000001 @@ -803,6 +825,7 @@ seed0.four.unlistedProposal.candidates[22].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[22].familyNote = nil seed0.four.unlistedProposal.candidates[22].possibleReason = "Adding it improves the fit by 1, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[22].unconfirmable = false +seed0.four.unlistedProposal.candidates[22].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[23].element = "Au" seed0.four.unlistedProposal.candidates[23].group = "Au_La" seed0.four.unlistedProposal.candidates[23].energyKeV = 40236d0e56041893 9.7129999999999992 @@ -818,6 +841,7 @@ seed0.four.unlistedProposal.candidates[23].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[23].familyNote = nil seed0.four.unlistedProposal.candidates[23].possibleReason = "Its area 0 is below its detection limit 281." seed0.four.unlistedProposal.candidates[23].unconfirmable = false +seed0.four.unlistedProposal.candidates[23].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[24].element = "Bi" seed0.four.unlistedProposal.candidates[24].group = "Bi_La" seed0.four.unlistedProposal.candidates[24].energyKeV = 4025ad916872b021 10.839 @@ -833,6 +857,7 @@ seed0.four.unlistedProposal.candidates[24].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[24].familyNote = nil seed0.four.unlistedProposal.candidates[24].possibleReason = "Adding it improves the fit by -0, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[24].unconfirmable = false +seed0.four.unlistedProposal.candidates[24].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[25].element = "Er" seed0.four.unlistedProposal.candidates[25].group = "Er_La" seed0.four.unlistedProposal.candidates[25].energyKeV = 401bcb5dcc63f141 6.9485999999999999 @@ -848,6 +873,7 @@ seed0.four.unlistedProposal.candidates[25].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[25].familyNote = nil seed0.four.unlistedProposal.candidates[25].possibleReason = "Adding it improves the fit by -2724, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[25].unconfirmable = false +seed0.four.unlistedProposal.candidates[25].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[26].element = "Ir" seed0.four.unlistedProposal.candidates[26].group = "Ir_La" seed0.four.unlistedProposal.candidates[26].energyKeV = 4022597f62b6ae7d 9.1747999999999994 @@ -875,6 +901,7 @@ seed0.four.unlistedProposal.candidates[26].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[26].familyNote = nil seed0.four.unlistedProposal.candidates[26].possibleReason = "Adding it improves the fit by 9, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[26].unconfirmable = false +seed0.four.unlistedProposal.candidates[26].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[27].element = "La" seed0.four.unlistedProposal.candidates[27].group = "La_Ma" seed0.four.unlistedProposal.candidates[27].energyKeV = 3fea27525460aa65 0.81730000000000003 @@ -890,6 +917,7 @@ seed0.four.unlistedProposal.candidates[27].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[27].familyNote = "La Lα (4.65 keV) has a residual peak of 1.4 σ, below the 3 σ its Mγ (1.02 keV) needs: not La." seed0.four.unlistedProposal.candidates[27].possibleReason = nil seed0.four.unlistedProposal.candidates[27].unconfirmable = false +seed0.four.unlistedProposal.candidates[27].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[28].element = "Nd" seed0.four.unlistedProposal.candidates[28].group = "Nd_Ma" seed0.four.unlistedProposal.candidates[28].energyKeV = 3fee161e4f765fd9 0.94020000000000004 @@ -905,6 +933,7 @@ seed0.four.unlistedProposal.candidates[28].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[28].familyNote = "Nd Lα (5.23 keV) has a residual peak of 0.0 σ, below the 3 σ its Mβ (1.00 keV) needs: not Nd." seed0.four.unlistedProposal.candidates[28].possibleReason = nil seed0.four.unlistedProposal.candidates[28].unconfirmable = false +seed0.four.unlistedProposal.candidates[28].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[29].element = "Os" seed0.four.unlistedProposal.candidates[29].group = "Os_La" seed0.four.unlistedProposal.candidates[29].energyKeV = 4021d25460aa64c3 8.9108000000000001 @@ -920,6 +949,7 @@ seed0.four.unlistedProposal.candidates[29].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[29].familyNote = nil seed0.four.unlistedProposal.candidates[29].possibleReason = "Adding it improves the fit by -0, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[29].unconfirmable = false +seed0.four.unlistedProposal.candidates[29].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[30].element = "Pt" seed0.four.unlistedProposal.candidates[30].group = "Pt_La" seed0.four.unlistedProposal.candidates[30].energyKeV = 4022e25aee631f8a 9.4420999999999999 @@ -935,6 +965,7 @@ seed0.four.unlistedProposal.candidates[30].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[30].familyNote = nil seed0.four.unlistedProposal.candidates[30].possibleReason = "Adding it improves the fit by 43, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[30].unconfirmable = false +seed0.four.unlistedProposal.candidates[30].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[31].element = "Sr" seed0.four.unlistedProposal.candidates[31].group = "Sr_La" seed0.four.unlistedProposal.candidates[31].energyKeV = 3ffce76c8b439581 1.8065 @@ -961,6 +992,7 @@ seed0.four.unlistedProposal.candidates[31].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[31].familyNote = "Sr Kα (14.16 keV) has a residual peak of 0.8 σ, below the 3 σ its Lα (1.81 keV) needs: not Sr." seed0.four.unlistedProposal.candidates[31].possibleReason = nil seed0.four.unlistedProposal.candidates[31].unconfirmable = false +seed0.four.unlistedProposal.candidates[31].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[32].element = "W" seed0.four.unlistedProposal.candidates[32].group = "W_La" seed0.four.unlistedProposal.candidates[32].energyKeV = 4020cb923a29c77a 8.3976000000000006 @@ -988,6 +1020,7 @@ seed0.four.unlistedProposal.candidates[32].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[32].familyNote = nil seed0.four.unlistedProposal.candidates[32].possibleReason = "Adding it improves the fit by 1, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[32].unconfirmable = false +seed0.four.unlistedProposal.candidates[32].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[33].element = "Y" seed0.four.unlistedProposal.candidates[33].group = "Y_La" seed0.four.unlistedProposal.candidates[33].energyKeV = 3ffec2f837b4a234 1.9226000000000001 @@ -1003,6 +1036,7 @@ seed0.four.unlistedProposal.candidates[33].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[33].familyNote = "Y Kα (14.96 keV) has a residual peak of 0.4 σ, below the 3 σ its Lα (1.92 keV) needs: not Y." seed0.four.unlistedProposal.candidates[33].possibleReason = nil seed0.four.unlistedProposal.candidates[33].unconfirmable = false +seed0.four.unlistedProposal.candidates[33].explainedBySumPeak = nil seed0.four.unlistedProposal.candidates[34].element = "Yb" seed0.four.unlistedProposal.candidates[34].group = "Yb_La" seed0.four.unlistedProposal.candidates[34].energyKeV = 401da9c779a6b50b 7.4157999999999999 @@ -1018,6 +1052,7 @@ seed0.four.unlistedProposal.candidates[34].misfit = 3ff0000000000000 1 seed0.four.unlistedProposal.candidates[34].familyNote = nil seed0.four.unlistedProposal.candidates[34].possibleReason = "Adding it improves the fit by 11, below the 100 a new line needs." seed0.four.unlistedProposal.candidates[34].unconfirmable = false +seed0.four.unlistedProposal.candidates[34].explainedBySumPeak = nil seed0.four.unlistedProposal.sumPeaks: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 seed0.four.unlistedProposal.refused: array 7 seed0.four.unlistedProposal.refused[0].element = "H" @@ -1573,6 +1608,7 @@ seed0.seven.unlistedProposal.candidates[0].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[0].familyNote = "Rb Kα (13.40 keV) has a residual peak of 0.0 σ, below the 3 σ its Lβ1 (1.75 keV) needs: not Rb." seed0.seven.unlistedProposal.candidates[0].possibleReason = nil seed0.seven.unlistedProposal.candidates[0].unconfirmable = false +seed0.seven.unlistedProposal.candidates[0].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[1].element = "Pt" seed0.seven.unlistedProposal.candidates[1].group = "Pt_Ma" seed0.seven.unlistedProposal.candidates[1].energyKeV = 4000676c8b439581 2.0505 @@ -1600,6 +1636,7 @@ seed0.seven.unlistedProposal.candidates[1].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[1].familyNote = "Pt Lα (9.44 keV) has a residual peak of 0.0 σ, below the 3 σ its Mα (2.05 keV) needs: not Pt." seed0.seven.unlistedProposal.candidates[1].possibleReason = nil seed0.seven.unlistedProposal.candidates[1].unconfirmable = false +seed0.seven.unlistedProposal.candidates[1].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[2].element = "Au" seed0.seven.unlistedProposal.candidates[2].group = "Au_Ma" seed0.seven.unlistedProposal.candidates[2].energyKeV = 4000fbb2fec56d5d 2.1229 @@ -1627,6 +1664,7 @@ seed0.seven.unlistedProposal.candidates[2].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[2].familyNote = "Au Lα (9.71 keV) has a residual peak of 0.0 σ, below the 3 σ its Mα (2.12 keV) needs: not Au." seed0.seven.unlistedProposal.candidates[2].possibleReason = nil seed0.seven.unlistedProposal.candidates[2].unconfirmable = false +seed0.seven.unlistedProposal.candidates[2].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[3].element = "Zr" seed0.seven.unlistedProposal.candidates[3].group = "Zr_La" seed0.seven.unlistedProposal.candidates[3].energyKeV = 400056a161e4f766 2.0423 @@ -1654,6 +1692,7 @@ seed0.seven.unlistedProposal.candidates[3].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[3].familyNote = "Zr Kα (15.78 keV) has a residual peak of 0.0 σ, below the 3 σ its Lα (2.04 keV) needs: not Zr." seed0.seven.unlistedProposal.candidates[3].possibleReason = nil seed0.seven.unlistedProposal.candidates[3].unconfirmable = false +seed0.seven.unlistedProposal.candidates[3].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[4].element = "Nb" seed0.seven.unlistedProposal.candidates[4].group = "Nb_La" seed0.seven.unlistedProposal.candidates[4].energyKeV = 400153c36113404f 2.1659000000000002 @@ -1692,6 +1731,7 @@ seed0.seven.unlistedProposal.candidates[4].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[4].familyNote = "Nb Kα (16.62 keV) has a residual peak of 0.0 σ, below the 3 σ its Lα (2.17 keV) needs: not Nb." seed0.seven.unlistedProposal.candidates[4].possibleReason = nil seed0.seven.unlistedProposal.candidates[4].unconfirmable = false +seed0.seven.unlistedProposal.candidates[4].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[5].element = "Ta" seed0.seven.unlistedProposal.candidates[5].group = "Ta_Ma" seed0.seven.unlistedProposal.candidates[5].energyKeV = 3ffb5c91d14e3bcd 1.7101 @@ -1719,6 +1759,7 @@ seed0.seven.unlistedProposal.candidates[5].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[5].familyNote = nil seed0.seven.unlistedProposal.candidates[5].possibleReason = nil seed0.seven.unlistedProposal.candidates[5].unconfirmable = false +seed0.seven.unlistedProposal.candidates[5].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[6].element = "Er" seed0.seven.unlistedProposal.candidates[6].group = "Er_La" seed0.seven.unlistedProposal.candidates[6].energyKeV = 401bcb5dcc63f141 6.9485999999999999 @@ -1734,6 +1775,7 @@ seed0.seven.unlistedProposal.candidates[6].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[6].familyNote = nil seed0.seven.unlistedProposal.candidates[6].possibleReason = "Adding it improves the fit by 15, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[6].unconfirmable = false +seed0.seven.unlistedProposal.candidates[6].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[7].element = "Lu" seed0.seven.unlistedProposal.candidates[7].group = "Lu_La" seed0.seven.unlistedProposal.candidates[7].energyKeV = 401e9f559b3d07c8 7.6555999999999997 @@ -1749,6 +1791,7 @@ seed0.seven.unlistedProposal.candidates[7].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[7].familyNote = nil seed0.seven.unlistedProposal.candidates[7].possibleReason = "Adding it improves the fit by 34, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[7].unconfirmable = false +seed0.seven.unlistedProposal.candidates[7].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[8].element = "Hf" seed0.seven.unlistedProposal.candidates[8].group = "Hf_La" seed0.seven.unlistedProposal.candidates[8].energyKeV = 401f989374bc6a7f 7.899 @@ -1764,6 +1807,7 @@ seed0.seven.unlistedProposal.candidates[8].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[8].familyNote = nil seed0.seven.unlistedProposal.candidates[8].possibleReason = "Adding it improves the fit by 14, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[8].unconfirmable = false +seed0.seven.unlistedProposal.candidates[8].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[9].element = "Hg" seed0.seven.unlistedProposal.candidates[9].group = "Hg_La" seed0.seven.unlistedProposal.candidates[9].energyKeV = 4023fa5e353f7cee 9.9890000000000008 @@ -1779,6 +1823,7 @@ seed0.seven.unlistedProposal.candidates[9].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[9].familyNote = nil seed0.seven.unlistedProposal.candidates[9].possibleReason = "Adding it improves the fit by 24, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[9].unconfirmable = false +seed0.seven.unlistedProposal.candidates[9].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[10].element = "Se" seed0.seven.unlistedProposal.candidates[10].group = "Se_Ka" seed0.seven.unlistedProposal.candidates[10].energyKeV = 402671a9fbe76c8b 11.222 @@ -1794,6 +1839,7 @@ seed0.seven.unlistedProposal.candidates[10].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[10].familyNote = nil seed0.seven.unlistedProposal.candidates[10].possibleReason = "Adding it improves the fit by 12, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[10].unconfirmable = false +seed0.seven.unlistedProposal.candidates[10].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[11].element = "Zn" seed0.seven.unlistedProposal.candidates[11].group = "Zn_Ka" seed0.seven.unlistedProposal.candidates[11].energyKeV = 4021471de69ad42c 8.6388999999999996 @@ -1821,6 +1867,7 @@ seed0.seven.unlistedProposal.candidates[11].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[11].familyNote = nil seed0.seven.unlistedProposal.candidates[11].possibleReason = "Adding it improves the fit by 8, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[11].unconfirmable = false +seed0.seven.unlistedProposal.candidates[11].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[12].element = "Tm" seed0.seven.unlistedProposal.candidates[12].group = "Tm_La" seed0.seven.unlistedProposal.candidates[12].energyKeV = 401cb8a0902de00d 7.1802999999999999 @@ -1836,6 +1883,7 @@ seed0.seven.unlistedProposal.candidates[12].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[12].familyNote = nil seed0.seven.unlistedProposal.candidates[12].possibleReason = "Adding it improves the fit by 3, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[12].unconfirmable = false +seed0.seven.unlistedProposal.candidates[12].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[13].element = "Dy" seed0.seven.unlistedProposal.candidates[13].group = "Dy_La" seed0.seven.unlistedProposal.candidates[13].energyKeV = 4019fb15b573eab3 6.4951999999999996 @@ -1851,6 +1899,7 @@ seed0.seven.unlistedProposal.candidates[13].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[13].familyNote = nil seed0.seven.unlistedProposal.candidates[13].possibleReason = "Adding it improves the fit by 3, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[13].unconfirmable = false +seed0.seven.unlistedProposal.candidates[13].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[14].element = "Re" seed0.seven.unlistedProposal.candidates[14].group = "Re_La" seed0.seven.unlistedProposal.candidates[14].energyKeV = 40214e075f6fd220 8.6524000000000001 @@ -1878,6 +1927,7 @@ seed0.seven.unlistedProposal.candidates[14].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[14].familyNote = nil seed0.seven.unlistedProposal.candidates[14].possibleReason = "Adding it improves the fit by 3, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[14].unconfirmable = false +seed0.seven.unlistedProposal.candidates[14].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[15].element = "Ho" seed0.seven.unlistedProposal.candidates[15].group = "Ho_La" seed0.seven.unlistedProposal.candidates[15].energyKeV = 401ae0f9096bb98c 6.7196999999999996 @@ -1893,6 +1943,7 @@ seed0.seven.unlistedProposal.candidates[15].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[15].familyNote = nil seed0.seven.unlistedProposal.candidates[15].possibleReason = "Adding it improves the fit by 2, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[15].unconfirmable = false +seed0.seven.unlistedProposal.candidates[15].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[16].element = "Tb" seed0.seven.unlistedProposal.candidates[16].group = "Tb_La" seed0.seven.unlistedProposal.candidates[16].energyKeV = 40191758e219652c 6.2728000000000002 @@ -1932,6 +1983,7 @@ seed0.seven.unlistedProposal.candidates[16].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[16].familyNote = nil seed0.seven.unlistedProposal.candidates[16].possibleReason = "Adding it improves the fit by 1, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[16].unconfirmable = false +seed0.seven.unlistedProposal.candidates[16].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[17].element = "Bi" seed0.seven.unlistedProposal.candidates[17].group = "Bi_La" seed0.seven.unlistedProposal.candidates[17].energyKeV = 4025ad916872b021 10.839 @@ -1947,6 +1999,7 @@ seed0.seven.unlistedProposal.candidates[17].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[17].familyNote = nil seed0.seven.unlistedProposal.candidates[17].possibleReason = "Adding it improves the fit by 17, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[17].unconfirmable = false +seed0.seven.unlistedProposal.candidates[17].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[18].element = "Ir" seed0.seven.unlistedProposal.candidates[18].group = "Ir_Ma" seed0.seven.unlistedProposal.candidates[18].energyKeV = 3fffadab9f559b3d 1.9799 @@ -1974,6 +2027,7 @@ seed0.seven.unlistedProposal.candidates[18].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[18].familyNote = "Ir Lα (9.17 keV) has a residual peak of 0.0 σ, below the 3 σ its Mβ (2.05 keV) needs: not Ir." seed0.seven.unlistedProposal.candidates[18].possibleReason = nil seed0.seven.unlistedProposal.candidates[18].unconfirmable = false +seed0.seven.unlistedProposal.candidates[18].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[19].element = "Os" seed0.seven.unlistedProposal.candidates[19].group = "Os_Ma" seed0.seven.unlistedProposal.candidates[19].energyKeV = 3ffe9eecbfb15b57 1.9137999999999999 @@ -2000,6 +2054,7 @@ seed0.seven.unlistedProposal.candidates[19].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[19].familyNote = "Os Lα (8.91 keV) has a residual peak of 0.0 σ, below the 3 σ its Mβ (1.98 keV) needs: not Os." seed0.seven.unlistedProposal.candidates[19].possibleReason = nil seed0.seven.unlistedProposal.candidates[19].unconfirmable = false +seed0.seven.unlistedProposal.candidates[19].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[20].element = "P" seed0.seven.unlistedProposal.candidates[20].group = "P_Ka" seed0.seven.unlistedProposal.candidates[20].energyKeV = 40001b3d07c84b5e 2.0133000000000001 @@ -2027,6 +2082,7 @@ seed0.seven.unlistedProposal.candidates[20].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[20].familyNote = nil seed0.seven.unlistedProposal.candidates[20].possibleReason = "Adding it improves the fit by 2, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[20].unconfirmable = false +seed0.seven.unlistedProposal.candidates[20].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[21].element = "Sr" seed0.seven.unlistedProposal.candidates[21].group = "Sr_La" seed0.seven.unlistedProposal.candidates[21].energyKeV = 3ffce76c8b439581 1.8065 @@ -2053,6 +2109,7 @@ seed0.seven.unlistedProposal.candidates[21].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[21].familyNote = "Sr Kα (14.16 keV) has a residual peak of 0.8 σ, below the 3 σ its Lα (1.81 keV) needs: not Sr." seed0.seven.unlistedProposal.candidates[21].possibleReason = nil seed0.seven.unlistedProposal.candidates[21].unconfirmable = false +seed0.seven.unlistedProposal.candidates[21].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[22].element = "W" seed0.seven.unlistedProposal.candidates[22].group = "W_La" seed0.seven.unlistedProposal.candidates[22].energyKeV = 4020cb923a29c77a 8.3976000000000006 @@ -2080,6 +2137,7 @@ seed0.seven.unlistedProposal.candidates[22].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[22].familyNote = nil seed0.seven.unlistedProposal.candidates[22].possibleReason = "Adding it improves the fit by 1, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[22].unconfirmable = false +seed0.seven.unlistedProposal.candidates[22].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[23].element = "Y" seed0.seven.unlistedProposal.candidates[23].group = "Y_La" seed0.seven.unlistedProposal.candidates[23].energyKeV = 3ffec2f837b4a234 1.9226000000000001 @@ -2095,6 +2153,7 @@ seed0.seven.unlistedProposal.candidates[23].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[23].familyNote = "Y Kα (14.96 keV) has a residual peak of 0.3 σ, below the 3 σ its Lβ1 (2.00 keV) needs: not Y." seed0.seven.unlistedProposal.candidates[23].possibleReason = nil seed0.seven.unlistedProposal.candidates[23].unconfirmable = false +seed0.seven.unlistedProposal.candidates[23].explainedBySumPeak = nil seed0.seven.unlistedProposal.candidates[24].element = "Yb" seed0.seven.unlistedProposal.candidates[24].group = "Yb_La" seed0.seven.unlistedProposal.candidates[24].energyKeV = 401da9c779a6b50b 7.4157999999999999 @@ -2110,6 +2169,7 @@ seed0.seven.unlistedProposal.candidates[24].misfit = 3ff0000000000000 1 seed0.seven.unlistedProposal.candidates[24].familyNote = nil seed0.seven.unlistedProposal.candidates[24].possibleReason = "Adding it improves the fit by 13, below the 100 a new line needs." seed0.seven.unlistedProposal.candidates[24].unconfirmable = false +seed0.seven.unlistedProposal.candidates[24].explainedBySumPeak = nil seed0.seven.unlistedProposal.sumPeaks: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 seed0.seven.unlistedProposal.refused: array 7 seed0.seven.unlistedProposal.refused[0].element = "H" From 6e2f954de2a8e79602cbd71ed489ee49bf997342 Mon Sep 17 00:00:00 2001 From: Paullo9 Date: Sun, 1 Nov 2026 14:46:45 +0100 Subject: [PATCH 6/7] fix: pile-up notes drop the validation tag The Auto ID note for elements explained by a sum peak now reads "Explained as pile-up: ..." with no validation tag; the rest of the sentence is unchanged. DemoEDXAutoIDTests asserts the note carries no "(validation" text (red before, green after). Done: the pile-up note has no validation tag. Next: re-record the goldens. Co-Authored-By: Claude Opus 5.5 --- Sources/SpectroEDX/Proposer/ElementProposer.swift | 2 +- Tests/SpectroEDXTests/DemoEDXAutoIDTests.swift | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Sources/SpectroEDX/Proposer/ElementProposer.swift b/Sources/SpectroEDX/Proposer/ElementProposer.swift index d2d3695..a3b237c 100644 --- a/Sources/SpectroEDX/Proposer/ElementProposer.swift +++ b/Sources/SpectroEDX/Proposer/ElementProposer.swift @@ -787,7 +787,7 @@ public nonisolated struct ElementProposer: Sendable { } for label in Set(candidates.compactMap(\.explainedBySumPeak)).sorted() { let els = candidates.filter { $0.explainedBySumPeak == label }.map(\.element) - notes.append("Explained as pile-up (validation: none): \(els.joined(separator: ", ")) lost the peak they were tested on to the \(label) column, which the final fit keeps at or above its detection limit; they are not possible elements.") + notes.append("Explained as pile-up: \(els.joined(separator: ", ")) lost the peak they were tested on to the \(label) column, which the final fit keeps at or above its detection limit; they are not possible elements.") } if overlapCheck { notes.append(String(format: "Overlap check (validation: none): every element whose lines all sit under modelled lines was fitted once with the settled model; %d reached L_D with a gain of at least %.0f and are possible only.", overlapFinds.count, t.minimumGain)) diff --git a/Tests/SpectroEDXTests/DemoEDXAutoIDTests.swift b/Tests/SpectroEDXTests/DemoEDXAutoIDTests.swift index 80c1566..d91c829 100644 --- a/Tests/SpectroEDXTests/DemoEDXAutoIDTests.swift +++ b/Tests/SpectroEDXTests/DemoEDXAutoIDTests.swift @@ -33,7 +33,9 @@ struct DemoEDXAutoIDTests { #expect(c.explainedBySumPeak == "Al+Al sum", "\(name): \(el) \(c.explainedBySumPeak ?? "nil")") #expect(c.hasSumPeakQuestion, "\(name): \(el) has no Al+Al conflict") } - #expect(p.notes.contains { $0.hasPrefix("Explained as pile-up") && $0.contains("Ar") && $0.contains("Al+Al sum") }, "\(name): \(p.notes)") + #expect(p.notes.contains { $0.hasPrefix("Explained as pile-up: ") && $0.contains("Ar") && $0.contains("Al+Al sum") }, "\(name): \(p.notes)") + // The pile-up note carries no validation tag. + #expect(!p.notes.contains { $0.hasPrefix("Explained as pile-up") && $0.contains("(validation") }, "\(name): \(p.notes)") // Explained is its own tier: never possible, proposed or withheld. for c in p.explainedBySumPeaks { #expect(!c.isProposed && c.familyNote == nil && !p.possible.contains(c)) From 2ba17d7fdd6dbb65eebb16338daf2fd2b26fbee4 Mon Sep 17 00:00:00 2001 From: Paullo9 Date: Sun, 1 Nov 2026 14:46:52 +0100 Subject: [PATCH 7/7] test: re-record the spectro goldens after the pile-up note drops its tag Recorded from the code with SPECTRO_GOLDEN_DIR into a temporary folder and copied in. The only change is the three pile-up notes in the eds-proposer-sim region2 proposal; no numeric line and no csv hash moves. Done: goldens match the code. Next: CI on the branch. Co-Authored-By: Claude Opus 5.5 --- .../Fixtures/spectro-golden/eds-proposer-sim.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-proposer-sim.txt b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-proposer-sim.txt index 3721aee..d9cccd9 100644 --- a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-proposer-sim.txt +++ b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-proposer-sim.txt @@ -505,9 +505,9 @@ region2(beta'' 300 counts/px).proposal.notes[5] = "Confirmation withheld Bi: Bi region2(beta'' 300 counts/px).proposal.notes[6] = "Confirmation withheld Pb: Pb Lα (10.55 keV) has a residual peak of 2.2 σ, below the 3 σ its Mβ (2.44 keV) needs: not Pb." region2(beta'' 300 counts/px).proposal.notes[7] = "Confirmation withheld Mo: Mo Kα (17.48 keV) has a residual peak of 1.4 σ, below the 3 σ its Lβ1 (2.39 keV) needs: not Mo." region2(beta'' 300 counts/px).proposal.notes[8] = "Confirmation withheld Tl: Tl Lα (10.27 keV) has a residual peak of 1.7 σ, below the 3 σ its Mγ (2.57 keV) needs: not Tl." -region2(beta'' 300 counts/px).proposal.notes[9] = "Explained as pile-up (validation: none): Rh, Pd, Cl lost the peak they were tested on to the Al+Mg sum column, which the final fit keeps at or above its detection limit; they are not possible elements." -region2(beta'' 300 counts/px).proposal.notes[10] = "Explained as pile-up (validation: none): Ar lost the peak they were tested on to the Al+Si sum column, which the final fit keeps at or above its detection limit; they are not possible elements." -region2(beta'' 300 counts/px).proposal.notes[11] = "Explained as pile-up (validation: none): In, Sn, Ag, Cd, K lost the peak they were tested on to the Si+Si sum column, which the final fit keeps at or above its detection limit; they are not possible elements." +region2(beta'' 300 counts/px).proposal.notes[9] = "Explained as pile-up: Rh, Pd, Cl lost the peak they were tested on to the Al+Mg sum column, which the final fit keeps at or above its detection limit; they are not possible elements." +region2(beta'' 300 counts/px).proposal.notes[10] = "Explained as pile-up: Ar lost the peak they were tested on to the Al+Si sum column, which the final fit keeps at or above its detection limit; they are not possible elements." +region2(beta'' 300 counts/px).proposal.notes[11] = "Explained as pile-up: In, Sn, Ag, Cd, K lost the peak they were tested on to the Si+Si sum column, which the final fit keeps at or above its detection limit; they are not possible elements." region2(beta'' 300 counts/px).proposal.notes[12] = "Look-elsewhere: 38 candidates were tested, so about 0.02 chance passes of the area bar alone are expected; the gain and confirmation bars stand beside it." region2(beta'' 300 counts/px).proposal.notes[13] = "Cu_Ka: Si-escape/parent ratio 22.5 % exceeds 5 %: an unmodelled line near the escape energy is likely (the 5 % flag is a sanity bound; the SDD Si escape is about 1 % at Cu Kα)" region2(beta'' 300 counts/px).proposal.notes[14] = "a weak line next to Al Kα reads low by ≈ 300 counts per pooled spectrum on synthetic data (cause: the Al Kα incomplete-charge tail, unmodelled until a tail is measured on an Al matrix, `TailEstimate`); unmeasured on real data. Weak-line bias measured on synthetic data: Δ = −270 ± 31 counts at 900 planted Mg Kα (generator A, no tail: continuum–line projection) and −272 ± 23 at 882 (generator S); −325 ± 38 at 3000 (A) and −226 ± 22 at 2899 (S)"