diff --git a/Sources/ImagoCore/ProfileCSV.swift b/Sources/ImagoCore/ProfileCSV.swift index 4cbd9f1..11d87ae 100644 --- a/Sources/ImagoCore/ProfileCSV.swift +++ b/Sources/ImagoCore/ProfileCSV.swift @@ -9,7 +9,7 @@ // axes' unit as the FILE states it (a Velox metre axis stays in metres), `px` when the image is not calibrated; `shown` // only adds a line saying what the app shows them in. HEADER values pass `CSVText.headerValue`, the column header // `CSVText.quoted`. The title, the validation sentence and the lineage sentence are the caller's (the kit authors no claim); -// when a note of the source says "unvalidated" (any case) `TidyResultsCSV.unvalidatedClause` follows the validation. +// when the source has reader notes, `; reader note: ` and the notes (joined by `; `) follow the validation. // // UTF-8, LF line ends, tested byte for byte. Same lines, in the same order, as macTEM's former app copy. // @@ -33,7 +33,7 @@ public nonisolated enum ProfileCSV { /// - appName: names the app in the `# shown in as:` line ("macTEM"). /// - start, end: the line's ends in image pixels (x column, y row, pixel centres at integers). /// - source: the file and its calibration as the file states them. - /// - validation: the validation sentence (the clause for an unvalidated source is added). + /// - validation: the validation sentence (the source's reader notes are quoted after it). /// - method: the `# method:` sentence; `method(width:)` for order 1, `reflect`, mean. /// - lineage: the `# lineage:` sentence. /// - shown: the unit and factor the app shows positions in when it differs from the file's; nil when the same. @@ -42,7 +42,6 @@ public nonisolated enum ProfileCSV { lineage: String = noLineage, shown: (unit: String, factor: Double)? = nil) -> String? { guard let length = profile.positions.last, !profile.samples.isEmpty else { return nil } let unit = CSVText.headerValue(profile.unit) - let unvalidated = source.notes.contains { $0.lowercased().contains("unvalidated") } let notes = source.notes.isEmpty ? "none" : source.notes.map(CSVText.headerValue).joined(separator: "; ") var header: [String] = [] @@ -65,8 +64,7 @@ public nonisolated enum ProfileCSV { } header.append("# method: \(CSVText.headerValue(method ?? Self.method(width: profile.width)))") header.append("# notes: \(notes)") - header.append("# validation: \(CSVText.headerValue(validation))" - + (unvalidated ? TidyResultsCSV.unvalidatedClause : "")) + header.append("# validation: \(CSVText.headerValue(validation + TidyResultsCSV.readerNoteClause(source.notes)))") header.append("# lineage: \(CSVText.headerValue(lineage))") header.append("# numbers: %.17g (exact round trip); nan where a NaN pixel enters a sample") header.append(CSVText.quoted("position (\(unit))") + ",value") diff --git a/Sources/ImagoCore/TidyResultsCSV.swift b/Sources/ImagoCore/TidyResultsCSV.swift index 50f0e13..2080846 100644 --- a/Sources/ImagoCore/TidyResultsCSV.swift +++ b/Sources/ImagoCore/TidyResultsCSV.swift @@ -9,8 +9,9 @@ // cell and its words in `text`. Text cells and header values go through `CSVText.quoted` and `CSVText.headerValue`. // // VALIDATION: the `validation` column holds the product's own sentence, and the header holds one `# validation ():` -// line for each product present, in the order `validations` lists them. When a note of the source says "unvalidated" (any -// case), `unvalidatedClause` follows every sentence. The kit authors no claim: the caller supplies the sentences. +// line for each product present, in the order `validations` lists them. When the source has reader notes, every sentence is +// followed by `; reader note: ` and the notes as the reader wrote them, joined by `; `, so the file states what the reader +// said about its own numbers. The kit authors no claim: the caller supplies the sentences, the reader the notes. // // Pure text: exact, tested byte for byte. UTF-8, LF line ends. // @@ -18,9 +19,17 @@ import Foundation public nonisolated enum TidyResultsCSV { - /// Added to every validation sentence when the source's notes say it is unvalidated. + /// No writer uses this any more: the CSVs quote the reader notes after each validation sentence instead. + @available(*, deprecated, message: "The CSV writers now quote the reader notes after each validation sentence; this clause is no longer written.") public static let unvalidatedClause = ", unvalidated (reader note)" + /// What follows every validation sentence: `; reader note: `, or nothing without a note. Each note + /// passes `CSVText.headerValue` (so a cell keeps one line), and blank notes are left out. + static func readerNoteClause(_ notes: [String]) -> String { + let said = notes.map(CSVText.headerValue).filter { !$0.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty } + return said.isEmpty ? "" : "; reader note: " + said.joined(separator: "; ") + } + public static let columns = ["group", "id", "label", "quantity", "value", "unit", "text", "validation", "lineage"] /// The file and its calibration as the file states them. @@ -103,7 +112,7 @@ public nonisolated enum TidyResultsCSV { lines.append("# session: \(CSVText.headerValue(session))") lines.append("# notes: \(notes)") lines.append(contentsOf: descriptionLines) - let flagged = source.notes.contains { $0.lowercased().contains("unvalidated") } ? unvalidatedClause : "" + let flagged = readerNoteClause(source.notes) let present = Set(rows.map(\.product)) var written = Set() for v in validations where present.contains(v.product) && written.insert(v.product).inserted { diff --git a/Sources/ImagoFilters/GeometricPhaseAnalysis.swift b/Sources/ImagoFilters/GeometricPhaseAnalysis.swift index 0131dc8..930cb7d 100644 --- a/Sources/ImagoFilters/GeometricPhaseAnalysis.swift +++ b/Sources/ImagoFilters/GeometricPhaseAnalysis.swift @@ -48,10 +48,10 @@ public nonisolated enum GeometricPhaseAnalysis { /// Full-size, row-major, `rows * columns` arrays. /// - /// `validation` is "none": the result agrees with planted fields (tools/gpa/planted.py) and has not been checked on a - /// dataset with truth, so an app must show it as unvalidated until one passes. + /// Tested against planted displacement fields (tools/gpa/planted.py); not yet checked on a recorded dataset with known + /// strain. An app that exports it names that method and reference. `validation` keeps the value "none" for that state. public nonisolated struct Result: Sendable { - /// The badge every result carries until a dataset with truth passes. + /// The value of `validation` while the only check is the planted fields. public static let validationNone = "none" public let validation: String = "none" public var rows: Int @@ -209,7 +209,7 @@ public nonisolated enum GeometricPhaseAnalysis { /// plane g_col > 0 (or g_col = 0 and g_row > 0), the stronger first. The spectrum is taken after the mean is removed and a /// Hann window applied; each peak is refined by a parabola through the log magnitudes of the three bins on each axis. /// Peaks within `minRadius` cycles per pixel of the origin are skipped; the second peak must be at least 3 bins from the - /// first with |sin angle| >= 0.2. Unvalidated beyond the planted images. + /// first with |sin angle| >= 0.2. Tested on the planted images only. public static func findReflections(_ image: [Double], rows: Int, columns: Int, minRadius: Double = 0.02) throws -> (g1: (row: Double, column: Double), g2: (row: Double, column: Double)) { typealias E = GeometricPhaseAnalysisError diff --git a/Tests/ImagoCoreTests/CSVTextTests.swift b/Tests/ImagoCoreTests/CSVTextTests.swift index 8836e13..f064332 100644 --- a/Tests/ImagoCoreTests/CSVTextTests.swift +++ b/Tests/ImagoCoreTests/CSVTextTests.swift @@ -94,6 +94,33 @@ private struct TidyPins: Decodable, Sendable { #expect(written >= 12) } + /// A source with reader notes: every validation sentence (header line and cell) is followed by the notes as the reader + /// wrote them, and nothing is called unvalidated. Without notes the sentence stands alone. + @Test func tidyQuotesTheReaderNoteAfterEachValidation() throws { + let row = TidyResultsCSV.Row(group: "g", id: "i", label: "l", product: "known", entries: [TidyResultsCSV.Entry("d", 1)]) + func text(_ notes: [String]) throws -> String { + let source = TidyResultsCSV.Source(software: "s", fileName: "f", object: "o", width: 1, height: 1, x: nil, y: nil, + notes: notes) + return try #require(try TidyResultsCSV.text([row], source: source, title: "t", session: "s", descriptionLines: [], + validations: [(product: "known", sentence: "closed form")], + lineageLine: "# lineage: none")) + } + let noted = try text(["scale from the tag", "UNVALIDATED"]) + let lines = noted.components(separatedBy: "\n") + #expect(lines.contains("# validation (known): closed form; reader note: scale from the tag; UNVALIDATED")) + #expect(lines.contains("g,i,l,d,1,,,closed form; reader note: scale from the tag; UNVALIDATED,")) + #expect(!noted.contains("unvalidated")) // the reader's own word is quoted, never a lower-case verdict + let plain = try text(["origin from the header"]) + #expect(plain.contains("closed form; reader note: origin from the header")) + #expect(!plain.lowercased().contains("unvalidated")) + let bare = try text([]) + #expect(bare.contains("# validation (known): closed form\n") && bare.hasSuffix("g,i,l,d,1,,,closed form,\n")) + // a cell keeps one line (the note passes headerValue) and a blank note adds nothing + let multi = try text(["cr\r\nlf", "", " "]) + #expect(multi.hasSuffix("g,i,l,d,1,,,closed form; reader note: cr lf,\n")) + #expect(try text(["", "\n"]) == bare.replacingOccurrences(of: "# notes: none", with: "# notes: ; ")) + } + @Test func tidyRefusesAProductWithoutASentenceAndWritesNothingForNoRow() throws { let source = TidyResultsCSV.Source(software: "s", fileName: "f", object: "o", width: 1, height: 1, x: nil, y: nil, notes: []) let row = TidyResultsCSV.Row(group: "g", id: "i", label: "l", product: "mystery", entries: []) diff --git a/Tests/ImagoCoreTests/Fixtures/csv-tidy-pins.json b/Tests/ImagoCoreTests/Fixtures/csv-tidy-pins.json index 4d1c759..a9c8851 100644 --- a/Tests/ImagoCoreTests/Fixtures/csv-tidy-pins.json +++ b/Tests/ImagoCoreTests/Fixtures/csv-tidy-pins.json @@ -1 +1 @@ -{"title": "macTEM results", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]], "descriptionLines": ["# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels", "# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels"], "lineageLine": "# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)", "cases": [{"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "with,comma.dm4", "object": "plain.dm4", "width": 3292, "height": 3397, "x": {"originBits": 1, "scaleBits": 13870170782931264748, "unit": "px"}, "y": {"originBits": 13858705342554176504, "scaleBits": 4477516673583951164, "unit": ""}, "notes": []}, "rows": [], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": null}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "", "object": "", "width": 1475, "height": 3863, "x": {"originBits": 13913614912728981959, "scaleBits": 4607182418800017408, "unit": "m"}, "y": {"originBits": 4473366651089836748, "scaleBits": 4503009890106136400, "unit": "mrad"}, "notes": ["xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]}, "rows": [{"group": "spots", "id": "spots:0", "label": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "product": "spot", "entries": [{"name": "q", "valueBits": 4599301119452119040, "unit": "nm", "text": ""}, {"name": "d", "valueBits": 13824397457163940752, "unit": "\u00c5", "text": ""}, {"name": "length", "valueBits": 9223372036854775808, "unit": "px", "text": ""}, {"name": "length", "valueBits": 4483328836346772969, "unit": "um", "text": ""}, {"name": "x1", "valueBits": 4591870180066957722, "unit": "1/nm", "text": ""}], "refusal": null, "lineage": "s0"}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: \n# object: \n# image: 1475 x 3863 px\n# x scale: 1.0 m per px, origin -378306.9206919935 px\n# y scale: 1.1140418184552812e-07 mrad per px, origin 1.198547637139609e-09 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (spot): planted spots\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nspots,spots:0,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,q,0.3125,nm,,planted spots,s0\nspots,spots:0,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,d,-0.40821792564366266,\u00c5,,planted spots,s0\nspots,spots:0,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,length,-0,px,,planted spots,s0\nspots,spots:0,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,length,5.5841364548338526e-09,um,,planted spots,s0\nspots,spots:0,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,x1,0.10000000000000001,1/nm,,planted spots,s0\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "ctrl\u0001\u007f", "object": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "width": 3967, "height": 3913, "x": null, "y": {"originBits": 13897713229135952275, "scaleBits": 13729421787296120747, "unit": "1/m"}, "notes": ["line\nbreak"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "Row 0", "product": "angle", "entries": [{"name": "d", "valueBits": 1, "unit": "", "text": ""}, {"name": "length", "valueBits": 13905323795505704733, "unit": "\u00b0", "text": ""}, {"name": "length", "valueBits": null, "unit": "um", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:1", "label": "Row 1", "product": "distance", "entries": [{"name": "x1", "valueBits": 1, "unit": "1/m", "text": "cr\r\nlf"}, {"name": "q", "valueBits": 13829043358039307241, "unit": "\u00b5m", "text": ""}, {"name": "q", "valueBits": null, "unit": "nm", "text": ""}], "refusal": null, "lineage": "s1"}, {"group": "spots", "id": "spots:2", "label": "Row 2", "product": "spot", "entries": [], "refusal": null, "lineage": null}, {"group": "spots", "id": "spots:3", "label": "Row 3", "product": "spot", "entries": [{"name": "with,comma.dm4", "valueBits": 4648204705981854400, "unit": "um", "text": ""}], "refusal": "cr\r\nlf", "lineage": null}, {"group": "marks", "id": "marks:4", "label": "Row 4", "product": "angle", "entries": [], "refusal": null, "lineage": null}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: ctrl \n# object: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# image: 3967 x 3913 px\n# x scale: none\n# y scale: none\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: line break\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance\n# validation (angle): closed form, angle, with \"quotes\", and commas\n# validation (spot): planted spots\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,Row 0,d,4.9406564584124654e-324,,,\"closed form, angle, with \"\"quotes\"\", and commas\",\nmarks,marks:0,Row 0,length,-104997.09519141582,\u00b0,,\"closed form, angle, with \"\"quotes\"\", and commas\",\nmarks,marks:0,Row 0,length,,um,,\"closed form, angle, with \"\"quotes\"\", and commas\",\nmarks,marks:1,Row 1,x1,4.9406564584124654e-324,1/m,\"cr\r\nlf\",\"closed form, distance\",s1\nmarks,marks:1,Row 1,q,-0.8322344634831299,\u00b5m,,\"closed form, distance\",s1\nmarks,marks:1,Row 1,q,,nm,,\"closed form, distance\",s1\nspots,spots:3,Row 3,\"with,comma.dm4\",567.69410581103148,um,,planted spots,\nspots,spots:3,Row 3,outcome,,,\"cr\r\nlf\",planted spots,\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "cr\r\nlf", "object": "", "width": 3257, "height": 3496, "x": {"originBits": 13780468080851010131, "scaleBits": 4706805043041404373, "unit": "pm"}, "y": {"originBits": 13919869217332155888, "scaleBits": 4489806213533731600, "unit": "um"}, "notes": ["xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "Row 0", "product": "distance", "entries": [], "refusal": null, "lineage": "s0"}, {"group": "spots", "id": "spots:1", "label": "Row 1", "product": "spot", "entries": [{"name": "d", "valueBits": 4548605656248489097, "unit": "1/px", "text": ""}, {"name": "y1", "valueBits": null, "unit": "mrad", "text": ""}, {"name": "ctrl\u0001\u007f", "valueBits": null, "unit": "pm", "text": ""}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": null, "unit": "1/\u00c5", "text": ""}], "refusal": null, "lineage": "s1"}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: cr lf\n# object: \n# image: 3257 x 3496 px\n# x scale: 4700414.89843889 pm per px, origin -0.0004586403062907574 px\n# y scale: 1.4433613971234772e-08 um per px, origin -960422.7245661598 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance\n# validation (spot): planted spots\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nspots,spots:1,Row 1,d,0.00012166417855581832,1/px,,planted spots,s1\nspots,spots:1,Row 1,y1,,mrad,,planted spots,s1\nspots,spots:1,Row 1,ctrl\u0001\u007f,,pm,,planted spots,s1\nspots,spots:1,Row 1,tab\tand\u0085nel\u2028sep\u2029,,1/\u00c5,,planted spots,s1\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "line\nbreak", "object": "line\nbreak", "width": 2638, "height": 2737, "x": {"originBits": 13887529869885230160, "scaleBits": 4623193449843880065, "unit": "\u00c5"}, "y": {"originBits": 9223372036854775808, "scaleBits": 4489794098957596209, "unit": "1/px"}, "notes": ["a \"quoted\" name", "plain.dm4", "unvalidated"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "a \"quoted\" name", "product": "distance", "entries": [{"name": "plain.dm4", "valueBits": 13774550170479932637, "unit": "\u00b5m", "text": ""}, {"name": "length", "valueBits": 13860226465206106641, "unit": "\u00b0", "text": ""}], "refusal": "plain.dm4", "lineage": null}, {"group": "marks", "id": "marks:1", "label": "plain.dm4", "product": "angle", "entries": [{"name": "x1", "valueBits": 13795013905347428094, "unit": "1/nm", "text": ""}, {"name": "y1", "valueBits": 13916111843208673688, "unit": "1/\u00c5", "text": ""}, {"name": "length", "valueBits": 13944780179619938193, "unit": "px", "text": ""}, {"name": "y1", "valueBits": null, "unit": "", "text": "cr\r\nlf"}, {"name": "q", "valueBits": 13713189743075904339, "unit": "m", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:2", "label": "Row 2", "product": "distance", "entries": [{"name": "y1", "valueBits": 4689223108506201912, "unit": "um", "text": ""}, {"name": "length", "valueBits": 4599676419421066581, "unit": "1/nm", "text": ""}, {"name": "length", "valueBits": 4531709457107920541, "unit": "1/nm", "text": ""}, {"name": "d", "valueBits": null, "unit": "mrad", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:3", "label": "Row 3", "product": "distance", "entries": [{"name": "length", "valueBits": 13953064669076816644, "unit": "px", "text": ""}, {"name": "length", "valueBits": 13826891945726597913, "unit": "px", "text": ""}, {"name": "d", "valueBits": 13857999919115077096, "unit": "1/nm", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:4", "label": "Row 4", "product": "profile", "entries": [{"name": "q", "valueBits": 9223372036854775808, "unit": "\u00b5m", "text": ""}, {"name": "y1", "valueBits": 13930396955387614310, "unit": "1/m", "text": ""}], "refusal": null, "lineage": "s4"}, {"group": "spots", "id": "spots:5", "label": "Row 5", "product": "spot", "entries": [{"name": "q", "valueBits": 4475985662216163534, "unit": "", "text": ""}, {"name": "x1", "valueBits": 4694075660488176028, "unit": "", "text": "line\nbreak"}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 4607182418800017408, "unit": "1/\u00c5", "text": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301"}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:6", "label": "Row 6", "product": "distance", "entries": [{"name": "q", "valueBits": 4599676419421066581, "unit": "\u00b5m", "text": ""}, {"name": "y1", "valueBits": 4564205877686929647, "unit": "um", "text": ""}], "refusal": null, "lineage": "s6"}, {"group": "marks", "id": "marks:7", "label": "Row 7", "product": "distance", "entries": [{"name": "x1", "valueBits": 13731123496161135390, "unit": "\u00c5", "text": "line\nbreak"}, {"name": "d", "valueBits": 4535827082660111261, "unit": "\u00b0", "text": ""}, {"name": "d", "valueBits": 9221120237041090560, "unit": "1/m", "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}, {"name": "x1", "valueBits": 4627674475121943007, "unit": "mrad", "text": ""}, {"name": "y1", "valueBits": null, "unit": "um", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:8", "label": "Row 8", "product": "distance", "entries": [{"name": "q", "valueBits": 9218868437227405312, "unit": "\u00b0", "text": ""}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 4618981628002793772, "unit": "1/m", "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:9", "label": "Row 9", "product": "profile", "entries": [{"name": "y1", "valueBits": 4654998134299041448, "unit": "1/\u00c5", "text": ""}, {"name": "length", "valueBits": null, "unit": "\u00b0", "text": ""}, {"name": "y1", "valueBits": 13955696789406597625, "unit": "um", "text": ""}], "refusal": "plain.dm4", "lineage": null}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: line break\n# object: line break\n# image: 2638 x 2737 px\n# x scale: 12.441304500615162 \u00c5 per px, origin -6762.8373739003 px\n# y scale: 1.4413572086217786e-08 1/px per px, origin -0.0 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: a \"quoted\" name; plain.dm4; unvalidated\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance, unvalidated (reader note)\n# validation (angle): closed form, angle, with \"quotes\", and commas, unvalidated (reader note)\n# validation (profile): samples: scikit-image 0.26.0 (a line break), unvalidated (reader note)\n# validation (spot): planted spots, unvalidated (reader note)\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,\"a \"\"quoted\"\" name\",plain.dm4,-0.00019098518362296079,\u00b5m,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:0,\"a \"\"quoted\"\" name\",length,-101.66461684180128,\u00b0,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:0,\"a \"\"quoted\"\" name\",outcome,,,plain.dm4,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:1,plain.dm4,x1,-0.0043297365163394979,1/nm,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nmarks,marks:1,plain.dm4,y1,-523647.40337839117,1/\u00c5,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nmarks,marks:1,plain.dm4,length,-45741594.644286282,px,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nmarks,marks:1,plain.dm4,y1,,,\"cr\r\nlf\",\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nmarks,marks:1,plain.dm4,q,-1.445262702763652e-08,m,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nmarks,marks:2,Row 2,y1,318948.64752458362,um,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:2,Row 2,length,0.33333333333333331,1/nm,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:2,Row 2,length,9.4729312023645688e-06,1/nm,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:2,Row 2,d,,mrad,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:3,Row 3,length,-161427948.18849957,px,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:3,Row 3,length,-0.59337971497993458,px,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:3,Row 3,d,-70.023493825479477,1/nm,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:4,Row 4,q,-0,\u00b5m,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",s4\nmarks,marks:4,Row 4,y1,-4905189.9072161671,1/m,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",s4\nspots,spots:5,Row 5,q,1.7401464440791555e-09,,,\"planted spots, unvalidated (reader note)\",\nspots,spots:5,Row 5,x1,678520.69571261434,,\"line\nbreak\",\"planted spots, unvalidated (reader note)\",\nspots,spots:5,Row 5,tab\tand\u0085nel\u2028sep\u2029,1,1/\u00c5,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\"planted spots, unvalidated (reader note)\",\nmarks,marks:6,Row 6,q,0.33333333333333331,\u00b5m,,\"closed form, distance, unvalidated (reader note)\",s6\nmarks,marks:6,Row 6,y1,0.0014231356518555301,um,,\"closed form, distance, unvalidated (reader note)\",s6\nmarks,marks:7,Row 7,x1,-2.2910736583637679e-07,\u00c5,\"line\nbreak\",\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:7,Row 7,d,1.7638131370876023e-05,\u00b0,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:7,Row 7,d,nan,1/m,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:7,Row 7,x1,24.802408801655357,mrad,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:7,Row 7,y1,,um,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:8,Row 8,q,inf,\u00b0,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:8,Row 8,tab\tand\u0085nel\u2028sep\u2029,6.4798029834330855,1/m,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:9,Row 9,y1,1656.0349769610129,1/\u00c5,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:9,Row 9,length,,\u00b0,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:9,Row 9,y1,-239871246.81983927,um,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:9,Row 9,outcome,,,plain.dm4,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "object": "tab\tand\u0085nel\u2028sep\u2029", "width": 329, "height": 2540, "x": {"originBits": 4733214722362243522, "scaleBits": 4688996572955498173, "unit": "um"}, "y": {"originBits": 4492615507406039200, "scaleBits": 4625985442531634717, "unit": "nm"}, "notes": ["cr\r\nlf", "unvalidated"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "Row 0", "product": "profile", "entries": [], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:1", "label": "tab\tand\u0085nel\u2028sep\u2029", "product": "angle", "entries": [{"name": "length", "valueBits": 4627713569321409041, "unit": "\u00b5m", "text": ""}], "refusal": null, "lineage": "s1"}, {"group": "marks", "id": "marks:2", "label": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "product": "angle", "entries": [{"name": "x1", "valueBits": 4594266199546686779, "unit": "", "text": "tab\tand\u0085nel\u2028sep\u2029"}], "refusal": null, "lineage": null}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# object: tab and nel sep \n# image: 329 x 2540 px\n# x scale: 305762.5430043748 um per px, origin 266394414.025343 px\n# y scale: 18.801759614127253 nm per px, origin 2.326124045316936e-08 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: cr lf; unvalidated\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (angle): closed form, angle, with \"quotes\", and commas, unvalidated (reader note)\n# validation (profile): samples: scikit-image 0.26.0 (a line break), unvalidated (reader note)\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:1,tab\tand\u0085nel\u2028sep\u2029,length,24.941299298860091,\u00b5m,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",s1\nmarks,marks:2,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,x1,0.1415028998461397,,tab\tand\u0085nel\u2028sep\u2029,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "line\nbreak", "object": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "width": 2848, "height": 487, "x": {"originBits": 9094988921128908188, "scaleBits": 4566955931646088189, "unit": "\u00b5m"}, "y": {"originBits": 4693405095091938307, "scaleBits": 4626974620418983342, "unit": "m"}, "notes": ["line\nbreak", "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "Row 0", "product": "distance", "entries": [{"name": "ctrl\u0001\u007f", "valueBits": 13899264677658896016, "unit": "1/m", "text": ""}, {"name": "line\nbreak", "valueBits": 4627422942934720745, "unit": "nm", "text": ""}], "refusal": "line\nbreak", "lineage": "s0"}, {"group": "spots", "id": "spots:1", "label": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "product": "spot", "entries": [{"name": "d", "valueBits": 4544421176114877060, "unit": "\u00c5", "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:2", "label": "Row 2", "product": "angle", "entries": [{"name": "x1", "valueBits": 4548762547616847017, "unit": "nm", "text": ""}], "refusal": "tab\tand\u0085nel\u2028sep\u2029", "lineage": "s2"}, {"group": "spots", "id": "spots:3", "label": "Row 3", "product": "spot", "entries": [{"name": "d", "valueBits": 4656924824258413962, "unit": "px", "text": ""}, {"name": "y1", "valueBits": 4591870180066957722, "unit": "\u00c5", "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}, {"name": "x1", "valueBits": 13756186716558330874, "unit": "nm", "text": ""}, {"name": "length", "valueBits": null, "unit": "nm", "text": ""}], "refusal": null, "lineage": "s3"}, {"group": "spots", "id": "spots:4", "label": "Row 4", "product": "spot", "entries": [], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:5", "label": "Row 5", "product": "profile", "entries": [{"name": "q", "valueBits": 13724446403347412190, "unit": "\u00c5", "text": ""}, {"name": "d", "valueBits": 4481655518048654467, "unit": "\u00b0", "text": "plain.dm4"}, {"name": "x1", "valueBits": 4635548367274239060, "unit": "nm", "text": ""}], "refusal": null, "lineage": "s5"}, {"group": "spots", "id": "spots:6", "label": "line\nbreak", "product": "spot", "entries": [{"name": "y1", "valueBits": 4591870180066957722, "unit": "\u00b0", "text": ""}, {"name": "length", "valueBits": 13714694092415811649, "unit": "pm", "text": "a \"quoted\" name"}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:7", "label": "Row 7", "product": "distance", "entries": [{"name": "x1", "valueBits": 4544657646880243314, "unit": "1/m", "text": ""}, {"name": "cr\r\nlf", "valueBits": 0, "unit": "\u00b5m", "text": ""}], "refusal": null, "lineage": "s7"}, {"group": "spots", "id": "spots:8", "label": "plain.dm4", "product": "spot", "entries": [], "refusal": null, "lineage": "s8"}, {"group": "marks", "id": "marks:9", "label": "Row 9", "product": "profile", "entries": [{"name": "x1", "valueBits": 13755636121888493211, "unit": "m", "text": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301"}, {"name": "y1", "valueBits": 9218868437227405312, "unit": "1/m", "text": ""}], "refusal": null, "lineage": "s9"}, {"group": "marks", "id": "marks:10", "label": "Row 10", "product": "profile", "entries": [{"name": "q", "valueBits": null, "unit": "m", "text": ""}, {"name": "y1", "valueBits": 4595304287322729717, "unit": "\u00c5", "text": "plain.dm4"}], "refusal": "plain.dm4", "lineage": "s10"}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: line break\n# object: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# image: 2848 x 487 px\n# x scale: 0.002085792094499882 \u00b5m per px, origin 1e+300 px\n# y scale: 22.316025425277694 m per px, origin 600456.609303594 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance\n# validation (angle): closed form, angle, with \"quotes\", and commas\n# validation (profile): samples: scikit-image 0.26.0 (a line break)\n# validation (spot): planted spots\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,Row 0,ctrl\u0001\u007f,-41180.662962985341,1/m,,\"closed form, distance\",s0\nmarks,marks:0,Row 0,\"line\nbreak\",23.908786959452218,nm,,\"closed form, distance\",s0\nmarks,marks:0,Row 0,outcome,,,\"line\nbreak\",\"closed form, distance\",s0\nspots,spots:1,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,d,6.4953897911010762e-05,\u00c5,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,planted spots,\nmarks,marks:2,Row 2,x1,0.00012551059367208364,nm,,\"closed form, angle, with \"\"quotes\"\", and commas\",s2\nmarks,marks:2,Row 2,outcome,,,tab\tand\u0085nel\u2028sep\u2029,\"closed form, angle, with \"\"quotes\"\", and commas\",s2\nspots,spots:3,Row 3,d,2140.2271089262258,px,,planted spots,s3\nspots,spots:3,Row 3,y1,0.10000000000000001,\u00c5,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,planted spots,s3\nspots,spots:3,Row 3,x1,-1.1345251107469288e-05,nm,,planted spots,s3\nspots,spots:3,Row 3,length,,nm,,planted spots,s3\nmarks,marks:5,Row 5,q,-8.5787740113915406e-08,\u00c5,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s5\nmarks,marks:5,Row 5,d,4.2000000000000004e-09,\u00b0,plain.dm4,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s5\nmarks,marks:5,Row 5,x1,83.104372626069846,nm,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s5\nspots,spots:6,\"line\nbreak\",y1,0.10000000000000001,\u00b0,,planted spots,\nspots,spots:6,\"line\nbreak\",length,-1.898156729533847e-08,pm,\"a \"\"quoted\"\" name\",planted spots,\nmarks,marks:7,Row 7,x1,6.8158674380253294e-05,1/m,,\"closed form, distance\",s7\nmarks,marks:7,Row 7,\"cr\r\nlf\",0,\u00b5m,,\"closed form, distance\",s7\nmarks,marks:9,Row 9,x1,-1.041250745559908e-05,m,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s9\nmarks,marks:9,Row 9,y1,inf,1/m,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s9\nmarks,marks:10,Row 10,q,,m,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s10\nmarks,marks:10,Row 10,y1,0.17031562360975952,\u00c5,plain.dm4,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s10\nmarks,marks:10,Row 10,outcome,,,plain.dm4,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s10\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "object": "", "width": 910, "height": 1419, "x": {"originBits": 13939271429612581697, "scaleBits": 4651884496712404771, "unit": "mrad"}, "y": {"originBits": 13927674916981875189, "scaleBits": 4602828426748479482, "unit": ""}, "notes": ["unvalidated"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "product": "profile", "entries": [{"name": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "valueBits": 13707402285593838754, "unit": "1/m", "text": "with,comma.dm4"}], "refusal": "a \"quoted\" name", "lineage": "s0"}, {"group": "marks", "id": "marks:1", "label": "Row 1", "product": "profile", "entries": [{"name": "x1", "valueBits": 4686930667810644973, "unit": "pm", "text": ""}, {"name": "x1", "valueBits": 13937898216714893226, "unit": "1/\u00c5", "text": ""}, {"name": "d", "valueBits": 13799987676986128638, "unit": "mrad", "text": ""}, {"name": "length", "valueBits": null, "unit": "pm", "text": "line\nbreak"}, {"name": "length", "valueBits": 13706814433979599228, "unit": "1/nm", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:2", "label": "Row 2", "product": "distance", "entries": [{"name": "d", "valueBits": 1, "unit": "px", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:3", "label": "", "product": "angle", "entries": [], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:4", "label": "Row 4", "product": "distance", "entries": [{"name": "d", "valueBits": 13752438795419786546, "unit": "1/px", "text": ""}, {"name": "y1", "valueBits": 4503599627370496, "unit": "um", "text": ""}, {"name": "q", "valueBits": 4531405976752577453, "unit": "", "text": ""}], "refusal": null, "lineage": null}, {"group": "spots", "id": "spots:5", "label": "Row 5", "product": "spot", "entries": [{"name": "d", "valueBits": 13784015260297682662, "unit": "1/m", "text": ""}, {"name": "length", "valueBits": null, "unit": "1/nm", "text": ""}, {"name": "q", "valueBits": 4706777625615432035, "unit": "1/nm", "text": ""}, {"name": "x1", "valueBits": null, "unit": "1/\u00c5", "text": ""}, {"name": "x1", "valueBits": 13896895092319333450, "unit": "\u00b5m", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:6", "label": "", "product": "distance", "entries": [], "refusal": null, "lineage": "s6"}, {"group": "marks", "id": "marks:7", "label": "Row 7", "product": "angle", "entries": [{"name": "cr\r\nlf", "valueBits": 13814709189024989846, "unit": "pm", "text": ""}, {"name": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "valueBits": 13731727638777578127, "unit": "mrad", "text": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301"}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 4503599627370496, "unit": "m", "text": ""}, {"name": "y1", "valueBits": 4607182418800017408, "unit": "pm", "text": "line\nbreak"}], "refusal": null, "lineage": "s7"}, {"group": "marks", "id": "marks:8", "label": "Row 8", "product": "profile", "entries": [{"name": "x1", "valueBits": 4496913323142142806, "unit": "1/nm", "text": "plain.dm4"}, {"name": "d", "valueBits": 0, "unit": "", "text": "line\nbreak"}, {"name": "d", "valueBits": 13772526766370006611, "unit": "1/nm", "text": ""}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 13706032018372591170, "unit": "", "text": ""}, {"name": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "valueBits": 4675187467474216093, "unit": "\u00c5", "text": ""}], "refusal": "tab\tand\u0085nel\u2028sep\u2029", "lineage": null}, {"group": "marks", "id": "marks:9", "label": "Row 9", "product": "distance", "entries": [{"name": "q", "valueBits": 4479262106998068594, "unit": "nm", "text": ""}, {"name": "y1", "valueBits": null, "unit": "pm", "text": ""}, {"name": "x1", "valueBits": 13766977064932706772, "unit": "1/\u00c5", "text": ""}], "refusal": null, "lineage": "s9"}, {"group": "marks", "id": "marks:10", "label": "with,comma.dm4", "product": "profile", "entries": [{"name": "d", "valueBits": 4481655518048654467, "unit": "1/m", "text": ""}, {"name": "x1", "valueBits": 4580222137614393999, "unit": "m", "text": "cr\r\nlf"}, {"name": "d", "valueBits": 13953756616497539962, "unit": "1/m", "text": ""}, {"name": "x1", "valueBits": 4591870180066957722, "unit": "px", "text": ""}, {"name": "plain.dm4", "valueBits": 4616940889931460258, "unit": "1/\u00c5", "text": "cr\r\nlf"}], "refusal": null, "lineage": null}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# object: \n# image: 910 x 1419 px\n# x scale: 986.0378774446184 mrad per px, origin -19126320.36308599 px\n# y scale: none\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: unvalidated\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance, unvalidated (reader note)\n# validation (angle): closed form, angle, with \"quotes\", and commas, unvalidated (reader note)\n# validation (profile): samples: scikit-image 0.26.0 (a line break), unvalidated (reader note)\n# validation (spot): planted spots, unvalidated (reader note)\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,-6.1643311871405604e-09,1/m,\"with,comma.dm4\",\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",s0\nmarks,marks:0,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,outcome,,,\"a \"\"quoted\"\" name\",\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",s0\nmarks,marks:1,Row 1,x1,223827.51842668597,pm,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:1,Row 1,x1,-15393959.838802177,1/\u00c5,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:1,Row 1,d,-0.0094750914584804634,mrad,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:1,Row 1,length,,pm,\"line\nbreak\",\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:1,Row 1,length,-5.6780717287836231e-09,1/nm,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:2,Row 2,d,4.9406564584124654e-324,px,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:4,Row 4,d,-6.3127101313017489e-06,1/px,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:4,Row 4,y1,2.2250738585072014e-308,um,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:4,Row 4,q,8.9588154827244924e-06,,,\"closed form, distance, unvalidated (reader note)\",\nspots,spots:5,Row 5,d,-0.0008135853288093436,1/m,,\"planted spots, unvalidated (reader note)\",\nspots,spots:5,Row 5,length,,1/nm,,\"planted spots, unvalidated (reader note)\",\nspots,spots:5,Row 5,q,4674880.4306930033,1/nm,,\"planted spots, unvalidated (reader note)\",\nspots,spots:5,Row 5,x1,,1/\u00c5,,\"planted spots, unvalidated (reader note)\",\nspots,spots:5,Row 5,x1,-28353.830234568835,\u00b5m,,\"planted spots, unvalidated (reader note)\",\nmarks,marks:7,Row 7,\"cr\r\nlf\",-0.092602751953345525,pm,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",s7\nmarks,marks:7,Row 7,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,-2.5177919638165456e-07,mrad,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",s7\nmarks,marks:7,Row 7,tab\tand\u0085nel\u2028sep\u2029,2.2250738585072014e-308,m,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",s7\nmarks,marks:7,Row 7,y1,1,pm,\"line\nbreak\",\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",s7\nmarks,marks:8,Row 8,x1,4.5160717344485185e-08,1/nm,plain.dm4,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:8,Row 8,d,0,,\"line\nbreak\",\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:8,Row 8,d,-0.0001361407053280134,1/nm,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:8,Row 8,tab\tand\u0085nel\u2028sep\u2029,-5.0308727077076487e-09,,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:8,Row 8,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,36049.851703950415,\u00c5,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:8,Row 8,outcome,,,tab\tand\u0085nel\u2028sep\u2029,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:9,Row 9,q,2.9727535397735533e-09,nm,,\"closed form, distance, unvalidated (reader note)\",s9\nmarks,marks:9,Row 9,y1,,pm,,\"closed form, distance, unvalidated (reader note)\",s9\nmarks,marks:9,Row 9,x1,-5.7464092863463275e-05,1/\u00c5,,\"closed form, distance, unvalidated (reader note)\",s9\nmarks,marks:10,\"with,comma.dm4\",d,4.2000000000000004e-09,1/m,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:10,\"with,comma.dm4\",x1,0.015837734616726492,m,\"cr\r\nlf\",\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:10,\"with,comma.dm4\",d,-182049588.29623014,1/m,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:10,\"with,comma.dm4\",x1,0.10000000000000001,px,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:10,\"with,comma.dm4\",plain.dm4,4.6672634682142036,1/\u00c5,\"cr\r\nlf\",\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "object": "plain.dm4", "width": 2799, "height": 1249, "x": null, "y": {"originBits": 13878327386041867107, "scaleBits": 4569159823982421619, "unit": "\u00b5m"}, "notes": ["xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "Row 0", "product": "distance", "entries": [{"name": "q", "valueBits": 4698258651021440620, "unit": "px", "text": ""}, {"name": "y1", "valueBits": 4552837924389239702, "unit": "nm", "text": ""}, {"name": "d", "valueBits": 13906730063199098112, "unit": "1/\u00c5", "text": ""}], "refusal": "cr\r\nlf", "lineage": null}, {"group": "marks", "id": "marks:1", "label": "Row 1", "product": "distance", "entries": [{"name": "ctrl\u0001\u007f", "valueBits": 13923237704797373710, "unit": "mrad", "text": ""}, {"name": "length", "valueBits": 4495730509863128555, "unit": "", "text": ""}, {"name": "q", "valueBits": 4653547639462653641, "unit": "m", "text": ""}, {"name": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "valueBits": 13762340425605183628, "unit": "1/px", "text": "with,comma.dm4"}, {"name": "q", "valueBits": 4715802419409686539, "unit": "m", "text": "cr\r\nlf"}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:2", "label": "Row 2", "product": "angle", "entries": [], "refusal": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "lineage": "s2"}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# object: plain.dm4\n# image: 2799 x 1249 px\n# x scale: none\n# y scale: 0.0030415780380906253 \u00b5m per px, origin -1646.3067688026574 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance\n# validation (angle): closed form, angle, with \"quotes\", and commas\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,Row 0,q,1282393.769683267,px,,\"closed form, distance\",\nmarks,marks:0,Row 0,y1,0.00023597390243021145,nm,,\"closed form, distance\",\nmarks,marks:0,Row 0,d,-125460.98345406726,1/\u00c5,,\"closed form, distance\",\nmarks,marks:0,Row 0,outcome,,,\"cr\r\nlf\",\"closed form, distance\",\nmarks,marks:1,Row 1,ctrl\u0001\u007f,-1656556.5537989768,mrad,,\"closed form, distance\",\nmarks,marks:1,Row 1,length,3.7333515643118278e-08,,,\"closed form, distance\",\nmarks,marks:1,Row 1,q,1326.2306348000877,m,,\"closed form, distance\",\nmarks,marks:1,Row 1,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,-2.8281290394443134e-05,1/px,\"with,comma.dm4\",\"closed form, distance\",\nmarks,marks:1,Row 1,q,18765066.490127604,m,\"cr\r\nlf\",\"closed form, distance\",\nmarks,marks:2,Row 2,outcome,,,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\"closed form, angle, with \"\"quotes\"\", and commas\",s2\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "object": "a \"quoted\" name", "width": 4321, "height": 4044, "x": null, "y": {"originBits": 13827916316030007121, "scaleBits": 4472687804347289890, "unit": "m"}, "notes": []}, "rows": [{"group": "spots", "id": "spots:0", "label": "plain.dm4", "product": "spot", "entries": [{"name": "length", "valueBits": 13713048628770387100, "unit": "\u00c5", "text": "tab\tand\u0085nel\u2028sep\u2029"}, {"name": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "valueBits": 13872739135681905619, "unit": "\u00b0", "text": ""}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 13767518513773221047, "unit": "1/m", "text": "with,comma.dm4"}], "refusal": "plain.dm4", "lineage": "s0"}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# object: a \"quoted\" name\n# image: 4321 x 4044 px\n# x scale: none\n# y scale: 1.0581654210572247e-09 m per px, origin -0.7071076646386506 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: none\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (spot): planted spots\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nspots,spots:0,plain.dm4,length,-1.421917299228103e-08,\u00c5,tab\tand\u0085nel\u2028sep\u2029,planted spots,s0\nspots,spots:0,plain.dm4,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,-699.84287258062466,\u00b0,,planted spots,s0\nspots,spots:0,plain.dm4,tab\tand\u0085nel\u2028sep\u2029,-6.1231029591618229e-05,1/m,\"with,comma.dm4\",planted spots,s0\nspots,spots:0,plain.dm4,outcome,,,plain.dm4,planted spots,s0\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "tab\tand\u0085nel\u2028sep\u2029", "object": "line\nbreak", "width": 4022, "height": 4288, "x": {"originBits": 4622387742981077499, "scaleBits": 4665786069382933428, "unit": "mrad"}, "y": {"originBits": 4471667097093851367, "scaleBits": 4585660602377988037, "unit": "m"}, "notes": ["plain.dm4", "a \"quoted\" name", "unvalidated"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "Row 0", "product": "angle", "entries": [{"name": "ctrl\u0001\u007f", "valueBits": 4712514385883057960, "unit": "1/nm", "text": ""}, {"name": "with,comma.dm4", "valueBits": 4532063228917357415, "unit": "nm", "text": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301"}, {"name": "y1", "valueBits": 4706781487404986202, "unit": "1/\u00c5", "text": ""}, {"name": "y1", "valueBits": 4637962547667661208, "unit": "\u00b0", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:1", "label": "Row 1", "product": "profile", "entries": [{"name": "length", "valueBits": 13868492340321869005, "unit": "", "text": ""}, {"name": "x1", "valueBits": null, "unit": "\u00b0", "text": ""}], "refusal": "line\nbreak", "lineage": null}, {"group": "marks", "id": "marks:2", "label": "tab\tand\u0085nel\u2028sep\u2029", "product": "angle", "entries": [{"name": "d", "valueBits": null, "unit": "px", "text": ""}, {"name": "length", "valueBits": null, "unit": "1/nm", "text": ""}], "refusal": null, "lineage": "s2"}, {"group": "marks", "id": "marks:3", "label": "Row 3", "product": "angle", "entries": [{"name": "length", "valueBits": 4477328231536385628, "unit": "px", "text": ""}, {"name": "x1", "valueBits": 13815109636984193599, "unit": "1/nm", "text": ""}, {"name": "d", "valueBits": 4578816606122446751, "unit": "pm", "text": ""}, {"name": "y1", "valueBits": 4670528935035588089, "unit": "1/nm", "text": ""}], "refusal": null, "lineage": "s3"}, {"group": "marks", "id": "marks:4", "label": "Row 4", "product": "angle", "entries": [{"name": "q", "valueBits": 4577783349497978547, "unit": "mrad", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:5", "label": "Row 5", "product": "profile", "entries": [{"name": "q", "valueBits": 9094988921128908188, "unit": "1/px", "text": "a \"quoted\" name"}, {"name": "q", "valueBits": 13943581525254951929, "unit": "px", "text": ""}, {"name": "length", "valueBits": 18442240474082181120, "unit": "um", "text": "with,comma.dm4"}, {"name": "length", "valueBits": null, "unit": "px", "text": ""}], "refusal": "", "lineage": null}, {"group": "marks", "id": "marks:6", "label": "tab\tand\u0085nel\u2028sep\u2029", "product": "profile", "entries": [], "refusal": null, "lineage": "s6"}, {"group": "marks", "id": "marks:7", "label": "Row 7", "product": "angle", "entries": [{"name": "q", "valueBits": 4503599627370496, "unit": "1/m", "text": ""}, {"name": "length", "valueBits": null, "unit": "1/px", "text": ""}, {"name": "length", "valueBits": 4503599627370496, "unit": "\u00b0", "text": ""}], "refusal": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "lineage": null}, {"group": "spots", "id": "spots:8", "label": "a \"quoted\" name", "product": "spot", "entries": [{"name": "length", "valueBits": 13860466753531480608, "unit": "\u00b5m", "text": ""}, {"name": "length", "valueBits": 4498817307550165169, "unit": "1/m", "text": ""}], "refusal": null, "lineage": null}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: tab and nel sep \n# object: line break\n# image: 4022 x 4288 px\n# x scale: 8295.419419428195 mrad per px, origin 11.010081604324105 px\n# y scale: 0.03816239922816992 m per px, origin 8.892053414442771e-10 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: plain.dm4; a \"quoted\" name; unvalidated\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (angle): closed form, angle, with \"quotes\", and commas, unvalidated (reader note)\n# validation (profile): samples: scikit-image 0.26.0 (a line break), unvalidated (reader note)\n# validation (spot): planted spots, unvalidated (reader note)\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,Row 0,ctrl\u0001\u007f,11646701.546180323,1/nm,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nmarks,marks:0,Row 0,\"with,comma.dm4\",1.0072243959170173e-05,nm,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nmarks,marks:0,Row 0,y1,4678477.0024832133,1/\u00c5,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nmarks,marks:0,Row 0,y1,117.41193945328121,\u00b0,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nmarks,marks:1,Row 1,length,-364.5190688236151,,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:1,Row 1,x1,,\u00b0,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:1,Row 1,outcome,,,\"line\nbreak\",\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:2,tab\tand\u0085nel\u2028sep\u2029,d,,px,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",s2\nmarks,marks:2,tab\tand\u0085nel\u2028sep\u2029,length,,1/nm,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",s2\nmarks,marks:3,Row 3,length,2.1729213952754607e-09,px,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",s3\nmarks,marks:3,Row 3,x1,-0.098160083759247549,1/nm,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",s3\nmarks,marks:3,Row 3,d,0.013293158833057648,pm,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",s3\nmarks,marks:3,Row 3,y1,17461.283568097253,1/nm,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",s3\nmarks,marks:4,Row 4,q,0.011500744309884103,mrad,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nmarks,marks:5,Row 5,q,1.0000000000000001e+300,1/px,\"a \"\"quoted\"\" name\",\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:5,Row 5,q,-36810923.690101571,px,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:5,Row 5,length,-inf,um,\"with,comma.dm4\",\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:5,Row 5,length,,px,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:5,Row 5,outcome,,,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:7,Row 7,q,2.2250738585072014e-308,1/m,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nmarks,marks:7,Row 7,length,,1/px,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nmarks,marks:7,Row 7,length,2.2250738585072014e-308,\u00b0,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nmarks,marks:7,Row 7,outcome,,,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nspots,spots:8,\"a \"\"quoted\"\" name\",length,-105.07931932344991,\u00b5m,,\"planted spots, unvalidated (reader note)\",\nspots,spots:8,\"a \"\"quoted\"\" name\",length,5.7760229255840001e-08,1/m,,\"planted spots, unvalidated (reader note)\",\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "a \"quoted\" name", "object": "with,comma.dm4", "width": 1937, "height": 3332, "x": {"originBits": 4599301119452119040, "scaleBits": 4708482899504606632, "unit": "pm"}, "y": {"originBits": 13820873553073559553, "scaleBits": 13734379852007545584, "unit": "1/m"}, "notes": ["line\nbreak", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]}, "rows": [{"group": "spots", "id": "spots:0", "label": "a \"quoted\" name", "product": "spot", "entries": [{"name": "d", "valueBits": 13750840328995598716, "unit": "\u00c5", "text": ""}, {"name": "d", "valueBits": 13777033932816668022, "unit": "pm", "text": ""}, {"name": "d", "valueBits": 4671815843786748063, "unit": "\u00c5", "text": ""}, {"name": "x1", "valueBits": 4701993795547575684, "unit": "\u00b0", "text": ""}], "refusal": null, "lineage": "s0"}, {"group": "marks", "id": "marks:1", "label": "with,comma.dm4", "product": "distance", "entries": [{"name": "q", "valueBits": 4607182418800017408, "unit": "\u00c5", "text": ""}, {"name": "x1", "valueBits": 4492893784155978568, "unit": "px", "text": ""}, {"name": "d", "valueBits": 9094988921128908188, "unit": "pm", "text": ""}], "refusal": null, "lineage": "s1"}, {"group": "marks", "id": "marks:2", "label": "cr\r\nlf", "product": "profile", "entries": [], "refusal": null, "lineage": "s2"}, {"group": "marks", "id": "marks:3", "label": "Row 3", "product": "angle", "entries": [{"name": "q", "valueBits": 13877243066636823743, "unit": "nm", "text": ""}, {"name": "x1", "valueBits": 9221120237041090560, "unit": "um", "text": ""}, {"name": "d", "valueBits": 4664715983565399051, "unit": "m", "text": ""}, {"name": "length", "valueBits": 13710551404614712704, "unit": "m", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:4", "label": "Row 4", "product": "profile", "entries": [{"name": "length", "valueBits": null, "unit": "m", "text": "tab\tand\u0085nel\u2028sep\u2029"}, {"name": "length", "valueBits": 13878147258217294727, "unit": "1/nm", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:5", "label": "Row 5", "product": "profile", "entries": [{"name": "q", "valueBits": 13881814520230399776, "unit": "1/nm", "text": ""}], "refusal": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "lineage": null}, {"group": "spots", "id": "spots:6", "label": "Row 6", "product": "spot", "entries": [{"name": "y1", "valueBits": 13885304839262439097, "unit": "\u00c5", "text": "tab\tand\u0085nel\u2028sep\u2029"}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:7", "label": "plain.dm4", "product": "profile", "entries": [], "refusal": null, "lineage": "s7"}, {"group": "spots", "id": "spots:8", "label": "Row 8", "product": "spot", "entries": [{"name": "length", "valueBits": 13741269126295199618, "unit": "\u00b0", "text": ""}, {"name": "d", "valueBits": 4562413828067657735, "unit": "\u00b0", "text": ""}, {"name": "y1", "valueBits": null, "unit": "1/px", "text": ""}], "refusal": null, "lineage": "s8"}, {"group": "spots", "id": "spots:9", "label": "line\nbreak", "product": "spot", "entries": [{"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 13712758342483462014, "unit": "1/nm", "text": ""}, {"name": "length", "valueBits": 4590870268292438764, "unit": "1/\u00c5", "text": ""}, {"name": "d", "valueBits": null, "unit": "\u00c5", "text": ""}, {"name": "", "valueBits": 18442240474082181120, "unit": "1/nm", "text": ""}, {"name": "a \"quoted\" name", "valueBits": 4464202966429764446, "unit": "1/nm", "text": ""}], "refusal": null, "lineage": "s9"}, {"group": "marks", "id": "marks:10", "label": "Row 10", "product": "distance", "entries": [{"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 13804372741335276636, "unit": "\u00c5", "text": ""}, {"name": "x1", "valueBits": 13847048932401686532, "unit": "1/m", "text": "tab\tand\u0085nel\u2028sep\u2029"}], "refusal": "line\nbreak", "lineage": null}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: a \"quoted\" name\n# object: with,comma.dm4\n# image: 1937 x 3332 px\n# x scale: 6263040.499583639 pm per px, origin 0.3125 px\n# y scale: none\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance\n# validation (angle): closed form, angle, with \"quotes\", and commas\n# validation (profile): samples: scikit-image 0.26.0 (a line break)\n# validation (spot): planted spots\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nspots,spots:0,\"a \"\"quoted\"\" name\",d,-4.9587564049348886e-06,\u00c5,,planted spots,s0\nspots,spots:0,\"a \"\"quoted\"\" name\",d,-0.00027247476831723046,pm,,planted spots,s0\nspots,spots:0,\"a \"\"quoted\"\" name\",d,22143.030331478101,\u00c5,,planted spots,s0\nspots,spots:0,\"a \"\"quoted\"\" name\",x1,2206947.7476870436,\u00b0,,planted spots,s0\nmarks,marks:1,\"with,comma.dm4\",q,1,\u00c5,,\"closed form, distance\",s1\nmarks,marks:1,\"with,comma.dm4\",x1,2.4181980983065808e-08,px,,\"closed form, distance\",s1\nmarks,marks:1,\"with,comma.dm4\",d,1.0000000000000001e+300,pm,,\"closed form, distance\",s1\nmarks,marks:3,Row 3,q,-1399.7610803235291,nm,,\"closed form, angle, with \"\"quotes\"\", and commas\",\nmarks,marks:3,Row 3,x1,nan,um,,\"closed form, angle, with \"\"quotes\"\", and commas\",\nmarks,marks:3,Row 3,d,7270.4723282242294,m,,\"closed form, angle, with \"\"quotes\"\", and commas\",\nmarks,marks:3,Row 3,length,-1.0087862178735102e-08,m,,\"closed form, angle, with \"\"quotes\"\", and commas\",\nmarks,marks:4,Row 4,length,,m,tab\tand\u0085nel\u2028sep\u2029,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:4,Row 4,length,-1605.3504432800416,1/nm,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:5,Row 5,q,-2830.3785720261658,1/nm,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:5,Row 5,outcome,,,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nspots,spots:6,Row 6,y1,-4739.1838111893094,\u00c5,tab\tand\u0085nel\u2028sep\u2029,planted spots,\nspots,spots:8,Row 8,length,-1.1202567260243806e-06,\u00b0,,planted spots,s8\nspots,spots:8,Row 8,d,0.0010345468337722445,\u00b0,,planted spots,s8\nspots,spots:8,Row 8,y1,,1/px,,planted spots,s8\nspots,spots:9,\"line\nbreak\",tab\tand\u0085nel\u2028sep\u2029,-1.3738934615012157e-08,1/nm,,planted spots,s9\nspots,spots:9,\"line\nbreak\",length,0.086123436566690692,1/\u00c5,,planted spots,s9\nspots,spots:9,\"line\nbreak\",d,,\u00c5,,planted spots,s9\nspots,spots:9,\"line\nbreak\",,-inf,1/nm,,planted spots,s9\nspots,spots:9,\"line\nbreak\",\"a \"\"quoted\"\" name\",2.9154680344505464e-10,1/nm,,planted spots,s9\nmarks,marks:10,Row 10,tab\tand\u0085nel\u2028sep\u2029,-0.018538931057232907,\u00c5,,\"closed form, distance\",\nmarks,marks:10,Row 10,x1,-13.300076581672336,1/m,tab\tand\u0085nel\u2028sep\u2029,\"closed form, distance\",\nmarks,marks:10,Row 10,outcome,,,\"line\nbreak\",\"closed form, distance\",\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "plain.dm4", "object": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "width": 3175, "height": 1507, "x": {"originBits": 4564072149230898742, "scaleBits": 18442240474082181120, "unit": "1/px"}, "y": {"originBits": 4517534489384998224, "scaleBits": 4534330381925285134, "unit": "\u00b0"}, "notes": ["ctrl\u0001\u007f"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "a \"quoted\" name", "product": "profile", "entries": [{"name": "d", "valueBits": 13788960302083299679, "unit": "pm", "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}, {"name": "x1", "valueBits": null, "unit": "nm", "text": ""}, {"name": "y1", "valueBits": 13868280523672788959, "unit": "", "text": ""}], "refusal": "cr\r\nlf", "lineage": null}, {"group": "marks", "id": "marks:1", "label": "Row 1", "product": "profile", "entries": [{"name": "x1", "valueBits": 13835101845110007055, "unit": "mrad", "text": "ctrl\u0001\u007f"}, {"name": "y1", "valueBits": 4520981519797565687, "unit": "nm", "text": ""}, {"name": "d", "valueBits": 13958001656394434442, "unit": "m", "text": ""}, {"name": "x1", "valueBits": 4628804002521660242, "unit": "\u00b0", "text": ""}, {"name": "with,comma.dm4", "valueBits": 4720375607279395191, "unit": "pm", "text": ""}], "refusal": null, "lineage": "s1"}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: plain.dm4\n# object: \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\n# image: 3175 x 1507 px\n# x scale: none\n# y scale: 1.3912950547533109e-05 \u00b0 per px, origin 1.043473177618954e-06 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: ctrl \n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (profile): samples: scikit-image 0.26.0 (a line break)\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,\"a \"\"quoted\"\" name\",d,-0.0017228931670182008,pm,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:0,\"a \"\"quoted\"\" name\",x1,,nm,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:0,\"a \"\"quoted\"\" name\",y1,-352.47868631826526,,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:0,\"a \"\"quoted\"\" name\",outcome,,,\"cr\r\nlf\",\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:1,Row 1,x1,-2.0194465900464205,mrad,ctrl\u0001\u007f,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s1\nmarks,marks:1,Row 1,y1,1.7734102600270102e-06,nm,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s1\nmarks,marks:1,Row 1,d,-348687815.7042166,m,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s1\nmarks,marks:1,Row 1,x1,28.815296245210739,\u00b0,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s1\nmarks,marks:1,Row 1,\"with,comma.dm4\",38048605.788393907,pm,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s1\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "with,comma.dm4", "object": "", "width": 2204, "height": 3216, "x": null, "y": null, "notes": []}, "rows": [{"group": "marks", "id": "marks:0", "label": "Row 0", "product": "distance", "entries": [{"name": "", "valueBits": 9218868437227405312, "unit": "\u00c5", "text": "plain.dm4"}, {"name": "d", "valueBits": 4519750708393315343, "unit": "um", "text": "plain.dm4"}, {"name": "x1", "valueBits": 9094988921128908188, "unit": "m", "text": ""}, {"name": "d", "valueBits": null, "unit": "1/nm", "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}, {"name": "d", "valueBits": 4624647330814193712, "unit": "m", "text": ""}], "refusal": "line\nbreak", "lineage": null}, {"group": "spots", "id": "spots:1", "label": "", "product": "spot", "entries": [{"name": "x1", "valueBits": 4472025763905106995, "unit": "\u00b5m", "text": ""}, {"name": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "valueBits": 13885181326027375618, "unit": "\u00c5", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:2", "label": "ctrl\u0001\u007f", "product": "profile", "entries": [{"name": "with,comma.dm4", "valueBits": 4655389807796348227, "unit": "\u00b5m", "text": ""}, {"name": "q", "valueBits": 13746740667196769651, "unit": "1/\u00c5", "text": ""}, {"name": "d", "valueBits": 4503599627370496, "unit": "px", "text": ""}, {"name": "y1", "valueBits": 13858482950755477474, "unit": "\u00b0", "text": "cr\r\nlf"}], "refusal": "", "lineage": "s2"}, {"group": "marks", "id": "marks:3", "label": "a \"quoted\" name", "product": "profile", "entries": [{"name": "y1", "valueBits": 13702613689369222191, "unit": "\u00b5m", "text": ""}, {"name": "y1", "valueBits": 4644416338303402541, "unit": "1/nm", "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}, {"name": "length", "valueBits": null, "unit": "\u00b5m", "text": ""}, {"name": "d", "valueBits": 13888089197808298654, "unit": "1/nm", "text": ""}, {"name": "y1", "valueBits": null, "unit": "nm", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:4", "label": "Row 4", "product": "angle", "entries": [{"name": "length", "valueBits": 4689161414649891002, "unit": "", "text": "line\nbreak"}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 4567463708465204087, "unit": "1/px", "text": ""}, {"name": "x1", "valueBits": 4505477255873279829, "unit": "m", "text": ""}], "refusal": "a \"quoted\" name", "lineage": "s4"}, {"group": "marks", "id": "marks:5", "label": "Row 5", "product": "distance", "entries": [{"name": "q", "valueBits": null, "unit": "pm", "text": ""}], "refusal": null, "lineage": "s5"}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: with,comma.dm4\n# object: \n# image: 2204 x 3216 px\n# x scale: none\n# y scale: none\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: none\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance\n# validation (angle): closed form, angle, with \"quotes\", and commas\n# validation (profile): samples: scikit-image 0.26.0 (a line break)\n# validation (spot): planted spots\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,Row 0,,inf,\u00c5,plain.dm4,\"closed form, distance\",\nmarks,marks:0,Row 0,d,1.5127758072129169e-06,um,plain.dm4,\"closed form, distance\",\nmarks,marks:0,Row 0,x1,1.0000000000000001e+300,m,,\"closed form, distance\",\nmarks,marks:0,Row 0,d,,1/nm,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,\"closed form, distance\",\nmarks,marks:0,Row 0,d,15.023915905905682,m,,\"closed form, distance\",\nmarks,marks:0,Row 0,outcome,,,\"line\nbreak\",\"closed form, distance\",\nspots,spots:1,,x1,9.2629062052388604e-10,\u00b5m,,planted spots,\nspots,spots:1,,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,-4626.849178300241,\u00c5,,planted spots,\nmarks,marks:2,ctrl\u0001\u007f,\"with,comma.dm4\",1745.0912196173601,\u00b5m,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s2\nmarks,marks:2,ctrl\u0001\u007f,q,-2.6504525271759196e-06,1/\u00c5,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s2\nmarks,marks:2,ctrl\u0001\u007f,d,2.2250738585072014e-308,px,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s2\nmarks,marks:2,ctrl\u0001\u007f,y1,-76.887786290054947,\u00b0,\"cr\r\nlf\",\"samples: scikit-image 0.26.0 (a line\nbreak)\",s2\nmarks,marks:2,ctrl\u0001\u007f,outcome,,,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s2\nmarks,marks:3,\"a \"\"quoted\"\" name\",y1,-2.9642937636275151e-09,\u00b5m,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:3,\"a \"\"quoted\"\" name\",y1,324.50328216052986,1/nm,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:3,\"a \"\"quoted\"\" name\",length,,\u00b5m,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:3,\"a \"\"quoted\"\" name\",d,-7271.5431564847513,1/nm,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:3,\"a \"\"quoted\"\" name\",y1,,nm,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:4,Row 4,length,315357.59245599399,,\"line\nbreak\",\"closed form, angle, with \"\"quotes\"\", and commas\",s4\nmarks,marks:4,Row 4,tab\tand\u0085nel\u2028sep\u2029,0.0023060051866691761,1/px,,\"closed form, angle, with \"\"quotes\"\", and commas\",s4\nmarks,marks:4,Row 4,x1,1.6890970219333331e-07,m,,\"closed form, angle, with \"\"quotes\"\", and commas\",s4\nmarks,marks:4,Row 4,outcome,,,\"a \"\"quoted\"\" name\",\"closed form, angle, with \"\"quotes\"\", and commas\",s4\nmarks,marks:5,Row 5,q,,pm,,\"closed form, distance\",s5\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "a \"quoted\" name", "object": "cr\r\nlf", "width": 3633, "height": 492, "x": {"originBits": 1, "scaleBits": 4565391011431829520, "unit": ""}, "y": {"originBits": 18442240474082181120, "scaleBits": 4494912805295691196, "unit": "mrad"}, "notes": ["line\nbreak", "a \"quoted\" name", "unvalidated"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "Row 0", "product": "distance", "entries": [{"name": "plain.dm4", "valueBits": 4599676419421066581, "unit": "1/px", "text": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301"}], "refusal": null, "lineage": "s0"}, {"group": "marks", "id": "marks:1", "label": "cr\r\nlf", "product": "profile", "entries": [{"name": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "valueBits": 4600440827185714087, "unit": "", "text": ""}, {"name": "y1", "valueBits": 4599676419421066581, "unit": "\u00c5", "text": ""}, {"name": "x1", "valueBits": 13922752582581519016, "unit": "1/nm", "text": ""}, {"name": "x1", "valueBits": 4542376496944881337, "unit": "nm", "text": ""}], "refusal": "line\nbreak", "lineage": null}, {"group": "marks", "id": "marks:2", "label": "plain.dm4", "product": "angle", "entries": [{"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 4716100326944077707, "unit": "1/m", "text": ""}, {"name": "plain.dm4", "valueBits": 4602956645919518238, "unit": "\u00b5m", "text": "with,comma.dm4"}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 13894098520672327435, "unit": "1/m", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:3", "label": "Row 3", "product": "distance", "entries": [], "refusal": null, "lineage": null}, {"group": "spots", "id": "spots:4", "label": "Row 4", "product": "spot", "entries": [{"name": "d", "valueBits": 4599301119452119040, "unit": "1/\u00c5", "text": ""}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 13920274554551134522, "unit": "mrad", "text": "plain.dm4"}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:5", "label": "cr\r\nlf", "product": "angle", "entries": [{"name": "x1", "valueBits": 13854653094341320253, "unit": "px", "text": ""}, {"name": "q", "valueBits": 13845406178800793815, "unit": "pm", "text": ""}], "refusal": "line\nbreak", "lineage": "s5"}, {"group": "spots", "id": "spots:6", "label": "Row 6", "product": "spot", "entries": [{"name": "d", "valueBits": 13922338291686794802, "unit": "px", "text": "cr\r\nlf"}], "refusal": null, "lineage": "s6"}, {"group": "marks", "id": "marks:7", "label": "", "product": "angle", "entries": [{"name": "length", "valueBits": 4607182418800017408, "unit": "\u00b0", "text": "a \"quoted\" name"}], "refusal": null, "lineage": "s7"}, {"group": "marks", "id": "marks:8", "label": "Row 8", "product": "distance", "entries": [], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:9", "label": "Row 9", "product": "distance", "entries": [{"name": "x1", "valueBits": 4481169670300308210, "unit": "1/nm", "text": ""}, {"name": "y1", "valueBits": 13833255714213234846, "unit": "\u00b5m", "text": ""}, {"name": "q", "valueBits": 4588268010473567497, "unit": "\u00b5m", "text": ""}], "refusal": "ctrl\u0001\u007f", "lineage": null}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: a \"quoted\" name\n# object: cr lf\n# image: 3633 x 492 px\n# x scale: none\n# y scale: 3.192240072327633e-08 mrad per px, origin -inf px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: line break; a \"quoted\" name; unvalidated\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance, unvalidated (reader note)\n# validation (angle): closed form, angle, with \"quotes\", and commas, unvalidated (reader note)\n# validation (profile): samples: scikit-image 0.26.0 (a line break), unvalidated (reader note)\n# validation (spot): planted spots, unvalidated (reader note)\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,Row 0,plain.dm4,0.33333333333333331,1/px,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\"closed form, distance, unvalidated (reader note)\",s0\nmarks,marks:1,\"cr\r\nlf\",\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,0.37576648835902876,,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:1,\"cr\r\nlf\",y1,0.33333333333333331,\u00c5,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:1,\"cr\r\nlf\",x1,-1543605.2360307369,1/nm,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:1,\"cr\r\nlf\",x1,4.913924209209775e-05,nm,,\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:1,\"cr\r\nlf\",outcome,,,\"line\nbreak\",\"samples: scikit-image 0.26.0 (a line\nbreak), unvalidated (reader note)\",\nmarks,marks:2,plain.dm4,tab\tand\u0085nel\u2028sep\u2029,19874858.537833732,1/m,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nmarks,marks:2,plain.dm4,plain.dm4,0.53084496512332513,\u00b5m,\"with,comma.dm4\",\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nmarks,marks:2,plain.dm4,tab\tand\u0085nel\u2028sep\u2029,-18179.961850247386,1/m,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",\nspots,spots:4,Row 4,d,0.3125,1/\u00c5,,\"planted spots, unvalidated (reader note)\",\nspots,spots:4,Row 4,tab\tand\u0085nel\u2028sep\u2029,-1007610.1873619922,mrad,plain.dm4,\"planted spots, unvalidated (reader note)\",\nmarks,marks:5,\"cr\r\nlf\",x1,-43.231126604191083,px,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",s5\nmarks,marks:5,\"cr\r\nlf\",q,-10.381959987277169,pm,,\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",s5\nmarks,marks:5,\"cr\r\nlf\",outcome,,,\"line\nbreak\",\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",s5\nspots,spots:6,Row 6,d,-1447145.6203521607,px,\"cr\r\nlf\",\"planted spots, unvalidated (reader note)\",s6\nmarks,marks:7,,length,1,\u00b0,\"a \"\"quoted\"\" name\",\"closed form, angle, with \"\"quotes\"\", and commas, unvalidated (reader note)\",s7\nmarks,marks:9,Row 9,x1,3.7981161619154343e-09,1/nm,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:9,Row 9,y1,-1.5997998894095313,\u00b5m,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:9,Row 9,q,0.056254927367584591,\u00b5m,,\"closed form, distance, unvalidated (reader note)\",\nmarks,marks:9,Row 9,outcome,,,ctrl\u0001\u007f,\"closed form, distance, unvalidated (reader note)\",\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "object": "line\nbreak", "width": 4186, "height": 226, "x": {"originBits": 13800402163161698558, "scaleBits": 13891842672194665007, "unit": "mrad"}, "y": null, "notes": ["line\nbreak", "with,comma.dm4"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "plain.dm4", "product": "angle", "entries": [{"name": "length", "valueBits": 4515818319382903633, "unit": "1/m", "text": ""}, {"name": "y1", "valueBits": 4509932439664621551, "unit": "", "text": ""}, {"name": "y1", "valueBits": null, "unit": "m", "text": ""}, {"name": "q", "valueBits": 4607182418800017408, "unit": "\u00b0", "text": ""}, {"name": "plain.dm4", "valueBits": 4481444424763163179, "unit": "nm", "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:1", "label": "Row 1", "product": "angle", "entries": [{"name": "x1", "valueBits": 13917796670170040488, "unit": "\u00b0", "text": ""}, {"name": "cr\r\nlf", "valueBits": 13871023655354027383, "unit": "", "text": ""}], "refusal": "a \"quoted\" name", "lineage": null}, {"group": "spots", "id": "spots:2", "label": "Row 2", "product": "spot", "entries": [{"name": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "valueBits": 9218868437227405312, "unit": "\u00c5", "text": "with,comma.dm4"}, {"name": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "valueBits": null, "unit": "1/\u00c5", "text": ""}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 13907323769373138249, "unit": "\u00b0", "text": ""}, {"name": "q", "valueBits": 13946825794198143337, "unit": "mrad", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:3", "label": "cr\r\nlf", "product": "distance", "entries": [{"name": "q", "valueBits": null, "unit": "\u00b5m", "text": ""}, {"name": "q", "valueBits": null, "unit": "", "text": ""}, {"name": "y1", "valueBits": 4513953284673711124, "unit": "1/m", "text": ""}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 4678729314985035566, "unit": "", "text": ""}, {"name": "q", "valueBits": 9223372036854775808, "unit": "mrad", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:4", "label": "Row 4", "product": "profile", "entries": [], "refusal": null, "lineage": "s4"}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# object: line break\n# image: 4186 x 226 px\n# x scale: none\n# y scale: none\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: line break; with,comma.dm4\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance\n# validation (angle): closed form, angle, with \"quotes\", and commas\n# validation (profile): samples: scikit-image 0.26.0 (a line break)\n# validation (spot): planted spots\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,plain.dm4,length,8.1686718015465193e-07,1/m,,\"closed form, angle, with \"\"quotes\"\", and commas\",\nmarks,marks:0,plain.dm4,y1,3.3525629136883954e-07,,,\"closed form, angle, with \"\"quotes\"\", and commas\",\nmarks,marks:0,plain.dm4,y1,,m,,\"closed form, angle, with \"\"quotes\"\", and commas\",\nmarks,marks:0,plain.dm4,q,1,\u00b0,,\"closed form, angle, with \"\"quotes\"\", and commas\",\nmarks,marks:0,plain.dm4,plain.dm4,4.0253877268014856e-09,nm,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,\"closed form, angle, with \"\"quotes\"\", and commas\",\nmarks,marks:1,Row 1,x1,-719146.47968699504,\u00b0,,\"closed form, angle, with \"\"quotes\"\", and commas\",\nmarks,marks:1,Row 1,\"cr\r\nlf\",-508.40766946525349,,,\"closed form, angle, with \"\"quotes\"\", and commas\",\nmarks,marks:1,Row 1,outcome,,,\"a \"\"quoted\"\" name\",\"closed form, angle, with \"\"quotes\"\", and commas\",\nspots,spots:2,Row 2,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,inf,\u00c5,\"with,comma.dm4\",planted spots,\nspots,spots:2,Row 2,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,,1/\u00c5,,planted spots,\nspots,spots:2,Row 2,tab\tand\u0085nel\u2028sep\u2029,-137129.0907385147,\u00b0,,planted spots,\nspots,spots:2,Row 2,q,-60982610.929446049,mrad,,planted spots,\nmarks,marks:3,\"cr\r\nlf\",q,,\u00b5m,,\"closed form, distance\",\nmarks,marks:3,\"cr\r\nlf\",q,,,,\"closed form, distance\",\nmarks,marks:3,\"cr\r\nlf\",y1,6.193989493472897e-07,1/m,,\"closed form, distance\",\nmarks,marks:3,\"cr\r\nlf\",tab\tand\u0085nel\u2028sep\u2029,61820.184068573973,,,\"closed form, distance\",\nmarks,marks:3,\"cr\r\nlf\",q,-0,mrad,,\"closed form, distance\",\n"}]} \ No newline at end of file +{"title": "macTEM results", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]], "descriptionLines": ["# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels", "# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels"], "lineageLine": "# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)", "cases": [{"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "with,comma.dm4", "object": "plain.dm4", "width": 3292, "height": 3397, "x": {"originBits": 1, "scaleBits": 13870170782931264748, "unit": "px"}, "y": {"originBits": 13858705342554176504, "scaleBits": 4477516673583951164, "unit": ""}, "notes": []}, "rows": [], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": null}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "", "object": "", "width": 1475, "height": 3863, "x": {"originBits": 13913614912728981959, "scaleBits": 4607182418800017408, "unit": "m"}, "y": {"originBits": 4473366651089836748, "scaleBits": 4503009890106136400, "unit": "mrad"}, "notes": ["xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]}, "rows": [{"group": "spots", "id": "spots:0", "label": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "product": "spot", "entries": [{"name": "q", "valueBits": 4599301119452119040, "unit": "nm", "text": ""}, {"name": "d", "valueBits": 13824397457163940752, "unit": "\u00c5", "text": ""}, {"name": "length", "valueBits": 9223372036854775808, "unit": "px", "text": ""}, {"name": "length", "valueBits": 4483328836346772969, "unit": "um", "text": ""}, {"name": "x1", "valueBits": 4591870180066957722, "unit": "1/nm", "text": ""}], "refusal": null, "lineage": "s0"}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: \n# object: \n# image: 1475 x 3863 px\n# x scale: 1.0 m per px, origin -378306.9206919935 px\n# y scale: 1.1140418184552812e-07 mrad per px, origin 1.198547637139609e-09 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (spot): planted spots; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nspots,spots:0,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,q,0.3125,nm,,planted spots; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s0\nspots,spots:0,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,d,-0.40821792564366266,\u00c5,,planted spots; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s0\nspots,spots:0,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,length,-0,px,,planted spots; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s0\nspots,spots:0,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,length,5.5841364548338526e-09,um,,planted spots; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s0\nspots,spots:0,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,x1,0.10000000000000001,1/nm,,planted spots; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s0\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "ctrl\u0001\u007f", "object": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "width": 3967, "height": 3913, "x": null, "y": {"originBits": 13897713229135952275, "scaleBits": 13729421787296120747, "unit": "1/m"}, "notes": ["line\nbreak"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "Row 0", "product": "angle", "entries": [{"name": "d", "valueBits": 1, "unit": "", "text": ""}, {"name": "length", "valueBits": 13905323795505704733, "unit": "\u00b0", "text": ""}, {"name": "length", "valueBits": null, "unit": "um", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:1", "label": "Row 1", "product": "distance", "entries": [{"name": "x1", "valueBits": 1, "unit": "1/m", "text": "cr\r\nlf"}, {"name": "q", "valueBits": 13829043358039307241, "unit": "\u00b5m", "text": ""}, {"name": "q", "valueBits": null, "unit": "nm", "text": ""}], "refusal": null, "lineage": "s1"}, {"group": "spots", "id": "spots:2", "label": "Row 2", "product": "spot", "entries": [], "refusal": null, "lineage": null}, {"group": "spots", "id": "spots:3", "label": "Row 3", "product": "spot", "entries": [{"name": "with,comma.dm4", "valueBits": 4648204705981854400, "unit": "um", "text": ""}], "refusal": "cr\r\nlf", "lineage": null}, {"group": "marks", "id": "marks:4", "label": "Row 4", "product": "angle", "entries": [], "refusal": null, "lineage": null}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: ctrl \n# object: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# image: 3967 x 3913 px\n# x scale: none\n# y scale: none\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: line break\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance; reader note: line break\n# validation (angle): closed form, angle, with \"quotes\", and commas; reader note: line break\n# validation (spot): planted spots; reader note: line break\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,Row 0,d,4.9406564584124654e-324,,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break\",\nmarks,marks:0,Row 0,length,-104997.09519141582,\u00b0,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break\",\nmarks,marks:0,Row 0,length,,um,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break\",\nmarks,marks:1,Row 1,x1,4.9406564584124654e-324,1/m,\"cr\r\nlf\",\"closed form, distance; reader note: line break\",s1\nmarks,marks:1,Row 1,q,-0.8322344634831299,\u00b5m,,\"closed form, distance; reader note: line break\",s1\nmarks,marks:1,Row 1,q,,nm,,\"closed form, distance; reader note: line break\",s1\nspots,spots:3,Row 3,\"with,comma.dm4\",567.69410581103148,um,,planted spots; reader note: line break,\nspots,spots:3,Row 3,outcome,,,\"cr\r\nlf\",planted spots; reader note: line break,\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "cr\r\nlf", "object": "", "width": 3257, "height": 3496, "x": {"originBits": 13780468080851010131, "scaleBits": 4706805043041404373, "unit": "pm"}, "y": {"originBits": 13919869217332155888, "scaleBits": 4489806213533731600, "unit": "um"}, "notes": ["xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "Row 0", "product": "distance", "entries": [], "refusal": null, "lineage": "s0"}, {"group": "spots", "id": "spots:1", "label": "Row 1", "product": "spot", "entries": [{"name": "d", "valueBits": 4548605656248489097, "unit": "1/px", "text": ""}, {"name": "y1", "valueBits": null, "unit": "mrad", "text": ""}, {"name": "ctrl\u0001\u007f", "valueBits": null, "unit": "pm", "text": ""}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": null, "unit": "1/\u00c5", "text": ""}], "refusal": null, "lineage": "s1"}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: cr lf\n# object: \n# image: 3257 x 3496 px\n# x scale: 4700414.89843889 pm per px, origin -0.0004586403062907574 px\n# y scale: 1.4433613971234772e-08 um per px, origin -960422.7245661598 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# validation (spot): planted spots; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nspots,spots:1,Row 1,d,0.00012166417855581832,1/px,,planted spots; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s1\nspots,spots:1,Row 1,y1,,mrad,,planted spots; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s1\nspots,spots:1,Row 1,ctrl\u0001\u007f,,pm,,planted spots; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s1\nspots,spots:1,Row 1,tab\tand\u0085nel\u2028sep\u2029,,1/\u00c5,,planted spots; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s1\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "line\nbreak", "object": "line\nbreak", "width": 2638, "height": 2737, "x": {"originBits": 13887529869885230160, "scaleBits": 4623193449843880065, "unit": "\u00c5"}, "y": {"originBits": 9223372036854775808, "scaleBits": 4489794098957596209, "unit": "1/px"}, "notes": ["a \"quoted\" name", "plain.dm4", "unvalidated"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "a \"quoted\" name", "product": "distance", "entries": [{"name": "plain.dm4", "valueBits": 13774550170479932637, "unit": "\u00b5m", "text": ""}, {"name": "length", "valueBits": 13860226465206106641, "unit": "\u00b0", "text": ""}], "refusal": "plain.dm4", "lineage": null}, {"group": "marks", "id": "marks:1", "label": "plain.dm4", "product": "angle", "entries": [{"name": "x1", "valueBits": 13795013905347428094, "unit": "1/nm", "text": ""}, {"name": "y1", "valueBits": 13916111843208673688, "unit": "1/\u00c5", "text": ""}, {"name": "length", "valueBits": 13944780179619938193, "unit": "px", "text": ""}, {"name": "y1", "valueBits": null, "unit": "", "text": "cr\r\nlf"}, {"name": "q", "valueBits": 13713189743075904339, "unit": "m", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:2", "label": "Row 2", "product": "distance", "entries": [{"name": "y1", "valueBits": 4689223108506201912, "unit": "um", "text": ""}, {"name": "length", "valueBits": 4599676419421066581, "unit": "1/nm", "text": ""}, {"name": "length", "valueBits": 4531709457107920541, "unit": "1/nm", "text": ""}, {"name": "d", "valueBits": null, "unit": "mrad", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:3", "label": "Row 3", "product": "distance", "entries": [{"name": "length", "valueBits": 13953064669076816644, "unit": "px", "text": ""}, {"name": "length", "valueBits": 13826891945726597913, "unit": "px", "text": ""}, {"name": "d", "valueBits": 13857999919115077096, "unit": "1/nm", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:4", "label": "Row 4", "product": "profile", "entries": [{"name": "q", "valueBits": 9223372036854775808, "unit": "\u00b5m", "text": ""}, {"name": "y1", "valueBits": 13930396955387614310, "unit": "1/m", "text": ""}], "refusal": null, "lineage": "s4"}, {"group": "spots", "id": "spots:5", "label": "Row 5", "product": "spot", "entries": [{"name": "q", "valueBits": 4475985662216163534, "unit": "", "text": ""}, {"name": "x1", "valueBits": 4694075660488176028, "unit": "", "text": "line\nbreak"}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 4607182418800017408, "unit": "1/\u00c5", "text": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301"}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:6", "label": "Row 6", "product": "distance", "entries": [{"name": "q", "valueBits": 4599676419421066581, "unit": "\u00b5m", "text": ""}, {"name": "y1", "valueBits": 4564205877686929647, "unit": "um", "text": ""}], "refusal": null, "lineage": "s6"}, {"group": "marks", "id": "marks:7", "label": "Row 7", "product": "distance", "entries": [{"name": "x1", "valueBits": 13731123496161135390, "unit": "\u00c5", "text": "line\nbreak"}, {"name": "d", "valueBits": 4535827082660111261, "unit": "\u00b0", "text": ""}, {"name": "d", "valueBits": 9221120237041090560, "unit": "1/m", "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}, {"name": "x1", "valueBits": 4627674475121943007, "unit": "mrad", "text": ""}, {"name": "y1", "valueBits": null, "unit": "um", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:8", "label": "Row 8", "product": "distance", "entries": [{"name": "q", "valueBits": 9218868437227405312, "unit": "\u00b0", "text": ""}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 4618981628002793772, "unit": "1/m", "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:9", "label": "Row 9", "product": "profile", "entries": [{"name": "y1", "valueBits": 4654998134299041448, "unit": "1/\u00c5", "text": ""}, {"name": "length", "valueBits": null, "unit": "\u00b0", "text": ""}, {"name": "y1", "valueBits": 13955696789406597625, "unit": "um", "text": ""}], "refusal": "plain.dm4", "lineage": null}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: line break\n# object: line break\n# image: 2638 x 2737 px\n# x scale: 12.441304500615162 \u00c5 per px, origin -6762.8373739003 px\n# y scale: 1.4413572086217786e-08 1/px per px, origin -0.0 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: a \"quoted\" name; plain.dm4; unvalidated\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance; reader note: a \"quoted\" name; plain.dm4; unvalidated\n# validation (angle): closed form, angle, with \"quotes\", and commas; reader note: a \"quoted\" name; plain.dm4; unvalidated\n# validation (profile): samples: scikit-image 0.26.0 (a line break); reader note: a \"quoted\" name; plain.dm4; unvalidated\n# validation (spot): planted spots; reader note: a \"quoted\" name; plain.dm4; unvalidated\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,\"a \"\"quoted\"\" name\",plain.dm4,-0.00019098518362296079,\u00b5m,,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:0,\"a \"\"quoted\"\" name\",length,-101.66461684180128,\u00b0,,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:0,\"a \"\"quoted\"\" name\",outcome,,,plain.dm4,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:1,plain.dm4,x1,-0.0043297365163394979,1/nm,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:1,plain.dm4,y1,-523647.40337839117,1/\u00c5,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:1,plain.dm4,length,-45741594.644286282,px,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:1,plain.dm4,y1,,,\"cr\r\nlf\",\"closed form, angle, with \"\"quotes\"\", and commas; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:1,plain.dm4,q,-1.445262702763652e-08,m,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:2,Row 2,y1,318948.64752458362,um,,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:2,Row 2,length,0.33333333333333331,1/nm,,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:2,Row 2,length,9.4729312023645688e-06,1/nm,,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:2,Row 2,d,,mrad,,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:3,Row 3,length,-161427948.18849957,px,,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:3,Row 3,length,-0.59337971497993458,px,,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:3,Row 3,d,-70.023493825479477,1/nm,,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:4,Row 4,q,-0,\u00b5m,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",s4\nmarks,marks:4,Row 4,y1,-4905189.9072161671,1/m,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",s4\nspots,spots:5,Row 5,q,1.7401464440791555e-09,,,\"planted spots; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nspots,spots:5,Row 5,x1,678520.69571261434,,\"line\nbreak\",\"planted spots; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nspots,spots:5,Row 5,tab\tand\u0085nel\u2028sep\u2029,1,1/\u00c5,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\"planted spots; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:6,Row 6,q,0.33333333333333331,\u00b5m,,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",s6\nmarks,marks:6,Row 6,y1,0.0014231356518555301,um,,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",s6\nmarks,marks:7,Row 7,x1,-2.2910736583637679e-07,\u00c5,\"line\nbreak\",\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:7,Row 7,d,1.7638131370876023e-05,\u00b0,,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:7,Row 7,d,nan,1/m,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:7,Row 7,x1,24.802408801655357,mrad,,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:7,Row 7,y1,,um,,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:8,Row 8,q,inf,\u00b0,,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:8,Row 8,tab\tand\u0085nel\u2028sep\u2029,6.4798029834330855,1/m,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,\"closed form, distance; reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:9,Row 9,y1,1656.0349769610129,1/\u00c5,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:9,Row 9,length,,\u00b0,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:9,Row 9,y1,-239871246.81983927,um,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\nmarks,marks:9,Row 9,outcome,,,plain.dm4,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: a \"\"quoted\"\" name; plain.dm4; unvalidated\",\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "object": "tab\tand\u0085nel\u2028sep\u2029", "width": 329, "height": 2540, "x": {"originBits": 4733214722362243522, "scaleBits": 4688996572955498173, "unit": "um"}, "y": {"originBits": 4492615507406039200, "scaleBits": 4625985442531634717, "unit": "nm"}, "notes": ["cr\r\nlf", "unvalidated"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "Row 0", "product": "profile", "entries": [], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:1", "label": "tab\tand\u0085nel\u2028sep\u2029", "product": "angle", "entries": [{"name": "length", "valueBits": 4627713569321409041, "unit": "\u00b5m", "text": ""}], "refusal": null, "lineage": "s1"}, {"group": "marks", "id": "marks:2", "label": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "product": "angle", "entries": [{"name": "x1", "valueBits": 4594266199546686779, "unit": "", "text": "tab\tand\u0085nel\u2028sep\u2029"}], "refusal": null, "lineage": null}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# object: tab and nel sep \n# image: 329 x 2540 px\n# x scale: 305762.5430043748 um per px, origin 266394414.025343 px\n# y scale: 18.801759614127253 nm per px, origin 2.326124045316936e-08 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: cr lf; unvalidated\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (angle): closed form, angle, with \"quotes\", and commas; reader note: cr lf; unvalidated\n# validation (profile): samples: scikit-image 0.26.0 (a line break); reader note: cr lf; unvalidated\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:1,tab\tand\u0085nel\u2028sep\u2029,length,24.941299298860091,\u00b5m,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: cr lf; unvalidated\",s1\nmarks,marks:2,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,x1,0.1415028998461397,,tab\tand\u0085nel\u2028sep\u2029,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: cr lf; unvalidated\",\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "line\nbreak", "object": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "width": 2848, "height": 487, "x": {"originBits": 9094988921128908188, "scaleBits": 4566955931646088189, "unit": "\u00b5m"}, "y": {"originBits": 4693405095091938307, "scaleBits": 4626974620418983342, "unit": "m"}, "notes": ["line\nbreak", "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "Row 0", "product": "distance", "entries": [{"name": "ctrl\u0001\u007f", "valueBits": 13899264677658896016, "unit": "1/m", "text": ""}, {"name": "line\nbreak", "valueBits": 4627422942934720745, "unit": "nm", "text": ""}], "refusal": "line\nbreak", "lineage": "s0"}, {"group": "spots", "id": "spots:1", "label": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "product": "spot", "entries": [{"name": "d", "valueBits": 4544421176114877060, "unit": "\u00c5", "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:2", "label": "Row 2", "product": "angle", "entries": [{"name": "x1", "valueBits": 4548762547616847017, "unit": "nm", "text": ""}], "refusal": "tab\tand\u0085nel\u2028sep\u2029", "lineage": "s2"}, {"group": "spots", "id": "spots:3", "label": "Row 3", "product": "spot", "entries": [{"name": "d", "valueBits": 4656924824258413962, "unit": "px", "text": ""}, {"name": "y1", "valueBits": 4591870180066957722, "unit": "\u00c5", "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}, {"name": "x1", "valueBits": 13756186716558330874, "unit": "nm", "text": ""}, {"name": "length", "valueBits": null, "unit": "nm", "text": ""}], "refusal": null, "lineage": "s3"}, {"group": "spots", "id": "spots:4", "label": "Row 4", "product": "spot", "entries": [], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:5", "label": "Row 5", "product": "profile", "entries": [{"name": "q", "valueBits": 13724446403347412190, "unit": "\u00c5", "text": ""}, {"name": "d", "valueBits": 4481655518048654467, "unit": "\u00b0", "text": "plain.dm4"}, {"name": "x1", "valueBits": 4635548367274239060, "unit": "nm", "text": ""}], "refusal": null, "lineage": "s5"}, {"group": "spots", "id": "spots:6", "label": "line\nbreak", "product": "spot", "entries": [{"name": "y1", "valueBits": 4591870180066957722, "unit": "\u00b0", "text": ""}, {"name": "length", "valueBits": 13714694092415811649, "unit": "pm", "text": "a \"quoted\" name"}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:7", "label": "Row 7", "product": "distance", "entries": [{"name": "x1", "valueBits": 4544657646880243314, "unit": "1/m", "text": ""}, {"name": "cr\r\nlf", "valueBits": 0, "unit": "\u00b5m", "text": ""}], "refusal": null, "lineage": "s7"}, {"group": "spots", "id": "spots:8", "label": "plain.dm4", "product": "spot", "entries": [], "refusal": null, "lineage": "s8"}, {"group": "marks", "id": "marks:9", "label": "Row 9", "product": "profile", "entries": [{"name": "x1", "valueBits": 13755636121888493211, "unit": "m", "text": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301"}, {"name": "y1", "valueBits": 9218868437227405312, "unit": "1/m", "text": ""}], "refusal": null, "lineage": "s9"}, {"group": "marks", "id": "marks:10", "label": "Row 10", "product": "profile", "entries": [{"name": "q", "valueBits": null, "unit": "m", "text": ""}, {"name": "y1", "valueBits": 4595304287322729717, "unit": "\u00c5", "text": "plain.dm4"}], "refusal": "plain.dm4", "lineage": "s10"}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: line break\n# object: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# image: 2848 x 487 px\n# x scale: 0.002085792094499882 \u00b5m per px, origin 1e+300 px\n# y scale: 22.316025425277694 m per px, origin 600456.609303594 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\n# validation (angle): closed form, angle, with \"quotes\", and commas; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\n# validation (profile): samples: scikit-image 0.26.0 (a line break); reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\n# validation (spot): planted spots; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,Row 0,ctrl\u0001\u007f,-41180.662962985341,1/m,,\"closed form, distance; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\",s0\nmarks,marks:0,Row 0,\"line\nbreak\",23.908786959452218,nm,,\"closed form, distance; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\",s0\nmarks,marks:0,Row 0,outcome,,,\"line\nbreak\",\"closed form, distance; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\",s0\nspots,spots:1,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,d,6.4953897911010762e-05,\u00c5,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,planted spots; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\nmarks,marks:2,Row 2,x1,0.00012551059367208364,nm,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\",s2\nmarks,marks:2,Row 2,outcome,,,tab\tand\u0085nel\u2028sep\u2029,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\",s2\nspots,spots:3,Row 3,d,2140.2271089262258,px,,planted spots; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,s3\nspots,spots:3,Row 3,y1,0.10000000000000001,\u00c5,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,planted spots; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,s3\nspots,spots:3,Row 3,x1,-1.1345251107469288e-05,nm,,planted spots; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,s3\nspots,spots:3,Row 3,length,,nm,,planted spots; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,s3\nmarks,marks:5,Row 5,q,-8.5787740113915406e-08,\u00c5,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\",s5\nmarks,marks:5,Row 5,d,4.2000000000000004e-09,\u00b0,plain.dm4,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\",s5\nmarks,marks:5,Row 5,x1,83.104372626069846,nm,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\",s5\nspots,spots:6,\"line\nbreak\",y1,0.10000000000000001,\u00b0,,planted spots; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\nspots,spots:6,\"line\nbreak\",length,-1.898156729533847e-08,pm,\"a \"\"quoted\"\" name\",planted spots; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\nmarks,marks:7,Row 7,x1,6.8158674380253294e-05,1/m,,\"closed form, distance; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\",s7\nmarks,marks:7,Row 7,\"cr\r\nlf\",0,\u00b5m,,\"closed form, distance; reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\",s7\nmarks,marks:9,Row 9,x1,-1.041250745559908e-05,m,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\",s9\nmarks,marks:9,Row 9,y1,inf,1/m,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\",s9\nmarks,marks:10,Row 10,q,,m,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\",s10\nmarks,marks:10,Row 10,y1,0.17031562360975952,\u00c5,plain.dm4,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\",s10\nmarks,marks:10,Row 10,outcome,,,plain.dm4,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\",s10\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "object": "", "width": 910, "height": 1419, "x": {"originBits": 13939271429612581697, "scaleBits": 4651884496712404771, "unit": "mrad"}, "y": {"originBits": 13927674916981875189, "scaleBits": 4602828426748479482, "unit": ""}, "notes": ["unvalidated"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "product": "profile", "entries": [{"name": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "valueBits": 13707402285593838754, "unit": "1/m", "text": "with,comma.dm4"}], "refusal": "a \"quoted\" name", "lineage": "s0"}, {"group": "marks", "id": "marks:1", "label": "Row 1", "product": "profile", "entries": [{"name": "x1", "valueBits": 4686930667810644973, "unit": "pm", "text": ""}, {"name": "x1", "valueBits": 13937898216714893226, "unit": "1/\u00c5", "text": ""}, {"name": "d", "valueBits": 13799987676986128638, "unit": "mrad", "text": ""}, {"name": "length", "valueBits": null, "unit": "pm", "text": "line\nbreak"}, {"name": "length", "valueBits": 13706814433979599228, "unit": "1/nm", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:2", "label": "Row 2", "product": "distance", "entries": [{"name": "d", "valueBits": 1, "unit": "px", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:3", "label": "", "product": "angle", "entries": [], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:4", "label": "Row 4", "product": "distance", "entries": [{"name": "d", "valueBits": 13752438795419786546, "unit": "1/px", "text": ""}, {"name": "y1", "valueBits": 4503599627370496, "unit": "um", "text": ""}, {"name": "q", "valueBits": 4531405976752577453, "unit": "", "text": ""}], "refusal": null, "lineage": null}, {"group": "spots", "id": "spots:5", "label": "Row 5", "product": "spot", "entries": [{"name": "d", "valueBits": 13784015260297682662, "unit": "1/m", "text": ""}, {"name": "length", "valueBits": null, "unit": "1/nm", "text": ""}, {"name": "q", "valueBits": 4706777625615432035, "unit": "1/nm", "text": ""}, {"name": "x1", "valueBits": null, "unit": "1/\u00c5", "text": ""}, {"name": "x1", "valueBits": 13896895092319333450, "unit": "\u00b5m", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:6", "label": "", "product": "distance", "entries": [], "refusal": null, "lineage": "s6"}, {"group": "marks", "id": "marks:7", "label": "Row 7", "product": "angle", "entries": [{"name": "cr\r\nlf", "valueBits": 13814709189024989846, "unit": "pm", "text": ""}, {"name": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "valueBits": 13731727638777578127, "unit": "mrad", "text": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301"}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 4503599627370496, "unit": "m", "text": ""}, {"name": "y1", "valueBits": 4607182418800017408, "unit": "pm", "text": "line\nbreak"}], "refusal": null, "lineage": "s7"}, {"group": "marks", "id": "marks:8", "label": "Row 8", "product": "profile", "entries": [{"name": "x1", "valueBits": 4496913323142142806, "unit": "1/nm", "text": "plain.dm4"}, {"name": "d", "valueBits": 0, "unit": "", "text": "line\nbreak"}, {"name": "d", "valueBits": 13772526766370006611, "unit": "1/nm", "text": ""}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 13706032018372591170, "unit": "", "text": ""}, {"name": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "valueBits": 4675187467474216093, "unit": "\u00c5", "text": ""}], "refusal": "tab\tand\u0085nel\u2028sep\u2029", "lineage": null}, {"group": "marks", "id": "marks:9", "label": "Row 9", "product": "distance", "entries": [{"name": "q", "valueBits": 4479262106998068594, "unit": "nm", "text": ""}, {"name": "y1", "valueBits": null, "unit": "pm", "text": ""}, {"name": "x1", "valueBits": 13766977064932706772, "unit": "1/\u00c5", "text": ""}], "refusal": null, "lineage": "s9"}, {"group": "marks", "id": "marks:10", "label": "with,comma.dm4", "product": "profile", "entries": [{"name": "d", "valueBits": 4481655518048654467, "unit": "1/m", "text": ""}, {"name": "x1", "valueBits": 4580222137614393999, "unit": "m", "text": "cr\r\nlf"}, {"name": "d", "valueBits": 13953756616497539962, "unit": "1/m", "text": ""}, {"name": "x1", "valueBits": 4591870180066957722, "unit": "px", "text": ""}, {"name": "plain.dm4", "valueBits": 4616940889931460258, "unit": "1/\u00c5", "text": "cr\r\nlf"}], "refusal": null, "lineage": null}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# object: \n# image: 910 x 1419 px\n# x scale: 986.0378774446184 mrad per px, origin -19126320.36308599 px\n# y scale: none\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: unvalidated\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance; reader note: unvalidated\n# validation (angle): closed form, angle, with \"quotes\", and commas; reader note: unvalidated\n# validation (profile): samples: scikit-image 0.26.0 (a line break); reader note: unvalidated\n# validation (spot): planted spots; reader note: unvalidated\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,-6.1643311871405604e-09,1/m,\"with,comma.dm4\",\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",s0\nmarks,marks:0,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,outcome,,,\"a \"\"quoted\"\" name\",\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",s0\nmarks,marks:1,Row 1,x1,223827.51842668597,pm,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",\nmarks,marks:1,Row 1,x1,-15393959.838802177,1/\u00c5,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",\nmarks,marks:1,Row 1,d,-0.0094750914584804634,mrad,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",\nmarks,marks:1,Row 1,length,,pm,\"line\nbreak\",\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",\nmarks,marks:1,Row 1,length,-5.6780717287836231e-09,1/nm,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",\nmarks,marks:2,Row 2,d,4.9406564584124654e-324,px,,\"closed form, distance; reader note: unvalidated\",\nmarks,marks:4,Row 4,d,-6.3127101313017489e-06,1/px,,\"closed form, distance; reader note: unvalidated\",\nmarks,marks:4,Row 4,y1,2.2250738585072014e-308,um,,\"closed form, distance; reader note: unvalidated\",\nmarks,marks:4,Row 4,q,8.9588154827244924e-06,,,\"closed form, distance; reader note: unvalidated\",\nspots,spots:5,Row 5,d,-0.0008135853288093436,1/m,,planted spots; reader note: unvalidated,\nspots,spots:5,Row 5,length,,1/nm,,planted spots; reader note: unvalidated,\nspots,spots:5,Row 5,q,4674880.4306930033,1/nm,,planted spots; reader note: unvalidated,\nspots,spots:5,Row 5,x1,,1/\u00c5,,planted spots; reader note: unvalidated,\nspots,spots:5,Row 5,x1,-28353.830234568835,\u00b5m,,planted spots; reader note: unvalidated,\nmarks,marks:7,Row 7,\"cr\r\nlf\",-0.092602751953345525,pm,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: unvalidated\",s7\nmarks,marks:7,Row 7,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,-2.5177919638165456e-07,mrad,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: unvalidated\",s7\nmarks,marks:7,Row 7,tab\tand\u0085nel\u2028sep\u2029,2.2250738585072014e-308,m,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: unvalidated\",s7\nmarks,marks:7,Row 7,y1,1,pm,\"line\nbreak\",\"closed form, angle, with \"\"quotes\"\", and commas; reader note: unvalidated\",s7\nmarks,marks:8,Row 8,x1,4.5160717344485185e-08,1/nm,plain.dm4,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",\nmarks,marks:8,Row 8,d,0,,\"line\nbreak\",\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",\nmarks,marks:8,Row 8,d,-0.0001361407053280134,1/nm,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",\nmarks,marks:8,Row 8,tab\tand\u0085nel\u2028sep\u2029,-5.0308727077076487e-09,,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",\nmarks,marks:8,Row 8,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,36049.851703950415,\u00c5,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",\nmarks,marks:8,Row 8,outcome,,,tab\tand\u0085nel\u2028sep\u2029,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",\nmarks,marks:9,Row 9,q,2.9727535397735533e-09,nm,,\"closed form, distance; reader note: unvalidated\",s9\nmarks,marks:9,Row 9,y1,,pm,,\"closed form, distance; reader note: unvalidated\",s9\nmarks,marks:9,Row 9,x1,-5.7464092863463275e-05,1/\u00c5,,\"closed form, distance; reader note: unvalidated\",s9\nmarks,marks:10,\"with,comma.dm4\",d,4.2000000000000004e-09,1/m,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",\nmarks,marks:10,\"with,comma.dm4\",x1,0.015837734616726492,m,\"cr\r\nlf\",\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",\nmarks,marks:10,\"with,comma.dm4\",d,-182049588.29623014,1/m,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",\nmarks,marks:10,\"with,comma.dm4\",x1,0.10000000000000001,px,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",\nmarks,marks:10,\"with,comma.dm4\",plain.dm4,4.6672634682142036,1/\u00c5,\"cr\r\nlf\",\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: unvalidated\",\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "object": "plain.dm4", "width": 2799, "height": 1249, "x": null, "y": {"originBits": 13878327386041867107, "scaleBits": 4569159823982421619, "unit": "\u00b5m"}, "notes": ["xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "Row 0", "product": "distance", "entries": [{"name": "q", "valueBits": 4698258651021440620, "unit": "px", "text": ""}, {"name": "y1", "valueBits": 4552837924389239702, "unit": "nm", "text": ""}, {"name": "d", "valueBits": 13906730063199098112, "unit": "1/\u00c5", "text": ""}], "refusal": "cr\r\nlf", "lineage": null}, {"group": "marks", "id": "marks:1", "label": "Row 1", "product": "distance", "entries": [{"name": "ctrl\u0001\u007f", "valueBits": 13923237704797373710, "unit": "mrad", "text": ""}, {"name": "length", "valueBits": 4495730509863128555, "unit": "", "text": ""}, {"name": "q", "valueBits": 4653547639462653641, "unit": "m", "text": ""}, {"name": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "valueBits": 13762340425605183628, "unit": "1/px", "text": "with,comma.dm4"}, {"name": "q", "valueBits": 4715802419409686539, "unit": "m", "text": "cr\r\nlf"}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:2", "label": "Row 2", "product": "angle", "entries": [], "refusal": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "lineage": "s2"}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# object: plain.dm4\n# image: 2799 x 1249 px\n# x scale: none\n# y scale: 0.0030415780380906253 \u00b5m per px, origin -1646.3067688026574 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# validation (angle): closed form, angle, with \"quotes\", and commas; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,Row 0,q,1282393.769683267,px,,\"closed form, distance; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:0,Row 0,y1,0.00023597390243021145,nm,,\"closed form, distance; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:0,Row 0,d,-125460.98345406726,1/\u00c5,,\"closed form, distance; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:0,Row 0,outcome,,,\"cr\r\nlf\",\"closed form, distance; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:1,Row 1,ctrl\u0001\u007f,-1656556.5537989768,mrad,,\"closed form, distance; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:1,Row 1,length,3.7333515643118278e-08,,,\"closed form, distance; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:1,Row 1,q,1326.2306348000877,m,,\"closed form, distance; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:1,Row 1,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,-2.8281290394443134e-05,1/px,\"with,comma.dm4\",\"closed form, distance; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:1,Row 1,q,18765066.490127604,m,\"cr\r\nlf\",\"closed form, distance; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:2,Row 2,outcome,,,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",s2\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "object": "a \"quoted\" name", "width": 4321, "height": 4044, "x": null, "y": {"originBits": 13827916316030007121, "scaleBits": 4472687804347289890, "unit": "m"}, "notes": []}, "rows": [{"group": "spots", "id": "spots:0", "label": "plain.dm4", "product": "spot", "entries": [{"name": "length", "valueBits": 13713048628770387100, "unit": "\u00c5", "text": "tab\tand\u0085nel\u2028sep\u2029"}, {"name": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "valueBits": 13872739135681905619, "unit": "\u00b0", "text": ""}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 13767518513773221047, "unit": "1/m", "text": "with,comma.dm4"}], "refusal": "plain.dm4", "lineage": "s0"}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# object: a \"quoted\" name\n# image: 4321 x 4044 px\n# x scale: none\n# y scale: 1.0581654210572247e-09 m per px, origin -0.7071076646386506 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: none\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (spot): planted spots\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nspots,spots:0,plain.dm4,length,-1.421917299228103e-08,\u00c5,tab\tand\u0085nel\u2028sep\u2029,planted spots,s0\nspots,spots:0,plain.dm4,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,-699.84287258062466,\u00b0,,planted spots,s0\nspots,spots:0,plain.dm4,tab\tand\u0085nel\u2028sep\u2029,-6.1231029591618229e-05,1/m,\"with,comma.dm4\",planted spots,s0\nspots,spots:0,plain.dm4,outcome,,,plain.dm4,planted spots,s0\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "tab\tand\u0085nel\u2028sep\u2029", "object": "line\nbreak", "width": 4022, "height": 4288, "x": {"originBits": 4622387742981077499, "scaleBits": 4665786069382933428, "unit": "mrad"}, "y": {"originBits": 4471667097093851367, "scaleBits": 4585660602377988037, "unit": "m"}, "notes": ["plain.dm4", "a \"quoted\" name", "unvalidated"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "Row 0", "product": "angle", "entries": [{"name": "ctrl\u0001\u007f", "valueBits": 4712514385883057960, "unit": "1/nm", "text": ""}, {"name": "with,comma.dm4", "valueBits": 4532063228917357415, "unit": "nm", "text": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301"}, {"name": "y1", "valueBits": 4706781487404986202, "unit": "1/\u00c5", "text": ""}, {"name": "y1", "valueBits": 4637962547667661208, "unit": "\u00b0", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:1", "label": "Row 1", "product": "profile", "entries": [{"name": "length", "valueBits": 13868492340321869005, "unit": "", "text": ""}, {"name": "x1", "valueBits": null, "unit": "\u00b0", "text": ""}], "refusal": "line\nbreak", "lineage": null}, {"group": "marks", "id": "marks:2", "label": "tab\tand\u0085nel\u2028sep\u2029", "product": "angle", "entries": [{"name": "d", "valueBits": null, "unit": "px", "text": ""}, {"name": "length", "valueBits": null, "unit": "1/nm", "text": ""}], "refusal": null, "lineage": "s2"}, {"group": "marks", "id": "marks:3", "label": "Row 3", "product": "angle", "entries": [{"name": "length", "valueBits": 4477328231536385628, "unit": "px", "text": ""}, {"name": "x1", "valueBits": 13815109636984193599, "unit": "1/nm", "text": ""}, {"name": "d", "valueBits": 4578816606122446751, "unit": "pm", "text": ""}, {"name": "y1", "valueBits": 4670528935035588089, "unit": "1/nm", "text": ""}], "refusal": null, "lineage": "s3"}, {"group": "marks", "id": "marks:4", "label": "Row 4", "product": "angle", "entries": [{"name": "q", "valueBits": 4577783349497978547, "unit": "mrad", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:5", "label": "Row 5", "product": "profile", "entries": [{"name": "q", "valueBits": 9094988921128908188, "unit": "1/px", "text": "a \"quoted\" name"}, {"name": "q", "valueBits": 13943581525254951929, "unit": "px", "text": ""}, {"name": "length", "valueBits": 18442240474082181120, "unit": "um", "text": "with,comma.dm4"}, {"name": "length", "valueBits": null, "unit": "px", "text": ""}], "refusal": "", "lineage": null}, {"group": "marks", "id": "marks:6", "label": "tab\tand\u0085nel\u2028sep\u2029", "product": "profile", "entries": [], "refusal": null, "lineage": "s6"}, {"group": "marks", "id": "marks:7", "label": "Row 7", "product": "angle", "entries": [{"name": "q", "valueBits": 4503599627370496, "unit": "1/m", "text": ""}, {"name": "length", "valueBits": null, "unit": "1/px", "text": ""}, {"name": "length", "valueBits": 4503599627370496, "unit": "\u00b0", "text": ""}], "refusal": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "lineage": null}, {"group": "spots", "id": "spots:8", "label": "a \"quoted\" name", "product": "spot", "entries": [{"name": "length", "valueBits": 13860466753531480608, "unit": "\u00b5m", "text": ""}, {"name": "length", "valueBits": 4498817307550165169, "unit": "1/m", "text": ""}], "refusal": null, "lineage": null}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: tab and nel sep \n# object: line break\n# image: 4022 x 4288 px\n# x scale: 8295.419419428195 mrad per px, origin 11.010081604324105 px\n# y scale: 0.03816239922816992 m per px, origin 8.892053414442771e-10 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: plain.dm4; a \"quoted\" name; unvalidated\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (angle): closed form, angle, with \"quotes\", and commas; reader note: plain.dm4; a \"quoted\" name; unvalidated\n# validation (profile): samples: scikit-image 0.26.0 (a line break); reader note: plain.dm4; a \"quoted\" name; unvalidated\n# validation (spot): planted spots; reader note: plain.dm4; a \"quoted\" name; unvalidated\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,Row 0,ctrl\u0001\u007f,11646701.546180323,1/nm,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:0,Row 0,\"with,comma.dm4\",1.0072243959170173e-05,nm,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:0,Row 0,y1,4678477.0024832133,1/\u00c5,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:0,Row 0,y1,117.41193945328121,\u00b0,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:1,Row 1,length,-364.5190688236151,,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:1,Row 1,x1,,\u00b0,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:1,Row 1,outcome,,,\"line\nbreak\",\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:2,tab\tand\u0085nel\u2028sep\u2029,d,,px,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",s2\nmarks,marks:2,tab\tand\u0085nel\u2028sep\u2029,length,,1/nm,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",s2\nmarks,marks:3,Row 3,length,2.1729213952754607e-09,px,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",s3\nmarks,marks:3,Row 3,x1,-0.098160083759247549,1/nm,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",s3\nmarks,marks:3,Row 3,d,0.013293158833057648,pm,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",s3\nmarks,marks:3,Row 3,y1,17461.283568097253,1/nm,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",s3\nmarks,marks:4,Row 4,q,0.011500744309884103,mrad,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:5,Row 5,q,1.0000000000000001e+300,1/px,\"a \"\"quoted\"\" name\",\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:5,Row 5,q,-36810923.690101571,px,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:5,Row 5,length,-inf,um,\"with,comma.dm4\",\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:5,Row 5,length,,px,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:5,Row 5,outcome,,,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:7,Row 7,q,2.2250738585072014e-308,1/m,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:7,Row 7,length,,1/px,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:7,Row 7,length,2.2250738585072014e-308,\u00b0,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:7,Row 7,outcome,,,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nspots,spots:8,\"a \"\"quoted\"\" name\",length,-105.07931932344991,\u00b5m,,\"planted spots; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\nspots,spots:8,\"a \"\"quoted\"\" name\",length,5.7760229255840001e-08,1/m,,\"planted spots; reader note: plain.dm4; a \"\"quoted\"\" name; unvalidated\",\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "a \"quoted\" name", "object": "with,comma.dm4", "width": 1937, "height": 3332, "x": {"originBits": 4599301119452119040, "scaleBits": 4708482899504606632, "unit": "pm"}, "y": {"originBits": 13820873553073559553, "scaleBits": 13734379852007545584, "unit": "1/m"}, "notes": ["line\nbreak", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]}, "rows": [{"group": "spots", "id": "spots:0", "label": "a \"quoted\" name", "product": "spot", "entries": [{"name": "d", "valueBits": 13750840328995598716, "unit": "\u00c5", "text": ""}, {"name": "d", "valueBits": 13777033932816668022, "unit": "pm", "text": ""}, {"name": "d", "valueBits": 4671815843786748063, "unit": "\u00c5", "text": ""}, {"name": "x1", "valueBits": 4701993795547575684, "unit": "\u00b0", "text": ""}], "refusal": null, "lineage": "s0"}, {"group": "marks", "id": "marks:1", "label": "with,comma.dm4", "product": "distance", "entries": [{"name": "q", "valueBits": 4607182418800017408, "unit": "\u00c5", "text": ""}, {"name": "x1", "valueBits": 4492893784155978568, "unit": "px", "text": ""}, {"name": "d", "valueBits": 9094988921128908188, "unit": "pm", "text": ""}], "refusal": null, "lineage": "s1"}, {"group": "marks", "id": "marks:2", "label": "cr\r\nlf", "product": "profile", "entries": [], "refusal": null, "lineage": "s2"}, {"group": "marks", "id": "marks:3", "label": "Row 3", "product": "angle", "entries": [{"name": "q", "valueBits": 13877243066636823743, "unit": "nm", "text": ""}, {"name": "x1", "valueBits": 9221120237041090560, "unit": "um", "text": ""}, {"name": "d", "valueBits": 4664715983565399051, "unit": "m", "text": ""}, {"name": "length", "valueBits": 13710551404614712704, "unit": "m", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:4", "label": "Row 4", "product": "profile", "entries": [{"name": "length", "valueBits": null, "unit": "m", "text": "tab\tand\u0085nel\u2028sep\u2029"}, {"name": "length", "valueBits": 13878147258217294727, "unit": "1/nm", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:5", "label": "Row 5", "product": "profile", "entries": [{"name": "q", "valueBits": 13881814520230399776, "unit": "1/nm", "text": ""}], "refusal": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "lineage": null}, {"group": "spots", "id": "spots:6", "label": "Row 6", "product": "spot", "entries": [{"name": "y1", "valueBits": 13885304839262439097, "unit": "\u00c5", "text": "tab\tand\u0085nel\u2028sep\u2029"}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:7", "label": "plain.dm4", "product": "profile", "entries": [], "refusal": null, "lineage": "s7"}, {"group": "spots", "id": "spots:8", "label": "Row 8", "product": "spot", "entries": [{"name": "length", "valueBits": 13741269126295199618, "unit": "\u00b0", "text": ""}, {"name": "d", "valueBits": 4562413828067657735, "unit": "\u00b0", "text": ""}, {"name": "y1", "valueBits": null, "unit": "1/px", "text": ""}], "refusal": null, "lineage": "s8"}, {"group": "spots", "id": "spots:9", "label": "line\nbreak", "product": "spot", "entries": [{"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 13712758342483462014, "unit": "1/nm", "text": ""}, {"name": "length", "valueBits": 4590870268292438764, "unit": "1/\u00c5", "text": ""}, {"name": "d", "valueBits": null, "unit": "\u00c5", "text": ""}, {"name": "", "valueBits": 18442240474082181120, "unit": "1/nm", "text": ""}, {"name": "a \"quoted\" name", "valueBits": 4464202966429764446, "unit": "1/nm", "text": ""}], "refusal": null, "lineage": "s9"}, {"group": "marks", "id": "marks:10", "label": "Row 10", "product": "distance", "entries": [{"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 13804372741335276636, "unit": "\u00c5", "text": ""}, {"name": "x1", "valueBits": 13847048932401686532, "unit": "1/m", "text": "tab\tand\u0085nel\u2028sep\u2029"}], "refusal": "line\nbreak", "lineage": null}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: a \"quoted\" name\n# object: with,comma.dm4\n# image: 1937 x 3332 px\n# x scale: 6263040.499583639 pm per px, origin 0.3125 px\n# y scale: none\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# validation (angle): closed form, angle, with \"quotes\", and commas; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# validation (profile): samples: scikit-image 0.26.0 (a line break); reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# validation (spot): planted spots; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nspots,spots:0,\"a \"\"quoted\"\" name\",d,-4.9587564049348886e-06,\u00c5,,planted spots; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s0\nspots,spots:0,\"a \"\"quoted\"\" name\",d,-0.00027247476831723046,pm,,planted spots; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s0\nspots,spots:0,\"a \"\"quoted\"\" name\",d,22143.030331478101,\u00c5,,planted spots; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s0\nspots,spots:0,\"a \"\"quoted\"\" name\",x1,2206947.7476870436,\u00b0,,planted spots; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s0\nmarks,marks:1,\"with,comma.dm4\",q,1,\u00c5,,\"closed form, distance; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",s1\nmarks,marks:1,\"with,comma.dm4\",x1,2.4181980983065808e-08,px,,\"closed form, distance; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",s1\nmarks,marks:1,\"with,comma.dm4\",d,1.0000000000000001e+300,pm,,\"closed form, distance; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",s1\nmarks,marks:3,Row 3,q,-1399.7610803235291,nm,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:3,Row 3,x1,nan,um,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:3,Row 3,d,7270.4723282242294,m,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:3,Row 3,length,-1.0087862178735102e-08,m,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:4,Row 4,length,,m,tab\tand\u0085nel\u2028sep\u2029,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:4,Row 4,length,-1605.3504432800416,1/nm,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:5,Row 5,q,-2830.3785720261658,1/nm,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:5,Row 5,outcome,,,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nspots,spots:6,Row 6,y1,-4739.1838111893094,\u00c5,tab\tand\u0085nel\u2028sep\u2029,planted spots; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,\nspots,spots:8,Row 8,length,-1.1202567260243806e-06,\u00b0,,planted spots; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s8\nspots,spots:8,Row 8,d,0.0010345468337722445,\u00b0,,planted spots; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s8\nspots,spots:8,Row 8,y1,,1/px,,planted spots; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s8\nspots,spots:9,\"line\nbreak\",tab\tand\u0085nel\u2028sep\u2029,-1.3738934615012157e-08,1/nm,,planted spots; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s9\nspots,spots:9,\"line\nbreak\",length,0.086123436566690692,1/\u00c5,,planted spots; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s9\nspots,spots:9,\"line\nbreak\",d,,\u00c5,,planted spots; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s9\nspots,spots:9,\"line\nbreak\",,-inf,1/nm,,planted spots; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s9\nspots,spots:9,\"line\nbreak\",\"a \"\"quoted\"\" name\",2.9154680344505464e-10,1/nm,,planted spots; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,s9\nmarks,marks:10,Row 10,tab\tand\u0085nel\u2028sep\u2029,-0.018538931057232907,\u00c5,,\"closed form, distance; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:10,Row 10,x1,-13.300076581672336,1/m,tab\tand\u0085nel\u2028sep\u2029,\"closed form, distance; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\nmarks,marks:10,Row 10,outcome,,,\"line\nbreak\",\"closed form, distance; reader note: line break; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "plain.dm4", "object": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "width": 3175, "height": 1507, "x": {"originBits": 4564072149230898742, "scaleBits": 18442240474082181120, "unit": "1/px"}, "y": {"originBits": 4517534489384998224, "scaleBits": 4534330381925285134, "unit": "\u00b0"}, "notes": ["ctrl\u0001\u007f"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "a \"quoted\" name", "product": "profile", "entries": [{"name": "d", "valueBits": 13788960302083299679, "unit": "pm", "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}, {"name": "x1", "valueBits": null, "unit": "nm", "text": ""}, {"name": "y1", "valueBits": 13868280523672788959, "unit": "", "text": ""}], "refusal": "cr\r\nlf", "lineage": null}, {"group": "marks", "id": "marks:1", "label": "Row 1", "product": "profile", "entries": [{"name": "x1", "valueBits": 13835101845110007055, "unit": "mrad", "text": "ctrl\u0001\u007f"}, {"name": "y1", "valueBits": 4520981519797565687, "unit": "nm", "text": ""}, {"name": "d", "valueBits": 13958001656394434442, "unit": "m", "text": ""}, {"name": "x1", "valueBits": 4628804002521660242, "unit": "\u00b0", "text": ""}, {"name": "with,comma.dm4", "valueBits": 4720375607279395191, "unit": "pm", "text": ""}], "refusal": null, "lineage": "s1"}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: plain.dm4\n# object: \u00c5ngstr\u00f6m \u00b5m \u00e9\u0301\n# image: 3175 x 1507 px\n# x scale: none\n# y scale: 1.3912950547533109e-05 \u00b0 per px, origin 1.043473177618954e-06 px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: ctrl \n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (profile): samples: scikit-image 0.26.0 (a line break); reader note: ctrl \n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,\"a \"\"quoted\"\" name\",d,-0.0017228931670182008,pm,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: ctrl \",\nmarks,marks:0,\"a \"\"quoted\"\" name\",x1,,nm,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: ctrl \",\nmarks,marks:0,\"a \"\"quoted\"\" name\",y1,-352.47868631826526,,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: ctrl \",\nmarks,marks:0,\"a \"\"quoted\"\" name\",outcome,,,\"cr\r\nlf\",\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: ctrl \",\nmarks,marks:1,Row 1,x1,-2.0194465900464205,mrad,ctrl\u0001\u007f,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: ctrl \",s1\nmarks,marks:1,Row 1,y1,1.7734102600270102e-06,nm,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: ctrl \",s1\nmarks,marks:1,Row 1,d,-348687815.7042166,m,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: ctrl \",s1\nmarks,marks:1,Row 1,x1,28.815296245210739,\u00b0,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: ctrl \",s1\nmarks,marks:1,Row 1,\"with,comma.dm4\",38048605.788393907,pm,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: ctrl \",s1\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "with,comma.dm4", "object": "", "width": 2204, "height": 3216, "x": null, "y": null, "notes": []}, "rows": [{"group": "marks", "id": "marks:0", "label": "Row 0", "product": "distance", "entries": [{"name": "", "valueBits": 9218868437227405312, "unit": "\u00c5", "text": "plain.dm4"}, {"name": "d", "valueBits": 4519750708393315343, "unit": "um", "text": "plain.dm4"}, {"name": "x1", "valueBits": 9094988921128908188, "unit": "m", "text": ""}, {"name": "d", "valueBits": null, "unit": "1/nm", "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}, {"name": "d", "valueBits": 4624647330814193712, "unit": "m", "text": ""}], "refusal": "line\nbreak", "lineage": null}, {"group": "spots", "id": "spots:1", "label": "", "product": "spot", "entries": [{"name": "x1", "valueBits": 4472025763905106995, "unit": "\u00b5m", "text": ""}, {"name": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "valueBits": 13885181326027375618, "unit": "\u00c5", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:2", "label": "ctrl\u0001\u007f", "product": "profile", "entries": [{"name": "with,comma.dm4", "valueBits": 4655389807796348227, "unit": "\u00b5m", "text": ""}, {"name": "q", "valueBits": 13746740667196769651, "unit": "1/\u00c5", "text": ""}, {"name": "d", "valueBits": 4503599627370496, "unit": "px", "text": ""}, {"name": "y1", "valueBits": 13858482950755477474, "unit": "\u00b0", "text": "cr\r\nlf"}], "refusal": "", "lineage": "s2"}, {"group": "marks", "id": "marks:3", "label": "a \"quoted\" name", "product": "profile", "entries": [{"name": "y1", "valueBits": 13702613689369222191, "unit": "\u00b5m", "text": ""}, {"name": "y1", "valueBits": 4644416338303402541, "unit": "1/nm", "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}, {"name": "length", "valueBits": null, "unit": "\u00b5m", "text": ""}, {"name": "d", "valueBits": 13888089197808298654, "unit": "1/nm", "text": ""}, {"name": "y1", "valueBits": null, "unit": "nm", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:4", "label": "Row 4", "product": "angle", "entries": [{"name": "length", "valueBits": 4689161414649891002, "unit": "", "text": "line\nbreak"}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 4567463708465204087, "unit": "1/px", "text": ""}, {"name": "x1", "valueBits": 4505477255873279829, "unit": "m", "text": ""}], "refusal": "a \"quoted\" name", "lineage": "s4"}, {"group": "marks", "id": "marks:5", "label": "Row 5", "product": "distance", "entries": [{"name": "q", "valueBits": null, "unit": "pm", "text": ""}], "refusal": null, "lineage": "s5"}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: with,comma.dm4\n# object: \n# image: 2204 x 3216 px\n# x scale: none\n# y scale: none\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: none\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance\n# validation (angle): closed form, angle, with \"quotes\", and commas\n# validation (profile): samples: scikit-image 0.26.0 (a line break)\n# validation (spot): planted spots\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,Row 0,,inf,\u00c5,plain.dm4,\"closed form, distance\",\nmarks,marks:0,Row 0,d,1.5127758072129169e-06,um,plain.dm4,\"closed form, distance\",\nmarks,marks:0,Row 0,x1,1.0000000000000001e+300,m,,\"closed form, distance\",\nmarks,marks:0,Row 0,d,,1/nm,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,\"closed form, distance\",\nmarks,marks:0,Row 0,d,15.023915905905682,m,,\"closed form, distance\",\nmarks,marks:0,Row 0,outcome,,,\"line\nbreak\",\"closed form, distance\",\nspots,spots:1,,x1,9.2629062052388604e-10,\u00b5m,,planted spots,\nspots,spots:1,,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,-4626.849178300241,\u00c5,,planted spots,\nmarks,marks:2,ctrl\u0001\u007f,\"with,comma.dm4\",1745.0912196173601,\u00b5m,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s2\nmarks,marks:2,ctrl\u0001\u007f,q,-2.6504525271759196e-06,1/\u00c5,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s2\nmarks,marks:2,ctrl\u0001\u007f,d,2.2250738585072014e-308,px,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s2\nmarks,marks:2,ctrl\u0001\u007f,y1,-76.887786290054947,\u00b0,\"cr\r\nlf\",\"samples: scikit-image 0.26.0 (a line\nbreak)\",s2\nmarks,marks:2,ctrl\u0001\u007f,outcome,,,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",s2\nmarks,marks:3,\"a \"\"quoted\"\" name\",y1,-2.9642937636275151e-09,\u00b5m,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:3,\"a \"\"quoted\"\" name\",y1,324.50328216052986,1/nm,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:3,\"a \"\"quoted\"\" name\",length,,\u00b5m,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:3,\"a \"\"quoted\"\" name\",d,-7271.5431564847513,1/nm,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:3,\"a \"\"quoted\"\" name\",y1,,nm,,\"samples: scikit-image 0.26.0 (a line\nbreak)\",\nmarks,marks:4,Row 4,length,315357.59245599399,,\"line\nbreak\",\"closed form, angle, with \"\"quotes\"\", and commas\",s4\nmarks,marks:4,Row 4,tab\tand\u0085nel\u2028sep\u2029,0.0023060051866691761,1/px,,\"closed form, angle, with \"\"quotes\"\", and commas\",s4\nmarks,marks:4,Row 4,x1,1.6890970219333331e-07,m,,\"closed form, angle, with \"\"quotes\"\", and commas\",s4\nmarks,marks:4,Row 4,outcome,,,\"a \"\"quoted\"\" name\",\"closed form, angle, with \"\"quotes\"\", and commas\",s4\nmarks,marks:5,Row 5,q,,pm,,\"closed form, distance\",s5\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "a \"quoted\" name", "object": "cr\r\nlf", "width": 3633, "height": 492, "x": {"originBits": 1, "scaleBits": 4565391011431829520, "unit": ""}, "y": {"originBits": 18442240474082181120, "scaleBits": 4494912805295691196, "unit": "mrad"}, "notes": ["line\nbreak", "a \"quoted\" name", "unvalidated"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "Row 0", "product": "distance", "entries": [{"name": "plain.dm4", "valueBits": 4599676419421066581, "unit": "1/px", "text": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301"}], "refusal": null, "lineage": "s0"}, {"group": "marks", "id": "marks:1", "label": "cr\r\nlf", "product": "profile", "entries": [{"name": "\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301", "valueBits": 4600440827185714087, "unit": "", "text": ""}, {"name": "y1", "valueBits": 4599676419421066581, "unit": "\u00c5", "text": ""}, {"name": "x1", "valueBits": 13922752582581519016, "unit": "1/nm", "text": ""}, {"name": "x1", "valueBits": 4542376496944881337, "unit": "nm", "text": ""}], "refusal": "line\nbreak", "lineage": null}, {"group": "marks", "id": "marks:2", "label": "plain.dm4", "product": "angle", "entries": [{"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 4716100326944077707, "unit": "1/m", "text": ""}, {"name": "plain.dm4", "valueBits": 4602956645919518238, "unit": "\u00b5m", "text": "with,comma.dm4"}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 13894098520672327435, "unit": "1/m", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:3", "label": "Row 3", "product": "distance", "entries": [], "refusal": null, "lineage": null}, {"group": "spots", "id": "spots:4", "label": "Row 4", "product": "spot", "entries": [{"name": "d", "valueBits": 4599301119452119040, "unit": "1/\u00c5", "text": ""}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 13920274554551134522, "unit": "mrad", "text": "plain.dm4"}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:5", "label": "cr\r\nlf", "product": "angle", "entries": [{"name": "x1", "valueBits": 13854653094341320253, "unit": "px", "text": ""}, {"name": "q", "valueBits": 13845406178800793815, "unit": "pm", "text": ""}], "refusal": "line\nbreak", "lineage": "s5"}, {"group": "spots", "id": "spots:6", "label": "Row 6", "product": "spot", "entries": [{"name": "d", "valueBits": 13922338291686794802, "unit": "px", "text": "cr\r\nlf"}], "refusal": null, "lineage": "s6"}, {"group": "marks", "id": "marks:7", "label": "", "product": "angle", "entries": [{"name": "length", "valueBits": 4607182418800017408, "unit": "\u00b0", "text": "a \"quoted\" name"}], "refusal": null, "lineage": "s7"}, {"group": "marks", "id": "marks:8", "label": "Row 8", "product": "distance", "entries": [], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:9", "label": "Row 9", "product": "distance", "entries": [{"name": "x1", "valueBits": 4481169670300308210, "unit": "1/nm", "text": ""}, {"name": "y1", "valueBits": 13833255714213234846, "unit": "\u00b5m", "text": ""}, {"name": "q", "valueBits": 4588268010473567497, "unit": "\u00b5m", "text": ""}], "refusal": "ctrl\u0001\u007f", "lineage": null}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: a \"quoted\" name\n# object: cr lf\n# image: 3633 x 492 px\n# x scale: none\n# y scale: 3.192240072327633e-08 mrad per px, origin -inf px\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: line break; a \"quoted\" name; unvalidated\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance; reader note: line break; a \"quoted\" name; unvalidated\n# validation (angle): closed form, angle, with \"quotes\", and commas; reader note: line break; a \"quoted\" name; unvalidated\n# validation (profile): samples: scikit-image 0.26.0 (a line break); reader note: line break; a \"quoted\" name; unvalidated\n# validation (spot): planted spots; reader note: line break; a \"quoted\" name; unvalidated\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,Row 0,plain.dm4,0.33333333333333331,1/px,\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,\"closed form, distance; reader note: line break; a \"\"quoted\"\" name; unvalidated\",s0\nmarks,marks:1,\"cr\r\nlf\",\u00c5ngstr\u00f6m \u00b5m \u00e9\u0301,0.37576648835902876,,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:1,\"cr\r\nlf\",y1,0.33333333333333331,\u00c5,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:1,\"cr\r\nlf\",x1,-1543605.2360307369,1/nm,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:1,\"cr\r\nlf\",x1,4.913924209209775e-05,nm,,\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:1,\"cr\r\nlf\",outcome,,,\"line\nbreak\",\"samples: scikit-image 0.26.0 (a line\nbreak); reader note: line break; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:2,plain.dm4,tab\tand\u0085nel\u2028sep\u2029,19874858.537833732,1/m,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:2,plain.dm4,plain.dm4,0.53084496512332513,\u00b5m,\"with,comma.dm4\",\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:2,plain.dm4,tab\tand\u0085nel\u2028sep\u2029,-18179.961850247386,1/m,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; a \"\"quoted\"\" name; unvalidated\",\nspots,spots:4,Row 4,d,0.3125,1/\u00c5,,\"planted spots; reader note: line break; a \"\"quoted\"\" name; unvalidated\",\nspots,spots:4,Row 4,tab\tand\u0085nel\u2028sep\u2029,-1007610.1873619922,mrad,plain.dm4,\"planted spots; reader note: line break; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:5,\"cr\r\nlf\",x1,-43.231126604191083,px,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; a \"\"quoted\"\" name; unvalidated\",s5\nmarks,marks:5,\"cr\r\nlf\",q,-10.381959987277169,pm,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; a \"\"quoted\"\" name; unvalidated\",s5\nmarks,marks:5,\"cr\r\nlf\",outcome,,,\"line\nbreak\",\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; a \"\"quoted\"\" name; unvalidated\",s5\nspots,spots:6,Row 6,d,-1447145.6203521607,px,\"cr\r\nlf\",\"planted spots; reader note: line break; a \"\"quoted\"\" name; unvalidated\",s6\nmarks,marks:7,,length,1,\u00b0,\"a \"\"quoted\"\" name\",\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; a \"\"quoted\"\" name; unvalidated\",s7\nmarks,marks:9,Row 9,x1,3.7981161619154343e-09,1/nm,,\"closed form, distance; reader note: line break; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:9,Row 9,y1,-1.5997998894095313,\u00b5m,,\"closed form, distance; reader note: line break; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:9,Row 9,q,0.056254927367584591,\u00b5m,,\"closed form, distance; reader note: line break; a \"\"quoted\"\" name; unvalidated\",\nmarks,marks:9,Row 9,outcome,,,ctrl\u0001\u007f,\"closed form, distance; reader note: line break; a \"\"quoted\"\" name; unvalidated\",\n"}, {"input": {"source": {"software": "Tool 0.1.0 (1)", "fileName": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "object": "line\nbreak", "width": 4186, "height": 226, "x": {"originBits": 13800402163161698558, "scaleBits": 13891842672194665007, "unit": "mrad"}, "y": null, "notes": ["line\nbreak", "with,comma.dm4"]}, "rows": [{"group": "marks", "id": "marks:0", "label": "plain.dm4", "product": "angle", "entries": [{"name": "length", "valueBits": 4515818319382903633, "unit": "1/m", "text": ""}, {"name": "y1", "valueBits": 4509932439664621551, "unit": "", "text": ""}, {"name": "y1", "valueBits": null, "unit": "m", "text": ""}, {"name": "q", "valueBits": 4607182418800017408, "unit": "\u00b0", "text": ""}, {"name": "plain.dm4", "valueBits": 4481444424763163179, "unit": "nm", "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:1", "label": "Row 1", "product": "angle", "entries": [{"name": "x1", "valueBits": 13917796670170040488, "unit": "\u00b0", "text": ""}, {"name": "cr\r\nlf", "valueBits": 13871023655354027383, "unit": "", "text": ""}], "refusal": "a \"quoted\" name", "lineage": null}, {"group": "spots", "id": "spots:2", "label": "Row 2", "product": "spot", "entries": [{"name": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "valueBits": 9218868437227405312, "unit": "\u00c5", "text": "with,comma.dm4"}, {"name": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "valueBits": null, "unit": "1/\u00c5", "text": ""}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 13907323769373138249, "unit": "\u00b0", "text": ""}, {"name": "q", "valueBits": 13946825794198143337, "unit": "mrad", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:3", "label": "cr\r\nlf", "product": "distance", "entries": [{"name": "q", "valueBits": null, "unit": "\u00b5m", "text": ""}, {"name": "q", "valueBits": null, "unit": "", "text": ""}, {"name": "y1", "valueBits": 4513953284673711124, "unit": "1/m", "text": ""}, {"name": "tab\tand\u0085nel\u2028sep\u2029", "valueBits": 4678729314985035566, "unit": "", "text": ""}, {"name": "q", "valueBits": 9223372036854775808, "unit": "mrad", "text": ""}], "refusal": null, "lineage": null}, {"group": "marks", "id": "marks:4", "label": "Row 4", "product": "profile", "entries": [], "refusal": null, "lineage": "s4"}], "session": "Saved at 14:03, in \"x.json\"\nnext line", "validations": [["distance", "closed form, distance"], ["angle", "closed form, angle, with \"quotes\", and commas"], ["profile", "samples: scikit-image 0.26.0 (a line\nbreak)"], ["spot", "planted spots"]]}, "expected": "# macTEM results\n# software: Tool 0.1.0 (1)\n# file: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n# object: line break\n# image: 4186 x 226 px\n# x scale: none\n# y scale: none\n# session: Saved at 14:03, in \"x.json\" next line\n# notes: line break; with,comma.dm4\n# points: x1, y1, x2, y2, ... are image pixels (x column, y row, pixel centres at integers); an angle's vertex is point 2; click and centroid are bins of the centred spectrum; region is in image pixels\n# units: lengths in the file's unit as the file states it (a Velox metre axis stays in metres), px for pixels\n# validation (distance): closed form, distance; reader note: line break; with,comma.dm4\n# validation (angle): closed form, angle, with \"quotes\", and commas; reader note: line break; with,comma.dm4\n# validation (profile): samples: scikit-image 0.26.0 (a line break); reader note: line break; with,comma.dm4\n# validation (spot): planted spots; reader note: line break; with,comma.dm4\n# lineage: a mark's node id in the session record once saved, empty before and for FFT spots (not recorded)\n# numbers: %.17g (exact round trip); nan where the owner holds NaN; value empty where a line is words only\ngroup,id,label,quantity,value,unit,text,validation,lineage\nmarks,marks:0,plain.dm4,length,8.1686718015465193e-07,1/m,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; with,comma.dm4\",\nmarks,marks:0,plain.dm4,y1,3.3525629136883954e-07,,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; with,comma.dm4\",\nmarks,marks:0,plain.dm4,y1,,m,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; with,comma.dm4\",\nmarks,marks:0,plain.dm4,q,1,\u00b0,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; with,comma.dm4\",\nmarks,marks:0,plain.dm4,plain.dm4,4.0253877268014856e-09,nm,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; with,comma.dm4\",\nmarks,marks:1,Row 1,x1,-719146.47968699504,\u00b0,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; with,comma.dm4\",\nmarks,marks:1,Row 1,\"cr\r\nlf\",-508.40766946525349,,,\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; with,comma.dm4\",\nmarks,marks:1,Row 1,outcome,,,\"a \"\"quoted\"\" name\",\"closed form, angle, with \"\"quotes\"\", and commas; reader note: line break; with,comma.dm4\",\nspots,spots:2,Row 2,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,inf,\u00c5,\"with,comma.dm4\",\"planted spots; reader note: line break; with,comma.dm4\",\nspots,spots:2,Row 2,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,,1/\u00c5,,\"planted spots; reader note: line break; with,comma.dm4\",\nspots,spots:2,Row 2,tab\tand\u0085nel\u2028sep\u2029,-137129.0907385147,\u00b0,,\"planted spots; reader note: line break; with,comma.dm4\",\nspots,spots:2,Row 2,q,-60982610.929446049,mrad,,\"planted spots; reader note: line break; with,comma.dm4\",\nmarks,marks:3,\"cr\r\nlf\",q,,\u00b5m,,\"closed form, distance; reader note: line break; with,comma.dm4\",\nmarks,marks:3,\"cr\r\nlf\",q,,,,\"closed form, distance; reader note: line break; with,comma.dm4\",\nmarks,marks:3,\"cr\r\nlf\",y1,6.193989493472897e-07,1/m,,\"closed form, distance; reader note: line break; with,comma.dm4\",\nmarks,marks:3,\"cr\r\nlf\",tab\tand\u0085nel\u2028sep\u2029,61820.184068573973,,,\"closed form, distance; reader note: line break; with,comma.dm4\",\nmarks,marks:3,\"cr\r\nlf\",q,-0,mrad,,\"closed form, distance; reader note: line break; with,comma.dm4\",\n"}]} \ No newline at end of file diff --git a/Tests/ImagoCoreTests/ProfileCSVTests.swift b/Tests/ImagoCoreTests/ProfileCSVTests.swift index dc49a36..8f0d89a 100644 --- a/Tests/ImagoCoreTests/ProfileCSVTests.swift +++ b/Tests/ImagoCoreTests/ProfileCSVTests.swift @@ -1,5 +1,5 @@ // ProfileCSV: the whole text of a planted profile byte for byte (the lines and order macTEM's app copy wrote), the shown -// line, the unvalidated clause, header sanitising, nan, and an empty profile that is not a file. Text is tested exact. +// line, the reader note after the validation, header sanitising, nan, and an empty profile that is not a file. Text is tested exact. import Foundation import ImagoCore import Testing @@ -53,13 +53,14 @@ import Testing #expect(try planted() == expected) } - @Test func shownLineAndUnvalidatedClauseAndSanitising() throws { - let text = try #require(try planted(notes: ["scale UNVALIDATED\r\nnext"], fileName: "a\u{2028}b.dm4", + @Test func shownLineAndReaderNoteAndSanitising() throws { + let text = try #require(try planted(notes: ["scale from the tag\r\nnext", "second"], fileName: "a\u{2028}b.dm4", shown: (unit: "nm", factor: 1e9))) let lines = text.components(separatedBy: "\n") #expect(lines.contains("# shown in macTEM as: nm (x 1000000000.0)")) - #expect(lines.contains("# notes: scale UNVALIDATED next")) - #expect(lines.contains("# validation: " + validation + ", unvalidated (reader note)")) + #expect(lines.contains("# notes: scale from the tag next; second")) + #expect(lines.contains("# validation: " + validation + "; reader note: scale from the tag next; second")) + #expect(!text.lowercased().contains("unvalidated")) #expect(lines.contains("# file: a b.dm4")) let keys = lines.prefix { $0.hasPrefix("#") }.compactMap { $0.dropFirst(2).components(separatedBy: ": ").first } #expect(keys.contains("shown in macTEM as")) diff --git a/tools/consumer-check/Sources/consumer-check/main.swift b/tools/consumer-check/Sources/consumer-check/main.swift index fe808dc..e5328cc 100644 --- a/tools/consumer-check/Sources/consumer-check/main.swift +++ b/tools/consumer-check/Sources/consumer-check/main.swift @@ -402,7 +402,7 @@ check(foundSet == [[0, 0.125], [0.125, 0]], "public GPA finds the two reflection let gpa = try GeometricPhaseAnalysis.analyze(lattice, rows: 64, columns: 64, g1: (0, 0.125), g2: (0.125, 0)) let worst = (gpa.strainRR + gpa.strainCC + gpa.strainRC + gpa.rotation).map(abs).max() ?? .nan check(gpa.validation == GeometricPhaseAnalysis.Result.validationNone && worst < 1e-8, - "public GPA of a perfect lattice: zero strain and rotation, badged unvalidated (worst \(worst))") + "public GPA of a perfect lattice: zero strain and rotation, validation value none (worst \(worst))") do { _ = try GeometricPhaseAnalysis.analyze(lattice, rows: 64, columns: 64, g1: (0, 0.125), g2: (0, 0.25)); check(false, "collinear g") } catch let e as GeometricPhaseAnalysisError { check(e == .collinearReflections, "public GPA refuses collinear reflections") } catch { check(false, "collinear g: another error \(error)") }