quantized-lab 0.25.0__tar.gz → 0.26.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (678) hide show
  1. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/PKG-INFO +1 -1
  2. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/pyproject.toml +1 -1
  3. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/__init__.py +1 -1
  4. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/corrections.py +109 -1
  5. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure.py +34 -32
  6. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_break.py +1 -0
  7. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_categorical.py +1 -0
  8. quantized_lab-0.26.0/src/quantized/calc/figure_colorscatter.py +53 -0
  9. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_corner.py +1 -0
  10. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_errorbars.py +24 -1
  11. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_facets.py +1 -0
  12. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_facets_map.py +1 -0
  13. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_field.py +1 -0
  14. quantized_lab-0.26.0/src/quantized/calc/figure_greyscale.py +159 -0
  15. quantized_lab-0.26.0/src/quantized/calc/figure_group_styles.py +119 -0
  16. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_labels.py +29 -1
  17. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_map.py +1 -0
  18. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_multivar.py +14 -2
  19. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_page.py +21 -2
  20. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_statplots.py +1 -0
  21. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_ternary.py +1 -0
  22. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/plotting.py +87 -4
  23. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/resample.py +40 -2
  24. quantized_lab-0.26.0/src/quantized/cat_levels.py +146 -0
  25. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/datastruct.py +139 -4
  26. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/import_error_bindings.py +12 -7
  27. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/ncnr.py +180 -0
  28. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/preview.py +44 -8
  29. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/_datasetcache.py +23 -0
  30. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/_payload.py +6 -0
  31. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/export.py +8 -7
  32. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/export_figures.py +114 -105
  33. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/export_figures_aux.py +12 -0
  34. quantized_lab-0.26.0/src/quantized/routes/export_figures_labels.py +97 -0
  35. quantized_lab-0.26.0/src/quantized/routes/export_figures_schema.py +202 -0
  36. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/export_page.py +14 -2
  37. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/parsers.py +24 -3
  38. quantized_lab-0.26.0/src/quantized/row_sidecars.py +271 -0
  39. quantized_lab-0.26.0/src/quantized/web/assets/AnnotationTextDialog-CrUBjfS-.js +1 -0
  40. quantized_lab-0.26.0/src/quantized/web/assets/BackgroundPlotWindow-Cb2B6750.js +1 -0
  41. quantized_lab-0.26.0/src/quantized/web/assets/BaselinePanel-tCZWG5Pz.js +1 -0
  42. quantized_lab-0.26.0/src/quantized/web/assets/BufferedNumberField-DMBkaSb6.js +1 -0
  43. quantized_lab-0.26.0/src/quantized/web/assets/CalcOnlyApp-CSkEPxiL.js +1 -0
  44. quantized_lab-0.26.0/src/quantized/web/assets/CalculatorsContent-DuAffJm_.js +8 -0
  45. quantized_lab-0.26.0/src/quantized/web/assets/CalculatorsPanel-fSdGLd3E.js +1 -0
  46. quantized_lab-0.25.0/src/quantized/web/assets/Card-B5-fV_rb.js → quantized_lab-0.26.0/src/quantized/web/assets/Card-f1DjIZuX.js +1 -1
  47. quantized_lab-0.26.0/src/quantized/web/assets/Checkbox-DJkTxszS.js +1 -0
  48. quantized_lab-0.26.0/src/quantized/web/assets/CollectionsSection-DzYGLqNo.js +1 -0
  49. quantized_lab-0.26.0/src/quantized/web/assets/ColumnSwitcher-BscfU05y.js +1 -0
  50. quantized_lab-0.26.0/src/quantized/web/assets/CombineWorkbooksDialog-CSFamCUb.js +1 -0
  51. quantized_lab-0.26.0/src/quantized/web/assets/CurveFitPanel-DCt1wDzh.js +1 -0
  52. quantized_lab-0.26.0/src/quantized/web/assets/DataFilterPanel-D3W8WgNV.js +1 -0
  53. quantized_lab-0.25.0/src/quantized/web/assets/DataTable-DQDR8-By.js → quantized_lab-0.26.0/src/quantized/web/assets/DataTable-BUsp9T89.js +1 -1
  54. quantized_lab-0.26.0/src/quantized/web/assets/DatasetMathPanel-BYWqbaq1.js +1 -0
  55. quantized_lab-0.26.0/src/quantized/web/assets/DigitizerView-lN5nnSf1.js +1 -0
  56. quantized_lab-0.26.0/src/quantized/web/assets/DistributionPanel-Dq1yRBMK.js +1 -0
  57. quantized_lab-0.26.0/src/quantized/web/assets/EditableFiguresSection-CiJDEj0e.js +2 -0
  58. quantized_lab-0.26.0/src/quantized/web/assets/FigureBuilderView-D0t4_BcB.js +1 -0
  59. quantized_lab-0.26.0/src/quantized/web/assets/FigurePageView-DV1XlvB7.js +2 -0
  60. quantized_lab-0.26.0/src/quantized/web/assets/FigureRow-DPQQtCs5.js +2 -0
  61. quantized_lab-0.26.0/src/quantized/web/assets/FiguresSection-KBvGC1XN.js +1 -0
  62. quantized_lab-0.26.0/src/quantized/web/assets/FitYByXPanel-m8hw_oTR.js +1 -0
  63. quantized_lab-0.26.0/src/quantized/web/assets/GraphBuilderPanel-CyP7qfNy.js +1 -0
  64. quantized_lab-0.26.0/src/quantized/web/assets/GraphPreview-CbuxAsPQ.js +1 -0
  65. quantized_lab-0.26.0/src/quantized/web/assets/HelpDialog-D-FLvDAC.js +1 -0
  66. quantized_lab-0.26.0/src/quantized/web/assets/HysteresisPanel-BG2qFFKy.js +1 -0
  67. quantized_lab-0.26.0/src/quantized/web/assets/IconButton-Coh25Dic.js +1 -0
  68. quantized_lab-0.26.0/src/quantized/web/assets/ImportWizardPanel-BN6TckG-.js +1 -0
  69. quantized_lab-0.26.0/src/quantized/web/assets/Inspector-DShe0H7d.js +2 -0
  70. quantized_lab-0.26.0/src/quantized/web/assets/LevelOrderPanel-DDh9IRMl.js +1 -0
  71. quantized_lab-0.26.0/src/quantized/web/assets/LibraryDetails-D1-LgNWY.js +1 -0
  72. quantized_lab-0.26.0/src/quantized/web/assets/LibraryTree-DYNckxg2.js +1 -0
  73. quantized_lab-0.26.0/src/quantized/web/assets/LibraryWorkspace-CAwAOLq6.js +1 -0
  74. quantized_lab-0.26.0/src/quantized/web/assets/MagToolsPanel-C5okeE7F.js +1 -0
  75. quantized_lab-0.26.0/src/quantized/web/assets/MapStage-BtZz5t4R.js +1 -0
  76. quantized_lab-0.25.0/src/quantized/web/assets/MetaRow-BZyBL5I_.js → quantized_lab-0.26.0/src/quantized/web/assets/MetaRow-BdF1fLAJ.js +1 -1
  77. quantized_lab-0.26.0/src/quantized/web/assets/MultiPanelStage-noDoOgre.js +1 -0
  78. quantized_lab-0.26.0/src/quantized/web/assets/MultiSelectBar-ZytMnGJI.js +2 -0
  79. quantized_lab-0.26.0/src/quantized/web/assets/MultivarPanel-UrfRnpRN.js +2 -0
  80. quantized_lab-0.25.0/src/quantized/web/assets/NumberField-L_cTvWQ5.js → quantized_lab-0.26.0/src/quantized/web/assets/NumberField-ClCJO6V-.js +1 -1
  81. quantized_lab-0.26.0/src/quantized/web/assets/OriginFidelitySection-Bl1Sq7Rp.js +1 -0
  82. quantized_lab-0.26.0/src/quantized/web/assets/OriginSavedPreviewWindow-BOFe2SnW.js +1 -0
  83. quantized_lab-0.26.0/src/quantized/web/assets/OutlierScreeningPanel-C5ngFO5l.js +1 -0
  84. quantized_lab-0.26.0/src/quantized/web/assets/PackProjectPanel-DQWKHscl.js +1 -0
  85. quantized_lab-0.26.0/src/quantized/web/assets/PagesSection-Cs5vD_kr.js +2 -0
  86. quantized_lab-0.26.0/src/quantized/web/assets/PanelPlotWindow-BI1yaGmt.js +1 -0
  87. quantized_lab-0.26.0/src/quantized/web/assets/ParamDialog-C0P4O-3z.js +1 -0
  88. quantized_lab-0.26.0/src/quantized/web/assets/PeakWizardPanel-BjKHtWoc.js +1 -0
  89. quantized_lab-0.26.0/src/quantized/web/assets/PeaksPanel-Ck8Zq_Vm.js +1 -0
  90. quantized_lab-0.26.0/src/quantized/web/assets/Pill-CWRal9q7.js +1 -0
  91. quantized_lab-0.26.0/src/quantized/web/assets/PipelinePanel-B6YWwfW9.js +1 -0
  92. quantized_lab-0.26.0/src/quantized/web/assets/PlotContextMenu-Bx3UPzUf.js +1 -0
  93. quantized_lab-0.26.0/src/quantized/web/assets/PlotRecipeApplyDialog-whQSWOlZ.js +1 -0
  94. quantized_lab-0.26.0/src/quantized/web/assets/PlotResultChips-DKINGVQg.js +1 -0
  95. quantized_lab-0.26.0/src/quantized/web/assets/PolarStage-CPG6mku9.js +1 -0
  96. quantized_lab-0.26.0/src/quantized/web/assets/PolarStageCore-Cmu_g2Yd.js +1 -0
  97. quantized_lab-0.26.0/src/quantized/web/assets/PreferencesDialog-DKrvfZQu.js +1 -0
  98. quantized_lab-0.26.0/src/quantized/web/assets/QuickFigureBuilderWorkspace-CfhsIfZO.js +1 -0
  99. quantized_lab-0.26.0/src/quantized/web/assets/QuickPlotWithDialog-Ru5LjWqZ.js +1 -0
  100. quantized_lab-0.26.0/src/quantized/web/assets/RecipeLibraryPanel-B6paLoa_.js +2 -0
  101. quantized_lab-0.26.0/src/quantized/web/assets/RecipeManagerPanel-CQk1d7g-.js +1 -0
  102. quantized_lab-0.26.0/src/quantized/web/assets/RecodePanel-DntNg675.js +1 -0
  103. quantized_lab-0.26.0/src/quantized/web/assets/RecoveryChoiceDialog-Cc_K5D6k.js +1 -0
  104. quantized_lab-0.26.0/src/quantized/web/assets/ReductionsPanel-DOHW_AJR.js +1 -0
  105. quantized_lab-0.26.0/src/quantized/web/assets/ReflView-C4if0ngk.js +1 -0
  106. quantized_lab-0.26.0/src/quantized/web/assets/ReflectivityPanel-B31fiMUL.js +1 -0
  107. quantized_lab-0.26.0/src/quantized/web/assets/ReimportAllDialog-CtpXWhXd.js +1 -0
  108. quantized_lab-0.26.0/src/quantized/web/assets/RelinkPanel-CshrlobI.js +1 -0
  109. quantized_lab-0.26.0/src/quantized/web/assets/ReportPanel-CCMZgCbk.js +1 -0
  110. quantized_lab-0.26.0/src/quantized/web/assets/ReportsSection-DIgTK4F3.js +1 -0
  111. quantized_lab-0.26.0/src/quantized/web/assets/RichLabelInput-CXw-iHle.js +1 -0
  112. quantized_lab-0.26.0/src/quantized/web/assets/RoiCutsPanel-Df8lxkKM.js +2 -0
  113. quantized_lab-0.26.0/src/quantized/web/assets/RsmPanel-YPt0R7xR.js +1 -0
  114. quantized_lab-0.26.0/src/quantized/web/assets/SavedFiguresSection-CqK0TQ1Y.js +1 -0
  115. quantized_lab-0.26.0/src/quantized/web/assets/SearchPanel-DHN2r8ha.js +1 -0
  116. quantized_lab-0.25.0/src/quantized/web/assets/SegmentedControl-8pszxiEO.js → quantized_lab-0.26.0/src/quantized/web/assets/SegmentedControl-CR1JRq0i.js +1 -1
  117. quantized_lab-0.26.0/src/quantized/web/assets/SeparateWorksheetsDialog-CWaBy4uR.js +1 -0
  118. quantized_lab-0.26.0/src/quantized/web/assets/ShortcutsDialog-C8NF66gB.js +1 -0
  119. quantized_lab-0.25.0/src/quantized/web/assets/SliderRow-BVjTRPd1.js → quantized_lab-0.26.0/src/quantized/web/assets/SliderRow-B3FcajZK.js +1 -1
  120. quantized_lab-0.26.0/src/quantized/web/assets/SmartFoldersSection-B0AqdfzG.js +1 -0
  121. quantized_lab-0.26.0/src/quantized/web/assets/SnapshotPlotWindow-B5L5gM6k.js +1 -0
  122. quantized_lab-0.26.0/src/quantized/web/assets/SplitDatasetDialog-Dhfyo7_i.js +1 -0
  123. quantized_lab-0.26.0/src/quantized/web/assets/SqliteQueryDialog-1F-EMoiT.js +1 -0
  124. quantized_lab-0.26.0/src/quantized/web/assets/StatStage-CkFXdrSE.js +1 -0
  125. quantized_lab-0.26.0/src/quantized/web/assets/StatStageCanvas-BrjMdNEI.js +1 -0
  126. quantized_lab-0.26.0/src/quantized/web/assets/StatsChooserPanel-DLIakqbt.js +1 -0
  127. quantized_lab-0.25.0/src/quantized/web/assets/Switch-F5CNDsic.js → quantized_lab-0.26.0/src/quantized/web/assets/Switch-B51vKMPs.js +1 -1
  128. quantized_lab-0.26.0/src/quantized/web/assets/TabulatePanel-B3SrJSnq.js +2 -0
  129. quantized_lab-0.26.0/src/quantized/web/assets/TabulateTable-B0zhohRN.js +1 -0
  130. quantized_lab-0.26.0/src/quantized/web/assets/TextFormatHelp-CegMJi1C.js +1 -0
  131. quantized_lab-0.26.0/src/quantized/web/assets/ToolWindow-DNa3_-7m.js +1 -0
  132. quantized_lab-0.26.0/src/quantized/web/assets/TrashPanel-BxBxsdId.js +1 -0
  133. quantized_lab-0.26.0/src/quantized/web/assets/VariabilityChartPanel-DCWSAmWv.js +1 -0
  134. quantized_lab-0.25.0/src/quantized/web/assets/WaterfallView-BIpBXZqg.js → quantized_lab-0.26.0/src/quantized/web/assets/WaterfallView-BhCGTNCP.js +1 -1
  135. quantized_lab-0.26.0/src/quantized/web/assets/WhatIsThis-CNZ5KZQ6.js +1 -0
  136. quantized_lab-0.25.0/src/quantized/web/assets/Worksheet-Dg0-lGq6.js → quantized_lab-0.26.0/src/quantized/web/assets/Worksheet-Bchnfup1.js +1 -1
  137. quantized_lab-0.26.0/src/quantized/web/assets/WorksheetPane-DWy8pcxj.js +3 -0
  138. quantized_lab-0.26.0/src/quantized/web/assets/ZoneWell-Bn1QjmY1.js +1 -0
  139. quantized_lab-0.26.0/src/quantized/web/assets/annotationTextDialog-ClEDuPrm.js +1 -0
  140. quantized_lab-0.26.0/src/quantized/web/assets/autosaveGenerations-B023G-vn.js +1 -0
  141. quantized_lab-0.26.0/src/quantized/web/assets/axisspec-DZ4Gcvcl.js +1 -0
  142. quantized_lab-0.26.0/src/quantized/web/assets/baseline-Pt-OfgJt.js +1 -0
  143. quantized_lab-0.26.0/src/quantized/web/assets/clipboard-02oM0LWi.js +3 -0
  144. quantized_lab-0.26.0/src/quantized/web/assets/combineDialog-BG-kbyxc.js +1 -0
  145. quantized_lab-0.26.0/src/quantized/web/assets/contextActions-CNtyChLx.js +2 -0
  146. quantized_lab-0.26.0/src/quantized/web/assets/copyFigureCommand-DPCbv0BN.js +1 -0
  147. quantized_lab-0.26.0/src/quantized/web/assets/curvefit-DoEXIwk3.js +1 -0
  148. quantized_lab-0.26.0/src/quantized/web/assets/datasetsplit-jVwpwCuY.js +1 -0
  149. quantized_lab-0.26.0/src/quantized/web/assets/diagnostics-ObaON_LH.js +3 -0
  150. quantized_lab-0.26.0/src/quantized/web/assets/dnd-DjPpWs4t.js +1 -0
  151. quantized_lab-0.26.0/src/quantized/web/assets/errorbars-DD5Hd63O.js +1 -0
  152. quantized_lab-0.26.0/src/quantized/web/assets/exportActive-BOETgoQm.js +1 -0
  153. quantized_lab-0.26.0/src/quantized/web/assets/exportFigureCommand-D1p-WVdq.js +1 -0
  154. quantized_lab-0.26.0/src/quantized/web/assets/exportPageCommand-Cx9ZtlmT.js +1 -0
  155. quantized_lab-0.26.0/src/quantized/web/assets/figureCompatibility-6YMbE7aH.js +1 -0
  156. quantized_lab-0.26.0/src/quantized/web/assets/figureDocument-DcIT7FTP.js +1 -0
  157. quantized_lab-0.26.0/src/quantized/web/assets/figureSpec-kS9d8Mst.js +1 -0
  158. quantized_lab-0.26.0/src/quantized/web/assets/figureSpecStage-Dk4LBc7g.js +1 -0
  159. quantized_lab-0.26.0/src/quantized/web/assets/figures-B698B_-o.js +1 -0
  160. quantized_lab-0.26.0/src/quantized/web/assets/fileCommandsLazy-DJ9oxm8H.js +1 -0
  161. quantized_lab-0.26.0/src/quantized/web/assets/fitselectionActions-CCxoR2AI.js +1 -0
  162. quantized_lab-0.26.0/src/quantized/web/assets/folderOps-Cd2ZYcX7.js +1 -0
  163. quantized_lab-0.26.0/src/quantized/web/assets/format-wNo0e3_y.js +1 -0
  164. quantized_lab-0.25.0/src/quantized/web/assets/globalPlotRecipes-kgWamgF7.js → quantized_lab-0.26.0/src/quantized/web/assets/globalPlotRecipes-BOxSqoGm.js +1 -1
  165. quantized_lab-0.25.0/src/quantized/web/assets/help-CaovmIrj.js → quantized_lab-0.26.0/src/quantized/web/assets/help-SyZMZh-E.js +1 -1
  166. quantized_lab-0.26.0/src/quantized/web/assets/index-CEYbjyf2.css +1 -0
  167. quantized_lab-0.26.0/src/quantized/web/assets/index-Ch3GryeW.js +10 -0
  168. quantized_lab-0.26.0/src/quantized/web/assets/jsx-runtime-NZYk81nU.js +1 -0
  169. quantized_lab-0.26.0/src/quantized/web/assets/labelRows-BbLP8H_v.js +1 -0
  170. quantized_lab-0.26.0/src/quantized/web/assets/libraryDetails-DtEMrYkE.js +1 -0
  171. quantized_lab-0.26.0/src/quantized/web/assets/magnetometry-CX4yqv4t.js +1 -0
  172. quantized_lab-0.26.0/src/quantized/web/assets/markers-IElxdZc4.js +1 -0
  173. quantized_lab-0.26.0/src/quantized/web/assets/merge-DujsXvOU.js +1 -0
  174. quantized_lab-0.26.0/src/quantized/web/assets/modeling-Du21uA0m.js +1 -0
  175. quantized_lab-0.26.0/src/quantized/web/assets/originFidelity-zQ_uQ_ci.js +1 -0
  176. quantized_lab-0.26.0/src/quantized/web/assets/originFigureSelection-DVb6NW1W.js +1 -0
  177. quantized_lab-0.25.0/src/quantized/web/assets/originSpatialPanels-BZn8z26C.js → quantized_lab-0.26.0/src/quantized/web/assets/originSpatialPanels-DoajGR_o.js +1 -1
  178. quantized_lab-0.26.0/src/quantized/web/assets/packProject-Zs3v-r2Z.js +2 -0
  179. quantized_lab-0.26.0/src/quantized/web/assets/packProjectCommands-3PkbEfcH.js +2 -0
  180. quantized_lab-0.26.0/src/quantized/web/assets/packProjectRun-BOx_yTd4.js +1 -0
  181. quantized_lab-0.26.0/src/quantized/web/assets/pageDocumentActions-xZ5IqkGB.js +1 -0
  182. quantized_lab-0.26.0/src/quantized/web/assets/pageGreyscale-DnY2fdvR.js +1 -0
  183. quantized_lab-0.26.0/src/quantized/web/assets/pageSetupCommand-DWV4J9TG.js +1 -0
  184. quantized_lab-0.26.0/src/quantized/web/assets/pagesetup-Z1HdoaJV.js +1 -0
  185. quantized_lab-0.26.0/src/quantized/web/assets/panelResolve-zKHP9ZaA.js +1 -0
  186. quantized_lab-0.26.0/src/quantized/web/assets/parseWorkspaceFile-hxjyKCc8.js +1 -0
  187. quantized_lab-0.26.0/src/quantized/web/assets/peakMarkerHit-CtJLcBau.js +1 -0
  188. quantized_lab-0.26.0/src/quantized/web/assets/peakTableFit-CJ4tW63U.js +1 -0
  189. quantized_lab-0.26.0/src/quantized/web/assets/peaks-DmEoQ7LI.js +1 -0
  190. quantized_lab-0.26.0/src/quantized/web/assets/pendingOps-DgJ0jAs4.js +1 -0
  191. quantized_lab-0.26.0/src/quantized/web/assets/plotInNewWindow-ZaZozXS4.js +1 -0
  192. quantized_lab-0.26.0/src/quantized/web/assets/plotRecipe-DbhpRXw7.js +2 -0
  193. quantized_lab-0.26.0/src/quantized/web/assets/plotRecipeApply-BCvoDTN3.js +2 -0
  194. quantized_lab-0.26.0/src/quantized/web/assets/plotRecipeIO-DhztDQ_v.js +1 -0
  195. quantized_lab-0.26.0/src/quantized/web/assets/plotRecipeMatch-Bkam0Z3x.js +1 -0
  196. quantized_lab-0.26.0/src/quantized/web/assets/plotdata-D-Bh3WVm.js +1 -0
  197. quantized_lab-0.26.0/src/quantized/web/assets/plural-DZ1uV0WM.js +3 -0
  198. quantized_lab-0.26.0/src/quantized/web/assets/primitives-ChiQwT3D.js +1 -0
  199. quantized_lab-0.26.0/src/quantized/web/assets/quickPlotTemplates-oDp3-HHl.js +1 -0
  200. quantized_lab-0.25.0/src/quantized/web/assets/quickPlotWithDialog-DYShHGGV.js → quantized_lab-0.26.0/src/quantized/web/assets/quickPlotWithDialog-Do0LVz-2.js +1 -1
  201. quantized_lab-0.26.0/src/quantized/web/assets/quickfit-DcQdUkGj.js +1 -0
  202. quantized_lab-0.26.0/src/quantized/web/assets/react-C5lyt4z4.js +1 -0
  203. quantized_lab-0.26.0/src/quantized/web/assets/react-dom-DDfzmQVy.js +1 -0
  204. quantized_lab-0.26.0/src/quantized/web/assets/recipeIndex-rzO9nNzy.js +1 -0
  205. quantized_lab-0.26.0/src/quantized/web/assets/recipeManagerActions-GIM74Oef.js +1 -0
  206. quantized_lab-0.26.0/src/quantized/web/assets/recordRecipeUse-HjHRRyO7.js +2 -0
  207. quantized_lab-0.26.0/src/quantized/web/assets/reimportAllRun-387E_aqK.js +1 -0
  208. quantized_lab-0.26.0/src/quantized/web/assets/relinkCommit-AleSRQAq.js +1 -0
  209. quantized_lab-0.26.0/src/quantized/web/assets/rolldown-runtime-hePW80VL.js +1 -0
  210. quantized_lab-0.26.0/src/quantized/web/assets/rowSidecars-CdeDWwmc.js +1 -0
  211. quantized_lab-0.26.0/src/quantized/web/assets/rowstate-4BE_1Yry.js +1 -0
  212. quantized_lab-0.26.0/src/quantized/web/assets/runTemplate-BCXMyiIT.js +1 -0
  213. quantized_lab-0.26.0/src/quantized/web/assets/saveFigureAsRecipe-CA1WEU6C.js +2 -0
  214. quantized_lab-0.26.0/src/quantized/web/assets/stats-BOn_SgNJ.js +1 -0
  215. quantized_lab-0.26.0/src/quantized/web/assets/techniqueDefaults-R0WO3YZo.js +1 -0
  216. quantized_lab-0.25.0/src/quantized/web/assets/template-ieCfawiO.js → quantized_lab-0.26.0/src/quantized/web/assets/template-B3UZtwYT.js +1 -1
  217. quantized_lab-0.26.0/src/quantized/web/assets/toasts-v4ZA--Hu.js +1 -0
  218. quantized_lab-0.26.0/src/quantized/web/assets/trash-DHaksMjk.js +2 -0
  219. quantized_lab-0.26.0/src/quantized/web/assets/trashRestore-DA-z_T0Q.js +1 -0
  220. quantized_lab-0.26.0/src/quantized/web/assets/uplotOpts-DnrTDLSU.js +1 -0
  221. quantized_lab-0.26.0/src/quantized/web/assets/uplotShapes-DuJv18Mm.js +1 -0
  222. quantized_lab-0.26.0/src/quantized/web/assets/useApp-Dl96Fupu.js +2 -0
  223. quantized_lab-0.26.0/src/quantized/web/assets/useByPartition-CXaALAn5.js +1 -0
  224. quantized_lab-0.26.0/src/quantized/web/assets/useCutLanding-DGpxTNvh.js +1 -0
  225. quantized_lab-0.26.0/src/quantized/web/assets/useDialogFocus-D1ftVZg9.js +1 -0
  226. quantized_lab-0.26.0/src/quantized/web/assets/useFigureBuilder-SiFKgCP2.js +1 -0
  227. quantized_lab-0.26.0/src/quantized/web/assets/useLibraryStore-BhcgXGyv.js +1 -0
  228. quantized_lab-0.26.0/src/quantized/web/assets/useListVirtualization-Cl-u45F8.js +1 -0
  229. quantized_lab-0.26.0/src/quantized/web/assets/useMapColorLimitsField-CEhj8l3L.js +1 -0
  230. quantized_lab-0.26.0/src/quantized/web/assets/useMultiPanelStage-ChpnG8mu.js +1 -0
  231. quantized_lab-0.26.0/src/quantized/web/assets/useRoiCuts-zHekI89r.js +1 -0
  232. quantized_lab-0.26.0/src/quantized/web/assets/useStatStage-Df7DJ_4Q.js +1 -0
  233. quantized_lab-0.26.0/src/quantized/web/assets/workbookIds-DVtAJq88.js +1 -0
  234. quantized_lab-0.26.0/src/quantized/web/assets/workbookRowMenu-D3Ujyoh2.js +1 -0
  235. quantized_lab-0.26.0/src/quantized/web/assets/workbookTransfer-DF96LSEo.js +1 -0
  236. quantized_lab-0.26.0/src/quantized/web/assets/workbooks-C5xuHiEZ.js +1 -0
  237. quantized_lab-0.26.0/src/quantized/web/assets/worksheetTransformCommands-BnQgciZC.js +2 -0
  238. quantized_lab-0.26.0/src/quantized/web/assets/worksheetTransforms-CEYaaaHg.js +1 -0
  239. quantized_lab-0.26.0/src/quantized/web/assets/workspaceParse.worker-BwfJHa6h.js +1 -0
  240. quantized_lab-0.26.0/src/quantized/web/index.html +67 -0
  241. quantized_lab-0.25.0/src/quantized/web/assets/AnnotationTextDialog-Bj584R74.js +0 -1
  242. quantized_lab-0.25.0/src/quantized/web/assets/BackgroundPlotWindow-CrUuBa2Z.js +0 -1
  243. quantized_lab-0.25.0/src/quantized/web/assets/BaselinePanel-CDxLkdP3.js +0 -1
  244. quantized_lab-0.25.0/src/quantized/web/assets/BufferedNumberField-C9q5k3r5.js +0 -1
  245. quantized_lab-0.25.0/src/quantized/web/assets/CalcOnlyApp-CfzPSJcj.js +0 -1
  246. quantized_lab-0.25.0/src/quantized/web/assets/CalculatorsContent-ud44diH3.js +0 -8
  247. quantized_lab-0.25.0/src/quantized/web/assets/CalculatorsPanel-BNnBhz7O.js +0 -1
  248. quantized_lab-0.25.0/src/quantized/web/assets/Checkbox-ZPlARkcc.js +0 -1
  249. quantized_lab-0.25.0/src/quantized/web/assets/ColumnSwitcher-DCvTdhuy.js +0 -1
  250. quantized_lab-0.25.0/src/quantized/web/assets/CombineWorkbooksDialog-t9FvXsX5.js +0 -1
  251. quantized_lab-0.25.0/src/quantized/web/assets/CurveFitPanel-BItER1EF.js +0 -1
  252. quantized_lab-0.25.0/src/quantized/web/assets/DataFilterPanel-dkpMfaku.js +0 -1
  253. quantized_lab-0.25.0/src/quantized/web/assets/DatasetMathPanel-oZUItSep.js +0 -1
  254. quantized_lab-0.25.0/src/quantized/web/assets/DigitizerView-BNOLQ4Dx.js +0 -1
  255. quantized_lab-0.25.0/src/quantized/web/assets/DistributionPanel-4i_fkRXL.js +0 -1
  256. quantized_lab-0.25.0/src/quantized/web/assets/EditableFiguresSection-CmL1_9nV.js +0 -2
  257. quantized_lab-0.25.0/src/quantized/web/assets/FigureBuilderView--2wWVYA4.js +0 -1
  258. quantized_lab-0.25.0/src/quantized/web/assets/FigurePageView-CkyaqFVo.js +0 -2
  259. quantized_lab-0.25.0/src/quantized/web/assets/FitYByXPanel-DsIxZ5-B.js +0 -1
  260. quantized_lab-0.25.0/src/quantized/web/assets/GraphBuilderPanel-9FqYOPM3.js +0 -1
  261. quantized_lab-0.25.0/src/quantized/web/assets/GraphPreview-DimP7zvz.js +0 -1
  262. quantized_lab-0.25.0/src/quantized/web/assets/HelpDialog-lF9uQAHR.js +0 -1
  263. quantized_lab-0.25.0/src/quantized/web/assets/HysteresisPanel-DS38OAcQ.js +0 -1
  264. quantized_lab-0.25.0/src/quantized/web/assets/IconButton-CWf4LPKg.js +0 -1
  265. quantized_lab-0.25.0/src/quantized/web/assets/ImportWizardPanel-sP4JNchS.js +0 -1
  266. quantized_lab-0.25.0/src/quantized/web/assets/Inspector-DBlM4PHW.js +0 -2
  267. quantized_lab-0.25.0/src/quantized/web/assets/LibraryDetails-fW-NLBho.js +0 -1
  268. quantized_lab-0.25.0/src/quantized/web/assets/LibraryTree-BG3iOJSu.js +0 -1
  269. quantized_lab-0.25.0/src/quantized/web/assets/LibraryWorkspace-Cu6jZJVK.js +0 -1
  270. quantized_lab-0.25.0/src/quantized/web/assets/MagToolsPanel-VyNRqMFr.js +0 -1
  271. quantized_lab-0.25.0/src/quantized/web/assets/MapStage-DXIR8Rod.js +0 -1
  272. quantized_lab-0.25.0/src/quantized/web/assets/MultiPanelStage-BOlyHaVh.js +0 -1
  273. quantized_lab-0.25.0/src/quantized/web/assets/MultivarPanel-DlbO8tgy.js +0 -2
  274. quantized_lab-0.25.0/src/quantized/web/assets/OutlierScreeningPanel-UIDVeKV7.js +0 -1
  275. quantized_lab-0.25.0/src/quantized/web/assets/PackProjectPanel-ITyjs3v4.js +0 -1
  276. quantized_lab-0.25.0/src/quantized/web/assets/PagesSection-BN9QtK_6.js +0 -2
  277. quantized_lab-0.25.0/src/quantized/web/assets/ParamDialog-Q6GW-ie5.js +0 -1
  278. quantized_lab-0.25.0/src/quantized/web/assets/PeakWizardPanel-C-MKy1Io.js +0 -1
  279. quantized_lab-0.25.0/src/quantized/web/assets/PeaksPanel-C7ViNU-4.js +0 -1
  280. quantized_lab-0.25.0/src/quantized/web/assets/Pill-ChI4gT6d.js +0 -1
  281. quantized_lab-0.25.0/src/quantized/web/assets/PipelinePanel-8LsNEUZm.js +0 -1
  282. quantized_lab-0.25.0/src/quantized/web/assets/PlotRecipeApplyDialog-Cq_2bKEs.js +0 -1
  283. quantized_lab-0.25.0/src/quantized/web/assets/PreferencesDialog-DEfV2egf.js +0 -1
  284. quantized_lab-0.25.0/src/quantized/web/assets/QuickFigureBuilderWorkspace-DDwJM7Wv.js +0 -1
  285. quantized_lab-0.25.0/src/quantized/web/assets/QuickPlotWithDialog-rVgu_Gmq.js +0 -1
  286. quantized_lab-0.25.0/src/quantized/web/assets/RecipeLibraryPanel-CQTNHFal.js +0 -2
  287. quantized_lab-0.25.0/src/quantized/web/assets/RecipeManagerPanel-C8nluBal.js +0 -1
  288. quantized_lab-0.25.0/src/quantized/web/assets/RecodePanel-Ba-qRcqF.js +0 -1
  289. quantized_lab-0.25.0/src/quantized/web/assets/RecoveryChoiceDialog-CYiMW_Kr.js +0 -1
  290. quantized_lab-0.25.0/src/quantized/web/assets/ReductionsPanel-BXeQrX6c.js +0 -1
  291. quantized_lab-0.25.0/src/quantized/web/assets/ReflView-BCJ_2SYz.js +0 -1
  292. quantized_lab-0.25.0/src/quantized/web/assets/ReflectivityPanel-Pqf8JltL.js +0 -1
  293. quantized_lab-0.25.0/src/quantized/web/assets/ReimportAllDialog-BlN58SPY.js +0 -1
  294. quantized_lab-0.25.0/src/quantized/web/assets/RelinkPanel-Bb4MfbTH.js +0 -1
  295. quantized_lab-0.25.0/src/quantized/web/assets/ReportPanel-DADz9p7M.js +0 -1
  296. quantized_lab-0.25.0/src/quantized/web/assets/RichLabelInput-CgjdRd2j.js +0 -1
  297. quantized_lab-0.25.0/src/quantized/web/assets/RoiCutsPanel-B6vIN_FR.js +0 -2
  298. quantized_lab-0.25.0/src/quantized/web/assets/RsmPanel-Bt-9-Pk2.js +0 -1
  299. quantized_lab-0.25.0/src/quantized/web/assets/SearchPanel-CCmjmtm_.js +0 -1
  300. quantized_lab-0.25.0/src/quantized/web/assets/SeparateWorksheetsDialog-Bb8m7R37.js +0 -1
  301. quantized_lab-0.25.0/src/quantized/web/assets/ShortcutsDialog-D2tnTUSJ.js +0 -1
  302. quantized_lab-0.25.0/src/quantized/web/assets/SplitDatasetDialog-B5rJ2h9C.js +0 -1
  303. quantized_lab-0.25.0/src/quantized/web/assets/SqliteQueryDialog-0gNXX457.js +0 -1
  304. quantized_lab-0.25.0/src/quantized/web/assets/StatStage-2pMmpnsk.js +0 -1
  305. quantized_lab-0.25.0/src/quantized/web/assets/StatStageCanvas-i_ugW2Uw.js +0 -1
  306. quantized_lab-0.25.0/src/quantized/web/assets/StatsChooserPanel-CpbP7-Ty.js +0 -1
  307. quantized_lab-0.25.0/src/quantized/web/assets/TabulatePanel-BWbXu2uV.js +0 -2
  308. quantized_lab-0.25.0/src/quantized/web/assets/TabulateTable-B7DLNn1P.js +0 -1
  309. quantized_lab-0.25.0/src/quantized/web/assets/TextFormatHelp-kmgEHjC9.js +0 -1
  310. quantized_lab-0.25.0/src/quantized/web/assets/TrashPanel-CSOVcSzm.js +0 -1
  311. quantized_lab-0.25.0/src/quantized/web/assets/VariabilityChartPanel-zKbejWA8.js +0 -1
  312. quantized_lab-0.25.0/src/quantized/web/assets/WhatIsThis-B9bcXOIl.js +0 -1
  313. quantized_lab-0.25.0/src/quantized/web/assets/WorksheetPane-DChzd0CG.js +0 -3
  314. quantized_lab-0.25.0/src/quantized/web/assets/ZoneWell-QDd_nx8-.js +0 -1
  315. quantized_lab-0.25.0/src/quantized/web/assets/artifactContextActions-iWMYWYJq.js +0 -1
  316. quantized_lab-0.25.0/src/quantized/web/assets/axisspec-BaLK3xYG.js +0 -1
  317. quantized_lab-0.25.0/src/quantized/web/assets/baseline-MBcxzOHg.js +0 -1
  318. quantized_lab-0.25.0/src/quantized/web/assets/clipboard-CcYalH5s.js +0 -3
  319. quantized_lab-0.25.0/src/quantized/web/assets/combineDialog-Db6KKvu7.js +0 -1
  320. quantized_lab-0.25.0/src/quantized/web/assets/contextActions-Dyg7TXHV.js +0 -2
  321. quantized_lab-0.25.0/src/quantized/web/assets/copyFigureCommand-Cxm3DwOx.js +0 -1
  322. quantized_lab-0.25.0/src/quantized/web/assets/curvefit-CNQN0Opl.js +0 -1
  323. quantized_lab-0.25.0/src/quantized/web/assets/datasetRemoval-BHPdyVb1.js +0 -1
  324. quantized_lab-0.25.0/src/quantized/web/assets/datasetRowMenu-o6se4-5o.js +0 -1
  325. quantized_lab-0.25.0/src/quantized/web/assets/diagnostics-Bj9iVHV2.js +0 -3
  326. quantized_lab-0.25.0/src/quantized/web/assets/errorbars-BndKr3Yn.js +0 -1
  327. quantized_lab-0.25.0/src/quantized/web/assets/exportFigureCommand-CQHLOz7Q.js +0 -1
  328. quantized_lab-0.25.0/src/quantized/web/assets/exportStyles-DKMaVoZt.js +0 -1
  329. quantized_lab-0.25.0/src/quantized/web/assets/figureDocument-DqUS74fM.js +0 -1
  330. quantized_lab-0.25.0/src/quantized/web/assets/figurePage-_unQi4Z0.js +0 -1
  331. quantized_lab-0.25.0/src/quantized/web/assets/figureSpec-D4Noipxp.js +0 -1
  332. quantized_lab-0.25.0/src/quantized/web/assets/figures-D7aeFIsY.js +0 -1
  333. quantized_lab-0.25.0/src/quantized/web/assets/fileCommandsLazy-CPHGejrt.js +0 -1
  334. quantized_lab-0.25.0/src/quantized/web/assets/fitselectionActions-B1S-ukhg.js +0 -1
  335. quantized_lab-0.25.0/src/quantized/web/assets/folderOps-BmswekcX.js +0 -1
  336. quantized_lab-0.25.0/src/quantized/web/assets/index-CSCyYRg6.js +0 -10
  337. quantized_lab-0.25.0/src/quantized/web/assets/index-PyyffqGf.css +0 -1
  338. quantized_lab-0.25.0/src/quantized/web/assets/jsx-runtime-HgiJn1ih.js +0 -1
  339. quantized_lab-0.25.0/src/quantized/web/assets/libraryDetails-BqdGwE-h.js +0 -1
  340. quantized_lab-0.25.0/src/quantized/web/assets/magnetometry-Cawn6wtE.js +0 -1
  341. quantized_lab-0.25.0/src/quantized/web/assets/originFigureSelection---YiP5mQ.js +0 -1
  342. quantized_lab-0.25.0/src/quantized/web/assets/packProject-DNFDA8b6.js +0 -2
  343. quantized_lab-0.25.0/src/quantized/web/assets/packProjectCommands-CA9acv_g.js +0 -2
  344. quantized_lab-0.25.0/src/quantized/web/assets/packProjectRun-zPP0PNSM.js +0 -1
  345. quantized_lab-0.25.0/src/quantized/web/assets/pageDocumentActions-Ciwvp2eC.js +0 -1
  346. quantized_lab-0.25.0/src/quantized/web/assets/panelResolve-Cb3xy4nz.js +0 -1
  347. quantized_lab-0.25.0/src/quantized/web/assets/peakMarkerHit-DgevORHQ.js +0 -1
  348. quantized_lab-0.25.0/src/quantized/web/assets/peaks-DgwDaTfF.js +0 -1
  349. quantized_lab-0.25.0/src/quantized/web/assets/plotInNewWindow-MrhFDNzU.js +0 -1
  350. quantized_lab-0.25.0/src/quantized/web/assets/plotRecipe-DSFURO0C.js +0 -2
  351. quantized_lab-0.25.0/src/quantized/web/assets/plotRecipeIO-BweLeaiW.js +0 -1
  352. quantized_lab-0.25.0/src/quantized/web/assets/plotRecipeMatch-DvcnHBrP.js +0 -1
  353. quantized_lab-0.25.0/src/quantized/web/assets/primitives-lnGqdfLY.js +0 -1
  354. quantized_lab-0.25.0/src/quantized/web/assets/quickPlotTemplates-Dn4mJ_ii.js +0 -1
  355. quantized_lab-0.25.0/src/quantized/web/assets/react-dom-BBHtqE9J.js +0 -1
  356. quantized_lab-0.25.0/src/quantized/web/assets/react-nHOb1MiV.js +0 -1
  357. quantized_lab-0.25.0/src/quantized/web/assets/recipeIndex-0527C4Af.js +0 -1
  358. quantized_lab-0.25.0/src/quantized/web/assets/recipeManagerActions-rokDJcEq.js +0 -1
  359. quantized_lab-0.25.0/src/quantized/web/assets/reimportAllRun-CHnRxXjf.js +0 -1
  360. quantized_lab-0.25.0/src/quantized/web/assets/relinkCommit-Dh6qqRTE.js +0 -1
  361. quantized_lab-0.25.0/src/quantized/web/assets/richtext-DqEouiF0.js +0 -1
  362. quantized_lab-0.25.0/src/quantized/web/assets/runTemplate-DVKTrqV2.js +0 -1
  363. quantized_lab-0.25.0/src/quantized/web/assets/saveFigureAsRecipe-C4qgLFAH.js +0 -2
  364. quantized_lab-0.25.0/src/quantized/web/assets/stats-tz4qgZqn.js +0 -1
  365. quantized_lab-0.25.0/src/quantized/web/assets/toasts-B9LiGchW.js +0 -1
  366. quantized_lab-0.25.0/src/quantized/web/assets/trash-CksOVwhl.js +0 -1
  367. quantized_lab-0.25.0/src/quantized/web/assets/trashRestore-BIBPAHyM.js +0 -1
  368. quantized_lab-0.25.0/src/quantized/web/assets/uplotOpts-C7ct1wgx.js +0 -1
  369. quantized_lab-0.25.0/src/quantized/web/assets/uplotOverlays-Bv9bEOix.js +0 -1
  370. quantized_lab-0.25.0/src/quantized/web/assets/uplotShapes-Cr-HgZLW.js +0 -1
  371. quantized_lab-0.25.0/src/quantized/web/assets/useApp-CttQHt5T.js +0 -4
  372. quantized_lab-0.25.0/src/quantized/web/assets/useByPartition-C1p6MBJC.js +0 -1
  373. quantized_lab-0.25.0/src/quantized/web/assets/useCutLanding-Bzz1essU.js +0 -1
  374. quantized_lab-0.25.0/src/quantized/web/assets/useFigureBuilder-DrzdD3kk.js +0 -1
  375. quantized_lab-0.25.0/src/quantized/web/assets/useMultiPanelStage-DiLzamW8.js +0 -1
  376. quantized_lab-0.25.0/src/quantized/web/assets/useRoiCuts-DTkuT4bj.js +0 -1
  377. quantized_lab-0.25.0/src/quantized/web/assets/useStatStage-8JA2gEpH.js +0 -1
  378. quantized_lab-0.25.0/src/quantized/web/assets/workbookRowMenu-Cpe3MyCL.js +0 -1
  379. quantized_lab-0.25.0/src/quantized/web/assets/workspaceParse.worker-ClW5hSu6.js +0 -1
  380. quantized_lab-0.25.0/src/quantized/web/index.html +0 -53
  381. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/.gitignore +0 -0
  382. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/LICENSE +0 -0
  383. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/NOTICE +0 -0
  384. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/README.md +0 -0
  385. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/assets/branding/README.md +0 -0
  386. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/docs/theory/README.md +0 -0
  387. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/__main__.py +0 -0
  388. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/api.py +0 -0
  389. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/app.py +0 -0
  390. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/__init__.py +0 -0
  391. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/_clipfit.py +0 -0
  392. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/_grid_detect.py +0 -0
  393. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/_natural_neighbor.py +0 -0
  394. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/_rsm_grid.py +0 -0
  395. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/_semiconductor_materials.py +0 -0
  396. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/aggregate.py +0 -0
  397. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/backgrounds.py +0 -0
  398. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/baseline.py +0 -0
  399. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/batch_fit.py +0 -0
  400. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/boxcut.py +0 -0
  401. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/constants.py +0 -0
  402. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/crystallography.py +0 -0
  403. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/decimate.py +0 -0
  404. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/diffusion.py +0 -0
  405. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/electrical.py +0 -0
  406. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/electrochemistry.py +0 -0
  407. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/element_data.json +0 -0
  408. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/element_data.py +0 -0
  409. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/errors.py +0 -0
  410. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_decor.py +0 -0
  411. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_hitmap.py +0 -0
  412. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_overrides.py +0 -0
  413. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_page_facets.py +0 -0
  414. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_page_layout.py +0 -0
  415. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_page_panel_labels.py +0 -0
  416. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_page_validate.py +0 -0
  417. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_scale.py +0 -0
  418. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_shapes.py +0 -0
  419. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_styles.py +0 -0
  420. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_ticks.py +0 -0
  421. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_y2.py +0 -0
  422. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_autoguess.py +0 -0
  423. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_bootstrap.py +0 -0
  424. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_bumps.py +0 -0
  425. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_constraints.py +0 -0
  426. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_equation.py +0 -0
  427. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_findxy.py +0 -0
  428. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_models.py +0 -0
  429. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_models_special.py +0 -0
  430. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_odr.py +0 -0
  431. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_scan.py +0 -0
  432. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_stats.py +0 -0
  433. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fitting.py +0 -0
  434. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/formula.py +0 -0
  435. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/global_curve_fit.py +0 -0
  436. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/global_fit.py +0 -0
  437. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/interp2d.py +0 -0
  438. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/ion_range.py +0 -0
  439. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/linecut.py +0 -0
  440. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/magnetic.py +0 -0
  441. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/magnetometry.py +0 -0
  442. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/map.py +0 -0
  443. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/mcmc.py +0 -0
  444. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/miller_bravais.py +0 -0
  445. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/optics.py +0 -0
  446. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/pawley.py +0 -0
  447. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/peak_batch.py +0 -0
  448. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/peak_fit.py +0 -0
  449. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/peak_integrate.py +0 -0
  450. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/peak_multifit.py +0 -0
  451. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/peak_track.py +0 -0
  452. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/peaks.py +0 -0
  453. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/peakshapes.py +0 -0
  454. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/plane_spacings.py +0 -0
  455. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/processing.py +0 -0
  456. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/qspace.py +0 -0
  457. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/reductions.py +0 -0
  458. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/reductions_fft.py +0 -0
  459. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/refl_sld_presets.json +0 -0
  460. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/reflectivity.py +0 -0
  461. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/registry.py +0 -0
  462. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/relaxation.py +0 -0
  463. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/report.py +0 -0
  464. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/report_emit.py +0 -0
  465. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/rsm.py +0 -0
  466. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/rsm_analyze.py +0 -0
  467. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/sectorcut.py +0 -0
  468. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/semiconductor.py +0 -0
  469. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/sld.py +0 -0
  470. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/sld_formula.py +0 -0
  471. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/spectral.py +0 -0
  472. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/statplots.py +0 -0
  473. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats.py +0 -0
  474. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_anova2.py +0 -0
  475. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_anova_ext.py +0 -0
  476. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_band.py +0 -0
  477. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_contingency.py +0 -0
  478. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_dist.py +0 -0
  479. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_glm.py +0 -0
  480. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_multivar.py +0 -0
  481. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_outliers.py +0 -0
  482. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_roc.py +0 -0
  483. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_survival.py +0 -0
  484. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_tests.py +0 -0
  485. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_varcomp.py +0 -0
  486. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/substrates.py +0 -0
  487. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/superconductor.py +0 -0
  488. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/surface_fit.py +0 -0
  489. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/surface_models.py +0 -0
  490. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/thermal.py +0 -0
  491. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/thin_film.py +0 -0
  492. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/unit_convert.py +0 -0
  493. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/units.py +0 -0
  494. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/units_data.py +0 -0
  495. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/vacuum.py +0 -0
  496. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/xray.py +0 -0
  497. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/cli.py +0 -0
  498. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/client.py +0 -0
  499. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_bridge.py +0 -0
  500. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_bridge_common.py +0 -0
  501. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_bridge_dialogs.py +0 -0
  502. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_bridge_pack.py +0 -0
  503. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_bridge_pack_state.py +0 -0
  504. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_consent.py +0 -0
  505. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_project_file.py +0 -0
  506. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_project_lock.py +0 -0
  507. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_project_lock_oslock.py +0 -0
  508. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_project_lock_record.py +0 -0
  509. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_project_lock_write.py +0 -0
  510. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_source_probe.py +0 -0
  511. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/__init__.py +0 -0
  512. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/_delimited_fast.py +0 -0
  513. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/_delimited_layout.py +0 -0
  514. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/_hdf5_layout.py +0 -0
  515. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/_jcamp_asdf.py +0 -0
  516. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/_xrdml_scan.py +0 -0
  517. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/base.py +0 -0
  518. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/bruker_brml.py +0 -0
  519. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/bruker_raw.py +0 -0
  520. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/cif.py +0 -0
  521. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/consolidated.py +0 -0
  522. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/delimited.py +0 -0
  523. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/error_binding_suggestions.py +0 -0
  524. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/error_inference.py +0 -0
  525. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/error_label_candidates.py +0 -0
  526. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/error_label_classify.py +0 -0
  527. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/excel.py +0 -0
  528. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/hdf5.py +0 -0
  529. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/import_categorical_guards.py +0 -0
  530. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/import_filters.py +0 -0
  531. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/import_metadata.py +0 -0
  532. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/import_parse.py +0 -0
  533. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/import_preview.py +0 -0
  534. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/jcamp.py +0 -0
  535. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/lakeshore.py +0 -0
  536. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/netcdf.py +0 -0
  537. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/opus.py +0 -0
  538. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin.py +0 -0
  539. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_com.py +0 -0
  540. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/__init__.py +0 -0
  541. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/annotation_marks.py +0 -0
  542. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/container.py +0 -0
  543. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/curve_style_color.py +0 -0
  544. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/fidelity.py +0 -0
  545. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/figure_geometry.py +0 -0
  546. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/figure_layers.py +0 -0
  547. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/figure_text.py +0 -0
  548. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/figures.py +0 -0
  549. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/figures_opju.py +0 -0
  550. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/graph_preview.py +0 -0
  551. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/notes.py +0 -0
  552. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opj.py +0 -0
  553. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opj_curves.py +0 -0
  554. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opj_shapes.py +0 -0
  555. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju.py +0 -0
  556. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju_axis_real_form.py +0 -0
  557. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju_axis_specimen_form.py +0 -0
  558. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju_codec.py +0 -0
  559. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju_curves.py +0 -0
  560. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju_curves_allcols.py +0 -0
  561. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju_figure_curves.py +0 -0
  562. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju_figure_text.py +0 -0
  563. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju_reports.py +0 -0
  564. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/origin_richtext.py +0 -0
  565. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/templates.py +0 -0
  566. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/tree.py +0 -0
  567. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/tree_opju.py +0 -0
  568. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/windows.py +0 -0
  569. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/windows_opju.py +0 -0
  570. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/writer.py +0 -0
  571. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/writer_blocks.py +0 -0
  572. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/qd.py +0 -0
  573. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/refl1d.py +0 -0
  574. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/registry.py +0 -0
  575. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/report_export.py +0 -0
  576. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/rigaku.py +0 -0
  577. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/sims.py +0 -0
  578. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/spc.py +0 -0
  579. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/sqlite_query.py +0 -0
  580. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/technique.py +0 -0
  581. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/xrd_csv.py +0 -0
  582. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/xrdml.py +0 -0
  583. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/jobs.py +0 -0
  584. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/plugins/__init__.py +0 -0
  585. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/plugins/contract.py +0 -0
  586. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/plugins/loader.py +0 -0
  587. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/plugins/steps.py +0 -0
  588. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/__init__.py +0 -0
  589. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/atomic_rename.py +0 -0
  590. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/copy_stream.py +0 -0
  591. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/copying.py +0 -0
  592. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/grouping.py +0 -0
  593. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/layout.py +0 -0
  594. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/manifest.py +0 -0
  595. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/naming.py +0 -0
  596. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/pack.py +0 -0
  597. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/project_rewrite.py +0 -0
  598. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/publish.py +0 -0
  599. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/staging.py +0 -0
  600. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/__init__.py +0 -0
  601. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/_bookcache.py +0 -0
  602. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/_errors.py +0 -0
  603. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/_export_common.py +0 -0
  604. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/_uploadcache.py +0 -0
  605. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/_uploadstream.py +0 -0
  606. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/aggregate.py +0 -0
  607. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/baseline.py +0 -0
  608. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/books.py +0 -0
  609. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/calc.py +0 -0
  610. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/corrections.py +0 -0
  611. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/crystallography.py +0 -0
  612. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/database.py +0 -0
  613. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/diffusion.py +0 -0
  614. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/electrical.py +0 -0
  615. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/electrochemistry.py +0 -0
  616. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/export_multivar.py +0 -0
  617. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/export_statplots.py +0 -0
  618. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/fitting.py +0 -0
  619. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/fitting_bumps.py +0 -0
  620. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/import_template.py +0 -0
  621. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/import_wizard.py +0 -0
  622. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/jobs_api.py +0 -0
  623. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/magnetic.py +0 -0
  624. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/magnetometry.py +0 -0
  625. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/optics.py +0 -0
  626. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/peaks.py +0 -0
  627. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/plot.py +0 -0
  628. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/reductions.py +0 -0
  629. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/reference.py +0 -0
  630. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/reflectivity.py +0 -0
  631. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/report_export.py +0 -0
  632. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/rsm.py +0 -0
  633. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/samples.py +0 -0
  634. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/semiconductor.py +0 -0
  635. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/sld.py +0 -0
  636. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/spectral.py +0 -0
  637. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/statplots.py +0 -0
  638. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/stats.py +0 -0
  639. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/stats_design.py +0 -0
  640. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/stats_outliers.py +0 -0
  641. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/stats_varcomp.py +0 -0
  642. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/substrates.py +0 -0
  643. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/superconductor.py +0 -0
  644. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/thermal.py +0 -0
  645. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/thin_film.py +0 -0
  646. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/vacuum.py +0 -0
  647. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/xray.py +0 -0
  648. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/samples/demo_vsm.csv +0 -0
  649. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/security.py +0 -0
  650. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/server_launch.py +0 -0
  651. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/JetBrainsMono-Bold-CUogYd9I.woff2 +0 -0
  652. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/JetBrainsMono-Regular-CA-Os4ii.woff2 +0 -0
  653. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/browserLockProvider-WonU-LkS.js +0 -0
  654. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/desktopBridge-DnoGkBQK.js +0 -0
  655. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/desktopLockProvider-B2FqTnr5.js +0 -0
  656. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/desktopRelinkBridge-DtfJyZAw.js +0 -0
  657. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/distribution-DtRUmVv3.js +0 -0
  658. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/figureDocumentReimport-CcKuldgP.js +0 -0
  659. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/fitmodels-B_enYcup.js +0 -0
  660. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/formatBytes-BPCGNWDJ.js +0 -0
  661. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/gestureCancel-CIoXlFFV.js +0 -0
  662. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/gridwindow-DITcrjM7.js +0 -0
  663. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/jitter-WCHwU_Li.js +0 -0
  664. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/lockState-Ur5JH-bI.js +0 -0
  665. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/originFigures-BumquS0h.js +0 -0
  666. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/panelLayout-DizjSWgK.js +0 -0
  667. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/peakwizard-D_l5I-Jw.js +0 -0
  668. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/preload-helper-Czpn1I53.js +0 -0
  669. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/relink-Bw3O17OU.js +0 -0
  670. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/relinkPreview-BmzAif3e.js +0 -0
  671. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/shapeHit-CWTHpAPr.js +0 -0
  672. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/tickFormat-DhmvIZc_.js +0 -0
  673. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/uPlot-CnsZ1jie.css +0 -0
  674. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/uPlot.min-CWikSVZk.js +0 -0
  675. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/favicon.png +0 -0
  676. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/loading.html +0 -0
  677. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/tools/origin_compare/README.md +0 -0
  678. {quantized_lab-0.25.0 → quantized_lab-0.26.0}/tools/visual/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: quantized-lab
3
- Version: 0.25.0
3
+ Version: 0.26.0
4
4
  Summary: Plot, analyze, and publish lab data - magnetometry, XRD, reflectometry - with OriginPro file interop, golden-verified analysis, and reproducible pipelines.
5
5
  Project-URL: Homepage, https://github.com/pquarterman17/quantized
6
6
  Project-URL: Documentation, https://github.com/pquarterman17/quantized/wiki
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "quantized-lab"
3
- version = "0.25.0"
3
+ version = "0.26.0"
4
4
  description = "Plot, analyze, and publish lab data - magnetometry, XRD, reflectometry - with OriginPro file interop, golden-verified analysis, and reproducible pipelines."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -7,5 +7,5 @@ Layered, enforced architecture (see CLAUDE.md):
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
- __version__ = "0.25.0"
10
+ __version__ = "0.26.0"
11
11
  __all__ = ["__version__"]
@@ -16,7 +16,9 @@ from typing import Any
16
16
 
17
17
  import numpy as np
18
18
 
19
+ from ..cat_levels import surviving_cat_levels, surviving_level_order
19
20
  from ..datastruct import DataStruct
21
+ from ..row_sidecars import slice_row_sidecars
20
22
  from .backgrounds import anchor_baseline, footprint_factor
21
23
  from .processing import (
22
24
  cumulative_integral,
@@ -96,6 +98,45 @@ def apply_corrections(
96
98
  """
97
99
  time = np.asarray(data.time, dtype=float).copy()
98
100
  values = np.asarray(data.values, dtype=float).copy()
101
+ # BUG-005: kept to decide, at the end, which `cat_levels` entries the
102
+ # pipeline actually invalidated. `values` above is mutated in place from here
103
+ # on, so the comparison needs its own reference.
104
+ values_in = np.asarray(data.values, dtype=float)
105
+ # BUG-005 review, HIGH 1. Bit-identity of a column is NOT evidence that its
106
+ # level codes survived: a transform can map codes to themselves by
107
+ # ARITHMETIC ACCIDENT. Measured on a single-level channel (every code 0,
108
+ # which is the commonest real case — a Sample/Phase/Status column constant
109
+ # within one file): dY/dX, ∫Y dx, a moving-average smooth, all four
110
+ # normalizations, a unit conversion and yScale=1000 each left it
111
+ # [0, 0, 0] and so kept the table, and `level_of` then returned the LABEL
112
+ # for a dY/dX channel. That is precisely the "labels for values that cannot
113
+ # have them" failure the strip exists to prevent.
114
+ #
115
+ # So the survival test is a CONJUNCTION: no step may have redefined what the
116
+ # channel IS (this flag), AND the numbers must be unchanged
117
+ # (`surviving_cat_levels`). Each half covers the other's blind spot — the
118
+ # flag catches an arithmetic coincidence, and the value comparison catches a
119
+ # step added later that forgets to set the flag.
120
+ #
121
+ # WHICH STEPS SET IT: those that REDEFINE THE QUANTITY — a derivative,
122
+ # integral, smooth, any normalization, a unit conversion, a mass/volume
123
+ # normalization, the footprint or neutron scale. After any of those the
124
+ # channel is no longer the thing its level table names, whatever the numbers
125
+ # happen to be.
126
+ #
127
+ # WHICH DO NOT: same-units arithmetic that is a genuine identity when its
128
+ # parameters are zero — the background/y-offset subtraction and the reference-
129
+ # dataset subtraction. Those run on EVERY call (`values - y_bg - y_off` is
130
+ # unconditional, with zeros by default), so flagging them made the flag always
131
+ # true and silently reverted this whole fix; the first version of it did
132
+ # exactly that and the identity/trim tests caught it. For these the value
133
+ # comparison IS the right test: subtract a real background and the codes move
134
+ # and are dropped; subtract zero and the channel is untouched.
135
+ #
136
+ # A NEW QUANTITY-REDEFINING STEP MUST SET THIS. `test_calc_corrections.py::
137
+ # test_corrections_drops_cat_levels_for_every_y_transforming_step` enumerates
138
+ # the current ones against a single-level channel.
139
+ y_touched = False
99
140
  labels = list(data.labels)
100
141
 
101
142
  # 0. Arbitrary X/Y rescaling (MAIN_PLAN #37) — a non-destructive unit
@@ -117,10 +158,12 @@ def apply_corrections(
117
158
  time = time * x_scale
118
159
  if y_scale != 1.0:
119
160
  values = values * y_scale
161
+ y_touched = True
120
162
 
121
163
  # 1. Trim on x.
122
164
  x_min = params.get("xTrimMin", float("nan"))
123
165
  x_max = params.get("xTrimMax", float("nan"))
166
+ kept_rows: list[int] | None = None
124
167
  if not (math.isnan(x_min) and math.isnan(x_max)):
125
168
  mask = np.ones(time.size, dtype=bool)
126
169
  if not math.isnan(x_min):
@@ -129,6 +172,18 @@ def apply_corrections(
129
172
  mask &= time <= x_max
130
173
  time = time[mask]
131
174
  values = values[mask, :]
175
+ # BUG-006 site 7. This is the ONLY step here that changes the ROW COUNT,
176
+ # so it is the only one whose row-indexed metadata sidecars need to move
177
+ # -- and they were riding through unsliced, which is strictly worse than
178
+ # the Extract/Split cases the bug started from: those produce a derived
179
+ # copy, while this response is written straight back into the dataset and
180
+ # the .dwk. Trim the first 50 of 100 rows and `text_columns` still held
181
+ # 100 cells starting at row 0, so every visible text cell described a
182
+ # row 50 places away. (An earlier version of this comment said "the code
183
+ # below already reasons about `excludedRows` shifting under this same
184
+ # trim" -- there is no `excludedRows` anywhere in this module; that
185
+ # reasoning is in the FRONTEND, `store/corrections.ts`.)
186
+ kept_rows = [int(i) for i in np.flatnonzero(mask)]
132
187
 
133
188
  # 2. X offset.
134
189
  time = time - params.get("xOff", 0.0)
@@ -145,6 +200,7 @@ def apply_corrections(
145
200
  for k in range(values.shape[1]):
146
201
  if labels[k].lower() != "dq":
147
202
  values[:, k] = values[:, k] / factor
203
+ y_touched = True
148
204
 
149
205
  # 3. Neutron R-scale, or background subtraction + y-offset.
150
206
  y_off = params.get("yOff", 0.0)
@@ -152,6 +208,7 @@ def apply_corrections(
152
208
  for k in range(values.shape[1]):
153
209
  if labels[k].lower() != "dq":
154
210
  values[:, k] = values[:, k] * y_off
211
+ y_touched = True
155
212
  else:
156
213
  # An anchor-point baseline (GOTO #2) beats the polynomial/slope forms.
157
214
  bg_anchors = params.get("bgAnchors")
@@ -197,41 +254,92 @@ def apply_corrections(
197
254
  m_unit = params.get("momentUnit", "")
198
255
  if m_unit == "emu/g" and params.get("sampleMass", 0.0) > 0:
199
256
  values = values / params["sampleMass"]
257
+ y_touched = True
200
258
  elif m_unit in ("emu/cm³", "kA/m") and params.get("sampleVolume", 0.0) > 0:
201
259
  values = values / params["sampleVolume"]
260
+ y_touched = True
202
261
  elif m_unit == "A·m²":
203
262
  values = values * 1e-3
263
+ y_touched = True
204
264
 
205
265
  # 6. Smoothing.
206
266
  if params.get("smoothEnabled", False):
207
267
  win = max(1, _matlab_round(params.get("smoothWindow", 5)))
208
268
  values = smooth_data(values, method=str(params["smoothMethod"]).lower(), window=win)
269
+ y_touched = True
209
270
 
210
271
  # 7. Normalization.
211
272
  norm = params.get("normMethod", "None")
212
273
  if norm == "Range [0,1]":
213
274
  values = normalize(values, method="range")
275
+ y_touched = True
214
276
  elif norm == "Peak (max=1)":
215
277
  values = normalize(values, method="peak")
278
+ y_touched = True
216
279
  elif norm == "Z-score":
217
280
  values = normalize(values, method="zscore")
281
+ y_touched = True
218
282
  elif norm == "Area (integral=1)":
219
283
  for k in range(values.shape[1]):
220
284
  area = float(np.trapezoid(values[:, k], time))
221
285
  if area != 0:
222
286
  values[:, k] = values[:, k] / area
287
+ y_touched = True
223
288
 
224
289
  # 8. Derivative / integral transforms.
225
290
  deriv = params.get("derivativeMode", "None")
226
291
  if deriv == "dY/dX":
227
292
  values = derivative(time, values, order=1)
293
+ y_touched = True
228
294
  elif deriv == "d²Y/dX²":
229
295
  values = derivative(time, values, order=2)
296
+ y_touched = True
230
297
  elif deriv == "∫Y dx":
231
298
  values = cumulative_integral(time, values)
299
+ y_touched = True
232
300
  elif deriv == "dlog/dlog":
233
301
  values = log_derivative(time, values)
302
+ y_touched = True
234
303
 
304
+ # `cat_levels` IS CARRIED FORWARD ONLY WHERE THE CODES SURVIVED (BUG-005).
305
+ #
306
+ # Every step above transforms EVERY channel unconditionally (`for k in
307
+ # range(values.shape[1])`, plus whole-matrix `smooth_data`/`normalize`/
308
+ # `derivative` calls). A categorical channel's values are level CODES
309
+ # (0..n-1); smoothing or differentiating them yields fractional numbers with
310
+ # no level, so keeping the table would make the output claim labels for
311
+ # values that no longer index it — worse than showing the raw numbers.
312
+ #
313
+ # That was why this dropped the table. But it dropped it UNCONDITIONALLY,
314
+ # including when the codes demonstrably did not move: an identity correction
315
+ # (every step off) or a pure row TRIM, which selects rows and never touches a
316
+ # value. `surviving_cat_levels` (see `quantized/cat_levels.py`) now decides
317
+ # per channel by COMPARING the numbers, so a table is kept exactly when it
318
+ # still describes the output and dropped otherwise. Evidence, not inference
319
+ # about which parameters are identities — which is also why it cannot change
320
+ # any existing golden output.
321
+ #
322
+ # STILL BOOKED as BUG-005: corrections should not TRANSFORM a categorical
323
+ # channel at all. That needs a channel mask threaded through every step above
324
+ # and carries real golden-parity regression risk, so it is not faked here.
325
+ metadata = (
326
+ dict(data.metadata)
327
+ if kept_rows is None
328
+ else slice_row_sidecars(data.metadata, kept_rows)
329
+ )
330
+ surviving = (
331
+ None
332
+ if y_touched
333
+ else surviving_cat_levels(data.cat_levels, values_in, values, kept_rows)
334
+ )
235
335
  return DataStruct.create(
236
- time, values, labels=labels, units=list(data.units), metadata=dict(data.metadata)
336
+ time,
337
+ values,
338
+ labels=labels,
339
+ units=list(data.units),
340
+ metadata=metadata,
341
+ cat_levels=surviving,
342
+ level_order=surviving_level_order(
343
+ data.level_order, surviving, np.array_equal(time, np.asarray(data.time, dtype=float))
344
+ ),
237
345
  )
@@ -17,11 +17,16 @@ from typing import Any
17
17
  import matplotlib
18
18
 
19
19
  matplotlib.use("Agg") # headless: render to a buffer, never to a display
20
+ matplotlib.rcParams["svg.fonttype"] = "none" # editable SVG <text>, not glyph outlines
20
21
 
21
22
  import matplotlib.pyplot as plt # noqa: E402 (must follow matplotlib.use)
22
- import numpy as np
23
- from numpy.typing import ArrayLike, NDArray
23
+ import numpy as np # noqa: E402
24
+ from numpy.typing import ArrayLike, NDArray # noqa: E402
24
25
 
26
+ from quantized.calc.figure_colorscatter import ( # noqa: E402
27
+ draw_color_scatter as _draw_color_scatter,
28
+ )
29
+ from quantized.calc.figure_greyscale import apply_greyscale # noqa: E402
25
30
  from quantized.calc.figure_hitmap import collect_map as _collect_map_impl # noqa: E402
26
31
  from quantized.calc.figure_labels import safe_mathtext_label # noqa: E402
27
32
  from quantized.calc.figure_overrides import _apply_overrides, _validate_overrides # noqa: E402
@@ -29,7 +34,7 @@ from quantized.calc.figure_scale import apply_axis_scale, resolve_axis_scale #
29
34
  from quantized.calc.figure_styles import FigureStyle, figure_style # noqa: E402
30
35
  from quantized.calc.figure_ticks import apply_tick_formats, apply_tick_steps # noqa: E402
31
36
 
32
- from .figure_errorbars import apply_error_bars
37
+ from .figure_errorbars import apply_error_bars # noqa: E402
33
38
 
34
39
  __all__ = ["draw_series_axes", "render_figure", "style_rc"]
35
40
 
@@ -39,6 +44,10 @@ _LINESTYLE = {"solid": "-", "dashed": "--", "dotted": ":", "none": "none"}
39
44
  # per-series `step` ("pre"/"post"/"mid" — SeriesStyle.step / ExportSeriesStyle
40
45
  # .step) maps 1:1 onto matplotlib's own `Line2D.drawstyle` vocabulary.
41
46
  _DRAWSTYLE = {"pre": "steps-pre", "post": "steps-post", "mid": "steps-mid"}
47
+ # 8 `MarkerShape` glyphs -> matplotlib codes; wire key `marker_shape` (sent by
48
+ # `lib/exportStyles`; was hardcoded "o", so every shape exported as a circle).
49
+ _MARKER = {"circle": "o", "square": "s", "triangle": "^", "downtriangle": "v",
50
+ "diamond": "D", "plus": "+", "cross": "x", "star": "*"}
42
51
  # Fixed fill translucency for MAIN #13 (fill under/between curves) — matches
43
52
  # the screen side's `uplotFill.ts` FILL_ALPHA_PCT (25%) so an exported figure
44
53
  # reads the same as its on-screen counterpart.
@@ -56,7 +65,7 @@ def _plot_kwargs(
56
65
  silently ignored (no ``drawstyle``/``linestyle`` key added) rather than
57
66
  raising -- same degrade-gracefully contract as every other style field
58
67
  here (see ``calc.plotting.resolve_style_channels``'s doc: "an export must
59
- never 500 on a bad style hint")."""
68
+ never 500 on a bad style hint") -- ``marker_shape`` included."""
60
69
  kw: dict[str, Any] = {"linewidth": default_lw}
61
70
  if not spec:
62
71
  return kw
@@ -73,7 +82,8 @@ def _plot_kwargs(
73
82
  if step in _DRAWSTYLE:
74
83
  kw["drawstyle"] = _DRAWSTYLE[step]
75
84
  if spec.get("marker"):
76
- kw["marker"] = "o"
85
+ shape = spec.get("marker_shape")
86
+ kw["marker"] = _MARKER.get(shape, "o") if isinstance(shape, str) else "o"
77
87
  kw["markersize"] = spec.get("marker_size") or default_marker_size
78
88
  return kw
79
89
 
@@ -110,33 +120,6 @@ def _apply_fill(
110
120
  ax.fill_between(xv[:n], yv[:n], other[:n], color=color, alpha=_FILL_ALPHA)
111
121
 
112
122
 
113
- def _draw_color_scatter(
114
- fig: Any,
115
- ax: Any,
116
- xv: NDArray[np.float64],
117
- yv: NDArray[np.float64],
118
- label: str,
119
- spec: Mapping[str, Any],
120
- st: FigureStyle,
121
- ) -> Any:
122
- """Colour-mapped scatter (MAIN #14): each point coloured by a THIRD
123
- channel's value -- ``spec["color_by"]``, already resolved by
124
- ``calc.plotting.resolve_style_channels`` to a concrete per-row array (this
125
- module never sees a raw channel index). Replaces the normal line draw
126
- entirely for this series -- screen-side parity: ``uplotOpts.ts`` hides the
127
- native line/points the same way whenever a series' ``colorBy`` is set.
128
- Adds a colourbar so the mapping is legible. Returns the ``PathCollection``
129
- artist (for the figure-hitmap element collector)."""
130
- z = np.asarray(spec["color_by"], dtype=float)
131
- n = min(len(xv), len(yv), len(z))
132
- size = float(spec.get("marker_size") or st.marker_size) ** 2
133
- sc = ax.scatter(
134
- xv[:n], yv[:n], c=z[:n], cmap=str(spec.get("colormap") or "viridis"), s=size, label=label
135
- )
136
- fig.colorbar(sc, ax=ax)
137
- return sc
138
-
139
-
140
123
  def style_rc(st: FigureStyle, ov: Mapping[str, Any]) -> dict[str, Any]:
141
124
  """The rc-param dict a preset (+ optional font/tick overrides) resolves to.
142
125
 
@@ -297,6 +280,19 @@ def _render_impl(
297
280
  # preset's opaque background. Matters for pasting a figure onto a
298
281
  # coloured slide; ignored in practice by formats that have no alpha.
299
282
  transparent: bool = False,
283
+ # P3.3 print-safe export mode: overrides every series' colour to a
284
+ # position-based grey ramp and forces the dash/marker cycle (see
285
+ # `calc.figure_greyscale`'s module doc) -- applied uniformly to this
286
+ # function's own single-axes/y2/x-breaks paths (every one of them draws
287
+ # through `_plot_kwargs` off the SAME `series_styles` list mutated just
288
+ # below), so it also covers a `group_col`-resolved request (that path's
289
+ # `series_styles` is `None`, which `apply_greyscale` treats as "no
290
+ # explicit style on any series" and still ramps). Facets render through
291
+ # a completely separate module (`calc.figure_facets`) that never reaches
292
+ # `series_styles` at all -- this flag is a documented no-op there (see
293
+ # `routes.export_figures._render_facets_bytes`, which does not forward
294
+ # it) rather than silently doing nothing while looking wired.
295
+ greyscale: bool = False,
300
296
  overrides: Mapping[str, Any] | None = None,
301
297
  collect_map: bool = False,
302
298
  x_fmt: Mapping[str, Any] | None = None,
@@ -344,6 +340,10 @@ def _render_impl(
344
340
  ``figure_y2.render_with_secondary_axis``'s doc). Not compatible with
345
341
  ``x_breaks`` (raises ``ValueError``) -- a broken figure has several
346
342
  axes already and gains no coherent secondary-axis meaning.
343
+ ``greyscale`` (P3.3 print-safe export) rewrites ``series_styles`` via
344
+ :func:`quantized.calc.figure_greyscale.apply_greyscale` before any of
345
+ the branches below run -- see that function's doc for exactly what it
346
+ overrides and what it deliberately leaves alone.
347
347
  """
348
348
  if fmt not in _FORMATS:
349
349
  raise ValueError(f"fmt must be one of {_FORMATS}")
@@ -357,6 +357,8 @@ def _render_impl(
357
357
  y_label = safe_mathtext_label(y_label)
358
358
  y2_label = safe_mathtext_label(y2_label)
359
359
  series = [(safe_mathtext_label(label), y) for label, y in series]
360
+ if greyscale:
361
+ series_styles = apply_greyscale(series_styles, len(series))
360
362
  st = figure_style(style)
361
363
  ov = dict(overrides or {})
362
364
  _validate_overrides(ov)
@@ -33,6 +33,7 @@ from typing import Any
33
33
  import matplotlib
34
34
 
35
35
  matplotlib.use("Agg") # headless
36
+ matplotlib.rcParams["svg.fonttype"] = "none" # editable SVG <text>, not glyph outlines
36
37
 
37
38
  import matplotlib.pyplot as plt # noqa: E402
38
39
  import numpy as np # noqa: E402
@@ -16,6 +16,7 @@ from typing import Any
16
16
  import matplotlib
17
17
 
18
18
  matplotlib.use("Agg") # headless
19
+ matplotlib.rcParams["svg.fonttype"] = "none" # editable SVG <text>, not glyph outlines
19
20
 
20
21
  import matplotlib.pyplot as plt # noqa: E402
21
22
  import numpy as np # noqa: E402
@@ -0,0 +1,53 @@
1
+ """Colour-mapped scatter (MAIN #14) for the publication renderer.
2
+
3
+ Split out of ``calc.figure`` purely to stay under the 500-line god-module
4
+ ceiling (mirrors ``figure_break``/``figure_y2``/``figure_overrides`` — a
5
+ self-contained draw branch pulled into its own module rather than trimmed).
6
+ Pure layer: no fastapi/pydantic imports.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from collections.abc import Mapping
12
+ from typing import Any
13
+
14
+ import numpy as np
15
+ from numpy.typing import NDArray
16
+
17
+ from quantized.calc.figure_styles import FigureStyle
18
+
19
+ __all__ = ["draw_color_scatter"]
20
+
21
+
22
+ def draw_color_scatter(
23
+ fig: Any,
24
+ ax: Any,
25
+ xv: NDArray[np.float64],
26
+ yv: NDArray[np.float64],
27
+ label: str,
28
+ spec: Mapping[str, Any],
29
+ st: FigureStyle,
30
+ ) -> Any:
31
+ """Colour-mapped scatter: each point coloured by a THIRD channel's value
32
+ -- ``spec["color_by"]``, already resolved by
33
+ ``calc.plotting.resolve_style_channels`` to a concrete per-row array
34
+ (this module never sees a raw channel index). Replaces the normal line
35
+ draw entirely for this series -- screen-side parity: ``uplotOpts.ts``
36
+ hides the native line/points the same way whenever a series' ``colorBy``
37
+ is set. Adds a colourbar so the mapping is legible. Returns the
38
+ ``PathCollection`` artist (for the figure-hitmap element collector).
39
+
40
+ Deliberately left OUT of P3.3's greyscale export mode
41
+ (``calc.figure_greyscale.apply_greyscale`` passes a ``color_by`` spec
42
+ through unchanged): a colour-mapped scatter's colour IS the plotted
43
+ quantity, not a categorical series-to-series distinction, so forcing it
44
+ to grey would delete information rather than make the figure print-safe.
45
+ """
46
+ z = np.asarray(spec["color_by"], dtype=float)
47
+ n = min(len(xv), len(yv), len(z))
48
+ size = float(spec.get("marker_size") or st.marker_size) ** 2
49
+ sc = ax.scatter(
50
+ xv[:n], yv[:n], c=z[:n], cmap=str(spec.get("colormap") or "viridis"), s=size, label=label
51
+ )
52
+ fig.colorbar(sc, ax=ax)
53
+ return sc
@@ -22,6 +22,7 @@ from typing import Any
22
22
  import matplotlib
23
23
 
24
24
  matplotlib.use("Agg") # headless
25
+ matplotlib.rcParams["svg.fonttype"] = "none" # editable SVG <text>, not glyph outlines
25
26
 
26
27
  import matplotlib.pyplot as plt # noqa: E402
27
28
  import numpy as np # noqa: E402
@@ -83,7 +83,7 @@ def apply_error_bars(
83
83
  color = artist.get_color() if artist is not None else None
84
84
  except AttributeError:
85
85
  color = None # a colour-mapped scatter has no single colour
86
- ax.errorbar(
86
+ container = ax.errorbar(
87
87
  xv,
88
88
  yv,
89
89
  yerr=yerr,
@@ -94,3 +94,26 @@ def apply_error_bars(
94
94
  capsize=2,
95
95
  zorder=1, # behind the series line, so data stays legible
96
96
  )
97
+ # matplotlib returns an ErrorbarContainer -- a tuple subclass of
98
+ # (data_line, caplines, barlinecols). A minimal axes stand-in (the
99
+ # unit tests' recording fake) may return None; treat anything that is
100
+ # not a 3-tuple as "no caps to restyle" rather than unpacking blindly.
101
+ caplines = container[1] if isinstance(container, tuple) and len(container) > 1 else ()
102
+ if color is not None:
103
+ # `ecolor=` above colours the bar lines and each cap's EDGE, but
104
+ # matplotlib's cap markers ('|'/'_') keep their default FACE
105
+ # colour (rcParams' C0) regardless -- passing markerfacecolor=
106
+ # to errorbar() itself is silently dropped for these marker
107
+ # styles, so the face has to be set on the returned cap Line2Ds
108
+ # directly. Otherwise a "print-safe" greyscale export still
109
+ # emits a chromatic `fill: #1f77b4` for every cap in vector
110
+ # output (PDF/SVG) -- invisible in a raster PNG only because the
111
+ # cap's degenerate fill path paints zero visible pixels there.
112
+ # This also corrects the ordinary COLOURED case: before this fix,
113
+ # every series' caps were filled with rcParams' C0 regardless of
114
+ # that series' own colour (e.g. series 2's caps rendered blue,
115
+ # not orange) in any coloured vector export -- a second, latent
116
+ # fix beyond the greyscale defect this was written for.
117
+ for cap in caplines:
118
+ cap.set_markerfacecolor(color)
119
+ cap.set_markeredgecolor(color)
@@ -36,6 +36,7 @@ from typing import Any
36
36
  import matplotlib
37
37
 
38
38
  matplotlib.use("Agg") # headless
39
+ matplotlib.rcParams["svg.fonttype"] = "none" # editable SVG <text>, not glyph outlines
39
40
 
40
41
  import matplotlib.pyplot as plt # noqa: E402
41
42
  import numpy as np # noqa: E402
@@ -31,6 +31,7 @@ from typing import Any
31
31
  import matplotlib
32
32
 
33
33
  matplotlib.use("Agg") # headless (defensive -- figure_facets already sets this)
34
+ matplotlib.rcParams["svg.fonttype"] = "none" # editable SVG <text>, not glyph outlines
34
35
 
35
36
  import matplotlib.pyplot as plt # noqa: E402
36
37
  import numpy as np # noqa: E402
@@ -15,6 +15,7 @@ from typing import Any
15
15
  import matplotlib
16
16
 
17
17
  matplotlib.use("Agg") # headless
18
+ matplotlib.rcParams["svg.fonttype"] = "none" # editable SVG <text>, not glyph outlines
18
19
 
19
20
  import matplotlib.pyplot as plt # noqa: E402
20
21
  import numpy as np # noqa: E402
@@ -0,0 +1,159 @@
1
+ """Print-safe greyscale export mode (PRIMARY_SOFTWARE_AUDIT_PLAN P3.3).
2
+
3
+ Pure layer: a series count in -> grey ``#rrggbb`` hex strings out, plus a
4
+ style-list transform built on top of it. No matplotlib/fastapi/pydantic
5
+ import — a plain colour-space computation, unit-testable without a
6
+ renderer, and importable from ``calc.figure``/``calc.figure_y2``/
7
+ ``calc.figure_break`` (every place a per-series style spec reaches
8
+ ``calc.figure._plot_kwargs``) without pulling anything heavy in.
9
+
10
+ Why not just convert each series' OWN colour to a grey via an ordinary
11
+ relative-luminance conversion (the "obvious" approach every image editor's
12
+ "desaturate" filter uses)? Because two series that differ only in HUE, not
13
+ lightness — exactly the case a categorical colour palette is built to keep
14
+ visually distinct — can have nearly identical relative luminance (a
15
+ saturated red and a saturated green both sit near the middle of the
16
+ luminance range). A per-colour conversion then collapses them to
17
+ indistinguishable greys, defeating the entire point of a "print-safe" mode:
18
+ a reader photocopying the figure would see one curve where the screen showed
19
+ two. So every series instead gets an EVENLY SPACED grey by its DISPLAY
20
+ POSITION alone — independent of whatever colour it would otherwise draw —
21
+ spanning CIE L* (perceptual lightness, not raw sRGB value, so the steps
22
+ LOOK evenly spaced rather than merely being evenly spaced numbers) from
23
+ `L_MIN` to `L_MAX`. That guarantees a minimum perceptual step between any
24
+ two adjacent series regardless of how close their original hues were.
25
+
26
+ Grey alone still runs out of room past a handful of series (L* has far less
27
+ usable range than hue does), so :func:`apply_greyscale` also forces the
28
+ dash cycle (and, for a series that already draws a marker, the marker-shape
29
+ cycle) by the SAME display position — the export-side half of the P3.3 auto
30
+ dash/marker cycle the frontend already ships
31
+ (``frontend/src/lib/seriesStyleCycle.ts``). `LINE_CYCLE`/`MARKER_SHAPES`
32
+ below are that module's `AUTO_DASH_CYCLE`/`AUTO_MARKER_CYCLE`, copied
33
+ verbatim — KEEP IN SYNC WITH `frontend/src/lib/seriesStyleCycle.ts`; a test
34
+ (`tests/test_calc_figure_greyscale.py`) pins the two lists equal by reading
35
+ that file's source, so drift between them fails the suite rather than
36
+ silently disagreeing.
37
+ """
38
+
39
+ from __future__ import annotations
40
+
41
+ from collections.abc import Mapping, Sequence
42
+ from typing import Any
43
+
44
+ __all__ = ["L_MIN", "L_MAX", "LINE_CYCLE", "MARKER_SHAPES", "greyscale_ramp", "apply_greyscale"]
45
+
46
+ # CIE L* target range for the grey ramp. Kept well inside [0, 100]: L*=0 is
47
+ # true black (indistinguishable from a heavy grid line or the axis box) and
48
+ # L*=100 is true white (invisible against the figure's own white background),
49
+ # so both ends are pulled in to stay legible against the preset's own
50
+ # spines/grid/background, which greyscale mode leaves untouched.
51
+ L_MIN = 15.0
52
+ L_MAX = 70.0
53
+
54
+ # The CIE L*/Y* piecewise-linear threshold (6/29), used by both directions
55
+ # of the standard CIE L* <-> relative-luminance conversion below.
56
+ _DELTA = 6.0 / 29.0
57
+
58
+ # Dash cycle for LINES, by series display position — verbatim copy of
59
+ # frontend/src/lib/seriesStyleCycle.ts's `AUTO_DASH_CYCLE` (three entries:
60
+ # every `LineStyle` value, which is also every value
61
+ # `calc.figure._LINESTYLE` accepts). "solid" first so a single-series figure
62
+ # (or a series with an explicit line already) is unaffected.
63
+ LINE_CYCLE: tuple[str, ...] = ("solid", "dashed", "dotted")
64
+
65
+ # Marker-glyph cycle for series that already draw a marker, by display
66
+ # position — verbatim copy of `AUTO_MARKER_CYCLE` (all eight `MarkerShape`
67
+ # members, closed glyphs first, matching `calc.figure._MARKER`'s own table).
68
+ MARKER_SHAPES: tuple[str, ...] = (
69
+ "circle", "square", "triangle", "diamond",
70
+ "downtriangle", "plus", "cross", "star",
71
+ )
72
+
73
+
74
+ def _y_from_lstar(lstar: float) -> float:
75
+ """Inverse CIE L* -> relative luminance Y (D65 white point, Y=1)."""
76
+ fy = (lstar + 16.0) / 116.0
77
+ if fy > _DELTA:
78
+ return fy**3
79
+ return 3.0 * _DELTA**2 * (fy - 4.0 / 29.0)
80
+
81
+
82
+ def _srgb_channel_from_linear(y: float) -> int:
83
+ """Inverse sRGB gamma: a linear relative luminance -> an 8-bit channel
84
+ (0-255). Used with r=g=b=this value, since an achromatic pixel's three
85
+ channels are identical and therefore each equal to the whole triple's
86
+ relative luminance."""
87
+ y = min(1.0, max(0.0, y))
88
+ s = y * 12.92 if y <= 0.0031308 else 1.055 * (y ** (1.0 / 2.4)) - 0.055
89
+ return round(min(1.0, max(0.0, s)) * 255)
90
+
91
+
92
+ def _hex_from_lstar(lstar: float) -> str:
93
+ v = _srgb_channel_from_linear(_y_from_lstar(lstar))
94
+ return f"#{v:02x}{v:02x}{v:02x}"
95
+
96
+
97
+ def greyscale_ramp(n: int, *, l_min: float = L_MIN, l_max: float = L_MAX) -> list[str]:
98
+ """``n`` evenly spaced greys (``#rrggbb``), one per series DISPLAY
99
+ POSITION (index ``0..n-1``), spanning CIE L* ``l_min..l_max`` ascending —
100
+ position 0 is the darkest, position ``n-1`` the lightest. Guarantees a
101
+ minimum step of ``(l_max - l_min) / (n - 1)`` in L* between any two
102
+ positions (every pair, not just adjacent ones, since the ramp is
103
+ monotonic) — independent of any actual series colour; see the module
104
+ header for why. ``n <= 0`` returns ``[]``; ``n == 1`` returns the ramp's
105
+ midpoint (there is no "adjacent series" to separate from)."""
106
+ if n <= 0:
107
+ return []
108
+ if n == 1:
109
+ return [_hex_from_lstar((l_min + l_max) / 2.0)]
110
+ step = (l_max - l_min) / (n - 1)
111
+ return [_hex_from_lstar(l_min + step * i) for i in range(n)]
112
+
113
+
114
+ def apply_greyscale(
115
+ styles: Sequence[Mapping[str, Any] | None] | None,
116
+ n: int,
117
+ ) -> list[dict[str, Any]]:
118
+ """Return a NEW list of ``n`` style specs (never mutates ``styles``) with
119
+ every series' colour overridden to :func:`greyscale_ramp`'s grey at its
120
+ display position, and the dash/marker cycle FORCED by that same
121
+ position — a grey ramp alone runs out of separable steps well before
122
+ ``n`` gets large, so greyscale mode does not rely on it alone. Explicit
123
+ per-series choices still win, matching the frontend cycle's own
124
+ contract (`seriesStyleCycle.resolveSeriesStyle`'s doc): a series with an
125
+ explicit ``line`` keeps it, and a series with an explicit
126
+ ``marker_shape`` keeps that too. The marker SHAPE is cycled only for a
127
+ series that already draws a marker (``spec["marker"]`` true) — greyscale
128
+ does not turn markers on for a series that did not request one, the same
129
+ restraint the frontend cycle applies (a plot with no markers at all
130
+ should not suddenly grow eight circles/squares/triangles).
131
+
132
+ A ``color_by`` (MAIN #14 colour-mapped scatter) series is passed through
133
+ UNCHANGED, colourmap included: greyscale here targets the CATEGORICAL
134
+ series-to-series distinction a palette exists for, not a scatter whose
135
+ colour is itself the plotted quantity — forcing that to grey would
136
+ delete the information the plot exists to show, not print-safe it. A
137
+ ``fill``/``vs`` reference is preserved verbatim; the fill it produces
138
+ inherits the (now grey) line colour automatically, same as before this
139
+ function existed.
140
+
141
+ ``styles`` entries beyond ``n`` are ignored; a missing/short list is
142
+ treated as an all-``None`` list of length ``n`` (matching every other
143
+ caller's ``series_styles[i] if series_styles and i < len(series_styles)
144
+ else None`` convention)."""
145
+ ramp = greyscale_ramp(n)
146
+ out: list[dict[str, Any]] = []
147
+ for i in range(n):
148
+ raw = styles[i] if styles and i < len(styles) else None
149
+ spec: dict[str, Any] = dict(raw) if raw else {}
150
+ if spec.get("color_by") is not None:
151
+ out.append(spec) # untouched -- see the doc above
152
+ continue
153
+ spec["color"] = ramp[i]
154
+ if not spec.get("line"):
155
+ spec["line"] = LINE_CYCLE[i % len(LINE_CYCLE)]
156
+ if spec.get("marker") and not spec.get("marker_shape"):
157
+ spec["marker_shape"] = MARKER_SHAPES[i % len(MARKER_SHAPES)]
158
+ out.append(spec)
159
+ return out