From 584d84e5ad360bdd7790b51354ea739b0e5bd1c8 Mon Sep 17 00:00:00 2001 From: Paullo9 Date: Sat, 31 Oct 2026 14:42:04 +0100 Subject: [PATCH 1/5] 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/5] 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 014db3a569c459e9ef9c5eaa2e0f5bf55299b4d8 Mon Sep 17 00:00:00 2001 From: Paullo9 Date: Sat, 31 Oct 2026 20:22:09 +0100 Subject: [PATCH 3/5] feat: opt-in detector-broadened continuum step at absorption edges The default continuum cuts its Bernstein segments at the Al K edge with a jump between two channels. A detector cannot record that: every channel is the incoming spectrum convolved with the resolution (about 75 eV FWHM at 1.56 keV), and the Al K-beta line sits on the edge energy itself. FitPolicy.continuumEdgeStep = .broadened weights each segment by the detector Gaussian step at its edges (Phi_a - Phi_b, sigma from the line-width law at the edge, the line model resolution) and continues each polynomial past its edge at its end value. The weights telescope to 1 and stay non-negative. .sharp stays the default and is the earlier form value for value; the default policy JSON is byte for byte unchanged (the key is written only when not the default; old stored policies decode to .sharp). Measured on the public Leeds pure-Al wedge (Snelson, Collins, MacArthur, doi 10.5518/1826, CC BY 4.0), same refined axis: the model fell 351 counts more than the data across the edge channel pair (42 broadened), the data sat 1677 counts above the model in 1.53-1.65 keV (907) and the model 39 % above the data in 1.65-2.2 keV (19 %). On a generated Al film with a broadened edge a weak Si K-alpha reads -38.7 % sharp and -25.4 % broadened. Done: broadened edge step as an option, tests on a generated spectrum. Next: re-measure the registered synthetic results with a convolved generator and make .broadened the default; the order-5 segment above the edge is the remaining Si lever. Co-Authored-By: Claude Opus 5.5 --- Sources/SpectroEDX/Fit/Continuum.swift | 84 +++++++- Sources/SpectroEDX/Fit/EDSFit.swift | 2 +- Sources/SpectroEDX/Fit/LinearDesign.swift | 2 +- .../Quant/QuantificationPolicy.swift | 51 ++++- .../ContinuumEdgeBroadeningTests.swift | 184 ++++++++++++++++++ docs/parity.md | 5 + 6 files changed, 319 insertions(+), 9 deletions(-) create mode 100644 Tests/SpectroEDXTests/ContinuumEdgeBroadeningTests.swift diff --git a/Sources/SpectroEDX/Fit/Continuum.swift b/Sources/SpectroEDX/Fit/Continuum.swift index a334618..b5b9e42 100644 --- a/Sources/SpectroEDX/Fit/Continuum.swift +++ b/Sources/SpectroEDX/Fit/Continuum.swift @@ -29,6 +29,22 @@ // the model has no nonlinear parameter: n_0 + 1 and n_1 + 1 coefficients, 10 + 6 = 16 by default, all // linear and non-negative. // +// THE STEP SEEN THROUGH THE DETECTOR (opt-in `ContinuumEdgeStep.broadened`): a detector records the incoming spectrum +// convolved with its resolution, so a measured edge is a Gaussian-blurred step (about 75 eV FWHM at 1.56 keV for 128 eV at +// Mn K-alpha), never a jump between two channels. The broadened form weights segment s by +// w_s(E) = Phi((E - a_s) / sigma(a_s)) - Phi((E - b_s) / sigma(b_s)), +// Phi the standard normal CDF, sigma the line-width law's Gaussian sigma at the edge (`XRayLines.fwhm`, the line model's own +// resolution), no factor at the fitted range's ends; each segment's polynomial continues past its edge at its end value +// (t clamped to [0, 1]). The weights sum to 1 whenever every segment holds channels (a segment with none, two edges in one +// channel gap, is skipped and its weight is lost) and are non-negative, so the continuum stays non-negative. This is the step +// convolved with the detector Gaussian when the polynomials are flat across the edge's width. An edge outside the fitted range +// is not modelled, including the blurred tail of a step just outside it. +// Measured: on a pure Al wedge (Titan 200 kV, Super-X; Snelson, Collins, MacArthur, University of Leeds, doi 10.5518/1826, +// CC BY 4.0) the sharp step made the model fall 351 counts more than the data between the channels at 1.559 and 1.564 keV, +// left the data 1677 counts above the model in 1.53-1.65 keV and the model 39 % above the data in 1.65-2.2 keV; broadened: +// 42 counts, 907 counts and 19 %. `.sharp` (the default) is the earlier form, value for value: the kit's registered +// synthetic generators plant an unbroadened step, so making `.broadened` the default re-measures those results first. +// // The Al K edge energy 1.5596 keV is the standard tabulated value (X-ray Data Booklet, Table 1-1). // The Si K edge (1.839 keV, a detector dead-layer step) is NOT in the default: add it to `edges` to test it. // @@ -59,7 +75,7 @@ public nonisolated struct ContinuumForm: Sendable, Equatable { public static func == (a: ContinuumForm, b: ContinuumForm) -> Bool { a.beamEnergy == b.beamEnergy && a.edges == b.edges && a.orders == b.orders && a.nonNegative == b.nonNegative - && sameEfficiency(a.efficiency, b.efficiency) + && sameEfficiency(a.efficiency, b.efficiency) && a.edgeStep == b.edgeStep } /// Beam energy E0 in keV (the continuum ends there). @@ -74,22 +90,27 @@ public nonisolated struct ContinuumForm: Sendable, Equatable { /// roll-off is modelled and P_s only carries what epsilon does not. nil: the round-1 form. The model is generic /// (`DetectorEfficiency`), not a measured Super-X calibration. package var efficiency: (any DetectorEfficiency)? + /// How the step at each edge is drawn: sharp at the edge channel (default) or broadened by the detector resolution. + package var edgeStep: ContinuumEdgeStep package static let alKEdge = FitPolicy.alKEdgeKeV package init(beamEnergy: Double, edges: [Double] = [ContinuumForm.alKEdge], orders: [Int] = [9, 5], - nonNegative: Bool = true, efficiency: (any DetectorEfficiency)? = nil) { + nonNegative: Bool = true, efficiency: (any DetectorEfficiency)? = nil, + edgeStep: ContinuumEdgeStep = .sharp) { precondition(orders.count == edges.count + 1, "ContinuumForm needs one order per segment") precondition(zip(edges, edges.dropFirst()).allSatisfy { $0 < $1 }, "edges ascend") self.beamEnergy = beamEnergy; self.edges = edges; self.orders = orders; self.nonNegative = nonNegative - self.efficiency = efficiency + self.efficiency = efficiency; self.edgeStep = edgeStep } package var coefficientCount: Int { orders.reduce(0) { $0 + $1 + 1 } } /// The basis columns over `energies` (ascending, the fitted channels). A coefficient with no /// support (an empty segment) is not produced. `names` label them for the result. - package func columns(energies: [Double]) -> (values: [[Double]], names: [String]) { + /// `resolutionMnKaEV`: the detector resolution that broadens each edge step (the line model's). nil, or `edgeStep == .sharp`, + /// or no edge inside the range: the sharp form, value for value the form before broadening existed. + package func columns(energies: [Double], resolutionMnKaEV: Double? = nil) -> (values: [[Double]], names: [String]) { guard let lo = energies.first, let hi = energies.last, hi > lo else { return ([], []) } // Segment boundaries inside the fitted range. var bounds = [lo] @@ -99,6 +120,9 @@ public nonisolated struct ContinuumForm: Sendable, Equatable { let eRef = 2.0 let epsRef = efficiency?.efficiency(energyKeV: eRef) ?? 1 let kRef = (beamEnergy - eRef) / eRef * (epsRef > 0 ? epsRef : 1) + if edgeStep == .broadened, let r = resolutionMnKaEV, bounds.count > 2 { + return broadenedColumns(energies: energies, bounds: bounds, segmentIndex: segmentIndex, resolutionMnKaEV: r, kRef: kRef) + } var values: [[Double]] = [], names: [String] = [] for s in 0..<(bounds.count - 1) { let a = bounds[s], b = bounds[s + 1] @@ -126,6 +150,47 @@ public nonisolated struct ContinuumForm: Sendable, Equatable { return (values, names) } + /// The broadened form (header): B(E) = K(E) eps(E) sum_s w_s(E) P_s(clamp(t_s, 0, 1)) / kRef, w_s = Phi_a - Phi_b. + private func broadenedColumns(energies: [Double], bounds: [Double], segmentIndex: [Int], resolutionMnKaEV r: Double, + kRef: Double) -> (values: [[Double]], names: [String]) { + let last = bounds.count - 2 + func sigma(_ e: Double) -> Double { + // A width law with no real width at the edge (a resolution far below the line-width law's floor) falls back to the + // Mn K-alpha width, as the proposer does. + let fwhm = XRayLines.fwhm(resolutionMnKaEV: r, atEnergy: e) ?? r / 1000 + return max(fwhm, 1e-9) / (8 * log(2.0)).squareRoot() + } + func phi(_ z: Double) -> Double { 0.5 * erfc(-z / 2.0.squareRoot()) } + var values: [[Double]] = [], names: [String] = [] + for s in 0...last { + let a = bounds[s], b = bounds[s + 1] + // The order follows the segment's own channels, as in the sharp form. + let own = energies.filter { $0 >= a && (s == last ? $0 <= b : $0 < b) }.count + guard own > 0 else { continue } + let order = min(orders[segmentIndex[s]], own - 1) + let sa = s > 0 ? sigma(a) : 0, sb = s < last ? sigma(b) : 0 + // Phi(lower edge) - Phi(upper edge): the weights telescope to 1 for any number of edges (a product would over-count + // between two close edges); max(0, ...) guards the far tails where the lower edge's sigma is the smaller. + let weight = energies.map { e -> Double in + max(0, (s > 0 ? phi((e - a) / sa) : 1) - (s < last ? phi((e - b) / sb) : 0)) + } + for k in 0...order { + var col = [Double](repeating: 0, count: energies.count) + for (i, e) in energies.enumerated() where weight[i] > 0 { + let t = min(max((e - a) / (b - a), 0), 1) + let basis = nonNegative + ? binomial(order, k) * pow(t, Double(k)) * pow(1 - t, Double(order - k)) + : pow(t, Double(k)) + let eps = efficiency?.efficiency(energyKeV: e) ?? 1 + col[i] = ((beamEnergy - e) / e) * eps / kRef * basis * weight[i] + } + values.append(col) + names.append("continuum s\(segmentIndex[s]) t^\(k)") + } + } + return (values, names) + } + private func binomial(_ n: Int, _ k: Int) -> Double { var r = 1.0 for i in 0.. Double { + guard e >= 0.1 else { return 0 } + let table = MassAbsorptionTable.bundled! + let mu = (try? table.mac(element: "Al", energyKeV: e)) ?? 0 + return 9.0 * (beam - e) / e * exp(-pow(0.35 / e, 2.2)) * exp(-massThickness * mu) + } + + /// `incoming` convolved with the detector's Gaussian, sigma from the line-width law at each energy (counts per channel). + private static let continuum: [Double] = { + let raw = energies.map(incoming) + return energies.indices.map { i in + let e = energies[i] + let fwhm = XRayLines.fwhm(resolutionMnKaEV: resolution, atEnergy: max(e, 0.3)) ?? resolution / 1000 + let sigma = fwhm / (8 * log(2.0)).squareRoot() + let reach = Int((5 * sigma / axis.scale).rounded(.up)) + var sum = 0.0, wsum = 0.0 + for j in max(0, i - reach)...min(axis.size - 1, i + reach) { + let w = exp(-0.5 * pow((energies[j] - e) / sigma, 2)) + sum += w * raw[j]; wsum += w + } + return sum / wsum + } + }() + + private static func lineColumn(_ id: String) -> [Double] { + let el = String(id.prefix { $0 != "_" }) + let g = EDSLineModel.build(elements: [el], axis: axis, beamEnergy: beam, resolutionMnKaEV: resolution).groups.first { $0.id == id }! + return EDSLineModel.column(of: g.lines, energies: energies, scale: axis.scale) + } + + private static let alArea = 3e5, siArea = 2e3 + + private static func spectrum(si: Bool) -> [Double] { + let al = lineColumn("Al_Ka"), s = lineColumn("Si_Ka") + return energies.indices.map { continuum[$0] + alArea * al[$0] + (si ? siArea * s[$0] : 0) } + } + + private static func fit(_ counts: [Double], elements: [String], step: ContinuumEdgeStep) throws -> EDSFitResult { + var policy = FitPolicy() + policy.continuumEdgeStep = step + let s = FitSettings.standard(elements: elements, axis: axis, resolutionMnKaEV: resolution, beamEnergy: beam, policy: policy) + return try EDSFit.run(counts: counts, axis: axis, settings: s, computeCovariance: false) + } + + /// Data minus model summed over [lo, hi) keV, and the data there. + private static func band(_ f: EDSFitResult, _ counts: [Double], _ lo: Double, _ hi: Double) -> (residual: Double, data: Double) { + var r = 0.0, d = 0.0 + for (j, c) in f.channels.enumerated() where energies[c] >= lo && energies[c] < hi { r += f.residual[j]; d += counts[c] } + return (r, d) + } + + private static func worstChannel(_ f: EDSFitResult, _ counts: [Double]) -> Double { + var worst = 0.0 + for (j, c) in f.channels.enumerated() where energies[c] >= 1.50 && energies[c] < 1.70 { worst = max(worst, abs(f.residual[j]) / counts[c]) } + return worst + } + + /// Pure Al, no Si. Broadened: the model in 1.65-2.2 keV (under Si K-alpha) within 0.3 % of the data, and no channel in + /// 1.50-1.70 keV off by 4 % or more. The sharp step fails both on the same spectrum (measured: 0.95 % and 5.5 %), which is the + /// defect this form exists for. Measured broadened: 0.06 % and 3.3 % (the rest is the order-5 segment above the edge). + @Test func testTheBroadenedStepFollowsAResolutionBroadenedAlEdgeAndTheSharpDoesNot() throws { + let counts = Self.spectrum(si: false) + let broad = try Self.fit(counts, elements: ["Al"], step: .broadened) + let sharp = try Self.fit(counts, elements: ["Al"], step: .sharp) + let ab = Self.band(broad, counts, 1.65, 2.2), asharp = Self.band(sharp, counts, 1.65, 2.2) + let wb = Self.worstChannel(broad, counts), ws = Self.worstChannel(sharp, counts) + print(String(format: "EDGE pure Al 1.65-2.2 keV: broadened %+.2f %%, sharp %+.2f %%; worst channel 1.50-1.70: broadened %.2f %%, sharp %.2f %%", + ab.residual / ab.data * 100, asharp.residual / asharp.data * 100, wb * 100, ws * 100)) + #expect(abs(ab.residual) / ab.data < 0.003, "broadened 1.65-2.2 keV: \(ab.residual) of \(ab.data)") + #expect(wb < 0.04, "broadened worst channel \(wb)") + #expect(abs(asharp.residual) / asharp.data >= 0.003 || ws >= 0.04, "the sharp step misfits the broadened edge: \(asharp.residual), \(ws)") + } + + /// A weak Si K-alpha (2000 counts against 3e5 Al K-alpha) above the broadened edge: the sharp step reads it 38.7 % low, the + /// broadened one 25.4 % low (measured). Held: the broadened bias is at most 0.75 of the sharp one, and both are pinned within + /// 2 points so a change either way is looked at. The remaining bias is the order-5 segment above the edge (orders (9, 9) read + /// -8 %), stated, not asserted away; results stay unvalidated. + @Test func testAWeakSiLineAboveTheBroadenedEdgeReadsCloserWithTheBroadenedStep() throws { + let counts = Self.spectrum(si: true) + func si(_ step: ContinuumEdgeStep) throws -> Double { + let f = try Self.fit(counts, elements: ["Al", "Si"], step: step) + return f.values[try #require(f.groupIDs.firstIndex(of: "Si_Ka"))] / Self.siArea - 1 + } + let b = try si(.broadened), s = try si(.sharp) + print(String(format: "EDGE Si bias: broadened %+.2f %%, sharp %+.2f %%", b * 100, s * 100)) + #expect(abs(b) <= 0.75 * abs(s), "broadened \(b) vs sharp \(s)") + #expect(abs(b - -0.254) < 0.02, "broadened Si bias \(b)") + #expect(abs(s - -0.387) < 0.02, "sharp Si bias \(s)") + } + + /// `.sharp` is the default and the form without the broadening: the same columns as a call with no resolution. + @Test func testTheSharpStepIsTheDefaultAndTheUnbroadenedForm() { + let e = Array(Self.energies[40..<4000]) + let sharp = ContinuumForm(beamEnergy: Self.beam) + let broad = ContinuumForm(beamEnergy: Self.beam, edgeStep: .broadened) + #expect(sharp.edgeStep == .sharp) + #expect(sharp.columns(energies: e, resolutionMnKaEV: Self.resolution).values == sharp.columns(energies: e).values) + #expect(broad.columns(energies: e).values == sharp.columns(energies: e).values, "no resolution: the sharp form") + #expect(sharp.columns(energies: e, resolutionMnKaEV: Self.resolution).values != broad.columns(energies: e, resolutionMnKaEV: Self.resolution).values) + #expect(sharp != broad) + #expect(!sharp.label.contains("broadened") && broad.label.contains("broadened")) + // Without an edge inside the range the two forms are the same. + let low = Array(Self.energies[40..<300]) // 0.2-1.5 keV + #expect(sharp.columns(energies: low, resolutionMnKaEV: Self.resolution).values == broad.columns(energies: low, resolutionMnKaEV: Self.resolution).values) + } + + /// With every coefficient 1 the Bernstein sums are 1 on both segments, so the broadened continuum equals the sharp one + /// (Kramers / kRef): the weights sum to 1. Every column is non-negative and finite. + @Test func testTheBroadenedWeightsSumToOne() { + let e = Array(Self.energies[40..<4000]) + let broad = ContinuumForm(beamEnergy: Self.beam, edgeStep: .broadened).columns(energies: e, resolutionMnKaEV: Self.resolution).values + let sharp = ContinuumForm(beamEnergy: Self.beam).columns(energies: e).values + for i in e.indices { + let b = broad.reduce(0) { $0 + $1[i] }, s = sharp.reduce(0) { $0 + $1[i] } + #expect(abs(b - s) <= 1e-12 * max(abs(s), 1), "channel \(i): \(b) vs \(s)") + } + #expect(broad.allSatisfy { $0.allSatisfy { $0 >= 0 && $0.isFinite } }) + } + + /// Two close edges (90 eV apart, under three sigma): the weights still sum to 1 (they telescope; a product would over-count between). + @Test func testTheBroadenedWeightsSumToOneWithTwoCloseEdges() { + let e = Array(Self.energies[40..<4000]) + let edges = [1.5596, 1.65] + let broad = ContinuumForm(beamEnergy: Self.beam, edges: edges, orders: [9, 3, 5], edgeStep: .broadened) + .columns(energies: e, resolutionMnKaEV: Self.resolution).values + let sharp = ContinuumForm(beamEnergy: Self.beam, edges: edges, orders: [9, 3, 5]).columns(energies: e).values + for i in e.indices { + let b = broad.reduce(0) { $0 + $1[i] }, s = sharp.reduce(0) { $0 + $1[i] } + #expect(abs(b - s) <= 1e-12 * max(abs(s), 1), "channel \(i): \(b) vs \(s)") + } + #expect(broad.allSatisfy { $0.allSatisfy { $0 >= 0 && $0.isFinite } }) + } + + /// The policy: default `.sharp`, named in the footer when `.broadened`, and a stored policy without the field reads `.sharp`. + @Test func testThePolicyDefaultsToSharpAndOldStoredPoliciesReadIt() throws { + #expect(FitPolicy.default.continuumEdgeStep == .sharp) + // The default policy's canonical JSON is what it was before the field existed: the key is written only when not the default. + #expect(!QuantificationPolicy.default.canonicalJSON.contains("continuumEdgeStep")) + var broad = QuantificationPolicy() + broad.fit.continuumEdgeStep = .broadened + #expect(broad.footerLine?.contains("continuumEdgeStep = broadened") == true, "\(broad.footerLine ?? "nil")") + let round = try JSONDecoder().decode(QuantificationPolicy.self, from: Data(broad.canonicalJSON.utf8)) + #expect(round == broad) + var json = try #require(try JSONSerialization.jsonObject(with: Data(QuantificationPolicy.default.canonicalJSON.utf8)) as? [String: Any]) + var fit = try #require(json["fit"] as? [String: Any]) + fit.removeValue(forKey: "continuumEdgeStep") + json["fit"] = fit + let old = try JSONDecoder().decode(QuantificationPolicy.self, from: try JSONSerialization.data(withJSONObject: json)) + #expect(old == .default) + let settings = FitSettings.standard(elements: ["Al"], axis: Self.axis, resolutionMnKaEV: Self.resolution, beamEnergy: Self.beam, + policy: broad.fit) + guard case .continuum(let form) = settings.background else { Issue.record("no continuum"); return } + #expect(form.edgeStep == .broadened) + } +} + diff --git a/docs/parity.md b/docs/parity.md index 0905ba8..0d54570 100644 --- a/docs/parity.md +++ b/docs/parity.md @@ -274,6 +274,11 @@ the bounds are physics (`familyOvervoltage` 2, `sumPeakFraction` 1, not measured `IdentificationLoopTests` on planted spectra, `RealFileAutoIDTests` (opt-in) on three measured files. The identification fit's Kβ weights are NIST EPQ's (`EDSLineWeights.epqK`), not eXSpy's; the quantification fit keeps eXSpy's, so no parity row moves. +The continuum's step at an edge (`FitPolicy.continuumEdgeStep`): `.sharp` (default) cuts the segments at the edge channel; +`.broadened` (opt-in) weights each segment by the detector's Gaussian step at its edges, sigma from the line-width law at the edge. +No Python counterpart: exSpy's background is a polynomial with no edge. `validation: "none"`; tests `ContinuumEdgeBroadeningTests` +on a generated Al film whose edge is convolved with the detector (no measured spectrum committed). + Detector Si internal fluorescence: eXSpy 0.3.2 has no term for it (`EDSModel.add_family_lines` fits one Gaussian per X-ray line; no dead layer and no detector efficiency either, the k-factor carries the efficiency), so the Si internal-fluorescence counts at Si Kα land in its `Si_Ka` area. SpectroKit's default fit does the same; its `.countsAboveEdge` reference shape, which would remove them, is opt-in. The simulator From e0f8c0b7df38af8dc8e11e12a9cf15bd0b219635 Mon Sep 17 00:00:00 2001 From: Paullo9 Date: Sat, 31 Oct 2026 21:48:09 +0100 Subject: [PATCH 4/5] test: re-record the spectro goldens for the continuumEdgeStep field, no number moves The fit-settings dump in each golden scenario gains one line per quantification, background.continuum.edgeStep = .sharp, from the field this branch adds; the branch had not re-recorded for it. Recorded with SPECTRO_GOLDEN_DIR from the merged code: 9 added lines, no other line differs, the array companions are unchanged. Done: SpectroGoldenTests green on the edge-step branch. Next: stack the broadened-default branch on it. Co-Authored-By: Claude Opus 5.5 --- .../Fixtures/spectro-golden/demo-edx-tiny-dm4.txt | 2 ++ .../Fixtures/spectro-golden/eds-realistic-l-sim.txt | 3 +++ .../Fixtures/spectro-golden/eds-unlisted-sim.txt | 2 ++ .../Fixtures/spectro-golden/eds-weakline-sim.txt | 2 ++ 4 files changed, 9 insertions(+) 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 d42ac65..f79335d 100644 --- a/Tests/SpectroCoreTests/Fixtures/spectro-golden/demo-edx-tiny-dm4.txt +++ b/Tests/SpectroCoreTests/Fixtures/spectro-golden/demo-edx-tiny-dm4.txt @@ -659,6 +659,7 @@ whole.quantification.fitSettings.background.continuum.edges[0] = 3ff8f41f212d773 whole.quantification.fitSettings.background.continuum.orders: n 2 sum-bits e fnv 54226316c5c52fc9 whole.quantification.fitSettings.background.continuum.nonNegative = true whole.quantification.fitSettings.background.continuum.efficiency = nil +whole.quantification.fitSettings.background.continuum.edgeStep = .sharp whole.quantification.fitSettings.escapePeaks = true whole.quantification.fitSettings.referenceShapes.shapes: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 whole.quantification.fitSettings.method = .leastSquares @@ -900,6 +901,7 @@ region-locked-axis.quantification.fitSettings.background.continuum.edges[0] = 3f region-locked-axis.quantification.fitSettings.background.continuum.orders: n 2 sum-bits e fnv 54226316c5c52fc9 region-locked-axis.quantification.fitSettings.background.continuum.nonNegative = true region-locked-axis.quantification.fitSettings.background.continuum.efficiency = nil +region-locked-axis.quantification.fitSettings.background.continuum.edgeStep = .sharp 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 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 8cdd09a..a4ad190 100644 --- a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-realistic-l-sim.txt +++ b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-realistic-l-sim.txt @@ -314,6 +314,7 @@ seed0.seven.quantification.fitSettings.background.continuum.edges[0] = 3ff8f41f2 seed0.seven.quantification.fitSettings.background.continuum.orders: n 2 sum-bits e fnv 54226316c5c52fc9 seed0.seven.quantification.fitSettings.background.continuum.nonNegative = true seed0.seven.quantification.fitSettings.background.continuum.efficiency = nil +seed0.seven.quantification.fitSettings.background.continuum.edgeStep = .sharp 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 @@ -685,6 +686,7 @@ seed0.seven-60keV.quantification.fitSettings.background.continuum.edges[0] = 3ff seed0.seven-60keV.quantification.fitSettings.background.continuum.orders: n 2 sum-bits e fnv 54226316c5c52fc9 seed0.seven-60keV.quantification.fitSettings.background.continuum.nonNegative = true seed0.seven-60keV.quantification.fitSettings.background.continuum.efficiency = nil +seed0.seven-60keV.quantification.fitSettings.background.continuum.edgeStep = .sharp 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 @@ -983,6 +985,7 @@ seed0.four.quantification.fitSettings.background.continuum.edges[0] = 3ff8f41f21 seed0.four.quantification.fitSettings.background.continuum.orders: n 2 sum-bits e fnv 54226316c5c52fc9 seed0.four.quantification.fitSettings.background.continuum.nonNegative = true seed0.four.quantification.fitSettings.background.continuum.efficiency = nil +seed0.four.quantification.fitSettings.background.continuum.edgeStep = .sharp 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 diff --git a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-unlisted-sim.txt b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-unlisted-sim.txt index e0c5854..a5f01b6 100644 --- a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-unlisted-sim.txt +++ b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-unlisted-sim.txt @@ -288,6 +288,7 @@ seed0.four.quantification.fitSettings.background.continuum.edges[0] = 3ff8f41f21 seed0.four.quantification.fitSettings.background.continuum.orders: n 2 sum-bits e fnv 54226316c5c52fc9 seed0.four.quantification.fitSettings.background.continuum.nonNegative = true seed0.four.quantification.fitSettings.background.continuum.efficiency = nil +seed0.four.quantification.fitSettings.background.continuum.edgeStep = .sharp 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 @@ -1523,6 +1524,7 @@ seed0.seven.quantification.fitSettings.background.continuum.edges[0] = 3ff8f41f2 seed0.seven.quantification.fitSettings.background.continuum.orders: n 2 sum-bits e fnv 54226316c5c52fc9 seed0.seven.quantification.fitSettings.background.continuum.nonNegative = true seed0.seven.quantification.fitSettings.background.continuum.efficiency = nil +seed0.seven.quantification.fitSettings.background.continuum.edgeStep = .sharp 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 diff --git a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-weakline-sim.txt b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-weakline-sim.txt index 168481e..4f528fe 100644 --- a/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-weakline-sim.txt +++ b/Tests/SpectroCoreTests/Fixtures/spectro-golden/eds-weakline-sim.txt @@ -208,6 +208,7 @@ level0.quantification.fitSettings.background.continuum.edges[0] = 3ff8f41f212d77 level0.quantification.fitSettings.background.continuum.orders: n 2 sum-bits e fnv 54226316c5c52fc9 level0.quantification.fitSettings.background.continuum.nonNegative = true level0.quantification.fitSettings.background.continuum.efficiency = nil +level0.quantification.fitSettings.background.continuum.edgeStep = .sharp level0.quantification.fitSettings.escapePeaks = true level0.quantification.fitSettings.referenceShapes.shapes: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 level0.quantification.fitSettings.method = .leastSquares @@ -437,6 +438,7 @@ level4.quantification.fitSettings.background.continuum.edges[0] = 3ff8f41f212d77 level4.quantification.fitSettings.background.continuum.orders: n 2 sum-bits e fnv 54226316c5c52fc9 level4.quantification.fitSettings.background.continuum.nonNegative = true level4.quantification.fitSettings.background.continuum.efficiency = nil +level4.quantification.fitSettings.background.continuum.edgeStep = .sharp level4.quantification.fitSettings.escapePeaks = true level4.quantification.fitSettings.referenceShapes.shapes: n 0 sum 0000000000000000 0 fnv cbf29ce484222325 level4.quantification.fitSettings.method = .leastSquares From dff86159be9d4c731c8c683848bc77a2604468cc Mon Sep 17 00:00:00 2001 From: Paullo9 Date: Sun, 1 Nov 2026 07:36:40 +0100 Subject: [PATCH 5/5] style: drop the extra blank line at the end of the edge-broadening tests SwiftLint trailing_newline and SwiftFormat consecutiveBlankLines flagged line 184. Lint (SwiftLint 0.65.1, SwiftFormat 0.64.4) is now clean on the whole tree. Done: lint green on this branch. Next: merge it forward into the stacked branches. Co-Authored-By: Claude Opus 5.5 --- Tests/SpectroEDXTests/ContinuumEdgeBroadeningTests.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/SpectroEDXTests/ContinuumEdgeBroadeningTests.swift b/Tests/SpectroEDXTests/ContinuumEdgeBroadeningTests.swift index fd36afd..6e350fc 100644 --- a/Tests/SpectroEDXTests/ContinuumEdgeBroadeningTests.swift +++ b/Tests/SpectroEDXTests/ContinuumEdgeBroadeningTests.swift @@ -181,4 +181,3 @@ struct ContinuumEdgeBroadeningTests { #expect(form.edgeStep == .broadened) } } -